From 646e388b28ccd9cc04fdefc8778f80d022615f7f Mon Sep 17 00:00:00 2001 From: Kurdistan Tech Ministry Date: Mon, 23 Feb 2026 22:09:46 +0300 Subject: [PATCH] fix: wait for block finalization in verify-deposit instead of failing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace hard fail on unfinalized blocks with a retry loop that polls every 6 seconds up to 60 seconds. The TX is already fully verified via events at this point — we just wait for GRANDPA finality before crediting. --- .../functions/verify-deposit/index.ts | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/web/supabase/functions/verify-deposit/index.ts b/web/supabase/functions/verify-deposit/index.ts index 5451bb85..584c88a0 100644 --- a/web/supabase/functions/verify-deposit/index.ts +++ b/web/supabase/functions/verify-deposit/index.ts @@ -332,22 +332,28 @@ async function verifyTransactionOnChain( } } - // Check if block is finalized - const finalizedHash = await api.rpc.chain.getFinalizedHead() - const finalizedHeader = await api.rpc.chain.getHeader(finalizedHash) - const finalizedNumber = finalizedHeader.number.toNumber() + // Wait for block finalization (poll every 6s, max 60s) + const POLL_INTERVAL = 6000 + const MAX_WAIT = 60000 + const startTime = Date.now() - if (found.blockNumber > finalizedNumber) { - return { - valid: false, - error: 'Transaction not yet finalized. Please wait a few more blocks.' + while (Date.now() - startTime < MAX_WAIT) { + const finalizedHash = await api.rpc.chain.getFinalizedHead() + const finalizedHeader = await api.rpc.chain.getHeader(finalizedHash) + const finalizedNumber = finalizedHeader.number.toNumber() + + if (found.blockNumber <= finalizedNumber) { + console.log(`Block #${found.blockNumber} finalized (finalized head: #${finalizedNumber})`) + return { valid: true, actualAmount, from } } + + console.log(`Waiting for finalization: block #${found.blockNumber}, finalized: #${finalizedNumber}`) + await new Promise(r => setTimeout(r, POLL_INTERVAL)) } return { - valid: true, - actualAmount, - from + valid: false, + error: 'Transaction block did not finalize within 60 seconds. Please try verifying again.' } } catch (error) {