Skip to content

fix(L1): bump SystemConfig semver for the ETHLockbox removal (backport to v8.3.0) - #441

Merged
jackchuma merged 1 commit into
releases/v8.3.0from
bump-systemconfig-semver-v8.3.0
Sep 15, 2026
Merged

jackchuma merged 1 commit into
releases/v8.3.0from
bump-systemconfig-semver-v8.3.0

Conversation

@jackchuma

Copy link
Copy Markdown
Collaborator

Backport of #440 to releases/v8.3.0.

Summary

#439 bumped OptimismPortal2, DisputeGameFactory and AggregateVerifier on this branch because each had source changes relative to the versions deployed onchain while still declaring the same semver. SystemConfig meets that description too and was missed, so this bumps it 3.13.2 -> 3.14.0.

Why it qualifies

#378 (ETHLockbox removal) changed SystemConfig behaviour without touching the version:

-        address identifier = isFeatureEnabled[Features.ETH_LOCKBOX]
-            ? address(IOptimismPortal2(payable(optimismPortal())).ethLockbox())
-            : address(optimismPortal());
-        return superchainConfig.paused(address(0)) || superchainConfig.paused(identifier);
+        return superchainConfig.paused(address(0)) || superchainConfig.paused(optimismPortal());
  • paused() no longer selects the pause identifier based on whether the ETH_LOCKBOX feature is enabled.
  • _setFeature no longer guards ETH_LOCKBOX against being disabled while the portal still has a lockbox configured, or toggled while the system is paused.

snapshots/semver-lock.json already recorded the divergence. Comparing 1baa168c (the commit Zeronet's live SystemConfig implementation was built from) against 33cad5ec (the current head of this branch):

1baa168c 33cad5ec
sourceCodeHash 0x1a24ffe1… 0x780ff372…
initCodeHash 0x3e8e52d9… 0xb91123c7…
@custom:semver 3.13.2 3.13.2

Why minor, not major

No function, error or event declarations were added or removed, so the ABI is unchanged — same reasoning as DisputeGameFactory 1.4.0 -> 1.5.0 in #439.

Why this branch needs it directly

contract-deployments#790 pins Zeronet's Cobalt upgrade to 33cad5ec on this branch and upgrades SystemConfig as part of the ETHLockbox removal. Without the bump, the upgraded chain reports an unchanged SystemConfig version, so version() cannot distinguish the pre- and post-upgrade implementations and the facilitator guide has to call it out as a special case.

Testing

  • SystemConfig.sol is byte-identical between main and this branch, and regenerating just semver-lock here reproduces exactly the hashes from fix(L1): bump SystemConfig semver for the ETHLockbox removal #440, so the backport is a clean cherry-pick with no branch-specific divergence.
  • just snapshots produces no further changes.
  • just test on this branch: 1214 passed, 0 failed, 1 skipped.

#439 bumped OptimismPortal2, DisputeGameFactory and AggregateVerifier because
each had source changes relative to the versions deployed onchain while still
declaring the same semver. SystemConfig meets that description too and was
missed.

#378 changed two behaviours without touching the version:

- `paused()` no longer selects the pause identifier based on whether the
  ETH_LOCKBOX feature is enabled; it always uses `optimismPortal()`.
- `_setFeature` no longer guards ETH_LOCKBOX against being disabled while the
  portal still has a lockbox configured, or toggled while paused.

snapshots/semver-lock.json already records both a different sourceCodeHash and
initCodeHash for SystemConfig across that change, so the lock file and the
declared version disagreed.

Minor rather than major: no function, error or event declarations were added or
removed, so the ABI is unchanged. This matches the DisputeGameFactory 1.4.0 ->
1.5.0 precedent in #439; OptimismPortal2 went major only because it dropped
`ethLockbox()` from its ABI.

Co-authored-by: Cursor <cursoragent@cursor.com>
@jackchuma
jackchuma merged commit 385f21a into releases/v8.3.0 Sep 15, 2026
3 checks passed
@jackchuma
jackchuma deleted the bump-systemconfig-semver-v8.3.0 branch September 15, 2026 01:59
jackchuma added a commit to base/contract-deployments that referenced this pull request Sep 15, 2026
base/contracts#441 landed the SystemConfig bump on releases/v8.3.0, so
SystemConfig now goes 3.13.2 -> 3.14.0 and the patched build is
3.14.0+max-gas-limit-2000M.

Regenerate max-gas-limit.patch against the new baseline rather than editing the
hunks by hand, and update the patched-version assertions in
DeployCobaltCoreImpls and in the ExecuteCobaltUpgrade pre- and postchecks.

SystemConfig is no longer the contract where only the implementation address
distinguishes old from new, so drop that caveat from FACILITATOR.md; all four
upgraded contracts now bump their version.

Co-authored-by: Cursor <cursoragent@cursor.com>
jackchuma added a commit to base/contract-deployments that referenced this pull request Sep 15, 2026
* feat(zeronet): add Cobalt upgrade task

Bundles the three Cobalt L1 changes into a single ProxyAdmin-owner
transaction for Zeronet:

- Dynamic upgrades: deploys a ProtocolVersions registry (proxy plus
  implementation) and redeploys AggregateVerifier, which binds the
  registry as a constructor immutable and so cannot be upgraded in place.
- EthLockbox removal: upgrades OptimismPortal2 and SystemConfig.
- CREATE2 for dispute games: upgrades DisputeGameFactory and registers
  the new AggregateVerifier for game type 621.

Deployment is split across two Foundry profiles because base/contracts
pins per-contract optimizer runs (5000 for the portal, system config,
factory and proxy; 999999 for the registry and verifier). Zeronet's
SystemConfig carries a local MAX_GAS_LIMIT raise, so the task re-applies
it as a patch and asserts the resulting build suffix rather than letting
a stock build silently revert the limit.

Co-authored-by: Cursor <cursoragent@cursor.com>

* docs(zeronet): flag the assumed fast-cadence intervals

Co-authored-by: Cursor <cursoragent@cursor.com>

* chore(zeronet): repin base contracts to 0ae2de1

Moves BASE_CONTRACTS_COMMIT from 30e4390 to 0ae2de1, which reverts the
AggregateVerifier cadence split (#436) and removes the BaseTime predeploy
(#437). ProtocolVersions, OptimismPortal2, SystemConfig and
DisputeGameFactory are untouched between the two pins.

The revert collapses the slow/fast interval pairs back to a single
blockInterval/intermediateBlockInterval pair, so the constructor takes two
plain arguments instead of an IntervalConfig struct and the previously
assumed fast-cadence values are gone -- both intervals now come straight
from the live implementation.

The revert also rolls AggregateVerifier back to 0.1.0, the same version
the live implementation reports, so version no longer distinguishes them.
The upgrade script now asserts the redeploy produced a different address
and relies on the PROTOCOL_VERSIONS binding, which the predecessor does
not have, as the real discriminator.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(zeronet): address Cobalt task review feedback

- Point the pin comment at the v8.3.0 release branch.
- Drop RECORD_STATE_DIFF; the pinned signer tool injects it when it spawns
  forge (src/lib/state-diff.ts).
- Schedule Cobalt for 2026-09-16 18:00:00 UTC instead of leaving it
  unscheduled.
- Set the minimum protocol version to v1.4.0, documenting the packing and
  the cast command to re-derive it.
- Blank the TEE and ZK program hashes with a TODO pointing at
  base/base releases/v1.4.0; the deploy script refuses to run until they
  are set. Every other AggregateVerifier constructor argument, including
  the config hash and block intervals, is now read back from the live
  implementation, and the portal's proof maturity delay is read from the
  live portal.
- Record the ABI-encoded constructor args in addresses.json so the verify
  targets no longer rebuild them from config.
- Remove the DEPLOYER variable and both Makefile validation targets; the
  scripts already assert these conditions.
- Fold the shared remappings into profile.default so the Cobalt profiles
  only carry the optimizer settings that actually differ.
- Trim the facilitator risk list to the items that apply to us.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Address review: Cobalt at 16:00 UTC, min version v1.3.2, drop foundry profiles

Move the Cobalt activation to 2026-09-16 16:00:00 UTC and lower the minimum
protocol version to v1.3.2.

Replace the two Cobalt foundry profiles with FOUNDRY_* overrides on the deploy
targets, matching what the verify targets already do. Verified the overrides
reproduce the profile builds byte for byte for OptimismPortal2 at 5000 runs and
for ProtocolVersions and AggregateVerifier at 999999.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Repin contracts to 33cad5ec and fill in the proof program hashes

Set the three AggregateVerifier proof hashes and move to the semver bump
commit on releases/v8.3.0.

The repin changes OptimismPortal2 5.2.0 -> 6.0.0, DisputeGameFactory
1.4.0 -> 1.5.0 and AggregateVerifier 0.1.0 -> 0.2.0, so update the version
assertions in all three scripts. Because version() now distinguishes old from
new, add postchecks that read it back through the portal and factory proxies
and off the registered verifier, and drop the FACILITATOR note that said
version strings were useless here.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Repin to 385f21a4 to pick up the SystemConfig semver bump

base/contracts#441 landed the SystemConfig bump on releases/v8.3.0, so
SystemConfig now goes 3.13.2 -> 3.14.0 and the patched build is
3.14.0+max-gas-limit-2000M.

Regenerate max-gas-limit.patch against the new baseline rather than editing the
hunks by hand, and update the patched-version assertions in
DeployCobaltCoreImpls and in the ExecuteCobaltUpgrade pre- and postchecks.

SystemConfig is no longer the contract where only the implementation address
distinguishes old from new, so drop that caveat from FACILITATOR.md; all four
upgraded contracts now bump their version.

Co-authored-by: Cursor <cursoragent@cursor.com>

* deploy contracts

* Link base/contracts dependencies for source verification

forge verify-contract runs with lib/contracts as the project root, which is the
only root the target paths resolve from. base/contracts imports its own
dependencies through literal lib/<dep>/... paths that resolve against that root
as well, but the build keeps them a level up in active/evm/lib, so the submitted
standard JSON omitted them and Etherscan failed to compile.

Link the four dependencies in for the duration of each verify target and remove
them afterwards. Leaving them in place is not an option: the build then matches
those imports in two locations and fails as ambiguous.

* Correct Zeronet Azul and Beryl activation timestamps

The schedule assumed a re-genesised Zeronet had every fork through Beryl active
at the genesis timestamp. Azul and Beryl actually activated after it, at genesis
+300s and +600s, per the ZERONET chain config in base/base, which is what the
nodes fork on. Ids 10 and 11 were therefore importing activations five and ten
minutes earlier than they happened.

Every other id matches the node config. The schedule is an initialize argument
passed in the upgrade transaction, and neither the deployed AggregateVerifier
nor the registry bakes it in, so nothing needs redeploying.

* add validation files

* Repin signer tool to 8e059b6 to pass TASK_NETWORK into the deps install

Co-authored-by: Cursor <cursoragent@cursor.com>

* Record where the AggregateVerifier proof hashes come from

The three hashes were listed with no provenance, so a reviewer had no way to
check them short of asking. Record the node release they are built from,
base/base releases/v1.4.0, and how each is produced: the TEE value is PCR0 of the
reproducible Nitro enclave image from crates/proof/tee, and the two ZK values are
the SP1 range and aggregation verification keys from just succinct vkeys --build.

All three match the AggregateVerifier already deployed at 0x2504B1c3.

* execute task

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
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