# Reth Amsterdam EIP conformance review

## Result

No spec-conformance candidate found for Reth in the requested EIP-7843, EIP-7954, and EIP-8024 paths. This review is limited to these three execution-layer EIPs and public source pages; it does not claim coverage of the other Glamsterdam EIPs, other clients, or devnet outcomes.

## Pins and EIP status

- Reth `main` snapshot: `e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c` (shallow clone HEAD; [commit](https://github.com/paradigmxyz/reth/commit/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c)). Its [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) pin evm2 to `4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0`; relevant code citations below use this dependency commit ([evm2 commit](https://github.com/DaniPopes/evm2/commit/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0)).
- Execution-specs: `7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b`, `forks/bogota` snapshot ([commit](https://github.com/ethereum/execution-specs/commit/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b)).
- Geth comparison: `8817f99f92852f8ac53e596de6202dd9e3494065` ([commit](https://github.com/ethereum/go-ethereum/commit/8817f99f92852f8ac53e596de6202dd9e3494065)).
- Current EIP pages identify EIP-7843 as **Review**, and EIP-7954 and EIP-8024 as **Last Call**. EIP-7954 lists a Last Call deadline of 2026-11-01; EIP-8024 likewise. Sources: [EIP-7843](https://eips.ethereum.org/EIPS/eip-7843), [EIP-7954](https://eips.ethereum.org/EIPS/eip-7954), [EIP-8024](https://eips.ethereum.org/EIPS/eip-8024). These are page statuses, not a claim that the proposals are finalized.

The EIP text/spec reference for the checks was the respective EIP page above and the Amsterdam directory at the pinned execution-specs commit, especially [SLOTNUM](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/instructions/block.py#L264-L291), [stack decoding](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/stack.py#L25-L84), [stack instructions](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/instructions/stack.py#L213-L310), [size constants and deposit](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/interpreter.py#L78-L82) and [deposit check](https://github.com/ethereum/execution-specs/blob/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/interpreter.py#L360-L379), plus `vm/instructions/system.py`, `vm/runtime.py`, `blocks.py`, and `transactions.py` in that directory.

## Rules checked

| EIP / rule | Reth result and source | Comparison / disposition |
|---|---|---|
| 7843 opcode value, activation and gas | Opcode table assigns `0x4B` with zero inputs/one output [opcode.rs#L445-L452](https://github.com/DaniPopes/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/interpreter/opcode.rs#L445-L452); Amsterdam instruction/gas configuration lists `SLOTNUM` in the Amsterdam revision [version/mod.rs#L753-L765](https://github.com/DaniPopes/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/version/mod.rs#L753-L765); gas table uses `BASE` (2). | Spec charges base gas (2) and pushes slot number; Geth configures `GasQuickStep` and pushes the context’s `uint64` slot [eips.go#L572-L587](https://github.com/ethereum/go-ethereum/blob/8817f99f92852f8ac53e596de6202dd9e3494065/core/vm/eips.go#L572-L587). **Correct.** |
| SLOTNUM value and fork transition | Reth copies the host block environment’s `slot_num` to the EVM word [block.rs#L84-L87](https://github.com/DaniPopes/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/interpreter/instructions/block.rs#L84-L87); Reth builds it from the header’s `slot_number` [convert.rs#L72-L85](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/evm/src/convert.rs#L72-L85). Consensus requires the field post-Amsterdam and rejects it pre-Amsterdam [consensus/src/lib.rs#L250-L264](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/consensus/src/lib.rs#L250-L264). | Spec header field is `U64`, appended after BAL hash, and the opcode promotes it to a word; Geth’s context is `uint64`. No mismatch found, including first Amsterdam block: fork activation decides whether the header field is required. **Correct.** |
| 7954 sizes, fork switch and strict boundary | Amsterdam limits are `0x10000` and twice that; earlier limits remain `0x6000` and twice that [constants.rs#L5-L22](https://github.com/DaniPopes/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/constants.rs#L5-L22). Version selection switches at `SpecId::AMSTERDAM` [version/mod.rs#L101-L107](https://github.com/DaniPopes/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/version/mod.rs#L101-L107). | Matches EIP limits. Geth defines the same constants [protocol_params.go#L161-L164](https://github.com/ethereum/go-ethereum/blob/8817f99f92852f8ac53e596de6202dd9e3494065/params/protocol_params.go#L161-L164). **Correct.** |
| 7954 CREATE/CREATE2 initcode and word gas | Before memory work, CREATE/CREATE2 rejects only `len > max_initcode_size`, then charges existing `initcode_cost(len)` [system.rs#L295-L309](https://github.com/DaniPopes/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/interpreter/instructions/system.rs#L295-L309). | Exact-limit input is accepted by the limit test; one byte over is rejected. The EIP changes only the limit; initcode metering remains. Geth checks equivalent limits in its CREATE gas paths [gas_table.go#L330-L365](https://github.com/ethereum/go-ethereum/blob/8817f99f92852f8ac53e596de6202dd9e3494065/core/vm/gas_table.go#L330-L365). **Correct.** |
| 7954 initcode in creation transactions | Reth transaction-pool validation reads fork-tracked max initcode size and calls `ensure_max_init_code_size` [validate/eth.rs#L525-L534](https://github.com/paradigmxyz/reth/blob/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/transaction-pool/src/validate/eth.rs#L525-L534); execution spec checks creation transaction data against `MAX_INIT_CODE_SIZE` in `transactions.py#L632-L640`. | Same cap path is active at fork version. **Correct.** |
| 7954 returned runtime code, including CREATE/CREATE2 | `validate_create_output` rejects only `output.len() > version.max_code_size` [evm/mod.rs#L1477-L1484](https://github.com/DaniPopes/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/evm/mod.rs#L1477-L1484). | Strict greater-than matches the spec; applies to creation output irrespective of CREATE flavor. Geth calls `CheckMaxCodeSize` on deployed return code [evm.go#L666-L700](https://github.com/ethereum/go-ethereum/blob/8817f99f92852f8ac53e596de6202dd9e3494065/core/vm/evm.go#L666-L700). **Correct.** |
| 7954 EIP-7702 delegation | Creation output validation limits code being installed; normal call execution resolves a delegation target [system.rs#L97-L115](https://github.com/DaniPopes/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/interpreter/instructions/system.rs#L97-L115). The size change does not add a restriction to code reached through delegation. | This is consistent with EIP-7954 changing creation limits only. Reviewed, no divergent limit found. |
| 8024 opcodes, immediate decode and gas | Table assigns `E6/E7/E8`, one immediate byte, and proper stack I/O [opcode.rs#L612-L614](https://github.com/DaniPopes/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/interpreter/opcode.rs#L612-L614); version gas table gives each `VERYLOW` (3) [version/mod.rs#L756-L766](https://github.com/DaniPopes/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/version/mod.rs#L756-L766). Implementations, decoders, and stack operations [stack.rs#L26-L58](https://github.com/DaniPopes/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/interpreter/instructions/stack.rs#L26-L58). | `decode_single` matches `(x+145)%256` with forbidden `[91,127]`; pair decode matches `x^143`, divmod 16 and branch rule, excluding `[82,127]`. Stack helpers produce exceptional underflow/overflow. Geth’s decoders/ops and gas agree [instructions.go#L977-L1095](https://github.com/ethereum/go-ethereum/blob/8817f99f92852f8ac53e596de6202dd9e3494065/core/vm/instructions.go#L977-L1095), [eips.go#L339-L361](https://github.com/ethereum/go-ethereum/blob/8817f99f92852f8ac53e596de6202dd9e3494065/core/vm/eips.go#L339-L361). **Correct.** |
| 8024 missing immediate, PC and jumpdest | The instruction handlers read byte `pc+1`; legacy bytecode is padded for safe reads [bytecode/mod.rs#L239-L250](https://github.com/DaniPopes/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/bytecode/mod.rs#L239-L250). Opcode metadata consumes one byte [opcode.rs#L612-L614](https://github.com/DaniPopes/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/interpreter/opcode.rs#L612-L614). Legacy jumpdest analysis scans according to legacy PUSH rules; it does not mask these immediates [bytecode/mod.rs#L1253-L1267](https://github.com/DaniPopes/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/bytecode/mod.rs#L1253-L1267). | Missing immediate therefore reads zero; PC advancement is by opcode metadata, with the instruction advancing past the immediate. Jumpdest scanning remains unchanged, including `e6 5b`. Geth uses missing-byte zero and increments PC by one in handler plus interpreter step, and keeps existing jumpdest analysis [instructions.go#L1015-L1095](https://github.com/ethereum/go-ethereum/blob/8817f99f92852f8ac53e596de6202dd9e3494065/core/vm/instructions.go#L1015-L1095). **Correct.** |


## Candidate disposition and disproof attempts

No candidate to trigger or rate. The boundary checks reviewed included the exact maximum and one-over behavior; all stack immediate valid/invalid ranges, maximum stack depth/overflow, underflow, and truncated final immediate; plus the `0x5b` jump target case. Reth’s evm2 source contains tests for many of these cases, including truncated DUPN/SWAPN and unchanged jumpdest behavior ([stack tests](https://github.com/DaniPopes/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/interpreter/instructions/stack.rs), [bytecode tests](https://github.com/DaniPopes/evm2/blob/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/jit/codegen/src/bytecode/mod.rs)). Geth’s implementations independently agree on decoding, checks, gas, and missing-byte handling. This is source review only; no node, network, Hive, or execution-spec-tests were run.

Severity/confidence: no finding, so no candidate severity or confidence rating applies. No candidate is known to affect live mainnet code.

## Reth issue/PR known-check

Searched public GitHub issue search API at `https://api.github.com/search/issues?q=repo%3Aparadigmxyz%2Freth+TERM&per_page=100`; API search includes issues and PRs. Search results are exact-term/title/body search matches, not proof that a behavior is absent from all discussion.

- `7843`: 9 matches, all closed: #26680 PR, #26709 issue, #26706 PR, #23745 PR, #21418 PR, #21425 PR, #21945 PR, and irrelevant #7843/#846 PRs. #26680 concerns genesis `slotNumber`; no identified conformance candidate here.
- `slotnum`: 5 matches, all closed PRs: #26680, #23626, #23605, #23606, #21945.
- `7954`: 4 matches, all unrelated (closed issue #7954; open PR #27580; closed issue #23029; closed PR #8937). No EIP-7954-specific result found.
- `contract size`: 79 results, API returned first page; sampled results contained no EIP-7954 or Amsterdam max-code finding. Search is broad and not exhaustive due pagination/ranking.
- `8024`: 1 unrelated closed PR #8024.
- `SWAPN`, `DUPN`, `EXCHANGE`: these API requests returned HTTP-200 JSON rate-limit errors (`API rate limit exceeded`) after the unauthenticated search quota was exhausted. Those three searches could not be completed; no claim of “not found” is made for them.

The closed slot-number PRs are implementation history, not open reported bugs. No candidate emerged that could be matched to a known issue. No public Hive or execution-spec-tests Glamsterdam result pages were used for this item.

## Sources read

- https://eips.ethereum.org/EIPS/eip-7843
- https://eips.ethereum.org/EIPS/eip-7954
- https://eips.ethereum.org/EIPS/eip-8024
- https://github.com/ethereum/execution-specs/tree/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam
- https://github.com/paradigmxyz/reth/tree/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c
- https://github.com/DaniPopes/evm2/tree/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0
- https://github.com/ethereum/go-ethereum/tree/8817f99f92852f8ac53e596de6202dd9e3494065
- https://api.github.com/repos/paradigmxyz/reth/commits/main (not needed: requested shallow clone HEAD supplied pin)
- https://api.github.com/search/issues?q=repo%3Aparadigmxyz%2Freth+7843&per_page=100 (same endpoint pattern for other terms listed above)

**Unread source limitation:** the three GitHub issue searches for `SWAPN`, `DUPN`, and `EXCHANGE` could not return results due to the public API rate limit. No other named source needed for this bounded EVM review was unread.
