TaifoonTAIFOON
Prove a transaction

Guide · Prove

Prove a transaction

A V5 proof carries the Merkle path from a transaction's block to the root, so you check it yourself. Proofs are free on the public routes, on the 16 EVM chains the layer reads per transaction.

Prove a transaction

The first ask builds the proof and can take about 10 seconds. Later asks for the same transaction are quick.

shell
curl https://coord.taifoon.dev/v1/proof/tx/8453/0x0f7f432e5fb3e650618387cdfbe99e94c105675f7729cc85a9a61b6c678500ff
AnswerWhat it means
200, proof_state: "proven"The block is final and committed by the superroot named in super_root_hash; checks lists what was verified, blob is the proof.
200, proof_state: "not_final"The block is not final on its chain yet. The proof is served; act on it only after finality.
200, pending_proof: trueThe block is in range but its proof is still being built: retry after retry_after_seconds.
404 chain_not_readThe layer reads no RPC of that chain. The answer lists the chains it reads.
503 producer_unavailableThe proof was not served in time. Retry after 10 seconds.

Prove one log, or many blocks

One log of a transaction, by its index in the block (here log 527 of the same transaction):

shell
curl "https://coord.taifoon.dev/v1/proof/log/8453/0x0f7f432e5fb3e650618387cdfbe99e94c105675f7729cc85a9a61b6c678500ff?log_index=527"

Up to 256 blocks of one chain in one compact proof, anchored to the superroot:

shell
curl "https://coord.taifoon.dev/v1/proof/blocks/8453?blocks=51419742,51419743"

That a block sits under the current root:

shell
curl https://coord.taifoon.dev/v1/root/proof/8453/52174000

What a proof commits, level by level

LayerWhat it holds
superrootOne hash over every chain the layer reads, recomputed every 10 seconds.
chainHeaders[]The block: chainId, blockNumber, blockHash, the chain tree root and its twig count.
superrootProofThe siblings from that chain’s leaf up to the superroot.
blockProofThe block’s path in its chain’s block tree (depth 32, indexed by block number); 2,048 headers make one twig.
eventThe ABI-encoded log, when you ask for one.
finalityWhether the block is final on its chain, and by which rule.

Check it yourself

Off chain, the check is a keccak walk from the block's leaf to the superroot, then a comparison with the published root. The walk, line by line, is in Onboard a protocol, and /proof runs the same check in your browser for any block.

shell
curl https://coord.taifoon.dev/v1/root/latest

On Base, three contracts take a V5 proof. Call them with the ABI Basescan shows for each address; there is no package to install.

ContractWhat it doesCalls
TaifoonV5ProofVerifier
0x2D475a53eAA8F9AC78B69bD2429275a622C644f8
Checks a block proof, or a transaction’s receipt against its block.verify(blob) · verifyWithReceipt(blob, receipt) · verifyEncoded(bytes)
Taifoon Universal Operator (TUO V5)
0x785F4701C681dCBa8762FcfaF18db4048215c0ca
Calls your contract only after the proof passes; each event executes once.executeVerifiedCallV5Strict(blob, receipt, vendor, calldata)
TaifoonHeaderOracle
0xCff7404874ffb1Ab1Cc62631bfE097C391b6491d
Holds anchored block hashes per chain.isProven(chainId, block, hash) · provenHashAt(chainId, block)

The superroot anchor of the verifier is not set yet, so on chain it checks a proof against the root the caller passes. Compare that root with GET /v1/root/latest before you act on a proof. For a transaction, build the receipt inclusion from eth_getBlockReceipts (the header RLP, the receipt RLP and its trie nodes) and call verifyWithReceipt.