import { PLATFORM_BITCOIN_ADDRESS } from './platformConfig' import type { TransactionVerificationResult } from './mempoolSpaceTypes' import { getTransaction } from './mempoolSpaceApi' import { verifySponsoringTransaction } from './mempoolSpaceVerification' export function scheduleNextCheck(checkConfirmation: () => void, interval: number): void { setTimeout(() => { void checkConfirmation() }, interval) } export async function checkTransactionStatus( params: { txid: string startTime: number timeout: number interval: number resolve: (value: TransactionVerificationResult | null) => void checkConfirmation: () => void } ): Promise { if (Date.now() - params.startTime > params.timeout) { params.resolve(null) return } const transaction = await getTransaction(params.txid) if (!transaction) { scheduleNextCheck(params.checkConfirmation, params.interval) return } const authorOutput = transaction.vout.find( (output) => output.scriptpubkey_address !== PLATFORM_BITCOIN_ADDRESS ) if (!authorOutput) { scheduleNextCheck(params.checkConfirmation, params.interval) return } const result = await verifySponsoringTransaction(params.txid, authorOutput.scriptpubkey_address) if (result.confirmed && result.valid) { params.resolve(result) } else { scheduleNextCheck(params.checkConfirmation, params.interval) } } export async function waitForConfirmation( txid: string, timeout: number = 600000, // 10 minutes interval: number = 10000 // 10 seconds ): Promise { const startTime = Date.now() return new Promise((resolve) => { const checkConfirmation = (): void => { void checkTransactionStatus({ txid, startTime, timeout, interval, resolve, checkConfirmation }) } checkConfirmation() }) }