Closed
Conversation
…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>
… 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>
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>
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.
this PR is to review all the work towards solving mofi's comment ethereum-optimism#19685 (review)