taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit 9e2be07cfc2267f817c22105ad2a147bc7f8c33e
parent 1744b1a80063397105081a4d5aeec76936781345
Author: Florian Dold <florian.dold@gmail.com>
Date:   Mon, 16 Mar 2020 17:18:46 +0530

fix bug in withdrawal operation state machine, allow manual reserve update from CLI

Diffstat:
Msrc/headless/taler-wallet-cli.ts | 12++++++++++++
Msrc/operations/reserves.ts | 10+++++++---
Msrc/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 @@ -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 @@ -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 @@ -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<ReserveRecord | undefined> { + await forceQueryReserve(this.ws, reservePub); + return await this.ws.db.get(Stores.reserves, reservePub); + } + async refuseProposal(proposalId: string): Promise<void> { return refuseProposal(this.ws, proposalId); }