taler-typescript-core

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

commit 9b1186d642b447acab7dd321d46dbaa3654565d7
parent a6d2437ebf89486466535c1183541833ac020874
Author: Sebastian <sebasjm@gmail.com>
Date:   Fri,  4 Apr 2025 14:06:20 -0300

fix #9694

Diffstat:
Mpackages/taler-wallet-core/src/db.ts | 2++
Mpackages/taler-wallet-core/src/withdraw.ts | 43++++++++++++++++---------------------------
2 files changed, 18 insertions(+), 27 deletions(-)

diff --git a/packages/taler-wallet-core/src/db.ts b/packages/taler-wallet-core/src/db.ts @@ -1536,6 +1536,8 @@ export interface WithdrawalGroupRecord { /** * Delay to wait until the next withdrawal attempt. + * + * @deprecated by https://bugs.gnunet.org/view.php?id=9694 */ kycWithdrawalDelay?: TalerProtocolDuration; diff --git a/packages/taler-wallet-core/src/withdraw.ts b/packages/taler-wallet-core/src/withdraw.ts @@ -2139,6 +2139,10 @@ async function processWithdrawalGroupAbortingBank( return TaskRunResult.finished(); } +const KYC_WITHDRAWAL_WAIT = Duration.fromTalerProtocolDuration( + Duration.toTalerProtocolDuration(Duration.fromSpec({ minutes: 10 })), +); + async function processWithdrawalGroupPendingKyc( wex: WalletExecutionContext, withdrawalGroup: WithdrawalGroupRecord, @@ -2162,6 +2166,7 @@ async function processWithdrawalGroupPendingKyc( url.hostname, async (timeoutMs) => { url.searchParams.set("timeout_ms", `${timeoutMs}`); + url.searchParams.set("lpt", "3"); // wait for the KYC status to be OK logger.info(`long-polling for withdrawal KYC status via ${url.href}`); return await wex.http.fetch(url.href, { method: "GET", @@ -2205,12 +2210,18 @@ async function processWithdrawalGroupPendingKyc( } switch (rec.status) { case WithdrawalGroupStatus.PendingKyc: { - // Try withdrawal again. - rec.status = WithdrawalGroupStatus.PendingReady; - rec.kycWithdrawalDelay = Duration.toTalerProtocolDuration( - Duration.fromSpec({ minutes: 40 }), + const start = AbsoluteTime.fromPreciseTimestamp( + timestampPreciseFromDb(rec.timestampStart), ); - return TransitionResult.transition(rec); + const end = AbsoluteTime.addDuration(start, KYC_WITHDRAWAL_WAIT); + if (AbsoluteTime.isExpired(end)) { + // KYC still required but maybe not for withdrawal operation + // try withdrawing just in case + rec.status = WithdrawalGroupStatus.PendingReady; + return TransitionResult.transition(rec); + } + // Try withdrawal again. + return TransitionResult.stay(); } default: return TransitionResult.stay(); @@ -2377,28 +2388,6 @@ async function processWithdrawalGroupPendingReady( const { withdrawalGroupId } = withdrawalGroup; const ctx = new WithdrawTransactionContext(wex, withdrawalGroupId); - if (withdrawalGroup.kycWithdrawalDelay) { - // We've been asked to delay the next withdrawal, - // as we're waiting for KYC. - const delay = Duration.fromTalerProtocolDuration( - withdrawalGroup.kycWithdrawalDelay, - ); - await ctx.transition({}, async (wg) => { - if (!wg) { - return TransitionResult.stay(); - } - switch (wg.status) { - case WithdrawalGroupStatus.PendingReady: - delete wg.kycWithdrawalDelay; - return TransitionResult.transition(wg); - default: - } - return TransitionResult.stay(); - }); - const nextRun = AbsoluteTime.addDuration(AbsoluteTime.now(), delay); - return TaskRunResult.runAgainAt(nextRun); - } - checkDbInvariant( withdrawalGroup.denomsSel !== undefined, "can't process uninitialized exchange",