Skip to main content

State Proofs

Sei supports eth_getProof but returns a different proof format from Ethereum. If your application verifies proofs on-chain or off-chain, you need to account for this difference.

The Difference

Ethereum stores state in a Merkle Patricia Trie (MPT) and eth_getProof returns MPT inclusion proofs. Sei stores state in an IAVL tree and returns IAVL proofs instead. The RPC method exists and responds correctly, but the proof data structure is not compatible with Ethereum MPT proof verifiers.

What This Affects

Most applications do not call eth_getProof directly. It is primarily used by:
  • Light clients verifying state without trusting an RPC node
  • Cross-chain bridges proving inclusion of state on Sei
  • Applications verifying contract storage values trustlessly
If you are doing standard contract reads, event queries, or transaction lookups, this difference does not affect you.

Calling eth_getProof

Storage key requirements

Before calling eth_getProof, note two requirements Sei enforces on the storageKeys argument:
  • Keys must be hex-encoded. Each storage key must be a valid hex-encoded value (for example 0x0000000000000000000000000000000000000000000000000000000000000001). Keys are decoded and left-padded to 32 bytes. A malformed, non-hex key is rejected with an invalid storage key error. Raw byte strings, which were previously accepted, no longer work.
  • At most 1024 keys per request. A single proof request may include a maximum of 1024 storage keys. Requesting more returns a too many storage keys error. Split larger sets across multiple requests.
The call works through standard libraries:

Verifying Proofs

To verify Sei state proofs, use an IAVL-compatible verifier. Standard Ethereum MPT verifier libraries (e.g. those used in Solidity or in Ethereum bridge contracts) will reject Sei proofs. Refer to the Sei RPC reference for the exact proof schema returned.