story-research-zapwall/lib/mempoolSpaceConfirmation.ts
2026-01-09 01:49:57 +01:00

64 lines
1.8 KiB
TypeScript

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<void> {
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<TransactionVerificationResult | null> {
const startTime = Date.now()
return new Promise((resolve) => {
const checkConfirmation = (): void => {
void checkTransactionStatus({ txid, startTime, timeout, interval, resolve, checkConfirmation })
}
checkConfirmation()
})
}