Skip to content

Inomurko/opreth v1.11.5 fix#3

Closed
InoMurko wants to merge 219 commits intobranch-op-reth/v1.11.5from
inomurko/opreth-v1.11.5-fix
Closed

Inomurko/opreth v1.11.5 fix#3
InoMurko wants to merge 219 commits intobranch-op-reth/v1.11.5from
inomurko/opreth-v1.11.5-fix

Conversation

@InoMurko
Copy link
Copy Markdown
Collaborator

A fork of ethereum-optimism@cba7aba
op-reth/v1.11.5

001138754299.dkr.ecr.us-west-2.amazonaws.com/op-reth:v1.11.5-fix-b773f0e0

ajsutton and others added 30 commits April 1, 2026 20:31
…thereum-optimism#19791)

* feat(op-e2e): convert faultproofs tests from CANNON to CANNON_KONA game type

Switch all op-e2e faultproofs tests to use CANNON_KONA (game type 8) and
SUPER_CANNON_KONA (game type 9) instead of CANNON (0) and SUPER_CANNON (4).
This exercises the kona-host/kona-client path rather than op-program.

Key changes:
- Register game type 8 in e2e allocs with kona prestate hash
- Add WithCannonKona and WithSuperCannonKona challenger helpers
- Parameterize NewTraceProviderForTest to accept explicit vm config/executor
- Update all dispute game helpers to use kona config and KonaExecutor
- Set CannonKonaAbsolutePreState path in applyCannonKonaConfig
- Update runCannon, multi_test, and interop proposer to use kona
- CI: add rust-binaries-for-sysgo dependency for kona-host binary

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

* fix(ci): add rust-workspace-binaries to develop-fault-proofs workflow

The develop-fault-proofs workflow is standalone and doesn't include the
rust build jobs from the main develop workflow. Add rust-workspace-binaries
directly so kona-host is available for op-e2e-cannon-tests.

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

* feat(op-e2e): register SuperCannonKona game type via kona prestate in interop migration

Pass the kona prestate hash in the interop migration config so the V1
migrator registers SUPER_CANNON_KONA (type 9) on the dispute game factory.
This allows the proposer to create type 9 games and the challenger to
respond using kona-host.

- Add DisputeKonaAbsolutePrestate to L2Config
- Pass CannonKonaPrestate in MigrateInterop chain configs
- Set kona prestate hash in interop recipe

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

* fix(op-e2e): use KonaSuperExecutor for super cannon tests

The super cannon tests run in interop mode with multiple L2 chains.
KonaExecutor only supports single-chain mode and rejects multiple L2s.
Use KonaSuperExecutor which passes the --l2-node-addresses flag for
multi-chain support.

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

* fix(op-chain-ops): fix goimports alignment in interopgen

Align struct fields and literal values to the longest field name
(DisputeKonaAbsolutePrestate) to satisfy goimports formatting.

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

* fix(cannon): filter PreimageLargerThan by keccak key type

In tests, kona-host loads the L1 config as a local preimage (type 0x01) which can
be >1.4MB. This caused --stop-at-preimage-larger-than to stop at the
L1 config instead of the actual large keccak batch data, preventing the
challenger from uploading the preimage via the large preimage path.

Two changes:
- cannon: when both --stop-at-preimage-type and --stop-at-preimage-larger-than
  are specified, AND the conditions instead of treating them as independent OR
- op-challenger: PreimageLargerThan now also passes --stop-at-preimage-type
  keccak to filter out local preimages

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

* ci: add kona-host binary verification step

Add a diagnostic step to verify kona-host is available and runnable
on the CI machine executor before running tests. Checks ldd output
to diagnose potential libc compatibility issues.

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

* fix(ci): build kona-host natively on machine executor

The kona-host binary built in the Docker-based rust-build-binary job
requires GLIBC_2.38, but the CircleCI machine executor has an older
glibc. Build kona-host directly on the machine executor to ensure
binary compatibility.

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

* fix(ci): switch fault proof tests from machine to docker executor

The kona-host binary built in the Docker-based rust-build-binary job
requires GLIBC_2.38, but the CircleCI machine executor has an older
glibc. Switch to a Docker executor using the same base image so the
workspace-attached kona-host binary is compatible.

Use 2xlarge Docker resource class (16 vCPU/32GB) to match the memory
of the previous machine xlarge executor (8 vCPU/32GB).

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

* fix(op-e2e): correct kona interop prestate hash and add preimage verification logging

- Fix DisputeKonaAbsolutePrestate in interop recipe to use the actual
  kona interop prestate hash instead of the op-program prestate hash
- Add preimage data verification and logging in SuperCannonGameHelper
  ChallengeToPreimageLoad to aid debugging when FindStep returns a
  step without preimage data

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

* fix(op-devstack): remove redundant CannonKonaAbsolutePreStateBaseURL

When CannonKonaAbsolutePreState (file path) is set, the prestate source
uses SinglePrestateSource and never consults the base URL. Remove the
dead assignment to match how applyCannonConfig handles it.

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…execution (ethereum-optimism#19850)

During `re_execute_deposit_only` in the consolidation loop, kona walks
the transactions trie of the invalid block to extract deposit
transactions. Without first sending an `L2Transactions` hint to the
host, the trie nodes are never pre-fetched into the preimage oracle's
key-value store. This causes `trie_node_by_hash` (called synchronously
via `block_on`) to hang indefinitely waiting for data that was never
requested.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…um-optimism#19849)

The dependency set config contains the message expiry window override
needed for kona to detect expired messages. Without this flag, kona
falls back to the hardcoded 7-day default.

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

* feat: port TestInteropFaultProofs_DepositMessage to op-acceptance-tests

Port the deposit message fault proof test from op-e2e to the
op-acceptance-tests framework. This test verifies that the fault proof
system correctly handles consolidation when a cross-chain interop
message is initiated via an L1 deposit transaction rather than a
regular L2 transaction.

The test deploys an EventLogger on chain A, deposits an emitLog call
via OptimismPortal2 on L1, waits for the deposit to be derived on L2,
then executes the cross-chain message on chain B and validates the
consolidation step through both kona FPP and challenger provider.

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

* chore: delete ported TestInteropFaultProofs_DepositMessage from op-e2e

The valid-deposit variant is now covered by the acceptance test.
The _InvalidExecution variant remains in op-e2e until ported.

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

* refactor: add DepositEOA DSL abstraction for deposit-initiated interop messages

Introduces EOA.ViaDepositTx() which returns a DepositEOA that routes
initiating messages through L1 deposit transactions. This encapsulates
the OptimismPortal2 interaction, L2 derivation wait, and InteropOutput
construction, making deposit-based tests as concise as direct L2 tests.

Refactors RunDepositMessageTest to use the new abstraction, reducing
~70 lines of plumbing to 3 lines matching the pattern used by
RunConsolidateValidCrossChainMessageTest.

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

* refactor: separate generic deposit tx from init message logic in DepositEOA

Extract DepositTx() as a general-purpose method for sending any L2
transaction via L1 deposit, then build SendInitMessage on top of it.
Simplify SendRandomInitMessage to take just rng and eventLoggerAddress.

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

* fix: lint issues — use bigs.Uint64Strict, fix goimports formatting

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

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…thereum-optimism#19885)

The test captured a stale L2 block reference immediately after reorg
detection, then asserted its L1 origin number — which was racy because
the sequencer may not have finished rebuilding with the new L1 view.

Add WaitL1OriginHash to the devstack DSL, which polls until the L2
chain at a given label references a specific L1 block by hash. It
handles the case where the safe head overshoots the target L1 origin
by walking back through L2 blocks.

Replace the racy assertion with WaitL1OriginHash to verify the safe
head actually adopted the new L1 fork. Simplify the verifier check
to just Matched (if ELB's safe head matches EL's, the reorg was
applied correctly). Remove unnecessary divergence checks and Cleanup.

Fixes ethereum-optimism#19884

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ethereum-optimism#19890)

* fix(kona): skip re-validating deposit-only blocks during consolidation

During iterative superchain consolidation, chains that have already been
replaced with deposit-only blocks were still being passed to MessageGraph
for validation. This was unnecessary work since deposit-only blocks
cannot contain executing messages. The Go implementation avoids this via
an isReplaced check before validation.

Track replaced chain IDs and filter them out of the headers passed to
MessageGraph::derive, matching the Go approach. The assert in
re_execute_deposit_only is retained with a better error message since it
now represents a true invariant violation.

Adds a test verifying that executing messages referencing initiating
messages from a replaced (filtered-out) chain still resolve correctly
via the provider.

Closes ethereum-optimism/optimism-private#501

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

* fix(kona): remove redundant deposit-only assert in re_execute_deposit_only

With replaced chains filtered out before MessageGraph::derive, a
deposit-only block cannot reach re_execute_deposit_only through normal
flow. Remove the assert that checked every block's transactions for this
impossible case.

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

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ism#19839)

* feat(op-supernode): persist full Output in DenyList for optimistic root computation

Made-with: Cursor

* address PR comments

Made-with: Cursor
…nd oversized payloads (ethereum-optimism#19904)

Add two bounds checks to `read_tx_data` before indexing into the slice:

1. Reject payloads exceeding `MAX_SPAN_BATCH_ELEMENTS` with
   `TooBigSpanBatchSize`, matching op-node's `rlp.NewStream(r,
   MaxSpanBatchElementCount)` behavior. Without this, kona accepts
   oversized transactions that op-node rejects, causing a consensus
   divergence. (Cantina finding ethereum-optimism#28)

2. Reject truncated payloads where `payload_length_with_header` exceeds
   the remaining buffer, preventing a panic on malformed input. (Cantina
   finding ethereum-optimism#25, item 4)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Before this commit, we had sysgo.Options and presets.Options.
In practice, the sysgo.Options are unused. This commit removes
them.
…thereum-optimism#19894)

* fix(kona): remove obsolete replacement deposit tx from consolidation

The interop spec no longer includes an "optimistic block deposited
transaction" in deposit-only replacement blocks. The supernode already
builds replacement blocks with only the original deposit transactions
(L1Info tx), but Kona was still appending an additional replacement
deposit tx encoding the original block's output root.

This caused a state root mismatch between the supernode's replacement
block and Kona's, making TestInteropFaultProofs_InvalidBlock fail.

Remove the craft_replacement_transaction call and dead code, and
unskip the test.

Closes ethereum-optimism#19411

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

* keep test skipped until dependencies are merged

The test requires ethereum-optimism#19890 (skip re-validating deposit-only blocks)
and the L2Transactions hint fix from develop to pass.

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

---------

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

* feat: port TestInteropFaultProofs_PreForkActivation to op-acceptance-tests

Port the pre-fork activation interop fault proof test from op-e2e to the
op-acceptance-tests framework. The test verifies super-root transitions
produce correct results when the interop fork is scheduled but not yet
active. Remains skipped per ethereum-optimism#16166.

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

* chore: unskip PreForkActivation test

The op-e2e version was skipped pending ethereum-optimism#16166, but the
acceptance test should run to verify the current state.

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

* fix: skip TestInteropFaultProofs_PreForkActivation pending ethereum-optimism#16166

WithSuggestedInteropActivationOffset is a deployer option, which the
supernode proofs preset does not support. The original op-e2e test was
skipped for the same reason. Re-skip until the underlying issue is resolved.

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

* fix: support deployer options in supernode proofs preset

The supernodeProofsPresetSupportedOptionKinds only allowed
optionKindChallengerCannonKona, but WithSuggestedInteropActivationOffset
returns a deployer option. Add optionKindDeployer to the supported kinds,
matching how other supernode presets (twoL2Supernode) already support it.

This unskips TestInteropFaultProofs_PreForkActivation which was incorrectly
skipped due to ethereum-optimism#16166 (a supervisor-based issue
that doesn't apply to the supernode-based acceptance tests).

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

* chore(op-e2e): delete PreForkActivation action test ported to acceptance tests

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

* fix(op-acceptance): send interop messages in PreForkActivation test

The ported PreForkActivation test was missing the interop message
sending that the original action test had. Add back:
- An initiating message on chain A via EventLogger
- An executing message on chain B calling CrossL2Inbox (which reverts
  because interop is not yet active)

To support this, extend SendExecMessage with an opts pattern:
- WithFixedGasLimit: bypasses eth_estimateGas for reverting txs
- WithExpectRevert: asserts ReceiptStatusFailed instead of log count

This ensures the proof system is tested with interop-related
transactions in the blocks, matching the original test's intent.

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

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* docs(ai): add acceptance test guide, skill, and justfile improvements

Add docs/ai/acceptance-tests.md covering how to build dependencies and
run acceptance tests locally. Add a run-acceptance-tests skill for AI
agents. Refactor op-acceptance-tests/justfile to extract build-deps
target and add a lightweight `just test` target for running individual
tests with automatic dependency building. Remove git submodule update
from local builds to avoid reverting in-progress submodule work.

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

* fix(ai): address PR review — deduplicate skill/doc, add mise exec prefix

Slim down the acceptance test skill to a thin wrapper that @-includes the
doc. Add `mise exec --` prefix to all just commands since AI agent shells
don't have mise activated. Document mise setup in dev-workflow.md.

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

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…19899)

* fix(op-reth): stabilize flaky TestExecutePayloadSuccess

Wait for the validator to sync the sequencer's blocks before querying
its state. The funder creates blocks on the sequencer, but the validator
may have updated its unsafe head before fully processing the block state,
causing "no state found" errors in PayloadExecutionWitness.

This matches the pattern used by other tests in the same package
(TestDebugExecutionWitness, TestStorageProofUsingSimpleStorageContract).

Closes ethereum-optimism#19898

* fix(op-reth): improve comment accuracy in execute_payload_test

Clarify that the race is with the proofs ExEx store, not native state.

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

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
reference historical proofs guide in op-geth deprecation notice
…ptimism#19795)

* refactor(contracts): remove OPCMv1 from all Solidity code

Delete OPContractsManager v1 contract, interface, tests, snapshots,
and all v1/v2 branching logic. OPContractsManagerV2 is now the sole
OPCM — all deploy scripts and test infrastructure use V2 exclusively.

Key changes:
- Delete OPContractsManager.sol (2203 lines, 7 inner contracts)
- Gut IOPContractsManager.sol interface to empty
- Remove DevFeatures.OPCM_V2 flag and Constants.OPCM_V2_MIN_VERSION
- Remove AddGameType.s.sol (v1-only script)
- Remove opcm-upgrade-checks (v1-only CI check)
- Update all deploy scripts to unconditionally use V2 types
- Update all test files to remove v1 branches and assertions
- Delete 12 v1 snapshot files (ABI + storage layout)

V2 contracts in src/L1/opcm/ are untouched (zero V1 dependencies).

This is PR 1 of the OPCMv1 removal series. Go code and CI matrix
changes follow in subsequent PRs.

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

* fix(contracts): keep deprecated v1 struct fields for Go ABI compat

Add back v1 OPCM fields as address/bytes32 placeholders in Solidity
script structs to maintain ABI compatibility with Go op-deployer.

- DeployImplementations.Output: 6 deprecated address fields (always zero)
- ReadSuperchainDeployment.Input: opcmAddress field (ignored)
- ReadSuperchainDeployment.Output: 5 ProtocolVersions fields (always zero)

These fields are never populated — they exist solely so Go's ABI
encoding matches the Solidity struct layout. They will be removed
atomically with the Go struct fields in a follow-up PR.

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

* fix(op-deployer): remove v1 OPCM branching to match Solidity changes

Update Go op-deployer to unconditionally use OPCMv2 instead of
branching on the OPCM_V2 dev feature flag, matching the Solidity
contract deletion.

- opchain.go: unconditionally use OpcmV2Impl instead of defaulting
  to v1 OpcmImpl
- init.go: update ReadSuperchainDeployment call for new struct layout
- artifacts.go: point Opcm mapping to V2 artifact, remove 5 deleted
  v1 sub-contract artifact mappings
- Tests updated to match new behavior

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

* fix(op-deployer): populate OpcmImpl with v2 address for downstream compat

Since v1 OPContractsManager is deleted, dio.Opcm is always zero.
Populate OpcmImpl with dio.OpcmV2 so downstream consumers
(op-devstack, e2e tests) get a valid OPCM address.

The OpcmImpl field will be renamed/removed in the follow-up Go PR.

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

* fix(op-devstack): remove v1 migrate path, use v2 migrator ABI

The v1 OPCM Go bindings are stale (v1 contract deleted), so
superroot.go can no longer use OPContractsManagerMetaData to ABI-encode
migrate calls. Remove the v1 path entirely and use an inline v2
migrator ABI for the migrate call.

- Remove isOPCMV2 version check (always v2 now)
- Remove v1 MigrateInput path with UsePermissionlessGame/GameParameters
- Add OPContractsManagerMigratorABI() helper with inline v2 ABI JSON
- Remove unused deployer import and versionFn var

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

* fix(op-deployer): update test assertions for v1 OPCM removal

- apply_test: OpcmImpl now equals OpcmV2Impl (not zero)
- implementations_test: check OpcmV2 instead of Opcm (deprecated zero field)
- migrate_test: remove opcm-v1 test case from table-driven test
- migrate_test (CLI): skip TestCLIMigrateV1 (v1 contract deleted)

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

* fix(op-devstack): remove unused getInteropCannonKonaAbsolutePrestate

Dead code left behind when v1 migration path was removed.
Caught by go-lint CI check.

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

* fix: update tests for v1 OPCM removal

- Add vm.assume to exclude OPCM address from fuzz inputs in migrate test
  (triggers _onlyDelegateCall instead of expected ProxyAdminOwnerMismatch)
- Change implsOutput.Opcm → implsOutput.OpcmV2 in bootstrap test assertions
  (Opcm field is always zero now that v1 is deleted)
- Add OpcmV2Impl to manual state population in migrate tests so opchain.go
  can find the OPCM address
- Remove v6.0.0-rc.2 upgrade test case (v1 OPCM on Sepolia, embedded
  artifacts no longer support v1 upgrades)

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

* fix(op-devstack): use V2 upgrade path for addGameType

The AddGameType.s.sol script was deleted as part of OPCMv1 removal.
Rewrite addGameTypeForRuntime to use the V2 upgrade path
(UpgradeOPChain.s.sol with UpgradeInputV2/DisputeGameConfig) instead
of the deleted V1 AddGameType script.

Also skip TestAddGameType in manage package since it depends on the
deleted script. The V2 equivalent is TestManageAddGameTypeV2_CLI.

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

* fix(op-devstack): send all 3 game configs in V2 upgrade

OPCMv2.upgrade() requires exactly 3 dispute game configs in order
(CANNON, PERMISSIONED_CANNON, CANNON_KONA). The previous commit
only sent 1 config per game type, causing InvalidGameConfigs revert.

Restructure addGameTypesForRuntime to build all 3 configs in a single
upgrade call: requested game types are enabled, others are disabled.
Also add the required PermittedProxyDeployment extra instruction.

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

* fix: use OpcmV2 in interopgen and apply tests

- interopgen/deploy.go: use superDeployment.OpcmV2 instead of .Opcm
  (v1 field is always zero now). Fixes all interop/devstack tests.
- apply_test.go: TestEndToEndBootstrapApply now uses OPCMV2DevFlag
  and impls.OpcmV2 (v1 path no longer exists).
- apply_test.go: remove "default" (non-V2) test case from
  TestEndToEndBootstrapApplyWithUpgrade.

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

* fix: use V2 migrate input in interopgen, fix apply test

- interopgen/deploy.go: convert MigrateInputV1 to MigrateInputV2 since
  InteropMigration.s.sol no longer supports V1 format. V2 uses
  ChainSystemConfigs + DisputeGameConfigs instead of OpChainConfigs.
- apply_test.go: revert DevFeatureBitmap back to empty (V2 is default
  now, no flag needed). Set SuperchainConfigProxy in intent so the
  pipeline doesn't try to resolve it from OPCM (V2 OPCM doesn't
  expose superchainConfig() directly).

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

* fix(op-deployer): set OpcmV2Impl in init when OPCM is pre-deployed

When an OPCM address is provided via intent.OPCMAddress (pre-deployed),
the init stage only populated OpcmImpl. The opchain stage reads
OpcmV2Impl, which was left as zero, causing "OPCM implementation is
not deployed" error.

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

* chore: regenerate semver-lock.json after rebase

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

* fix(contracts): add missing imports after rebase conflict resolution

DevFeatures and GameType/GameTypes imports were dropped when removing
v1 IOPContractsManager imports during rebase conflict resolution.
Regenerate semver-lock.json. Includes linter auto-fixes.

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

* fix(op-devstack): send all 6 game configs for V2 upgrade

After rebase, the V2 contract now requires 6 game types (including
super root types) instead of 3. Add SUPER_CANNON,
SUPER_PERMISSIONED_CANNON, SUPER_CANNON_KONA as disabled configs.

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

* fix(op-e2e): include tx value in proposer sendTx for init bond

V2 OPCM sets initBonds[PERMISSIONED_CANNON] = 0.08 ether via
DEFAULT_INIT_BOND. DisputeGameFactory.create() requires msg.value
to match the init bond. The test's sendTx was dropping the Value
field from the TxCandidate, sending msg.value=0 which reverts.

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

* fix(interopgen): register SUPER_CANNON in migrate DisputeGameConfigs

The interop migration only configured game type 0 (CANNON) but the
proposer uses game type 4 (SUPER_CANNON) as the respected game type.
DisputeGameFactory.create(4, ...) reverted with NoImplementation
because no implementation was registered for type 4.

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

* fix(op-devstack): register all super game types in migrate

The V1 migrate path registered SUPER_CANNON, SUPER_PERMISSIONED_CANNON,
and SUPER_CANNON_KONA from OpChainConfigs. The V2 path only registered
SUPER_CANNON, causing:
- TestPreinteropSingleChainFaultProofs: challenger can't find
  SUPER_CANNON_KONA implementation for split depth query
- TestProposals: factory has no SUPER_CANNON implementation
  (interopgen path)

Register all 3 super game types in both superroot.go and interopgen
deploy.go migrate paths.

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

* fix: goimports formatting in superroot.go

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

* fix: review improvements — version guards, artifact ABI, stale bindings

- Add version guards to UpgradeOPChain.s.sol and InteropMigration.s.sol:
  require OPCM >= v7.0.0 with descriptive error instead of silent revert
- Replace inline ABI JSON in superroot.go with forge artifact loading
- Remove bindings.Proposal dependency, define Proposal struct locally
- Remove stale op-e2e/bindings/opcontractsmanager.go (v1 dead code)

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

* fix(interopgen): register Super Cannon Kona game type in V2 migration

The V1→V2 migration conversion only registered game types 0 (Cannon)
and 4 (Super Cannon), missing type 9 (Super Cannon Kona). The proposer
creates games of type 9, so TestProposals timed out waiting for a game
that could never be created.

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

* fix(contracts): restore and migrate StandardValidator tests to V2

The test suite was deleted as part of the OPCMv1 removal, but it should
have been migrated to V2 types instead. This restores it with:

- Remove IOPContractsManager (v1) imports, use deploy.cfg() for config
- Remove DevFeatures.OPCM_V2 branching, keep V2 path unconditionally
- Remove v1-only addGameType/newGameInputFactory helpers
- Simplify DelayedWETH tests by removing v1/v2 assertion branches
- Remove unused IBigStepper import

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

* chore: remove narration comments about v1/v2 migration

Strip comments that just explain "this is V2 now" or "OPCMv1 has been
removed" — the code is self-evident after the removal. Kept comments
that explain why deprecated zero-valued struct fields exist (Go ABI
compatibility).

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…#19787)

* ci: run reth and kona against all acceptance tests

Remove the base gate from the op-node/op-reth and kona/op-reth CI jobs
so they run all acceptance tests instead of only the base subset.

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

* op-acceptance-tests: remove gate concept

Gates are no longer needed now that all acceptance tests run for every
implementation variant. Skips are defined inside individual tests instead.

- Remove gate parameter from op-acceptance-tests justfile.
- Remove gate parameter from CircleCI op-acceptance-tests job.
- Remove gates/base.txt.
- Update kona tests justfile and README.

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

* decrease test timeout

* op-acceptance-tests: add skips for op-reth failures

See this workflow. I also reran the failing tests locally to
ensure these aren't simple flakes.

https://app.circleci.com/pipelines/github/ethereum-optimism/optimism/121247/workflows/38caeea6-ffda-4f83-a135-61a3864348bd/jobs/4699628/tests

* op-acceptance-tests: add skips for kona-node failures

See this ci run. The previous commit already skips many of these
since they are op-reth failures. I ran all of the remaining
tests locally and removed the ones that succeeded: all that
remain are the ones that are actual failures or very intermittent
flakes.

https://app.circleci.com/pipelines/github/ethereum-optimism/optimism/121247/workflows/38caeea6-ffda-4f83-a135-61a3864348bd/jobs/4699629/tests

* remove builder_jwts

* flaky

* fix bug

* more fixes

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ptimism#18922)

* contracts: remove deploy config JSON dependency for tests

Remove the requirement for deploy config JSON files (especially
hardhat.json) when running Solidity unit tests. The JSON files were
only used for setting up test environments and are no longer used
for production deployments.

Changes:
- Add `_initDefaults()` function to DeployConfig.s.sol that sets
  hardcoded default values (previously from hardhat.json)
- Modify `read()` to call `_initDefaults()` when passed an empty path,
  and revert with an error when a non-empty path points to a missing file
- Update Deployer.setUp() to call `cfg.read("")` in test context
  (using vm.isContext) to use hardcoded defaults
- Delete all deploy-config/*.json files as they are no longer needed

This makes tests faster by avoiding JSON file I/O and removes the
coupling between test setup and config files.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* contracts: remove validate-deploy-configs CI job and tooling

Remove the legacy deploy config JSON validation infrastructure:
- Delete check-deploy-configs.sh script
- Delete op-chain-ops/cmd/check-deploy-config Go tool
- Remove CI job from CircleCI config
- Remove check from checks.yaml and justfile

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* contracts: remove DEPLOY_CONFIG_PATH from kontrol summary script

The legacy deploy config JSON is no longer used.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* contracts: add KONTROL_CONTEXT env var for kontrol scripts

Add isKontrolContext() helper to Config.sol that checks for KONTROL_CONTEXT
env var. Update Deployer.setUp() to use hardcoded defaults when running in
kontrol context, similar to test context behavior. This allows kontrol
scripts to run without requiring DEPLOY_CONFIG_PATH while maintaining strict
behavior for production scripts.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* contracts: fix formatting after rebase

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

* contracts: remove dead hardhat.json fallback from deployConfigPath

The test-context branch returned a path to the now-deleted
hardhat.json file. Tests no longer call this function since
Deployer.setUp() uses _initDefaults() directly. Remove the
dead branch so deployConfigPath() always requires DEPLOY_CONFIG_PATH.

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

* contracts: remove deploy-config/ fs permission from foundry.toml

The deploy-config/ directory no longer exists, so the read
permission entry is dead configuration.

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

* contracts: use custom error in DeployConfig

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

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
…e op feature (ethereum-optimism#19854)

* feat(alloy-op-evm): upgrade alloy-evm to 0.30.0 and bump version to 0.30.0

Update alloy-op-evm to work with alloy-evm 0.30.0, which removes the
'op' feature and bumps revm to v36. Key changes:

- Remove 'op' feature from alloy-evm dependency
- Bump revm 34->36, op-revm 15->17, and related crates
- Add OpTx newtype wrapper with trait impls (FromRecoveredTx,
  FromTxWithEncoded, IntoTxEnv, etc.) previously in alloy-evm's op feature
- Default OpEvm/OpEvmFactory Tx parameter to OpTx
- Add into_result() to TxResult impl
- Remove set_state_clear_flag (removed in revm 36)
- Handle new BlockEnv::slot_num field (EIP-7843)
- Update BlockExecutorFactory::create_executor signature for new API
- Bump alloy-op-evm version to 0.30.0

* rust: bump reth to e3dbdbb, revm to 36, alloy to 1.8.2, op-alloy to 0.24.0

Upgrade the Rust workspace dependencies:

- reth: v1.11.3 tag -> main @ e3dbdbb
- reth-core: reth-codecs, reth-primitives-traits, reth-zstd-compressors moved to crates.io 0.1.0
- revm: 34 -> 36, op-revm: 15 -> 17, revm-inspectors: 0.34 -> 0.36
- alloy-evm: 0.27.2 -> 0.29.2, alloy main crates: 1.6.3 -> 1.8.2
- alloy-chains: 0.2.30 -> 0.2.33, alloy-eip7928: 0.3.2 -> 0.3.3
- op-alloy crates: 0.23.1 -> 0.24.0, alloy-op-evm: 0.26.3 -> 0.28.0
- rollup-boost: crates.io 0.7.13 -> git bc4518c
- Rust toolchain: 1.92 -> 1.94

Key changes:
- Removed stale op features from reth-db, reth-db-api, reth-primitives-traits, reth-codecs, reth-payload-primitives
- Removed edge feature (no longer in reth)
- Added InMemorySize, Compact, Compress, Decompress, SignerRecoverable impls for OP types in op-alloy-consensus (behind reth-core/reth-codec features)
- Adapted to reth API changes: StateProvider, Decompress, BlockEnv, TxResult, TaskSpawner -> Runtime, PayloadTypes, TryIntoTxEnv, etc.
- Introduced OpExecData/OpPayloadAttrs newtypes for orphan rule compliance with ExecutionPayload/PayloadAttributes traits
- Updated Dockerfile and CI config for Rust 1.94
- Fixed zepter feature propagation

* refactor(op-reth): remove op feature from reth-engine-local

Inline the PayloadAttributesBuilder logic directly into
OpLocalPayloadAttributesBuilder, removing the dependency on the
upstream reth-engine-local 'op' feature flag entirely.

* fix(sysgo): make proof history configurable in op-reth test framework

Make proof history conditional on L2ELConfig.ProofHistory and enabled
by default (matching previous behavior). Also capture stderr from
proofs init to aid debugging if it fails.

* feat(alloy-op-evm): upgrade alloy-evm to 0.30.0, remove op feature, add OpTx/OpTxEnvConverter

- Bump alloy-evm 0.27.2 -> 0.30.0, alloy-op-evm version to 0.30.0
- Bump reth to 082c36e (uses reth-rpc-traits from crates.io)
- Add OpTx newtype + trait impls (FromRecoveredTx, FromTxWithEncoded, IntoTxEnv, TransactionEnvMut)
- Add OpTxEnvConverter for RPC tx conversion without orphan rule issues
- Add reth-rpc-traits impls (FromConsensusTx, TryIntoSimTx, SignableTxRequest) to op-alloy-rpc-types
- Remove alloy-evm op feature dependency throughout
- Fix zepter std feature propagation for reth-rpc-traits
)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ptimism#19880)

* feat(op-supernode): persist full Output in DenyList for optimistic root computation

Made-with: Cursor

* address PR comments

Made-with: Cursor

* feat(op-supernode): return denied block output as optimistic in superroot API

OptimisticOutputAtTimestamp now checks the deny list before falling back
to the local safe block. When a block at a given height has been
invalidated, the original (pre-replacement) block's output is returned
as the "optimistic" output — reflecting what the block would have been
without verification. This gives superroot API callers a meaningful
distinction between the verified and optimistic views.

Adds DenyList.LastDeniedOutputV0(height) to retrieve the most recently
denied OutputV0 at a height in a single DB read.

Made-with: Cursor

* refactor: use OutputV0 instead of OutputResponse in OutputWithRequiredL1

The SuperRootAtTimestampResponse's OutputWithRequiredL1 carried a full
OutputResponse (with L2BlockRef, Version, Status, etc.) when consumers
only ever accessed BlockHash and OutputRoot. Replace with *OutputV0
which directly contains the three output preimage fields (StateRoot,
MessagePasserStorageRoot, BlockHash), eliminating dead weight from the
superroot API.

Made-with: Cursor

* refactor: OptimisticOutputAtTimestamp returns *OutputV0 directly

The only caller immediately converted the OutputResponse into an
OutputV0. Return *OutputV0 from the interface and implementation,
eliminating the intermediate OutputResponse construction. The deny
list path returns the OutputV0 directly; the fallback path now
delegates to OutputV0AtBlockNumber instead of going through the
rollup RPC client.

Made-with: Cursor

* refactor: split OutputWithRequiredL1 into Output and OutputRoot fields

Rename the OutputV0 pointer from OutputRoot to Output and add a
pre-computed OutputRoot (Bytes32) so callers can inspect the hash
at a glance without recomputing it.

Made-with: Cursor
…thereum-optimism#19932)

All prerequisites are now merged to develop:
- ethereum-optimism#19880 (supernode denylist output as optimistic)
- ethereum-optimism#19850 (L2Transactions hint fix)
- ethereum-optimism#19890 (skip re-validating deposit-only blocks)
- ethereum-optimism#19894 (remove obsolete replacement deposit tx)

Test passes locally (all subtests in ~56s).

Closes ethereum-optimism#19411

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ptimism#19931)

The build-rust-release target is called by acceptance test build-deps
but was missing kona-host. Tests like TestInteropFaultProofs_InvalidBlock
invoke kona-host as an external binary from rust/target/release/kona-host,
so a stale binary causes test failures when upstream fixes land.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…reum-optimism#19921)

Before this commit, `TestDemoFail1` would not emit a human-readable
message. This is due to the structured logger escaping all ascii
codes when certain special characters are present (like `=`).

The fix is to not use the structured logger to print test errors.

```go
package pkg

import (
	"testing"

	"github.com/ethereum-optimism/optimism/op-devstack/devtest"
)

func TestDemoFail1(gt *testing.T) {
	t := devtest.ParallelT(gt)
	t.Require().Equal(
		map[string]int{"a": 1, "b": 2, "c": 3},
		map[string]int{"a": 1, "b": 99, "c": 3},
	)
}

func TestDemoFail2(gt *testing.T) {
	t := devtest.ParallelT(gt)
	t.Require().Equal(1, 2)
}
```
* docs: update references from old docs repo to monorepo

The public docs were migrated from ethereum-optimism/docs to the
monorepo at docs/public-docs, but many links still pointed to the
old repository. This updates all 20 references across 12 files:

- GitHub issue links now point to ethereum-optimism/optimism/issues
- create-l2-rollup-example/ links updated to new monorepo path
- git clone command updated to clone the monorepo
- docs.json redirects for CONTRIBUTING.md and STYLE_GUIDE.md updated
- Footer GitHub nav link updated to new docs location
- RPC provider submission link updated

Two commit-pinned redirect URLs in docs.json for granite-changes.mdx
and fp-changes.mdx are intentionally left pointing to the old repo,
as those archived pages were not migrated.

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

* docs: fix cd path after git clone to match monorepo structure

The previous commit updated the git clone URL but missed the
subsequent cd command, which still used the old repo's directory
structure.

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

* docs: fix stale repo references in DOCS_CONTRIBUTING.md and README.md

- Update DOCS_CONTRIBUTING.md to reference the monorepo instead of
  the old ethereum-optimism/docs repo
- Change target branch from `mintlify` to `develop`
- Fix PR creation link to point to the compare page instead of the
  issue template chooser
- Update README.md to say "directory" instead of "repo" and link
  to the monorepo

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

---------

Co-authored-by: Zak <zak@oplabs.co>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…#19900)

Remove the rollup-boost and rollup-boost-types crate dependencies from
the kona workspace. All Engine API v3/v4 calls now route directly to the
L2 execution engine instead of through a rollup-boost middleware proxy.

Operators who need rollup-boost functionality (block builders,
flashblocks, execution mode management) can run rollup-boost as a
standalone sidecar process and point kona-node's --l2 engine URL at it.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
andrewshab3 and others added 28 commits April 12, 2026 16:51
…/revm#3312)

* Update context.rs

* Update handler.rs

* Update frame.rs

* Update handler.rs

* Update context.rs
* refactor!: add `ResultGas` struct to `ExecutionResult`

Replace loose `gas_used` and `gas_refunded` fields in all three
`ExecutionResult` variants with a single `gas: ResultGas` struct that
exposes richer gas accounting: `gas_used`, `gas_refunded`, `gas_spent`
(pre-refund), and `floor_gas` (EIP-7623).

* refactor: simplify ResultGas to store only independent fields

Remove the redundant `gas_used` field from `ResultGas` since it can
always be derived as `gas_spent - gas_refunded`. The struct now stores
only three independent values (gas_spent, gas_refunded, floor_gas) and
exposes `gas_used()` as a method.

* refactor: refine ResultGas field naming and add Display impl

- Rename fields to align with Gas struct methods:
  gas_spent → spent, gas_refunded → refunded, gas_used() → used()
  Eliminates redundant gas.gas_spent pattern (now gas.spent)
- Add #[serde(rename)] to preserve JSON key stability
- Add Display impl for ResultGas (conditionally shows refunded/floor)
- Simplify ExecutionResult Display to delegate to ResultGas Display
- Improve documentation with source mapping table
- Add tests for ResultGas Display and used() method

* feat: add gas limit to ResultGas for self-contained gas accounting

Add `limit` field to `ResultGas` so it contains all gas information
without requiring external context. Also add `remaining()` derived
method (limit - spent) to complement `used()` (spent - refunded).

ResultGas now mirrors the full Gas struct snapshot:
- limit: transaction gas limit
- spent: gas consumed before refund
- refunded: gas refund amount
- floor_gas: EIP-7623 floor gas
- used(): spent - refunded (derived)
- remaining(): limit - spent (derived)

* feat: add `intrinsic_gas` to `ResultGas` and return it from `post_execution`

Add intrinsic_gas field to ResultGas so it carries the initial tx
overhead gas. Change post_execution to return ResultGas directly,
and have execution_result receive a pre-built ResultGas instead of
InitialAndFloorGas.

* chore: fix formatting

* feat: encapsulate ResultGas fields with getters, setters, and builders

- Make all ResultGas fields private
- Add getter methods: limit(), spent(), refunded(), floor_gas(), intrinsic_gas()
- Add builder methods: with_limit(), with_spent(), with_refunded(), with_floor_gas(), with_intrinsic_gas()
- Add setter methods: set_limit(), set_spent(), set_refunded(), set_floor_gas(), set_intrinsic_gas()
- Add derived methods: final_used(), inner_refunded(), final_refunded()

* docs: update ResultGas comments to reflect encapsulated API

- Rewrite struct doc table to reference getter methods instead of fields
- Fix used() doc formula to include floor_gas: max(spent - refunded, floor_gas)
- Fix incomplete refunded field doc, point to final_refunded()
- Remove stale final_used() reference, remove refunded() getter (replaced by inner_refunded)

* chore: fix typo in handler comment

* Update crates/context/interface/src/result.rs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix: correct grammar in handler.rs comment (bluealloy/revm#3422)

* Initial plan

* fix: correct grammar in handler.rs comment

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
…luealloy/revm#3424)

* refactor!: add `logs` field to `Revert` and `Halt` variants of `ExecutionResult`

Logs emitted before a revert or halt were previously discarded. This
preserves them by adding `logs: Vec<Log>` to both variants so that
downstream consumers can inspect pre-failure logs.

* fix: import Vec in op-revm handler for no_std compatibility

* fix: formatting in ExecutionResult logs() and into_logs() methods
…ciary (bluealloy/revm#3455)

Use all_mut() to simultaneously borrow tx (immutable) and chain/journal
(mutable), avoiding an unnecessary deep copy of the enveloped transaction
bytes on every non-deposit transaction.
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…oy/revm#3507)

* feat: add crate-level re-exports for all revm-* dependencies

Re-export all revm-* dependencies as modules via `pub use crate_name;`
in each crate's lib.rs, making them transitively accessible
(e.g., `handler::context::...`, `interpreter::primitives::...`).

Note: in inspector, `handler` crate is re-exported as `evm_handler`
to avoid conflict with the local `pub mod handler`.

* style: fix formatting in bytecode lib.rs
Hooks the freshly imported `rust/op-revm` crate into the Rust workspace as a
local member, swaps the workspace dependency to a path entry, and consolidates
the duplicate `op-revm` / `revm` versions that kona-hardforks was pinning
directly. Drops the upstream `hashbrown` feature (it propagated to
`alloy-primitives/map-hashbrown` under `--all-features` and broke
`reth-testing-utils`) and the unused `readme.workspace` field that the
monorepo workspace does not define. The remaining churn is auto-applied clippy
fixes (`doc_markdown`, `use_self`, `missing_const_for_fn`, `useless_let_if_seq`)
needed to satisfy the workspace's `-D warnings` lint policy.
* all: upgrade op-geth

* update op-geth for pre-regolith changes

* update op-geth for a miner change and a minor change

;)

* defer cancel

* update op-geth again

* op-program: regenerate vm-compat baseline for geth v1.17.2

All new findings pass through pathdb.New which is unreachable in the
Cannon execution environment — op-program uses a memory-backed trie
database, not pathdb.

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

* update op-geth to rc tag

* op-program: add just target to regenerate vm-compat baseline (ethereum-optimism#19951)

* op-program: add just target to regenerate vm-compat baseline

Add `just regenerate-vm-compat-baseline` (Docker) and
`just regenerate-baseline-current` (local) targets that run vm-compat
without a baseline to produce the full report, then normalize it by
stripping assembly-level fields (line, file, absPath) that cause false
positives when they change.

The run-static-analysis.sh script now accepts an optional baseline
argument — when omitted, it runs without --baseline-report.

The Dockerfile gains a VM_COMPAT_TASK build arg (default:
analyze-op-program-client) so the same image can run either analysis
or regeneration.

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

* op-program: update vm-compat-triage skill for new just targets

Update the skill to reference `just regenerate-vm-compat-baseline` and
`just run-vm-compat` instead of raw vm-compat commands. Note that both
require Docker and must be run by the user (Claude cannot run Docker).

Simplify prerequisites — Docker is all that's needed now.

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

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Adrian Sutton <adrian@oplabs.co>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
)

* op-interop-filter: add getBlockHashByNumber RPC

* op-interop-filter: use rpc.BlockNumber instead of custom BlockSelector

Replace the custom BlockSelector type with go-ethereum's rpc.BlockNumber,
which already handles "latest", hex strings, and numeric block numbers.
Unsupported tags (safe, finalized, pending, earliest) are rejected with
a clear error message in the backend.

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

* op-interop-filter: consolidate getBlockHashByNumber tests into RPC test

Move unknown-chain and unsupported-tag test cases into the RPC
integration test and delete the redundant backend unit test. All five
cases now exercise the full RPC stack in a single test function.

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

* ci: retrigger after flaky memory-all-opn-op-reth failure

The memory-all-opn-op-reth job failed with exit status 1 during
sequencer block processing — no assertion failure, passes on develop.

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

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
)

* feat: integrate SysFeature for Interop

* feat: add interop migration functions and eth lockbox to portal2

* chore: rename function to migrateToSharedDisputeGame

* chore: bump snapshots

* fix: use Portal2 in OPCM migrator

* fix: semver bumps from interface change

* fix: only overwrite the lock box when passing non-zero value

* chore: update comments to refer to OptimismPortal2 instead of OptimismPortalInterop

* fix: mismatched names

* fix: enable INTEROP feature flag in v1 OPCM deploy path

* fix: remove casting to OptimismPortalInterop

* chore: remove OptimismPortalInterop dead code

* chore: update comment to remove OptimismPortalInterop

* chore: remove OptimismPortalInterop specific tests since we now test OptimismPortal2 via the feature flag

* fix: restore superRootsActive flag in super-roots withdrawal proof tests

* fix: test name camelCase

* chore: remove OptimismPortalInterop from Initializable tests and remove interface from OPCM_V2

* fix: normalize INTEROP feature in SystemConfig fuzz test

* chore: add references for OptimismPortalInterop removal issue

* chore: remove stale comment about superRootsActive

* fix(portal): bump OptimismPortal2 version and fix OPCM_V2 interop upgrade ordering

Bump OptimismPortal2.version() from 5.4.0 to 5.5.0 so OPCM_V2 can
upgrade from OptimismPortalInterop (5.4.1+interop) without triggering
the DowngradeNotAllowed check.

In OPContractsManagerV2._apply(), set the ETH_LOCKBOX feature on
SystemConfig before upgrading the portal. Unlike OptimismPortalInterop
which blindly sets the ethLockbox, OptimismPortal2.initialize() calls
_assertValidLockboxState() which requires the ETH_LOCKBOX feature flag
and ethLockbox address to be consistent.

Update superRootsActive tests to support both OPCM_V2 (gameType mock)
and legacy (slot 63 manipulation) paths via _enableSuperRootBehavior
helper.

* chore: update checks for superRootActie to be for the INTEROP feature flag

* fix: standard validator assertions to be for Portal2 instead of PortalInterop when OPCM_V2 and Interop feature flags enabled

* fix: change event params back to non-indexed versions

* chore: clean up branching logic for portal/opcm feature flags

* chore: refactor the checks in assertValidPortal

* chore: organize functions by visibility

* fix: implement the _assertValidInteropState helper and add to initalize

* fix: update assert for INTEROP flag instead of superroots active

* chore: add clarification to the comment about the prerequisites to the portal migration functions

* chore: add TODO issue tracking for follow up removal

* fix: add missing OptimismPortal_InvalidInteropState error to IOptimismPortal2

* fix: assertions for the forked upgrade scenario

* refactor: remove OPCM_V2 feature flag, make V2 canonical

* Fix: docs

* Fix: some more doc-related issues

* fix: check ETH_LOCKBOX in _isUsingInterop and bump semver

Update _isUsingInterop() to require both INTEROP and ETH_LOCKBOX
features, preventing migrate* functions from executing if lockbox
is misconfigured at runtime.

Bump OptimismPortal2 5.5.0 -> 5.6.0
Bump OptimismPortalInterop 5.4.1+interop -> 5.5.1+interop

* fix: use assertTrue/assertFalse instead of vm.assertTrue/vm.assertFalse

* chore: forge fmt and snapshots bump

* fix: update check for using superroots in the dsl

* ci: retrigger workflow

---------

Co-authored-by: Rodrigo Araujo <rod.dearaujo@gmail.com>
…thereum-optimism#19986)

* fix(op-reth): wait for proofs ExEx store before debug_executePayload

The previous fix (PR ethereum-optimism#19899) added WaitForBlockNumber to sync the
validator's EL head, but the test still flakes because
debug_executePayload depends on OpStateProviderFactory which reads from
the proofs ExEx store. The ExEx processes ChainCommitted notifications
asynchronously, so the EL head can advance before the store has indexed
the block. Poll debug_proofsSyncStatus to wait for the ExEx to catch up
before calling the RPC.

Fixes ethereum-optimism#19898

* docs(ai): add op-reth E2E test prerequisites to rust-dev.md

Document the build steps needed to run op-reth E2E tests locally:
forge artifacts and release binary. The test harness only searches
target/release/, so debug builds don't work.

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

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… targets (ethereum-optimism#19988)

* chore(op-devstack): fix rust binary error message and add debug build target

- Fix error message in rust_binary.go to reference the correct just
  target (`cd rust && just build-<binary>`) instead of the non-existent
  `just build-rust-debug`
- Search debug/ in addition to release/ when resolving pre-built Rust
  binaries, with release taking priority
- Add `build-op-reth-debug` just target for faster local E2E test
  iteration (debug builds compile much faster than release)

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

* chore(op-devstack): default JIT build to debug mode

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

---------

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

* chore: delete OptimismPortalInterop contract and all references

* bump semver
…ows and fix some minor issues (ethereum-optimism#19960)

* fix token and circleci utils version

* improve comment

* add contract changed var

* add back required contracts ci job

* fixing conditions

* add missing conditions
ethereum-optimism#19985)

* fix(op-acceptance-tests): use op-rbuilder in flashblocks transfer test

Subscribe to the op-rbuilder flashblock stream instead of rollup-boost because rollup-boost may intentionally drop flashblocks.

Buffer the transaction result channel so cleanup does not deadlock if the test times out before reading it, and update the test comment to match the actual assertion.

* fix(acceptance): match flashblock transfer by receipts
…s, CI, docs (ethereum-optimism#19919)

* chore: remove OpcmImpl compat shim, ReadSuperchainDeployment v1 fields, CI matrix, docs

Mechanical cleanup of OPCMv1 references that don't touch op-deployer
manage/upgrade logic:

- Remove OpcmImpl and OpcmContractsContainerImpl fields from
  ImplementationsContracts — all consumers now use OpcmV2Impl
- Remove ReadSuperchainDeploymentInput.OpcmAddress and
  ReadSuperchainDeploymentOutput ProtocolVersions fields (closes ethereum-optimism#18612)
- Remove corresponding deprecated Solidity struct fields in
  ReadSuperchainDeployment.s.sol
- Remove OPCM_V2 CI matrix entries (no-op since Solidity flag deleted);
  keep ZK_DISPUTE_GAME, CANNON_KONA, SUPER_ROOT_GAMES_MIGRATION as
  standalone entries
- Delete empty IOPContractsManager.sol stub
- Remove stale semgrep excludes for deleted file
- Update docs with V2 paths

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

* fix: fix indentation in migrate_test.go

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

* docs: update OPCM docs for V2 architecture

- opcm.md: update architecture section with V2 contract names
  (OPContractsManagerV2, OPContractsManagerUtils, OPContractsManagerContainer,
  OPContractsManagerMigrator) and accurate mermaid diagram showing V2 entry
  points (deploy, upgrade, upgradeSuperchain, migrate)
- versioning.md: fix dead pinned link to implementations() function
- migrating-permissionless.mdx: replace addGameType() reference with
  upgrade() via DisputeGameConfig; fix "this method will" to describe
  actual V2 behavior (register impl on DGF + set init bond)
- op-deployer-upgrade-deprecation.mdx: fix dead link to deleted v1 file

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

* ci: retrigger pipeline for required-contracts-ci fix

---------

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

* fix(kona): return error instead of panic on unknown batch type

BatchType::from(u8) panicked on unknown batch type values. This is a
protocol deviation — the OP spec requires unknown batch versions to be
treated as invalid and ignored, matching op-node's behavior of returning
an error and skipping to the next channel.

Replace From<u8> with TryFrom<u8>, add UnknownBatchType variant to
BatchDecodingError, and propagate the error in Batch::decode.

Fixes ethereum-optimism/optimism-private#484

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

* fix(kona): rustfmt

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

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ethereum-optimism#20021)

Adds an action test that verifies the fault proof program correctly
handles a batcher address change within the channel_timeout window.

The test:
1. Batcher A submits a batch
2. Batcher address is changed from A to B on L1
3. Batcher B submits a batch
4. The fault proof program re-derives the chain from scratch

If the pipeline uses the wrong system config on reset (batcher B from
the safe head instead of batcher A from the walked-back block), it
rejects batcher A's batch and derivation diverges from op-node.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… sequencer drift (ethereum-optimism#19994)

* feat(kona-genesis): add rollup_config_override feature for custom max sequencer drift

Add a `rollup_config_override` feature to kona-genesis that overrides
the Fjord max sequencer drift to 2892s for chains building only on
finalized L1 blocks, where L1 finality delays can exceed the standard
1800s limit.

This replaces ethereum-optimism#18859
until the proper solution is in place, see
ethereum-optimism#18859 (comment)

Since this is only a temporary solution, I've chosen the small and
primitive solution over a more generic approach.

* feat(kona-genesis): make fjord_max_sequencer_drift a configurable RollupConfig field

Replace the hardcoded constant override with a runtime-configurable
fjord_max_sequencer_drift field on RollupConfig, gated behind the
rollup_config_override feature flag. This allows chains that build
on finalized L1 blocks to set a custom max sequencer drift via config
rather than a compile-time constant.

* Format with correct toolchain version

* fix(kona-registry): add missing fjord_max_sequencer_drift to test config initializers

* fix(kona-registry): propagate rollup_config_override feature and gate imports

The rust/kona registry crate was missing the rollup_config_override
feature, causing CI failures when building with --all-features. The
FJORD_MAX_SEQUENCER_DRIFT imports also need to be conditional to avoid
unused import warnings when the feature is disabled.

---------

Co-authored-by: Karl Bartel <karl.bartel@clabs.co>
…9962)

* rust(op-revm): add README and no_std CI coverage

Adds a top-level README for the freshly imported `op-revm` crate documenting
what it provides, its provenance, available features, and basic build / test
commands. Also adds `op-revm` to the workspace's `just check-no-std`
package list so the existing `rust-check-no-std` CircleCI job mirrors the
upstream revm `riscv32imac-unknown-none-elf` no_std check on every Rust PR.

* docs(op-revm): address review + add rust docs page

- Drop the hashbrown note from rust/op-revm/README.md per review.
- Add docs/public-docs/rust/op-revm/index.mdx landing page covering
  features, provenance, crate features, no_std, and build commands.
- Wire the new page into docs.json under the Rust sidebar.
- Surface op-revm alongside kona / op-reth / op-alloy on the Rust
  landing page.
@InoMurko InoMurko force-pushed the inomurko/opreth-v1.11.5-fix branch from b773f0e to 7bffeae Compare April 12, 2026 16:52
@InoMurko InoMurko closed this Apr 12, 2026
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.