commit 9b1186d642b447acab7dd321d46dbaa3654565d7
parent a6d2437ebf89486466535c1183541833ac020874
Author: Sebastian <sebasjm@gmail.com>
Date: Fri, 4 Apr 2025 14:06:20 -0300
fix #9694
Diffstat:
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",