do not apply the same refresh twice

This commit is contained in:
Florian Dold 2020-01-19 20:41:51 +01:00
parent 5e77b222d5
commit e124e05d53
No known key found for this signature in database
GPG Key ID: D2E4F00F29D02A4B
2 changed files with 26 additions and 6 deletions

View File

@ -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`);

View File

@ -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) {