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.
curl https://coord.taifoon.dev/v1/proof/tx/8453/0x0f7f432e5fb3e650618387cdfbe99e94c105675f7729cc85a9a61b6c678500ff| Answer | What 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: true | The block is in range but its proof is still being built: retry after retry_after_seconds. |
404 chain_not_read | The layer reads no RPC of that chain. The answer lists the chains it reads. |
503 producer_unavailable | The 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):
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:
curl "https://coord.taifoon.dev/v1/proof/blocks/8453?blocks=51419742,51419743"That a block sits under the current root:
curl https://coord.taifoon.dev/v1/root/proof/8453/52174000What a proof commits, level by level
| Layer | What it holds |
|---|---|
superroot | One 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. |
superrootProof | The siblings from that chain’s leaf up to the superroot. |
blockProof | The block’s path in its chain’s block tree (depth 32, indexed by block number); 2,048 headers make one twig. |
event | The ABI-encoded log, when you ask for one. |
finality | Whether 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.
curl https://coord.taifoon.dev/v1/root/latestOn Base, three contracts take a V5 proof. Call them with the ABI Basescan shows for each address; there is no package to install.
| Contract | What it does | Calls |
|---|---|---|
TaifoonV5ProofVerifier0x2D475a53eAA8F9AC78B69bD2429275a622C644f8 | 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) |
TaifoonHeaderOracle0xCff7404874ffb1Ab1Cc62631bfE097C391b6491d | 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.
