State Proofs
Sei supportseth_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) andeth_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.
Store backends
eth_getProof resolves the underlying account store by unwrapping known KVStore wrappers until it reaches a proof-capable queryable store. This means proofs are served across a broader range of node configurations, not just a classic IAVL store. Supported roots include:
- Classic IAVL stores
- store/v2 memiavl commitment stores
- Any other proof-capable (queryable) store reached through cache,
tracekv, Giga cache, or prefix store wrappers
cannot find a proof-capable queryable KV store error. In all cases the returned proof data is IAVL-format, not Ethereum MPT.
What This Affects
Most applications do not calleth_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
Calling eth_getProof
Storage key requirements
Before callingeth_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 aninvalid storage keyerror. 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 keyserror. Split larger sets across multiple requests.