fix(L1): bump SystemConfig semver for the ETHLockbox removal (backport to v8.3.0) - #441
Merged
Merged
Conversation
#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
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>
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.
Backport of #440 to
releases/v8.3.0.Summary
#439 bumped
OptimismPortal2,DisputeGameFactoryandAggregateVerifieron this branch because each had source changes relative to the versions deployed onchain while still declaring the same semver.SystemConfigmeets that description too and was missed, so this bumps it3.13.2->3.14.0.Why it qualifies
#378 (ETHLockbox removal) changed
SystemConfigbehaviour without touching the version:paused()no longer selects the pause identifier based on whether theETH_LOCKBOXfeature is enabled._setFeatureno longer guardsETH_LOCKBOXagainst being disabled while the portal still has a lockbox configured, or toggled while the system is paused.snapshots/semver-lock.jsonalready recorded the divergence. Comparing1baa168c(the commit Zeronet's liveSystemConfigimplementation was built from) against33cad5ec(the current head of this branch):1baa168c33cad5ecsourceCodeHash0x1a24ffe1…0x780ff372…initCodeHash0x3e8e52d9…0xb91123c7…@custom:semver3.13.23.13.2Why minor, not major
No function, error or event declarations were added or removed, so the ABI is unchanged — same reasoning as
DisputeGameFactory1.4.0->1.5.0in #439.Why this branch needs it directly
contract-deployments#790 pins Zeronet's Cobalt upgrade to
33cad5econ this branch and upgradesSystemConfigas part of the ETHLockbox removal. Without the bump, the upgraded chain reports an unchangedSystemConfigversion, soversion()cannot distinguish the pre- and post-upgrade implementations and the facilitator guide has to call it out as a special case.Testing
SystemConfig.solis byte-identical betweenmainand this branch, and regeneratingjust semver-lockhere 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 snapshotsproduces no further changes.just teston this branch: 1214 passed, 0 failed, 1 skipped.