EIP-8037 enforces the per-tx gas-limit cap (16,777,216 from EIP-7825) against BOTH dimensions of the split intrinsic gas: regular and floor. Two cap-overflow fixtures exist:
| Fixture |
regular intrinsic |
floor cost |
scenario |
intrinsic_regular_gas_exceeds_cap |
16,798,232 |
67,129,928 |
BOTH dimensions > cap |
calldata_floor_exceeding_tx_gas_limit_cap |
4,210,056 |
16,777,224 |
floor only > cap |
The third cell is missing: regular intrinsic > cap with floor < cap. A client that applies the cap check only to the floor dimension (forgetting the regular dimension, or applying it only to max(regular, floor) and being saved by the floor in every existing test) passes both current fixtures while incorrectly accepting txs that should be rejected.
The scenario is constructable because regular and floor have non-overlapping contributors:
- Floor = base +
nonzero_bytes * TxDataNonZeroMultiplier * TotalCostFloorPerToken (calldata only).
- Regular = base + calldata + access-list entries + EIP-7702 auth-list regular portion.
To push regular > cap (16.7M) while keeping floor < cap: small calldata + large access list (≈ 6,700 address entries at AccessAccountListEntry) or large auth list (authCount * PerAuthBaseRegular). Concrete example: an EIP-7702 transaction with ~1,300 authorizations and ~100 bytes of calldata would land regular ≫ cap, floor well under cap.
Suggested fixture: tests/amsterdam/eip8037_state_creation_gas_cost_increase/test_state_gas_pricing.py::test_intrinsic_regular_gas_exceeds_cap_floor_below_cap (or similar). Same shape as the existing two; same expected exception type.
Reference implementation: Nethermind PR NethermindEth/nethermind#11635 implements the per-dimension cap check (IntrinsicGas<TGasPolicy>.ExceedsCap) and would be exercised by this fixture today. A client lacking the regular-dimension check would pass current EIP-8037 fixtures but fail the proposed one.
EIP-8037 enforces the per-tx gas-limit cap (16,777,216 from EIP-7825) against BOTH dimensions of the split intrinsic gas: regular and floor. Two cap-overflow fixtures exist:
intrinsic_regular_gas_exceeds_capcalldata_floor_exceeding_tx_gas_limit_capThe third cell is missing: regular intrinsic > cap with floor < cap. A client that applies the cap check only to the floor dimension (forgetting the regular dimension, or applying it only to
max(regular, floor)and being saved by the floor in every existing test) passes both current fixtures while incorrectly accepting txs that should be rejected.The scenario is constructable because regular and floor have non-overlapping contributors:
nonzero_bytes * TxDataNonZeroMultiplier * TotalCostFloorPerToken(calldata only).To push regular > cap (16.7M) while keeping floor < cap: small calldata + large access list (≈ 6,700 address entries at
AccessAccountListEntry) or large auth list (authCount * PerAuthBaseRegular). Concrete example: an EIP-7702 transaction with ~1,300 authorizations and ~100 bytes of calldata would land regular ≫ cap, floor well under cap.Suggested fixture:
tests/amsterdam/eip8037_state_creation_gas_cost_increase/test_state_gas_pricing.py::test_intrinsic_regular_gas_exceeds_cap_floor_below_cap(or similar). Same shape as the existing two; same expected exception type.Reference implementation: Nethermind PR NethermindEth/nethermind#11635 implements the per-dimension cap check (
IntrinsicGas<TGasPolicy>.ExceedsCap) and would be exercised by this fixture today. A client lacking the regular-dimension check would pass current EIP-8037 fixtures but fail the proposed one.