aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2024-09-17 16:07:20 +0200
committerFlorian Dold <florian@dold.me>2024-09-17 16:08:42 +0200
commitac8c6682a5a3ef70f82f28af827c450a1fdb0830 (patch)
tree1f774f712217399f97611aa0f4f67b8550ea8537
parentedc41030589cb221f9480852c5cd996a52f54dfc (diff)
wallet-core: fix deposit state machine
When a deposit transaction is in pending(track), it can only be failed, not aborted. While the deposit is being tracked, it can still fail (due to KYC). That would result in lost funds, thus the only available option is fail.
-rw-r--r--packages/taler-wallet-cli/src/index.ts16
-rw-r--r--packages/taler-wallet-core/src/deposits.ts40
2 files changed, 52 insertions, 4 deletions
diff --git a/packages/taler-wallet-cli/src/index.ts b/packages/taler-wallet-cli/src/index.ts
index be74e464b..dc11f83b3 100644
--- a/packages/taler-wallet-cli/src/index.ts
+++ b/packages/taler-wallet-cli/src/index.ts
@@ -335,12 +335,26 @@ async function withWallet<T>(
writeObservabilityLog(notif);
};
+ let walletSocketPath: string | undefined = undefined;
+
+ const connEnvName = "TALER_WALLET_CONNECTION";
+
if (walletCliArgs.wallet.walletConnection) {
+ walletSocketPath = walletCliArgs.wallet.walletConnection;
+ logger.info(`using wallet socket from command line (${walletSocketPath})`);
+ } else if (!!process.env[connEnvName]) {
+ walletSocketPath = process.env[connEnvName];
+ logger.info(
+ `using wallet socket from ${connEnvName} (${walletSocketPath})`,
+ );
+ }
+
+ if (walletSocketPath) {
logger.info("creating remote wallet");
const w = await createRemoteWallet({
name: "wallet",
notificationHandler: onNotif,
- socketFilename: walletCliArgs.wallet.walletConnection,
+ socketFilename: walletSocketPath,
});
const ctx: WalletContext = {
makeCoreApiRequest(operation, payload) {
diff --git a/packages/taler-wallet-core/src/deposits.ts b/packages/taler-wallet-core/src/deposits.ts
index 67262b821..35b4daf40 100644
--- a/packages/taler-wallet-core/src/deposits.ts
+++ b/packages/taler-wallet-core/src/deposits.ts
@@ -399,6 +399,19 @@ export class DepositTransactionContext implements TransactionContext {
newTxState: computeDepositTransactionStatus(dg),
};
}
+ case DepositOperationStatus.PendingTrack:
+ case DepositOperationStatus.SuspendedTrack:
+ case DepositOperationStatus.AbortedDeposit:
+ case DepositOperationStatus.Aborting:
+ case DepositOperationStatus.FailedDeposit:
+ case DepositOperationStatus.FailedTrack:
+ case DepositOperationStatus.Finished:
+ case DepositOperationStatus.SuspendedAborting:
+ case DepositOperationStatus.PendingAggregateKyc:
+ case DepositOperationStatus.SuspendedAggregateKyc:
+ break;
+ default:
+ assertUnreachable(dg.operationStatus);
}
return undefined;
},
@@ -491,8 +504,6 @@ export class DepositTransactionContext implements TransactionContext {
switch (dg.operationStatus) {
case DepositOperationStatus.PendingAggregateKyc:
case DepositOperationStatus.SuspendedAggregateKyc:
- case DepositOperationStatus.PendingTrack:
- case DepositOperationStatus.SuspendedTrack:
case DepositOperationStatus.SuspendedAborting:
case DepositOperationStatus.Aborting: {
dg.operationStatus = DepositOperationStatus.FailedDeposit;
@@ -503,6 +514,29 @@ export class DepositTransactionContext implements TransactionContext {
newTxState: computeDepositTransactionStatus(dg),
};
}
+ case DepositOperationStatus.PendingTrack:
+ case DepositOperationStatus.SuspendedTrack: {
+ dg.operationStatus = DepositOperationStatus.FailedTrack;
+ await tx.depositGroups.put(dg);
+ await this.updateTransactionMeta(tx);
+ return {
+ oldTxState: oldState,
+ newTxState: computeDepositTransactionStatus(dg),
+ };
+ }
+ case DepositOperationStatus.AbortedDeposit:
+ case DepositOperationStatus.FailedDeposit:
+ case DepositOperationStatus.FailedTrack:
+ case DepositOperationStatus.Finished:
+ case DepositOperationStatus.PendingDeposit:
+ case DepositOperationStatus.PendingDepositKyc:
+ case DepositOperationStatus.PendingDepositKycAuth:
+ case DepositOperationStatus.SuspendedDeposit:
+ case DepositOperationStatus.SuspendedDepositKyc:
+ case DepositOperationStatus.SuspendedDepositKycAuth:
+ break;
+ default:
+ assertUnreachable(dg.operationStatus);
}
return undefined;
},
@@ -649,7 +683,7 @@ export function computeDepositTransactionActions(
return [
TransactionAction.Retry,
TransactionAction.Suspend,
- TransactionAction.Abort,
+ TransactionAction.Fail,
];
case DepositOperationStatus.SuspendedAggregateKyc:
return [TransactionAction.Resume, TransactionAction.Fail];