taler-typescript-core

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

commit ac8c6682a5a3ef70f82f28af827c450a1fdb0830
parent edc41030589cb221f9480852c5cd996a52f54dfc
Author: Florian Dold <florian@dold.me>
Date:   Tue, 17 Sep 2024 16:07:20 +0200

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.

Diffstat:
Mpackages/taler-wallet-cli/src/index.ts | 16+++++++++++++++-
Mpackages/taler-wallet-core/src/deposits.ts | 40+++++++++++++++++++++++++++++++++++++---
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 @@ -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 @@ -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];