From e124e05d531af11815e403f3547e167afb80cae6 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Sun, 19 Jan 2020 20:41:51 +0100 Subject: do not apply the same refresh twice --- src/operations/refresh.ts | 2 +- src/operations/refund.ts | 30 +++++++++++++++++++++++++----- 2 files changed, 26 insertions(+), 6 deletions(-) (limited to 'src/operations') diff --git a/src/operations/refresh.ts b/src/operations/refresh.ts index 418ec0469..b53baf390 100644 --- a/src/operations/refresh.ts +++ b/src/operations/refresh.ts @@ -238,7 +238,7 @@ async function refreshMelt( rc: refreshSession.hash, value_with_fee: Amounts.toString(refreshSession.amountRefreshInput), }; - logger.trace("melt request:", meltReq); + logger.trace(`melt request for coin:`, meltReq); const resp = await ws.http.postJson(reqUrl.href, meltReq); if (resp.status !== 200) { console.log(`got status ${resp.status} for refresh/melt`); diff --git a/src/operations/refund.ts b/src/operations/refund.ts index 92e9204d2..2fb3a2390 100644 --- a/src/operations/refund.ts +++ b/src/operations/refund.ts @@ -54,6 +54,9 @@ import { randomBytes } from "../crypto/primitives/nacl-fast"; import { encodeCrock } from "../crypto/talerCrypto"; import { HttpResponseStatus } from "../util/http"; import { getTimestampNow } from "../util/time"; +import { Logger } from "../util/logging"; + +const logger = new Logger("refund.ts"); async function incrementPurchaseQueryRefundRetry( ws: InternalWalletState, @@ -468,15 +471,24 @@ async function processPurchaseApplyRefundImpl( return; } refreshCoinsMap[c.coinPub] = { coinPub: c.coinPub }; + logger.trace(`commiting refund ${perm.merchant_sig} to coin ${c.coinPub}`); + logger.trace(`coin amount before is ${Amounts.toString(c.currentAmount)}`) + logger.trace(`refund amount (via merchant) is ${perm.refund_amount}`); + logger.trace(`refund fee (via merchant) is ${perm.refund_fee}`); const refundAmount = Amounts.parseOrThrow(perm.refund_amount); const refundFee = Amounts.parseOrThrow(perm.refund_fee); c.status = CoinStatus.Dormant; c.currentAmount = Amounts.add(c.currentAmount, refundAmount).amount; c.currentAmount = Amounts.sub(c.currentAmount, refundFee).amount; + logger.trace(`coin amount after is ${Amounts.toString(c.currentAmount)}`) await tx.put(Stores.coins, c); }; for (const pk of Object.keys(newRefundsFailed)) { + if (p.refundState.refundsDone[pk]) { + // We already processed this one. + break; + } const r = newRefundsFailed[pk]; groups[r.refundGroupId] = true; delete p.refundState.refundsPending[pk]; @@ -484,6 +496,10 @@ async function processPurchaseApplyRefundImpl( } for (const pk of Object.keys(newRefundsDone)) { + if (p.refundState.refundsDone[pk]) { + // We already processed this one. + break; + } const r = newRefundsDone[pk]; groups[r.refundGroupId] = true; delete p.refundState.refundsPending[pk]; @@ -516,11 +532,15 @@ async function processPurchaseApplyRefundImpl( allRefundsProcessed = true; } await tx.put(Stores.purchases, p); - await createRefreshGroup( - tx, - Object.values(refreshCoinsMap), - RefreshReason.Refund, - ); + const coinsPubsToBeRefreshed = Object.values(refreshCoinsMap); + if (coinsPubsToBeRefreshed.length > 0) + { + await createRefreshGroup( + tx, + coinsPubsToBeRefreshed, + RefreshReason.Refund, + ); + } }, ); if (allRefundsProcessed) { -- cgit v1.2.3