Evaluated on: · Spec revision: 2026-10-07 · 6dac5e7491 · EIP-8081 list: CFI
Scope at the cutoff. EIP-8151 changes the ecRecover precompile at address 0x01. After a successful ECDSA recovery, the precompile charges the EIP-2929 warm/cold account-access cost for the recovered address (+100 or +2600 on top of 3000) and adds that address to accessed_addresses. It then reads the address's raw code without following delegation. It returns the address only if that code is empty or exactly a 23-byte 0xef0100||address EIP-7702 delegation indicator; otherwise it returns 32 zero bytes. A failed recovery keeps the 3000 gas cost and does no state access. The goal is to stop an old ECDSA key from authorizing contract actions after the account moves to non-delegation code, in line with the EIP-3607/EIP-7702 transaction-origination rule.
- Evaluator
- LLMChecklist v3
- Confidence
- Medium
- Under-specified at assessment cutoff
- Yes — 5 criteria affected
- Plausible range
- 17–24 (Medium–High)
- Snapshot
- 2026-10-07 · EIP revision
6dac5e7491(2026-10-07)
Score bands · Checklist revision 3
- Low <12
- Medium 12–22
- High ≥23
28 criteria scored 0–3 (4 in exceptional cases; cross-EIP interactions is uncapped); nominal maximum 84.
Complexity profile
Each segment is one criterion's contribution to the LLM total. Hover or focus a segment for its score and rationale.
Top complexity drivers
- Modified precompiles3
- State-access ordering within opcode execution2
- Patterns affecting pre-existing tests2
- Security risks2
Under-specified at assessment cutoff: Yes
The EIP text available at the assessment cutoff left material behavior unresolved. The affected criteria and the plausible total range record that uncertainty.
Why: The spec says failure and rejection 'return 32 zero bytes', calling this the existing behavior. This conflicts with the baseline, where ecRecover failure gives empty output, and makes return-data size ambiguous. The spec also does not say whether the address stays warm when the extra access charge runs out of gas, or whether the recovered address is recorded in the block-level access list.
Plausible total
17–24
recorded score 18 · plausible tiers Medium, High
Unresolved questions at the cutoff (4)
- Does ecRecover return empty output or 32 zero bytes on recovery failure and on the new code-check rejection (RETURNDATASIZE 0 or 32)?
- If the caller supplies enough gas for 3000 but not for the warm/cold surcharge, is the address still added to accessed_addresses, and is the failure an ordinary out-of-gas?
- Is the recovered address recorded in the Amsterdam block-level access list?
- Is protocol-internal recovery (transaction sender, EIP-7702 authority) explicitly unaffected?
Notable ambiguities noted by the assessor (4)
- Claim that existing ecRecover returns 32 zero bytes on failure versus baseline empty output.
- The reference implementation mutates accessed_addresses inside the gas function, before execution and any out-of-gas check.
- Interaction with Amsterdam block-level access lists is not addressed.
- The rationale says ecRecover never signals failure, but the added gas makes out-of-gas failures possible for callers that pass a fixed gas amount.
Criterion breakdown
| Criterion | Score | Why this score | Evidence / uncertainty |
|---|---|---|---|
| Modified precompiles | 3 | ecRecover has a behavior change (state-dependent output). Its gas becomes dynamic after the change, which makes it complex under this criterion. A complex precompile with a behavior change is level 3. |
Confidence: High |
| State-access ordering within opcode executionUnder-specified | 2 | The precompile becomes a new state-accessing operation and needs an ordering rule: recover, then charge, then mark warm, then read code. Relevant combinations are cold/warm, recovery success/failure, out-of-gas in the precompile frame, and caller revert. No opcode class's common ordering changes, so this is level 2. |
Confidence: Medium Uncertainty: The text does not say whether the recovered address is recorded in the Amsterdam block-level access list. Under the rubric's footnote on precompile internals, this could be argued down to 0–1. |
| Patterns affecting pre-existing testsUnder-specified | 2 | Gas expectations change for all ordinary successful-recovery cases in the ecRecover precompile family. Tests in other families that call 0x01 with exact gas, or later touch the recovered address, also need localized gas rework. There is no common rewrite across families, so this is level 2. |
Confidence: Medium Uncertainty: If the 32-zero-byte wording is read literally for failure cases, existing failure-case return-data expectations also change (see UNSP). |
| Security risks | 2 | The precompile's purity and stable gas assumptions, which calling contracts and re-execution systems rely on, change. Adversarial checks are needed: the code-check bypass via the delegation-prefix boundary, the delegation-indicator allowance, and fixed-gas callers turning rejection into out-of-gas. The scope is a bounded precompile/caller interaction, so this is level 2. |
Confidence: Medium |
| Edge/boundary conditionsUnder-specified | 2 | There are two boundary-sensitive mechanisms. (1) The code classification: empty, absent, length 22/23/24, prefix variants, delegation to zero/precompile/self. (2) The gas tiers 3000/3100/5600 with exact-gas out-of-gas boundaries. Their dimensions mostly separate (output depends on code; gas depends on warmth), so there is no elevated matrix. That is level 2. |
Confidence: Medium Uncertainty: Gas available × warmth × recovery success with out-of-gas outcomes could be argued to form an elevated matrix (level 3). |
| Cross-EIP interactionsUnder-specified | 2 | Coordinated cases are needed with EIP-2929 and EIP-7702. For EIP-2929: warmth from the tx sender, the access list or earlier opcodes sets ecRecover's cost, ecRecover's warming lowers later opcode costs, and warmth is rolled back on revert. For EIP-7702: authorization in a type-4 transaction followed by ecRecover, delegation clearing, and the boundaries of the 23-byte indicator. EIP-3607 needs only a consistency check. The scenarios are bounded, so this is level 2 rather than coupled restructuring. |
Confidence: Medium Uncertainty: A type-4 transaction that both warms and delegates the authority, followed by ecRecover, couples two EIPs; this could be read as level 3. Interacting EIPs: EIP-2929, EIP-7702, EIP-3607 |
| Unspecified behavior requiring cross-client consensus | 2 | Under the established baseline, ecRecover failure gives empty output (RETURNDATASIZE 0), but the EIP's normative text says 32 zero bytes. That leaves competing observable outcomes for both the existing failure path and the new rejection path: a return-data size of 0 or 32. It also does not say whether the recovered address is warmed when the extra charge runs out of gas, or whether it enters the block-level access list. These localized competing outcomes need agreement before expected values can be fixed, which is level 2. |
Confidence: Medium Uncertainty: Treating baseline failure output as empty relies on general protocol knowledge rather than a supplied document. The block-level access list rules are not supplied, so that point is partly an evidence gap. |
| EVM Gas rule changesUnder-specified | 1 | The existing EIP-2929 warm/cold rule is applied at a new site: the ecRecover precompile's gas schedule. This changes the expected gas of a baseline operation (every successful ecRecover) without defining a new accounting mechanism. That fits level 1. |
Confidence: Medium Uncertainty: Making precompile gas depend on state and recovery outcome could be treated as a new accounting mechanism that also changes baseline gas results (level 3). |
| New test-framework primitives | 1 | Existing primitives need local extensions: a state- and warmth-aware ecRecover gas calculator, and pre-state accounts with code at key-derived addresses that sign ecRecover inputs. No new shared abstraction is needed, so this is level 1. |
Confidence: Medium Uncertainty: Whether existing helpers already cover this is not evidenced; the score could be 0. |
| Performance risks | 1 | ecRecover becomes a CPU-plus-IO workload. An attacker can recover many distinct cold addresses, but each read is priced like an existing cold account access with 3000 gas on top. Benchmarking the combined precompile path should cover it without changing end-to-end assumptions, so this is level 1. |
Confidence: Medium Uncertainty: Block-level access list growth from recovered addresses is unspecified and could call for integrated benchmarks (level 2). |
Show 18 zero-score criteria
| Criterion | Score | Why this score | Evidence / uncertainty |
|---|---|---|---|
| Added opcodes | 0 | No opcode is added. |
|
| Modified opcodes | 0 | Precompile behavior changing behind an unchanged instruction does not count as an opcode modification. |
|
| Added precompiles | 0 | No new precompile address. |
|
| Added system contracts | 0 | No system contract is added. |
|
| Modified system contracts | 0 | No system contract is modified. |
|
| Blob gas accounting changes | 0 | No blob-gas rule is affected. |
|
| State gas accounting changes | 0 | Only a state read and an access charge are added. Per the rubric, access charges belong under GAS, not state-gas accounting. |
|
| New EVM gas refund | 0 | No refund mechanism is introduced. |
|
| New transaction types | 0 | No new transaction envelope. |
|
| New or modified transaction validity mechanisms | 0 | Transaction validity and intrinsic gas are unchanged. Precompile outputs are excluded from this criterion. |
Uncertainty: The text does not explicitly say that protocol-internal recovery (tx sender, 7702 authority) is unaffected, but the EIP scopes itself to the precompile. |
| New block / header fields | 0 | No header member is added. |
|
| Encoding changes (RLP/SSZ) | 0 | No codec or schema change. |
|
| Block syncing changes | 0 | Only an execution-rule change. |
|
| New fork activation mechanism | 0 | No activation-specific state transition. |
|
| Engine API changes | 0 | No Engine API change. |
|
| Transition-tool interface changes | 0 | No transition-tool field or mechanism change is required. |
|
| New invariant on pre-existing tests | 0 | Changed gas and output values count as rework (PAT), not new assertions. |
|
| Cryptography | 0 | The cryptographic primitive and its validation rules are unchanged. The new gate is a state check after recovery. |
Uncertainty: The change could be read as altering the signature-verification outcome rule (level 1). |
Assessment provenance
- Assessed EIP revision
ethereum/EIPs@6dac5e7491EIPS/eip-8151.md committed 2026-10-07 · information cutoff 2026-10-07T22:23:55Z- Rubric
- Checklist revision 3 ·
ethspecs/pm@fe2f793b03 - Evaluator
- Opus 5.5 (
claude-opus-5-5) at high effort, one tool-less call per EIP · isolationbubblewrap_claude_p_no_tools_v1 - Source record
- Frozen research record
research/tasks/10-opus-v3-reassessment/prospective/outputs/assessments/hegota-2026-10-08/eip-8151.yaml· sha256d087a1a6f468 - Supporting documents supplied with the EIP
supporting/eip-20.md,supporting/eip-2612.md,supporting/eip-2929.md,supporting/eip-3607.md,supporting/eip-7702.md