# Erigon — Amsterdam state-gas conformance review

Review date: 2026-10-27. Public source review only; no client build, bytecode execution, node interaction, RPC calls, or network testing was performed.

**Outcome: no retained candidate with an established reachable trigger.** The inspected Amsterdam paths agree on the principal state-gas rules. This is a bounded source review, not a certification. In particular, whole-transaction negative-state settlement remains a reachability limitation, and the requested Hive results could not be retrieved. See the explicit limits below.

## Pins and specification versions

These are the branch heads returned by the public GitHub commit API at acquisition; all code references below use these fixed revisions, not moving branch links.

| Source | Branch / revision | Commit | Acquisition source |
| --- | --- | --- | --- |
| Erigon | main | `f32a39d1e5f87a9ec3a9ce2858171c74acc3c242` | [commits/main](https://api.github.com/repos/erigontech/erigon/commits/main), committer time 2026-10-27T16:04:32Z |
| Execution specification | forks/bogota, the repository default branch | `7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b` | [commits/forks/bogota](https://api.github.com/repos/ethereum/execution-specs/commits/forks/bogota), committer time 2026-10-27T17:40:55Z; [repository metadata](https://api.github.com/repos/ethereum/execution-specs) confirms the default branch |
| Reth | main | `e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c` | [commits/main](https://api.github.com/repos/paradigmxyz/reth/commits/main), committer time 2026-10-27T12:11:23Z |
| Reth's EVM dependency | exact dependency revision, not its current head | `4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0` | [Cargo.toml#L440-L443](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/Cargo.toml#L440-L443) and [Cargo.toml#L674-L679](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/Cargo.toml#L674-L679) |
| EIP documents, including meta EIP | master | `d4c575521d99ec881a444ab3af604e684b5f0743` | [commits/master](https://api.github.com/repos/ethereum/EIPs/commits/master), committer time 2026-10-27T16:04:29Z |
| Consensus specification | master | `8a80ffa82bd49aac0dd6db17f9e8150aa257fbc2` | [commits/master](https://api.github.com/repos/ethereum/consensus-specs/commits/master), committer time 2026-10-27T16:28:12Z |

Erigon code was fetched from **raw.githubusercontent.com** at its pin. GitHub blob URLs below are line-addressable citation permalinks, not the acquisition method. Reth now delegates execution to **evm2**, not revm: the dependency revision above and [crates/ethereum/evm/src/executor.rs#L22-L24](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/evm/src/executor.rs#L22-L24) establish that distinction.

The exact scheduled set is the 18 entries in [EIPS/eip-7773.md#L23-L42](https://github.com/ethereum/EIPs/blob/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-7773.md#L23-L42). Amsterdam's execution-spec list is [src/ethereum/forks/amsterdam/__init__.py#L7-L20](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/__init__.py#L7-L20). Gloas's explicit EIP-version list is [specs/gloas/beacon-chain.md#L165-L186](https://github.com/ethereum/consensus-specs/blob/8a80ffa82bd49aac0dd6db17f9e8150aa257fbc2/specs/gloas/beacon-chain.md#L165-L186). Networking/informational entries under “Other EIPs” in the meta EIP are not silently added to its scheduled set.

“Published version” below means the exact `EIPS/eip-N.md` at the EIPs pin above, not an invented semantic version. For the three reviewed EIPs, the additional executable reference version is the Amsterdam directory at the execution-spec pin. All scheduled EIPs are Last Call at that EIPs snapshot except 7688 (Review); the frontmatter links in the table make this checkable. Last Call deadline is 2026-11-01 except 8246 (2026-11-04).

| EIP | Subject | Published version / status source | Fork-spec correspondence |
| --- | --- | --- | --- |
| 2780 | Intrinsic transaction gas | [EIPS/eip-2780.md#L1-L12](https://github.com/ethereum/EIPs/blob/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-2780.md#L1-L12) | EL |
| 7688 | Consensus data structures | [EIPS/eip-7688.md#L1-L12](https://github.com/ethereum/EIPs/blob/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-7688.md#L1-L12) | CL f2e6d7fb01194d590e16fcdcae8061d06cf1a7f1 |
| 7708 | ETH transfer logs | [EIPS/eip-7708.md#L1-L12](https://github.com/ethereum/EIPs/blob/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-7708.md#L1-L12) | EL |
| 7732 | Proposer-builder separation | [EIPS/eip-7732.md#L1-L12](https://github.com/ethereum/EIPs/blob/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-7732.md#L1-L12) | CL c36a2e58a4496ed21bef6b1c97505b03fd159f0a |
| 7778 | Block accounting without refunds | [EIPS/eip-7778.md#L1-L12](https://github.com/ethereum/EIPs/blob/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-7778.md#L1-L12) | EL; reviewed |
| 7843 | SLOTNUM | [EIPS/eip-7843.md#L1-L12](https://github.com/ethereum/EIPs/blob/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-7843.md#L1-L12) | EL + CL c3bfd4ba41cf0fcbfe8c404f33ba89f5174971e0 |
| 7928 | Block access lists | [EIPS/eip-7928.md#L1-L12](https://github.com/ethereum/EIPs/blob/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-7928.md#L1-L12) | EL |
| 7954 | Contract size limit | [EIPS/eip-7954.md#L1-L12](https://github.com/ethereum/EIPs/blob/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-7954.md#L1-L12) | EL |
| 7976 | Calldata floor | [EIPS/eip-7976.md#L1-L12](https://github.com/ethereum/EIPs/blob/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-7976.md#L1-L12) | EL |
| 7981 | Access-list costs | [EIPS/eip-7981.md#L1-L12](https://github.com/ethereum/EIPs/blob/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-7981.md#L1-L12) | EL |
| 7997 | Deterministic factory | [EIPS/eip-7997.md#L1-L12](https://github.com/ethereum/EIPs/blob/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-7997.md#L1-L12) | EL |
| 8024 | Stack instructions | [EIPS/eip-8024.md#L1-L12](https://github.com/ethereum/EIPs/blob/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-8024.md#L1-L12) | EL |
| 8037 | State creation gas | [EIPS/eip-8037.md#L1-L12](https://github.com/ethereum/EIPs/blob/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-8037.md#L1-L12) | EL; reviewed |
| 8038 | State-access gas | [EIPS/eip-8038.md#L1-L12](https://github.com/ethereum/EIPs/blob/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-8038.md#L1-L12) | EL; reviewed |
| 8045 | Slashed proposer exclusion | [EIPS/eip-8045.md#L1-L12](https://github.com/ethereum/EIPs/blob/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-8045.md#L1-L12) | CL 414a8404198c5afaa3cfed10a385a9aae1dfaae3 |
| 8061 | Exit/consolidation churn | [EIPS/eip-8061.md#L1-L12](https://github.com/ethereum/EIPs/blob/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-8061.md#L1-L12) | CL 01f15c37c64114c478cb1136e0a6966084e4db14 |
| 8246 | SELFDESTRUCT burn removal | [EIPS/eip-8246.md#L1-L12](https://github.com/ethereum/EIPs/blob/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-8246.md#L1-L12) | EL |
| 8282 | Builder execution requests | [EIPS/eip-8282.md#L1-L12](https://github.com/ethereum/EIPs/blob/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-8282.md#L1-L12) | EL + CL de4c6f02c7bec4686762c55f8ab6abcf97a77d7d |

The CL hashes are the EIP revisions explicitly targeted by Gloas, and may differ from the latest published EIP snapshot. The EL index links published EIPs without separate per-EIP hashes; its actual behavior is pinned by the Python source. Gloas also lists 8070 and 8261; the meta EIP places those outside the scheduled list. This report does not reconcile or expand the batch's scope based on that documentary difference. The CL index is version context only, not a CL client audit.

Canonical text read: [8037](https://eips.ethereum.org/EIPS/eip-8037), [7778](https://eips.ethereum.org/EIPS/eip-7778), [8038](https://eips.ethereum.org/EIPS/eip-8038), [meta 7773](https://eips.ethereum.org/EIPS/eip-7773). Their fixed Markdown snapshots are the EIPs pin above.

### Mainnet applicability

No Amsterdam activation is configured in Erigon's pinned public mainnet specification: [execution/chain/spec/chainspecs/mainnet.json#L1-L52](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/chain/spec/chainspecs/mainnet.json#L1-L52). The activation predicate is [execution/chain/chain_config.go#L401-L404](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/chain/chain_config.go#L401-L404). The meta EIP's mainnet activation row is blank: [EIPS/eip-7773.md#L64-L70](https://github.com/ethereum/EIPs/blob/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-7773.md#L64-L70). Consequently the reviewed Amsterdam-specific branches are treated as future-fork logic. No live-mainnet bug details are reported.

## Candidates

**None retained.** No six-part candidate record or per-candidate novelty assertion is made in the absence of a supported divergent transaction/block. The negative-state settlement observation below is explicitly unresolved, not a reported consensus exploit.

## Rules checked and found consistent in the inspected paths

“Consistent” means source-level agreement for the stated rule and conditions. It does not imply exhaustive testing, parallel-executor correctness, or proof that every caller observes the same invariants.

| Rule / boundary | Pinned specification | Pinned Erigon implementation and assessment |
| --- | --- | --- |
| State byte prices | [src/ethereum/forks/amsterdam/vm/gas.py#L39-L59](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/gas.py#L39-L59) | [execution/protocol/params/protocol.go#L218-L231](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/params/protocol.go#L218-L231): CPSB 1530; account/storage/auth byte counts 120/64/23; derived charges 183600/97920/35190. |
| Total and execution limits | [src/ethereum/forks/amsterdam/vm/gas.py#L153-L154](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/gas.py#L153-L154); [src/ethereum/forks/amsterdam/transactions.py#L640-L641](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/transactions.py#L640-L641); [src/ethereum/forks/amsterdam/transactions.py#L671-L684](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/transactions.py#L671-L684) | [execution/protocol/txn_executor.go#L341-L355](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/txn_executor.go#L341-L355) checks total limit 4294967295 and intrinsic/floor against 16777216. Equality is permitted; greater values rejected in canonical validation. |
| Initial allocation | [src/ethereum/forks/amsterdam/vm/gas.py#L1133-L1137](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/gas.py#L1133-L1137) | [execution/protocol/mdgas/md_gas.go#L158-L170](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/mdgas/md_gas.go#L158-L170) and [execution/protocol/txn_executor.go#L602-L603](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/txn_executor.go#L602-L603): subtract intrinsic execution gas first; put only the excess above the execution cap in state. |
| State charges and insufficient combined budget | [src/ethereum/forks/amsterdam/vm/gas.py#L428-L436](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/gas.py#L428-L436) | [execution/protocol/mdgas/md_gas.go#L91-L111](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/mdgas/md_gas.go#L91-L111): draw reservoir first, spill into execution, and record spill only on successful charge. |
| System-call combined allowance 31566720 | [src/ethereum/forks/amsterdam/fork.py#L107-L108](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/fork.py#L107-L108); [src/ethereum/forks/amsterdam/fork.py#L750-L761](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/fork.py#L750-L761) | [execution/protocol/block_exec.go#L49-L52](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/block_exec.go#L49-L52) and [execution/protocol/block_exec.go#L248-L261](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/block_exec.go#L248-L261): 30000000 execution plus 16×64×1530 = 1566720 state; the extra allowance is not executable gas. |
| State-access constants | [src/ethereum/forks/amsterdam/vm/gas.py#L75-L99](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/gas.py#L75-L99) | [execution/protocol/params/protocol.go#L236-L245](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/params/protocol.go#L236-L245): cold account 3000, cold slot 2100, warm 100, account write 9000, storage write 10000, CALL value 11300, CREATE access 12000, clear refund 11616. |
| SSTORE no-op and clean changes | [src/ethereum/forks/amsterdam/vm/instructions/storage.py#L90-L123](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/instructions/storage.py#L90-L123); [src/ethereum/forks/amsterdam/vm/instructions/storage.py#L141-L157](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/instructions/storage.py#L141-L157) | [execution/vm/operations_acl.go#L41-L58](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/operations_acl.go#L41-L58) and [execution/vm/operations_acl.go#L100-L111](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/operations_acl.go#L100-L111): no-op access only; clean change adds write; only zero-to-nonzero adds state. |
| SSTORE dirty changes and refund reversal | [src/ethereum/forks/amsterdam/vm/instructions/storage.py#L125-L139](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/instructions/storage.py#L125-L139) | [execution/vm/operations_acl.go#L113-L130](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/operations_acl.go#L113-L130): reverse clear refund on re-setting; restore write refund on reset to original. Both nonzero-original and zero-original branches inspected. |
| Zero → nonzero → zero state refill | [src/ethereum/forks/amsterdam/vm/instructions/storage.py#L148-L157](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/instructions/storage.py#L148-L157) | [execution/vm/operations_acl.go#L122-L125](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/operations_acl.go#L122-L125) returns negative state cost; [execution/vm/interpreter.go#L663-L674](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/interpreter.go#L663-L674) applies it inline, independently of the capped refund counter. |
| LIFO refill | [src/ethereum/forks/amsterdam/vm/gas.py#L613-L616](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/gas.py#L613-L616) | [execution/protocol/mdgas/md_gas.go#L117-L128](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/mdgas/md_gas.go#L117-L128); [execution/vm/interpreter.go#L286-L297](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/interpreter.go#L286-L297) repay local spill to execution before adding the remainder to state. |
| CALL account creation is conditional | [src/ethereum/forks/amsterdam/vm/instructions/system.py#L520-L575](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/instructions/system.py#L520-L575) | [execution/vm/gas_table.go#L536-L555](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/gas_table.go#L536-L555) resets the opcode's charge marker, reads emptiness only for value transfer, and charges state only for an empty destination. |
| CALL failure returns account charge | [src/ethereum/forks/amsterdam/vm/instructions/system.py#L444-L454](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/instructions/system.py#L444-L454) | [execution/vm/instructions.go#L1220-L1226](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/instructions.go#L1220-L1226) restores child gas, then refills the parent's new-account charge on failure. |
| CALLCODE has no new-account state cost | [8038 CALL/CALLCODE](https://eips.ethereum.org/EIPS/eip-8038#callcallcode) | [execution/vm/gas_table.go#L600-L602](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/gas_table.go#L600-L602) leaves state cost unchanged; value transfer execution surcharge is retained in [execution/vm/gas_table.go#L604-L635](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/gas_table.go#L604-L635). |
| CREATE preflight and conditional new account | [src/ethereum/forks/amsterdam/vm/instructions/system.py#L88-L121](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/instructions/system.py#L88-L121) | [execution/vm/evm.go#L608-L643](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/evm.go#L608-L643) checks depth, balance, nonce before destination access. [execution/vm/gas_table.go#L414-L443](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/gas_table.go#L414-L443) applies the state charge only after successful preflight and an empty destination. Prefunded nonce-zero/code-empty targets avoid the new-leaf charge. |
| CREATE failure/collision | [src/ethereum/forks/amsterdam/vm/instructions/system.py#L115-L129](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/instructions/system.py#L115-L129); [src/ethereum/forks/amsterdam/vm/instructions/system.py#L173-L185](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/instructions/system.py#L173-L185) | [execution/vm/evm.go#L647-L660](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/evm.go#L647-L660) and [execution/vm/evm.go#L723-L736](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/evm.go#L723-L736) reject code/nonce collision while retaining the reservoir; [execution/vm/instructions.go#L1139-L1145](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/instructions.go#L1139-L1145) refills a charged creation that failed. |
| Top-level create charge | [src/ethereum/forks/amsterdam/vm/interpreter.py#L173-L181](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/interpreter.py#L173-L181) | [execution/protocol/runtime_gas.go#L105-L119](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/runtime_gas.go#L105-L119) charges conditionally before execution, rather than as intrinsic gas. [execution/protocol/txn_executor.go#L647-L649](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/txn_executor.go#L647-L649) dispatches setup; [execution/protocol/runtime_gas.go#L122-L133](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/runtime_gas.go#L122-L133) handles failure refill/burn. |
| Code deposit | [src/ethereum/forks/amsterdam/vm/interpreter.py#L363-L385](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/interpreter.py#L363-L385) | [execution/vm/evm.go#L782-L809](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/evm.go#L782-L809) charges 6 per rounded-up word in execution and 1530 per byte in state. Deposit spill is included in frame usage before any ancestor rollback. |
| SELFDESTRUCT creation charge | [src/ethereum/forks/amsterdam/vm/instructions/system.py#L733-L756](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/instructions/system.py#L733-L756) | [execution/vm/operations_acl.go#L269-L297](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/operations_acl.go#L269-L297) charges cold access independently of balance; only positive balance to a dead beneficiary adds write and new-account state gas. [execution/vm/instructions.go#L1459-L1485](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/instructions.go#L1459-L1485) has no state-gas refill for same-transaction destruction. |
| 63/64 only on executable gas | [src/ethereum/forks/amsterdam/vm/gas.py#L666-L710](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/gas.py#L666-L710) | [execution/vm/instructions.go#L1097-L1112](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/instructions.go#L1097-L1112) forwards the whole state reservoir for CREATE; [execution/vm/operations_acl.go#L366-L405](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/operations_acl.go#L366-L405) computes CALL forwarding after base costs and state spill using execution only. |
| GAS excludes reservoir | [8037 reservoir rules](https://eips.ethereum.org/EIPS/eip-8037#transaction-level-gas-accounting-reservoir-model) | [execution/vm/instructions.go#L943-L945](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/instructions.go#L943-L945) pushes `scope.gas`, not total gas. |
| Child success, spill propagation, repayment | [src/ethereum/forks/amsterdam/vm/__init__.py#L230-L244](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/__init__.py#L230-L244); [src/ethereum/forks/amsterdam/vm/gas.py#L640-L647](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/gas.py#L640-L647) | [execution/vm/interpreter.go#L268-L280](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/interpreter.go#L268-L280) merges child spill and moves matching reservoir back to execution. [execution/vm/instructions.go#L1220-L1225](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/instructions.go#L1220-L1225) and [execution/vm/instructions.go#L1273-L1276](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/instructions.go#L1273-L1276) gate merge on success. |
| Child revert versus exceptional halt | [src/ethereum/forks/amsterdam/vm/interpreter.py#L450-L468](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/interpreter.py#L450-L468) | [execution/vm/evm.go#L191-L218](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/evm.go#L191-L218) returns state to entry and clears spill; REVERT preserves unspent execution, exceptional halt burns it after state restoration. |
| Signed frame accounting | [src/ethereum/forks/amsterdam/vm/gas.py#L584-L591](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/gas.py#L584-L591) | [execution/vm/interpreter.go#L540-L548](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/interpreter.go#L540-L548) preserves signed frame state usage. [execution/vm/evm.go#L221-L229](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/evm.go#L221-L229) derives execution independently. A negative child is not rejected merely for being negative. |
| State clamp at transaction/block boundary | [src/ethereum/forks/amsterdam/vm/gas.py#L1216-L1221](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/gas.py#L1216-L1221) | [execution/protocol/mdgas/md_gas.go#L79-L88](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/mdgas/md_gas.go#L79-L88) clamps state to zero. This agrees on the clamp itself; the unreachable-input concern about the other settlement formulas is discussed separately below. |
| Per-authorization execution base | [src/ethereum/forks/amsterdam/vm/gas.py#L156-L163](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/gas.py#L156-L163); [src/ethereum/forks/amsterdam/transactions.py#L768-L772](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/transactions.py#L768-L772) | [execution/protocol/params/protocol.go#L246-L249](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/params/protocol.go#L246-L249) computes 7816. [execution/protocol/mdgas/intrinsic_gas.go#L264-L274](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/mdgas/intrinsic_gas.go#L264-L274) selects that value for normal transactions; the separate AA cost is not used for normal Ethereum transactions. |
| Authorization state-dependent charges | [src/ethereum/forks/amsterdam/vm/eoa_delegation.py#L295-L319](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/eoa_delegation.py#L295-L319) | [execution/protocol/txn_executor.go#L865-L871](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/txn_executor.go#L865-L871) and [execution/protocol/txn_executor.go#L924-L948](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/txn_executor.go#L924-L948) track first writes and pre-transaction delegation: new account as needed, write once per authority, delegation bytes only for a net-new indicator; a later clear does not refund those bytes. |
| Authorization preservation versus setup failure | [src/ethereum/forks/amsterdam/vm/interpreter.py#L159-L163](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/interpreter.py#L159-L163); [src/ethereum/forks/amsterdam/vm/interpreter.py#L267-L287](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/interpreter.py#L267-L287) | [execution/protocol/txn_executor.go#L635-L675](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/txn_executor.go#L635-L675) rolls back failed preparation and resets accounting to the original budget; after dispatch, auth usage remains separate from reverted frame usage in [execution/protocol/runtime_gas.go#L33-L56](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/runtime_gas.go#L33-L56). |
| EIP-7778 settlement before refund/floor | [src/ethereum/forks/amsterdam/vm/gas.py#L1211-L1227](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/gas.py#L1211-L1227) | [execution/protocol/txn_executor.go#L687-L726](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/txn_executor.go#L687-L726) computes block dimensions before capped refund, then sender/receipt gas and floor. Agreement here assumes nonnegative whole-transaction net state, as discussed below. |
| 2D transaction inclusion | [src/ethereum/forks/amsterdam/vm/gas.py#L1073-L1085](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/gas.py#L1073-L1085) | [execution/protocol/gaspool.go#L175-L194](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/gaspool.go#L175-L194) and [execution/protocol/gaspool.go#L211-L218](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/gaspool.go#L211-L218) check `min(2^24, tx.gas)` against execution and `tx.gas` against state before execution; [execution/protocol/txn_executor.go#L296-L300](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/txn_executor.go#L296-L300) invokes them. |
| Header gas is max of cumulative dimensions | [src/ethereum/forks/amsterdam/fork.py#L335-L340](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/fork.py#L335-L340) | [execution/protocol/state_processor.go#L36-L56](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/state_processor.go#L36-L56) sums execution and state separately, then takes max; [execution/protocol/block_exec.go#L156-L160](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/block_exec.go#L156-L160) validates header equality. It is not a sum of per-transaction maxima. |
| Receipt gas / encoding input | [src/ethereum/forks/amsterdam/fork.py#L655-L660](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/fork.py#L655-L660); [src/ethereum/forks/amsterdam/fork.py#L1068-L1075](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/fork.py#L1068-L1075) | [execution/protocol/state_processor.go#L112-L119](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/state_processor.go#L112-L119) uses cumulative receipt gas; [execution/protocol/state_processor.go#L164-L171](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/state_processor.go#L164-L171) sets receipt cumulative and individual gas from sender-facing usage. No new state-gas receipt field is introduced in this path. Full RLP codecs were not independently audited. |
| First Amsterdam block's base fee | [src/ethereum/forks/amsterdam/fork.py#L455-L460](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/fork.py#L455-L460); [src/ethereum/forks/amsterdam/fork.py#L387-L421](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/fork.py#L387-L421) | [execution/protocol/misc/eip1559.go#L89-L127](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/misc/eip1559.go#L89-L127) uses the parent's existing header gas, with no Amsterdam reset or retroactive conversion. Later parents carry bottleneck gas through the header rule above. |
| One fork gate for the reviewed trio | [src/ethereum/forks/amsterdam/__init__.py#L9-L18](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/__init__.py#L9-L18) | [execution/vm/jump_table.go#L105-L112](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/jump_table.go#L105-L112) enables 8037 then 8038 in Amsterdam; [execution/protocol/txn_executor.go#L688-L692](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/txn_executor.go#L688-L692) enables new block accounting under the same `IsAmsterdam`. Independent per-EIP activation is not used for these canonical paths. |
| EXTCODESIZE / EXTCODECOPY second read | [8038 EXT update](https://eips.ethereum.org/EIPS/eip-8038#ext-family-update) | [execution/vm/eips.go#L377-L383](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/eips.go#L377-L383) uses static 200; [execution/vm/operations_acl.go#L168-L176](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/operations_acl.go#L168-L176) and [execution/vm/operations_acl.go#L186-L193](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/operations_acl.go#L186-L193) add cold-minus-warm 2900. Total is 200 warm / 3100 cold, before copying/memory. |

## Reth comparison at its pinned head

Reth's canonical executor uses the evm2 revision fixed by its manifest. The table distinguishes code in the Reth repository from dependency implementation; attributing these rules to a nonexistent current revm implementation would be misleading.

| Rule | Reth repository / exact dependency source | Comparison |
| --- | --- | --- |
| Inclusion | [crates/ethereum/evm/src/executor.rs#L278-L295](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/evm/src/executor.rs#L278-L295) | Same two budgets and capped execution contribution as Erigon/spec. |
| Header and receipts | [crates/ethereum/evm/src/executor.rs#L328-L340](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/evm/src/executor.rs#L328-L340); [crates/ethereum/evm/src/executor.rs#L958-L972](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/evm/src/executor.rs#L958-L972) | Separate sums, max for header; receipt sum uses post-refund transaction gas. |
| Gas settlement | [crates/evm2/src/ethereum/mod.rs#L788-L806](https://github.com/alloy-rs/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/ethereum/mod.rs#L788-L806); [crates/evm2/src/evm/tx.rs#L112-L139](https://github.com/alloy-rs/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/evm/tx.rs#L112-L139) | Total from limit minus returned execution and reservoir; clamp state; apply floor to execution contribution before block sum. Agrees with the spec formulas. |
| Storage creation/reset | [crates/evm2/src/interpreter/instructions/host.rs#L93-L110](https://github.com/alloy-rs/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/interpreter/instructions/host.rs#L93-L110); [crates/evm2/src/version/gas_params.rs#L314-L398](https://github.com/alloy-rs/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/version/gas_params.rs#L314-L398) | State charge, inline reset refill, and capped execution refund are distinct, as in Erigon/spec. |
| Cross-frame refill | [crates/evm2/src/interpreter/gas.rs#L409-L415](https://github.com/alloy-rs/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/interpreter/gas.rs#L409-L415); [crates/evm2/src/interpreter/gas.rs#L449-L470](https://github.com/alloy-rs/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/interpreter/gas.rs#L449-L470) | Local LIFO refill and propagation of successful child spill are implemented. Erigon's success-only repayment matches the spec's success-only repayment. |
| CALL failure | [crates/evm2/src/interpreter/instructions/system.rs#L248-L254](https://github.com/alloy-rs/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/interpreter/instructions/system.rs#L248-L254) | Refills conditional account creation on unsuccessful call, as in Erigon/spec. |
| CREATE failure | [crates/evm2/src/interpreter/instructions/system.rs#L342-L365](https://github.com/alloy-rs/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/interpreter/instructions/system.rs#L342-L365); [crates/evm2/src/interpreter/instructions/system.rs#L405-L411](https://github.com/alloy-rs/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/interpreter/instructions/system.rs#L405-L411) | Conditional destination charge and refill if deployment fails, as in Erigon/spec. |
| SELFDESTRUCT | [crates/evm2/src/interpreter/instructions/system.rs#L434-L444](https://github.com/alloy-rs/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/interpreter/instructions/system.rs#L434-L444) | New-account state cost accompanies the dead-beneficiary top-up, as in Erigon/spec. |
| System reservoir | [crates/evm2/src/evm/system.rs#L150-L158](https://github.com/alloy-rs/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/evm/system.rs#L150-L158) | Extra 16 new-slot charges go in state, rather than reducing the execution allowance, as in Erigon/spec. |
| Constants / authorization intrinsic | [crates/evm2/src/interpreter/gas.rs#L61-L119](https://github.com/alloy-rs/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/interpreter/gas.rs#L61-L119) | 3000/2100/100, writes 9000/10000, refund 11616, auth base 7816 agree. |

## Attempts to disprove the strongest suspicions

1. **Sibling-frame refill strands executable gas — disproved in this pin.** Consider a parent with empty reservoir: one delegated child allocates a slot using spill, then another clears it and returns a larger reservoir. Erigon merges the first child's spill, then consumes the second child's returned reservoir to repay it in [execution/vm/interpreter.go#L268-L280](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/interpreter.go#L268-L280). The test source specifically covers this arrangement: [execution/vm/runtime/eip8037_cross_frame_refill_test.go#L86-L125](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/runtime/eip8037_cross_frame_refill_test.go#L86-L125). I read those assertions; I did not run them. The specification's matching repayment is [src/ethereum/forks/amsterdam/vm/gas.py#L619-L647](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/gas.py#L619-L647) and its success gate is [src/ethereum/forks/amsterdam/vm/__init__.py#L238-L244](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/__init__.py#L238-L244). This is also an already documented spec/test topic, [execution-specs #3518](https://github.com/ethereum/execution-specs/issues/3518), closed.

2. **Failed CREATE returns its charge into the wrong pool — no divergence retained.** I traced both a spilled account charge and a partially funded reservoir through child REVERT, exceptional halt, collision and code-deposit failure. Child rollback restores its entry reservoir; parent then refills its own conditional account charge. The parent spill counter routes that credit back to executable gas first. Supporting chain: [execution/vm/evm.go#L191-L218](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/evm.go#L191-L218), [execution/vm/instructions.go#L1139-L1145](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/instructions.go#L1139-L1145), [execution/vm/interpreter.go#L286-L297](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/interpreter.go#L286-L297). The corresponding specification parent refill is [src/ethereum/forks/amsterdam/vm/instructions/system.py#L173-L185](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/instructions/system.py#L173-L185). A collision target already has code or nonce, so it is not charged as a new account in the first place. The old CREATE/OOG coverage report [execution-specs #2747](https://github.com/ethereum/execution-specs/issues/2747), closed, used older byte counts and prices; those historical numbers were not substituted for today's specification.

3. **A negative child state total is rejected or clamped prematurely — disproved for frames; whole-transaction negative reachability not established.** A child clearing its parent's allocation can legitimately have negative local state usage. Erigon preserves it in [execution/vm/interpreter.go#L540-L548](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/interpreter.go#L540-L548) and derives the execution component using signed-state modular subtraction in [execution/vm/evm.go#L221-L229](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/evm.go#L221-L229). Its nonnegative clamp is at the transaction/block boundary, not that child boundary. I did not independently inspect the task's Geth/Nethermind rejection claim; no claim about their current behavior is adopted.

   There is a **conditional algebraic difference**, worth recording without promoting it to a candidate: for a hypothetical negative *whole-transaction* state total, Erigon's `combined.Total()` uses clamped state and `combined.Execution` supplies block execution ([execution/protocol/mdgas/md_gas.go#L79-L88](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/mdgas/md_gas.go#L79-L88); [execution/protocol/txn_executor.go#L687-L709](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/txn_executor.go#L687-L709)). The spec instead obtains pre-refund total directly from returned pools, then subtracts clamped state ([src/ethereum/forks/amsterdam/vm/gas.py#L1211-L1221](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/gas.py#L1211-L1221)). Reth's dependency follows that latter form ([crates/evm2/src/ethereum/mod.rs#L792-L806](https://github.com/alloy-rs/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/ethereum/mod.rs#L792-L806); [crates/evm2/src/evm/tx.rs#L129-L131](https://github.com/alloy-rs/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/evm/tx.rs#L129-L131)). Thus one must not claim unconditional equivalence of these formulas over arbitrary signed inputs.

   The disproof attempt was to make the local negative survive to the transaction root. An SSTORE reset has a preceding zero-slot allocation in that same transaction; ancestor charges remain when a successful child refill is incorporated. On failure, the state and corresponding meter restore together. Authorization charges are not credited on a later clear under the current rule, and SELFDESTRUCT does not refund the allocation. The reviewed rules did not yield a valid transaction with a negative aggregate. **No reachable block/transaction trigger was established**, so this remains an invariant/reachability limitation, not a weak low-confidence bug submission.

4. **Refund/floor accidentally shrinks the block budget — disproved for nonnegative aggregate state.** Block state and execution are fixed before the capped refund is added to leftover gas; only sender-facing usage then sees the refund and floor. Taking max after summing both block dimensions also avoids the tempting but incorrect sum of transaction maxima. See [execution/protocol/txn_executor.go#L687-L726](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/txn_executor.go#L687-L726) and [execution/protocol/state_processor.go#L43-L56](https://github.com/erigontech/erigon/blob/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/state_processor.go#L43-L56); Reth makes the same separation at the cited executor lines. First-fork base-fee handling also consumes the parent's already recorded header gas, rather than re-executing a pre-fork parent with new accounting.

5. **Authorization gas remains intrinsic or refunds survive preparation failure — disproved in the inspected path.** For ordinary Ethereum transactions the state-independent cost is 7816 per tuple. State-dependent costs are applied after validity, and setup failure restores the pre-authorization snapshot. Once dispatch occurs, authorization usage is kept outside the reverted execution frame. See the authorization rows above. The older fixture disagreement in [Erigon #21563](https://github.com/erigontech/erigon/issues/21563), closed, concerns historical AUTH_BASE rules and is not evidence of a current bug.

## Known-check and public test evidence

No candidate is labelled “not found” as a claim of novelty: none was retained, and search/results coverage was incomplete.

The intended GitHub search scope was both issues and PRs, with no state restriction (therefore open and closed). API queries actually attempted:

- `repo:erigontech/erigon 8037`
- `repo:erigontech/erigon 8038`
- `repo:erigontech/erigon 7778`
- `repo:erigontech/erigon "state gas"`
- `repo:erigontech/erigon "state-access"`
- `repo:erigontech/erigon "block gas"`
- `repo:ethereum/execution-specs "Test Release Tracker"`

The requests to [GitHub issue search](https://api.github.com/search/issues) returned **HTTP 403, “rate limit exceeded”**. That is a search limitation, not a zero-result response. Direct public issue API lookups still worked and supplied the PR states below. Additional indexed public searches used `site:github.com/erigontech/erigon/issues` and `.../pull` with EIP numbers and the phrases `state creation gas`, `state-access gas`, `Block Gas Accounting`, `refund`, `spill`, and `SSTORE`. Explicit open/closed GitHub search pages were also attempted for 8037 issues and 8038 closed PRs; the web tool could not fetch those query URLs. These fallbacks are not exhaustive open/closed repository search.

| Public record read | State observed | Relevance / disposition |
| --- | --- | --- |
| [Erigon PR #19596](https://github.com/erigontech/erigon/pull/19596) | Closed, merged 2026-03-20 | Original 8037 implementation; known implementation work, not a new candidate. |
| [Erigon issue #20887](https://github.com/erigontech/erigon/issues/20887) | Closed, completed | Prior 8037 spec revision work; no current divergence inferred. |
| [Erigon PR #22060](https://github.com/erigontech/erigon/pull/22060) | Closed, merged 2026-07-10 | 8038 implementation. |
| [Erigon PR #22122](https://github.com/erigontech/erigon/pull/22122) | Closed, merged 2026-07-13 | Devnet-6 8037 updates. |
| [Erigon PR #22136](https://github.com/erigontech/erigon/pull/22136) | Closed, merged 2026-07-14 | Interacting SELFDESTRUCT revision; not treated as an independent state-gas bug. |
| [Erigon issue #21563](https://github.com/erigontech/erigon/issues/21563) | Closed on direct issue page | Historical stale fixture AUTH_BASE discrepancy. An indexed issue-list snippet still said open; the direct page supersedes it. |
| [Execution-specs #3001](https://github.com/ethereum/execution-specs/issues/3001) | Closed | Devnet-6.0.1 tracker: 8038 refund reversal and deposit boundary coverage. |
| [Execution-specs #3518](https://github.com/ethereum/execution-specs/issues/3518) | Closed | Devnet-8.1.4 tracker: parent spill repayment on successful child merge, with linked test work. Strongest suspected issue is known and implemented at the reviewed pin. |
| [Execution-specs #3217](https://github.com/ethereum/execution-specs/issues/3217) | Open on fetched page | Amsterdam testnet-release tracker; context for release scope, not proof a given client passes it. |
| [Execution-specs #2747](https://github.com/ethereum/execution-specs/issues/2747) | Closed | Historical CREATE charge/OOG coverage gap; old constants not applicable to the current pin. |

[Execution-specs releases](https://github.com/ethereum/execution-specs/releases) was also read. Its `tests@v21.0.2` notes describe additional Amsterdam transaction-validation and call-chain coverage, while `v21.0.1` notes include reservoir and authorization preparation boundaries. These are published coverage descriptions, **not observed Erigon pass/fail results**.

**Hive verification unavailable:** [the required Glamsterdam listing](https://hive.ethpandaops.io/glamsterdam/listing.jsonl) returned HTTP 403 on direct public HTTPS retrieval; the web tool also could not access it. No listing entries, suite outcomes, failure identifiers, or claim of a green run are supplied. I did not substitute a different fork's Hive listing.

## Coverage limits

- This item audits Erigon's Amsterdam state-gas paths and the requested interaction with 7778/8038. Other clients beyond the Reth comparison, other EIPs' implementations, and CL conformance are outside this item.
- The complete requested seven Amsterdam files were read at the execution-spec pin: gas, storage, system, interpreter, eoa_delegation, transactions, and fork. Additional frame-merge and fork-index sources are cited above.
- Source tests were read as disproof aids; none was executed. There are no locally measured gas results.
- Database backend semantics, every parallel execution schedule, malformed transaction RLP, and all alternate call sites were not exhaustively audited. The receipt row checks accounting inputs, not every encoding implementation.
- The hypothetical negative aggregate settlement formulas are not equivalent for arbitrary signed input; reachability from a valid Amsterdam transaction was not established. No unsupported confidence or severity rating is assigned to that observation.
- Public novelty search is partial and Hive evidence is unavailable, as recorded above. The report therefore makes no claim that a surviving bug would be previously unknown.

## URLs read

All code citation URLs above identify the exact file and line at its pin. Code content was acquired at the equivalent raw URL. To make the acquisition set explicit, the following are the raw files retained in review memory (failed fetches are excluded). Issue/PR, EIP canonical text, commit API, metadata, tracker and release URLs are linked in the preceding sections. Search queries and the inaccessible Hive URL are recorded separately above.

- https://raw.githubusercontent.com/ethereum/consensus-specs/8a80ffa82bd49aac0dd6db17f9e8150aa257fbc2/README.md
- https://raw.githubusercontent.com/ethereum/consensus-specs/8a80ffa82bd49aac0dd6db17f9e8150aa257fbc2/specs/gloas/beacon-chain.md
- https://raw.githubusercontent.com/erigontech/erigon/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/chain/chain_config.go
- https://raw.githubusercontent.com/erigontech/erigon/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/chain/rules.go
- https://raw.githubusercontent.com/erigontech/erigon/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/chain/spec/chainspecs/mainnet.json
- https://raw.githubusercontent.com/erigontech/erigon/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/chain/spec/config.go
- https://raw.githubusercontent.com/erigontech/erigon/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/block_exec.go
- https://raw.githubusercontent.com/erigontech/erigon/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/gaspool.go
- https://raw.githubusercontent.com/erigontech/erigon/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/mdgas/intrinsic_gas.go
- https://raw.githubusercontent.com/erigontech/erigon/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/mdgas/md_gas.go
- https://raw.githubusercontent.com/erigontech/erigon/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/misc/eip1559.go
- https://raw.githubusercontent.com/erigontech/erigon/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/misc/eip4788.go
- https://raw.githubusercontent.com/erigontech/erigon/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/params/protocol.go
- https://raw.githubusercontent.com/erigontech/erigon/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/runtime_gas.go
- https://raw.githubusercontent.com/erigontech/erigon/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/state_processor.go
- https://raw.githubusercontent.com/erigontech/erigon/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/protocol/txn_executor.go
- https://raw.githubusercontent.com/erigontech/erigon/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/eips.go
- https://raw.githubusercontent.com/erigontech/erigon/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/evm.go
- https://raw.githubusercontent.com/erigontech/erigon/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/gas.go
- https://raw.githubusercontent.com/erigontech/erigon/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/gas_table.go
- https://raw.githubusercontent.com/erigontech/erigon/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/instructions.go
- https://raw.githubusercontent.com/erigontech/erigon/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/interpreter.go
- https://raw.githubusercontent.com/erigontech/erigon/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/jump_table.go
- https://raw.githubusercontent.com/erigontech/erigon/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/operations_acl.go
- https://raw.githubusercontent.com/erigontech/erigon/f32a39d1e5f87a9ec3a9ce2858171c74acc3c242/execution/vm/runtime/eip8037_cross_frame_refill_test.go
- https://raw.githubusercontent.com/ethereum/EIPs/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-7773.md
- https://raw.githubusercontent.com/ethereum/EIPs/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-7778.md
- https://raw.githubusercontent.com/ethereum/EIPs/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-8037.md
- https://raw.githubusercontent.com/ethereum/EIPs/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-8038.md
- https://raw.githubusercontent.com/paradigmxyz/reth/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/Cargo.toml
- https://raw.githubusercontent.com/paradigmxyz/reth/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/consensus/src/validation.rs
- https://raw.githubusercontent.com/paradigmxyz/reth/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/evm/src/execution.rs
- https://raw.githubusercontent.com/paradigmxyz/reth/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/evm/src/executor.rs
- https://raw.githubusercontent.com/paradigmxyz/reth/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/evm/src/lib.rs
- https://raw.githubusercontent.com/ethereum/execution-specs/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/__init__.py
- https://raw.githubusercontent.com/ethereum/execution-specs/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/fork.py
- https://raw.githubusercontent.com/ethereum/execution-specs/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/transactions.py
- https://raw.githubusercontent.com/ethereum/execution-specs/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/__init__.py
- https://raw.githubusercontent.com/ethereum/execution-specs/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/eoa_delegation.py
- https://raw.githubusercontent.com/ethereum/execution-specs/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/gas.py
- https://raw.githubusercontent.com/ethereum/execution-specs/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/instructions/storage.py
- https://raw.githubusercontent.com/ethereum/execution-specs/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/instructions/system.py
- https://raw.githubusercontent.com/ethereum/execution-specs/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/interpreter.py
- https://raw.githubusercontent.com/alloy-rs/evm2/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/ethereum/mod.rs
- https://raw.githubusercontent.com/alloy-rs/evm2/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/evm/handler.rs
- https://raw.githubusercontent.com/alloy-rs/evm2/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/evm/system.rs
- https://raw.githubusercontent.com/alloy-rs/evm2/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/evm/tx.rs
- https://raw.githubusercontent.com/alloy-rs/evm2/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/interpreter/gas.rs
- https://raw.githubusercontent.com/alloy-rs/evm2/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/interpreter/instructions/host.rs
- https://raw.githubusercontent.com/alloy-rs/evm2/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/interpreter/instructions/system.rs
- https://raw.githubusercontent.com/alloy-rs/evm2/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/version/gas_params.rs

