Releases: ethereum-optimism/optimism
kona-host/v1.6.0
⚠️ This release is a critical security fix and is a required update for users.
Overview
This is a required release of kona-host. It fixes a fault-proof soundness bug (BLOBBASEFEE on post-Jovian blocks) and a host witness-fetch reliability bug, plus verifier hardening and interop proof groundwork. All operators should upgrade.
This release is required for Upgrade 19, the OP Stack upgrade that promotes kona-client to the primary fault proof program.
What's Changed
Soundness fix (required)
- Pin
BLOBBASEFEEto 1 post-Jovian (#21328): the executor derived the EIP-4844 blob env from the parent header, but post-JovianblobGasUsedcarries the DA footprint — yieldingBLOBBASEFEE > 1once the parent footprint exceeded ~4.26M and diverging from the canonical chain (op-geth/op-reth pin it to 1), breaking dispute-game soundness. Now pinned to{excess_blob_gas: 0, blob_gasprice: 1}for Ecotone+.
Reliability
- Retry high-level witness fetches (#21269):
debug_executePayload/ optimistic re-execution hints are now serviced through theget_preimageretry loop instead of being fetched once and falling back todebug_dbGet(unimplemented by op-reth) — so a transient error is retried instead of being terminal.
Hardening
- Bound pre-refund EVM gas per block (#21250): caps the pre-refund sum of
evm_gas_usedatMAX_GAS_LIMIT(500M) inOpBlockExecutor, which the fault proof verifies through. - Reject zero elasticity in EIP-1559 params (#21292): rejects a zero elasticity/denominator in block
extraData, matching op-geth/op-reth validation. - Embed superchain-registry dependency sets (#20837): interop proofs now embed real depsets instead of an empty list that forced an "insecure in production" host-preimage fallback.
Interop / SDM proof support
- Validate SDM PostExec in native single-chain proofs (#21034).
- Interop activation as an L2CM bundle (#20723): interop hardfork activation in proofs now applies the L2CM NUT bundle instead of hardcoded deployment txs.
Other
- Align spec/fork resolution across kona/op-revm/alloy (#21291): consistent Granite/Karst/Lagoon(Interop) spec resolution with conformance guards. Does not affect execution for currently-proven chains.
- Lagoon hardfork rename (#21105) — no wire-format change.
- Generic receipt builder (#21275) — executor generic over
OpReceiptBuilder; OP path byte-for-byte identical. - Embedded superchain-registry config bump (#21095).
Full Changelog: kona-host/v1.5.2...kona-host/v1.6.0
🚢 Docker Image:
kona-client/v1.6.0
⚠️ This release is a critical security fix and is a required update for users.
Overview
This is a required release of kona-client (the OP Stack fault-proof program). It fixes a fault-proof soundness bug (BLOBBASEFEE on post-Jovian blocks), plus verifier hardening and interop proof groundwork. All operators should upgrade.
This release is required for Upgrade 19, the OP Stack upgrade that promotes kona-client to the primary fault proof program.
What's Changed
Soundness fix (required)
- Pin
BLOBBASEFEEto 1 post-Jovian (#21328): the executor derived the EIP-4844 blob env from the parent header, but post-JovianblobGasUsedcarries the DA footprint — yieldingBLOBBASEFEE > 1once the parent footprint exceeded ~4.26M and diverging from the canonical chain (op-geth/op-reth pin it to 1), breaking dispute-game soundness. Now pinned to{excess_blob_gas: 0, blob_gasprice: 1}for Ecotone+.
Hardening
- Bound pre-refund EVM gas per block (#21250): caps the pre-refund sum of
evm_gas_usedatMAX_GAS_LIMIT(500M) inOpBlockExecutor, which the fault proof verifies through. - Reject zero elasticity in EIP-1559 params (#21292): rejects a zero elasticity/denominator in block
extraData, matching op-geth/op-reth validation. - Embed superchain-registry dependency sets (#20837): interop proofs now embed real depsets instead of an empty list that forced an "insecure in production" host-preimage fallback.
Interop / SDM proof support
- Validate SDM PostExec in native single-chain proofs (#21034).
- Interop activation as an L2CM bundle (#20723): interop hardfork activation in proofs now applies the L2CM NUT bundle instead of hardcoded deployment txs.
Other
- Align spec/fork resolution across kona/op-revm/alloy (#21291): consistent Granite/Karst/Lagoon(Interop) spec resolution with conformance guards. Does not affect execution for currently-proven chains.
- Lagoon hardfork rename (#21105) — no wire-format change.
- Generic receipt builder (#21275) — executor generic over
OpReceiptBuilder; OP path byte-for-byte identical. - Embedded superchain-registry config bump (#21095).
Full Changelog: kona-client/v1.5.2...kona-client/v1.6.0
🚢 Docker Image:
op-reth/v2.3.1
Important
This release fixes a deadlock bug that would cause a node to stall, and supersedes the v2.2.5 and v2.3.0 releases.
Warning
This is a mandatory release for all node operators. It includes Sepolia and Mainnet timestamps for the Karst hardfork.
Operators must upgrade before the scheduled hard fork times.
The following Sepolia chains will activate on 1781712001 (Wed Jun 17 2026 16:00:01 UTC): op, ink, zora, mode, lisk, metal, unichain, soneium-minato, ethernity, creator-chain-testnet
The following Mainnet chains will optimistically activate on 1783526401 (Wed Jul 8 2026 16:00:01 UTC), pending governance approval: op, ink, zora, mode, lisk, metal, unichain, soneium, ethernity, tbn
Reminder: op-geth has reached end of support, so you must be running op-reth to support the karst activation. For more details on this network upgrade see our notice page.
What's Changed in op-reth/v2.3.1
- rust: point to reth commit with fix by @joshklop in #21247
- feat(op-reth): interop failsafe observability — gauge metric + state logs by @jelias2 in #21151
- feat(op-reth/proofs): integrate snapshot into backfill by @dhyaniarun1993 in #20828
- chore(alloy-op-evm): drop dead-on-read sender/evm_gas_used from OpTxResult by @nonsense in #21183
- feat(op-reth): compute miner fee on pool tx in payload builder by @karlb in #20382
- feat(op-reth/proofs): one-time trie-state snapshot by @dhyaniarun1993 in #20797
- feat(op-reth): seed slot-preimage DB during state-dump import by @nonsense in #21108
- feat(op-reth/proofs): backfill the proofs window backward by @dhyaniarun1993 in #20793
- all: update superchain registry by @joshklop in #21095
- chore(rust): sync shared alloy deps with reth pin by @sebastianst in #21085
- fix(op-reth): clamp
sync_targetpastbest_blockinadvance_syncby @dhyaniarun1993 in #21012 - fix(op-reth): use
RoInconsistentforop_proofsCLI subcommands by @dhyaniarun1993 in #21008 - fix(op-reth): prevent engine sync-target spin after deep unwind by @dhyaniarun1993 in #20949
- op-reth: bump reth dependency (includes paradigmxyz/reth#24159 FCU fix) by @sebastianst in #20704
Full Changelog: op-reth/v2.2.4...op-reth/v2.3.1
🚢 Docker Image: https://us-docker.pkg.dev/oplabs-tools-artifacts/images/op-reth:v2.3.1
op-batcher v1.16.10
Generating release notes for op-batcher/v1.16.9..op-batcher/v1.16.10
What's Changed in op-batcher/v1.16.10
- refactor(interop): move log helpers into op-core/interop/messages by @ajsutton in #20946
- op-service: Avoid allocating 8Gb of memory to test ssz encoding. by @ajsutton in #20970
- refactor(interop): move shared interop error sentinels into op-core/interop by @ajsutton in #20896
- fix(op-service/eth): stabilize blob fuzz targets by @ajsutton in #20940
- chore(supervisor): remove unused in-process supervisor RPC client by @ajsutton in #20947
- refactor(interop): move SafetyLevel into op-service/eth/safety by @ajsutton in #20889
- refactor(interop): move interop message types to op-core/interop/messages by @ajsutton in #20887
- op-service: add op-service interop filter client by @karlfloersch in #20905
- refactor(depset): move leaf dependency-set into op-core/interop/depset by @ajsutton in #20884
- all: Upgrade op-geth by @joshklop in #20711
- fix(txplan): Handle nonce-too-low errors in tx submission retry loop by @geoknee in #20796
- fix(sync-tester): clear WindowSyncPolicy cache on session reset by @ajsutton in #20783
- feat(op-supernode,op-interop-filter): raft-wal-backed LogsDB by @ajsutton in #20688
- Save interop NUT bundle by @maurelian in #20722
- fix(op-node,op-batcher): fix maxSafeLag stall, resume, and channel ti… by @KyrinCode in #19758
Full Changelog: op-batcher/v1.16.9-rc.1...op-batcher/v1.16.10
🚢 Docker Image: https://us-docker.pkg.dev/oplabs-tools-artifacts/images/op-batcher:v1.16.10
op-node/v1.19.0
Warning
This is a mandatory release for all node operators. It includes Sepolia and Mainnet timestamps for the Karst hardfork.
Operators must upgrade before the scheduled hard fork times.
The following Sepolia chains will activate on 1781712001 (Wed Jun 17 2026 16:00:01 UTC): op, ink, zora, mode, lisk, metal, unichain, soneium-minato, ethernity, creator-chain-testnet
The following Mainnet chains will optimistically activate on 1783526401 (Wed Jul 8 2026 16:00:01 UTC), pending governance approval: op, ink, zora, mode, lisk, metal, unichain, soneium, ethernity, tbn
Reminder: op-geth has reached end of support, so you must be running op-reth to support the karst activation. For more details on this network upgrade see our notice page.
Important
--syncmode.offset-el-safe now defaults to 12h for execution-layer sync. This keeps safe and finalized heads behind the synced tip after EL sync completes, matching the OP Mainnet sequencing window. Operators who need the previous behavior can set --syncmode.offset-el-safe=0.
When --syncmode.offset-el-safe is configured outside --syncmode=execution-layer, op-node now logs a warning and ignores the value instead of failing startup.
What's Changed in op-node/v1.19.0
- all: update superchain registry by @joshklop in #21095
- feat(op-node): cache cross-safe head with canonicality re-validation by @ajsutton in #21079
- fix(op-node,op-supernode): redesign SuperAuthority safe/finalized head as tri-state by @ajsutton in #21049
- feat(op-node): default syncmode.offset-el-safe to 12h by @pcw109550 in #21033
- fix(op-node): stall consolidate on NotFound during EL sync by @ajsutton in #21004
- feat(op-node): support post-exec span batches by @nonsense in #20515
- feat(op-node): load dependency set from superchain-registry by @ajsutton in #20893
- refactor(interop): move SafetyLevel into op-service/eth/safety by @ajsutton in #20889
- op-service: add op-service interop filter client by @karlfloersch in #20905
- fix(op-node): split super authority finalized cache by @karlfloersch in #20872
- fix(op-node): tolerate NotFound on Finalized lookup during ELSync (+ eth_syncing dump) by @wwared in #20798
Full Changelog: op-node/v1.18.2...op-node/v1.19.0
🚢 Docker Image: https://us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.19.0
kona-node/v1.6.0
Warning
This is a mandatory release for all node operators. It includes Sepolia and Mainnet timestamps for the Karst hardfork.
Operators must upgrade before the scheduled hard fork times.
The following Sepolia chains will activate on 1781712001 (Wed Jun 17 2026 16:00:01 UTC): op, ink, zora, mode, lisk, metal, unichain, soneium-minato, ethernity, creator-chain-testnet
The following Mainnet chains will optimistically activate on 1783526401 (Wed Jul 8 2026 16:00:01 UTC), pending governance approval: op, ink, zora, mode, lisk, metal, unichain, soneium, ethernity, tbn
Reminder: op-geth has reached end of support, so you must be running op-reth to support the karst activation. For more details on this network upgrade see our notice page.
Besides the Karst hardfork timestamps, this release also includes a few bug fixes.
What's Changed in kona-node/v1.6.0
- all: update superchain registry by @joshklop in #21095
- fix(kona-node): carry L2 hash through finalization by @digorithm in #20877
- fix(kona/registry): embed superchain-registry depsets by @Inphi in #20837
Full Changelog: kona-node/v1.5.2-rc.1...kona-node/v1.6.0
🚢 Docker Image: https://us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node:v1.6.0
op-deployer/v0.7.0-rc.1
Changelog
- 6a1240e chore(opd): update SCR dep for op-contracts/v7.0.0-rc.3 tag (#20989)
- 7525482 chore(opd): update SCR dep for op-contracts/v7.0.0-rc.4 tag (#21045)
- d210865 fix(op-deployer): hydrate OpcmUtilsImpl and OpcmMigratorImpl in state (#20403)
- 35121b5 refactor: remove ProtocolVersions Go plumbing (#20441)
op-dispute-mon/v1.5.2
Overview
This is a patch release of op-dispute-mon. It is an optional upgrade for all users.
What's Changed
- Add
op_dispute_mon_gamesPrometheus gauge with agame_typelabel, exposing the distribution of monitored games by dispute game type (#20479) - Support the new ZK dispute game contract — rename
OptimisticZKGameType→ZKDisputeGameType(game type 10)
(#19606) - Replace deprecated
golang.org/x/expandpkg/errorswith Go stdlib equivalents (no behavior change)
(#20014) - Update README and Dockerfile references from
maketojust(#19621, #19596)
Full Changelog: op-dispute-mon/v1.5.1...op-dispute-mon/v1.5.2
🚢 Docker Image:
op-challenger/v1.9.3
Overview
This is release of op-challenger is required for Upgrade 19. It contains bug fixes, new features, and the removal of deprecated functionality.
Note: ZK dispute games and super dispute games (interop) are not yet live in production. Changes to those code paths in this release are preparation for future functionality and do not affect operators today.
Breaking changes
--cannon-kona-experimental-witness-endpointflag removed (#20498). Thedebug_executePayload-based witness path is now the default for kona-cannon games. Operators passing this flag (or setting CANNON_KONA_EXPERIMENTAL_WITNESS_ENDPOINT` in their config) must remove it before upgrading — op-challenger will reject it as unknown.
What's Changed
Features
- ZK dispute game support in op-deployer (#20219) — preparation for future ZK dispute games
- New
--age-game-inputsflag (default off) for therun-tracesubcommand (op-challenger-runner / vm-runner), which ages game inputs by ~16/7 days to simulate maximum-duration dispute games (#20252)
Bug fixes
- Fix
create-gameCLI super-root encoding (#20545) - Route
SUPER_CANNON_KONAthroughKonaSuperExecutorinrun-trace(#20512) - Route
SUPER_PERMISSIONED_CANNONthrough cannon-kona and enforce kona-host CLI flags at parse time (#20501)
Other
- Remove
super-cannon(game type 4) from op-challenger and op-dispute-mon (#20555) - Wire supernode CLI for op-proposer and op-challenger (#20460)
- Replace deprecated deps (
x/exp/maps,x/exp/slices,pkg/errors,go-multierror) with stdlib equivalents (#20014)
Full Changelog: op-challenger/v1.9.1...op-challenger/v1.9.3
🚢 Docker Image:
op-contracts/v7.0.0-rc.4
What's Changed in op-contracts/v7.0.0-rc.4
- feat(contracts-bedrock): scale ResourceConfig to fit smaller gasLimits (v7.0.0)
- Merge pull request #20981 from ethereum-optimism/jm/revert-xlayer-layout-fix
- Revert "fix(l2cm): preserve XLayer LiquidityController minters across upgrade "
- fix(l2cm): preserve XLayer LiquidityController minters across upgrade
- fix: filter prerelease OPCM release tags (cherry-pick of #20617)
- feat: make l2cm default path in devfeature bitmap
- chore(ci): clean up contracts CI and RPC secrets
- fix(contracts): reject oz v5 initializable in opcm
- chore(rust/scr): update superchain registry for rust crates
- feat: zk go deployer
- fix(contracts): fail closed resolving semver target branch
- chore(contracts-bedrock): drop v1 mention from _decodeDisputeGameImpl natspec
- interop: add OPContractsManagerMigrationValidator for post-migration validation
- fix(op-fetcher): guard against zero mipsImpl before calling oracle()
- chore(contracts-bedrock): fix contract typos
- Revert "chore(rust): bump revm to 38 "
- Revert "Delete .circleci/Untitled "
- docs(opcm): acknowledge Initializable upgrade limitations
- test(contracts): cover VerifyOPCM runSingle lazy setup
- fix: ZK Game Quality Review Fixes
- chore(rust): bump revm to 38
- test: add ZKDisputeGame unit and integration test coverage
- fix(contracts-bedrock): skip lint fix during CI
- Delete .circleci/Untitled
- feat(contracts): enforce EIP-7825 gas cap in NUT bundle validation
- feat(l2cm): support X Layer LiquidityController in L2CM upgrade path
- feat: add SP1Adapter
- fix: add intrinsic gas deduction to l2 fork tests
- chore(contracts): remove 7 unreferenced interfaces
- test(contracts): skip VerifyOPCM_Run_Test on coverage only, not unoptimized
- chore(contracts): remove unused SchemaResolver abstract base
- fix(contracts): skip ZKDisputeGame in VerifyOPCM when feature disabled
- refactor: revenue share cleanup
- fix: l2cm fma followup
- feat: opcm zk roots
- chore(deployer): remove OPCMv1 migration, upgrade, and dev feature code
- contracts: delete unused interop contracts
- fix(l2cm): guard CGT feature activation and liquidity controller renounce ownership
- test: zk dispute game factory and registry
- docs: fix broken markdown links and stale README references
- fix(l2cm): address audit small fixes
- chore: remove OpcmImpl compat shim, ReadSuperchainDeployment v1 fields, CI, docs
- Delete
OptimismPortalInteropcontract and all references - feat: shared dispute game migration for interop
- Add 'rust/op-revm/' from commit 'c79483d5d04949e8a99dc3c11c79a28825236396'
- contracts: remove unused SafeTestTools helpers
- feat(nuts): add update-nuts and verify-nuts commands
- contracts: remove unused test state variables
- contracts: remove unused test events
- contracts: remove unused dispute game and FFI test helpers
- contracts: remove unused TestERC1271Wallet mock
- contracts: remove deploy config JSON dependency for tests
- refactor(contracts): remove OPCMv1 from all Solidity code
- chore(ct): replace Go nut-bundle-check with git diff
- fix: VerifyOPCM super game checks
- feat: migrate to superdispute game
- fix(l2cm): revert instead of silently skipping non-upgradeable predeploys
- refactor(contracts): separate v4/v5 init slot clearing in L2ContractsManagerUtils
- fix(ct): resolve correct target branch in merge queue
- chore(contracts-bedrock): suppress solc 0.8.31 deprecation warnings
- feat(l1block): add system customization feature flags
- fix: l2cm ir infromational findings
- docs(contracts): clarify semver bumps are once per PR
- test(opcm): add double upgrade call test
- test(contracts): improve LegacyMintableERC20 test coverage and quality
- test(contracts): improve ETHLiquidity test coverage
- fix: l2cm specs
- fix: l2cm IR low fixes
- fix(contracts-bedrock): build contracts before generating NUT bundle
- contracts: remove interop bridge contracts from L2ContractsManager
- feat: new zk dispute game
- interop: deploy and fund ETH bridge contracts at activation
- feat: add l2 fork testing framework
- fix: remove l2pa version check in l2cm
- chore(contracts-bedrock): replace pre-pr with pr (check-fast) in CI and justfile
- feat: Implement L2 Dev Flags
- feat(contracts): add ProxyAdminOwnedBase to L2 proxied contracts with initialize()
- fix: staking audit fixes
- Revert "refactor(contracts): move ProxyAdminOwnedBase to src/universal/ "
- refactor(contracts): move ProxyAdminOwnedBase to src/universal/
- chore(contracts): bump superchain-registry
- chore: add nut bundle check to just pr
- test(contracts): convert GovernanceToken tests to fuzz tests
- feat: enable setting CANNON_KONA as respected game type
- feat: add NUT Bundle generation
- feat: register zk proofs feature flag
- chore(contracts-bedrock): deduplicate test helpers
- docs(contracts): move l2 upgrade contracts spec from specs repo
- test(contracts): fix testFuzz_params_validValues_succeeds rejection rate
- fix(ci): retry L1 archive RPC call in print-pinned-block-number
- fix(contracts): address audit findings 14, 6, 8, 13, 19
- fix(contracts): forward-compatible OZ v5 Initializable in upgrade (Finding 22)
- test(contracts): reuse ProxyAdmin tests on L2ProxyAdmin for backwards compatibility
- contracts: implement onlyDelegateCall and add tests for audit fixes
- fix(contracts-bedrock): dedupe unoptimized profile mock logic into Setup
- fix(contracts): require interop dev feature for migrate (Finding 21)
- contracts: add documentation for audit findings #2, #3, #7, #12, #15, #16
- fix(contracts-bedrock): remove artifact pulling, use unoptimized builds for CI tests
- fix(contracts-bedrock): make contracts CI reliable
- feat: Add L2CM implementation
- fix: various contracts-bedrock CI issues
- Add Karst hard fork activation
- sc-feat: policy engine staking ordering
- test(contracts): improve DelayedWETH test coverage with fuzz tests
- feat: add L2ProxyAdmin
- fix(contracts): improve DelayedWETH loading for fork tests
- feat: Add Conditional L2 Deployer
- fix: only allow enabling permissioned game types in opcmv2 deployment…
- chore: return migrator address on ReadImplementationAddresses output
- fix: SuperchainConfig comments and test refactoring
- fix: gaps in VerifyOPCM
- fix: safer safes interface and deploy script
- test(contracts): enhance OptimismMintableERC721 test coverage with fuzz tests
- feat: no beta tags in production upgrade
- fix: get delayedweth from opcm implementations and remove proxy fetch
- fix: generic revert error in upgrade scripts
- fix: add code lenght check for ReadSuperchainDeployment and tests
- test: make sure OPCMv2 can upgrade while paused
- maint: better comments for migration function
- feat: have ASR only use IDisputeGame
- feat(contracts): add OPCMV2 batch upgrade invariant test
- feat(op-deployer): port deploymips to forge and remove old code
- contracts: Switch DisputeGameFactory to use CREATE2 when creating games.
- feat(op-deployer): add runWithBytes to missing contracts
- Enable UInt64 lint check and fix remaining violations
- feat: update withdrawal command for output roots in super proposals
- Add 'op-reth/' from commit '910fed941c45240f04e95513fe76eb7dcb034ddd'
- Add 'alloy-op-evm/' from commit '7447d30eb078be987e73bbe379588ba53d0d710b'
- feat: Add support for Interop Migration using OPCM v2
- test(contracts): add coverage for isValidProof and memoryProofOffset in MIPS64Memory
- refactor: standarize opcmv2 version check
- fix: pdg implementations to non-zero address on v2 codepath
- contracts: Restrict proposed block numbers to uint64
- feat: remove CGT instruction from OPCMv2
- feat: generic system for running past upgrades
- Foundry Versioning Policy
- feat: remove v1 dispute games
- Avoid fallback download of artifacts when not on develop
- refactor: consolidate DummyCaller contracts into single generic implementation
- test(contracts): improve OptimismSuperchainERC20Factory test coverage
- test(contracts): improve DisputeMonitorHelper test coverage
- feat: have check runner retry snapshots clean
- test: DeployImplementations and opchain additional tests
- Make contractsContainer exist only in utils
- feat: have upgrade test blocks update every week
- test(contracts): convert MintManager tests to fuzz tests for broader coverage
- fix: add compiler restriction for StorageSetter to align profiles
- Remove go 1.24 feature flag, leaving SysGetRandom syscall enabled
- chore(ctb): move init bond value to CommonTest
- feat: Add
add-game-type-opcm-v2command to op-deployer - asterisc: Remove asterisc contracts
- test(contracts): improve OptimismMintableERC20Factory test coverage
- test(contracts): convert OptimismMintableERC20 tests to fuzz tests
- feat: support interop migration in OPCMv2
- test(contracts): add revert tests for Preinstalls library functions
- feat(abip): improve skip message for tests skipped by features
- test: OPCMv2 upgrade
- feat(dispute): add rootClaimByChainId(uint256) for L2 chain ID lookup
- feat: Add OPCM v2 Support for chain upgrades to op-deployer
- chore: improve comments accuracy
- feat: revert opcm v1 & add opcmv2 op-deployer support
- test: update succinct tests to follow our conventions
- test: use a custom Test contract for makeAddr
- feat: add ReadSuperchainDeployment support for opcm v2
- proofs: Add provable output roots to super DGs
- ci: Fix contracts test-upgrade test junit output
- verify opcm v2
- chore: bump opcmv2 to v7
- feat: have OPCMv2 check upgrade ordering version
- all: Remove cannon-kona dgv2 feature flags
- feat: add cgt to opcmv2
- Add style guide for manual getters on struct typed storage variables
- feat: contract check runner
- fix(ci): support external PRs for force-use-fresh-artifacts label
- feat: have SystemConfig store a ref to last used OPCM
- feat: have OPCM upgrade allowances be u...