summaryrefslogtreecommitdiff
path: root/src/operations/refund.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/operations/refund.ts')
-rw-r--r--src/operations/refund.ts31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/operations/refund.ts b/src/operations/refund.ts
index cbcb96446..b5d611b07 100644
--- a/src/operations/refund.ts
+++ b/src/operations/refund.ts
@@ -144,6 +144,8 @@ async function acceptRefundResponse(
const unfinishedRefunds: MerchantRefundDetails[] = [];
const failedRefunds: MerchantRefundDetails[] = [];
+ const refundsRefreshCost: { [refundKey: string]: AmountJson } = {};
+
for (const rd of refunds) {
if (rd.exchange_http_status === 200) {
// FIXME: also verify signature if necessary.
@@ -158,6 +160,33 @@ async function acceptRefundResponse(
}
}
+ for (const rd of [...finishedRefunds, ...unfinishedRefunds]) {
+ const key = getRefundKey(rd);
+ const coin = await ws.db.get(Stores.coins, rd.coin_pub);
+ if (!coin) {
+ continue;
+ }
+ const denom = await ws.db.getIndexed(
+ Stores.denominations.denomPubHashIndex,
+ coin.denomPubHash,
+ );
+ if (!denom) {
+ throw Error("inconsistent database");
+ }
+ const amountLeft = Amounts.sub(
+ Amounts.add(coin.currentAmount, Amounts.parseOrThrow(rd.refund_amount))
+ .amount,
+ Amounts.parseOrThrow(rd.refund_fee),
+ ).amount;
+ const allDenoms = await ws.db
+ .iterIndex(
+ Stores.denominations.exchangeBaseUrlIndex,
+ coin.exchangeBaseUrl,
+ )
+ .toArray();
+ refundsRefreshCost[key] = getTotalRefreshCost(allDenoms, denom, amountLeft);
+ }
+
const now = getTimestampNow();
await ws.db.runWithWriteTransaction(
@@ -282,6 +311,8 @@ async function acceptRefundResponse(
console.log("refund query not done");
}
+ p.refundsRefreshCost = {...p.refundsRefreshCost, ...refundsRefreshCost };
+
await tx.put(Stores.purchases, p);
const coinsPubsToBeRefreshed = Object.values(refreshCoinsMap);