Repository navigation
rust!: update reth to v2.5.2 with Engine handoff backport - #22495
Merged
Merged
Conversation
Contributor
|
This pr has been automatically marked as stale and will be closed in 5 days if no updates |
sebastianst
force-pushed
the
seb/reth-v2.5.0
branch
from
September 14, 2026 12:12
0e84b2d to
2191ce5
Compare
Wiz Scan Summary
To detect these findings earlier in the dev lifecycle, try the Wiz Code extension for VS Code, JetBrains, or Visual Studio. |
sebastianst
changed the base branch from
develop
to
seb/upstream-mirror-tags
September 14, 2026 12:15
sebastianst
added this pull request to stack #22889
September 14, 2026 12:15
sebastianst
force-pushed
the
seb/reth-v2.5.0
branch
from
September 14, 2026 15:37
2191ce5 to
e885013
Compare
joshklop
reviewed
Sep 17, 2026
joshklop
reviewed
Sep 17, 2026
sebastianst
removed this pull request from stack #22889
September 18, 2026 08:51
sebastianst
force-pushed
the
seb/upstream-mirror-tags
branch
from
September 18, 2026 08:57
8808ccf to
2c69a15
Compare
sebastianst
force-pushed
the
seb/reth-v2.5.0
branch
from
September 18, 2026 09:01
5007fd3 to
8809d31
Compare
sebastianst
force-pushed
the
seb/upstream-mirror-tags
branch
from
September 18, 2026 10:51
2c69a15 to
bea4449
Compare
sebastianst
force-pushed
the
seb/reth-v2.5.0
branch
from
September 18, 2026 10:51
8809d31 to
27633bb
Compare
sebastianst
force-pushed
the
seb/reth-v2.5.0
branch
from
September 18, 2026 12:03
27633bb to
32e6935
Compare
sebastianst
force-pushed
the
seb/reth-v2.5.0
branch
from
September 18, 2026 18:12
32e6935 to
9e26d38
Compare
2 of 4 tasks
Move the reth pin from the OP fork `op-rs/reth@aef8d3ef` back to upstream `paradigmxyz/reth`, `tag = "v2.5.0"`. The fork's only cherry-pick (`aef8d3ef92 feat(trie): expose payload state root receiver`) is byte-identical to upstream `92cf59e2be`, which v2.5.0 contains, so the fork carries nothing unique any more. Shared crates.io versions synced to what v2.5.0 pins: revm 41.0.0 -> 42.0.1 (subcrates 42.0.0), revm-inspectors 0.41 -> 0.42, alloy-evm 0.37.0 -> 0.38.0, alloy core 1.6.0 -> 1.6.1, the alloy main family 2.1.1 -> 2.3.0, and the published reth-core crates 0.5.0 -> 0.6.0. All four lockfiles refreshed. Upstream API adaptations: - revm 42 reworks the `Handler` gas pipeline around `GasTracker` and the EIP-2780 runtime gas phase. `OpHandler::last_frame_result` is re-derived against the new default: the frame is settled with upstream's `handle_reservoir_remaining_gas`, and the pre-Regolith deposit rules are applied on top of the settled result. `refund` now returns `Result` and reads the refund quotient from `GasParams`. - op-revm's `ExecuteEvm::replay` copy picked up upstream's new error path, which finalizes the journal so a failed transaction does not leak into the next one. This is the same class as the SDM warm-set leak (#21723). - reth no longer derives `HashedStorage::wiped` from the account status in `from_bundle_state`; `HashedPostStateProvider::hashed_post_state` owns the destroyed-account handling and now returns `ProviderResult`. The Isthmus withdrawals-root path builds its `HashedStorage` directly, so it keeps propagating `wiped` explicitly; `OpProofsStateProviderRef` materializes the zeroed slots against the proofs storage at the parent block. - `ExecutionWitnessRecord` became a borrow of `State<DB>` whose only public exit is `into_execution_witness`, which also fills in ancestor headers. Both op-reth witness paths use it; the payload-builder witness therefore gained a headers provider and now returns headers as `debug_executionWitness` already did. - `ReceiptConverter` gained `RpcLog`/`convert_log` and the log-matching helpers now convert through it, so the flashblock log stream passes the converter and a header carrying the payload's number, hash and timestamp. - Smaller: `reth_trie_db::from_reverts_auto` -> `HashedPostStateSorted::from_reverts`, `ChangesetCache` -> `reth_storage_overlay::OverlayManager`, `BuiltPayloadExecutedBlock::changed_paths` and `BuildNewPayload::{cache,state_root_handle}` removed, `validate_block_post_execution_with_hashed_state` gained a parent header, `calculate_initial_tx_gas` gained an EIP-2780 argument, and `alloy_genesis::ChainConfig` gained `bogota_time`. kona-proof declares `ark-bls12-381`'s `scalar_field` feature explicitly: it used to arrive by feature unification with revm-precompile, which moved to ark-bls12-381 0.6. All 24 `UPSTREAM-MIRROR` tags re-verified against v2.5.0 / revm 42 / alloy-evm 0.38; `just mirrors --check` is clean with none stale. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ver the deposit gas-cap exemption Two follow-ups from the `reth-update-reviewer` pass over the v2.5.0 bump. `MemoryOverlayOpProofsStateProviderRef::hashed_post_state` only forwarded to the inner provider, which zeroes a destroyed account's storage against the *persisted* proofs storage. Slots written by blocks still in the in-memory buffer live in the overlay, so a selfdestructed account stayed partially wiped and the state root came out wrong. reth hit the same gap when it stopped deriving `HashedStorage::wiped` from account status and extended `MemoryOverlayStateProviderRef::hashed_post_state` to zero the unpersisted slots too; this mirrors that. The path feeds `state_root_with_updates` in the proofs engine, so the failure mode is a spurious state-root mismatch. `alloy-op-evm` had no positive test for the EIP-7825 deposit gas-cap exemption — only the negative case asserting non-deposits stay capped. The exemption is not observable as an error, because deposits skip `validate_env` where `TxGasLimitGreaterThanCap` is raised; it is only observable in how much gas the first frame receives, via `initial_gas_and_reservoir`, which OP does not override. The new tests measure that: a deposit above the cap runs a payload costing more than the capped budget and must still complete, and the saved cap round-trips through every resting state including `None`. Both tests were checked red against deliberately broken variants — the first against a disabled exemption, the second against a restore path that collapses the inner `Option`. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…efund `last_frame_result` settles the frame, then applies the Bedrock deposit rule (gas used equals the limit, no refund), then applies upstream's EIP-2780 refundable-state-gas refill. A refill after the deposit rule would hand regular gas back to a pre-Regolith deposit. It cannot fire today, because the refill needs a `charged_*` flag that only EIP-2780 (Amsterdam) sets and Bedrock maps to `SpecId::MERGE`, so no test can fail on the baseline; the reorder makes the rule unconditional so that no upstream credit, present or future, can undo it. Also advances the two remaining `revm-handler@41.0.0` tags in this file, re-verified against 42.0.1 with the rest of the handler overrides. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
…oy-evm 0.38 Advances every remaining `UPSTREAM-MIRROR` tag to the versions the workspace now resolves, each after diffing the named upstream symbol between the recorded version and the new pin. No mirrored body needed a change: the only upstream moves were the sender-recovery cache in `tx_iterator_for_payload` (behaviour-equivalent, recorded in prose), the `block` argument threaded through `transaction_receipt` (already adapted by the bump) and the journal finalize-on-error paths in `ExecuteEvm::replay` (already adapted). Prose corrections found on the way: `transaction_by_hash` does not reproduce upstream's RPC-cache lookup, `build_pending_env` keeps the parent's real beacon root where upstream zeroes it, `EthEvm` also carries the deposit gas-cap exemption, and `withdrawals_root` says what upstream does instead of `wiped`. The review guide's deposit `validate_env` list is re-verified at revm 42. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
…yer rejects alloy 2.4's `Signed::fallback_decode` rejects a typed body without its type byte before `decode_2718_canonical` runs, so the boundary tests can no longer expect the "non-canonical" message. The property they pin is that the input is rejected; the helper's own tests still cover its semantics. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
Upstream changes visible on the op-reth command line: the engine persistence threshold default moves from 2 to 7 and the memory block buffer target loses its default of 0; `--testing.skip-invalid-transactions` now defaults to false; `--engine.sparse-trie-max-hot-slots` and `--engine.sparse-trie-max-hot-accounts` are gone; `--dev.finality-depth`, `--engine.txpool-prewarming` and `--engine.sender-recovery-cache` are new; peer flags accept ENRs. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
revm-precompile 42 resolves sha2 0.11 next to the 0.10 line the guest already patches, and a patch only covers the version it names, so the SHA-256 precompile and the KZG versioned-hash check would run unaccelerated in the zkVM. sp1-patches now publishes patch-sha2-0.11.0-sp1-6.2.0; with it, every sha2 in the guest resolves from sp1-patches again and check-sp1-guest-precompile-patches passes unchanged. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
Moves the 71 reth crate pins in `rust/Cargo.toml` from tag `v2.5.0` to
`v2.5.2`. v2.5.0 is an ancestor of v2.5.2, so the old pin carried nothing
that the new one drops.
Shared pins are unchanged: the only difference in reth's workspace
`Cargo.toml` between the two tags is its own `version` line, so revm
42.0.1, the alloy families and the published reth-core crates stay where
they are. No shared-dependency sync was needed.
The lockfile delta is exactly the 106 reth git-source packages moving from
`tag=v2.5.0` to `tag=v2.5.2`; no other package identity changes. The SP1
guest lock re-unifies `alloy-rpc-types-eth`'s `itertools` (requirement
`>=0.13, <=0.14`) onto the 0.13.0 already present in that lock. That
workspace does not depend on reth.
All 18 reth mirror tags were re-verified before being advanced: every
upstream crate hosting a mirrored symbol — consensus/common,
ethereum/{consensus,evm,hardforks,engine-primitives,payload},
rpc/{rpc-eth-api,rpc-engine-api,rpc-api}, storage/db and transaction-pool —
is byte-identical between v2.5.0 and v2.5.2. The six frozen `port` tags are
left at their recorded versions.
No adaptation was required, and the op-reth CLI surface snapshot is
unchanged. The two upstream changes closest to op- code are consumed as-is:
`reth-provider`'s storage-wipe fix for batched persistence (op-reth's trie
store writes per block and never merges `TrieUpdatesSorted` across blocks,
so the bug class has no analogue here), and `CancelOnDrop` gaining a
cooperative finalization state (op-reth's payload builder reads only
`is_cancelled()`, whose meaning is unchanged).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
Keep v2.5.2 as the release base while retaining upstream #26708 on the ethereum-optimism/reth maintenance branch. Preserve overlay leases while serving queued Engine requests during a deferred persistence handoff. Exercise the actual OP node with overlapping payload workers, normal getPayload resolution, cancellation, and persistence catch-up. Include the remaining FPVM precompile caller in the mirror inventory and document the release/backport and release-pinned CLI documentation boundaries. Take the approved rustls security update and required backend patches, without unrelated lockfile dependency-edge changes or advisory exceptions. BREAKING CHANGE: the reth upgrade removes --engine.sparse-trie-max-hot-slots, its --engine.sparse-trie-max-storage-tries alias, and --engine.sparse-trie-max-hot-accounts. Operators must remove these flags from launch configuration. Set supported persistence/buffer options explicitly and pass --testing.skip-invalid-transactions when retaining their previous configurable defaults.
`revm_context_interface::Transaction` is byte-identical between 41.0.0 and 42.0.0, and `EthBuiltPayload::into_execution_data` is unchanged between `aef8d3e` and `0fbe428`, so both tags advance without a body change. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
Keep the withdrawals-root calculation aligned with the MessagePasser invariant that its storage is never wiped. Record the upstream provenance of the proofs providers and the OP converter's infallible log conversion.
The historical-proofs ExEx replaces debug_executionWitness with an override that decoded only a block number or tag, so a by-hash call that a stock node answers failed with "Invalid params" as soon as the ExEx was installed. Upstream's DebugApi takes a BlockId; take the same one here so the method has a single shape either way. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
reth v2.5.2 added eth_getMultiProof to the core EthApi and to the auth server's EngineEthApi, so every OP node started serving it by default. No OP user has asked for the method, and a proofs-history node cannot answer it consistently — the stock handler reads live state, which a pruned node does not have for the blocks the override exists to cover. Rather than maintain a second proof method with no consumer, drop it from the served surface: the add-ons modules hook removes it from http/ws/ipc and from the auth module, for all OP nodes including the SDM fixture, which shares these add-ons. Add it back when there is a user. This reverts the historical-proofs override that served it, along with its metrics and the reth-trie-common dependency. The override's UPSTREAM-MIRROR tag stays: it still enumerates upstream's proof methods by hand, and the next one added upstream has to be either declared there or removed here, so that a proofs-history node never answers a proof method from live state. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
A crate can appear in rust/Cargo.lock at several incompatible versions when an unrelated dependency pulls an older line — alloy-consensus resolves to both 1.8.3 and 2.4.2 today. The checker reported any tag naming such a crate as ambiguous-version, which made it impossible to tag a mirror of one at all. Take the version from the range rust/Cargo.toml asks for, which is what our own crates build against, and keep ambiguous-version for the cases where that still leaves a choice. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
OpReceiptEnvelope, OpReceipt and OpExecutionPayload each reproduce an upstream alloy type — its variant set, its 2718/RLP dispatch, its serde shape — with OP variants added. None of that is visible as a diff when alloy moves, so record the upstream symbol and the verified version in an UPSTREAM-MIRROR tag. OpReceipt is tagged against ReceiptEnvelope rather than Receipt: it mirrors the envelope's per-transaction-type payload split, holding a bare Receipt instead of a ReceiptWithBloom, which upstream has no counterpart for. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
remaining + reservoir + refunded can exceed the gas limit — revm 42 credits remaining from the reservoir after the fact — and the plain subtraction then wrapped to a huge used-gas figure, which zeroed the operator fee refund (or panicked with overflow checks on). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
…tate The proofs storage only holds canonical blocks and is overlaid by block number, so a hash-addressed request for a block off the canonical chain got the canonical state for that height under the live state of the fork block. The proofs state factory now rejects a hash whose block is not the canonical one at its number, which covers every `eth_` proof method and the witness override in one place. `debug_executionWitness` selects the parent state by parent hash rather than by parent number, as upstream does, so a fork block whose parent is canonical gets its actual parent state and a fork parent is rejected by the factory. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
… and overlay Unit tests for `hashed_post_state` on `OpProofsStateProviderRef` (in-memory and MDBX v2 backends) and `MemoryOverlayOpProofsStateProviderRef` cover: untouched persisted slots of a destroyed account come back as explicit zeros, including across several destroyed accounts sharing one cursor; slots only in the buffered overlay come back as zeros; destroy-and-recreate keeps the bundle's value and zeroes the other old slots; create-and-destroy does no parent scan and zeroes nothing; a storage cursor failing to open or to seek surfaces as an error from both providers. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8
sebastianst
enabled auto-merge
September 24, 2026 08:46
sebastianst
force-pushed
the
seb/reth-v2.5.0
branch
from
September 24, 2026 08:57
27c1cc5 to
37ad436
Compare
davidtaikocha
added a commit
to taikoxyz/alethia-reth
that referenced
this pull request
Sep 27, 2026
Follow OP's pending reth v2.5.2 bump (ethereum-optimism/optimism#22495, still a draft): reth-optimism-trie resolves reth inside the OP workspace, so the reth pin must match OP's source exactly. - reth: paradigmxyz/reth@f2eecc6 -> ethereum-optimism/reth@0fbe428 (v2.5.2 + paradigmxyz/reth#26708 engine handoff backport) - reth-optimism-trie: OP 4f21ce6 -> 9e26d38 (#22495 head) - alloy 2.1 -> 2.3 (locks 2.4.2, same as OP's lock), alloy-evm 0.38, revm 42, reth-codecs / reth-primitives-traits 0.6 - check_reth_pin.sh: require a single reth git source (URL and rev), so a URL-only split (paradigmxyz vs fork) is caught too API adaptations: - engine validator: build_tree_validator takes an OverlayManager; delegate to BasicEngineValidatorBuilder so txpool prewarming (private to reth-node-builder) is wired like upstream - debug witness: ExecutionWitnessRecord borrows the post-execution State - proof-history live collector: hashed_post_state is now fallible Behavior fix: reth v2.5's HashedPostState::from_bundle_state no longer marks destroyed accounts' storage as wiped. execute_derived_block feeds raiko2's stateless trie, which clears storage only on `wiped`, and pre-Unzen forks run SHANGHAI SELFDESTRUCT semantics, so restore the flag explicitly and cover it with a regression test. Draft: re-pin reth-optimism-trie to OP's merge commit once #22495 lands. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
davidtaikocha
added a commit
to taikoxyz/alethia-reth
that referenced
this pull request
Sep 27, 2026
ethereum-optimism/optimism#22495 merged into develop on 2026-09-24 as 1cbf91ab. Move reth-optimism-trie off the unmerged PR head 9e26d38a and onto that merge commit. OP's reth source is the same on both sides of the merge (ethereum-optimism/reth@0fbe428), so no reth line changes and Cargo.lock only updates the trie package's source. Between the two revs, the crate's non-test code differs only in comments; the rest is new tests. develop HEAD fe0f7999 (2026-09-26) has not touched the crate, rust/Cargo.toml, or rust/Cargo.lock since the merge. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #22946, which pins deposit-gas parity before this dependency update.
Updates OP's execution client without accepting the Engine API stall in an unpatched release. Once disk persistence completes while a payload worker still holds an overlay lease, the release-only pin can stop serving forkchoice and new-payload requests until that worker finishes.
The pin now uses
ethereum-optimism/reth:optimismat0fbe428: the selected release, upstream #26708, and one squashed CI maintenance commit. The old op-rs state-root-receiver patch is already upstream; the new handoff backport is not in the selected release. An upstream main-branch merge is not sufficient evidence to drop it.Behavior and operator impact
The bump corrects finalize-on-error journal cleanup and destroyed-account storage-wipe handling while preserving deposit gas-cap exemptions and pre-Regolith refund semantics.
debug_executePayloadadditionally returns ancestor headers. The SP1 guest retains accelerated SHA-256 coverage for both dependency lines.BREAKING CHANGE: operators using
--engine.sparse-trie-max-hot-slots, its--engine.sparse-trie-max-storage-triesalias, or--engine.sparse-trie-max-hot-accountsmust remove those flags from launch configuration. The persistence threshold default rises from 2 to 7.--engine.memory-block-buffer-targetno longer shows a CLI default: its effective value ismin(persistence threshold, 5), so with the new default threshold it changes from 0 to 5 blocks kept in memory; pass--engine.memory-block-buffer-target 0to keep the old behaviour.testing_buildBlockV1no longer skips invalid transactions by default. To retain prior configurable defaults, set persistence/buffer options explicitly and pass--testing.skip-invalid-transactions.The published CLI reference deliberately stays at its finalized manifest release, per the generator contract; it must not be regenerated from this unreleased branch. The checked-in CLI surface snapshot covers this branch's interface.
The fork and OP lockfiles also take the approved TLS security fixes rather than advisory exceptions. The fork's compact compatibility check uses the selected release commit (upstream tags are not mirrored), while PR and merge-queue comparisons retain their actual base. CI support remains one replayable commit.
Deliberate limitation
This is a temporary responsiveness fix, not a persistence-fairness or bounded-memory guarantee. Upstream #26710 still applies: endless overlapping builds or a hung worker can prevent the active-build tracker from draining, stopping persistence and allowing memory to grow. The regression exercises finite overlapping OP builds, cancellation and post-drain catch-up; it does not cover perpetual overlap, deadline expiry, reorg/backfill or crash/restart durability. Backfill actions that arrive while a payload job, persistence run or handoff is active are dropped until the next sync trigger, as in upstream v2.5.2 (reth#26559); reth#26911 replaces that with pending revalidation and arrives with the v2.6.0 bump that follows this PR.
Batched validator forwarding,
SystemCallCommitEvm, and sender-recovery-cache integration remain outside this change.Review fixes from the change-driven bump review
Five reviewers went over every reth, revm, alloy and alloy-evm change this bump pulls in (not just the tagged mirrors). Fixed here:
debug_executionWitnessin the historical-proofs override now takesBlockIdlike upstream, so installing the ExEx no longer narrows the method to a number or tag. The proofs state factory rejects a hash that names a non-canonical block (the proofs storage is canonical-only and overlaid by number), and the witness selects its parent state by parent hash like upstream.eth_getMultiProof(new upstream method, installed by default on the core and authEthApi) is removed from every OP node's served surface rather than maintained in the historical proofs override: no OP user has asked for it, and a proofs-history node cannot answer it consistently from live state. It comes back when there is a user (op-reth: eth_getMultiProof is deliberately not served #22990). The override trait is tagged as a mirror ofEthApi's proof methods.OpReceiptEnvelopeandOpReceiptdeliberately do not adopt alloy 2.4's missing-typelegacy fallback (fix(consensus): default missing receipt type to legacy alloy-rs/alloy#4107, for Geth-derived chains that omit the field; no OP client does): the derives stay, a receipt withouttypeis rejected, and the mirror tags record the divergence.UPSTREAM-MIRRORtags for the alloy-family copies (OpReceiptEnvelope,OpReceipt,OpExecutionPayload); the checker now narrows a crate resolved at several incompatible versions to the rangerust/Cargo.tomlasks for before reportingambiguous-version.saturating_subfor gas used, since revm 42 can creditremainingfrom the reservoir after the fact.--all-features.Follow-ups filed instead of widening this PR: #22969 (
eth_simulateV1ignores the EIP-7825 cap on OP chains), #22970 (seal the in-flight payload ongetPayload), #22971 (deposit gas-cap exemption inOpHandler::tx_gas), #22972 (OP engine defaults, deployment flag audit, sender-recovery cache), #22973 (evidence gaps: arkworks 0.6 vectors, c-kzg transmute, hasher ordering, kona V2 payload test, receipt-strictness tests, trace-by-index, witness rollout ordering).Verification
--workspace --tests --locked) andop-rethbinary build--all-features --all-targets, warnings denied)no_std, formatting and mirror checkscargo-denychecksThe local all-features runtime tests use the author-approved
TRACY_NO_INVARIANT_CHECK=1workaround because this VM does not advertise invariant TSC support. No repository or production default changes; these runs are not profiling evidence. Actual CLI smoke checks confirm removed flags are rejected and supported explicit persistence/buffer/testing options still parse.Not run locally: Go acceptance/devnet suites or SP1 guest ELF build/execution/lint. The guest checks above cover metadata and formatting, not guest execution.
Accepted inherited CI failure: the fork's
ef-tests::valid_blocksexceeds its unchanged 60-second timeout on all three attempts. Current job 993 matches pre-reset job 770 at the original fork tip. The EF/execution/storage code is unchanged by this backport. The author approved documenting this separately rather than skipping cases or increasing the test budget: 28 fork checks pass, one times out, and the aggregatereth-actcheck remains failed.Closes #22890
🤖 Co-created with Claude Opus 5 and Claude Fable 5.1
🤖 Generated with Claude Code
https://claude.ai/code/session_01Ss5Vsih1Jhvd4eWB9UJoi8