Merged
Conversation
…ism#19256) kona-client is an FPVM guest program (#![no_std]) with no CLI argument handling. The `--version` smoke test doesn't apply to it. Fixes ethereum-optimism#19255
…hereum-optimism#18873) Introduce a unified Registry type that can replace the 14+ separate locks.RWMap instances in the Orchestrator. The Registry provides: - Single map storage keyed by ComponentID (from Phase 1) - Secondary indexes by ComponentKind and ChainID for efficient queries - Type-safe generic accessor functions (RegistryGet, RegistryGetByKind, etc.) - Thread-safe concurrent access via sync.RWMutex - Registrable interface for self-registering components Also adds HasChainID() helper to ComponentID to reduce code duplication. This is Phase 2 of the ID type system refactor. The Registry is designed to coexist with existing RWMap fields during incremental migration. Amendments: * op-devstack: avoid calling range callbacks under lock
…artifact output paths (ethereum-optimism#19251) Move kona-node, op-reth, and related docker image references from ghcr.io (op-rs/kona, paradigmxyz) to the oplabs-tools-artifacts GCP registry. Also fix the prestate build output directory to use an absolute path and update CI to write artifacts to a dedicated per-kind directory. Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…thereum-optimism#19189) * Refactor Finalized Head Management in EngineController This commit updates the engine controller to introduce a more flexible finalized head management approach. Key changes include: - Introduce `FinalizedHead()` method to dynamically select finalized head - Deprecate direct `finalizedHead` field in favor of new method - Add support * add stubs * Implement FinalizedL2Head with cross-verifier consensus check * WIP * Update FinalizedL2Head method with improved fallback logic The changes modify the `FinalizedL2Head` method in multiple files to: - Introduce a second return value to signal when local finalized head should be used - Handle cases with no registered verifiers - Provide more detailed logging - Improve error handling for unfinalized verifier states * Refactor Interop Service Finalized L2 Block Tracking The commit introduces a robust implementation for tracking finalized L2 blocks in the Interop service. Key changes include: - Implement `LatestFinalizedL2Block` method with logic to find the latest verified L2 block based on the finalized L1 block - Add finalized L2 head tracking in `mockSuperAuthority` for testing - Expand test coverage for finalized head progression in `head_progression_test.go` * Rename Test to Better Describe Safe Head Progression * Add Safe and Finalized Head Progression Checks Extend head progression test to verify both safe and finalized block progression in the supernode interop scenario. Ensures that both safe and finalized heads stall when interop activity is paused and correctly catch * Update Supernode interop safe head progression test This commit enhances the `TestSupernodeInterop_SafeHeadProgression` test by adding an additional validation step. It now checks that the L1 origin of finalized L2 blocks is at or behind the L1 finalized head, providing an extra layer of sanity checking for cross-chain head progression. * Return to Genesis Block as Safe/Finalized Head Fallback This change modifies the `SafeL2Head()` and `FinalizedHead()` methods to return the genesis block when no safe or finalized head is yet established, instead of returning an empty `L2BlockRef`. The key changes are: - Fetch the genesis block from the engine when no safe/finalized head is available - Panic if the genesis block cannot be retrieved, as this represents a critical system failure * Add time travel to supernode interop tests * Update Interop verification to include L1 head context * Replace `L1Head` with `L1Inclusion` in interop functionality * lint * Add FinalizedHead tests to engine and supernode * engine-controller: update localFinalizedHead * Update SafeL2Head test to return genesis block with empty SuperAuthority * add comment * interop activity: expose VerifiedBlockAtL1 instead of LatestFinalizedL2Block the chain container calls this with the finalized l1 of its virtual node, in order to satisfy the FinalizedL2Head() API * interop algo: update result.L1Inclusion semantics the earliest L1 block such that all L2 blocks at the supplied timestamp were derived from a source at or before that L1 block * interop verification: return error when there are no chains add unit test coverage for the algo * remove unused fn * do not panic if we cannot get genesis block from engine * fix test * add comments * tidy
…um-optimism#19270) The workflow used `or` logic, causing it to run on any scheduled pipeline with branch=develop or any webhook push to any branch. Change to `and` so it only fires on webhook pushes to develop. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…thereum-optimism#19275) * test(contracts): improve DelayedWETH test coverage with fuzz tests - Convert unlock tests to fuzz: testFuzz_unlock_once_succeeds, testFuzz_unlock_twice_succeeds - Convert withdraw success tests to fuzz: testFuzz_withdraw_whileUnlocked_succeeds, testFuzz_withdraw_withdrawFromWhileUnlocked_succeeds - Convert hold tests to fuzz: testFuzz_hold_byOwner_succeeds, testFuzz_hold_withoutAmount_succeeds, testFuzz_hold_byNonOwner_fails - Convert recover tests to fuzz: testFuzz_recover_byNonOwner_fails, testFuzz_recover_moreThanBalance_succeeds - Add testFuzz_recover_partialAmount_succeeds for _wad < balance branch - Add testFuzz_hold_withoutAmount_byNonOwner_fails for hold(address) non-owner access control - Add DelayedWETH_Version_Test with SemverComp.parse validation * fix(test): rename hold test to satisfy 4-part naming convention --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
kona-host is built in the kona-build-release job already.
…reum-optimism#19278) * ci: disable incremental compilation and bump rust cache version - Set CARGO_INCREMENTAL=0 in rust-setup-env to disable incremental compilation for all Rust CI jobs, reducing cache size and improving reproducibility - Bump rust build cache version from 15 to 16 to invalidate stale caches - Use a YAML anchor in main.yml so the cache version only needs to be set once Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore(ci): remove stale ci jobs * ci: pin nightly toolchain and add weekly bump job - Add c-rust-nightly-version pipeline parameter (pinned to nightly-2025-11-01) to prevent surprise breakages from transitive deps incompatible with the latest nightly (e.g. shellexpand-3.1.1) - Update rust-install-toolchain to link a pinned nightly as "nightly" so existing `cargo +nightly` commands keep working - Replace all hardcoded `toolchain_version: nightly` with the parameter - Add rust-bump-nightly-pin job that opens a PR each week bumping the pin to the latest available nightly - Add scheduled-rust-nightly-bump workflow triggering on build_weekly Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…thereum-optimism#19254) * proofs: Port TestInteropFaultProofs_UnsafeProposal test to devstack * Fix unsafe proposal test to deterministically order safe heads
* feat: policy engine staking * feat: slots tests * fix: pre-pr * fix: linter * fix: linter * feat: inmutable contract * fix: check link to self * fix: natspec * fix: make * feat: improving code * feat: improving code * fix: lint * fix: comments * fix: comments * feat: improving tests * fix: linter * fix: linter * style: formatting * style: formatting * style: formatting * feat polish improvments and comments * feat: polish and comments * feat: sender and fuzz * fix: bugs and sender * fix: natspec * feat: policy engine refactor (ethereum-optimism#867) * feat: add V2 policy engine implementation * chore: undo foundry.toml modification * fix: stake function available if not allowlisted * refactor: rename PolicyEngineStakingV2 -> PolicyEngineStaking * refactor: remove stake function, add allowlist check when same beneficiary * refactor: make peData functions arg uint128 * chore: add comments * test: add fuzz testing * test: max approval on setup * refactor: remove helper function * chore: make link not puasable * feat: rename functions, add token to constructor * feat: add deployment script * fix: wrong foundry.toml * fix: pr (ethereum-optimism#868) * chore: make owner address public * refactor: rename data->stakingData * docs: natspec * refactor: improve checks * fix: pre-pr * fix: foundry.toml * fix: comments and link * chore: bump solidity version * feat: add named members in mapping * fix: revert contract creation on zero address * refactor: reduce parameters size * chore: undo unnecessary casting * fix: revert on same beneficiary linking * perf: optimize stake() sstores * feat: add transferOwnership * refactor: update stakedAmount after decrease * chore: make change beneficiary pausable * feat: unlink after allowance revoked * refactor: remove linking concept and use beneficiary instead * docs: improve natspec * test: stake() after being revoked reverts * feat: add ISemver * fix: conflicts * refactor: improve var naming * test: transferOwnership * refactor; vars naming * chore: improve comments * chore downgrade pragma * fix: pre-pr * fix: wrong foundry.toml * chore: improve comments * fix: ci failing * fix: pre-pr * fix: self allowlist * feat: disable self-allowlist * docs: improve natspec --------- Co-authored-by: Chiin <77933451+0xChin@users.noreply.github.com> Co-authored-by: 0xOneTony <112496816+0xOneTony@users.noreply.github.com> Co-authored-by: OneTony <onetony@defi.sucks>
* op-supernode: add TestCleanShutdown return from supernode.Start() function without waiting for the context to be cancelled * improve test * pass bg context to supernode start in test * mock runnable activity: calling stop causes start to return this mirrors the interop activity, for example * op-supernode: several improvements to lifecycle management * improve robustness of TestRunnableActivityGating since activities are started async and we don't have a way to wait on them, there is a race betwen start and stop in this test * reinstate fix
… 3) (ethereum-optimism#18874) Introduce L2ELCapable interface that captures shared behavior across L2ELNode, RollupBoostNode, and OPRBuilderNode without requiring them to share an ID() method signature. This enables polymorphic lookups where code can find any L2 EL-capable component by key+chainID, regardless of concrete type: sequencer, ok := FindL2ELCapableByKey(registry, "sequencer", chainID) Previously this required manual multi-registry lookups checking each type separately.
* feat: add Karst hard fork activation Adds the forking logic for the Karst network upgrade, following the same pattern as the Jovian activation (PR ethereum-optimism#13722). * feat: Update to op-geth with karst fork * fix: add Karst to genesis allocs, deploy config, and fork numbering Fixes interop test failures caused by Solidity Fork enum and Go SolidityForkNumber being out of sync after Karst addition. * fix: enable KarstTime in applyHardforks op-geth now includes KarstTime in HardforkConfig, so the TODO guard is no longer needed. * fix: add Karst to deploy config test fork overrides The fork ordering validation requires karst before interop. * fix: exclude Karst from upgrade-tx batch test Karst has no upgrade deposit transactions, so user txs in its activation block should not be rejected. * fix: add Karst to remaining e2e and op-wheel files Cover the remaining files that had Jovian entries but were missing Karst equivalents.
* ci: tag security oncall for contracts failures * fix: solidity interface mismatch * ci: fix store_test_results syntax for contracts jobs Use when: always directly on store_test_results steps instead of wrapping in a conditional block, and broaden path from results.xml to results dir. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(contracts): use correct Foundry env vars for fork RPC retries FORK_RETRIES and FORK_BACKOFF were never consumed by Foundry — the correct env var names are FOUNDRY_FORK_RETRIES and FOUNDRY_FORK_RETRY_BACKOFF. Without these, fork tests had no retry protection against RPC 429 rate limit errors, causing CI flakes. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…e 4) (ethereum-optimism#18875) * op-devstack: add capability interfaces for polymorphic lookups (Phase 3) Introduce L2ELCapable interface that captures shared behavior across L2ELNode, RollupBoostNode, and OPRBuilderNode without requiring them to share an ID() method signature. This enables polymorphic lookups where code can find any L2 EL-capable component by key+chainID, regardless of concrete type: sequencer, ok := FindL2ELCapableByKey(registry, "sequencer", chainID) Previously this required manual multi-registry lookups checking each type separately. * refactor(op-devstack): migrate Orchestrator to unified Registry (Phase 4) Replace 15 separate locks.RWMap registry fields in Orchestrator with a single unified *stack.Registry. This completes the ID type system refactor by consolidating all component storage into one registry with secondary indexes for efficient lookups by kind and chainID. Key changes: - Remove l1ELs, l1CLs, l1Nets, l2ELs, l2CLs, l2Nets, batchers, proposers, challengers, rollupBoosts, oprbuilderNodes, supervisors, clusters, superchains, and faucets fields from Orchestrator - Add single registry *stack.Registry field - Update GetL2EL to use FindL2ELCapableByKey for polymorphic lookups - Update Hydrate to iterate by kind with explicit ordering - Update ControlPlane methods to use registry lookups - Migrate ~24 files to use registry.Register() and registry.Get() patterns - Change l2MetricsEndpoints from locks.RWMap to map with sync.RWMutex All 54 stack tests pass. * fix(op-devstack): address PR ethereum-optimism#18875 review feedback
* feat: l2cm impl l2contractsmanager (ethereum-optimism#837) * feat: add initial iteration of L2ContractsManager * feat: add network configuration structs * feat: load full config for L2ContractsManager * feat: implement L2CM::_apply * feat: add gas price oracle * refactor: move L2CM types to library * fix: upgrade ProxyAdmin predeploy * chore: enforce delegatecall for L2CM::upgrade * feat: add conditional upgrade for CGT * refactor: remove non-proxied predeploys * chore: renamed l2cm * refactor: l2cm address comments (ethereum-optimism#839) * refactor: rename _fullConfig to _loadFullConfig to match OPCM v2 * chore: remove non-proxied weth from implementations struct * test: add config preservation test * test: add CGT specific tests * refactor: avoid casting network config values to address * test: add test cases * chore: pr ready (ethereum-optimism#844) * chore: remove unnecesary casting on L2CM * feat: add interface for XForkL2ContractsManager * chore: add natspec to XForkL2ContractsManager * chore: pr ready * refactor: moves util functions out of L2CM implementation (ethereum-optimism#848) * feat: l2cm address comments (ethereum-optimism#850) * chore: add comment clarifying use `useCustomGasToken` * chore: upgrade both native native asset liquidity and liquidity controller predeploys together * feat: prohibit downgrading predeploy implementations * refactor: make isCustomGasToken part of the network full config * fix: add missing import * fix: use FeeVault legacy getters for backward compat * chore: update name XForkL2ContractsManager to L2ContractsManager * feat: conditionally skip some predeploys based on them being supported in a given chain (ethereum-optimism#857) * fix: l2cm address comments (ethereum-optimism#872) * chore: add todo tracking removal of L2ProxyAdmin skips * chore: add natspec comment for isPredeployNamespace * chore: use vm.prank(address,bool) to prank a delegatecall * chore: add todo for dev flags for CrossL2Inbox and L2ToL2CrossDomainMessenger * feat: allow immutables for L2CM in semgrep rules * chore: pr ready * test: L2CM verify testing (ethereum-optimism#874) * test: add coverage test for predeploy upgrades * chore: update test natspec * chore: just pr ready * chore: L2CM round comments (ethereum-optimism#877) * refactor: move helper function into Predeploys.s.sol * fix: add conditional deployer to L2CM * chore: update to l1block and l1blockCGT * test: fixes issue where OptimismSuperchainERC20 tests fail due to profile ambiguity * chore: just pr ready * chore: l2cm round comments2 (ethereum-optimism#883) * fix: move code length check out of isUpgradeable * chore: inline fullCofig_.isCustomGasToken initialization * chore: add public getters for the implementations on the L2CM * chore: remove XForkL2ContractsManager sol rule exclusion * test: add downgrade prevention test suite * chore: just pr ready * refactor: check for address 0 instead code length * Revert "refactor: check for address 0 instead code length" This reverts commit 1fa8694. * chore: remove non-needed check * chore: remove unused function in tests (ethereum-optimism#884) * refactor: l2cm group impls (ethereum-optimism#885) * refactor: remove individual getters in favor of a unified one * test: add test for getImplementations * test: add OZ v5 Initializable compatibility in L2ContractsManagerUtils (ethereum-optimism#887)
…thereum-optimism#19305) * add much logging * op-devstack/supernode: check Start error, and cancel Start context before calling Stop * devstack/supernode: eliminate duplicated lifecycle management * use interop name instead of reflection --------- Co-authored-by: Axel Kingsley <axel.kingsley@gmail.com>
…erop flag (ethereum-optimism#19302) * op-devstack: refactor genesis interop activation to use UseGenesisInterop flag Extracts genesis timestamp resolution out of WithSharedSupernodeCLsInterop and into withSharedSupernodeCLsImpl via a new UseGenesisInterop field on SupernodeConfig. Adds WithSupernodeInteropAtGenesis() option and threads snOpts through defaultSupernodeSuperProofsSystem so callers can pass supernode options independently of deployer options. Ported from ethereum-optimism#19242 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Skip failing test. * Move test that stops the batcher to its own package. * Skip one more test. --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…#19323) * fix(contracts-bedrock): resolve VerifyOPCM bytecode mismatch from compiler profile ambiguity When `additional_compiler_profiles` is configured in foundry.toml, contracts pulled into the dispute profile's compilation graph get compiled with both default (999999 optimizer runs) and dispute (5000 runs) profiles. PR ethereum-optimism#19111 added L2ProxyAdmin extending ProxyAdmin, which pulled ProxyAdmin (and transitively OptimismMintableERC20Factory) into the dispute profile graph. On CI (Linux), `vm.getCode("ProxyAdmin")` non-deterministically resolves to the dispute profile artifact (6149 bytes creation code), while VerifyOPCM reads the default profile artifact from disk (6751 bytes). This mismatch causes VerifyOPCM_Failed() across all chains and feature flags on CI, while passing locally on macOS where the resolution order differs. The fix adds `DeployUtils.getCode()` which constructs explicit artifact file paths (`forge-artifacts/<Name>.sol/<Name>.json`) to always resolve the default profile. All `vm.getCode()` callsites in scripts and tests are migrated to use this helper. A semgrep rule enforces this going forward. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(contracts-bedrock): add try/catch fallback and cicoverage gas test fix Add try/catch fallback to DeployUtils.getCode() so the Go script host (which doesn't support explicit artifact paths) gracefully falls back to vm.getCode(_name). Also add "/" passthrough for callers passing explicit paths. Fix L1ChugSplashProxy OOG gas test: under cicoverage, the now-correct default-profile proxy bytecode is larger, leaving insufficient retained gas (1/64 rule) for the require message. Use generic vm.expectRevert() for unoptimized profiles — the test still verifies the revert occurs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(contracts-bedrock): fix semgrep findings in DeployUtils and L1ChugSplashProxy Rename try/catch return variable to `code_` (trailing underscore convention) and add L1ChugSplashProxy.t.sol to expectrevert-no-args exclusion list since the bare vm.expectRevert() is intentional (OOG produces no revert data). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(contracts-bedrock): skip explicit artifact path under coverage Under coverage profiles, forge-artifacts/ contains the default profile's (optimized) artifacts, not the coverage profile's. Since coverage profiles have no additional_compiler_profiles, there is no profile ambiguity, so plain vm.getCode() resolves correctly. Skip the explicit artifact path under vm.isContext(Coverage) to avoid bytecode mismatches between artifact- loaded code and fresh compilation in tests (DeployFeesDepositor, DeployMIPS). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(contracts-bedrock): wrap isContext in try/catch for Go host compat The Go script host doesn't implement vm.isContext(), causing a revert that propagates up as an unrecognized selector error. Wrap the coverage detection in try/catch so the Go host silently falls through to the artifact-path resolution (which itself falls back to vm.getCode). Also adds a comment explaining why the catch block is intentionally empty. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* DSL: Coordinate Interop Activity Pause for Acceptance Testing * op-acceptance-tests: add same-timestamp invalid message tests Add acceptance tests for supernode interop that verify invalid same-timestamp executing messages are correctly detected and replaced. TestSupernodeSameTimestampInvalidExecMessage: - Chain A emits initiating message at timestamp T - Chain B executes that message at timestamp T (same timestamp - invalid) - Verifies Chain B's block is replaced with deposits-only block - Verifies Chain A's block (with valid init) is NOT replaced TestSupernodeSameTimestampInvalidTransitive: - Chain A: init(IA) + exec(IB) (valid reference to B's init) - Chain B: init(IB) + exec(IA) (invalid - bad log index) - Verifies transitive invalidation: B replaced first, then A replaced because B's init no longer exists after B was replaced These tests validate the strict timestamp checking and cascading invalidation behavior of the interop system. * Rename first test * interop: allow same-timestamp executing messages Subfeature 1 of Same-Timestamp Interop feature. Changes the timestamp validation to allow executing messages that reference initiating messages from the same timestamp. Previously, the check was >= which rejected same-timestamp messages. Now it uses > which only rejects future timestamps. - algo.go: Change timestamp check from >= to > in verifyExecutingMessage - algo_test.go: Add ValidBlocks/SameTimestampMessage test, rename TimestampViolation to FutureTimestamp for clarity - same_timestamp_invalid_test.go: Update expectations - same-timestamp messages are now valid and blocks are not replaced - SameTimestampInterop_Feature.md: Feature diary documenting the work * interop: add cycleVerifyFn field for same-timestamp verification Subfeature 2 of Same-Timestamp Interop feature. Adds the cycleVerifyFn field to the Interop struct. This function will be used to verify same-timestamp executing messages that may form circular dependencies between chains. The field starts as nil and will be set by the circular verification implementation (Subfeature 4). - interop.go: Add cycleVerifyFn field with documentation - interop_test.go: Add TestCycleVerifyFn test section verifying the field can be set, called, return invalid heads, and return errors * interop: route same-timestamp messages through cycleVerifyFn Subfeature 3 of Same-Timestamp Interop feature. Implements the routing logic for same-timestamp executing messages: - verifyExecutingMessage now returns ErrSameTimestamp sentinel when the initiating message timestamp equals the executing timestamp - verifyInteropMessages catches ErrSameTimestamp and tracks whether any chain has same-timestamp messages - After the main loop, if same-timestamp messages exist AND cycleVerifyFn is set, it calls cycleVerifyFn and merges any invalid heads into the result This allows same-timestamp messages to be verified by the cycle verification algorithm (to be implemented in Subfeature 4) rather than immediate validation. - algo.go: Add ErrSameTimestamp, modify verification flow - algo_test.go: Add CycleVerify/* tests for routing behavior * interop: add cycleVerifyFn for same-timestamp cycle verification Adds infrastructure for same-timestamp interop cycle verification: - Add cycleVerifyFn field to Interop struct, called after verifyFn in progressInterop with results merged (invalid heads combined) - Create circular.go with stub verifyCycleMessages implementation that returns a valid result (algorithm to be implemented) - Set cycleVerifyFn in New() - function is always set, not optional - Add TestProgressInteropWithCycleVerify test suite verifying: - Results from both verifyFn and cycleVerifyFn are merged - Errors from cycleVerifyFn propagate correctly - Invalid heads from both functions are combined This prepares the codebase for implementing the actual cycle verification algorithm that will resolve same-timestamp circular dependencies. * interop: implement cycle detection algorithm for same-timestamp messages - Add executingMessageBefore helper (finds latest EM with logIndex <= target) - Add buildCycleGraph to construct dependency graph from same-timestamp EMs - Implement verifyCycleMessages to orchestrate cycle detection - Add comprehensive tests for executingMessageBefore, buildCycleGraph, checkCycle Edges in dependency graph: - Intra-chain: each EM depends on previous EM on same chain - Cross-chain: each EM depends on executingMessageBefore(targetChain, refLogIdx) Cycle detection uses Kahn's topological sort algorithm. * acceptance: add cycle detection test and rename same_timestamp_test.go - Rename same_timestamp_invalid_test.go to same_timestamp_test.go (since same-ts is now valid) - Add TestSupernodeSameTimestampCycle: tests that mutual same-timestamp exec messages (A executes B, B executes A) are detected as a circular dependency and cause both blocks to be replaced - Update spec comment to document all three test scenarios * interop: add feature diary for same-timestamp interop Documents the implementation of same-timestamp interop verification: - Feature goals and breakdown into subfeatures - Development diary with entries for each implementation phase - Complete test coverage summary (30 unit tests, 3 acceptance tests) Key changes documented: - Relaxed timestamp check (>= → >) to allow same-timestamp messages - Added cycleVerifyFn for cycle detection - Implemented Kahn's topological sort for circular dependency detection - Added acceptance test for cycle detection causing reorgs * interop: only invalidate cycle participants, not bystanders Previously, when a cycle was detected, all chains with same-timestamp executing messages were marked as invalid. This was overly broad. Now, only chains with unresolved nodes after Kahn's algorithm are marked as invalid. Chains that have same-timestamp EMs but whose nodes all resolved (i.e., they weren't part of any cycle) are spared. - Add collectCycleParticipants helper to identify unresolved chains - Update verifyCycleMessages to use precise cycle participant set - Add TestVerifyCycleMessagesOnlyCycleParticipants test - Add TestCycleParticipants graph-level test * interop: rename circular.go to cycle.go Self-review cleanup: rename 'circular' to 'cycle' throughout: - circular.go -> cycle.go - circular_test.go -> cycle_test.go - Updated comments: 'circular dependency' -> 'cycle' - Updated Feature.md documentation references * interop: simplify cycle verification buildCycleGraph simplification: - Remove unused nodeByLocation map (dead code) - Remove intermediate logIndices extraction - Build nodes directly from map iteration - Sort with slices.SortFunc after building - Delete sortUint32s helper (replaced by stdlib) Remove cycleVerify knowledge from verifyInteropMessages: - verifyInteropMessages now has no knowledge of cycleVerify - cycleVerifyFn is called from progressInterop (not verifyInteropMessages) - Remove hasSameTimestampMessages tracking - Remove cycleVerifyFn call block - Delete 4 CycleVerify tests from algo_test.go (covered by interop_test.go) * interop: remove feature diary from PR Keep locally for reference but exclude from version control. * remove unrelated files from PR - reth submodule - superchain-registry submodule - SuperRootRefactor_Feature.md diary * tests: simplify same-timestamp interop tests cycle_test.go (692 → 536 lines, -23%): - Add helper functions: mutualCycle, triangleCycle, oneWayRef, mergeEMs - Merge TestCycleParticipants into TestBuildCycleGraph - Delete redundant TestVerifyCycleMessagesOnlyCycleParticipants - Use shared test constants (testChainA/B/C/D, testTS) same_timestamp_test.go (830 → 298 lines, -64%): - Extract sameTimestampHarness for common setup - Consolidate 3 tests using shared harness methods - Remove ~500 lines of duplicated setup code - Simplify helper functions Total reduction: 1522 → 834 lines (-45%) * interop: remove block comments from file headers * Human updates * remove test from other PR * Test Sequencer and DSL * lint * update from merge * address PR comments
* Initial Block Seal * test(supernode): add integration test for first block with logs Add integration test that uses real logs.DB to verify first block with logs works correctly. This test would have caught the bug where isFirstBlock with logs failed due to empty parentBlock. Changes: - Update mockLogsDB to track all SealBlock calls (not just last) - Update existing tests to verify new two-SealBlock behavior - Add unit test for first block with logs using mock - Add integration test using real logs.DB The integration test validates: - First block at non-zero number with logs succeeds - Data is correctly persisted (latestBlock, logCount, parentHash) * lint
…19329 (ethereum-optimism#19530) * op-deployer: atomic Docker build with in-container contract compilation Build contracts inside the Docker image instead of relying on pre-compiled artifacts from CI workspace attachment. Fetches git submodules via shallow blobless clone and runs the full build atomically. Adds libc6-compat for solc glibc compatibility on Alpine. * ci: add op-deployer to GitHub Actions Docker build matrices Add op-deployer to the build, build-fork, and check-cross-platform matrices in branches.yaml, matching the pattern used by all other Go service images. * ci: remove op-deployer Docker build from CircleCI Remove the docker-build job, check-cross-platform job, and scheduled-docker-publish workflow that only served op-deployer. Remove the docker_publish_dispatch parameter from both config files. Preserve contracts-bedrock-build which is still used by other jobs. * ci: remove orphaned ci-docker-tag-op-stack-release.sh Only referenced by the now-removed docker-build job's release step. * remove newline for command clarity * fix: use gitsubmodule code instead of fetching * op-deployer: compile contracts in amd64 stage for cross-platform Docker builds * op-deployer: use glibc-based stage for contract compilation in Docker build * fix: hash comparison --------- Co-authored-by: Federico <14293929+falcorocks@users.noreply.github.com>
…m#19595) Three interop action tests flake with "nonce too low" because they deploy a contract and then build a subsequent tx for the same account using PendingNonceAt. The deploy tx is included via IncludeTx (bypassing the tx pool), so by the time PendingNonceAt queries the pool for the next nonce the pool may not have synced the new chain head yet, returning a stale value. Fix by isolating the deploy to a separate user account (key index 1) so the primary user's nonce is always 0 on first use, and by using explicit nonces in the exec-message loop of TestExecMsgDifferTxIndex. Fixes flakes (25-27 occurrences each on develop): - TestExpiredMessage - TestBreakTimestampInvariant - TestInitAndExecMsgSameTimestamp - TestExecMsgDifferTxIndex Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
) Add --dangerously-enable-passthrough flag that allows all transactions through without interop filtering. This supports testing invalid executing messages on the interop devnet. Closes ethereum-optimism#19565
…um-optimism#19576) * fix(op-supernode): prevent shutdown hang from Start/Stop race condition Stop() could race with activity goroutines spawned by Start(). If Stop() ran before a goroutine was scheduled, activity.Stop() found cancel==nil and did nothing. When the goroutine later ran, Start() blocked forever on <-ctx.Done() with no way to be canceled, causing wg.Wait() to hang. Fix: introduce a lifecycle context created in Start() and canceled at the top of Stop(). Activities and chains receive this context instead of the caller's context. Even if Stop() wins the race, the goroutine sees an already-canceled context when it eventually starts, and exits immediately. Also fix data race in test mock: mockRunnable.Name() used a value receiver (copying the struct while Start() was writing fields), and Start()/Stop() accessed the cancel field without synchronization. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(op-supernode): run goimports on struct field alignment Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…sm#19579) * fix(op-batcher): fix flaky TestChannelManager_Memory by using TotalAlloc The test measured memory using `runtime.MemStats.Alloc` (current heap size), which can decrease after GC runs. The subtraction `finalMem.Alloc - initialMem.Alloc` on uint64 values underflows when GC reclaims enough memory between the two reads, producing a massive number that exceeds the 512MB threshold. Switch to `TotalAlloc` which is monotonically increasing and safe to subtract. Raise the threshold to 1GB since TotalAlloc counts cumulative allocations including freed memory. Actual usage is ~30MB, so the threshold provides ample headroom. Flake count: 19 in CircleCI (go-tests-short). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(op-batcher): use HeapInuse absolute threshold for TestChannelManager_Memory Address review feedback: use HeapInuse after GC as absolute threshold instead of TotalAlloc delta. This correctly measures retained memory (catching leaks) while eliminating the uint64 underflow that caused flakiness. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(op-batcher): guard against uint64 underflow in TestChannelManager_Memory The test measures retained memory by subtracting initial Alloc from final Alloc. When GC reclaims memory between the two ReadMemStats calls (from other goroutines), final Alloc can be less than initial Alloc, causing a uint64 underflow that produces a massive value and fails the 512MB check. Guard the subtraction: if final < initial, treat the delta as zero. This preserves the original test semantics (bounding retained heap) while handling the GC timing edge case that causes intermittent failures. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* chore: replace stale make calls with just, falling back for old tags build-prestates.sh and build-legacy-cannons.sh build from historic tags where justfiles may not exist yet, so prefer just when a justfile is present and fall back to make otherwise. Also updates stale "make golang-docker" comments in Dockerfiles. Part of ethereum-optimism#19546. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: check for specific just recipe, not just justfile existence Tags like kona-client/v1.2.10-rc.1 have a justfile but predate the reproducible-prestate recipe. Check that the recipe exists with `just --show <recipe>` before attempting to use it, falling back to make when the recipe is missing. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…round (ethereum-optimism#19585) The test asserted final head state (1,1,1,1) without giving the op-node a chance to learn about the supervisor's cross-safe/safe promotion of the replacement block. After the supervisor processes the replacement block, the op-node needs an additional SyncSupervisor + PipelineFull cycle to propagate the promotion back. This matches the pattern used by similar tests (e.g. interop_test.go) which perform multiple sync rounds. Flake count: 27 in CircleCI go-tests-short. Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…reum-optimism#19581) When forge fuzz tests fail in certain ways (e.g. proptest failures), the JUnit XML may not be parsed by store_test_results, leaving no diagnostic info. Store the raw results/ directory as an artifact so it can be inspected directly when investigating flaky test failures. Added to both contracts-bedrock-tests-heavy-fuzz and contracts-bedrock-tests-upgrade jobs. See ethereum-optimism#19577 Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ind (ethereum-optimism#19571) * fix(op-supernode): freeze all chains' VNs before any invalidation rewind When the interop activity invalidates blocks, it sequentially calls InvalidateBlock → RewindEngine for each invalid chain. RewindEngine's onReset callback modifies shared interop state (prunes verifiedDB, rewinds logsDB, resets currentL1). A peer chain's still-running virtual node can observe this state change and issue a ForkchoiceUpdate that advances its safe head. If that chain is later invalidated — either in the same round (cycle detection) or in a subsequent round (transitive invalidation) — its rewind is rejected because the safe head was already advanced past the rewind target. This is the root cause of flaky tests like TestSupernodeSameTimestampInvalidTransitive and TestSupernodeSameTimestampCycle. The transitive case is especially affected because invalidation happens across multiple verification rounds: chain B is invalid in round 1, then chain A (which depended on B's now-replaced init message) becomes invalid in round 2. Between rounds, chain A's VN reacts to round 1's state change. Fix: freeze ALL chains' VNs (PauseAndStopVN) before executing any rewind, not just the ones being invalidated. Resume non-invalidated chains after all rewinds complete. Invalidated chains are resumed by RewindEngine itself. Also adds: - maxRewindAttempts (10) to prevent infinite retry loops - Better error logging in engine controller rewind (validation errors, block numbers, hashes) Closes ethereum-optimism#19570 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * drop maxRewindAttempts — unsafe to let VN restart between retries Removing maxRewindAttempts because giving up mid-rewind allows the VN to restart via the deferred Resume while the invalid block is still at the chain tip. The VN can then advance state, causing the WAL-driven retry to encounter a different chain state than expected. The original infinite retry bounded by context deadline is safer: it keeps the VN stopped throughout the retry window. The context deadline (from the interop activity's context) provides the ultimate bound. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test(interop): verify freeze-all-then-resume ordering in invalidation flow (ethereum-optimism#19572) Add TestFreezeAllBeforeRewind with four sub-tests that verify the call ordering introduced by the freeze-all-chains step: - All chains are frozen (PauseAndStopVN) before any InvalidateBlock call - Only non-invalidated chains receive Resume after invalidation - Resume calls happen strictly after all InvalidateBlock calls - When all chains are invalidated, no Resume calls are made Extends the mockChainContainer with call tracking for PauseAndStopVN, Resume, and InvalidateBlock, plus a shared callLog type that records cross-mock call ordering for sequence assertions. Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: goimports formatting in mock method declarations Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The goal of the test is to assert that system deposit transactions cannot be present in post-Regolith blocks. Previously, the test would erroneously succeed by attempting to create a block with too much gas. When combined with a small change in op-geth, the test now succeeds for the correct reason.
…laky test (ethereum-optimism#19593) The TestImplementations test (66 flakes) relies on the devnet RetryProxy to forward RPC calls to external mainnet/sepolia endpoints. Under CI load (12 parallel nodes on a 2xlarge), the proxy's tight timeouts caused intermittent failures: - Per-request timeout of 5s was insufficient for slow external RPCs under load; increased to 30s (matching the Anvil startup timeout bump in ethereum-optimism#19424) - Max retries of 5 was too few for sustained rate limiting; increased to 10 - Start() had a race condition: used a 100ms timer instead of a proper ready signal, and failed to return after net.Listen errors. Replaced with a channel-based ready signal that blocks until the listener is actually bound. Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ism#19580) * fix(op-devstack): stabilize TestSubProcess flaky test Replace cmd.Process.Wait() with cmd.Wait() in SubProcess.Stop() to ensure stdout/stderr data is fully flushed before returning. The raw os.Process.Wait() only waits for process exit without guaranteeing I/O completion, causing a race where log assertions run before output has been written to the LineBuffer. Treat signal-exit errors as graceful when interrupt was requested. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(op-devstack): tighten error handling per review feedback Only suppress exec.ExitError (not all errors) when interrupt=true, and log "Sub-process stopped" instead of "gracefully exited" for signal-killed processes. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(op-devstack): update test assertion for signal-killed process log message The testSleep helper expected "Sub-process gracefully exited" but the previous commit changed signal-killed processes to log "Sub-process stopped". Update the assertion to match. 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#19536) * refactor: move OP-specific EVM code into alloy-op-evm newtypes Introduce OpTx and OpTxError newtype wrappers in alloy-op-evm to hold all OP-specific EVM implementations that were previously in alloy-evm's `op` module. This satisfies Rust's orphan rule while decoupling alloy-evm from Optimism-specific dependencies. Changes: - Add OpTx newtype wrapping OpTransaction<TxEnv> with all necessary trait impls (Transaction, TransactionEnv, FromRecoveredTx, FromTxWithEncoded, IntoTxEnv, OpTxEnv, TryIntoTxEnv) - Add OpTxError newtype wrapping OpTransactionError with InvalidTxError and map_op_err helper - Move spec ID mapping and EvmEnv constructors as free functions (evm_env_for_op_block, evm_env_for_op_next_block, evm_env_for_op_payload) - Add rpc module with TryIntoTxEnv<OpTx> for OpTransactionRequest - Update all downstream crates (op-reth, kona, custom-node example) - Remove alloy-evm "op" feature usage from kona crates Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * chore(rust): move newtypes to op-reth and kona --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat: split gotestsum JSON logs into per-test files Add two scripts under ops/scripts/: - split-test-logs.sh: takes a gotestsum JSON log file and splits it into one log file per test, organized as per-test/<package>/<TestName>.log next to the source JSON file. - gotestsum-split.sh: drop-in gotestsum wrapper that runs gotestsum, then calls split-test-logs.sh. Preserves gotestsum's exit code so splits happen even on test failure. If --jsonfile isn't provided, adds one automatically (tmp/testlogs/log.json) so per-test logs are always generated. All gotestsum invocations in justfiles and CI config now use the wrapper. The one exception is the xargs-based parallel sharding in kona action tests, which calls gotestsum directly (since xargs invokes it multiple times appending to one jsonfile) and then calls split-test-logs.sh once at the end. Per-test logs land under tmp/testlogs/per-test/ which is already captured by existing CircleCI store_artifacts steps. Also migrates rust/op-reth/crates/tests from plain `go test` to gotestsum via the wrapper for consistency. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: fail on split-test-logs.sh errors instead of silently ignoring split-test-logs.sh now exits non-zero when the JSON file is missing or python3 is unavailable. gotestsum-split.sh propagates split failures (preferring the split exit code over gotestsum's if both fail). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: correct script paths in kona tests justfile SOURCE is rust/kona/tests, so the repo root is ../../../ not ../../. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(ci): use literal path for store_artifacts in go-tests job store_artifacts doesn't support glob patterns — `testlogs*.tar.gz` was treated as a literal filename, so no artifacts were ever captured for parallel go-tests jobs. Use a consistent `testlogs.tar.gz` name since the node index is already in the filenames inside the tarball. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…sm#19621) * docs: update README build commands from make to just Update build command references in op-challenger, op-supervisor, op-dispute-mon, and ecotone-scalar READMEs to use `just` instead of `make`, reflecting the ongoing build system migration. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: update op-service and vm-compat-triage make refs to just Missed in initial commit — op-service/README.md had `make test`/`make fuzz` and .claude/skills/vm-compat-triage/SKILL.md had `make run-vm-compat`. Part of ethereum-optimism#19546 Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…-tests (ethereum-optimism#19622) Remove three test functions from op-e2e/actions/interop/proofs_test.go that are now covered by equivalent tests in op-acceptance-tests via the shared superfaultproofs package: - TestInteropFaultProofs_TraceExtensionActivation - TestInteropFaultProofs_UnsafeProposal - TestInteropFaultProofs_ConsolidateValidCrossChainMessage Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… advance (ethereum-optimism#19620) * fix(op-supernode): cap interop CurrentL1 at min of node CurrentL1s on advance When interop validates a timestamp and advances, L1Inclusion is the max L1 block across all chains for that timestamp. This could exceed some chains' actual CurrentL1 (e.g. chain A derived from L1 1000, chain B from L1 990 — but chain B might advance to T+1 without ever reaching L1 1000). Cap interop.currentL1 at min(L1Inclusion, min(chains' CurrentL1)) so the interop activity individually satisfies the same safety invariant as the aggregate syncstatus view, rather than relying on the external min() to save it. Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com> * chore: add comment explaining why CurrentL1 is capped on advance Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: correct goimports formatting in interop test Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
…ism#19556) * fix(op-service): add 30s timeout to eth_estimateGas in txplan TestChallengerRespondsToMultipleInvalidClaimsEOA hung for 2 hours in CI (the full Go binary timeout) with no deterministic code-level bug. The EOA variant uses EIP-7702 to delegate code to a GameHelper contract, then calls PerformMoves which relies on gas estimation. If eth_estimateGas hangs for a 7702-delegated EOA target, the call blocks for the entire parent context lifetime (~2 hours in CI). Add a 30-second timeout context around the EstimateGas call in WithEstimator so a hanging RPC call fails fast instead of consuming the entire test budget. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(op-devstack): add tx timeout to GameHelper Eval calls TestChallengerRespondsToMultipleInvalidClaimsEOA hung for 2 hours in CI (the full Go binary timeout). All Eval calls in GameHelper inherited the test's ~2-hour context with no per-transaction timeout, so a hanging RPC call (e.g. eth_estimateGas for an EIP-7702 delegated EOA) blocked silently for the entire duration. Add a 5-minute timeout context around each Eval call in GameHelper (deploy, AuthEOA, CreateGameWithClaims, PerformMoves). This bounds the entire tx lifecycle — estimation, signing, submission, and inclusion — so any single hanging operation fails fast. Also reverts the txplan.WithEstimator timeout from the previous commit, since the timeout belongs at the caller level, not in infrastructure. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ent CI flakes (ethereum-optimism#19625) The CLI integration tests deploy contracts over a forked Sepolia RPC via RetryProxy. Under CI load with 12 parallel nodes, external RPC latency varies widely and can cause the cumulative test time to exceed the 20-minute binary timeout. Three timeout issues fixed: 1. Bootstrap context (Superchain + Implementations deployment) was only 5 minutes — too tight when RPC latency spikes. Increased to 10 min in both TestCLIMigrateV1 and TestCLIMigrateV2. 2. The `apply` command used context.Background() with no timeout, meaning it could run unbounded until the binary timeout killed it. Added a 5-minute timeout. 3. ExpectSuccess, ExpectSuccessWithNetwork, and ExpectErrorContains in cli_runner.go all had 60-second timeouts — too tight for any caller that deploys contracts over external RPC. Increased to 5 minutes. This benefits 30+ call sites across the CLI integration tests. Closes ethereum-optimism#19624 Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…erGenesis (ethereum-optimism#19615) * fix(op-acceptance-tests): re-enable TestSupernodeInteropActivationAfterGenesis Remove t.Skip that was added in ethereum-optimism#19402 due to supernode shutdown hangs with nonzero interop activation delays. The root cause was a Start/Stop race condition in op-supernode, fixed in ethereum-optimism#19576. With the lifecycle context fix in place, the shutdown hang no longer occurs. Closes ethereum-optimism#19403 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(op-acceptance-tests): remove TestSupernodeInteropActivationAfterGenesis from flake-shake The supernode-interop gate already covers this test via the interop/... wildcard package pattern, so no explicit addition to that gate is needed. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Revert "fix(op-acceptance-tests): remove TestSupernodeInteropActivationAfterGenesis from flake-shake" This reverts commit 196805b. --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…flaky RPC calls (ethereum-optimism#19592) * fix(op-validator): add retry logic to TestAddressValidDeployment for flaky RPC calls The test makes live RPC calls to publicnode.com endpoints which timeout intermittently in CI (14 flakes). This adds: - Retry with backoff for transient errors (timeouts, connection resets, 429s) - Increased per-call timeout from 30s to 60s - Single RPC client per network instead of one per contract version - Helper functions (retryRPCCall, dialRPCWithRetry, w3CallWithRetry) The test continues to run and validate on-chain contract versions — no skipping. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(op-validator): address review feedback on retry logic - Add "connection refused" to transient error detection - Skip sleep on last retry attempt to avoid wasting 2s before failing - Remove redundant "i/o timeout" check (already covered by "timeout") Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(op-validator): use op-service/retry instead of custom retry helpers Replaces the hand-rolled retry loop and transient-error detection with retry.Do/Do0 from op-service/retry, as suggested in code review. We're not testing the RPC provider here, so retrying all errors is fine and keeps the code simpler. Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… initialize() (ethereum-optimism#19564) * refactor(contracts): move ProxyAdminOwnedBase to src/universal/ - move ProxyAdminOwnedBase.sol from src/L1/ to src/universal/ for L1+L2 reuse - move IProxyAdminOwnedBase.sol from interfaces/L1/ to interfaces/universal/ - update 39 import paths across source, interfaces, tests, and scripts - regenerate semver-lock and upgrade-bundle snapshots (metadata-only changes) * chore(contracts): patch-bump versions for import path change - bump semver on 13 contracts affected by ProxyAdminOwnedBase move - regenerate semver-lock.json with updated source code hashes * feat(contracts): add ProxyAdminOwnedBase to L2 proxied contracts with initialize() Adds ProxyAdminOwnedBase inheritance to 7 L2 contracts that have initialize() functions, matching the pattern already used by L1 contracts. Each initializer now calls _assertOnlyProxyAdminOrProxyAdminOwner() as its first statement to gate re-initialization behind proxy admin ownership. Contracts updated: - FeeVault (covers BaseFeeVault, L1FeeVault, OperatorFeeVault, SequencerFeeVault) - L2CrossDomainMessenger - L2StandardBridge (covers L2StandardBridgeInterop) - L2ERC721Bridge - FeeSplitter - LiquidityController - OptimismMintableERC721Factory L2Genesis.s.sol changes to support the new assertion: - _setImplementationCode now sets EIP-1967 admin slot on impl addresses - setPredeployImplementations now pranks as opChainProxyAdminOwner - setL2ProxyAdmin moved to run first so proxyAdminOwner() is set before other contracts' initializers check it Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(contracts-tests): mock DWETH/ETHLockbox impls in fork upgrade tests The upgrade function reuses existing DelayedWETH proxies rather than upgrading their implementations, so on a mainnet fork the proxy still points to the old impl address. After the version bump (1.5.1), validator.delayedWETHImpl() now refers to a different address than what the fork's proxy has, causing DWETH-10 (version) and DWETH-20 (getProxyImplementation) validator checks to fail. Extend mockUnoptimizedProxyImplementations to also apply in fork tests (not just unoptimized profiles), and add version() mocks to satisfy the -10 checks. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore(contracts): bump semver for L2 contracts inheriting ProxyAdminOwnedBase Bump patch versions for the 11 contracts whose source changed due to inheriting ProxyAdminOwnedBase. Also inherit IProxyAdminOwnedBase in the corresponding interface files and regenerate ABI/semver snapshots. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(contracts): restore outer prank around setL1Block in L2Genesis setL1Block() uses vm.startPrank/vm.stopPrank for the DEPOSITOR_ACCOUNT call when CGT is enabled. Move the outer vm.startPrank(opChainProxyAdminOwner) into setPredeployImplementations() and stop/restart it around the setL1Block() call so the inner prank can operate without conflict. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore(contracts): add IProxyAdminOwnedBase to 5 more L2 interfaces BaseFeeVault, L1FeeVault, SequencerFeeVault, OperatorFeeVault, and L2StandardBridgeInterop inherit ProxyAdminOwnedBase transitively through FeeVault and L2StandardBridge. Their interfaces need to reflect this. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(contracts): Update incorrect natspec semver * fix(contracts): semver-lock * fix(contracts): Add stopPrank at the end of setPredeployImplementations * fixt(contracts): Remove FeeVault_OnlyProxyAdminOwner error * fixt(contracts): Remove FeeVault_OnlyProxyAdminOwner error --------- Co-authored-by: Ariel Diaz <ariel@oplabs.co> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…ad of silently swallowing them (ethereum-optimism#19604)
Co-authored-by: wwared <541936+wwared@users.noreply.github.com>
KyrinCode
approved these changes
Mar 26, 2026
Upstream optimism migrated from Make to Just (casey/just) as the build runner. The previous Dockerfile-opstack used `make build-go-no-submodules` which no longer exists. Changes: - Dockerfile-opstack: Replace `make build-go-no-submodules` with `just op-node op-batcher op-proposer op-challenger op-dispute-mon` for components with root-level recipes, and `just ./op-conductor/op-conductor` for op-conductor which only has a sub-directory recipe. - .dockerignore: Add `!/justfile` to include the root justfile in the Docker build context (`!/justfiles` directory was already included).
fix: migrate Dockerfile-opstack from Make to Just build system
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.