Skip to content

op-node,op-chain-ops: add Upgrade 18 (CGT v2) activation fork plumbing#471

Draft
karlb wants to merge 1 commit into
celo-rebase-18from
karlb/upgrade18-fork-plumbing
Draft

op-node,op-chain-ops: add Upgrade 18 (CGT v2) activation fork plumbing#471
karlb wants to merge 1 commit into
celo-rebase-18from
karlb/upgrade18-fork-plumbing

Conversation

@karlb

@karlb karlb commented Jul 14, 2026

Copy link
Copy Markdown

Provisional activation trigger for the CGT v2 predeploy migration (celo-blockchain-planning#1410). The migration itself is an irregular state transition performed entirely by the execution layer; the op-node only needs to carry the schedule and expose the predicate.

Upgrade18 is registered as an optional fork (forks.AllOpt, like PectraBlobSchedule) rather than a mainline one: it is a one-shot migration trigger for the two live Celo networks, so it must not be scheduled implicitly by ActivateAtGenesis/ActivateForkAtOffset chains on unrelated chains, has no allocs mode, and does not belong in the proof-test fork matrices. Cel2Time set the same precedent.

  • forks.go: Upgrade18 name in AllOpt. Via OverridableForks this also provides an --override.upgrade18 CLI flag / env var for free.
  • rollup.Config: Upgrade18Time. The JSON key is pinned to celo-kona's CeloRollupConfig (upgrade18_time): the canonical rollup.json of a migrating chain carries it for the proof programs, and ParseRollupConfig's DisallowUnknownFields would otherwise reject that file. The four artifact param overrides are deliberately NOT added: they are a dev/e2e proof-host channel (real networks use the artifact's per-network constants), so op-node never sees them. IsUpgrade18 and IsUpgrade18ActivationBlock give Use flags for coverage at the package level ethereum-optimism/optimism#1412/Peer 2 ethereum-optimism/optimism#1413 an identical predicate to key off.
  • DeployConfig: l2GenesisUpgrade18TimeOffset, threaded into RollupConfig() so generated rollup.json files can schedule the fork.

karlb added a commit to celo-org/celo-kona that referenced this pull request Jul 14, 2026
… boundary

Manual precursor to the op-e2e fixture (#1417's op-node leg, blocked on
op-e2e genesis injection): anvil as a bare L1, celo-reth as the EL, and an
op-node built with the Upgrade 18 fork plumbing (celo-org/optimism#471)
sequencing it through the engine API.

Covers the one surface the in-repo tests cannot — the op-node <-> celo-reth
contract: op-node parses a rollup.json carrying upgrade18_time (the four
param overrides deliberately stay out of op-node: they are a proof-host/EL
channel), sequences across the boundary, the first block with
ts >= upgrade18_time carries the migration (op-node-derived timestamps,
not dev-mode wall clock), and sequencing continues past the irregular
state transition, which applies exactly once.

Not auto-run by e2e_test/run_all_tests.sh since it needs an op-node
binary (OP_NODE_BIN, or built from CELO_OPTIMISM_DIR).
Provisional activation trigger for the CGT v2 predeploy migration
(celo-blockchain-planning#1410). The migration itself is an irregular
state transition performed entirely by the execution layer; the op-node
only needs to carry the schedule and expose the predicate.

Upgrade18 is registered as an *optional* fork (forks.AllOpt, like
PectraBlobSchedule) rather than a mainline one: it is a one-shot
migration trigger for the two live Celo networks, so it must not be
scheduled implicitly by ActivateAtGenesis/ActivateForkAtOffset chains
on unrelated chains, has no allocs mode, and does not belong in the
proof-test fork matrices. Cel2Time set the same precedent.

- forks.go: Upgrade18 name in AllOpt. Via OverridableForks this also
  provides an --override.upgrade18 CLI flag / env var for free.
- rollup.Config: Upgrade18Time. The JSON key is pinned to celo-kona's
  CeloRollupConfig (upgrade18_time): the canonical rollup.json of a
  migrating chain carries it for the proof programs, and
  ParseRollupConfig's DisallowUnknownFields would otherwise reject that
  file. The four artifact param overrides are deliberately NOT added:
  they are a dev/e2e proof-host channel (real networks use the
  artifact's per-network constants), so op-node never sees them.
  IsUpgrade18 and IsUpgrade18ActivationBlock give ethereum-optimism#1412/ethereum-optimism#1413 an
  identical predicate to key off.
- DeployConfig: l2GenesisUpgrade18TimeOffset, threaded into
  RollupConfig() so generated rollup.json files can schedule the fork.
@karlb
karlb force-pushed the karlb/upgrade18-fork-plumbing branch from b68b7ac to c7da5a2 Compare July 15, 2026 11:37
@karlb
karlb changed the base branch from celo-rebase-17 to celo-rebase-18 July 15, 2026 13:14
karlb added a commit to celo-org/celo-kona that referenced this pull request Jul 17, 2026
… boundary

Manual precursor to the op-e2e fixture (#1417's op-node leg, blocked on
op-e2e genesis injection): anvil as a bare L1, celo-reth as the EL, and an
op-node built with the Upgrade 18 fork plumbing (celo-org/optimism#471)
sequencing it through the engine API.

Covers the one surface the in-repo tests cannot — the op-node <-> celo-reth
contract: op-node parses a rollup.json carrying upgrade18_time (the four
param overrides deliberately stay out of op-node: they are a proof-host/EL
channel), sequences across the boundary, the first block with
ts >= upgrade18_time carries the migration (op-node-derived timestamps,
not dev-mode wall clock), and sequencing continues past the irregular
state transition, which applies exactly once.

Not auto-run by e2e_test/run_all_tests.sh since it needs an op-node
binary (OP_NODE_BIN, or built from CELO_OPTIMISM_DIR).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant