Skip to content

feat: opcm zk roots#903

Closed
0xChin wants to merge 48 commits intofeat/opcm-zk-roots-basefrom
feat/opcm-zk-roots
Closed

feat: opcm zk roots#903
0xChin wants to merge 48 commits intofeat/opcm-zk-roots-basefrom
feat/opcm-zk-roots

Conversation

@0xChin
Copy link
Copy Markdown
Member

@0xChin 0xChin commented Apr 15, 2026

this PR is to review all the work towards solving mofi's comment ethereum-optimism#19685 (review)

smartcontracts and others added 30 commits April 10, 2026 14:29
…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.
… specs (ethereum-optimism#20003)

The FPVM precompile provider had two bugs in spec-to-precompile mapping:

1. Non-accelerated precompiles: JOVIAN was grouped with ISTHMUS, returning
   isthmus() instead of jovian(). The jovian() set includes input size
   restrictions on 4 variable-input precompiles.

2. Accelerated precompiles: INTEROP and OSAKA (post-Jovian forks) were
   grouped with ISTHMUS, returning accelerated_isthmus() instead of
   accelerated_jovian(). This would cause wrong gas costs once those
   forks activate.

Both match blocks now correctly map ISTHMUS to its own precompile set
and JOVIAN/INTEROP/OSAKA to the Jovian set, matching the reference
implementation in op_revm::OpPrecompiles.

Fixes ethereum-optimism/optimism-private#470

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* refactor: move NATIVE_ASSET_LIQUIDITY upgrade to non-initializable section

* fix: set PERMISSIONED_CANNON initBond to 0.08 ether in Deploy.s.sol

* fix: require non-empty code on implementation in L2ContractsManagerUtils

* fix: validate useInterop matches devFeatureBitmap in L2Genesis

* fix: enforce NUT bundle version in Go and Solidity readers

* test: assert L1Block feature state is preserved after fork upgrade

* fix: pre-pr run

* fix: add empty impl error to l2cm interface

* fix: set useInterop to true if devflag enabled

* fix: ci failutes

* fix: semver

* refactor: move empty implementation check to top

---------

Co-authored-by: OneTony <onetony@defi.sucks>
…-optimism#20045)

- CONTRIBUTING.md: remove reference to deleted close-stale workflow
- kontrol/README.md: fix 7 broken links to removed deployment/ dir,
  update OptimismPortal.k.sol -> OptimismPortal2.k.sol, fix httpshttps
  typo, update DeploymentSummary paths from proofs/utils/ to scripts/
- op-reth/README.md: point 9 broken local links to upstream reth repo
  (assets, docs, audit, CONTRIBUTING, SECURITY)
- kona/README.md: remove broken link to nonexistent crates/batcher/comp
- kona/docker/apps/README.md: remove broken link to deleted workflow
- l2-upgrades-2-contracts.md: remove broken link to nonexistent part 1
- op-service/README.md: remove stale entries for predeploys (moved to
  op-core) and logfilter (moved to log/logfilter)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* test: add ZK DGF tests

* test: restructure ZK dispute game factory tests into dedicated contracts

* test: add bond overpayment scenario

* chore: pre-pr

* test: add ZK dispute game tests for AnchorStateRegistry

* chore: run just pr

* refactor: use vars instead of magic numbers

* test: do assertions over exact values

* refactor: add zkCreateParams helper function for reused logic

* test: check findLatestGames works if n > gameCount

* test: check notRegistered path in ASR ZKDisputeGame test

* test: add fuzz testing

* test: add more fuzz tests

* refactor: use IDisputeGame interface

* refactor: add reused vars/logic in init contract

* chore: run just pr

* fix: just-upgrade CI failing

* chore: run just pr

* feat: remove skip

* fix(ci): resource-intensive test breaking CI

* test: increase test coverage in ASR

* refactor: remove redundant oneliner

* test: ensure same state after revert in ASR

* test: add inProgress and isolate paused setAnchorState tests for ZK dispute game

* test: deduplicate isGameProper tests across game types

---------

Co-authored-by: Ashitaka <ashitaka@defi.sucks>
…um-optimism#19972)

* feat(op-node): offset_derived for EL-sync safe/finalized retraction

Add duration-based offset_derived (rollup BlockTime -> block steps) so EL-sync
completion sets safe, finalized, and local-safe to an ancestor of the unsafe
tip; unsafe stays at tip. Uses a single L2BlockRefByNumber call instead of
walking N parent hashes. Default --syncmode.offset-derived is 168h (7d).

Plumb through sync config, CLI, EngineController FCU, and FindL2Heads recovery.
sync.L2Chain now includes L2BlockRefByNumber. Tests use table-driven subtests.

Made-with: Cursor

* test(op-e2e): add e2e test for OffsetELSafe after EL sync

Refactor PrepareELSyncedNode to accept expected safe/finalized block
numbers, and add TestELSyncOffsetELSafe demonstrating that safe and
finalized heads retract from the tip when OffsetELSafe is configured.

Made-with: Cursor

* test(acceptance): add OffsetELSafe acceptance test for EL sync

Plumb OffsetELSafe through L2CLConfig into the devstack sync config,
and add TestELSyncSafeRetractedByOffset which verifies that safe and
finalized heads are retracted from the unsafe tip after EL sync.

Made-with: Cursor

* test(acceptance): add expected retraction check to OffsetELSafe test

Log a warning when observed retraction doesn't match the expected
5-block retraction (10s offset / 2s block time).

Made-with: Cursor

* fix(op-node): address OffsetELSafe self-review feedback

- Default to 0 (full nodes can't progress safe derivation from offset)
- DurationToBlocks uses ceiling division so the retraction always
  covers the full requested duration (e.g. 15s / 4s blockTime = 4)
- Extract OffsetBlockNum helper to deduplicate clamped-offset logic
  between start.go and engine_controller.go
- Rename `span` to `maxRetract` for clarity

Made-with: Cursor

* lint

* fix(op-node): align EL-sync offset test with ceiling division

The test expected floor(offset/BlockTime) retraction but
DurationToBlocks uses ceiling division. With offset=5s and
BlockTime=2, ceil(5/2)=3 retracts to genesis (block 0), not
block 1. Update expected values and test name accordingly.

Made-with: Cursor

* fix(op-node): never retract finalized/safe behind prior values after EL sync

With SupportsPostFinalizationELSync, EL sync can start even when there
is an existing finalized head (Erigon/Reth). The offset retraction must
not move finalized or safe backwards, so clamp each against its prior
value before applying the forkchoice update.

Made-with: Cursor

* fix(op-node): reject OffsetELSafe when CL sync is enabled

OffsetELSafe only applies to EL sync completion. With CL sync it would
needlessly retract the safe head during FindL2Heads recovery paths.
Fail at startup instead of silently misbehaving.

Made-with: Cursor

* fix(acceptance): make OffsetELSafe test deterministic

Stop the batcher before advancing the sequencer so new blocks are
unsafe-only. This creates a permanent gap between safe and unsafe
that derivation can never close, eliminating timing-dependent flakes.

Made-with: Cursor

* acceptance test improvements

Made-with: Cursor
…eum-optimism#20004)

The BatchReader Fjord check for brotli decompression used the untrusted
batch timestamp instead of the L1 origin timestamp. A malicious batcher
could craft a batch with a pre-Fjord timestamp inside a post-Fjord
brotli-compressed channel, causing kona to discard the channel while
op-node (which uses the origin timestamp) accepts it — a consensus
deviation.

Store the L1 origin timestamp in BatchReader at construction time and
use it for the is_fjord_active check, matching op-node behavior.

Fixes ethereum-optimism/optimism-private#485

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

The supernode now eagerly returns optimistic blocks and partial
OptimisticAtTimestamp data, so the tests blocked on ethereum-optimism#19180 can run.

Part of ethereum-optimism#19010

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

* docs(op-program): add deprecation notice to README

op-program is being replaced by kona-client. Add a prominent
deprecation banner directing users to kona-client and the
end-of-support notice.

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

* Update op-program/README.md

Co-authored-by: Paul Dowman <paul@pauldowman.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Paul Dowman <paul@pauldowman.com>
…ereum-optimism#19970)

* feat: add devfeatures to op-core and fix cyclic dependency in op-deployer

* fix: lint go fix

* refactor: remove devfeatures from op deployer

* fix: go lint
…m-optimism#20011)

* fix(kona): enforce strict frame ordering in ChannelAssembler

Add OrderedChannel, a simplified channel type that enforces strict
sequential frame ordering (frame.number must equal inputs.len()). This
matches op-node's requireInOrder behavior for Holocene+.

The ChannelAssembler now uses OrderedChannel instead of Channel. Since
ChannelAssembler is only used post-Holocene, no conditional logic is
needed. The existing Channel (which accepts out-of-order frames) remains
in ChannelBank for pre-Holocene derivation.

OrderedChannel is simpler than Channel: Vec<Frame> instead of
HashMap<u16, Frame>, no pruning logic, is_ready() is just a closed
check, and frame_data() is a straight iteration.

Fixes ethereum-optimism/optimism-private#482

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

* fix(kona): reuse ChannelError, simplify frame_data

Address review feedback:
- Add FrameOutOfOrder variant to existing ChannelError instead of a
  separate OrderedChannelError enum
- Use functional style for frame_data (flat_map + collect)

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

* fix(kona): use early return in frame_data

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

* fix(kona): rename frame_data to data, return Result with ReadError

Rename frame_data() to data() and return Result<Bytes, ReadError>
instead of Option<Bytes>. ReadError has two variants: Empty (no frames)
and NotReady (channel not closed yet).

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

---------

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

* chore: replace deprecated deps with stdlib equivalents

Replace three deprecated/superseded Go dependencies with stdlib:

- golang.org/x/exp/maps → stdlib maps (Go 1.21+), wrapping Keys/Values
  with slices.Collect for iterator-to-slice conversion
- golang.org/x/exp/slices → stdlib slices (Go 1.21+)
- golang.org/x/exp/constraints → local Unsigned interface in safemath
- github.com/pkg/errors → fmt.Errorf with %w
- github.com/hashicorp/go-multierror → errors.Join

go-multierror is fully removed from go.mod. x/exp and pkg/errors move to
indirect (still used by transitive dependencies).

Closes ethereum-optimism#19996 (high priority items)

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

* chore: fix stdlib import grouping for maps/slices

Group "maps" and "slices" with other stdlib imports instead of
in a separate import group.

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

---------

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

* fix(op-e2e): make Holocene activation proof test non-trivial

The test was running RunFaultProofProgramFromGenesis with safe head at
block 0, making the proof trivially pass over genesis. Now batch-mines
and syncs past the activation boundary so the proof runs over the actual
Holocene activation block (block 14).

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

* fix(op-e2e): ensure holocene proofs tests don't run trivially on genesis

Fix holocene_batches_test and holocene_frame_test: when disordered
batches/frames cause the channel to be dropped (safe head = 0), build a
new block and rebatch so the FPP runs on a non-trivial safe head.

For holocene_invalid_batch_test, the blocks themselves have intentionally
invalid contents (over-advanced L1 origin, sequencer drift breach), so
rebatching them produces the same invalid result. In those cases, skip
the proof with a log message. The Holocene variants of these tests
advance the safe head and do run the proof.

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

* fix(op-e2e): skip FPP for dropped batches/frames instead of rebatching

Rebatching glosses over the invalid range and doesn't test that the
derivation pipeline correctly dropped the problematic data. Instead,
skip the FPP with a log message when safe head is at genesis, matching
the approach in holocene_invalid_batch_test.

Filed ethereum-optimism#20050 to track running the FPP and asserting no new blocks are
produced over the dropped range.

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

* make 14 a const

---------

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

* feat(nonsense/sdm-prod): add synthetic post-exec tx type

* fixup! feat(nonsense/sdm-prod): add synthetic post-exec tx type

* simplify

* fixup

* remove unused is_post_exec_tx

* addressing latest comments
…imism#19990)

* fix(devstack): retry until the proof backend catches up instead of failing immediately

* move vars in Eventually loop
… default (ethereum-optimism#19938)

* feat(op-supernode): derive interop activation from rollup config

* fix(op-supernode): clarify interop activation flag overrides rollup config

Address review feedback: update Usage string to make it clear that the
CLI flag overrides the value derived from rollup configs.

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#19909)

* chore(proof-store): introduce factory pattern for OpProofsStore

* clippy fixes

* fix tests

* add comments

* fmt + clippy + doc fixes

* fix tests
…timism#20052)

Install the pinned nightly toolchain and cargo-nextest automatically
via mise instead of requiring manual setup. The nightly version pin in
rust/justfile now reads from mise.toml to keep a single source of truth.

Remove the now-unnecessary install-nightly steps from CI, the
fix-rust-fmt skill, and the rust-dev docs.

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

* op-acceptance-tests: migrate TestInteropFaultProofs_MessageExpiry

Migrate the message expiry fault proof test from op-e2e/actions to
op-acceptance-tests using the devstack DSL and supernode infrastructure.

The test verifies that when a cross-chain executing message references an
expired initiating message, the block is replaced during consolidation and
the fault proof system correctly identifies the invalid vs valid claims.

Key design decisions:
- Adds WithMessageExpiryWindow preset option to configure a short (12s)
  expiry window, since the default 604800s is impractical with real services
- Uses TestSequencer.SequenceBlockWithTxs to inject the expired exec tx
  directly into the block builder, bypassing InteropMempoolFiltering which
  would reject expired messages. This models a malicious sequencer.
- Adds PrepareExecTx on EOA to build and sign an exec tx without submitting

Towards ethereum-optimism#19010

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

* fix(op-supernode): read message expiry window from dep set

The supernode's interop activity was using a hardcoded ExpiryTime
constant (604800) instead of reading from the dependency set. This
caused the message expiry override (WithMessageExpiryWindow) to have
no effect on the supernode's cross-safe validation.

Now the Interop activity receives the message expiry window from the
dep set at construction time, falling back to the default 604800s if
not configured.

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

* fix(op-supernode): fix goimports formatting in algo_test.go

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

---------

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

* chore(nuts): move NUT bundle JSON to op-core/nuts

Centralizes NUT bundles in op-core/nuts so both op-node and kona-node
can consume the same source file.

* chore(nuts): move bundles into bundles/ subdir

Keeps JSON data files separate from Go source as the number of
per-fork bundles grows.

---------

Co-authored-by: maurelian <maurelian@protonmail.com>
…e it for kona-host (ethereum-optimism#20067)

* refactor(op-devstack): move rust binary tooling to shared/rustbin, use it for kona-host

The shared/challenger package hardcoded kona-host to
rust/target/release/kona-host, bypassing the JIT build, env var
overrides, and debug/release discovery that other Rust binaries
already had via EnsureRustBinary in sysgo.

Move the rust binary resolution logic from sysgo into
shared/rustbin so it can be used by shared/challenger directly.
Decouple from devtest.CommonT by accepting context.Context and
log.Logger (nil-safe) instead. Update shared/challenger to resolve
kona-host through rustbin.EnsureExists, giving it the same
RUST_JIT_BUILD, RUST_BINARY_PATH_KONA_HOST, and multi-profile
search support that op-reth, kona-node, and other Rust binaries
already have.

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

* make EnsureExists a method on Spec

* make logger never be nil

* thread the context parameter through

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ashitakah and others added 10 commits April 14, 2026 23:19
… devstack (ethereum-optimism#20046)

Migrate TestInteropFaultProofs_DepositMessage_InvalidExecution from
op-e2e action tests to devstack/op-acceptance-tests per ethereum-optimism#19010.

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

* feat(op-reth): activate EIP-7823 modexp upper bounds on Karst fork

Wire up the Karst OP fork through the Rust EL stack so that EIP-7823
(modexp precompile input upper bounds of 1024 bytes) takes effect when
Karst activates. Karst remains at SpecId::PRAGUE to avoid unsupported
fork errors in reth v2.0.0; the modexp limit is enforced via a custom
karst() precompile set that swaps modexp::BERLIN for modexp::OSAKA.

Changes:
- Add OpSpecId::KARST variant mapped to SpecId::PRAGUE
- Add karst() precompile set with modexp::OSAKA (EIP-7823 limits)
- Add karst_time to OpGenesisInfo, HardforkConfig, ChainConfigExtraFields
- Wire is_karst_active_at_timestamp into spec_by_timestamp_after_bedrock
- Register OpHardfork::Karst in chainspec From<Genesis>, DEV_HARDFORKS,
  devnet config, and OpChainSpecBuilder
- Add KarstTime to Go RollupConfig() output (was missing)
- Add acceptance test TestEIP7823UpperBoundModExp verifying pre/post
  fork behavior
- Sets the tx gas limit to params.MaxTxGas. This is technically an
  EIP-7825 change but we get failing tests if we don't include it
  here. A follow-up commit will add an explicit test for this EIP. See
  the [ci] failure for more info.

[ci]: https://app.circleci.com/pipelines/github/ethereum-optimism/optimism/122588/workflows/7a0e7c9f-b22c-41a1-8014-25c7f3b71dc9/jobs/4815340/tests

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

* update in response to review comment

* remove devnet

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@0xChin 0xChin requested a review from ashitakah April 15, 2026 09:42
0xChin and others added 8 commits April 15, 2026 06:58
The merge from develop resolved the bundle conflict by keeping
the stale version from this branch. Regenerated via
`just generate-nut-bundle` to match the current compiled artifacts.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
@0xChin 0xChin closed this Apr 15, 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.