diff options
author | Florian Dold <florian@dold.me> | 2024-09-17 16:07:20 +0200 |
---|---|---|
committer | Florian Dold <florian@dold.me> | 2024-09-17 16:08:42 +0200 |
commit | ac8c6682a5a3ef70f82f28af827c450a1fdb0830 (patch) | |
tree | 1f774f712217399f97611aa0f4f67b8550ea8537 | |
parent | edc41030589cb221f9480852c5cd996a52f54dfc (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.ts | 16 | ||||
-rw-r--r-- | packages/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 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]; |