aboutsummaryrefslogtreecommitdiff
path: root/src/operations
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2020-01-19 20:41:51 +0100
committerFlorian Dold <florian.dold@gmail.com>2020-01-19 20:41:51 +0100
commite124e05d531af11815e403f3547e167afb80cae6 (patch)
tree0837d9d66bacfd55eb404741d58828a772a11de5 /src/operations
parent5e77b222d50aa3b2a54e5128d2e9ffb0294e5002 (diff)
downloadwallet-core-e124e05d531af11815e403f3547e167afb80cae6.tar.xz
do not apply the same refresh twice
Diffstat (limited to 'src/operations')
-rw-r--r--src/operations/refresh.ts2
-rw-r--r--src/operations/refund.ts30
2 files changed, 26 insertions, 6 deletions
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) {