Skip to content
This repository was archived by the owner on Dec 5, 2021. It is now read-only.

[pull] develop from ethereum-optimism:develop#573

Open
pull[bot] wants to merge 10000 commits intoomgnetwork:developfrom
ethereum-optimism:develop
Open

[pull] develop from ethereum-optimism:develop#573
pull[bot] wants to merge 10000 commits intoomgnetwork:developfrom
ethereum-optimism:develop

Conversation

@pull
Copy link
Copy Markdown

@pull pull bot commented Oct 13, 2021

See Commits and Changes for more details.


Created by pull[bot]

Can you help keep this open source service alive? 💖 Please sponsor : )

joshklop and others added 30 commits March 25, 2026 16:46
…19676)

Reth's mempool has different policies from geth that make it harder to spam
artificial traffic. Fortunately, we already dealt with this problem in
an existing test (a batcher throttling test).

This commit extracts the relevant logic from the batcher throttling test
into the existing `loadtest` package and reuses it in some tests that
spam transactions.
This slow action test (~60min, deriving 10,000 blocks) is replaced by
fixture-based integration tests in kona-proof-interop that verify the
same EIP-2935 block hash lookup behavior in seconds using captured
OP Mainnet state (PRs #19726 and #19738).

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add ZKDisputeGame with new design

* refactor: update IZKVerifier interface signature, add ISemver, move to interfaces/

Update IZKVerifier to use 3-arg signature (programId, publicValues, proof),
extend ISemver, and relocate from src/dispute/zk/ to interfaces/dispute/zk/.
Update all imports and the prove() call site accordingly.

* refactor: rename counteredBy to challenger in ClaimData struct

* refactor: optimize ClaimData struct layout from 4 to 3 storage slots

* fix: move gameOver check to top of challenge()

* fix: add missing checks in prove()

* fix: add parent game type check

* fix: add anchorL2SeqNum check

* chore: remove empty lines in natspec

* perf: remove creditUnlocked mapping for claimCredit flow

* chore: remove deprecated AccessManager

* fix: pre-pr

* feat: require parent game's sequence number strictly above anchor state

* feat: revert claimCredit early revert flow

* chore: add todo comment

* fix: claimCredit closes when recipient has no credit

* feat: remove mapping

* fix: comments and ci

* test: improve test coverage

* fix(op-challenger): wrong claimData struct

* refactor(op-challenger): rename OptimisticZKGame -> ZKDisputeGame

* fix: wrong lint

* chore: remove code length check

* fix: shorten ZK game type CLI string to "zk"

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

* fix: update semgrep excludes for ZKDisputeGame and remove inline nosemgrep

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

* fix: remove OptimisticZkGame reference from natspec comment

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

* fix: use getAnchorRoot() instead of deprecated anchors()

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

* fix: remove unnecessary receive() function, CWIA handles ETH transfers

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

* test: improve ZKDisputeGame test coverage

Add missing tests identified in review:
- Invalid proof rejection with ZKRejectingVerifier mock
- wasRespectedGameTypeWhenCreated assertion in initialize
- Anchor start path (parentIndex = uint32.max) validation
- Proved event emission verification
- Challenge deadline reset assertion

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

* fix: add msg.sender to public values to prevent proof front-running

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

* fix: make disputeGameFactory an immutable set in constructor

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

* chore: pre-pr

* fix: revert disputeGameFactory to storage variable for MCP compatibility

The DisputeGameFactory differs per chain, so it must be set in
initialize() rather than as a constructor immutable to preserve
MCP clone reusability.

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

* chore: pre-pr

* fix: interface cast

* fix: semver

---------

Co-authored-by: Ashitaka <ashitaka@defi.sucks>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…19650)

* refactor(l2cm): remove ERC20 interop contracts from upgrade pipeline

OptimismSuperchainERC20Factory, OptimismSuperchainERC20Beacon, and
SuperchainTokenBridge are no longer deployed/upgraded by L2CM.
SuperchainETHBridge and ETHLiquidity remain.

* fix(Predeploys): correct isSupported and getUpgradeable Predeploys functions

* fix: remove redundant comment

Co-authored-by: niha <205694301+0xniha@users.noreply.github.com>

* fix: update getUpgradeablePredeploys array size and fork test

---------

Co-authored-by: niha <205694301+0xniha@users.noreply.github.com>
… devnet (#19747)

Add support for spinning up a 2-chain interop devnet backed by
op-supernode via `op-up --interop`. This reuses the existing
TwoL2SupernodeInterop preset from op-devstack.

Changes:
- Add --interop CLI flag (env: OP_UP_INTEROP)
- Parameterize proxyEL to support multiple listener addresses
- Chain A proxied on localhost:8545, Chain B on localhost:8546
- Extract printAccountInfo and logBlocks as shared helpers
- Add live [interop] log lines showing safe head progression and reorgs
- Add `op-up smoke-interop` CLI with subcommands: all, identity,
  transfer, bridge, valid-message, invalid-message
- Use interopDelay=2 so bridge contracts get properly initialized

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

* op-acceptance: migrate interop tests to supernode, skip on op-reth

Migrate interop acceptance tests from supervisor-based presets
(NewSimpleInterop) to supernode-based presets (NewTwoL2SupernodeInterop)
where the change is mechanical (preset swap + field renames).

Tests migrated to supernode preset:
- TestReorgInvalidExecMsgs (reorgs/ — also replaced Supervisor.SafeBlockID
  convergence check with Supernode.AwaitValidatedTimestamp)
- TestInteropHappyTx (message/)
- TestInteropMon (message/)
- TestL2CLResync (sync/simple_interop/)

Tests converted from unconditional skip to SkipOnOpReth:
- TestRelayWithInvalidMessagesSteady (loadtest/)
- TestReorgInitExecMsg (reorgs/)
- TestReorgInvalidExecMsgs (reorgs/)

TestInteropFaultProofs_InvalidBlock remains fully skipped — broken on all
EL backends due to supernode proof expectation mismatches.

Other changes:
- Fix SkipOnOpReth helper to skip when EL kind is anything other than
  op-geth (not just when it equals op-reth)
- Fix AssertTxInBlock doc comment
- Normalize TODO comment format to use #19411 short form

* chore: rename SkipOnOpReth to SkipUnlessOpGeth

---------

Co-authored-by: wwared <541936+wwared@users.noreply.github.com>
…in all single-chain runtimes (#19653)

Introduce two central env-aware dispatch functions, startL2ELForKey and
startL2CLForKey, which read DEVSTACK_L2EL_KIND and DEVSTACK_L2CL_KIND
respectively and start the appropriate implementation. All single-chain
runtimes (minimal, flashblocks, interop-no-supervisor) and follower-node
helpers now route through these functions, so setting the env vars
affects every preset without any test changes required.

  DEVSTACK_L2EL_KIND=op-reth go test ./...   # use op-reth as L2 EL
  DEVSTACK_L2CL_KIND=kona-node go test ./...  # use kona-node as L2 CL

The sequencer EL/CL wrappers (startSequencerEL, startSequencerCL) and
the verifier helper (addSingleChainOpNode) all delegate to the dispatch
functions, replacing scattered direct calls to startL2ELNode /
startL2CLNode. The supernode runtime's startSupernodeEL is unified with
the same dispatch logic (default is now op-geth, matching every other
runtime; previously it defaulted to op-reth).

The *OpNode type assertion in newSingleChainRuntimeWithConfig is removed
in favour of startTestSequencerForRPCs, which accepts any L2CLNode via
its RPC endpoint.

Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
The devnet-metrics-collect workflow collected git authorship metrics
for op-acceptance-tests and uploaded them to a GCS bucket. This data
is not actively used. Remove the job, workflow, pipeline parameters
across all CI config files, and the metrics-collect-authorship.sh
script.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
op-acceptor is being removed; clean up its version pin and tool alias
from mise.toml.

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

Replace the needFCUCall flag and broken needSafeHeadUpdate debounce
mechanism with a simpler approach: track the last forkchoice state
sent to the engine (lastForkchoice) and only send FCU when the state
actually changes.

Key changes:

- Remove needFCUCall from all setters (SetSafeHead, SetUnsafeHead,
  SetFinalizedHead). They are now pure setters.
- Remove needSafeHeadUpdate, flushPendingSafeHead(), and
  ErrNoFCUNeeded entirely.
- tryUpdateEngineInternal compares the current ForkchoiceState against
  lastForkchoice and skips the FCU if unchanged (returns nil).
- PromoteSafe no longer calls tryUpdateEngine. On the consolidation
  path, this means no per-block FCU — the forkchoice state updates
  silently per-block.
- New DeriverL1StatusEvent and DeriverIdleEvent handlers in the engine
  controller call tryUpdateEngine at L1 origin boundaries, sending a
  single batched FCU.
- Remove redundant TryUpdateEngine call from SyncStep — all forkchoice
  updates are now triggered by their respective event handlers.
- Non-consolidation path (onPayloadSuccess) is unaffected: SetUnsafeHead
  changes HeadBlockHash which triggers FCU via tryUpdateEngineInternal.
- InsertUnsafePayload and tryBackupUnsafeReorg update lastForkchoice
  after their direct FCU calls.

Closes #12695

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

The generate-nut-bundle recipe needs compiled artifacts to exist.
Adding build-no-tests as a dependency ensures scripts and source
contracts are built first.
Point to factory@4a6713d which adds SBOM generation for all Docker
image builds via the sbom input (defaulting to true).
Install cargo-auditable and use it for the final binary build step in
op-reth and kona Dockerfiles. This embeds the full crate dependency
tree into the binary, making it visible to SBOM and vulnerability
scanners.
* kona-client: fix trace-extension short-circuit at capped leaves

Fixes a bug where kona program could incorrectly treat a transition as
trace-extension and return early based solely on output-root equality,
even when the claimed L2 block number differed, enabling trivial wins
in dispute games.

* kona/client: Fix fmt & clippy (#456)

* kona-proof: fix TipCursor using zero output root instead of agreed prestate (#454)

This fixes an issue where the pipeline cursor was initialized with
B256::ZERO as the safe head output root. When the derivation pipeline
exhausts L1 data (EndOfSource) before deriving any new blocks, the
driver returns this zero value instead of the agreed prestate's actual
output root, causing the FPP to reject honest claims and accept zero
claims.

* fix(kona): bounded channel decompression with truncation per spec (#455)

Fixes multiple deviations in kona's channel decompression (bug #35):

Zlib: replace unbounded decompress_to_vec_zlib with
decompress_to_vec_zlib_with_limit to prevent zip-bomb OOM. On limit
hit (HasMoreOutput), keep partial output per spec instead of rejecting.

Brotli: cap output buffer growth at max_rlp_bytes_per_channel instead
of erroring when the doubled buffer exceeds the limit. Fixes false
rejection of valid channels near the size limit.

Both: on decompression errors, preserve partial output so batches
decoded before the error point are accepted (matching Go reference).

Per spec: "If the decompressed data exceeds the limit, things proceed
as though the channel contained only the first
MAX_RLP_BYTES_PER_CHANNEL decompressed bytes."

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: inphi <mlaw2501@gmail.com>
Co-authored-by: Sebastian Stammler <seb@oplabs.co>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* op-reth: add chain_id to ExecutingDescriptor in supervisor_checkAccessList

The ExecutingDescriptor sent to supervisor_checkAccessList was missing
the chainID field, causing the interop filter to see chain ID 0 and
reject all cross-chain relay transactions with "executing chain 0:
unknown chain".

The Go-side ExecutingDescriptor expects chainID but op-reth's local
copy of the struct omitted it. This adds chain_id to the struct,
threads it through from ChainSpec, and includes it in the serialized
RPC payload.

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

* fix(op-reth): fix rustfmt formatting in supervisor client

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

* fix(op-reth): use explicit chainID rename to match spec and kona

The camelCase rename_all serialized chain_id as "chainId" (lowercase d),
but the Go supervisor and kona both expect "chainID" (uppercase D). Use
an explicit serde rename to match the spec.

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

---------

Co-authored-by: opsuperchain <opsuperchain@slop.bot>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* ci(rust): downsize 7 Rust CI jobs from xlarge to medium

Reduce resource_class from xlarge (40 cr/min) to medium (10 cr/min) for
Docker-based Rust CI jobs that complete in under 5 minutes and are
unlikely to be CPU/memory bound:

- rust-ci-clippy
- rust-ci-check-no-std
- rust-ci-docs
- rust-ci-udeps
- rust-ci-cargo-hack-build (wasm targets)
- op-reth-compact-codec
- rust-docs-build

Machine-executor jobs (kona-cargo-lint, kona-build-fpvm,
kona-host-client-offline) are excluded as they require Docker-in-Docker
and privileged access.

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

* ci(rust): revert rust-ci-docs to xlarge (OOM on medium)

The rust-docs job was killed with SIGKILL (OOM) on medium — the reth_op
crate doc build with all features needs more memory than medium provides.

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

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: add ConditionalDeployer to implementations names array and add implementations count check

* fix: isUpgradeable comment in l2cm utils
…lls (#19745)

* feat(op-devstack): use EIP-7702 SetCode for OPCM migration delegatecalls

Replace the DelegateCallProxy deploy-transfer-execute-restore pattern in
migrateSuperRoots and addGameTypeForRuntime with EIP-7702 SetCode. The
L1PAO EOA temporarily adopts DelegateCallProxy code via SetCode, then
calls executeDelegateCall on itself. Since the EOA is already the owner
of all ProxyAdmins, no ownership transfers are needed.

This reduces the transaction count from ~5+5N to 2 per invocation (one
deploy + one SetCode tx), eliminating a large class of ownership
transfer/restoration complexity.

The new delegateCallWithSetCode helper uses txplan for nonce management,
gas pricing, signing, and retry — the same infrastructure that
dsl.EOA.PlanAuth uses without requiring a dsl.EOA.

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

* fix: remove extra blank line caught by goimports

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

* fix(acceptance): await validated timestamp before querying optimistic data

AwaitValidatedTimestamp was called with endTimestamp but
SuperRootAtTimestamp was queried at endTimestamp+1. When the supernode
hasn't validated that timestamp yet, OptimisticAtTimestamp is empty and
latestRequiredL1 returns a zero-valued BlockID, causing kona-host to
receive --l1-head 0x00..00 and fail.

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* fix: conditional deployer to be predeploy

* fix: downgrade invariant

* fix: wording
Migrate Kona, op-reth, and op-alloy documentation from the standalone
Vocs site (rust/docs/) into the unified Mintlify docs (docs/public-docs/).

- Convert 140 MDX files: remove Vocs imports, add Mintlify frontmatter,
  convert Callout components to Warning/Note/Info/Tip
- Add 'Rust' navigation tab to docs.json with full sidebar structure
- Create Mintlify-native landing page with CardGroup components
- Add dedicated docs-ci.yml CircleCI continuation config that runs
  mintlify validate on docs/public-docs/ changes
- Delete standalone rust/docs/ Vocs site
* op-supernode: Workaround op-reth FCU edge case

* op-acceptance-tests: unskip op-reth interop reorg tests that now pass

Remove SkipUnlessOpGeth from 5 tests that now pass with op-reth after
the FCU rewind fix. Update the skip reason on
TestSupernodeInteropInvalidMessageReplacement which still fails due to
missing interop tx eviction.

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

* op-supernode: replace sleep with FCU retry-verify loop in RewindToTimestamp

Replace the fixed 50ms sleep between back-to-back FCU calls with a
proper retry loop that verifies each FCU took effect by checking the
heads match. If the head hasn't converged (e.g. due to reth#23205 race),
sleep 500ms and retry the FCU, up to 20 attempts (total of 10s).

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

---------

Co-authored-by: wwared <541936+wwared@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(test): fix and fuzz mint moreThanAvailableBalance test

The test was missing vm.prank(address(superchainETHBridge)), causing it
to revert with Unauthorized instead of testing the intended insufficient
balance scenario. Also converted to fuzz test for broader coverage.

* test(contracts): add version format validation for ETHLiquidity

Add ETHLiquidity_Version_Test with SemverComp.parse() to validate the
version string follows proper semver format.

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
#19557)

* refactor(test): fix test naming conventions in LegacyMintableERC20 tests

Rename test_constructor_works to test_constructor_succeeds and
test_supportsInterface_works to test_supportsInterface_supportedInterfaces_succeeds
to follow the naming convention [method]_[functionName]_[scenario]_[outcome].

* test(contracts): convert tests to fuzz and add coverage for supportsInterface

- Convert mint/burn tests to fuzz tests with event emission checks
- Add fuzz test for unsupported interface IDs (false branch)
- Declare Mint/Burn events in TestInit for expectEmit assertions
- Fuzz access control tests across arbitrary caller addresses

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
PRs are squash-merged so only one commit appears in history.
* chore: check for l2cm code in l2proxy admin upgrade

* fix: comment

* fix: add check for v4 initializing slot aswell

* fix: improve expected intent string comment

* fix: prank issue

* fix: tests

* fix: nits

* fix: tests
* feat(l1block): add system customization feature flags

* feat(l1block): unify custom gas token under system customizations

* feat(contracts): move enableFeature() call into setL1Block

* chore: semver lock

* fix(contracts): reset isFeatureEnabled(CUSTOM_GAS_TOKEN)

* refactor(l1block): align feature flag interface with SystemConfig

Use bytes32 keys with Features library constants, public mapping
auto-getter, FeatureSet event, and setFeature function name.

* feat(l2cm): populate isInterop from L1Block feature flag

Read INTEROP feature from L1Block into FullConfig instead of
querying L1Block inline in _apply.

* feat(l2cm): revert if interop dev feature and system feature disagree

Move interop flag resolution into _loadFullConfig and revert with
L2ContractsManager_FeatureFlagMismatch if the dev feature and L1Block
system feature are out of sync.

* feat(l2cm): dev feature gates system customization, not vice versa

The dev feature is a prerequisite for the system customization to be
enabled. Revert only when sys=true and dev=false (misconfiguration).

* fix(contracts): Address contracts checks failures

* Enable custom gas token feature in L1Block test

* Use legacy isCustomGasToken() and use try/catch on isInterop

* Apply suggestion from @0xOneTony

Co-authored-by: 0xOneTony <112496816+0xOneTony@users.noreply.github.com>

* Add custom gas token check in L2ContractsManager

* feat(contracts): Update authorization on setFeature and setCustomGasToken

* feat(contracts): move docs to better place

* fix(contract): interfaces for L1Block proxy admin inheritance

* fix: semver bumps

* fix: increase gaslimit for L1block deployment

* fix: address PR review feedback

- Remove redundant isCustomGasToken() check in setCustomGasToken()
- Fix typo: consenus -> consensus in L2ContractsManager
- Use setCustomGasToken() instead of setFeature() in L2Genesis for consistency

* fix: downgrade L1BlockCGT semver and add @dev comment

Semver back to +custom-gas-token.1 after removing the redundant check.
Document authorization behavior on setCustomGasToken().

* fix: remove unused import and regenerate NUT bundle

L1Block_FeatureAlreadyEnabled import was unused after removing the
redundant check in setCustomGasToken().

* fix(l2cm): fix typo in _loadFullConfig comment

s/def/dev/ in feature flags comment.

* chore(l2cm): add TODO to remove CGT migration step after Karst

* feat(l2cm): remove setCustomGasToken()

There is now only one right way to set a feature which is to call
setFeature().

* feat(l1block): restrict CUSTOM_GAS_TOKEN feature to genesis only

Prevents setFeature(CUSTOM_GAS_TOKEN) from being called after block 1,
ensuring the feature can only be set during genesis.

* fix(l1block): update interfaces, tests, and snapshots for setCustomGasToken removal

setCustomGasToken() was removed from L1BlockCGT but references in
interfaces, L2CM, and tests were not updated. Regenerated snapshots.

* fix(contracts): address review feedback on versions and NUT comment

Downgrade L1Block to 1.9.0 and L2CM to 1.2.0 per reviewer request.
Add comment explaining how INTEROP feature is enabled via NUT.

* fix(l1block): remove genesis-only guard for CUSTOM_GAS_TOKEN feature

The block.number check is incompatible with L2ContractsManager which
needs to call setFeature(CUSTOM_GAS_TOKEN) post-genesis for migration.
Access control via _assertSetFeatureAuthorized is sufficient.

* fix(contracts): remove unused imports, bump semver, regen snapshots

Removes unused Features import from L1Block and IL1BlockCGT import
from L2ContractsManager after genesis guard removal.

* fix(l1block): match natspec tag to version string

* fix(contracts): revert semver bumps, regen snapshots

These contracts already had their versions bumped in earlier commits
on this branch. The semver-diff check compares against the target
branch, not the previous commit.

* Update snapshots

* fix(l2cm): bump L2ContractsManager semver to 1.3.0

Bytecode changed due to removed IL1BlockCGT import. Regen snapshots.

---------

Co-authored-by: 0xOneTony <112496816+0xOneTony@users.noreply.github.com>
* feat: add weekly l2 fork tests

* fix: remove okx-xlayer from l2 fork ci matrix

Co-authored-by: Maurelian <john@oplabs.co>

---------

Co-authored-by: Maurelian <john@oplabs.co>
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

⤵️ pull merge-conflict Resolve conflicts manually

Projects

None yet

Development

Successfully merging this pull request may close these issues.