verify_miner_fulfillment reads confirmations once and then votes — both in the RPC path (allways/chain_providers/bitcoin.py:169-177) and the Blockstream path (allways/chain_providers/bitcoin.py:236-256).
Between that read and vote inclusion (12s+ cadence) a reorg can drop the tx. Bitcoin Core's confirmations field does update on reorgs, but the validator has already voted by then. Blockstream's status.confirmed is self-reported by whichever instance answered — no canonical-chain guarantee.
Direction: fetch the blockhash on every check and require that block to still be on the canonical chain at vote time; require min-confirmations to persist across at least two polls before voting.
verify_miner_fulfillmentreadsconfirmationsonce and then votes — both in the RPC path (allways/chain_providers/bitcoin.py:169-177) and the Blockstream path (allways/chain_providers/bitcoin.py:236-256).Between that read and vote inclusion (12s+ cadence) a reorg can drop the tx. Bitcoin Core's
confirmationsfield does update on reorgs, but the validator has already voted by then. Blockstream'sstatus.confirmedis self-reported by whichever instance answered — no canonical-chain guarantee.Direction: fetch the blockhash on every check and require that block to still be on the canonical chain at vote time; require min-confirmations to persist across at least two polls before voting.