# Compatibility, measured A GPU-secured network for Ethereum-compatible applications and verifiable computation. Compatibility is a product deliverable here, not a sentence: every row below is a test that ran against the devnet from the repository (`tools/reference-apps/compat/run.mjs`), with its evidence, and a row that could not run says so and why. Devnet, no value. Last run: 2026-10-08 17:45 UTC on igneum-devnet-4 (chain id 4465), run id ra-20261008T1744-evm. 22 passed, 0 failed, 0 untested. Sender 0x27C433aE…, contracts compiled with solc 0.8.28+commit.7893614a.Emscripten.clang. Three boundaries hold for everything on this page: proven execution is not finality; EVM compatibility is not Ethereum security; ZK is not privacy. The four words included, executed, proven and finalised are defined on [/receipt](/receipt). ## Representative contracts (register case EVM-05) | Row | Verdict | What was measured | Evidence | |---|---|---|---| | an ERC-20 deploys (CREATE address as Ethereum computes it, code at the address) | **passed** | at 0xd93f5e2091ccd544757a38ecf5e4fa176c141b62, block 3016, gas 436751 of 639078 estimated | tx 0x314c059b…a679, address 0xd93f5e2091ccd544757a38ecf5e4fa176c141b62, block 3016, gasUsed 436751, estimated 639078 | | ERC-20 transfer: balances move, the Transfer log decodes, eth_call reads the new balance | **passed** | 5 CTT to 0x00000000, log decoded, balance read | tx 0xd8dbd034…15ce, block 3018 | | ERC-20 approve then transferFrom by a spender (the sender approves itself as spender): allowance consumed, logs decode | **passed** | allowance 3 then 1 after transferFrom of 2 | approve 0x570bbe86…52c8, transferFrom 0xe6031b34…cd5f | | a probe contract deploys (counter, block context reader, revert, out-of-gas loop, CREATE2) | **passed** | at 0xc4de4cf5766650a5c029fa908e3eb9270a19ed7d | tx 0x97e39c81…bdfa, address 0xc4de4cf5766650a5c029fa908e3eb9270a19ed7d, block 3026 | | a counter increments twice and reads 2 (state persists across chain blocks) | **passed** | count 2 after blocks 3029 and 3032 | first 0x1771f03c…cd3a, second 0xad3f6594…c013 | ## Transaction binding and replay (register case EVM-02) | Row | Verdict | What was measured | Evidence | |---|---|---|---| | a transaction signed for another chain id (the previous devnet's 4464) is refused by the node | **passed** | refused: wrong chain id: expected 4465, got Some(4464) | chain_id_signed 4464 | | the same signed transaction sent twice: the second send is refused (nonce already used) | **passed** | first send mined in block 3049; the replay refused: nonce too low: account nonce is 40, transaction has 39 | tx 0xb1722ee0…a36f, block 3049, nonce_after 40 | ## Wallet fee estimation (register case EVM-03) | Row | Verdict | What was measured | Evidence | |---|---|---|---| | eth_gasPrice, eth_maxPriorityFeePerGas and eth_feeHistory answer in Ethereum's shapes | **passed** | gasPrice 196.130804856 gwei, priority 1 gwei, feeHistory 5 base fees | gasPrice 0x2daa4e9478, maxPriorityFeePerGas 0x3b9aca00 | | a plain transfer: eth_estimateGas against the receipt's gasUsed (the quote folds proving gas; both above Ethereum's 21,000) | **passed** | estimated 59650, used 21000 (35% of the estimate); Ethereum's figure is 21,000 | tx 0x6e67cf09…c795, estimated 59650, gasUsed 21000, ethereum 21000 | | a contract call: eth_estimateGas against gasUsed (a wallet that quotes from the node is covered) | **passed** | estimated 134366, used 26371 | tx 0xc14d3a76…31c6, estimated 134366, gasUsed 26371 | | the documented difference: a transfer sent with a local 21,000 gas limit (Ethereum's intrinsic cost) instead of the node's quote | **passed** | the node accepted it and it succeeded with gasUsed 21000: a wallet with a hard-coded 21,000 works | sent true, hash 0x1581f608…2c32, status success, gasUsed 21000 | ## Indexing (register case EVM-06) | Row | Verdict | What was measured | Evidence | |---|---|---|---| | eth_getLogs by address, by topic and by block range returns the receipts' logs with consistent logIndex and transactionIndex | **passed** | 4 logs by address, 3 Transfer logs by topic, each found in its receipt | byAddress 4, byTopic 3, fromBlock 3016 | | eth_getBlockByNumber with full transactions, eth_getBlockReceipts and eth_getTransactionByHash agree on indices and hashes | **passed** | block 3018: 1 transactions, indices 0 to 0 continuous | block 3018, count 1 | ## Failed transactions (register case EVM-05) | Row | Verdict | What was measured | Evidence | |---|---|---|---| | a revert with a reason: eth_call returns the reason, the sent transaction has status 0, gas is charged, the nonce advances | **passed** | eth_call answers code 3 "execution reverted" with Error(string) data decoding to "compat says no"; the sent transaction: status 0, gasUsed 22292 of 200000, nonce 37 to 38 | tx 0x90e50327…1344, gasUsed 22292, block 3044, call_error_code 3, call_error_message execution reverted, revert_data 0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000e636f6d7061742073617973206e6f000000000000000000000000000000000000 | | an out-of-gas call: status 0 and the whole limit charged | **passed** | status 0, gasUsed 150000 of the 150000 limit | tx 0x4d138920…e5f0, gasUsed 150000, limit 150000 | ## Receipts (register case EVM-06) | Row | Verdict | What was measured | Evidence | |---|---|---|---| | a receipt carries every Ethereum field, logsBloom recomputes from its logs, contractAddress is set on creation | **passed** | 15 fields, bloom recomputed over 1 log(s), contractAddress 0xd93f5e20 | tx 0x314c059b…a679 | | the block's receipts rebuild its receipts trie root (Ethereum's layout, the node's encoding) equal to the header's receiptsRoot | **passed** | block 3018, 1 receipts, root 0xc443c3e57c60 | block 3018, receipts 1, receiptsRoot 0xc443c3e5…8836 | ## Application assumptions (register case EVM-04) | Row | Verdict | What was measured | Evidence | |---|---|---|---| | block.number, timestamp, chainid, basefee and blockhash(number-1) read from a contract match the block the call executed in | **passed** | block 3053: number, timestamp, chainid 4465, basefee, blockhash(n-1) = parentHash, msg.sender and tx.origin all match | tx 0x186def3b…a228, block 3053 | | CREATE2 lands at the address Ethereum computes (keccak(0xff, deployer, salt, keccak(initcode))) | **passed** | child at 0xe3bC69915FB7318236c5ff31EF679aF6ae5b8699 | tx 0x442569b2…af11, address 0xe3bC69915FB7318236c5ff31EF679aF6ae5b8699 | ## Differences: block context (register case EVM-04) | Row | Verdict | What was measured | Evidence | |---|---|---|---| | block.coinbase is the miner of the DAG block that first included the transaction, not one miner per chain block (measured: coinbase against the block's igneum.mergeset) | **passed** | coinbase 0x1450a9d8 = the including block's miner 0x1450a9d8; the chain block merged 1 block(s) with 1 distinct miner(s), chain block miner 0x1450a9d8 | tx 0x186def3b…a228, coinbase 0x1450a9d804D29084d34b93afB001dE807Aa9920d, includingMiner 0x1450a9d804d29084d34b93afb001de807aa9920d, chainBlockMiner 0x1450a9d804d29084d34b93afb001de807aa9920d | ## Differences: randomness (register case EVM-04) | Row | Verdict | What was measured | Evidence | |---|---|---|---| | block.prevrandao: its value is derived from the chain's epoch seed (not Ethereum's beacon RANDAO); measured across consecutive blocks, and from a contract when a sender is funded | **passed** | blocks 3051 to 3054: 1 distinct epoch seed(s), 4 distinct mixHash value(s) in the headers; the source is the chain's epoch seed, which holds for an epoch, so prevrandao is not fresh per block and must not seed a lottery; a contract reading it twice in one call got the same value, and at block 3053 it read 0x3b9abd95a495… | | ## Differences: two-dimensional fees (register case EVM-03) | Row | Verdict | What was measured | Evidence | |---|---|---|---| | a receipt carries pgasUsed, provingBaseFeePerGas, burnedProvingFee and burnedExecutionBaseFee; effectiveGasPrice covers both dimensions | **passed** | gasUsed 51375, pgasUsed 1968, proving base fee 10000 gwei per pgas; paid 5188875000000000 wei, of which proving burn 19680000000000000, execution burn 5137500000000000, tip 41100000000000 (parts sum differs from gasUsed × effectiveGasPrice) | tx 0xd8dbd034…15ce, gasUsed 51375, pgasUsed 1968, effectiveGasPrice 0x178411b200, parts_equal_paid false | ## What the differences mean for an application - Block context: `block.coinbase` is the miner of the DAG block that first included the transaction, so one chain block can carry transactions with different coinbases; code that pays or trusts `block.coinbase` as "the block producer" sees several producers per block. - Randomness: `block.prevrandao` derives from the chain's epoch seed and holds for an epoch, so it is not fresh per block and must not seed a lottery or a commitment; use an application-level randomness source. - Two-dimensional fees: every transaction pays execution gas and proving gas; the node folds the second into the gas it quotes, so a wallet that quotes from the node (eth_estimateGas, eth_gasPrice, eth_feeHistory) is covered and a wallet with Ethereum's constants (21,000 for a transfer) is not; the receipt carries the split under `igneum` (pgasUsed, provingBaseFeePerGas, burnedProvingFee, burnedExecutionBaseFee, minerTip). Source: `tools/reference-apps/compat/run.mjs` (the rows), `tools/reference-apps/compat/results.json` (the evidence), `docs/build/compatibility.md` (this page, rendered by `render.mjs`).