Skip to content

chore: upgrade reth #223

Merged
randygrok merged 2 commits intomainfrom
marko/deps_bump
Apr 23, 2026
Merged

chore: upgrade reth #223
randygrok merged 2 commits intomainfrom
marko/deps_bump

Conversation

@tac0turtle
Copy link
Copy Markdown
Contributor

@tac0turtle tac0turtle commented Apr 23, 2026

Description

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation update
  • Performance improvement
  • Refactoring

Related Issues

Fixes #(issue)

Checklist

  • I have performed a self-review of my code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • New and existing unit tests pass locally with my changes
  • Any dependent changes have been merged and published

Testing

Additional Notes

Summary by CodeRabbit

  • Chores

    • Upgraded Reth → v2.1.0, Revm → v38.0.0, Alloy → v2.0.0 and aligned related crates.
  • New Features

    • Added optional slot number support for post‑Amsterdam payloads and propagated it through payload/build/execution flows.
    • Exposed configuration access in the EVM for feature toggles and limits.
  • Bug Fixes

    • Distinguish fatal errors vs. halting execution in precompile handling.
  • Refactor

    • Granular gas accounting (tx vs. regular vs. state), updated gas validation and finalization logic.
  • Tests

    • Updated tests to reflect new gas and payload attribute behaviors.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 23, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 6f832e2a-0520-480a-a8e8-2680a83c87d4

📥 Commits

Reviewing files that changed from the base of the PR and between b13be37 and 380ed8b.

📒 Files selected for processing (1)
  • crates/node/src/evm_executor.rs
🚧 Files skipped from review as they are similar to previous changes (1)
  • crates/node/src/evm_executor.rs

📝 Walkthrough

Walkthrough

Upgrades workspace dependencies (Reth → v2.1.0, Alloy → v2.0.0, revm bumps) and implements Amsterdam slot_number propagation, separates state vs total gas with per-batch reservoir propagation, refactors handler/executor gas validation and accounting, and changes precompile error handling to distinguish halting vs fatal outputs.

Changes

Cohort / File(s) Summary
Workspace Dependency Pins
Cargo.toml, crates/ev-primitives/Cargo.toml
Bump Reth workspace crates to v2.1.0, Alloy to 2.0.x, revm/revm-inspectors and several alloy-* crates; enable alloy feature for reth-codecs.
Precompile Error Model
crates/ev-precompiles/src/mint.rs
Refactor to return halting PrecompileOutput for ABI decode/auth/balance cases and introduce MintPrecompileError::Halt; tests updated to assert halt reasons and use reservoir test inputs.
Alloy EVM API
crates/ev-revm/src/evm.rs
Expose config environment via new cfg_env(&self) -> &CfgEnv<Self::Spec> impl on AlloyEvm.
Gas Accounting & Handler Logic
crates/ev-revm/src/handler.rs, crates/ev-revm/src/factory.rs
Introduce separate total vs state gas, per-batch reservoir propagation, update validate_batch_initial_tx_gas to return initial total/state gas and apply EIP-7702/EIP-8037 checks; small test adjustment to use tx_gas_used().
Executor & Commit Changes
crates/node/src/evm_executor.rs, crates/node/src/executor.rs
EvBlockExecutor now tracks cumulative_tx, block_regular, and block_state gas; adds max_block_gas_used(); commit_transaction returns GasOutput; thread concrete CL slot_number into BlockEnv and execution contexts; tx gas-limit capping uses cfg_env().
Payload Attributes / Slot Support
crates/evolve/src/types.rs, crates/node/src/attributes.rs, crates/node/src/builder.rs, crates/node/src/payload_service.rs, crates/node/src/payload_types.rs, crates/node/src/validator.rs
Add optional slot_number to Evolve payload attributes and thread it through payload construction, header building, and ExecutionPayload conversions; populate block access list hash and slot_number where applicable.
Tests / Fixtures
crates/tests/src/e2e_tests.rs, crates/tests/src/test_evolve_engine_api.rs
Update tests and helpers to include explicit slot_number: None in payload attributes and adjust gas assertions to new metrics.

Sequence Diagram(s)

sequenceDiagram
  participant Client
  participant Handler
  participant Evm as EVM/Frame
  participant StateDB
  participant Finalizer as finalize_batch_gas

  Client->>Handler: submit batch (txs, attributes, initial gas)
  Handler->>Handler: compute initial_total_gas + initial_state_gas (reservoir)
  Handler->>Evm: execute tx1 (pass reservoir, state gas tracking)
  Evm->>StateDB: apply state changes (accumulate state gas)
  Evm-->>Handler: tx result (tx gas used, state gas used, reservoir delta)
  Handler->>Evm: execute next tx... (loop)
  Handler->>Finalizer: finalize_batch_gas(total_gas, state_gas_spent, reservoir)
  Finalizer->>StateDB: commit or revert state based on outcome
  Finalizer-->>Client: return BlockExecutionResult (gas split, reservoir)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested reviewers

  • randygrok
  • chatton
  • damiannolan

Poem

🐰
Gas splits like carrots in the sun,
Slot numbers hop till Amsterdam's done,
Reservoirs trickle, halts now known,
Dependencies updated, new seeds sown,
A rabbit cheers: the tree of code has grown!

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Description check ⚠️ Warning The PR description is entirely an unfilled template with no meaningful summary, explanation of changes, or context provided by the author. Fill in the PR description with a summary of changes, rationale for the upgrade, confirmation of testing, and any breaking changes or migration notes.
Title check ❓ Inconclusive The title 'chore: upgrade reth' is vague and generic; it does not specify what was upgraded, why, or which version. Provide a more descriptive title, e.g., 'chore: upgrade reth to v2.1.0 and alloy to v2.0.0' to clearly convey the scope of dependency updates.
✅ Passed checks (3 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed Docstring coverage is 84.06% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch marko/deps_bump

Warning

Review ran into problems

🔥 Problems

Git: Failed to clone repository. Please run the @coderabbitai full review command to re-trigger a full review. If the issue persists, set path_filters to include or exclude specific files.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@tac0turtle tac0turtle marked this pull request as ready for review April 23, 2026 09:19
@tac0turtle tac0turtle requested a review from a team as a code owner April 23, 2026 09:20
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
crates/ev-revm/src/handler.rs (1)

358-372: ⚠️ Potential issue | 🟠 Major

Refund reservoir gas in the sponsored reimbursement path.

finalize_batch_gas now stores unused reservoir on Gas, but sponsored transactions still reimburse using only remaining + refunded. Any sponsored EIP-8037 transaction with unused reservoir can overcharge the sponsor unless this path includes gas.reservoir() too.

Proposed fix
-            let reimbursement = U256::from(
-                effective_gas_price
-                    .saturating_mul((gas.remaining() + gas.refunded() as u64) as u128),
-            );
+            let refundable_gas = gas
+                .remaining()
+                .saturating_add(gas.refunded() as u64)
+                .saturating_add(gas.reservoir());
+            let reimbursement =
+                U256::from(effective_gas_price.saturating_mul(refundable_gas as u128));

Also applies to: 595-615

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/ev-revm/src/handler.rs` around lines 358 - 372, In reimburse_caller
(ev-revm::handler::reimburse_caller) update the sponsored reimbursement
calculation to include the unused reservoir: when computing reimbursement use
gas.remaining() + gas.refunded() as u64 + gas.reservoir() (or equivalent
reservoir() amount converted to u64/appropriate type) before multiplying by
effective_gas_price, so the reimbursement equals effective_gas_price *
(remaining + refunded + reservoir); apply the same change in the other sponsored
path referenced (the block around lines 595-615) to avoid overcharging sponsors.
crates/node/src/executor.rs (1)

157-175: ⚠️ Potential issue | 🟠 Major

Use the header slot when constructing BlockEnv for existing blocks.

The new context paths pass slot_number, but evm_env(&Header) still forces slot_num: 0. Re-executing or validating a post-Amsterdam block from its header can therefore run slot-dependent logic with the wrong slot.

Proposed fix
-            slot_num: 0, // EL client — CL slot tracking not applicable
+            slot_num: header.slot_number.unwrap_or_default(),
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/node/src/executor.rs` around lines 157 - 175, The BlockEnv constructed
in evm_env(&Header) sets slot_num: 0 which causes slot-dependent logic to run
incorrectly for existing post-Amsterdam blocks; change the slot_num assignment
to use the header's slot value (e.g., slot_num: header.slot) so BlockEnv
reflects the actual block slot when building from a Header in the evm_env
function.
🧹 Nitpick comments (2)
crates/tests/src/e2e_tests.rs (1)

120-131: Add a positive slot_number Engine API path test.

build_block_with_transactions now hard-codes slot_number: None, so these e2e tests still do not exercise the new non-empty slot propagation path. Consider parameterizing this helper or adding a dedicated test with Some(slot) and asserting the resulting payload/header carries it. Based on learnings, Implement unit tests for individual components and integration tests in crates/tests/ covering Engine API interactions, payload building with transactions, state execution validation, and Evolve-specific scenarios.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/tests/src/e2e_tests.rs` around lines 120 - 131, The helper
build_block_with_transactions currently hard-codes slot_number: None in
EvolveEnginePayloadAttributes, so update the helper signature
(build_block_with_transactions) to accept an optional slot parameter (e.g.,
Option<Slot> or Option<u64>) and pass that into
EvolveEnginePayloadAttributes.slot_number instead of None; then add an E2E test
in crates/tests/src/e2e_tests.rs that calls
build_block_with_transactions(Some(slot_value)), builds the payload/header, and
asserts the resulting payload/header (the EvolveEnginePayloadAttributes and
produced block header) contains the same slot_number value to exercise the
non-empty slot propagation path.
crates/node/src/payload_service.rs (1)

418-425: Add one positive slot_number: Some(...) regression test.

The updated tests only construct slot_number: None, so a future regression dropping non-empty slot propagation would still pass. A small test that builds attributes with slot_number: Some(123) and verifies the built header/payload carries it would cover the new feature directly. Based on learnings, implement unit tests and integration tests covering Engine API interactions and payload building.

Also applies to: 515-522, 602-609

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/node/src/payload_service.rs` around lines 418 - 425, Add a positive
regression test that constructs EvolveEnginePayloadAttributes with
RpcPayloadAttributes.slot_number: Some(123) (instead of None) and asserts that
the resulting header/payload built by the payload builder/serialize path (the
functions that consume EvolveEnginePayloadAttributes and produce the engine
header/payload in payload_service.rs) preserves that slot number; do the same in
the other two test sites referenced (around the other diffs) so you don't only
test None, and add an integration test exercising the Engine API payload build
path to verify propagation end-to-end (construct attributes with Some(123), call
the payload-building function, and assert the produced
header/payload.slot_number == Some(123)).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@crates/node/src/attributes.rs`:
- Around line 84-87: The code currently hardcodes slot_number to Some(0) when
chain_spec.is_amsterdam_active_at_timestamp(timestamp) is true; change this so
you do not emit a constant 0 — instead derive the slot from the parent header if
available or leave slot_number unset (None) when the builder has no
authoritative slot source. Locate the slot_number assignment (using symbols
slot_number, chain_spec, is_amsterdam_active_at_timestamp, timestamp) and
replace the then_some(0) behavior with logic that reads the parent header's slot
(e.g., from self.parent_header or equivalent) and wraps that in Some(),
otherwise return None.

In `@crates/node/src/evm_executor.rs`:
- Around line 167-179: The admission check uses self.block_regular_gas_used for
Amsterdam but must use the true final block gas (max of regular and state);
replace the branch that sets block_gas_used when
self.evm.cfg_env().enable_amsterdam_eip8037 to call and use
self.max_block_gas_used() instead of self.block_regular_gas_used so
block_available_gas = self.evm.block().gas_limit() - block_gas_used correctly
reflects Amsterdam semantics (references:
self.evm.cfg_env().enable_amsterdam_eip8037, self.block_regular_gas_used,
self.max_block_gas_used(), block_available_gas).

In `@crates/node/src/payload_types.rs`:
- Line 3: ExecutionPayloadV4 is being populated with
header.block_access_list_hash (32-byte hash) and EMPTY_BLOCK_ACCESS_LIST_HASH,
but the Engine API requires the encoded access list itself: replace uses of
header.block_access_list_hash and EMPTY_BLOCK_ACCESS_LIST_HASH when setting
ExecutionPayloadV4.block_access_list with the actual encoded access list (an
empty Vec for no entries) instead of hashes; also stop defaulting missing
slot_number to 0—use the header's slot field (or propagate an error/Option)
rather than silently using 0 to avoid masking construction errors in
post-Amsterdam headers (look for ExecutionPayloadV4 construction and variables
named block_access_list, header.block_access_list_hash,
EMPTY_BLOCK_ACCESS_LIST_HASH, and slot_number).

---

Outside diff comments:
In `@crates/ev-revm/src/handler.rs`:
- Around line 358-372: In reimburse_caller (ev-revm::handler::reimburse_caller)
update the sponsored reimbursement calculation to include the unused reservoir:
when computing reimbursement use gas.remaining() + gas.refunded() as u64 +
gas.reservoir() (or equivalent reservoir() amount converted to u64/appropriate
type) before multiplying by effective_gas_price, so the reimbursement equals
effective_gas_price * (remaining + refunded + reservoir); apply the same change
in the other sponsored path referenced (the block around lines 595-615) to avoid
overcharging sponsors.

In `@crates/node/src/executor.rs`:
- Around line 157-175: The BlockEnv constructed in evm_env(&Header) sets
slot_num: 0 which causes slot-dependent logic to run incorrectly for existing
post-Amsterdam blocks; change the slot_num assignment to use the header's slot
value (e.g., slot_num: header.slot) so BlockEnv reflects the actual block slot
when building from a Header in the evm_env function.

---

Nitpick comments:
In `@crates/node/src/payload_service.rs`:
- Around line 418-425: Add a positive regression test that constructs
EvolveEnginePayloadAttributes with RpcPayloadAttributes.slot_number: Some(123)
(instead of None) and asserts that the resulting header/payload built by the
payload builder/serialize path (the functions that consume
EvolveEnginePayloadAttributes and produce the engine header/payload in
payload_service.rs) preserves that slot number; do the same in the other two
test sites referenced (around the other diffs) so you don't only test None, and
add an integration test exercising the Engine API payload build path to verify
propagation end-to-end (construct attributes with Some(123), call the
payload-building function, and assert the produced header/payload.slot_number ==
Some(123)).

In `@crates/tests/src/e2e_tests.rs`:
- Around line 120-131: The helper build_block_with_transactions currently
hard-codes slot_number: None in EvolveEnginePayloadAttributes, so update the
helper signature (build_block_with_transactions) to accept an optional slot
parameter (e.g., Option<Slot> or Option<u64>) and pass that into
EvolveEnginePayloadAttributes.slot_number instead of None; then add an E2E test
in crates/tests/src/e2e_tests.rs that calls
build_block_with_transactions(Some(slot_value)), builds the payload/header, and
asserts the resulting payload/header (the EvolveEnginePayloadAttributes and
produced block header) contains the same slot_number value to exercise the
non-empty slot propagation path.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 8814c093-39af-4c80-8294-11e88acc6324

📥 Commits

Reviewing files that changed from the base of the PR and between d08882e and b13be37.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (16)
  • Cargo.toml
  • crates/ev-precompiles/src/mint.rs
  • crates/ev-primitives/Cargo.toml
  • crates/ev-revm/src/evm.rs
  • crates/ev-revm/src/factory.rs
  • crates/ev-revm/src/handler.rs
  • crates/evolve/src/types.rs
  • crates/node/src/attributes.rs
  • crates/node/src/builder.rs
  • crates/node/src/evm_executor.rs
  • crates/node/src/executor.rs
  • crates/node/src/payload_service.rs
  • crates/node/src/payload_types.rs
  • crates/node/src/validator.rs
  • crates/tests/src/e2e_tests.rs
  • crates/tests/src/test_evolve_engine_api.rs

Comment on lines +84 to +87
slot_number: self
.chain_spec
.is_amsterdam_active_at_timestamp(timestamp)
.then_some(0),
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Avoid hard-coding every Amsterdam local payload to slot 0.

When Amsterdam is active, this builder emits Some(0) for every locally-built payload, which can create repeated/incorrect slot values in block headers and EVM context. Derive it from the parent header or leave it unset unless the builder has a real slot source.

Possible direction
-            slot_number: self
-                .chain_spec
-                .is_amsterdam_active_at_timestamp(timestamp)
-                .then_some(0),
+            slot_number: self
+                .chain_spec
+                .is_amsterdam_active_at_timestamp(timestamp)
+                .then(|| parent.slot_number.unwrap_or_default().saturating_add(1)),
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/node/src/attributes.rs` around lines 84 - 87, The code currently
hardcodes slot_number to Some(0) when
chain_spec.is_amsterdam_active_at_timestamp(timestamp) is true; change this so
you do not emit a constant 0 — instead derive the slot from the parent header if
available or leave slot_number unset (None) when the builder has no
authoritative slot source. Locate the slot_number assignment (using symbols
slot_number, chain_spec, is_amsterdam_active_at_timestamp, timestamp) and
replace the then_some(0) behavior with logic that reads the parent header's slot
(e.g., from self.parent_header or equivalent) and wraps that in Some(),
otherwise return None.

Comment on lines +167 to +179
let block_gas_used = if self.evm.cfg_env().enable_amsterdam_eip8037 {
self.block_regular_gas_used
} else {
self.cumulative_tx_gas_used
};
let block_available_gas = self.evm.block().gas_limit() - block_gas_used;

if tx.tx().gas_limit() > block_available_gas {
let mut max_tx_gas_usage = tx.tx().gas_limit();
if let Some(tx_gas_limit_cap) = self.evm.cfg_env().tx_gas_limit_cap {
max_tx_gas_usage = min(max_tx_gas_usage, tx_gas_limit_cap);
}

if max_tx_gas_usage > block_available_gas {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Use max_block_gas_used() when checking Amsterdam block capacity.

The final block gas for Amsterdam is max(regular, state), but admission only subtracts block_regular_gas_used. A block whose state gas already exceeds the remaining limit can still accept more transactions, then finish with gas_used > gas_limit.

Proposed fix
         let block_gas_used = if self.evm.cfg_env().enable_amsterdam_eip8037 {
-            self.block_regular_gas_used
+            self.max_block_gas_used()
         } else {
             self.cumulative_tx_gas_used
         };
-        let block_available_gas = self.evm.block().gas_limit() - block_gas_used;
+        let block_available_gas = self.evm.block().gas_limit().saturating_sub(block_gas_used);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/node/src/evm_executor.rs` around lines 167 - 179, The admission check
uses self.block_regular_gas_used for Amsterdam but must use the true final block
gas (max of regular and state); replace the branch that sets block_gas_used when
self.evm.cfg_env().enable_amsterdam_eip8037 to call and use
self.max_block_gas_used() instead of self.block_regular_gas_used so
block_available_gas = self.evm.block().gas_limit() - block_gas_used correctly
reflects Amsterdam semantics (references:
self.evm.cfg_env().enable_amsterdam_eip8037, self.block_regular_gas_used,
self.max_block_gas_used(), block_available_gas).

use std::sync::Arc;

use alloy_eips::eip7685::Requests;
use alloy_eips::{eip7685::Requests, eip7928::EMPTY_BLOCK_ACCESS_LIST_HASH};
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🌐 Web query:

For alloy-rpc-types-engine ExecutionPayloadV4 / ExecutionPayloadEnvelopeV6, is the block_access_list field expected to contain the encoded block access list or the header's block_access_list_hash? What value is required for an empty block access list?

💡 Result:

For alloy-rpc-types-engine ExecutionPayloadV4 and ExecutionPayloadEnvelopeV6, the block_access_list field is expected to contain the encoded block access list itself, not the header's block_access_list_hash. This is evidenced by the ExecutionPayloadBodyV2 struct added for EIP-7928, which explicitly includes a block_access_list field alongside transactions and withdrawals, indicating the full list is included in payload bodies. ExecutionPayloadEnvelopeV6, as the return type for engine_getPayloadV6, likely wraps ExecutionPayloadV4 and related body data containing this field. The distinction from the header's hash field (present in block headers for Merkle proof verification) confirms the payload carries the encoded list. For an empty block access list, use an empty list/array: [] (empty Vec in Rust), as standard for access lists when none are present.

Citations:


🏁 Script executed:

#!/bin/bash
# Description: Find all local constructions/usages of block_access_list and block_access_list_hash.
# Expected: V6 payload construction should use the field according to Alloy's ExecutionPayloadV4 semantics.
rg -n -C3 'ExecutionPayloadV4|block_access_list|block_access_list_hash'

Repository: evstack/ev-reth

Length of output: 2542


Fix: block_access_list must contain the encoded access list, not the hash.

At lines 229–240, ExecutionPayloadV4's block_access_list field is being populated with header.block_access_list_hash (a 32-byte hash). According to the Engine API contract, this field should contain the encoded block access list itself. For an empty access list, use an empty Vec instead of EMPTY_BLOCK_ACCESS_LIST_HASH.

Additionally, defaulting a missing slot_number to 0 at line 234 can mask construction errors in post-Amsterdam headers.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/node/src/payload_types.rs` at line 3, ExecutionPayloadV4 is being
populated with header.block_access_list_hash (32-byte hash) and
EMPTY_BLOCK_ACCESS_LIST_HASH, but the Engine API requires the encoded access
list itself: replace uses of header.block_access_list_hash and
EMPTY_BLOCK_ACCESS_LIST_HASH when setting ExecutionPayloadV4.block_access_list
with the actual encoded access list (an empty Vec for no entries) instead of
hashes; also stop defaulting missing slot_number to 0—use the header's slot
field (or propagate an error/Option) rather than silently using 0 to avoid
masking construction errors in post-Amsterdam headers (look for
ExecutionPayloadV4 construction and variables named block_access_list,
header.block_access_list_hash, EMPTY_BLOCK_ACCESS_LIST_HASH, and slot_number).

Comment thread crates/node/src/evm_executor.rs Outdated
Co-authored-by: Randy Grok <98407738+randygrok@users.noreply.github.com>
@randygrok randygrok merged commit 019a292 into main Apr 23, 2026
19 checks passed
@randygrok randygrok deleted the marko/deps_bump branch April 23, 2026 14:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants