From 9e2be07cfc2267f817c22105ad2a147bc7f8c33e Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Mon, 16 Mar 2020 17:18:46 +0530 Subject: [PATCH] fix bug in withdrawal operation state machine, allow manual reserve update from CLI --- src/headless/taler-wallet-cli.ts | 12 ++++++++++++ src/operations/reserves.ts | 10 +++++++--- src/wallet.ts | 6 ++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/headless/taler-wallet-cli.ts b/src/headless/taler-wallet-cli.ts index 28618bcc2..2a1040630 100644 --- a/src/headless/taler-wallet-cli.ts +++ b/src/headless/taler-wallet-cli.ts @@ -374,6 +374,18 @@ advancedCli }); }); + advancedCli + .subcommand("updateReserve", "update-reserve", { + help: "Update reserve status.", + }) + .requiredArgument("reservePub", clk.STRING) + .action(async args => { + await withWallet(args, async wallet => { + const r = await wallet.updateReserve(args.updateReserve.reservePub); + console.log("updated reserve:", JSON.stringify(r, undefined, 2)); + }); + }); + const testCli = walletCli.subcommand("testingArgs", "testing", { help: "Subcommands for testing GNU Taler deployments.", }); diff --git a/src/operations/reserves.ts b/src/operations/reserves.ts index efca08a45..d19d069af 100644 --- a/src/operations/reserves.ts +++ b/src/operations/reserves.ts @@ -228,7 +228,7 @@ export async function forceQueryReserve( await tx.put(Stores.reserves, reserve); }); - await processReserve(ws, reservePub); + await processReserve(ws, reservePub, true); } /** @@ -490,6 +490,7 @@ async function updateReserve( reserveUpdateId, }; await tx.put(Stores.reserveUpdatedEvents, reserveUpdate); + r.reserveStatus = ReserveRecordStatus.WITHDRAWING; } else { const expectedBalance = Amounts.sub( r.amountWithdrawAllocated, @@ -497,7 +498,8 @@ async function updateReserve( ); const cmp = Amounts.cmp(balance, expectedBalance.amount); if (cmp == 0) { - // Nothing changed. + // Nothing changed, go back to sleep! + r.reserveStatus = ReserveRecordStatus.DORMANT; return; } if (cmp > 0) { @@ -506,8 +508,10 @@ async function updateReserve( r.amountWithdrawRemaining, extra, ).amount; + r.reserveStatus = ReserveRecordStatus.WITHDRAWING; } else { // We're missing some money. + r.reserveStatus = ReserveRecordStatus.DORMANT; } const reserveUpdate: ReserveUpdatedEventRecord = { reservePub: r.reservePub, @@ -520,12 +524,12 @@ async function updateReserve( await tx.put(Stores.reserveUpdatedEvents, reserveUpdate); } r.lastSuccessfulStatusQuery = getTimestampNow(); - r.reserveStatus = ReserveRecordStatus.WITHDRAWING; r.retryInfo = initRetryInfo(); r.reserveTransactions = reserveInfo.history; await tx.put(Stores.reserves, r); }, ); + console.log("updated reserve"); ws.notify({ type: NotificationType.ReserveUpdated }); } diff --git a/src/wallet.ts b/src/wallet.ts index 9cba1360e..291143761 100644 --- a/src/wallet.ts +++ b/src/wallet.ts @@ -85,6 +85,7 @@ import { import { processReserve, createTalerWithdrawReserve, + forceQueryReserve, } from "./operations/reserves"; import { InternalWalletState } from "./operations/state"; @@ -714,6 +715,11 @@ export class Wallet { } } + async updateReserve(reservePub: string): Promise { + await forceQueryReserve(this.ws, reservePub); + return await this.ws.db.get(Stores.reserves, reservePub); + } + async refuseProposal(proposalId: string): Promise { return refuseProposal(this.ws, proposalId); }