summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2020-03-16 17:18:46 +0530
committerFlorian Dold <florian.dold@gmail.com>2020-03-16 17:18:46 +0530
commit9e2be07cfc2267f817c22105ad2a147bc7f8c33e (patch)
treecba573c84f102dbe62a1ddfd250404b485202c65
parent1744b1a80063397105081a4d5aeec76936781345 (diff)
downloadwallet-core-9e2be07cfc2267f817c22105ad2a147bc7f8c33e.tar.gz
wallet-core-9e2be07cfc2267f817c22105ad2a147bc7f8c33e.tar.bz2
wallet-core-9e2be07cfc2267f817c22105ad2a147bc7f8c33e.zip
fix bug in withdrawal operation state machine, allow manual reserve update from CLI
-rw-r--r--src/headless/taler-wallet-cli.ts12
-rw-r--r--src/operations/reserves.ts10
-rw-r--r--src/wallet.ts6
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<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);
}