# Reth vs EIP-8037 / EIP-7778 / EIP-8038 (Amsterdam): spec-conformance review

Item `reth`, batch `el-stategas`. This review reads public code only. Nothing was run against any network or node. Amsterdam/Glamsterdam is not live on mainnet, so the live-code withholding rule does not apply to anything below.

## 0. Method limits (read first)

- **Shell unavailable.** Every shell command on the review machine failed with `apply-seccomp: write /proc/self/setgroups ... Permission denied`, so no local shallow clone could be made.
- **How code was read.** All code was read file by file from `raw.githubusercontent.com` and `api.github.com` at the pinned commits, through a fetch tool that summarises and quotes page content.
- **Line numbers are approximate.** The fetch tool would not reproduce whole files with line numbers. It reported functions and short exact code tokens, and its own line counts were explicitly flagged as estimates.
- **Citation format.** Files are cited as `path` + function name, plus `#L≈n` where an estimate was available. Before relying on a line number, re-check it against the pinned raw file.
- **Code tokens.** Tokens in backticks are as returned by the fetch tool.
- **Where reth's gas rules actually live.** At the pin, reth does not use revm. Its workspace `Cargo.toml` patches `evm2` to `https://github.com/DaniPopes/evm2` at rev `4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0`, alongside `evm2-inspectors` and `evm2-jit`. Reth's own code contains the block executor, the 2-D admission check, the header `gas_used` choice, receipts and system-call orchestration. Interpreter-level state-gas rules (SSTORE, CALL, CREATE, SELFDESTRUCT, reservoir, settlement) live in evm2. Those evm2 files were read at the exact rev reth pins, since they decide reth's results.

## 1. Pins

| Repo | Ref | Commit | Commit date (UTC) / subject |
|---|---|---|---|
| paradigmxyz/reth | main | `e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c` | 2026-10-27T12:11:23Z "ci(docker): give each target its own cargo cache to stop nightly races (#28166)" |
| ethereum/execution-specs | forks/bogota | `7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b` | 2026-10-27T17:40:55Z "chore(spec-specs,tests): revert #3920 (heze-devnet-3 on bogota) (#3921)" |
| ethereum/go-ethereum | master | `8817f99f92852f8ac53e596de6202dd9e3494065` | 2026-10-27T03:32:47Z "eth/protocols/eth: fix minimal gas after amsterdam (#36020)" |
| DaniPopes/evm2 (reth's patched EVM) | rev in reth `Cargo.toml` | `4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0` | taken from reth's `[patch."https://github.com/alloy-rs/evm2"]` |

Pins were obtained from `https://api.github.com/repos/{paradigmxyz/reth/commits/main, ethereum/execution-specs/commits/forks/bogota, ethereum/go-ethereum/commits/master}`.

EIP-8037 is in status "Last Call" (deadline 2026-11-01). It requires EIP-161, 684, 2780, 6780, 7623, 7702, 7825, 7928, 7976 and 8038 (https://eips.ethereum.org/EIPS/eip-8037).

## 2. Candidates

### Candidate R-1: reth (evm2) does not enforce `TX_MAX_TOTAL_GAS_LIMIT = 2^32-1` on block transactions

**(1) Spec**

- EIP-8037 (https://eips.ethereum.org/EIPS/eip-8037) lists, among transaction validity conditions: "The transaction's gas limit is not higher than `TX_MAX_TOTAL_GAS_LIMIT`." It also says "`tx.gas` is therefore capped at `TX_MAX_TOTAL_GAS_LIMIT`", "which keeps every transaction's gas limit within an unsigned 32-bit integer". The parameter table gives `TX_MAX_TOTAL_GAS_LIMIT` = 4,294,967,295.
- In execution-specs at `7f2f4c9b`, `src/ethereum/forks/amsterdam/transactions.py`, function `validate_transaction`:
  ```python
  if tx.gas > GasCosts.TX_MAX_TOTAL_GAS_LIMIT:
      raise TransactionGasLimitExceededError("Gas limit too high")
  ```
- `src/ethereum/forks/amsterdam/vm/gas.py`, `class GasCosts` (≈L62): `TX_MAX_TOTAL_GAS_LIMIT = Uint(4_294_967_295)`.
- `fork.py` calls `validate_transaction(tx, sender)` from `check_transaction`. A violating transaction makes the block invalid.
- URLs: https://raw.githubusercontent.com/ethereum/execution-specs/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/transactions.py and `.../vm/gas.py`.

**(2) Reth at `e0378eb6`, and evm2 at `4a53ec08` as pinned by reth**

- `crates/ethereum/evm/src/executor.rs`, `validate_transaction_gas_limit` (≈L270-300), is the only per-transaction gas admission in the block executor.
  - It computes `let regular_limit = transaction_gas_limit.min(self.evm.version().tx_gas_limit_cap);`.
  - When EIP-8037 is on, it checks `regular_limit > regular_available` and `transaction_gas_limit > state_available`. Both available amounts are derived from `block_gas_limit`.
  - It has no comparison against 2^32-1.
- `crates/consensus/common/src/validation.rs` has no per-transaction gas cap at all. Its only cap is on the block gas limit, `header.gas_limit() > MAXIMUM_GAS_LIMIT_BLOCK` in `validate_header_gas`.
- evm2 `crates/evm2/src/version/mod.rs`, `tx_gas_caps` (≈L87-93):
  ```rust
  pub const fn tx_gas_caps(&self) -> (u64, u64) {
      if self.feature(EvmFeatures::EIP8037) {
          (u64::MAX, self.tx_gas_limit_cap)
      } else {
          (self.tx_gas_limit_cap, u64::MAX)
      }
  }
  ```
- evm2 `crates/evm2/src/ethereum/mod.rs`, `validate_tx_gas_limit`, does `let (cap, _) = version.tx_gas_caps();` then `if tx_gas_limit > cap` → `TxGasLimitGreaterThanCap`.
  - Under EIP-8037 the cap is `u64::MAX`, so the total limit is unbounded.
  - The second element (2^24) bounds only intrinsic/floor gas, in `validate_execution_gas_limit_cap`.
  - No `4294967295`, `u32::MAX` or total-gas constant was found in `ethereum/mod.rs`.
  - In `version/mod.rs`, the only `(1 << 32) - 1` constant is `DEFAULT_MEMORY_LIMIT`, a memory limit and not a gas cap.

**(3) When the results differ**

- The block must have a gas limit above 4,294,967,295 and contain a transaction whose gas limit is above 4,294,967,295.
- The transaction must also be at most the block gas limit minus the state gas already used, and its sender must be able to pay gas limit × price.
- **Spec:** the transaction is invalid, so the block is invalid.
- **Reth:** the transaction passes admission (both 2-D checks are against the block gas limit), executes, and the block can be accepted.
- **Reachability on mainnet:** this needs a block gas limit about 70× today's. The 1/1024 per-block bound makes that a long, coordinated ramp, but reth's `MAXIMUM_GAS_LIMIT_BLOCK` does not stop it.
- **Reachability elsewhere:** custom chains, devnets and test genesis files with a block gas limit ≥ 2^32 reach it immediately.

**(4) Geth at `8817f99f`**

- `core/state_transition.go`, function `preCheck`: `if rules.IsAmsterdam && msg.GasLimit > params.MaxTxTotalGas` returns `ErrGasLimitTooHigh`. This is skipped only when `msg.skipGasLimitCapCheck` is set, which is a non-consensus path.
- Geth therefore agrees with the spec. The value of `params.MaxTxTotalGas` was not read; the name matches the spec constant.
- Line number not obtained.

**(5) Confidence: medium**

Disproofs tried:
- (a) Searched `validation.rs` and the reth executor for any per-tx total cap: none found.
- (b) Read evm2 `tx_gas_caps`: under EIP-8037 it returns `u64::MAX` as the limit cap.
- (c) Looked for reth work that adds the cap:
  - PR #27589 "fix(txpool): enforce EIP-8037 total gas cap" was closed unmerged on 2026-09-30. Its body says that under EIP-8037 the pool stored a cap of 0, which disabled the stateless `tx.gas` check, while "the EIP still bounds `tx.gas` by `TX_MAX_TOTAL_GAS_LIMIT` (2^32 - 1)". It notes "the EVM-side change is tracked in revm PR #3957" and that on mainnet the block gas limit hides the gap.
  - PR #27616, which applied the total gas cap to inclusion-list checks, is a draft that was closed unmerged.
  - PR #27641 "fix(evm): enforce configurable EIP-8037 gas limits" was closed unmerged on 2026-10-23.
  - Reth has since moved from revm to evm2, so a revm fix would not reach it.
- Not excluded: a check in an evm2 file the fetch tool did not show, or in reth's engine/payload validation path (`crates/engine/tree`), which was not read.
- EEST has "Cap total transaction gas at `2^32 - 1`, with validation and transition tests. #3582" (ticked in https://github.com/ethereum/execution-specs/issues/3217). If those tests use a block gas limit ≥ 2^32, reth would fail them. The per-test hive result could not be opened: the result JSON exceeds the fetch size limit. So this is neither confirmed nor ruled out by hive.

**(6) Severity: invalid block accepted** (consensus split against Geth and the spec). It needs a block gas limit ≥ 2^32: practical on devnets, test chains and custom chains, remote on mainnet.

### No further candidates

Every other rule I could check matched the spec (section 3). I did not report weak suspicions as candidates. They are listed under "not verified" in section 4.

## 3. Rules checked and found consistent with the spec

Spec references are to execution-specs `7f2f4c9b`, `src/ethereum/forks/amsterdam/`. Reth means `e0378eb6`; evm2 means `4a53ec08`. Line numbers marked ≈ are tool estimates.

| Rule | Spec | Reth / evm2 location (as read) | Result |
|---|---|---|---|
| CPSB 1530; 64 / 120 / 23 bytes | `vm/gas.py` `StateGasCosts` ≈L39: `COST_PER_STATE_BYTE = 1530`, `STATE_BYTES_PER_STORAGE_SET 64`, `..._NEW_ACCOUNT 120`, `..._AUTH_BASE 23` | evm2 `version/mod.rs`: `const AMSTERDAM_CPSB: u32 = 1530;` (≈L245); AMSTERDAM params `SstoreSetState: 64 * AMSTERDAM_CPSB`, `NewAccountState: 120 * AMSTERDAM_CPSB`, `CreateState: 120 * AMSTERDAM_CPSB`, `CodeDepositState: AMSTERDAM_CPSB`, `TxEip7702PerAuthState: 23 * AMSTERDAM_CPSB` (≈L470-520) | match |
| Refund for clearing a slot, 11,616 | `GasCosts.REFUND_STORAGE_CLEAR = (10000+2100)*4800//5000` | evm2 `version/gas_params.rs` `SstoreClearingSlotRefund`; Amsterdam test asserts `11_616` (≈L610) | match |
| Per-auth execution cost 7,816 | `EXECUTION_PER_AUTH_BASE_COST` (gas.py ≈L157) | evm2 `gas_params.rs` `TxEip7702PerEmptyAccountCost = 7_816` (test ≈L620, "101*16 + 3000 + 3000 + 2*100") | match (value per brief) |
| EIP-7702 per-auth state gas, `AUTH_BASE` + `NEW_ACCOUNT` | EIP-8037: "the full `STATE_BYTES_PER_NEW_ACCOUNT` is charged in addition to `STATE_BYTES_PER_AUTH_BASE`" | evm2 `gas_params.rs` `eip7702_auth_state_gas` = `new_account_state_gas() + TxEip7702PerAuthState` (≈L416) | constants match; refund-for-existing-account path not fully read (section 4) |
| Regular tx cap 2^24 on intrinsic and floor | `transactions.py` `validate_transaction`: `intrinsic.execution > TX_MAX_GAS_LIMIT` and `intrinsic.calldata_floor > TX_MAX_GAS_LIMIT` → invalid | evm2 `ethereum/mod.rs` `validate_execution_gas_limit_cap`: `required_execution_gas = max(intrinsic, floor_gas)` vs cap; `base_tx_gas_limit_cap` = `MAX_TX_GAS_LIMIT_OSAKA` from Osaka on | match (max-of-two is equivalent for rejection) |
| Split of tx gas into gas_left and reservoir | `vm/gas.py` `allocate_evm_gas` ≈L1078: `execution_gas = min(TX_MAX_GAS_LIMIT - intrinsic.execution, tx_gas - intrinsic.execution)`, reservoir = rest | evm2 `ethereum/mod.rs` `initial_gas_and_reservoir`: `min(tx_gas_limit, cap).saturating_sub(intrinsic)`, `reservoir = execution_gas - execution_gas_limit` | match |
| State gas draw order: reservoir, then gas_left, track spill | `gas.py` `charge_state_gas_from_meter` ≈L404 | evm2 `interpreter/gas.rs` `spend_state` ≈L265-282: reservoir first, `spill = cost - self.reservoir`, `state_gas_spilled += spill` | match |
| SSTORE 0→x→0 refill: spill back to gas_left first, then reservoir | `gas.py` `credit_state_gas_refund` ≈L580: `from_gas_left = min(amount, state_gas_spilled)`; rest to `state_gas_left` | evm2 `gas.rs` `refill_reservoir` ≈L325-333: `to_remaining = min(amount, state_gas_spilled)`; rest to reservoir; bypasses the capped refund counter | match |
| 63/64 rule on gas_left only; whole reservoir to child | `gas.py` `max_message_call_gas` ≈L819; `system.py` `generic_create` / `generic_call` drain the reservoir to the child | evm2 `instructions/system.rs`: `call_stipend_reduction(gas.remaining())`, `reservoir: gas.reservoir()` | match |
| Child failure: spill returned, reservoir reset, halt forfeits gas_left | `interpreter.py` `process_call`: Revert → `restore_state_gas`; ExceptionalHalt → `restore_state_gas` + `forfeit_remaining_gas` | evm2 `gas.rs` `settle_gas`: `if !stop.is_success() { rollback_state_gas(); set_refunded(0) }`, `if stop.is_halt() { set_remaining(0) }` | match |
| Child return: reservoir repays parent's spill | `gas.py` `repay_state_gas_spill` ≈L604: `min(state_gas_left, state_gas_spilled)` moved to gas_left | evm2 `gas.rs` absorb ≈L200: `to_remaining = min(reservoir, state_gas_spilled)` | match |
| CALL new-account charge: value > 0 and recipient not alive; charged before 63/64; refunded on child failure | `system.py` `generic_call`: `has_value and not is_account_alive(to)`; `credit_state_gas_refund(NEW_ACCOUNT)` on error | evm2 `system.rs` `load_acc_and_calc_gas`: `create_empty_account && (!EIP161 \|\| transfers_value) && target_is_empty_for_new_account_gas`; `call_inner`: `if new_account_state_gas != 0 && !result.stop.is_success() { gas.refill_reservoir(..) }` | match |
| CREATE new-account charge if target not alive; refunded on child failure | `system.py` `generic_create` | evm2 `system.rs` `create_inner`: gated on `target_is_empty_for_new_account_gas`; `if charged_create_state_gas && create_failed { gas.refill_reservoir(create_state_gas) }` | match on success and failure (collision edge: section 4) |
| Code deposit: CPSB per byte | `interpreter.py` `process_create`: `ulen(contract_code) * COST_PER_STATE_BYTE` | evm2 `CodeDepositState: AMSTERDAM_CPSB` | constant matches; charge site not read |
| SELFDESTRUCT: execution gas first, then new-account state gas if beneficiary not alive and balance nonzero | `system.py` selfdestruct | evm2 `system.rs`: `should_charge_new_account_gas(EIP161, had_value, target_is_empty)`, then `spend_state(new_account_state_gas())` | match |
| Top-level create tx: NEW_ACCOUNT only if the target is empty; returned on failure | `interpreter.py` `create_evm`: `if get_pre_state_account(...) == EMPTY_ACCOUNT: charge ... NEW_ACCOUNT` | evm2 `ethereum/mod.rs` `prepare_initial_frame` (`!target_alive`); `settle_initial_frame_gas` refills on `!result.stop.is_success()` | match |
| Negative net state gas | `gas.py` `settle_transaction_gas` ≈L1134: `settled_state = max(0, state_gas_used)` (clamp) | evm2 `ethereum/mod.rs` `finalize_gas`: `state_gas_spent = (...state_gas_spent().saturating_add_unsigned(initial_state_gas).max(0) as u64).saturating_sub(state_refund)` (clamp) | **reth agrees with the spec.** Geth `core/state_transition.go` `settleGas` instead returns an error, `"negative topmost frame state gas usage"`. This is a Geth/Nethermind vs spec point, outside this item. |
| Settlement order: refund cap 1/5, then floor; block execution gas pre-refund | `settle_transaction_gas`: `refund = min(before//5, counter)`; `gas_used = max(before - refund, floor)`; `execution_gas_used = max(before - settled_state, floor)` | evm2 `finalize_gas`: `total_gas_spent = tx_gas_limit - remaining - reservoir` (pre-refund); `MaxRefundQuotient` inherited as 5 from London; floor applied in `TxResult::tx_gas_used` | consistent; `TxResult::tx_gas_used` / regular-gas body not shown (section 4) |
| 2-D inclusion check | `gas.py` `check_block_gas_capacity` ≈L1012: `min(TX_MAX_GAS_LIMIT, tx_gas) > limit - block_gas_used` and `tx_gas > limit - block_state_gas_used` | reth `crates/ethereum/evm/src/executor.rs` `validate_transaction_gas_limit` ≈L270-300 (quoted in R-1) | match |
| Header gas_used = max(execution, state) | `fork.py` `execute_block`: `block_gas_used = max(block_output.block_gas_used, block_output.block_state_gas_used)` | reth `executor.rs` `final_block_gas_used`: max of `block_regular_gas_used` and `block_state_gas_used` when `separate_block_gas` (test `amsterdam_header_uses_bottleneck_gas_dimension`) | match |
| Receipt cumulative gas = sum of post-refund, post-floor tx gas | EIP-8037: "Receipt `cumulative_gas_used` tracks the cumulative sum of `tx_gas_used` (post-refund, post-floor)"; `fork.py`: `cumulative_gas_used += settlement.gas_used` | reth `executor.rs`: `self.cumulative_gas_used += tx_gas_used`; `build_receipt(... cumulative_gas_used: self.cumulative_gas_used)` | match |
| System call: 30M gas_left plus 16 × 97,920 reservoir (31,566,720 total), excess spills | `fork.py` `process_unchecked_system_transaction`: `SYSTEM_TRANSACTION_GAS = 30000000`, reservoir `STORAGE_SET * SYSTEM_MAX_SSTORES_PER_CALL (16)`; EIP: `30_000_000 + 64 × CPSB × 16` | evm2 `evm/system.rs`: `SYSTEM_CALL_GAS_LIMIT: u64 = 30_000_000` (≈L31), reservoir `SstoreSetState * SYSTEM_MAX_SSTORES_PER_CALL` (=16, ≈L37, ≈L153-158); reth `crates/ethereum/evm/src/execution.rs` `execute_system_call` uses `SystemTx::new(address, data)` (default limit) | match; system-call gas not added to block totals in reth, consistent with the spec |
| Fork flag | Amsterdam-wide | reth gates 2-D accounting on `evm.version().feature(evm2::EvmFeatures::EIP8037)` (executor.rs `new()` and `configure_segment`); the EVM version comes from the spec id | consistent, provided the feature is set exactly from Amsterdam (not separately checked) |
| Base fee, first Amsterdam block | `fork.py` `calculate_base_fee_per_gas`, ordinary EIP-1559 on parent `gas_used` (which post-fork is the max-of-dimensions value); no first-block special case; `ChainContext.parent_header` accepts the pre-fork header | reth `crates/ethereum/consensus/src/lib.rs` `validate_header_against_parent` → `validate_against_parent_eip1559_base_fee` (London rule, header `gas_used`) | match: no special case in either |

## 4. Areas not verified (recorded, not candidates)

- **CREATE collision with an EIP-7610 storage-only account.**
  - Spec `generic_create` charges NEW_ACCOUNT when the target is not alive, then on collision returns without refunding. Its comment: "A collision target has code or a nonce, so the account-creation charge above was never taken".
  - evm2 refills on `created_address == None`.
  - The two could differ only for a target with storage but no code, nonce or balance. The spec's `account_deployable` body could not be read (`state.py` returned 404 at that path), so this stays unverified.
- **evm2 internals not read:** `TxResult::tx_gas_used` and the exact block "regular gas" formula; the EIP-7702 refund for existing or already-delegated authorities (`ethereum/eip7702.rs`); SSTORE charge sites (`evm/state/storage.rs`); EIP-8038 access-cost constants (cold/warm SLOAD, account access).
- **EIP-8038 and EIP-7778 text.** These were not fetched separately. EIP-7778 coverage here is limited to pre-refund block gas accounting as encoded in spec `settle_transaction_gas` ("per the cited EIP-7778") and reth's executor.
- **Reth engine / payload-builder admission** (`crates/engine/tree`, `crates/ethereum/payload`): not read.

## 5. Known-check

| Candidate | Result |
|---|---|
| R-1 (no 2^32-1 total tx gas cap) | **Partly known, not fixed in the consensus path.** paradigmxyz/reth PR #27589 "fix(txpool): enforce EIP-8037 total gas cap" (https://github.com/paradigmxyz/reth/pull/27589) was closed unmerged on 2026-09-30, and its body names the EVM-side gap (revm PR #3957). PR #27616 (https://github.com/paradigmxyz/reth/pull/27616) is a draft that was closed unmerged on 2026-10-01. PR #27641 (https://github.com/paradigmxyz/reth/pull/27641) was closed unmerged on 2026-10-23. No open reth issue was found. The EEST tests for the cap exist (execution-specs #3582, ticked in tracker #3217, open). Hive glamsterdam reth: consume-engine 1626 fails and consume-enginex 3094 fails on 2026-10-26 (already indexed), plus consume-rlp 6 fails / 44161 on 2026-10-26 03:47. Causes are unknown: per-test result files exceed the fetch limit. |

Queries run:
- `api.github.com/search/issues?q=repo:paradigmxyz/reth+8037`, `+7778`, `+8038`, `+"total gas"+cap`.
- `repo:ethereum/execution-specs "Test Release Tracker"`.
- `https://hive.ethpandaops.io/glamsterdam/listing.jsonl`.

Searching DaniPopes/evm2 issues returned HTTP 422 and could not be checked.

Related reth items seen (state-gas area, all closed):
- #23191 "bump revm to v37 (EIP-8037 state gas)" (merged 2026-04-15).
- #23743 "track Amsterdam block gas in builders" (merged).
- #24107 "align BAL gas admission" (merged).
- #26719 "enforce state-gas admission on the BAL execution path" (merged 2026-08-19).
- #27587 "cap intrinsic regular gas under EIP-8037" (merged 2026-09-30).
- #21821 "EIP-7778 gas accounting in receipts and block validation" (merged 2026-02-04).
- #22490 "EIP-7778 gas accounting mismatch in payload builder" (merged 2026-02-23).
- #26629 "glamsterdam-devnet-8: integrate revm gas repricing" (closed unmerged).

## 6. URLs read

- https://api.github.com/repos/paradigmxyz/reth/commits/main
- https://api.github.com/repos/ethereum/execution-specs/commits/forks/bogota
- https://api.github.com/repos/ethereum/go-ethereum/commits/master
- https://raw.githubusercontent.com/paradigmxyz/reth/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/Cargo.toml
- https://raw.githubusercontent.com/paradigmxyz/reth/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/evm/src/executor.rs
- https://raw.githubusercontent.com/paradigmxyz/reth/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/evm/src/execution.rs
- https://raw.githubusercontent.com/paradigmxyz/reth/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/ethereum/consensus/src/lib.rs
- https://raw.githubusercontent.com/paradigmxyz/reth/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c/crates/consensus/common/src/validation.rs
- https://api.github.com/repos/paradigmxyz/reth/git/trees/e0378eb691aa2770bb96fd4ecec2f4445a2a3e7c:crates/ethereum/evm/src
- https://api.github.com/repos/DaniPopes/evm2/git/trees/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0?recursive=1
- https://raw.githubusercontent.com/DaniPopes/evm2/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/interpreter/gas.rs
- https://raw.githubusercontent.com/DaniPopes/evm2/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/interpreter/instructions/system.rs
- https://raw.githubusercontent.com/DaniPopes/evm2/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/evm/handler.rs
- https://raw.githubusercontent.com/DaniPopes/evm2/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/evm/system.rs
- https://raw.githubusercontent.com/DaniPopes/evm2/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/ethereum/mod.rs
- https://raw.githubusercontent.com/DaniPopes/evm2/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/version/mod.rs
- https://raw.githubusercontent.com/DaniPopes/evm2/4a53ec080dfbb904e98e3ca8f0abcc11ab8abae0/crates/evm2/src/version/gas_params.rs
- 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/vm/gas.py
- https://raw.githubusercontent.com/ethereum/execution-specs/7f2f4c9bf6d73b09ecb8b24eb14d08bf0cf0247b/src/ethereum/forks/amsterdam/vm/interpreter.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/transactions.py
- https://raw.githubusercontent.com/ethereum/go-ethereum/8817f99f92852f8ac53e596de6202dd9e3494065/core/state_transition.go
- https://eips.ethereum.org/EIPS/eip-8037
- https://api.github.com/repos/paradigmxyz/reth/pulls/27589 and https://api.github.com/repos/paradigmxyz/reth/pulls/27641
- https://api.github.com/repos/ethereum/execution-specs/issues/3217
- https://hive.ethpandaops.io/glamsterdam/listing.jsonl

Not read: `vm/instructions/storage.py`, `vm/eoa_delegation.py` (spec); EIP-7778 and EIP-8038 pages; Geth line numbers.
