Skip to content

Clayton/cherry pick rust 2#48

Draft
ClaytonNorthey92 wants to merge 362 commits into
hemifrom
clayton/cherry-pick-rust-2
Draft

Clayton/cherry pick rust 2#48
ClaytonNorthey92 wants to merge 362 commits into
hemifrom
clayton/cherry-pick-rust-2

Conversation

@ClaytonNorthey92

Copy link
Copy Markdown

No description provided.

@socket-security

socket-security Bot commented Jun 24, 2026

Copy link
Copy Markdown

@socket-security

socket-security Bot commented Jun 24, 2026

Copy link
Copy Markdown

Warning

Review the following alerts detected in dependencies.

According to your organization's Security Policy, it is recommended to resolve "Warn" alerts. Learn more about Socket for GitHub.

Action Severity Alert  (click "▶" to expand/collapse)
Warn High
Obfuscated code: cargo cbindgen is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: ?cargo/cbindgen@0.29.2

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore cargo/cbindgen@0.29.2. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn High
Obfuscated code: cargo libc is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: rust/Cargo.lockcargo/libc@0.2.185

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore cargo/libc@0.2.185. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn High
Obfuscated code: cargo libc is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: ?cargo/libp2p-identity@0.2.13cargo/reqwest@0.12.28cargo/getrandom@0.2.17cargo/time@0.3.45cargo/vergen-git2@9.1.0cargo/hyper-util@0.1.20cargo/metrics-process@2.4.3cargo/httpmock@0.8.3cargo/time@0.3.47cargo/reqwest@0.13.2cargo/chrono@0.4.44cargo/getrandom@0.4.2cargo/tempfile@3.27.0cargo/c-kzg@2.1.7cargo/tokio-tungstenite@0.29.0cargo/discv5@0.10.4cargo/proptest@1.11.0cargo/rand@0.10.1cargo/openssl@0.10.77cargo/rustls@0.23.38cargo/axum@0.8.9cargo/hyper-rustls@0.27.9cargo/rand@0.8.6cargo/revm@38.0.0cargo/sha3@0.10.9cargo/reth-zstd-compressors@0.3.1cargo/reth-primitives-traits@0.3.1cargo/reqwest@0.13.3cargo/rustls@0.23.40cargo/metrics-exporter-prometheus@0.18.3cargo/tokio@1.52.3cargo/assert_cmd@2.2.2cargo/alloy-primitives@1.6.0cargo/alloy-sol-types@1.6.0cargo/dashmap@6.2.1cargo/alloy-transport-http@2.0.5cargo/alloy-rpc-types-beacon@2.0.5cargo/alloy-rpc-types-engine@2.0.5cargo/alloy-rpc-client@2.0.5cargo/alloy-signer-local@2.0.5cargo/alloy-provider@2.0.5cargo/tower-http@0.6.11cargo/tar@0.4.46cargo/secp256k1@0.31.1cargo/sha2@0.10.9cargo/metrics-util@0.19.1cargo/libp2p@0.56.0cargo/secp256k1@0.30.0cargo/dirs-next@2.0.0cargo/dirs@6.0.0cargo/tokio-tungstenite@0.26.2cargo/reqwest@0.12.15cargo/rocksdb@0.24.0cargo/notify@8.2.0cargo/testcontainers@0.24.0cargo/axum@0.8.3cargo/metrics-exporter-prometheus@0.16.2cargo/opentelemetry-otlp@0.28.0cargo/rlimit@0.10.2cargo/testcontainers@0.23.3cargo/jsonrpsee@0.26.0cargo/metrics-exporter-prometheus@0.17.2cargo/redis@0.30.0cargo/metrics-exporter-prometheus@0.17.0cargo/tokio-tungstenite@0.28.0cargo/parking_lot@0.12.5cargo/alloy-sol-types@0.8.26cargo/alloy-primitives@0.8.26cargo/getrandom@0.3.4cargo/tikv-jemallocator@0.6.1cargo/libc@0.2.186

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore cargo/libc@0.2.186. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn High
Obfuscated code: cargo openssl is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: ?cargo/reqwest@0.12.28cargo/alloy-transport-http@2.0.5cargo/tokio-tungstenite@0.26.2cargo/reqwest@0.12.15cargo/openssl@0.10.72

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore cargo/openssl@0.10.72. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn High
Obfuscated code: cargo openssl is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: rust/Cargo.lockcargo/openssl@0.10.77

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore cargo/openssl@0.10.77. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn High
Obfuscated code: cargo openssl is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: ?cargo/reqwest@0.12.28cargo/alloy-transport-http@2.0.5cargo/tokio-tungstenite@0.26.2cargo/reqwest@0.12.15cargo/openssl@0.10.80

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore cargo/openssl@0.10.80. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn High
Obfuscated code: cargo tokio is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: rust/Cargo.lockcargo/tokio@1.52.3

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore cargo/tokio@1.52.3. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn High
Obfuscated code: cargo writeable is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: ?cargo/url@2.5.8cargo/libp2p@0.56.0cargo/writeable@0.6.3

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore cargo/writeable@0.6.3. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn High
Obfuscated code: cargo zerocopy is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: ?cargo/proptest@1.11.0cargo/rand@0.9.4cargo/rand@0.8.6cargo/revm@38.0.0cargo/reth-primitives-traits@0.3.1cargo/dashmap@6.2.1cargo/alloy-provider@2.0.5cargo/metrics-util@0.19.1cargo/libp2p@0.56.0cargo/tokio-tungstenite@0.26.2cargo/backoff@0.4.0cargo/ark-bls12-381@0.5.0cargo/zerocopy@0.8.48

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore cargo/zerocopy@0.8.48. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

View full report

@github-advanced-security github-advanced-security AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

CodeQL found more than 20 potential problems in the proposed changes. Check the Files changed tab for more details.

dhyaniarun1993 and others added 27 commits June 25, 2026 18:05
Fix broken unit test for verifying `Debug` impl, add missing map
`address_mappings` to expected test output, introduced in
op-rs/op-reth#512
…es` (op-rs/op-reth#537)

Closes op-rs/op-reth#524

Co-authored-by: Emilia Hane <elsaemiliaevahane@gmail.com>
Closes op-rs/op-reth#515
Closes op-rs/op-reth#516

<img width="1607" height="277" alt="Screenshot 2025-12-18 at 20 44 35"
src="https://github.com/user-attachments/assets/d135ff3c-c837-4dc8-a097-b9f818a08a35"
/>

---------

Co-authored-by: Emilia Hane <elsaemiliaevahane@gmail.com>
…_block_updates` (op-rs/op-reth#535)

Closes op-rs/op-reth#523

---------

Co-authored-by: Emilia Hane <elsaemiliaevahane@gmail.com>
…rs/op-reth#548)

Cherry picks commit from op-rs/op-reth#540

Co-authored-by: Himess <semihcvlk53@gmail.com>
…ck_updates (op-rs/op-reth#541)

Closes op-rs/op-reth#525

Co-authored-by: Emilia Hane <elsaemiliaevahane@gmail.com>
…/op-reth#556)

Closes op-rs/op-reth#555

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Attempts to fix op-rs/op-reth#528

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Revert all the changes made as part of the hybrid storage experiment.
Closes op-rs/op-reth#311

Performace comparison under load test:

```
previous: 4.873750666s
sorted delete:
3.278444083s
sorted delete + seperate read (current as per the PR): 2.980065583s
```
…p-rs/op-reth#513)

## Summary
- Remove `push` and `pull_request` triggers from coverage workflows
- Add `merge_group` trigger to run codecov only in merge queue
- Keep `workflow_dispatch` for manual triggering when needed

This reduces CI resource usage by running codecov only when necessary.

Closes op-rs/op-reth#500
Closes op-rs/op-reth#562

Validated the optimization by rewriting an initial state with N=50,000
updated entries.
- Throughput: Increased by ~20.9% (326k → 394k entries/sec).
- Latency: Reduced by ~17.2% (153ms → 126ms).

```
Old approach:
Rewrite Duration: 153.26ms
Throughput:       326,248 entries/sec

New approach:
Rewrite Duration: 126.77ms
Throughput:       394,410 entries/sec
```

bench:
op-rs/op-reth@274e544
Part of op-rs/op-reth#483.

First wait for theo's PR
[op-rs/op-reth#18754](ethereum-optimism#18754) to be
merged.
Then wait for our PR
[op-rs/op-reth#18772](ethereum-optimism#18772) to be
merged.

After that, in this repo, remove the current submodule and replace it
with optimism itself.
Closes op-rs/op-reth#449

The approach used is to perform full block verification after every N
blocks to ensure the state is still correct.

---------

Co-authored-by: Arun Dhyani <dhyaniarun7@gmail.com>
Closes op-rs/op-reth#566

---------

Co-authored-by: Himess <95512809+Himess@users.noreply.github.com>
Co-authored-by: Himess <semihcvlk53@gmail.com>
wwared and others added 25 commits June 25, 2026 18:16
…d_hash / fetch_output_block_hash (ethereum-optimism#20724)

* fix(kona/client): validate output-root version word in fetch_safe_head_hash / fetch_output_block_hash

Both call sites previously sliced `output_preimage[96..128]` as the L2 block
hash without checking the version word at `[0..32]`. Today only
`OutputVersionV0` (the zero word) is defined; op-program's equivalent rejects
any non-V0 word via `ErrInvalidOutputVersion`. The downstream defenses already
refuse a hypothetical V1 claim, so this is not a consensus fix — the goal is
forensic: surface "unknown output version" explicitly instead of masking it as
a generic `InvalidClaim` later in the pipeline.

Adds `OracleProviderError::UnknownOutputVersion(B256)` and a unit test on
`fetch_safe_head_hash` that fails on the pre-fix code (returns `Ok(B256::ZERO)`)
and passes after.

* fix(kona/client): reject malformed output-root preimage length in fetch_output_block_hash

Addresses the review nit on ethereum-optimism#20724: `fetch_output_block_hash` only guarded
the version word, so a preimage shorter than 32 bytes silently fell through
to the `[96..128]` slice and panicked, and longer-than-128 preimages were
read past their meaningful payload. Add an explicit length-128 check that
returns `Preimage(BufferLengthMismatch(128, n))`, matching the behavior
that `single::fetch_safe_head_hash` already gets for free from `get_exact`.

Test reorganization:
* Move shared `MockOracle` from inline in `trace_extension.rs` into
  `tests/common/mod.rs` so version + length tests can share it.
* Add `tests/output_root.rs` covering both checks (version word and
  preimage length) for each helper — `fetch_safe_head_hash` and
  `fetch_output_block_hash` — so regressions in either function are caught
  independently.
* Bump `interop::util` and `fetch_output_block_hash` to `pub` to mirror
  the existing surface for `single::fetch_safe_head_hash`; the lib has no
  external consumers beyond these integration tests.

---------

Co-authored-by: wwared <541936+wwared@users.noreply.github.com>
…ram (ethereum-optimism#20717)

* fix(kona-client/interop): mirror SuperRoot trace-extension arm on TransitionState prestate

When the agreed pre-state is a `PreState::TransitionState` and
`transition_state.pre_state.timestamp >= claimed_l2_timestamp`, the interop
`run()` previously short-circuited to `Err(InvalidClaim)` unconditionally,
regardless of whether `claimed_post_state == agreed_pre_state_commitment`.
The parallel `PreState::SuperRoot` arm already returned `Ok(())` in the
matching-claim case (trace extension). This commit extends the
TransitionState arm to mirror that behavior, bringing kona-client into
parity with op-program's `stateTransition`/`ValidateClaim` semantics at the
`>=` boundary on sub-case A (`T == GT AND claim == prestate`).

Adds three integration tests in `bin/client/tests/interop_trace_extension.rs`:
sub-case A (RED on baseline, GREEN after fix), sub-case B (fail-closed
regression guard), and sub-case C-eq (symmetric strict-`>` half).

* test(kona-client/interop): trim verbose comments from trace-extension tests

* fix(kona-proof-interop/boot): reject future-timestamped prestate (ethereum-optimism#20727)

Add an `assert!` in `BootInfo::load` rejecting any agreed pre-state whose
timestamp exceeds `claimed_l2_timestamp`. The honest actor never agrees to
such a pre-state; op-program panics on the same condition (see
`op-program/client/interop/interop.go:87-97`). Without this guard, a
malicious proposer could register a future-timestamped SuperRoot or
TransitionState preimage (the oracle only verifies
`key == keccak256(preimage)`, not the timestamp inside) and commit the
same hash as both starting and disputed claim at trace-extended bisection
positions, where kona's `claim == prestate => Ok(())` arm would resolve
as `vmStatus = VALID`.

With the guard, both arms of `interop::run` only need to handle the
legitimate `==` boundary; tighten `>=` to `==` accordingly to make intent
explicit.

Tests:
- Flip
`trace_extension_transition_state_past_game_timestamp_accepts_matching_claim`
  to `#[should_panic]`; its previous assertion pinned the buggy lenient
  behavior. The flipped version is now the regression guard for the
  TransitionState arm.
- Add `rejects_super_root_with_timestamp_after_game_timestamp` as the
  symmetric guard for the SuperRoot arm.
- Refactor `setup_interop_preimages` to take a `PreState` so both arms
  reuse the fixture.

Resolves the "narrow both kona arms to `==`" follow-up flagged in ethereum-optimism#20717.

* test(kona-client/interop): cover SuperRoot ==-boundary trace-extension cases

Adds the SuperRoot-arm counterparts of the existing TransitionState `==`
trace-extension tests. Without them, a future refactor that breaks the
SuperRoot `==` arm in `bin/client/src/interop/mod.rs` would be caught only
by the strict-`>` panic test, leaving the consensus-critical `T == GT`
boundary unguarded for the SuperRoot variant.

- trace_extension_super_root_at_game_timestamp_accepts_matching_claim
  asserts `Ok(())` when `super_root.timestamp == claimed_l2_timestamp` and
  `claim == prestate_commitment`.
- trace_extension_super_root_at_game_timestamp_rejects_mismatched_claim
  asserts `Err(InvalidClaim)` when the timestamps match but the claim
  differs from the prestate commitment.

Reuses the existing `setup_interop_preimages` fixture which already takes
a `PreState`, so no production or fixture changes.

* fix(kona-client/interop): Use realistic TransitionState in unit tests

Co-authored-by: Inphi <mlaw2501@gmail.com>

---------

Co-authored-by: wwared <541936+wwared@users.noreply.github.com>
Co-authored-by: Rodrigo Araújo <rod.dearaujo@gmail.com>
Co-authored-by: Inphi <mlaw2501@gmail.com>
…ng (ethereum-optimism#20788)

* perf(rust-e2e-restart): 1s L2 block time, shorter NotAdvanced window

Drops L2 block time for the kona node-restart sysgo suite from the default
(2s) to 1s, and trims TestSequencerRestart's NotAdvancedFn window from 50
to 20 slots. Both changes target the wall-clock dominated rust-e2e-restart
CI job, which spends most of its ~24m runtime waiting for L2 blocks.

* ci(rust-e2e): persist prebuilt rust binaries to workspace

The cannon-kona-host, kona-build-release, and op-reth-build jobs build
release binaries that downstream e2e jobs already require but do not
consume from the workspace. Each downstream job then re-runs rust-build,
restoring the rust target cache and re-linking the same binary (~9m).

Set persist_to_workspace: true on the three builders and drop the
redundant rust-build step from rust-e2e-sysgo-tests,
rust-restart-sysgo-tests, op-reth-e2e-sysgo-tests, and
kona-proof-action-tests. The downstream jobs already attach the workspace
and reference $WD/rust/target/release/<binary>, so the persisted globs
land at the expected path.

* ci(rust-e2e): persist only from kona-build-release

cannon-kona-host, kona-build-release, and op-reth-build write overlapping
files into rust/target/release (kona-build-release builds the entire
workspace, so it produces every binary). CircleCI rejects concurrent
persists of the same file with 'Concurrent upstream jobs persisted the
same file(s)'.

Persist only from kona-build-release. The other two still build in
parallel to prime caches but no longer persist.

* ci(rust-e2e): drop redundant cannon-kona-host and op-reth-build jobs

kona-build-release builds the entire rust workspace, so it already
produces kona-host and op-reth alongside kona-node. Running cannon-kona-host
and op-reth-build in parallel was duplicate work — both built subsets of
what kona-build-release produces, and they cannot persist to the workspace
without colliding with it. Drop the two jobs entirely and route their
former consumers to kona-build-release.

* ci(rust-e2e): drop redundant rust build jobs

kona-build-release builds the entire rust workspace, so it already
produces kona-host and op-reth alongside kona-node. The parallel
cannon-kona-host and op-reth-build jobs were rebuilding subsets of the
same output. They cannot persist alongside it without colliding on
rust/target/release/* paths.

Drop both, route all consumers to a single workspace build, and rename
it to rust-workspace-release to reflect that it produces the full set
of release binaries — not just kona.
…ereum-optimism#19974)

The workspace unification in ethereum-optimism#19034 moved op-reth from `reth/` to
`rust/op-reth/` and consolidated all build output under `rust/target/`.
Four path references in `rust/kona/tests/justfile` were never updated:

- `build-reth` recipe: `cd ../../reth` -> `cd ../../op-reth`
- `OP_RETH_EXEC_PATH` in `acceptance-tests-run`, `test-e2e-sysgo-run`,
  and `long-running-test`: `../../reth/target/debug/op-reth` ->
  `../../target/debug/op-reth` (unified workspace target directory)

CI was unaffected because it pre-sets `OP_RETH_EXEC_PATH` to the correct
`rust/target/release/op-reth` before invoking justfile recipes, and never
calls `build-reth` directly. These broken paths only affect local
development workflows (`just build-reth`, `just acceptance-tests`,
`just test-e2e-sysgo`, `just long-running-test`).

Related: ethereum-optimism#19569, ethereum-optimism#19929

Co-authored-by: wwared <541936+wwared@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…hereum-optimism#19874)

Add SpanDecodingError::TxGases and map decode_tx_gases failures to it instead of TxNonces.
…upervisor path (ethereum-optimism#20849)

* chore: remove rust/kona/tests/supervisor and the sysgo op-supervisor path

The rust/kona/tests/supervisor packages are not invoked by any CI job
(the kona test-e2e-sysgo matrix only runs node/common, node/reorgs and
node/restart). They were the last consumer of the
NewSimpleInterop/NewSingleChainInterop presets, which in turn were the
last code path that booted op-supervisor as a service in devstack.

With those tests gone:
- Delete NewSimpleInterop / NewSingleChainInterop factories and the
  singleChainInteropFromRuntime / simpleInteropFromRuntime adapters.
- Delete NewSimpleInteropRuntime{,WithConfig} /
  NewSingleChainInteropRuntime{,WithConfig} plus the startSupervisor,
  startOPSupervisor, startKonaSupervisor, OpSupervisor, KonaSupervisor,
  and Supervisor-interface chain.
- Drop MultiChainRuntime.PrimarySupervisor and
  SingleChainInteropSupport.Supervisor (no setters/readers left).
- Drop SingleChainInterop.Supervisor, the dsl.Supervisor wrapper,
  supervisorFrontend, newSupervisorFrontend, newPresetSupervisor, and
  the stack.Supervisor interface.
- Move readJWTSecretFromPath and validateSimpleInteropPresetConfig to
  a small interop_helpers.go since they are still needed by the
  supernode runtime.

* chore(devstack): rename SupernodeProofs interop factories to drop suffix

Now that 'interop' implies supernode-backed by default, the
NewSimpleInteropSupernodeProofs / NewSingleChainInteropSupernodeProofs
names carried redundant suffixes. Rename them to NewSimpleInterop and
NewSingleChainInterop, matching the surviving struct names.

The Isthmus and SuperRootAtGenesis variants keep their distinguishing
suffixes since they configure non-default fork activations.

* chore: drop unused buildTwoL2WorldWithState
…ethereum-optimism#20611)

Ports the op-revm integration tests from upstream revm's
revm-ee-tests crate (https://github.com/bluealloy/revm) so they
run as part of the monorepo's Rust CI.

- New workspace member rust/revm-ee-tests/
- Only the op_revm_tests module is included; upstream revm_tests
  and eip8037 modules are not (they exercise mainnet revm)
- Snapshot helper (compare_or_save_testdata) ported as-is from
  upstream; first run saves, subsequent runs compare

Local verification: cargo test, clippy --workspace --all-targets
--all-features --locked, fmt --check, rustdoc with -D warnings,
cargo deny, cargo hack --each-feature, zepter, typos, udeps.
…um-optimism#20740)

* feat(op-reth/payload): expose per-call committed transactions

Adds an optional `committed_txs: Option<&mut Vec<Recovered<TxTy<...>>>>`
parameter to both `OpPayloadBuilderCtx::execute_best_transactions` and
`OpPayloadBuilderCtx::execute_sequencer_transactions`. When `Some(vec)`,
each successfully committed transaction is appended in commit order;
`None` reproduces today's behaviour byte-for-byte.

This fills the symmetric gap with `BlockExecutor::receipts()`, which
already exposes the per-call receipt delta. Committed transactions live
on the `BasicBlockBuilder` internals and are otherwise unreachable
through the trait surface returned by `OpPayloadBuilderCtx::block_builder()`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: cargo fmt

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* test(op-reth/payload): add unit tests for execute_best_transactions optional params

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…imism#20737)

* feat(op-builder): vendor op-rbuilder:op-builder/v0.2.13

* feat(rollup-boost): vendor rollup-boost:rollup-boost/v0.7.11

* _

* fix path

* ci(rust): build op-rbuilder and rollup-boost as vendored dirs, not submodules

Adds rust-build-vendored job that hashes the directory tree via
git ls-tree instead of reading a submodule gitlink SHA, and skips
the git submodule update --init step since the code is checked in.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* ci(rust): fix op-rbuilder/rollup-boost binary paths

The rust-build-vendored job saves binaries flat into
.circleci-cache/rust-binaries/, so the env vars should not include
the spurious rust/ subdirectory prefix.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* ci(rust): remove unused rust-build-submodule job

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* ci(rust): add rust-lint-vendored job for op-rbuilder and rollup-boost

Ports the fmt-check + clippy lint steps from the upstream GitHub Actions
workflows into CircleCI. Both jobs skip on no-change via check-changed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* ci(rust): add rust-test-vendored job for op-rbuilder and rollup-boost

Both test suites use testcontainers to spin up op-reth in Docker, so they
run on a machine executor with docker_layer_caching enabled. op-rbuilder
also needs the tester and op-rbuilder binaries built before tests run.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(rollup-boost): use ephemeral ports in flashblocks inbound tests

Hardcoded ports 8080/8081 caused flaky failures when leftover test
processes held the socket. Both helpers now bind to 127.0.0.1:0 and
derive the URL from the OS-assigned port via local_addr().

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(rollup-boost): remove unused imports in rpc and subscriber

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(rollup-boost): explicitly send pongs in ping server test helper

The write half of the WebSocket was dropped after split(), so tungstenite
could not send automatic Pong responses. The FlashblocksReceiverService
has a 2000ms pong timeout, causing it to disconnect before the test could
collect 5 pings. Now the server explicitly sends Message::Pong when
send_pongs is true.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* ci(rust): restore rust-lint-vendored job dropped in merge

The rust-lint-vendored job definition was accidentally dropped during
conflict resolution when merging origin/develop into this branch.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* ci(rust): use nightly rustfmt for op-rbuilder and rollup-boost lint

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(rollup-boost): apply nightly fmt and remove unused imports in rpc

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(rollup-boost): add clippy.toml to prevent inheriting kona workspace MSRV

The rust/clippy.toml (kona workspace config with msrv=1.94) was being
picked up by cargo clippy when run from rust/rollup-boost/, causing an
MSRV mismatch warning with websocket-proxy's rust-version=1.85.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(op-rbuilder): add clippy.toml to prevent inheriting kona workspace MSRV

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* ci(rust): add clang to rust-test-rollup-boost apt packages

reth-mdbx-sys requires libclang for bindgen.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(rollup-boost): add rustfmt.toml to prevent inheriting kona workspace settings

Without a rustfmt.toml under rust/rollup-boost/, cargo fmt walks up and
picks up rust/rustfmt.toml, which enables nightly-only options
(imports_granularity = "Crate", use_small_heuristics = "Max",
wrap_comments, etc.). Those options diverge sharply from upstream
rollup-boost's stable-rustfmt formatting and cause large reformatting
churn whenever cargo fmt is run inside the vendored tree.

Mirrors the rust/rollup-boost/clippy.toml shim added to stop inheriting
the kona workspace MSRV.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* style(rollup-boost): reformat with stable rustfmt defaults

Re-runs cargo fmt under rust/rollup-boost/ now that the local
rustfmt.toml stops the parent kona workspace config from being
inherited. This reverts the structural reformatting from 0c79d38
(merged use blocks, single-line struct literals, comment rewraps),
which were artifacts of nightly-only options that don't reflect the
upstream rollup-boost project's formatting choices.

The deliberate fixes in 0c79d38 — removing unused imports in rpc —
are preserved.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* revert(rollup-boost): undo nightly fmt churn in vendored crates

Restores rust/rollup-boost/crates/** to upstream-pristine formatting,
undoing the structural reformatting from 0c79d38 and the subsequent
stable-fmt reshuffle in 24d5002. The rust/rollup-boost/rustfmt.toml
shim added in fa8533f keeps cargo fmt from re-introducing this
churn going forward, by blocking inheritance of the kona workspace's
nightly-only rustfmt config (imports_granularity = "Crate",
use_small_heuristics = "Max", wrap_comments, ...).

Preserved from 0c79d38:
  - Two real unused-import removals in
    crates/rollup-boost/src/client/rpc.rs (clap::arg, tracing::error)
    that CI's `cargo clippy -- -D warnings` requires.

Also formats a small block in crates/rollup-boost/src/flashblocks/
inbound.rs that was introduced unformatted by ed0d254.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* ci(rollup-boost): pin rust-toolchain.toml to 1.88.0

Mirrors rust/op-rbuilder/rust-toolchain.toml. Without a local pin,
rust/rollup-boost/ inherits the kona workspace pin (1.94), and would
silently shift whenever kona bumps. Upstream rollup-boost's declared
MSRV is 1.85 (in crates/websocket-proxy/Cargo.toml) but its current
revm/reth dep versions require 1.88, so 1.85 doesn't actually build —
1.88 is the lowest version that compiles.

Pinning to 1.88 surfaced six `clippy::uninlined_format_args` warnings
in upstream-pristine code (auth.rs ×4, rate_limit.rs ×2) that were
suppressed under 1.94's clippy; inline them so `cargo clippy --
-D warnings` stays green.

clippy.toml stays at msrv = "1.85" to reflect upstream's declared MSRV
contract (what consumers of websocket-proxy are promised), independent
of what toolchain we build with locally.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* ci(rust): silence needrestart in rust-test-vendored apt step

CircleCI's machine executor (Ubuntu 22.04/24.04) ships needrestart by
default, which hooks into apt-get install and can prompt for service
restarts — slowing CI and sometimes causing it to hang. Setting
NEEDRESTART_MODE=a switches needrestart to automatic mode (no prompts),
and DEBIAN_FRONTEND=noninteractive suppresses any debconf prompts the
installed packages might raise.

Both are passed inline on the sudo invocation so they survive sudo's
default env_reset behavior.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(rollup-boost): unflake rpc + proxy tests on CI

- Move `test_invalid_args` out of `client::rpc` unit tests into
  `tests/cli.rs`. As an integration test, Cargo automatically builds
  the `rollup-boost` binary and sets `CARGO_BIN_EXE_rollup-boost`;
  as a unit test, the binary was never built and CI failed with
  `NotFoundError { path: ".../target/debug/rollup-boost" }`.
- Apply `#[serial_test::serial]` to `proxy::tests` so the shared
  `MockHttpServer` harness stops racing itself across tests. Drops
  the leading 1s sleeps that were papering over the same race
  (the cause of the intermittent `test_forward_miner_set_extra`
  "connection closed before message completed" failure).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore(rollup-boost): drop leftover commented sleeps in proxy tests

Follow-up to e303b98: with #[serial_test::serial] now applied,
the 1s sleeps that papered over the MockHttpServer race are
unnecessary even as comments.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* _

* _

* add deps to docker base image

* remove dep building and installing

* _

* ci(rust): restore clang apt install for rust-test-vendored jobs

rust-test-vendored runs on the machine executor, not the ci-base-clang
docker image, so libclang isn't available for reth-mdbx-sys's bindgen
build script.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* ci(rust): drop rust-test-vendored jobs for op-rbuilder and rollup-boost

Removes the test workflow entries and the rust-test-vendored job
definition (no remaining users).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Einar Rasmussen <einar@oplabs.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…optimism#20778)

* feat(op-interop-filter): expose query API under interop namespace

Register the QueryFrontend under the new "interop" namespace alongside
the existing "supervisor" namespace. The supervisor namespace is kept
for backwards compatibility with execution clients (op-geth, op-reth)
that still call supervisor_checkAccessList; new callers should migrate
to interop_checkAccessList.

Refs ethereum-optimism#20005

* feat(op-reth): call interop_checkAccessList instead of supervisor_checkAccessList

The interop filter now exposes the access-list check under the "interop"
RPC namespace; the deprecated "supervisor" namespace is being removed.

Refs ethereum-optimism#20005

* feat(op-interop-filter): drop deprecated supervisor namespace

Hard cutover: op-interop-filter now exposes the query API only under
the "interop" namespace. The "supervisor" namespace alias is removed,
along with its tests. op-reth was already migrated to call
interop_checkAccessList in d6bf312; any other clients must be
updated in a coordinated upgrade.

Also updates the legacy-format flag log/usage text to reference
interop_checkAccessList for accuracy now that the method name has
changed.

Refs ethereum-optimism#20005

* test(op-acceptance-tests): skip interop-filter presets on op-geth

The interop filter only exposes the interop_ namespace; op-geth still
calls supervisor_checkAccessList and so its EL ingress filter call
fails (and every tx gets filtered out) when the in-process filter is
enabled. Interop is only supported with op-reth, so skip the test
implicitly whenever WithInteropFilter() is requested on op-geth.
Test code stays simple — no per-test skip line needed.
…x) (ethereum-optimism#20704)

* op-reth: bump reth dep to paradigmxyz/reth#24159 head

Tries out the FCU backfill-target change from
paradigmxyz/reth#24159 (head e8c29c98).

* op-reth: adapt to upstream reth API changes from rev bump

The reth rev bump in the previous commit pulled in upstream changes
beyond the FCU patch itself. Adapt op-reth so it builds:

- FullConsensus::validate_block_post_execution: accept new
  block_access_list_hash: Option<B256> param (ignored on OP).
- BlockAssemblerInput::new: pass None for the new
  block_access_list_hash arg.
- BlockBuilderOutcome: destructure the new block_access_list field.
- BuiltPayloadExecutedBlock: hashed_state/trie_updates fields are now
  Arc<...> directly (no Either wrapping); drop the `either` dep.
- PayloadTypes::block_to_payload: accept new bal: Option<Bytes> param.
- PayloadTypes::ExecutionData: add From<BuiltPayload> impl for
  OpExecData and CustomExecutionData (custom-node example).
- engine.rs OpEngineApiServer: add BalProvider to Provider bounds.
- Tests: wrap discv5_port/discv5_port_ipv6 assignments in Some(...)
  since they're now Option<u16>.

* op-reth: advance reth dep to main HEAD after #24159 merge

The FCU backfill-target fix merged upstream as paradigmxyz/reth#24159
(merge commit fc59451f). Bump the rev to current main HEAD
(81c026181) so we pick up the merged form rather than the PR's
pre-merge branch tip.

The bump pulled in more upstream churn since the prior PR-head rev.
Additional adaptations:

- reth-chain-state: ComputedTrieData::without_trie_input was renamed
  to ::new (paradigmxyz/reth#24184).
- reth-rpc-api: DebugExecutionWitnessApi was removed entirely
  (paradigmxyz/reth#24284, marked "stale debug endpoints"). The
  debug_executePayload endpoint is still wired in op-reth, so vendor
  the one-method trait into op-reth's witness.rs.
…pin test (ethereum-optimism#20837)

The build script previously wrote `[]` to etc/depsets.json on every build,
regardless of KONA_BIND. Combined with a committed `[]` snapshot, this meant
DEPENDENCY_SETS was always empty in default builds — making the embedded-first
lookup in BootInfo::load dead code outside the host-supplied preimage fallback,
which logs an "insecure in production" warning. Default `cargo test` now sees
the real registry-derived depsets, and `kona-client` prestates built without
KONA_BIND now embed them as well.

Build script:

- Move the depsets reset inside the `if kona_bind { ... }` branch so it runs
  alongside the re-derivation it pairs with, instead of clobbering the
  committed snapshot in every build. Default builds now use the committed
  snapshot directly, mirroring how configs.json and chainList.json work.

- Add unconditional `cargo:rerun-if-changed=etc/{chainList,configs,depsets}.json`
  directives. `include_str!` does not register file dependencies with cargo,
  so without these a regenerated snapshot is silently ignored by a cached
  compilation of lib.rs. Also drops the now-redundant gated copies inside
  merge_custom_configs.

Snapshots refreshed against current submodule pin (cc07e96d):
  - etc/depsets.json gains the rehearsal-0-bn cluster {420120009, 420120010}.
  - etc/configs.json gains the corresponding [interop] blocks plus the
    upstream rehearsal-0-bn L1 public_rpc URL change.

Tests:

- Add embedded_depset_for_rehearsal_0_bn_cluster, pinning the registry-derived
  interop cluster against the committed etc/depsets.json snapshot. Asserts
  cluster membership, cluster identity (both peers map to the same value),
  absence of expiry-window override, and the default 7-day MESSAGE_EXPIRY_WINDOW.

- Remove embedded_depsets_empty_by_default — its premise (default builds
  embed no depsets) no longer holds.

Behavior changes worth knowing:

- Custom-devnet builds that supply their own depsets.json now layer additively
  on top of the rehearsal cluster (previously they wrote a custom-only file).
  Overlapping chain ids with differing cluster contents will panic at build
  time via merge_custom_depsets, surfacing what would have been a runtime
  crash in lib.rs's reverse-index.

- Kona prestate hashes change (the embedded-first path now engages in
  production). Downstream pins (op-challenger, standard-prestates.toml) need
  a coordinated refresh in a follow-up PR.

Verified:
- `cargo nextest run -p kona-registry` (no envs): 15/15 pass, rehearsal test
  runs (no skips).
- `KONA_BIND=true cargo build -p kona-registry`: byte-idempotent against
  the committed snapshots (git diff clean after re-run).
- `just test-custom-embeds`: passes; etc/depsets.json is rehearsal +
  fixture clusters after the merge.
- `cargo nextest run -p kona-proof-interop -p kona-genesis -p kona-interop`:
  218/218 pass.
- `cargo +nightly fmt -p kona-registry` and
  `cargo clippy -p kona-registry --tests` clean.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…eum-optimism#20889)

* refactor(interop): move SafetyLevel into op-service/eth/safety

Extracts the SafetyLevel type and its 6 constants (Finalized, CrossSafe,
LocalSafe, CrossUnsafe, LocalUnsafe, Invalid) from
op-supervisor/supervisor/types into a new op-service/eth/safety
sub-package. SafetyLevel is the canonical interop safety lattice
spoken by op-node, op-supernode, RPC clients, and the entire test
tree — it doesn't belong inside a deprecated component.

A sub-package rather than top-level op-service/eth, because
eth/label.go already declares an untyped Finalized constant for the
BlockLabel namespace ("latest"/"safe"/"finalized"). Keeping the two
namespaces in separate packages avoids forcing a type alias that
would conflate the RPC-label and safety-lattice concepts.

Callers (66 files) across op-acceptance-tests, op-supervisor,
op-supernode, op-interop-filter, op-service, op-devstack, rust/kona
tests rewritten to import safety and qualify references as safety.X.
op-service/eth/label.go untouched.

* refactor(safety): rename safety.SafetyLevel to safety.Level

Drops the redundant package prefix from the type name — within the
safety package it's just "Level", read at call sites as safety.Level.
…-optimism#20739)

* chore(deps): bump op-rbuilder and rollup-boost dependencies

Bumps the vendored op-rbuilder and rollup-boost workspaces onto:

- reth at rev `81c026181` (paradigmxyz/reth main HEAD after the FCU
  fix in paradigmxyz/reth#24159), matching the parent rust/ workspace
  pin so the path deps on `../op-reth/crates/*` resolve consistently
- alloy 1.x -> 2.x (alloy-primitives 1.5.6, others 2.0.4)
- revm 31.x -> 38.x
- op-alloy 0.22 -> 2.0, repointed onto the in-monorepo
  `../op-alloy/crates/*` path deps
- op-* crates (op-reth, op-revm, alloy-op-*) repointed onto their
  in-monorepo path deps in both workspace tomls

Updates the cargo-chef Dockerfile, justfile, and rust-toolchain pin
(now 1.94.0 to match the parent workspace) to support the bumped
graph. `rust/op-rbuilder/crates/op-rbuilder/Cargo.toml` adds a
`docker-tests` default feature so the testcontainers-based
integration tests can be opt-out in CI environments without a
docker socket; the parent `rollup-boost` workspace dep is declared
`default-features = false` so cargo's feature unification doesn't
re-enable it via `flashblocks-rpc` under
`cargo test --workspace --no-default-features`. Direct
`cargo test -p rollup-boost` (and upstream `make test`) still pick
up the crate's own defaults.

Source-level adaptations to make this compile, the new CI gates,
and the unrelated proxy-test flake fix are split into follow-up
commits to keep this one purely manifest/lock churn.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore(rust): adapt op-rbuilder and rollup-boost to bumped deps

Source-level changes required to make op-rbuilder and rollup-boost
build and pass the upstream test suite against the bumped reth
(rev 81c026181), alloy 2.x, revm 38.x and op-alloy 2.0 pins from
the preceding commit.

Notable behaviour-bearing pieces (everything else is import-path
renames, new required trait methods, and mechanical fallout):

- bundle-eviction semantics (`op-rbuilder/src/tests/revert.rs`,
  `txpool.rs`): a bundle is now dropped when
  `current_block > block_number_max` (strict greater-than) to match
  the bumped pool semantics. Test assertions rewritten to walk
  through the off-by-one explicitly. `tests/txpool.rs` also bumps
  `max_account_slots` back up to 50 because the bumped `TxPoolArgs`
  default caps single-sender at 16 and the test deliberately
  saturates the pending pool from one signer.

- `new_payload_job` signature + `PayloadConfig.payload_id`
  (`payload_handler.rs` etc): `new_payload_job(attributes)` ->
  `new_payload_job(BuildNewPayload { parent_hash, attributes,
  cache, trie_handle }, id)`.

- `BuiltPayloadExecutedBlock.hashed_state` / `.trie_updates` are
  now `Arc<...>` directly (no `Either` wrapping): drop the
  `either::Either::Left(...)` wrappers in both
  `builders/flashblocks/payload.rs` and
  `builders/standard/payload.rs`. Required by the FCU-rev bump.

- `OpEngineApi` methods now require `BalProvider` on the Provider
  bound (per the upstream `block_access_list_hash` plumbing): add
  the import and the bound in
  `primitives/reth/engine_api_builder.rs`.

- flashblocks-rpc joined the bump: matching code adaptations in
  `cache.rs`, `flashblocks.rs`, `rpc.rs`, `tests/mod.rs`.

- `OpTypedTransaction::PostExec(_)` match arm added in
  `tx_signer.rs` purely for exhaustiveness — the bumped
  `op-alloy-consensus` added a new enum variant. No new SDM /
  PostExec semantics are introduced.

- `payload_tx.send(...).await` -> `try_send(...)` in flashblocks
  payload builder: a slow consumer now drops the new payload
  instead of stalling the builder. Same approach upstream takes.

- Test-flake fix in `rollup-boost/src/proxy.rs`: bump the realistic
  client timeout used by the `MockHttpServer`-backed forward tests
  so they don't intermittently fail on slow CI machines.

- Defensive test-scaffolding cleanup in
  `rollup-boost/src/flashblocks/inbound.rs`: name the previously-`_`
  ping_rx receiver bindings (`_ping_rx`) so the spawned server task
  doesn't panic when it tries to forward a Ping while the test is
  still running.

- `dynamic_with_full_block_lag` (`op-rbuilder/src/tests/flashblocks.rs`)
  assertions relaxed to lower bounds (`>= 2 txs`, `!flashblocks.is_empty()`).
  The bumped reth/alloy builder is fast enough to pack a full flashblock
  when the FCU arrives in the slot's last millisecond, so the original
  `== 2 txs, == 1 flashblock` invariant no longer holds. Mirrors
  upstream's `late_fcu_reduces_flashblocks` bound-based style.

- Rollup-boost source is reformatted via
  `cargo +nightly-2026-02-20 fmt` from the `rust/rollup-boost/`
  workspace. The empty `rust/rollup-boost/rustfmt.toml` sentinel makes
  rustfmt fall back to defaults (deliberately, to avoid inheriting the
  parent kona-tuned `rust/rustfmt.toml`), so source must be formatted
  with defaults applied from inside the vendored workspace — which is
  exactly what `make lint` in CI checks.

After this commit, `cargo check --workspace --all-targets` builds
clean for both `rust/op-rbuilder/` and
`rust/rollup-boost/ --no-default-features`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* ci(rust): gate op-rbuilder and rollup-boost via vendored-checks

Adds a parameterised CircleCI job `rust-vendored-checks` and two
instantiations (`op-rbuilder-checks`, `rollup-boost-checks`) that
mirror the lint + test gates the upstream GitHub Actions enforce,
so the in-monorepo copies don't drift silently from their dep
contracts. Both invoke each crate's `make lint` and `make test`
targets so the lint toolchain pin and feature flags live in the
Makefile, not the CI config.

Three CI-specific accommodations are needed because the CircleCI
Docker executor differs from upstream's Warp 16-vCPU runner:

- `op-rbuilder-checks` runs on `2xlarge` (32 GB) and caps cargo
  test to `RUST_TEST_THREADS=4`. Each parallel test spawns an
  in-process op-reth via `LocalInstance`, so the default 16-thread
  fanout overruns 32 GB and SIGKILL's the binary. Upstream's Warp
  box has ~64 GB and doesn't need the cap.

- `rollup-boost-checks` uses `cargo test --no-default-features`.
  The `docker-tests` default feature added in the deps commit
  gates the 11 testcontainers-based integration tests under
  `src/tests/`, which require `/var/run/docker.sock` (not exposed
  by the CircleCI Docker executor).

- The workspace dep on `rollup-boost` in
  `rust/rollup-boost/Cargo.toml` is declared with
  `default-features = false` so cargo's feature unification
  doesn't transitively re-enable `docker-tests` via
  `flashblocks-rpc` under `--workspace --no-default-features`.
  Direct `cargo test -p rollup-boost` (and upstream `make test`)
  still pick up the crate's own defaults, so upstream behaviour
  is unchanged.

`rust/op-rbuilder/Makefile` and `rust/rollup-boost/Makefile` are
adjusted to pre-build the `rollup-boost` binary before
`cargo test` (because `test_invalid_args` shells out to
`target/debug/rollup-boost` via `assert_cmd::cargo_bin`, which
under the new larger compile graph no longer races the test
correctly) and to expose the same lint/test entry points the
CircleCI jobs invoke.

Also removes the now-redundant `rust-lint-op-rbuilder` /
`rust-lint-rollup-boost` jobs (and the `rust-lint-vendored`
template) from `.circleci/continue/main.yml`. Linting is now
exclusively driven by the new `*-checks` jobs above, which run
the canonical `make lint` — single source of truth, no
duplicated toolchain pin or feature flags.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* docs: update kona prestate build instructions

* remove prestate variant section
…imism#20972)

Go test coverage adds CPU/memory overhead in CI without being used as
a gating signal. Removes -coverprofile/-coverpkg flags from the Go CI
test recipes and drops the cannon and fraud-proofs Codecov uploads.
Contracts (Solidity) coverage is unchanged.
…reum-optimism#20949)

* fix(op-reth): prevent engine sync-target spin after deep unwind

* fix doc

* code improvements

* review fixes
…wrong-block finalize (ethereum-optimism#20877)

In delegated derivation mode, the upstream supplies `(number, hash)` for the
finalized L2 head on every poll, but kona dropped the hash and asked the
engine to finalize whatever it had at that number. If the upstream and the
engine disagree at that height (e.g. an upstream reorg landed before our
local pipeline caught up), the engine silently finalized the wrong block.
EL finalization is irreversible, so this is unrecoverable.

Introduce `FinalizeBlockId` with `ByHash(BlockNumHash)` and `ByNumber(u64)`
variants and thread it from the derivation actor through the engine
processor into `FinalizeTask`. The delegated path now finalizes by hash;
when the engine lacks the requested hash, the task fails loudly with
`BlockNotFound` instead of silently finalizing a stale block.

The local L1-finality path keeps `ByNumber`: the derivation pipeline is the
sole source of truth at that height, so there's no second source to
disagree with — and the canonical L2 hash isn't known at enqueue time
anyway (`L2Finalizer` queues attributes before they're built).
…-optimism#20979)

* chore(docker): switch kona runtime base to chainguard/wolfi-base

* ci: retrigger after acceptance test flake
…thereum-optimism#21008)

* fix(op-reth): use RoInconsistent for op_proofs CLI subcommands

* fix docs
…tability changes (ethereum-optimism#20948)

* refactor(kona/service): move cancellation out of actors; replace start with step; split engine actor

Selectively port the cancellation-token ownership changes from
ethereum-optimism#19141 without adopting that PR's Builder /
InboundData / init() trait pattern.

NodeActor trait:
- Replace `start(self, ctx) -> Result<(), Error>` with
  `step(&mut self) -> Result<(), Error>`.
- Drop the StartData associated type and the CancellableContext trait.
- The orchestrator macro (`spawn_and_wait!`) now owns the umbrella
  CancellationToken, the loop, and the select! against `cancelled()`;
  no actor sees a cancellation primitive.

Actor migrations:
- Derivation, DelegateDerivation, L1Watcher, Sequencer: drop the
  cancellation_token field + CancellableContext impl; move loop-local
  state onto self (tickers, payload-to-seal, last seal duration, etc).
- Network: take a live NetworkHandler at construction; build/start the
  libp2p swarm in RollupNode::start so the constructor stays sync. The
  NetworkInboundData bundle is deleted in favor of injecting senders
  individually.
- Rpc: become non-generic. Module assembly and the initial server
  launch move upstream; the actor holds config + modules + handle and
  relaunches up to RpcBuilder::restart_count on stop. A Drop impl calls
  ServerHandle::stop() so graceful cancellation shuts the jsonrpsee
  server cleanly.

Engine actor restructure:
- The fan-out EngineActor (which only routed EngineActorRequest
  variants into one of two sub-tasks) is deleted.
- EngineProcessor is promoted to EngineActor; EngineRpcProcessor is
  promoted to EngineRpcActor. Both run as first-class peers under
  spawn_and_wait!.
- EngineProcessingRequest takes over the freed name EngineActorRequest;
  the old fan-out EngineActorRequest enum and its RpcRequest variant
  are deleted (the rpc client sends EngineRpcRequest directly).
- EngineRequestReceiver and EngineRpcRequestReceiver placeholder traits
  (testing-only scaffolding per their own doc comments) are deleted.
- No more JoinHandle polling, is_finished() checks, or PhantomData
  generics in the engine actors.

RollupNode::start:
- Single CancellationToken owned by the macro; no actor receives it.
- All cross-actor channels (mpsc + watch) created at the top of start()
  in one visually-grouped block.
- Actor construction broken out into five build_* helpers
  (build_engine_actors, build_derivation_actor, build_l1_watcher,
  build_sequencer, build_rpc_actor) plus three private type aliases.
- create_engine_actor helper deleted (inlined into build_engine_actors).

External callers:
- bin/node and examples/gossip: build the swarm handler upstream and
  spawn a step loop on a tokio task. Fixes a pre-existing bug in
  bin/node's net subcommand where the prior `network.start(()).await?`
  blocked forever, making subsequent interval-poll code unreachable.
- Network/sequencer integration tests: TestNetworkBuilder::build is now
  async; TestNetwork holds the four inbound senders individually.
- SequencerActor::new tests pass `block_time: 2` to avoid
  tokio::time::interval(0) panicking.

Verification:
  cargo build -p kona-node-service:                                            0 errors
  cargo check --all-targets -p kona-node-service -p kona-node -p example-gossip: 0 errors
  cargo test --lib -p kona-node-service:                                       109 passed
  cargo test --test integration test_p2p_network_conn:                         passed
  cargo test --test integration test_sequencer_network_conn:                   passed

* refactor(kona/service): make RpcActor generic over server launcher

Introduces RpcServerLauncher + RpcServerHandle traits so the actor's
relaunch and shutdown logic can be unit-tested with a controllable mock
instead of a real jsonrpsee server. The production path is unchanged: a
new JsonrpseeServerLauncher wraps RpcBuilder and produces a real
ServerHandle. Adds six unit tests covering the restart budget, failed
relaunches, and the Drop-stops-handle path. Also documents that RollupNode
shutdown is unordered, and that L1WatcherActor's builder intentionally
returns impl NodeActor because its block-stream type is unnameable.

* refactor(kona/service): drop RollupNode::engine_config accessor

The accessor's name shadowed the field of the same name, making
self.engine_config() and &self.engine_config visually ambiguous at
the only call site. Since the accessor only cloned the field, callers
can clone inline.

* docs(kona/service): clarify NetworkActor::new live-handler contract

Constructing the actor with an unstarted handler causes step() to hang
or fail on the first gossip poll. The constructor stays sync to keep
NodeActor minimal, so the live-handler invariant lives in the caller —
document that explicitly.

* fix(kona/service): unbreak rust-docs intra-doc link in rpc/launcher

The doc comment referenced crate::service::node::RollupNode, but service
is a pub(crate) module so the path is not part of the documented graph.
RollupNode is re-exported from the crate root; link there instead.

* refactor(kona/service): inject delegate-derivation deps via traits

DelegateDerivationActor used to take its two external dependencies —
the sync-status fetch client and the L1 chain provider — by concrete
type, so the actor's validation logic (sync-status fetch, L1
consistency check, conditional forwarding) could not be exercised
without standing up real HTTP and RPC clients. That is why the actor
has no unit tests today.

Introduces a one-method DerivationDelegateProvider trait, generalizes
the L1 provider to any kona_derive::ChainProvider, and threads the two
generics through the actor and its enum wrapper in RollupNode. The
production path is unchanged: DerivationDelegateClient implements the
new trait and AlloyChainProvider already implements ChainProvider.

No new tests in this commit — the DI seam alone unlocks future test
work without committing to a specific test matrix here.

* refactor(kona/engine): narrow EngineRpcActor to a read-only client trait

EngineRpcActor previously held an Arc<EngineClient_>, giving it access
to the full Engine API surface — including mutation methods like
forkchoiceUpdated, newPayload, and getPayload that an RPC query actor
must never call. Constrain the actor to a new EngineRpcClient trait
exposing only the two methods EngineQueries::handle actually needs:
l2_block_by_label and get_storage_hash (a narrowed projection of
get_proof that returns just the storage hash field used to compute the
L2-to-L1 message-passer storage root pre-Isthmus).

A blanket impl of EngineRpcClient for every T: EngineClient keeps
production wiring (OpEngineClient) unchanged; only the actor's static
type bound has tightened. Tests can now implement the two-method trait
directly instead of the entire EngineClient/OpEngineApi surface.

Also rename the field engine_client -> engine_rpc_client to match the
new narrowed responsibility.

* refactor(kona/service): rename NetworkActor channel fields for consistency

All receiver fields now share the _rx suffix:
- signer        -> unsafe_block_signer_rx
- p2p_rpc       -> p2p_rpc_rx
- admin_rpc     -> admin_query_rx

publish_rx and unsafe_block_rx already followed the convention.

Also rename the local select! binding signer -> unsafe_block_signer
so it no longer collides with self.handler.signer, which represents a
different concept (the local block-signing key, not an address).

Call sites are positional so no caller updates required.

* docs(kona/service): describe NetworkActor live-handler invariant abstractly

Rewrite the constructor doc comment so it describes the precondition
(the libp2p swarm must already be built and started) rather than naming
the specific NetworkBuilder method chain. The trade-off rationale —
sync constructor over an init() trait method — is retained.

* test(kona/service): drop real-server tests from RpcActor

test_launch_no_modules, test_launch_with_modules, and
test_real_launcher_smoke all bound real localhost sockets via
jsonrpsee. Unit tests should not spin up actual servers; the mock-driven
RpcActor tests still cover the restart/stop logic, and the production
JsonrpseeServerLauncher is exercised end-to-end by integration tests at
the RollupNode level.

With the only remaining users of the free `launch` function now inside
launcher.rs itself, drop its pub(crate) visibility too.

* PR feedback
Adds rust/UPDATING-RETH.md covering when and how to bump the reth git
rev in the workspace: prefer upstream release tags, fall back to merge
commits on main, avoid PR branch tips. Includes the practical "use
cargo update reth-chainspec, not -p reth" gotcha and a list of common
upstream-churn categories to expect.

Links to it from docs/ai/rust-dev.md with agent-specific tips on the
iterative compile-and-adapt workflow.

Adds code comments at OpPayloadTypes::block_to_payload and
From<OpBuiltPayload<N>> for OpExecData explaining why they're kept as
parallel conversion paths (mirroring upstream EthPayloadTypes) rather
than delegating to each other — the BAL travels differently in each
and silent drops would corrupt payloads once OP gains BAL support.
@ClaytonNorthey92 ClaytonNorthey92 force-pushed the clayton/cherry-pick-rust-2 branch from a8bb7c8 to 09f19c8 Compare June 25, 2026 18:18
@ClaytonNorthey92 ClaytonNorthey92 force-pushed the clayton/cherry-pick-rust-2 branch from 224733d to 8fd348e Compare June 25, 2026 19:12
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.