diff --git a/op-chain-ops/interopgen/deploy.go b/op-chain-ops/interopgen/deploy.go index 7028d43f51e08..d18d78a29c236 100644 --- a/op-chain-ops/interopgen/deploy.go +++ b/op-chain-ops/interopgen/deploy.go @@ -274,7 +274,7 @@ func MigrateInterop( l2Deployment := l2Deployments[l2ChainID] chainConfigs[i] = manage.OPChainConfig{ SystemConfigProxy: l2Deployment.SystemConfigProxy, - AbsolutePrestate: l2Cfgs[l2ChainID].DisputeAbsolutePrestate, + CannonPrestate: l2Cfgs[l2ChainID].DisputeAbsolutePrestate, } } diff --git a/op-deployer/pkg/deployer/devfeatures.go b/op-deployer/pkg/deployer/devfeatures.go index 15328c3158205..fefd390e06b9e 100644 --- a/op-deployer/pkg/deployer/devfeatures.go +++ b/op-deployer/pkg/deployer/devfeatures.go @@ -31,6 +31,7 @@ func IsDevFeatureEnabled(bitmap, flag common.Hash) bool { return featuresIsNonZero && bitmapContainsFeatures } +// EnableDevFeature enables a specific development feature in a feature bitmap func EnableDevFeature(bitmap, flag common.Hash) common.Hash { var result common.Hash for i := 0; i < 32; i++ { diff --git a/op-deployer/pkg/deployer/devfeatures_test.go b/op-deployer/pkg/deployer/devfeatures_test.go index 826d8a8908334..7c83b55a3a5cd 100644 --- a/op-deployer/pkg/deployer/devfeatures_test.go +++ b/op-deployer/pkg/deployer/devfeatures_test.go @@ -84,6 +84,11 @@ func TestIsDevFeatureEnabled(t *testing.T) { }) } +func TestEnableDevFeature(t *testing.T) { + result := EnableDevFeature(EMPTY_FEATURES, FEATURE_A) + require.Equal(t, FEATURE_A, result) +} + func or(values ...[32]byte) [32]byte { var out [32]byte for i := 0; i < 32; i++ { diff --git a/op-deployer/pkg/deployer/integration_test/apply_test.go b/op-deployer/pkg/deployer/integration_test/apply_test.go index 5e3aa96b92a11..2f9eb9001e1ba 100644 --- a/op-deployer/pkg/deployer/integration_test/apply_test.go +++ b/op-deployer/pkg/deployer/integration_test/apply_test.go @@ -156,93 +156,67 @@ func TestEndToEndBootstrapApply(t *testing.T) { // 3. call opcm.upgradeSuperchainConfig on the opcm deployed in [2] (prerequisite for opcm.upgrade) // 4. call opcm.upgrade on the opcm deployed in [2] func TestEndToEndBootstrapApplyWithUpgrade(t *testing.T) { - t.Run("main upgrade", func(t *testing.T) { - lgr := testlog.Logger(t, slog.LevelDebug) - - forkedL1, stopL1, err := devnet.NewForkedSepolia(lgr) - require.NoError(t, err) - pkHex, _, _ := shared.DefaultPrivkey(t) - t.Cleanup(func() { - require.NoError(t, stopL1()) - }) - loc, afactsFS := testutil.LocalArtifacts(t) - testCacheDir := testutils.IsolatedTestDirWithAutoCleanup(t) - - superchain, err := standard.SuperchainFor(11155111) - require.NoError(t, err) - - superchainProxyAdmin, err := standard.SuperchainProxyAdminAddrFor(11155111) - require.NoError(t, err) - - superchainProxyAdminOwner, err := standard.L1ProxyAdminOwner(11155111) - require.NoError(t, err) - - runEndToEndBootstrapAndApplyUpgradeTest(t, afactsFS, bootstrap.ImplementationsConfig{ - L1RPCUrl: forkedL1.RPCUrl(), - PrivateKey: pkHex, - ArtifactsLocator: loc, - MIPSVersion: int(standard.MIPSVersion), - WithdrawalDelaySeconds: standard.WithdrawalDelaySeconds, - MinProposalSizeBytes: standard.MinProposalSizeBytes, - ChallengePeriodSeconds: standard.ChallengePeriodSeconds, - ProofMaturityDelaySeconds: standard.ProofMaturityDelaySeconds, - DisputeGameFinalityDelaySeconds: standard.DisputeGameFinalityDelaySeconds, - DevFeatureBitmap: common.Hash{}, - SuperchainConfigProxy: superchain.SuperchainConfigAddr, - ProtocolVersionsProxy: superchain.ProtocolVersionsAddr, - L1ProxyAdminOwner: superchainProxyAdminOwner, - SuperchainProxyAdmin: superchainProxyAdmin, - CacheDir: testCacheDir, - Logger: lgr, - Challenger: common.Address{'C'}, - }) - }) - - t.Run("upgrade with DeployV2DisputeGamesDevFlag", func(t *testing.T) { - lgr := testlog.Logger(t, slog.LevelDebug) + op_e2e.InitParallel(t) - forkedL1, stopL1, err := devnet.NewForkedSepolia(lgr) - require.NoError(t, err) - pkHex, _, _ := shared.DefaultPrivkey(t) - t.Cleanup(func() { - require.NoError(t, stopL1()) - }) - loc, afactsFS := testutil.LocalArtifacts(t) - testCacheDir := testutils.IsolatedTestDirWithAutoCleanup(t) + tests := []struct { + name string + devFeature common.Hash + }{ + {"default", common.Hash{}}, + {"deploy-v2-disputegames", deployer.DeployV2DisputeGamesDevFlag}, + {"cannon-kona", deployer.EnableDevFeature(deployer.DeployV2DisputeGamesDevFlag, deployer.CannonKonaDevFlag)}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + op_e2e.InitParallel(t) + lgr := testlog.Logger(t, slog.LevelDebug) - superchain, err := standard.SuperchainFor(11155111) - require.NoError(t, err) + forkedL1, stopL1, err := devnet.NewForkedSepolia(lgr) + require.NoError(t, err) + pkHex, _, _ := shared.DefaultPrivkey(t) + t.Cleanup(func() { + require.NoError(t, stopL1()) + }) + loc, afactsFS := testutil.LocalArtifacts(t) + testCacheDir := testutils.IsolatedTestDirWithAutoCleanup(t) + + superchain, err := standard.SuperchainFor(11155111) + require.NoError(t, err) - superchainProxyAdmin, err := standard.SuperchainProxyAdminAddrFor(11155111) - require.NoError(t, err) + superchainProxyAdmin, err := standard.SuperchainProxyAdminAddrFor(11155111) + require.NoError(t, err) - superchainProxyAdminOwner, err := standard.L1ProxyAdminOwner(11155111) - require.NoError(t, err) + superchainProxyAdminOwner, err := standard.L1ProxyAdminOwner(11155111) + require.NoError(t, err) - runEndToEndBootstrapAndApplyUpgradeTest(t, afactsFS, bootstrap.ImplementationsConfig{ - L1RPCUrl: forkedL1.RPCUrl(), - PrivateKey: pkHex, - ArtifactsLocator: loc, - MIPSVersion: int(standard.MIPSVersion), - WithdrawalDelaySeconds: standard.WithdrawalDelaySeconds, - MinProposalSizeBytes: standard.MinProposalSizeBytes, - ChallengePeriodSeconds: standard.ChallengePeriodSeconds, - ProofMaturityDelaySeconds: standard.ProofMaturityDelaySeconds, - DisputeGameFinalityDelaySeconds: standard.DisputeGameFinalityDelaySeconds, - DevFeatureBitmap: deployer.DeployV2DisputeGamesDevFlag, - SuperchainConfigProxy: superchain.SuperchainConfigAddr, - ProtocolVersionsProxy: superchain.ProtocolVersionsAddr, - L1ProxyAdminOwner: superchainProxyAdminOwner, - SuperchainProxyAdmin: superchainProxyAdmin, - CacheDir: testCacheDir, - Logger: lgr, - Challenger: common.Address{'C'}, - FaultGameMaxGameDepth: standard.DisputeMaxGameDepth, - FaultGameSplitDepth: standard.DisputeSplitDepth, - FaultGameClockExtension: standard.DisputeClockExtension, - FaultGameMaxClockDuration: standard.DisputeMaxClockDuration, + cfg := bootstrap.ImplementationsConfig{ + L1RPCUrl: forkedL1.RPCUrl(), + PrivateKey: pkHex, + ArtifactsLocator: loc, + MIPSVersion: int(standard.MIPSVersion), + WithdrawalDelaySeconds: standard.WithdrawalDelaySeconds, + MinProposalSizeBytes: standard.MinProposalSizeBytes, + ChallengePeriodSeconds: standard.ChallengePeriodSeconds, + ProofMaturityDelaySeconds: standard.ProofMaturityDelaySeconds, + DisputeGameFinalityDelaySeconds: standard.DisputeGameFinalityDelaySeconds, + DevFeatureBitmap: tt.devFeature, + SuperchainConfigProxy: superchain.SuperchainConfigAddr, + ProtocolVersionsProxy: superchain.ProtocolVersionsAddr, + L1ProxyAdminOwner: superchainProxyAdminOwner, + SuperchainProxyAdmin: superchainProxyAdmin, + CacheDir: testCacheDir, + Logger: lgr, + Challenger: common.Address{'C'}, + } + if deployer.IsDevFeatureEnabled(tt.devFeature, deployer.DeployV2DisputeGamesDevFlag) { + cfg.FaultGameMaxGameDepth = standard.DisputeMaxGameDepth + cfg.FaultGameSplitDepth = standard.DisputeSplitDepth + cfg.FaultGameClockExtension = standard.DisputeClockExtension + cfg.FaultGameMaxClockDuration = standard.DisputeMaxClockDuration + } + runEndToEndBootstrapAndApplyUpgradeTest(t, afactsFS, cfg) }) - }) + } } func TestEndToEndApply(t *testing.T) { @@ -755,14 +729,19 @@ func runEndToEndBootstrapAndApplyUpgradeTest(t *testing.T, afactsFS foundry.Stat }) // Then run the OPCM upgrade + var cannonKonaPrestate common.Hash + if deployer.IsDevFeatureEnabled(implementationsConfig.DevFeatureBitmap, deployer.CannonKonaDevFlag) { + cannonKonaPrestate = common.Hash{'K', 'O', 'N', 'A'} + } t.Run("upgrade opcm", func(t *testing.T) { upgradeConfig := embedded.UpgradeOPChainInput{ Prank: superchainProxyAdminOwner, Opcm: impls.Opcm, EncodedChainConfigs: []embedded.OPChainConfig{ { - SystemConfigProxy: common.HexToAddress("034edD2A225f7f429A63E0f1D2084B9E0A93b538"), - AbsolutePrestate: common.Hash{'A', 'P'}, + SystemConfigProxy: common.HexToAddress("034edD2A225f7f429A63E0f1D2084B9E0A93b538"), + CannonPrestate: common.Hash{'C', 'A', 'N', 'N', 'O', 'N'}, + CannonKonaPrestate: cannonKonaPrestate, }, }, } diff --git a/op-deployer/pkg/deployer/manage/migrate.go b/op-deployer/pkg/deployer/manage/migrate.go index 3c8b3899c9c70..26da063141744 100644 --- a/op-deployer/pkg/deployer/manage/migrate.go +++ b/op-deployer/pkg/deployer/manage/migrate.go @@ -53,8 +53,9 @@ func (u *InteropMigrationInput) OpChainConfigs() ([]byte, error) { } type OPChainConfig struct { - SystemConfigProxy common.Address `json:"systemConfigProxy"` - AbsolutePrestate common.Hash `json:"absolutePrestate"` + SystemConfigProxy common.Address `json:"systemConfigProxy"` + CannonPrestate common.Hash `json:"cannonPrestate"` + CannonKonaPrestate common.Hash `json:"cannonKonaPrestate"` } type InteropMigrationOutput struct { @@ -65,7 +66,7 @@ func (output *InteropMigrationOutput) CheckOutput(input common.Address) error { return nil } -var opChainConfigEncoder = w3.MustNewFunc("dummy((address systemConfigProxy,bytes32 absolutePrestate)[])", "") +var opChainConfigEncoder = w3.MustNewFunc("dummy((address systemConfigProxy, bytes32 cannonPrestate, bytes32 cannonKonaPrestate)[])", "") type InteropMigration struct { Run func(input common.Address) @@ -111,7 +112,7 @@ func MigrateCLI(cliCtx *cli.Context) error { EncodedChainConfigs: []OPChainConfig{ { SystemConfigProxy: common.HexToAddress(cliCtx.String(SystemConfigProxyFlag.Name)), - AbsolutePrestate: common.HexToHash(cliCtx.String(DisputeAbsolutePrestateFlag.Name)), + CannonPrestate: common.HexToHash(cliCtx.String(DisputeAbsolutePrestateFlag.Name)), }, }, } diff --git a/op-deployer/pkg/deployer/manage/migrate_test.go b/op-deployer/pkg/deployer/manage/migrate_test.go index f735e3ea34aaf..a3ba26a6955f4 100644 --- a/op-deployer/pkg/deployer/manage/migrate_test.go +++ b/op-deployer/pkg/deployer/manage/migrate_test.go @@ -64,7 +64,7 @@ func TestInteropMigration(t *testing.T) { EncodedChainConfigs: []OPChainConfig{ { SystemConfigProxy: common.HexToAddress("0x034edD2A225f7f429A63E0f1D2084B9E0A93b538"), - AbsolutePrestate: common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000abc"), + CannonPrestate: common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000abc"), }, }, } diff --git a/op-deployer/pkg/deployer/upgrade/embedded/upgrade.go b/op-deployer/pkg/deployer/upgrade/embedded/upgrade.go index 93803f5f3540c..9ae6f07c63d47 100644 --- a/op-deployer/pkg/deployer/upgrade/embedded/upgrade.go +++ b/op-deployer/pkg/deployer/upgrade/embedded/upgrade.go @@ -18,11 +18,12 @@ type UpgradeOPChainInput struct { } type OPChainConfig struct { - SystemConfigProxy common.Address `json:"systemConfigProxy"` - AbsolutePrestate common.Hash `json:"absolutePrestate"` + SystemConfigProxy common.Address `json:"systemConfigProxy"` + CannonPrestate common.Hash `json:"cannonPrestate"` + CannonKonaPrestate common.Hash `json:"cannonKonaPrestate"` } -var opChainConfigEncoder = w3.MustNewFunc("dummy((address systemConfigProxy,bytes32 absolutePrestate)[])", "") +var opChainConfigEncoder = w3.MustNewFunc("dummy((address systemConfigProxy,bytes32 cannonPrestate,bytes32 cannonKonaPrestate)[])", "") func (u *UpgradeOPChainInput) OpChainConfigs() ([]byte, error) { data, err := opChainConfigEncoder.EncodeArgs(u.EncodedChainConfigs) @@ -37,7 +38,7 @@ type UpgradeOPChain struct { } func Upgrade(host *script.Host, input UpgradeOPChainInput) error { - return opcm.RunScriptVoid[UpgradeOPChainInput](host, input, "UpgradeOPChain.s.sol", "UpgradeOPChain") + return opcm.RunScriptVoid(host, input, "UpgradeOPChain.s.sol", "UpgradeOPChain") } type Upgrader struct{} diff --git a/op-devstack/sysgo/superroot.go b/op-devstack/sysgo/superroot.go index 5193be24b6022..e2d6a502c44a1 100644 --- a/op-devstack/sysgo/superroot.go +++ b/op-devstack/sysgo/superroot.go @@ -72,7 +72,7 @@ func WithSuperRoots(l1ChainID eth.ChainID, l1ELID stack.L1ELNodeID, l2CLID stack l2ChainIDs = append(l2ChainIDs, l2ChainID) opChainConfigs = append(opChainConfigs, bindings.OPContractsManagerOpChainConfig{ SystemConfigProxy: l2Deployment.SystemConfigProxyAddr(), - AbsolutePrestate: absolutePrestate, + CannonPrestate: absolutePrestate, }) } diff --git a/op-e2e/bindings/opcontractsmanager.go b/op-e2e/bindings/opcontractsmanager.go index c65d6dd091c3c..794bd1597df11 100644 --- a/op-e2e/bindings/opcontractsmanager.go +++ b/op-e2e/bindings/opcontractsmanager.go @@ -53,19 +53,15 @@ type OPContractsManagerAddGameOutput struct { // OPContractsManagerBlueprints is an auto generated low-level Go binding around an user-defined struct. type OPContractsManagerBlueprints struct { - AddressManager common.Address - Proxy common.Address - ProxyAdmin common.Address - L1ChugSplashProxy common.Address - ResolvedDelegateProxy common.Address - PermissionedDisputeGame1 common.Address - PermissionedDisputeGame2 common.Address - PermissionlessDisputeGame1 common.Address - PermissionlessDisputeGame2 common.Address - SuperPermissionedDisputeGame1 common.Address - SuperPermissionedDisputeGame2 common.Address - SuperPermissionlessDisputeGame1 common.Address - SuperPermissionlessDisputeGame2 common.Address + AddressManager common.Address + Proxy common.Address + ProxyAdmin common.Address + L1ChugSplashProxy common.Address + ResolvedDelegateProxy common.Address + PermissionedDisputeGame1 common.Address + PermissionedDisputeGame2 common.Address + PermissionlessDisputeGame1 common.Address + PermissionlessDisputeGame2 common.Address } // OPContractsManagerDeployInput is an auto generated low-level Go binding around an user-defined struct. @@ -120,6 +116,10 @@ type OPContractsManagerImplementations struct { AnchorStateRegistryImpl common.Address DelayedWETHImpl common.Address MipsImpl common.Address + FaultDisputeGameV2Impl common.Address + PermissionedDisputeGameV2Impl common.Address + SuperFaultDisputeGameImpl common.Address + SuperPermissionedDisputeGameImpl common.Address } // OPContractsManagerInteropMigratorGameParameters is an auto generated low-level Go binding around an user-defined struct. @@ -143,8 +143,9 @@ type OPContractsManagerInteropMigratorMigrateInput struct { // OPContractsManagerOpChainConfig is an auto generated low-level Go binding around an user-defined struct. type OPContractsManagerOpChainConfig struct { - SystemConfigProxy common.Address - AbsolutePrestate [32]byte + SystemConfigProxy common.Address + CannonPrestate [32]byte + CannonKonaPrestate [32]byte } // OPContractsManagerRoles is an auto generated low-level Go binding around an user-defined struct. @@ -162,6 +163,16 @@ type OPContractsManagerStandardValidatorValidationInput struct { SysCfg common.Address AbsolutePrestate [32]byte L2ChainID *big.Int + Proposer common.Address +} + +// OPContractsManagerStandardValidatorValidationInputDev is an auto generated low-level Go binding around an user-defined struct. +type OPContractsManagerStandardValidatorValidationInputDev struct { + SysCfg common.Address + CannonPrestate [32]byte + CannonKonaPrestate [32]byte + L2ChainID *big.Int + Proposer common.Address } // OPContractsManagerStandardValidatorValidationOverrides is an auto generated low-level Go binding around an user-defined struct. @@ -185,8 +196,8 @@ type Proposal struct { // OPContractsManagerMetaData contains all meta data concerning the OPContractsManager contract. var OPContractsManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_opcmGameTypeAdder\",\"type\":\"address\",\"internalType\":\"contractOPContractsManagerGameTypeAdder\"},{\"name\":\"_opcmDeployer\",\"type\":\"address\",\"internalType\":\"contractOPContractsManagerDeployer\"},{\"name\":\"_opcmUpgrader\",\"type\":\"address\",\"internalType\":\"contractOPContractsManagerUpgrader\"},{\"name\":\"_opcmInteropMigrator\",\"type\":\"address\",\"internalType\":\"contractOPContractsManagerInteropMigrator\"},{\"name\":\"_opcmStandardValidator\",\"type\":\"address\",\"internalType\":\"contractOPContractsManagerStandardValidator\"},{\"name\":\"_superchainConfig\",\"type\":\"address\",\"internalType\":\"contractISuperchainConfig\"},{\"name\":\"_protocolVersions\",\"type\":\"address\",\"internalType\":\"contractIProtocolVersions\"},{\"name\":\"_superchainProxyAdmin\",\"type\":\"address\",\"internalType\":\"contractIProxyAdmin\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addGameType\",\"inputs\":[{\"name\":\"_gameConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structOPContractsManager.AddGameInput[]\",\"components\":[{\"name\":\"saltMixer\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"systemConfig\",\"type\":\"address\",\"internalType\":\"contractISystemConfig\"},{\"name\":\"delayedWETH\",\"type\":\"address\",\"internalType\":\"contractIDelayedWETH\"},{\"name\":\"disputeGameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"disputeAbsolutePrestate\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"disputeMaxGameDepth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"disputeSplitDepth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"disputeClockExtension\",\"type\":\"uint64\",\"internalType\":\"Duration\"},{\"name\":\"disputeMaxClockDuration\",\"type\":\"uint64\",\"internalType\":\"Duration\"},{\"name\":\"initialBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"vm\",\"type\":\"address\",\"internalType\":\"contractIBigStepper\"},{\"name\":\"permissioned\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOPContractsManager.AddGameOutput[]\",\"components\":[{\"name\":\"delayedWETH\",\"type\":\"address\",\"internalType\":\"contractIDelayedWETH\"},{\"name\":\"faultDisputeGame\",\"type\":\"address\",\"internalType\":\"contractIFaultDisputeGame\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"blueprints\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOPContractsManager.Blueprints\",\"components\":[{\"name\":\"addressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"proxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"proxyAdmin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"l1ChugSplashProxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"resolvedDelegateProxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionedDisputeGame1\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionedDisputeGame2\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionlessDisputeGame1\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionlessDisputeGame2\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"superPermissionedDisputeGame1\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"superPermissionedDisputeGame2\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"superPermissionlessDisputeGame1\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"superPermissionlessDisputeGame2\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"chainIdToBatchInboxAddress\",\"inputs\":[{\"name\":\"_l2ChainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deploy\",\"inputs\":[{\"name\":\"_input\",\"type\":\"tuple\",\"internalType\":\"structOPContractsManager.DeployInput\",\"components\":[{\"name\":\"roles\",\"type\":\"tuple\",\"internalType\":\"structOPContractsManager.Roles\",\"components\":[{\"name\":\"opChainProxyAdminOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"systemConfigOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"batcher\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"unsafeBlockSigner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"challenger\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"basefeeScalar\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobBasefeeScalar\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"l2ChainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startingAnchorRoot\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"saltMixer\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"gasLimit\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"disputeGameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"disputeAbsolutePrestate\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"disputeMaxGameDepth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"disputeSplitDepth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"disputeClockExtension\",\"type\":\"uint64\",\"internalType\":\"Duration\"},{\"name\":\"disputeMaxClockDuration\",\"type\":\"uint64\",\"internalType\":\"Duration\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOPContractsManager.DeployOutput\",\"components\":[{\"name\":\"opChainProxyAdmin\",\"type\":\"address\",\"internalType\":\"contractIProxyAdmin\"},{\"name\":\"addressManager\",\"type\":\"address\",\"internalType\":\"contractIAddressManager\"},{\"name\":\"l1ERC721BridgeProxy\",\"type\":\"address\",\"internalType\":\"contractIL1ERC721Bridge\"},{\"name\":\"systemConfigProxy\",\"type\":\"address\",\"internalType\":\"contractISystemConfig\"},{\"name\":\"optimismMintableERC20FactoryProxy\",\"type\":\"address\",\"internalType\":\"contractIOptimismMintableERC20Factory\"},{\"name\":\"l1StandardBridgeProxy\",\"type\":\"address\",\"internalType\":\"contractIL1StandardBridge\"},{\"name\":\"l1CrossDomainMessengerProxy\",\"type\":\"address\",\"internalType\":\"contractIL1CrossDomainMessenger\"},{\"name\":\"ethLockboxProxy\",\"type\":\"address\",\"internalType\":\"contractIETHLockbox\"},{\"name\":\"optimismPortalProxy\",\"type\":\"address\",\"internalType\":\"contractIOptimismPortal2\"},{\"name\":\"disputeGameFactoryProxy\",\"type\":\"address\",\"internalType\":\"contractIDisputeGameFactory\"},{\"name\":\"anchorStateRegistryProxy\",\"type\":\"address\",\"internalType\":\"contractIAnchorStateRegistry\"},{\"name\":\"faultDisputeGame\",\"type\":\"address\",\"internalType\":\"contractIFaultDisputeGame\"},{\"name\":\"permissionedDisputeGame\",\"type\":\"address\",\"internalType\":\"contractIPermissionedDisputeGame\"},{\"name\":\"delayedWETHPermissionedGameProxy\",\"type\":\"address\",\"internalType\":\"contractIDelayedWETH\"},{\"name\":\"delayedWETHPermissionlessGameProxy\",\"type\":\"address\",\"internalType\":\"contractIDelayedWETH\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"devFeatureBitmap\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"implementations\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOPContractsManager.Implementations\",\"components\":[{\"name\":\"superchainConfigImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"protocolVersionsImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"l1ERC721BridgeImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"optimismPortalImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"optimismPortalInteropImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"ethLockboxImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"systemConfigImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"optimismMintableERC20FactoryImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"l1CrossDomainMessengerImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"l1StandardBridgeImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"disputeGameFactoryImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"anchorStateRegistryImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delayedWETHImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"mipsImpl\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isDevFeatureEnabled\",\"inputs\":[{\"name\":\"_feature\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"migrate\",\"inputs\":[{\"name\":\"_input\",\"type\":\"tuple\",\"internalType\":\"structOPContractsManagerInteropMigrator.MigrateInput\",\"components\":[{\"name\":\"usePermissionlessGame\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"startingAnchorRoot\",\"type\":\"tuple\",\"internalType\":\"structProposal\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"Hash\"},{\"name\":\"l2SequenceNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"gameParameters\",\"type\":\"tuple\",\"internalType\":\"structOPContractsManagerInteropMigrator.GameParameters\",\"components\":[{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"challenger\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxGameDepth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"splitDepth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"initBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"clockExtension\",\"type\":\"uint64\",\"internalType\":\"Duration\"},{\"name\":\"maxClockDuration\",\"type\":\"uint64\",\"internalType\":\"Duration\"}]},{\"name\":\"opChainConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structOPContractsManager.OpChainConfig[]\",\"components\":[{\"name\":\"systemConfigProxy\",\"type\":\"address\",\"internalType\":\"contractISystemConfig\"},{\"name\":\"absolutePrestate\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"opcmDeployer\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractOPContractsManagerDeployer\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"opcmGameTypeAdder\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractOPContractsManagerGameTypeAdder\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"opcmInteropMigrator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractOPContractsManagerInteropMigrator\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"opcmStandardValidator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractOPContractsManagerStandardValidator\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"opcmUpgrader\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractOPContractsManagerUpgrader\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"protocolVersions\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIProtocolVersions\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"superchainConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISuperchainConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"superchainProxyAdmin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIProxyAdmin\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updatePrestate\",\"inputs\":[{\"name\":\"_prestateUpdateInputs\",\"type\":\"tuple[]\",\"internalType\":\"structOPContractsManager.UpdatePrestateInput[]\",\"components\":[{\"name\":\"systemConfigProxy\",\"type\":\"address\",\"internalType\":\"contractISystemConfig\"},{\"name\":\"cannonPrestate\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"cannonKonaPrestate\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgrade\",\"inputs\":[{\"name\":\"_opChainConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structOPContractsManager.OpChainConfig[]\",\"components\":[{\"name\":\"systemConfigProxy\",\"type\":\"address\",\"internalType\":\"contractISystemConfig\"},{\"name\":\"absolutePrestate\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeSuperchainConfig\",\"inputs\":[{\"name\":\"_superchainConfig\",\"type\":\"address\",\"internalType\":\"contractISuperchainConfig\"},{\"name\":\"_superchainProxyAdmin\",\"type\":\"address\",\"internalType\":\"contractIProxyAdmin\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validate\",\"inputs\":[{\"name\":\"_input\",\"type\":\"tuple\",\"internalType\":\"structOPContractsManagerStandardValidator.ValidationInput\",\"components\":[{\"name\":\"sysCfg\",\"type\":\"address\",\"internalType\":\"contractISystemConfig\"},{\"name\":\"absolutePrestate\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"l2ChainID\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"_allowFailure\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validateWithOverrides\",\"inputs\":[{\"name\":\"_input\",\"type\":\"tuple\",\"internalType\":\"structOPContractsManagerStandardValidator.ValidationInput\",\"components\":[{\"name\":\"sysCfg\",\"type\":\"address\",\"internalType\":\"contractISystemConfig\"},{\"name\":\"absolutePrestate\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"l2ChainID\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"_allowFailure\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"_overrides\",\"type\":\"tuple\",\"internalType\":\"structOPContractsManagerStandardValidator.ValidationOverrides\",\"components\":[{\"name\":\"l1PAOMultisig\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"challenger\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"error\",\"name\":\"AddressHasNoCode\",\"inputs\":[{\"name\":\"who\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressNotFound\",\"inputs\":[{\"name\":\"who\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AlreadyReleased\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidChainId\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidGameConfigs\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoleAddress\",\"inputs\":[{\"name\":\"role\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"InvalidStartingAnchorRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LatestReleaseNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegatecall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PrestateNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PrestateRequired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SuperchainConfigMismatch\",\"inputs\":[{\"name\":\"systemConfig\",\"type\":\"address\",\"internalType\":\"contractISystemConfig\"}]},{\"type\":\"error\",\"name\":\"SuperchainProxyAdminMismatch\",\"inputs\":[]}]", - Bin: "0x6101a06040523480156200001257600080fd5b5060405162002c0538038062002c0583398101604081905262000035916200030c565b60405163b6a4cd2160e01b81526001600160a01b03848116600483015288169063b6a4cd219060240160006040518083038186803b1580156200007757600080fd5b505afa1580156200008c573d6000803e3d6000fd5b505060405163b6a4cd2160e01b81526001600160a01b0385811660048301528a16925063b6a4cd21915060240160006040518083038186803b158015620000d257600080fd5b505afa158015620000e7573d6000803e3d6000fd5b505060405163b6a4cd2160e01b81526001600160a01b038b811660048301528a16925063b6a4cd21915060240160006040518083038186803b1580156200012d57600080fd5b505afa15801562000142573d6000803e3d6000fd5b505060405163b6a4cd2160e01b81526001600160a01b038a1660048201819052925063b6a4cd21915060240160006040518083038186803b1580156200018757600080fd5b505afa1580156200019c573d6000803e3d6000fd5b505060405163b6a4cd2160e01b81526001600160a01b0389811660048301528a16925063b6a4cd21915060240160006040518083038186803b158015620001e257600080fd5b505afa158015620001f7573d6000803e3d6000fd5b505060405163b6a4cd2160e01b81526001600160a01b0388811660048301528a16925063b6a4cd21915060240160006040518083038186803b1580156200023d57600080fd5b505afa15801562000252573d6000803e3d6000fd5b505060405163b6a4cd2160e01b81526001600160a01b0387811660048301528a16925063b6a4cd21915060240160006040518083038186803b1580156200029857600080fd5b505afa158015620002ad573d6000803e3d6000fd5b5050506001600160a01b039889166080525095871660a05293861660c05291851660e05284166101005283166101205282166101405216610160523061018052620003cd565b6001600160a01b03811681146200030957600080fd5b50565b600080600080600080600080610100898b0312156200032a57600080fd5b88516200033781620002f3565b60208a01519098506200034a81620002f3565b60408a01519097506200035d81620002f3565b60608a01519096506200037081620002f3565b60808a01519095506200038381620002f3565b60a08a01519094506200039681620002f3565b60c08a0151909350620003a981620002f3565b60e08a0151909250620003bc81620002f3565b809150509295985092959890939650565b60805160a05160c05160e0516101005161012051610140516101605161018051612749620004bc600039600081816104520152818161077a015281816109d501528181610c420152610d4e0152600061022201526000610341015260008181610271015261095d0152600081816103ff01528181610bc20152610f970152600081816101e50152610a9f01526000818161018c0152818161051c0152610d1901526000818161031a0152818161054a01528181610642015281816106f50152818161092601528181610af60152610ea8015260008181610426015281816108460152610e1801526127496000f3fe608060405234801561001057600080fd5b50600436106101825760003560e01c8063622d56f1116100d8578063b0b807eb1161008c578063b806c80511610066578063b806c805146103e7578063ba7903db146103fa578063becbdf4a1461042157600080fd5b8063b0b807eb146103ac578063b23cc044146103bf578063b51f9c2b146103d257600080fd5b80636d510c5e116100bd5780636d510c5e1461036357806378ecabce14610376578063a9008b691461039957600080fd5b8063622d56f1146103155780636624856a1461033c57600080fd5b806330e9012c1161013a57806354fd4d501161011457806354fd4d5014610293578063604aa628146102d5578063613e827b146102f557600080fd5b806330e9012c14610244578063318b1b801461025957806335e80ab31461026c57600080fd5b80631481a7241161016b5780631481a724146101e05780631d8a4e92146102075780632b96b8391461021d57600080fd5b806303dbe68c146101875780630b8bd7cb146101cb575b600080fd5b6101ae7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6101de6101d93660046111fd565b610448565b005b6101ae7f000000000000000000000000000000000000000000000000000000000000000081565b61020f610546565b6040519081526020016101c2565b6101ae7f000000000000000000000000000000000000000000000000000000000000000081565b61024c6105cf565b6040516101c291906112c1565b6101ae6102673660046113f5565b6106c3565b6101ae7f000000000000000000000000000000000000000000000000000000000000000081565b60408051808201909152600581527f342e312e3000000000000000000000000000000000000000000000000000000060208201525b6040516101c29190611466565b6102e86102e3366004611540565b61076e565b6040516101c291906116d5565b610308610303366004611731565b610889565b6040516101c2919061176d565b6101ae7f000000000000000000000000000000000000000000000000000000000000000081565b6101ae7f000000000000000000000000000000000000000000000000000000000000000081565b6101de6103713660046118aa565b6109cb565b6103896103843660046113f5565b610ac4565b60405190151581526020016101c2565b6102c86103a736600461192b565b610b69565b6101de6103ba366004611963565b610c38565b6101de6103cd366004611991565b610d44565b6103da610e3d565b6040516101c29190611a58565b6102c86103f5366004611b7b565b610f29565b6101ae7f000000000000000000000000000000000000000000000000000000000000000081565b6101ae7f000000000000000000000000000000000000000000000000000000000000000081565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036104aa576040517f0a57d61d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816040516024016104bd9190611c15565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0b8bd7cb0000000000000000000000000000000000000000000000000000000017905290506105417f000000000000000000000000000000000000000000000000000000000000000082611006565b505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631d8a4e926040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ca9190611c60565b905090565b604080516101c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a08101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166330e9012c6040518163ffffffff1660e01b81526004016101c060405180830381865afa15801561069f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ca9190611c84565b6040517f318b1b80000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063318b1b8090602401602060405180830381865afa158015610744573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107689190611d94565b92915050565b60606001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036107d2576040517f0a57d61d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000826040516024016107e59190611db1565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f604aa628000000000000000000000000000000000000000000000000000000001790529050600061086b7f000000000000000000000000000000000000000000000000000000000000000083611006565b9050808060200190518101906108819190611ee6565b949350505050565b604080516101e081018252600080825260208201819052818301819052606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a082018190526101c082015290517fb2e48a3f0000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b2e48a3f906109879085907f00000000000000000000000000000000000000000000000000000000000000009033906004016120cb565b6101e0604051808303816000875af11580156109a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107689190612280565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610a2d576040517f0a57d61d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081604051602401610a409190612451565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f6d510c5e0000000000000000000000000000000000000000000000000000000017905290506105417f000000000000000000000000000000000000000000000000000000000000000082611006565b6040517f78ecabce000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906378ecabce90602401602060405180830381865afa158015610b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610768919061254d565b604080517fa9008b6900000000000000000000000000000000000000000000000000000000815283516001600160a01b0390811660048301526020850151602483015291840151604482015282151560648201526060917f0000000000000000000000000000000000000000000000000000000000000000169063a9008b6990608401600060405180830381865afa158015610c09573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c31919081019061256a565b9392505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610c9a576040517f0a57d61d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b0380841660248301528216604482015260009060640160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb0b807eb000000000000000000000000000000000000000000000000000000001790529050610d3e7f000000000000000000000000000000000000000000000000000000000000000082611006565b50505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610da6576040517f0a57d61d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081604051602401610db991906125d8565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb23cc0440000000000000000000000000000000000000000000000000000000017905290506105417f000000000000000000000000000000000000000000000000000000000000000082611006565b604080516101a081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101829052610140810182905261016081018290526101808101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b51f9c2b6040518163ffffffff1660e01b81526004016101a060405180830381865afa158015610f05573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ca919061262d565b604080517fb806c80500000000000000000000000000000000000000000000000000000000815284516001600160a01b0390811660048301526020808701516024840152928601516044830152841515606483015283518116608483015291830151821660a48201526060917f0000000000000000000000000000000000000000000000000000000000000000169063b806c8059060c401600060405180830381865afa158015610fde573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610881919081019061256a565b6060600080846001600160a01b0316846040516110239190612720565b600060405180830381855af49150503d806000811461105e576040519150601f19603f3d011682016040523d82523d6000602084013e611063565b606091505b50915091508161088157805160208201fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156110c7576110c7611075565b60405290565b604051610180810167ffffffffffffffff811182821017156110c7576110c7611075565b6040516060810167ffffffffffffffff811182821017156110c7576110c7611075565b6040516101c0810167ffffffffffffffff811182821017156110c7576110c7611075565b6040516101e0810167ffffffffffffffff811182821017156110c7576110c7611075565b6040516101a0810167ffffffffffffffff811182821017156110c7576110c7611075565b604051601f8201601f1916810167ffffffffffffffff811182821017156111a9576111a9611075565b604052919050565b600067ffffffffffffffff8211156111cb576111cb611075565b5060051b60200190565b6001600160a01b03811681146111ea57600080fd5b50565b80356111f8816111d5565b919050565b6000602080838503121561121057600080fd5b823567ffffffffffffffff81111561122757600080fd5b8301601f8101851361123857600080fd5b803561124b611246826111b1565b611180565b81815260069190911b8201830190838101908783111561126a57600080fd5b928401925b828410156112b657604084890312156112885760008081fd5b6112906110a4565b843561129b816111d5565b8152848601358682015282526040909301929084019061126f565b979650505050505050565b81516001600160a01b031681526101c0810160208301516112ed60208401826001600160a01b03169052565b50604083015161130860408401826001600160a01b03169052565b50606083015161132360608401826001600160a01b03169052565b50608083015161133e60808401826001600160a01b03169052565b5060a083015161135960a08401826001600160a01b03169052565b5060c083015161137460c08401826001600160a01b03169052565b5060e083015161138f60e08401826001600160a01b03169052565b50610100838101516001600160a01b0390811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a08085015191821681850152905b505092915050565b60006020828403121561140757600080fd5b5035919050565b60005b83811015611429578181015183820152602001611411565b83811115610d3e5750506000910152565b6000815180845261145281602086016020860161140e565b601f01601f19169290920160200192915050565b602081526000610c31602083018461143a565b600067ffffffffffffffff82111561149357611493611075565b50601f01601f191660200190565b600082601f8301126114b257600080fd5b81356114c061124682611479565b8181528460208386010111156114d557600080fd5b816020850160208301376000918101602001919091529392505050565b803563ffffffff811681146111f857600080fd5b67ffffffffffffffff811681146111ea57600080fd5b80356111f881611506565b80151581146111ea57600080fd5b80356111f881611527565b6000602080838503121561155357600080fd5b823567ffffffffffffffff8082111561156b57600080fd5b818501915085601f83011261157f57600080fd5b813561158d611246826111b1565b81815260059190911b830184019084810190888311156115ac57600080fd5b8585015b838110156116c8578035858111156115c85760008081fd5b8601610180818c03601f19018113156115e15760008081fd5b6115e96110cd565b89830135888111156115fb5760008081fd5b6116098e8c838701016114a1565b82525060406116198185016111ed565b8b830152606061162a8186016111ed565b828401526080915061163d8286016114f2565b818401525060a0808501358284015260c0915081850135818401525060e08085013582840152610100915061167382860161151c565b9083015261012061168585820161151c565b8284015261014091508185013581840152506101606116a58186016111ed565b828401526116b4848601611535565b9083015250855250509186019186016115b0565b5098975050505050505050565b602080825282518282018190526000919060409081850190868401855b8281101561172457815180516001600160a01b03908116865290870151168685015292840192908501906001016116f2565b5091979650505050505050565b60006020828403121561174357600080fd5b813567ffffffffffffffff81111561175a57600080fd5b82016102408185031215610c3157600080fd5b81516001600160a01b031681526101e08101602083015161179960208401826001600160a01b03169052565b5060408301516117b460408401826001600160a01b03169052565b5060608301516117cf60608401826001600160a01b03169052565b5060808301516117ea60808401826001600160a01b03169052565b5060a083015161180560a08401826001600160a01b03169052565b5060c083015161182060c08401826001600160a01b03169052565b5060e083015161183b60e08401826001600160a01b03169052565b50610100838101516001600160a01b0390811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c08085015191821681850152906113ed565b6000602082840312156118bc57600080fd5b813567ffffffffffffffff8111156118d357600080fd5b82016101608185031215610c3157600080fd5b6000606082840312156118f857600080fd5b6119006110f1565b9050813561190d816111d5565b80825250602082013560208201526040820135604082015292915050565b6000806080838503121561193e57600080fd5b61194884846118e6565b9150606083013561195881611527565b809150509250929050565b6000806040838503121561197657600080fd5b8235611981816111d5565b91506020830135611958816111d5565b600060208083850312156119a457600080fd5b823567ffffffffffffffff8111156119bb57600080fd5b8301601f810185136119cc57600080fd5b80356119da611246826111b1565b818152606091820283018401918482019190888411156119f957600080fd5b938501935b83851015611a4c5780858a031215611a165760008081fd5b611a1e6110f1565b8535611a29816111d5565b8152858701358782015260408087013590820152835293840193918501916119fe565b50979650505050505050565b81516001600160a01b031681526101a081016020830151611a8460208401826001600160a01b03169052565b506040830151611a9f60408401826001600160a01b03169052565b506060830151611aba60608401826001600160a01b03169052565b506080830151611ad560808401826001600160a01b03169052565b5060a0830151611af060a08401826001600160a01b03169052565b5060c0830151611b0b60c08401826001600160a01b03169052565b5060e0830151611b2660e08401826001600160a01b03169052565b50610100838101516001600160a01b03908116918401919091526101208085015182169084015261014080850151821690840152610160808501518216908401526101808085015191821681850152906113ed565b600080600083850360c0811215611b9157600080fd5b611b9b86866118e6565b93506060850135611bab81611527565b925060407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8082011215611bdd57600080fd5b50611be66110a4565b6080850135611bf4816111d5565b815260a0850135611c04816111d5565b602082015292959194509192509050565b602080825282518282018190526000919060409081850190868401855b8281101561172457815180516001600160a01b03168552860151868501529284019290850190600101611c32565b600060208284031215611c7257600080fd5b5051919050565b80516111f8816111d5565b60006101c08284031215611c9757600080fd5b611c9f611114565b611ca883611c79565b8152611cb660208401611c79565b6020820152611cc760408401611c79565b6040820152611cd860608401611c79565b6060820152611ce960808401611c79565b6080820152611cfa60a08401611c79565b60a0820152611d0b60c08401611c79565b60c0820152611d1c60e08401611c79565b60e0820152610100611d2f818501611c79565b90820152610120611d41848201611c79565b90820152610140611d53848201611c79565b90820152610160611d65848201611c79565b90820152610180611d77848201611c79565b908201526101a0611d89848201611c79565b908201529392505050565b600060208284031215611da657600080fd5b8151610c31816111d5565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015611ed8577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc089840301855281516101808151818652611e1d8287018261143a565b91505088820151611e388a8701826001600160a01b03169052565b50878201516001600160a01b03908116868a015260608084015163ffffffff16908701526080808401519087015260a0808401519087015260c0808401519087015260e08084015167ffffffffffffffff9081169188019190915261010080850151909116908701526101208084015190870152610140808401519091169086015261016091820151151591909401529386019390860190600101611dd8565b509098975050505050505050565b60006020808385031215611ef957600080fd5b825167ffffffffffffffff811115611f1057600080fd5b8301601f81018513611f2157600080fd5b8051611f2f611246826111b1565b81815260069190911b82018301908381019087831115611f4e57600080fd5b928401925b828410156112b65760408489031215611f6c5760008081fd5b611f746110a4565b8451611f7f816111d5565b815284860151611f8e816111d5565b8187015282526040939093019290840190611f53565b8035611faf816111d5565b6001600160a01b039081168352602082013590611fcb826111d5565b9081166020840152604082013590611fe2826111d5565b9081166040840152606082013590611ff9826111d5565b9081166060840152608082013590612010826111d5565b908116608084015260a082013590612027826111d5565b80821660a085015250505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261206a57600080fd5b830160208101925035905067ffffffffffffffff81111561208a57600080fd5b80360382131561209957600080fd5b9250929050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b606081526120dc6060820185611fa4565b60006120ea60c086016114f2565b6101206120fe8185018363ffffffff169052565b61210a60e088016114f2565b91506101406121208186018463ffffffff169052565b61016092506101008801358386015261213b82890189612035565b925061024061018081818901526121576102a0890186856120a0565b9450612165848c018c612035565b945092506101a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa089870301818a01526121a08686866120a0565b95506121ad878d0161151c565b96506101c094506121c9858a018867ffffffffffffffff169052565b6121d4828d016114f2565b96506101e093506121ec848a018863ffffffff169052565b6102009650808c0135878a01525050610220838b013581890152828b013582890152612219868c0161151c565b67ffffffffffffffff81166102608a01529550612237818c0161151c565b95505050505061225461028085018367ffffffffffffffff169052565b6001600160a01b0386166020850152915061226c9050565b6001600160a01b0383166040830152610881565b60006101e0828403121561229357600080fd5b61229b611138565b6122a483611c79565b81526122b260208401611c79565b60208201526122c360408401611c79565b60408201526122d460608401611c79565b60608201526122e560808401611c79565b60808201526122f660a08401611c79565b60a082015261230760c08401611c79565b60c082015261231860e08401611c79565b60e082015261010061232b818501611c79565b9082015261012061233d848201611c79565b9082015261014061234f848201611c79565b90820152610160612361848201611c79565b90820152610180612373848201611c79565b908201526101a0612385848201611c79565b908201526101c0611d89848201611c79565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126123cc57600080fd5b830160208101925035905067ffffffffffffffff8111156123ec57600080fd5b8060061b360382131561209957600080fd5b8183526000602080850194508260005b85811015612446578135612421816111d5565b6001600160a01b0316875281830135838801526040968701969091019060010161240e565b509495945050505050565b602081526000823561246281611527565b8015156020840152506020830135604083015260408301356060830152606083013561248d816111d5565b6001600160a01b038082166080850152608085013591506124ad826111d5565b80821660a0850152505060a083013560c083015260c083013560e083015261010060e0840135818401528084013590506124e681611506565b61012067ffffffffffffffff82168185015261250381860161151c565b91505061014061251e8185018367ffffffffffffffff169052565b61252a81860186612397565b6101608681015292509050612544610180850183836123fe565b95945050505050565b60006020828403121561255f57600080fd5b8151610c3181611527565b60006020828403121561257c57600080fd5b815167ffffffffffffffff81111561259357600080fd5b8201601f810184136125a457600080fd5b80516125b261124682611479565b8181528560208385010111156125c757600080fd5b61254482602083016020860161140e565b602080825282518282018190526000919060409081850190868401855b8281101561172457815180516001600160a01b03168552868101518786015285015185850152606090930192908501906001016125f5565b60006101a0828403121561264057600080fd5b61264861115c565b61265183611c79565b815261265f60208401611c79565b602082015261267060408401611c79565b604082015261268160608401611c79565b606082015261269260808401611c79565b60808201526126a360a08401611c79565b60a08201526126b460c08401611c79565b60c08201526126c560e08401611c79565b60e08201526101006126d8818501611c79565b908201526101206126ea848201611c79565b908201526101406126fc848201611c79565b9082015261016061270e848201611c79565b90820152610180611d89848201611c79565b6000825161273281846020870161140e565b919091019291505056fea164736f6c634300080f000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_opcmGameTypeAdder\",\"type\":\"address\",\"internalType\":\"contractOPContractsManagerGameTypeAdder\"},{\"name\":\"_opcmDeployer\",\"type\":\"address\",\"internalType\":\"contractOPContractsManagerDeployer\"},{\"name\":\"_opcmUpgrader\",\"type\":\"address\",\"internalType\":\"contractOPContractsManagerUpgrader\"},{\"name\":\"_opcmInteropMigrator\",\"type\":\"address\",\"internalType\":\"contractOPContractsManagerInteropMigrator\"},{\"name\":\"_opcmStandardValidator\",\"type\":\"address\",\"internalType\":\"contractOPContractsManagerStandardValidator\"},{\"name\":\"_superchainConfig\",\"type\":\"address\",\"internalType\":\"contractISuperchainConfig\"},{\"name\":\"_protocolVersions\",\"type\":\"address\",\"internalType\":\"contractIProtocolVersions\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addGameType\",\"inputs\":[{\"name\":\"_gameConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structOPContractsManager.AddGameInput[]\",\"components\":[{\"name\":\"saltMixer\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"systemConfig\",\"type\":\"address\",\"internalType\":\"contractISystemConfig\"},{\"name\":\"delayedWETH\",\"type\":\"address\",\"internalType\":\"contractIDelayedWETH\"},{\"name\":\"disputeGameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"disputeAbsolutePrestate\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"disputeMaxGameDepth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"disputeSplitDepth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"disputeClockExtension\",\"type\":\"uint64\",\"internalType\":\"Duration\"},{\"name\":\"disputeMaxClockDuration\",\"type\":\"uint64\",\"internalType\":\"Duration\"},{\"name\":\"initialBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"vm\",\"type\":\"address\",\"internalType\":\"contractIBigStepper\"},{\"name\":\"permissioned\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOPContractsManager.AddGameOutput[]\",\"components\":[{\"name\":\"delayedWETH\",\"type\":\"address\",\"internalType\":\"contractIDelayedWETH\"},{\"name\":\"faultDisputeGame\",\"type\":\"address\",\"internalType\":\"contractIFaultDisputeGame\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"blueprints\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOPContractsManager.Blueprints\",\"components\":[{\"name\":\"addressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"proxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"proxyAdmin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"l1ChugSplashProxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"resolvedDelegateProxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionedDisputeGame1\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionedDisputeGame2\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionlessDisputeGame1\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionlessDisputeGame2\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"chainIdToBatchInboxAddress\",\"inputs\":[{\"name\":\"_l2ChainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deploy\",\"inputs\":[{\"name\":\"_input\",\"type\":\"tuple\",\"internalType\":\"structOPContractsManager.DeployInput\",\"components\":[{\"name\":\"roles\",\"type\":\"tuple\",\"internalType\":\"structOPContractsManager.Roles\",\"components\":[{\"name\":\"opChainProxyAdminOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"systemConfigOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"batcher\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"unsafeBlockSigner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"challenger\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"basefeeScalar\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobBasefeeScalar\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"l2ChainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startingAnchorRoot\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"saltMixer\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"gasLimit\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"disputeGameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"disputeAbsolutePrestate\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"disputeMaxGameDepth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"disputeSplitDepth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"disputeClockExtension\",\"type\":\"uint64\",\"internalType\":\"Duration\"},{\"name\":\"disputeMaxClockDuration\",\"type\":\"uint64\",\"internalType\":\"Duration\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOPContractsManager.DeployOutput\",\"components\":[{\"name\":\"opChainProxyAdmin\",\"type\":\"address\",\"internalType\":\"contractIProxyAdmin\"},{\"name\":\"addressManager\",\"type\":\"address\",\"internalType\":\"contractIAddressManager\"},{\"name\":\"l1ERC721BridgeProxy\",\"type\":\"address\",\"internalType\":\"contractIL1ERC721Bridge\"},{\"name\":\"systemConfigProxy\",\"type\":\"address\",\"internalType\":\"contractISystemConfig\"},{\"name\":\"optimismMintableERC20FactoryProxy\",\"type\":\"address\",\"internalType\":\"contractIOptimismMintableERC20Factory\"},{\"name\":\"l1StandardBridgeProxy\",\"type\":\"address\",\"internalType\":\"contractIL1StandardBridge\"},{\"name\":\"l1CrossDomainMessengerProxy\",\"type\":\"address\",\"internalType\":\"contractIL1CrossDomainMessenger\"},{\"name\":\"ethLockboxProxy\",\"type\":\"address\",\"internalType\":\"contractIETHLockbox\"},{\"name\":\"optimismPortalProxy\",\"type\":\"address\",\"internalType\":\"contractIOptimismPortal2\"},{\"name\":\"disputeGameFactoryProxy\",\"type\":\"address\",\"internalType\":\"contractIDisputeGameFactory\"},{\"name\":\"anchorStateRegistryProxy\",\"type\":\"address\",\"internalType\":\"contractIAnchorStateRegistry\"},{\"name\":\"faultDisputeGame\",\"type\":\"address\",\"internalType\":\"contractIFaultDisputeGame\"},{\"name\":\"permissionedDisputeGame\",\"type\":\"address\",\"internalType\":\"contractIPermissionedDisputeGame\"},{\"name\":\"delayedWETHPermissionedGameProxy\",\"type\":\"address\",\"internalType\":\"contractIDelayedWETH\"},{\"name\":\"delayedWETHPermissionlessGameProxy\",\"type\":\"address\",\"internalType\":\"contractIDelayedWETH\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"devFeatureBitmap\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"implementations\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOPContractsManager.Implementations\",\"components\":[{\"name\":\"superchainConfigImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"protocolVersionsImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"l1ERC721BridgeImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"optimismPortalImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"optimismPortalInteropImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"ethLockboxImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"systemConfigImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"optimismMintableERC20FactoryImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"l1CrossDomainMessengerImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"l1StandardBridgeImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"disputeGameFactoryImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"anchorStateRegistryImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delayedWETHImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"mipsImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"faultDisputeGameV2Impl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionedDisputeGameV2Impl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"superFaultDisputeGameImpl\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"superPermissionedDisputeGameImpl\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isDevFeatureEnabled\",\"inputs\":[{\"name\":\"_feature\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"migrate\",\"inputs\":[{\"name\":\"_input\",\"type\":\"tuple\",\"internalType\":\"structOPContractsManagerInteropMigrator.MigrateInput\",\"components\":[{\"name\":\"usePermissionlessGame\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"startingAnchorRoot\",\"type\":\"tuple\",\"internalType\":\"structProposal\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"Hash\"},{\"name\":\"l2SequenceNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"gameParameters\",\"type\":\"tuple\",\"internalType\":\"structOPContractsManagerInteropMigrator.GameParameters\",\"components\":[{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"challenger\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxGameDepth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"splitDepth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"initBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"clockExtension\",\"type\":\"uint64\",\"internalType\":\"Duration\"},{\"name\":\"maxClockDuration\",\"type\":\"uint64\",\"internalType\":\"Duration\"}]},{\"name\":\"opChainConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structOPContractsManager.OpChainConfig[]\",\"components\":[{\"name\":\"systemConfigProxy\",\"type\":\"address\",\"internalType\":\"contractISystemConfig\"},{\"name\":\"cannonPrestate\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"cannonKonaPrestate\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"opcmDeployer\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractOPContractsManagerDeployer\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"opcmGameTypeAdder\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractOPContractsManagerGameTypeAdder\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"opcmInteropMigrator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractOPContractsManagerInteropMigrator\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"opcmStandardValidator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractOPContractsManagerStandardValidator\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"opcmUpgrader\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractOPContractsManagerUpgrader\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"protocolVersions\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIProtocolVersions\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"superchainConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISuperchainConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updatePrestate\",\"inputs\":[{\"name\":\"_prestateUpdateInputs\",\"type\":\"tuple[]\",\"internalType\":\"structOPContractsManager.UpdatePrestateInput[]\",\"components\":[{\"name\":\"systemConfigProxy\",\"type\":\"address\",\"internalType\":\"contractISystemConfig\"},{\"name\":\"cannonPrestate\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"cannonKonaPrestate\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgrade\",\"inputs\":[{\"name\":\"_opChainConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structOPContractsManager.OpChainConfig[]\",\"components\":[{\"name\":\"systemConfigProxy\",\"type\":\"address\",\"internalType\":\"contractISystemConfig\"},{\"name\":\"cannonPrestate\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"cannonKonaPrestate\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeSuperchainConfig\",\"inputs\":[{\"name\":\"_superchainConfig\",\"type\":\"address\",\"internalType\":\"contractISuperchainConfig\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validate\",\"inputs\":[{\"name\":\"_input\",\"type\":\"tuple\",\"internalType\":\"structOPContractsManagerStandardValidator.ValidationInput\",\"components\":[{\"name\":\"sysCfg\",\"type\":\"address\",\"internalType\":\"contractISystemConfig\"},{\"name\":\"absolutePrestate\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"l2ChainID\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"_allowFailure\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validate\",\"inputs\":[{\"name\":\"_input\",\"type\":\"tuple\",\"internalType\":\"structOPContractsManagerStandardValidator.ValidationInputDev\",\"components\":[{\"name\":\"sysCfg\",\"type\":\"address\",\"internalType\":\"contractISystemConfig\"},{\"name\":\"cannonPrestate\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"cannonKonaPrestate\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"l2ChainID\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"_allowFailure\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validateWithOverrides\",\"inputs\":[{\"name\":\"_input\",\"type\":\"tuple\",\"internalType\":\"structOPContractsManagerStandardValidator.ValidationInput\",\"components\":[{\"name\":\"sysCfg\",\"type\":\"address\",\"internalType\":\"contractISystemConfig\"},{\"name\":\"absolutePrestate\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"l2ChainID\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"_allowFailure\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"_overrides\",\"type\":\"tuple\",\"internalType\":\"structOPContractsManagerStandardValidator.ValidationOverrides\",\"components\":[{\"name\":\"l1PAOMultisig\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"challenger\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validateWithOverrides\",\"inputs\":[{\"name\":\"_input\",\"type\":\"tuple\",\"internalType\":\"structOPContractsManagerStandardValidator.ValidationInputDev\",\"components\":[{\"name\":\"sysCfg\",\"type\":\"address\",\"internalType\":\"contractISystemConfig\"},{\"name\":\"cannonPrestate\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"cannonKonaPrestate\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"l2ChainID\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"_allowFailure\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"_overrides\",\"type\":\"tuple\",\"internalType\":\"structOPContractsManagerStandardValidator.ValidationOverrides\",\"components\":[{\"name\":\"l1PAOMultisig\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"challenger\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"error\",\"name\":\"AddressHasNoCode\",\"inputs\":[{\"name\":\"who\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressNotFound\",\"inputs\":[{\"name\":\"who\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AlreadyReleased\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidChainId\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDevFeatureAccess\",\"inputs\":[{\"name\":\"devFeature\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidGameConfigs\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoleAddress\",\"inputs\":[{\"name\":\"role\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"InvalidStartingAnchorRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LatestReleaseNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegatecall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PrestateNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PrestateRequired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SuperchainConfigMismatch\",\"inputs\":[{\"name\":\"systemConfig\",\"type\":\"address\",\"internalType\":\"contractISystemConfig\"}]},{\"type\":\"error\",\"name\":\"SuperchainProxyAdminMismatch\",\"inputs\":[]}]", + Bin: "0x6101806040523480156200001257600080fd5b5060405162002e0238038062002e02833981016040819052620000359162000306565b60405163b6a4cd2160e01b81526001600160a01b03838116600483015287169063b6a4cd219060240160006040518083038186803b1580156200007757600080fd5b505afa1580156200008c573d6000803e3d6000fd5b505060405163b6a4cd2160e01b81526001600160a01b0384811660048301528916925063b6a4cd21915060240160006040518083038186803b158015620000d257600080fd5b505afa158015620000e7573d6000803e3d6000fd5b505060405163b6a4cd2160e01b81526001600160a01b038a811660048301528916925063b6a4cd21915060240160006040518083038186803b1580156200012d57600080fd5b505afa15801562000142573d6000803e3d6000fd5b505060405163b6a4cd2160e01b81526001600160a01b03891660048201819052925063b6a4cd21915060240160006040518083038186803b1580156200018757600080fd5b505afa1580156200019c573d6000803e3d6000fd5b505060405163b6a4cd2160e01b81526001600160a01b0388811660048301528916925063b6a4cd21915060240160006040518083038186803b158015620001e257600080fd5b505afa158015620001f7573d6000803e3d6000fd5b505060405163b6a4cd2160e01b81526001600160a01b0387811660048301528916925063b6a4cd21915060240160006040518083038186803b1580156200023d57600080fd5b505afa15801562000252573d6000803e3d6000fd5b505060405163b6a4cd2160e01b81526001600160a01b0386811660048301528916925063b6a4cd21915060240160006040518083038186803b1580156200029857600080fd5b505afa158015620002ad573d6000803e3d6000fd5b5050506001600160a01b039788166080525094861660a05292851660c05290841660e05283166101005282166101205216610140523061016052620003b1565b6001600160a01b03811681146200030357600080fd5b50565b600080600080600080600060e0888a0312156200032257600080fd5b87516200032f81620002ed565b60208901519097506200034281620002ed565b60408901519096506200035581620002ed565b60608901519095506200036881620002ed565b60808901519094506200037b81620002ed565b60a08901519093506200038e81620002ed565b60c0890151909250620003a181620002ed565b8091505092959891949750929550565b60805160a05160c05160e0516101005161012051610140516101605161295f620004a3600039600081816108170152818161091701528181610c7b01528181610e400152610f3e0152600061034f0152600081816102600152610af20152600081816103d4015281816104890152818161078a01528181610c3801526110600152600081816101fb01526108e101526000818161019701528181610f0f0152611008015260008181610328015281816105130152818161062b015281816106de01528181610abb01528181610b920152610db50152600081816103fb015281816109e30152610d45015261295f6000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c8063613e827b116100e3578063b51f9c2b1161008c578063c993f27c11610066578063c993f27c1461041d578063cbeda5a714610430578063f3edcbe11461044357600080fd5b8063b51f9c2b146103ba578063ba7903db146103cf578063becbdf4a146103f657600080fd5b806378ecabce116100bd57806378ecabce146103715780638970ac4414610394578063b23cc044146103a757600080fd5b8063613e827b14610303578063622d56f1146103235780636624856a1461034a57600080fd5b8063318b1b801161014557806354fd4d501161011f57806354fd4d501461029557806358084273146102ce578063604aa628146102e357600080fd5b8063318b1b801461024857806335e80ab31461025b57806341fe53851461028257600080fd5b80631481a724116101765780631481a724146101f65780631d8a4e921461021d57806330e9012c1461023357600080fd5b806303dbe68c146101925780630e9d5cb9146101d6575b600080fd5b6101b97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6101e96101e436600461131b565b610456565b6040516101cd91906113be565b6101b97f000000000000000000000000000000000000000000000000000000000000000081565b61022561050f565b6040519081526020016101cd565b61023b610598565b6040516101cd91906113d1565b6101b9610256366004611539565b6106ac565b6101b97f000000000000000000000000000000000000000000000000000000000000000081565b6101e9610290366004611552565b610757565b60408051808201909152600581527f352e342e3000000000000000000000000000000000000000000000000000000060208201526101e9565b6102e16102dc36600461158a565b61080d565b005b6102f66102f136600461169d565b61090b565b6040516101cd9190611832565b61031661031136600461188e565b610a1e565b6040516101cd91906118ca565b6101b97f000000000000000000000000000000000000000000000000000000000000000081565b6101b97f000000000000000000000000000000000000000000000000000000000000000081565b61038461037f366004611539565b610b60565b60405190151581526020016101cd565b6101e96103a2366004611a8a565b610c05565b6102e16103b5366004611b6e565b610c71565b6103c2610d6a565b6040516101cd9190611bb7565b6101b97f000000000000000000000000000000000000000000000000000000000000000081565b6101b97f000000000000000000000000000000000000000000000000000000000000000081565b6102e161042b366004611c33565b610e36565b6102e161043e366004611b6e565b610f34565b6101e9610451366004611c50565b61102d565b6040517f0e9d5cb90000000000000000000000000000000000000000000000000000000081526060906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630e9d5cb9906104c290879087908790600401611c7d565b600060405180830381865afa1580156104df573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105079190810190611cdf565b949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631d8a4e926040518163ffffffff1660e01b8152600401602060405180830381865afa15801561056f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105939190611d56565b905090565b6040805161024081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081018290526102208101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166330e9012c6040518163ffffffff1660e01b815260040161024060405180830381865afa158015610688573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105939190611d7a565b6040517f318b1b80000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063318b1b8090602401602060405180830381865afa15801561072d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107519190611ed2565b92915050565b6040517f41fe53850000000000000000000000000000000000000000000000000000000081526060906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906341fe5385906107c19086908690600401611eef565b600060405180830381865afa1580156107de573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108069190810190611cdf565b9392505050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361086f576040517f0a57d61d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816040516024016108829190612001565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f580842730000000000000000000000000000000000000000000000000000000017905290506109067f000000000000000000000000000000000000000000000000000000000000000082611097565b505050565b60606001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361096f576040517f0a57d61d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260405160240161098291906120f4565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f604aa6280000000000000000000000000000000000000000000000000000000017905290506000610a087f000000000000000000000000000000000000000000000000000000000000000083611097565b9050808060200190518101906105079190612229565b604080516101e081018252600080825260208201819052818301819052606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a082018190526101c082015290517fb2e48a3f0000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b2e48a3f90610b1c9085907f0000000000000000000000000000000000000000000000000000000000000000903390600401612412565b6101e0604051808303816000875af1158015610b3c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075191906125c7565b6040517f78ecabce000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906378ecabce90602401602060405180830381865afa158015610be1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075191906126de565b6040517f8970ac440000000000000000000000000000000000000000000000000000000081526060906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690638970ac44906104c2908790879087906004016126fb565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610cd3576040517f0a57d61d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081604051602401610ce6919061276c565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb23cc0440000000000000000000000000000000000000000000000000000000017905290506109067f000000000000000000000000000000000000000000000000000000000000000082611097565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b51f9c2b6040518163ffffffff1660e01b815260040161012060405180830381865afa158015610e12573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059391906127d7565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610e98576040517f0a57d61d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b038216602482015260009060440160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc993f27c0000000000000000000000000000000000000000000000000000000017905290506109067f000000000000000000000000000000000000000000000000000000000000000082611097565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610f96576040517f0a57d61d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081604051602401610fa99190612882565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbeda5a70000000000000000000000000000000000000000000000000000000017905290506109067f000000000000000000000000000000000000000000000000000000000000000082611097565b6040517ff3edcbe10000000000000000000000000000000000000000000000000000000081526060906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063f3edcbe1906107c190869086906004016128e1565b6060600080846001600160a01b0316846040516110b49190612936565b600060405180830381855af49150503d80600081146110ef576040519150601f19603f3d011682016040523d82523d6000602084013e6110f4565b606091505b50915091508161050757805160208201fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561115857611158611106565b60405290565b604051610180810167ffffffffffffffff8111828210171561115857611158611106565b604051610240810167ffffffffffffffff8111828210171561115857611158611106565b6040516101e0810167ffffffffffffffff8111828210171561115857611158611106565b604051610120810167ffffffffffffffff8111828210171561115857611158611106565b604051601f8201601f1916810167ffffffffffffffff8111828210171561121757611217611106565b604052919050565b6001600160a01b038116811461123457600080fd5b50565b80356112428161121f565b919050565b60006080828403121561125957600080fd5b6040516080810181811067ffffffffffffffff8211171561127c5761127c611106565b604052905080823561128d8161121f565b80825250602083013560208201526040830135604082015260608301356112b38161121f565b6060919091015292915050565b801515811461123457600080fd5b8035611242816112c0565b6000604082840312156112eb57600080fd5b6112f3611135565b905081356113008161121f565b815260208201356113108161121f565b602082015292915050565b600080600060e0848603121561133057600080fd5b61133a8585611247565b9250608084013561134a816112c0565b91506113598560a086016112d9565b90509250925092565b60005b8381101561137d578181015183820152602001611365565b8381111561138c576000848401525b50505050565b600081518084526113aa816020860160208601611362565b601f01601f19169290920160200192915050565b6020815260006108066020830184611392565b81516001600160a01b03168152610240810160208301516113fd60208401826001600160a01b03169052565b50604083015161141860408401826001600160a01b03169052565b50606083015161143360608401826001600160a01b03169052565b50608083015161144e60808401826001600160a01b03169052565b5060a083015161146960a08401826001600160a01b03169052565b5060c083015161148460c08401826001600160a01b03169052565b5060e083015161149f60e08401826001600160a01b03169052565b50610100838101516001600160a01b0390811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501518216908401526101e080850151821690840152610200808501518216908401526102208085015191821681850152905b505092915050565b60006020828403121561154b57600080fd5b5035919050565b60008060a0838503121561156557600080fd5b61156f8484611247565b9150608083013561157f816112c0565b809150509250929050565b60006020828403121561159c57600080fd5b813567ffffffffffffffff8111156115b357600080fd5b8201610160818503121561080657600080fd5b600067ffffffffffffffff8211156115e0576115e0611106565b5060051b60200190565b600067ffffffffffffffff82111561160457611604611106565b50601f01601f191660200190565b600082601f83011261162357600080fd5b8135611636611631826115ea565b6111ee565b81815284602083860101111561164b57600080fd5b816020850160208301376000918101602001919091529392505050565b803563ffffffff8116811461124257600080fd5b67ffffffffffffffff8116811461123457600080fd5b80356112428161167c565b600060208083850312156116b057600080fd5b823567ffffffffffffffff808211156116c857600080fd5b818501915085601f8301126116dc57600080fd5b81356116ea611631826115c6565b81815260059190911b8301840190848101908883111561170957600080fd5b8585015b83811015611825578035858111156117255760008081fd5b8601610180818c03601f190181131561173e5760008081fd5b61174661115e565b89830135888111156117585760008081fd5b6117668e8c83870101611612565b8252506040611776818501611237565b8b8301526060611787818601611237565b828401526080915061179a828601611668565b818401525060a0808501358284015260c0915081850135818401525060e0808501358284015261010091506117d0828601611692565b908301526101206117e2858201611692565b828401526101409150818501358184015250610160611802818601611237565b828401526118118486016112ce565b90830152508552505091860191860161170d565b5098975050505050505050565b602080825282518282018190526000919060409081850190868401855b8281101561188157815180516001600160a01b039081168652908701511686850152928401929085019060010161184f565b5091979650505050505050565b6000602082840312156118a057600080fd5b813567ffffffffffffffff8111156118b757600080fd5b8201610240818503121561080657600080fd5b81516001600160a01b031681526101e0810160208301516118f660208401826001600160a01b03169052565b50604083015161191160408401826001600160a01b03169052565b50606083015161192c60608401826001600160a01b03169052565b50608083015161194760808401826001600160a01b03169052565b5060a083015161196260a08401826001600160a01b03169052565b5060c083015161197d60c08401826001600160a01b03169052565b5060e083015161199860e08401826001600160a01b03169052565b50610100838101516001600160a01b0390811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501519182168185015290611531565b600060a08284031215611a1957600080fd5b60405160a0810181811067ffffffffffffffff82111715611a3c57611a3c611106565b6040529050808235611a4d8161121f565b808252506020830135602082015260408301356040820152606083013560608201526080830135611a7d8161121f565b6080919091015292915050565b60008060006101008486031215611aa057600080fd5b611aaa8585611a07565b925060a0840135611aba816112c0565b91506113598560c086016112d9565b6000611ad7611631846115c6565b83815290506020808201906060808602850187811115611af657600080fd5b855b81811015611b625782818a031215611b105760008081fd5b6040805184810181811067ffffffffffffffff82111715611b3357611b33611106565b82528235611b408161121f565b8152828601358682015281830135918101919091528552938301938201611af8565b50505050509392505050565b600060208284031215611b8057600080fd5b813567ffffffffffffffff811115611b9757600080fd5b8201601f81018413611ba857600080fd5b61050784823560208401611ac9565b81516001600160a01b03908116825260208084015182169083015260408084015182169083015260608084015182169083015260808084015182169083015260a08084015182169083015260c08084015182169083015260e0808401518216908301526101008084015191821681840152610120830191611531565b600060208284031215611c4557600080fd5b81356108068161121f565b60008060c08385031215611c6357600080fd5b611c6d8484611a07565b915060a083013561157f816112c0565b60e08101611cb5828680516001600160a01b039081168352602080830151908401526040808301519084015260609182015116910152565b831515608083015282516001600160a01b0390811660a084015260208401511660c0830152610507565b600060208284031215611cf157600080fd5b815167ffffffffffffffff811115611d0857600080fd5b8201601f81018413611d1957600080fd5b8051611d27611631826115ea565b818152856020838501011115611d3c57600080fd5b611d4d826020830160208601611362565b95945050505050565b600060208284031215611d6857600080fd5b5051919050565b80516112428161121f565b60006102408284031215611d8d57600080fd5b611d95611182565b611d9e83611d6f565b8152611dac60208401611d6f565b6020820152611dbd60408401611d6f565b6040820152611dce60608401611d6f565b6060820152611ddf60808401611d6f565b6080820152611df060a08401611d6f565b60a0820152611e0160c08401611d6f565b60c0820152611e1260e08401611d6f565b60e0820152610100611e25818501611d6f565b90820152610120611e37848201611d6f565b90820152610140611e49848201611d6f565b90820152610160611e5b848201611d6f565b90820152610180611e6d848201611d6f565b908201526101a0611e7f848201611d6f565b908201526101c0611e91848201611d6f565b908201526101e0611ea3848201611d6f565b90820152610200611eb5848201611d6f565b90820152610220611ec7848201611d6f565b908201529392505050565b600060208284031215611ee457600080fd5b81516108068161121f565b60a08101611f27828580516001600160a01b039081168352602080830151908401526040808301519084015260609182015116910152565b82151560808301529392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611f6b57600080fd5b830160208101925035905067ffffffffffffffff811115611f8b57600080fd5b606081023603821315611f9d57600080fd5b9250929050565b8183526000602080850194508260005b85811015611ff6578135611fc78161121f565b6001600160a01b0316875281830135838801526040808301359088015260609687019690910190600101611fb4565b509495945050505050565b6020815260008235612012816112c0565b8015156020840152506020830135604083015260408301356060830152606083013561203d8161121f565b6001600160a01b0380821660808501526080850135915061205d8261121f565b80821660a0850152505060a083013560c083015260c083013560e083015261010060e0840135818401528084013590506120968161167c565b61012067ffffffffffffffff8216818501526120b3818601611692565b9150506101406120ce8185018367ffffffffffffffff169052565b6120da81860186611f36565b6101608681015292509050611d4d61018085018383611fa4565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561221b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08984030185528151610180815181865261216082870182611392565b9150508882015161217b8a8701826001600160a01b03169052565b50878201516001600160a01b03908116868a015260608084015163ffffffff16908701526080808401519087015260a0808401519087015260c0808401519087015260e08084015167ffffffffffffffff908116918801919091526101008085015190911690870152610120808401519087015261014080840151909116908601526101609182015115159190940152938601939086019060010161211b565b509098975050505050505050565b6000602080838503121561223c57600080fd5b825167ffffffffffffffff81111561225357600080fd5b8301601f8101851361226457600080fd5b8051612272611631826115c6565b81815260069190911b8201830190838101908783111561229157600080fd5b928401925b828410156122e757604084890312156122af5760008081fd5b6122b7611135565b84516122c28161121f565b8152848601516122d18161121f565b8187015282526040939093019290840190612296565b979650505050505050565b80356122fd8161121f565b6001600160a01b0390811683526020820135906123198261121f565b90811660208401526040820135906123308261121f565b90811660408401526060820135906123478261121f565b908116606084015260808201359061235e8261121f565b908116608084015260a0820135906123758261121f565b80821660a085015250505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126123b857600080fd5b830160208101925035905067ffffffffffffffff8111156123d857600080fd5b803603821315611f9d57600080fd5b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b6060815261242360608201856122f2565b600061243160c08601611668565b6101206124458185018363ffffffff169052565b61245160e08801611668565b91506101406124678186018463ffffffff169052565b61016092506101008801358386015261248282890189612383565b9250610240610180818189015261249e6102a0890186856123e7565b94506124ac848c018c612383565b945092506101a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa089870301818a01526124e78686866123e7565b95506124f4878d01611692565b96506101c09450612510858a018867ffffffffffffffff169052565b61251b828d01611668565b96506101e09350612533848a018863ffffffff169052565b6102009650808c0135878a01525050610220838b013581890152828b013582890152612560868c01611692565b67ffffffffffffffff81166102608a0152955061257e818c01611692565b95505050505061259b61028085018367ffffffffffffffff169052565b6001600160a01b038616602085015291506125b39050565b6001600160a01b0383166040830152610507565b60006101e082840312156125da57600080fd5b6125e26111a6565b6125eb83611d6f565b81526125f960208401611d6f565b602082015261260a60408401611d6f565b604082015261261b60608401611d6f565b606082015261262c60808401611d6f565b608082015261263d60a08401611d6f565b60a082015261264e60c08401611d6f565b60c082015261265f60e08401611d6f565b60e0820152610100612672818501611d6f565b90820152610120612684848201611d6f565b90820152610140612696848201611d6f565b908201526101606126a8848201611d6f565b908201526101806126ba848201611d6f565b908201526101a06126cc848201611d6f565b908201526101c0611ec7848201611d6f565b6000602082840312156126f057600080fd5b8151610806816112c0565b610100810161274282866001600160a01b03808251168352602082015160208401526040820151604084015260608201516060840152806080830151166080840152505050565b83151560a083015282516001600160a01b0390811660c084015260208401511660e0830152610507565b6020808252825182820181905260009190848201906040850190845b818110156127cb576127b883855180516001600160a01b0316825260208082015190830152604090810151910152565b9284019260609290920191600101612788565b50909695505050505050565b600061012082840312156127ea57600080fd5b6127f26111ca565b6127fb83611d6f565b815261280960208401611d6f565b602082015261281a60408401611d6f565b604082015261282b60608401611d6f565b606082015261283c60808401611d6f565b608082015261284d60a08401611d6f565b60a082015261285e60c08401611d6f565b60c082015261286f60e08401611d6f565b60e0820152610100611ec7818501611d6f565b6020808252825182820181905260009190848201906040850190845b818110156127cb576128ce83855180516001600160a01b0316825260208082015190830152604090810151910152565b928401926060929092019160010161289e565b60c0810161292782856001600160a01b03808251168352602082015160208401526040820151604084015260608201516060840152806080830151166080840152505050565b82151560a08301529392505050565b60008251612948818460208701611362565b919091019291505056fea164736f6c634300080f000a", } // OPContractsManagerABI is the input ABI used to generate the binding from. @@ -198,7 +209,7 @@ var OPContractsManagerABI = OPContractsManagerMetaData.ABI var OPContractsManagerBin = OPContractsManagerMetaData.Bin // DeployOPContractsManager deploys a new Ethereum contract, binding an instance of OPContractsManager to it. -func DeployOPContractsManager(auth *bind.TransactOpts, backend bind.ContractBackend, _opcmGameTypeAdder common.Address, _opcmDeployer common.Address, _opcmUpgrader common.Address, _opcmInteropMigrator common.Address, _opcmStandardValidator common.Address, _superchainConfig common.Address, _protocolVersions common.Address, _superchainProxyAdmin common.Address) (common.Address, *types.Transaction, *OPContractsManager, error) { +func DeployOPContractsManager(auth *bind.TransactOpts, backend bind.ContractBackend, _opcmGameTypeAdder common.Address, _opcmDeployer common.Address, _opcmUpgrader common.Address, _opcmInteropMigrator common.Address, _opcmStandardValidator common.Address, _superchainConfig common.Address, _protocolVersions common.Address) (common.Address, *types.Transaction, *OPContractsManager, error) { parsed, err := OPContractsManagerMetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err @@ -207,7 +218,7 @@ func DeployOPContractsManager(auth *bind.TransactOpts, backend bind.ContractBack return common.Address{}, nil, nil, errors.New("GetABI returned nil") } - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(OPContractsManagerBin), backend, _opcmGameTypeAdder, _opcmDeployer, _opcmUpgrader, _opcmInteropMigrator, _opcmStandardValidator, _superchainConfig, _protocolVersions, _superchainProxyAdmin) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(OPContractsManagerBin), backend, _opcmGameTypeAdder, _opcmDeployer, _opcmUpgrader, _opcmInteropMigrator, _opcmStandardValidator, _superchainConfig, _protocolVersions) if err != nil { return common.Address{}, nil, nil, err } @@ -358,7 +369,7 @@ func (_OPContractsManager *OPContractsManagerTransactorRaw) Transact(opts *bind. // Blueprints is a free data retrieval call binding the contract method 0xb51f9c2b. // -// Solidity: function blueprints() view returns((address,address,address,address,address,address,address,address,address,address,address,address,address)) +// Solidity: function blueprints() view returns((address,address,address,address,address,address,address,address,address)) func (_OPContractsManager *OPContractsManagerCaller) Blueprints(opts *bind.CallOpts) (OPContractsManagerBlueprints, error) { var out []interface{} err := _OPContractsManager.contract.Call(opts, &out, "blueprints") @@ -375,14 +386,14 @@ func (_OPContractsManager *OPContractsManagerCaller) Blueprints(opts *bind.CallO // Blueprints is a free data retrieval call binding the contract method 0xb51f9c2b. // -// Solidity: function blueprints() view returns((address,address,address,address,address,address,address,address,address,address,address,address,address)) +// Solidity: function blueprints() view returns((address,address,address,address,address,address,address,address,address)) func (_OPContractsManager *OPContractsManagerSession) Blueprints() (OPContractsManagerBlueprints, error) { return _OPContractsManager.Contract.Blueprints(&_OPContractsManager.CallOpts) } // Blueprints is a free data retrieval call binding the contract method 0xb51f9c2b. // -// Solidity: function blueprints() view returns((address,address,address,address,address,address,address,address,address,address,address,address,address)) +// Solidity: function blueprints() view returns((address,address,address,address,address,address,address,address,address)) func (_OPContractsManager *OPContractsManagerCallerSession) Blueprints() (OPContractsManagerBlueprints, error) { return _OPContractsManager.Contract.Blueprints(&_OPContractsManager.CallOpts) } @@ -451,7 +462,7 @@ func (_OPContractsManager *OPContractsManagerCallerSession) DevFeatureBitmap() ( // Implementations is a free data retrieval call binding the contract method 0x30e9012c. // -// Solidity: function implementations() view returns((address,address,address,address,address,address,address,address,address,address,address,address,address,address)) +// Solidity: function implementations() view returns((address,address,address,address,address,address,address,address,address,address,address,address,address,address,address,address,address,address)) func (_OPContractsManager *OPContractsManagerCaller) Implementations(opts *bind.CallOpts) (OPContractsManagerImplementations, error) { var out []interface{} err := _OPContractsManager.contract.Call(opts, &out, "implementations") @@ -468,14 +479,14 @@ func (_OPContractsManager *OPContractsManagerCaller) Implementations(opts *bind. // Implementations is a free data retrieval call binding the contract method 0x30e9012c. // -// Solidity: function implementations() view returns((address,address,address,address,address,address,address,address,address,address,address,address,address,address)) +// Solidity: function implementations() view returns((address,address,address,address,address,address,address,address,address,address,address,address,address,address,address,address,address,address)) func (_OPContractsManager *OPContractsManagerSession) Implementations() (OPContractsManagerImplementations, error) { return _OPContractsManager.Contract.Implementations(&_OPContractsManager.CallOpts) } // Implementations is a free data retrieval call binding the contract method 0x30e9012c. // -// Solidity: function implementations() view returns((address,address,address,address,address,address,address,address,address,address,address,address,address,address)) +// Solidity: function implementations() view returns((address,address,address,address,address,address,address,address,address,address,address,address,address,address,address,address,address,address)) func (_OPContractsManager *OPContractsManagerCallerSession) Implementations() (OPContractsManagerImplementations, error) { return _OPContractsManager.Contract.Implementations(&_OPContractsManager.CallOpts) } @@ -728,43 +739,43 @@ func (_OPContractsManager *OPContractsManagerCallerSession) SuperchainConfig() ( return _OPContractsManager.Contract.SuperchainConfig(&_OPContractsManager.CallOpts) } -// SuperchainProxyAdmin is a free data retrieval call binding the contract method 0x2b96b839. +// Validate is a free data retrieval call binding the contract method 0x41fe5385. // -// Solidity: function superchainProxyAdmin() view returns(address) -func (_OPContractsManager *OPContractsManagerCaller) SuperchainProxyAdmin(opts *bind.CallOpts) (common.Address, error) { +// Solidity: function validate((address,bytes32,uint256,address) _input, bool _allowFailure) view returns(string) +func (_OPContractsManager *OPContractsManagerCaller) Validate(opts *bind.CallOpts, _input OPContractsManagerStandardValidatorValidationInput, _allowFailure bool) (string, error) { var out []interface{} - err := _OPContractsManager.contract.Call(opts, &out, "superchainProxyAdmin") + err := _OPContractsManager.contract.Call(opts, &out, "validate", _input, _allowFailure) if err != nil { - return *new(common.Address), err + return *new(string), err } - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + out0 := *abi.ConvertType(out[0], new(string)).(*string) return out0, err } -// SuperchainProxyAdmin is a free data retrieval call binding the contract method 0x2b96b839. +// Validate is a free data retrieval call binding the contract method 0x41fe5385. // -// Solidity: function superchainProxyAdmin() view returns(address) -func (_OPContractsManager *OPContractsManagerSession) SuperchainProxyAdmin() (common.Address, error) { - return _OPContractsManager.Contract.SuperchainProxyAdmin(&_OPContractsManager.CallOpts) +// Solidity: function validate((address,bytes32,uint256,address) _input, bool _allowFailure) view returns(string) +func (_OPContractsManager *OPContractsManagerSession) Validate(_input OPContractsManagerStandardValidatorValidationInput, _allowFailure bool) (string, error) { + return _OPContractsManager.Contract.Validate(&_OPContractsManager.CallOpts, _input, _allowFailure) } -// SuperchainProxyAdmin is a free data retrieval call binding the contract method 0x2b96b839. +// Validate is a free data retrieval call binding the contract method 0x41fe5385. // -// Solidity: function superchainProxyAdmin() view returns(address) -func (_OPContractsManager *OPContractsManagerCallerSession) SuperchainProxyAdmin() (common.Address, error) { - return _OPContractsManager.Contract.SuperchainProxyAdmin(&_OPContractsManager.CallOpts) +// Solidity: function validate((address,bytes32,uint256,address) _input, bool _allowFailure) view returns(string) +func (_OPContractsManager *OPContractsManagerCallerSession) Validate(_input OPContractsManagerStandardValidatorValidationInput, _allowFailure bool) (string, error) { + return _OPContractsManager.Contract.Validate(&_OPContractsManager.CallOpts, _input, _allowFailure) } -// Validate is a free data retrieval call binding the contract method 0xa9008b69. +// Validate0 is a free data retrieval call binding the contract method 0xf3edcbe1. // -// Solidity: function validate((address,bytes32,uint256) _input, bool _allowFailure) view returns(string) -func (_OPContractsManager *OPContractsManagerCaller) Validate(opts *bind.CallOpts, _input OPContractsManagerStandardValidatorValidationInput, _allowFailure bool) (string, error) { +// Solidity: function validate((address,bytes32,bytes32,uint256,address) _input, bool _allowFailure) view returns(string) +func (_OPContractsManager *OPContractsManagerCaller) Validate0(opts *bind.CallOpts, _input OPContractsManagerStandardValidatorValidationInputDev, _allowFailure bool) (string, error) { var out []interface{} - err := _OPContractsManager.contract.Call(opts, &out, "validate", _input, _allowFailure) + err := _OPContractsManager.contract.Call(opts, &out, "validate0", _input, _allowFailure) if err != nil { return *new(string), err @@ -776,23 +787,23 @@ func (_OPContractsManager *OPContractsManagerCaller) Validate(opts *bind.CallOpt } -// Validate is a free data retrieval call binding the contract method 0xa9008b69. +// Validate0 is a free data retrieval call binding the contract method 0xf3edcbe1. // -// Solidity: function validate((address,bytes32,uint256) _input, bool _allowFailure) view returns(string) -func (_OPContractsManager *OPContractsManagerSession) Validate(_input OPContractsManagerStandardValidatorValidationInput, _allowFailure bool) (string, error) { - return _OPContractsManager.Contract.Validate(&_OPContractsManager.CallOpts, _input, _allowFailure) +// Solidity: function validate((address,bytes32,bytes32,uint256,address) _input, bool _allowFailure) view returns(string) +func (_OPContractsManager *OPContractsManagerSession) Validate0(_input OPContractsManagerStandardValidatorValidationInputDev, _allowFailure bool) (string, error) { + return _OPContractsManager.Contract.Validate0(&_OPContractsManager.CallOpts, _input, _allowFailure) } -// Validate is a free data retrieval call binding the contract method 0xa9008b69. +// Validate0 is a free data retrieval call binding the contract method 0xf3edcbe1. // -// Solidity: function validate((address,bytes32,uint256) _input, bool _allowFailure) view returns(string) -func (_OPContractsManager *OPContractsManagerCallerSession) Validate(_input OPContractsManagerStandardValidatorValidationInput, _allowFailure bool) (string, error) { - return _OPContractsManager.Contract.Validate(&_OPContractsManager.CallOpts, _input, _allowFailure) +// Solidity: function validate((address,bytes32,bytes32,uint256,address) _input, bool _allowFailure) view returns(string) +func (_OPContractsManager *OPContractsManagerCallerSession) Validate0(_input OPContractsManagerStandardValidatorValidationInputDev, _allowFailure bool) (string, error) { + return _OPContractsManager.Contract.Validate0(&_OPContractsManager.CallOpts, _input, _allowFailure) } -// ValidateWithOverrides is a free data retrieval call binding the contract method 0xb806c805. +// ValidateWithOverrides is a free data retrieval call binding the contract method 0x0e9d5cb9. // -// Solidity: function validateWithOverrides((address,bytes32,uint256) _input, bool _allowFailure, (address,address) _overrides) view returns(string) +// Solidity: function validateWithOverrides((address,bytes32,uint256,address) _input, bool _allowFailure, (address,address) _overrides) view returns(string) func (_OPContractsManager *OPContractsManagerCaller) ValidateWithOverrides(opts *bind.CallOpts, _input OPContractsManagerStandardValidatorValidationInput, _allowFailure bool, _overrides OPContractsManagerStandardValidatorValidationOverrides) (string, error) { var out []interface{} err := _OPContractsManager.contract.Call(opts, &out, "validateWithOverrides", _input, _allowFailure, _overrides) @@ -807,20 +818,51 @@ func (_OPContractsManager *OPContractsManagerCaller) ValidateWithOverrides(opts } -// ValidateWithOverrides is a free data retrieval call binding the contract method 0xb806c805. +// ValidateWithOverrides is a free data retrieval call binding the contract method 0x0e9d5cb9. // -// Solidity: function validateWithOverrides((address,bytes32,uint256) _input, bool _allowFailure, (address,address) _overrides) view returns(string) +// Solidity: function validateWithOverrides((address,bytes32,uint256,address) _input, bool _allowFailure, (address,address) _overrides) view returns(string) func (_OPContractsManager *OPContractsManagerSession) ValidateWithOverrides(_input OPContractsManagerStandardValidatorValidationInput, _allowFailure bool, _overrides OPContractsManagerStandardValidatorValidationOverrides) (string, error) { return _OPContractsManager.Contract.ValidateWithOverrides(&_OPContractsManager.CallOpts, _input, _allowFailure, _overrides) } -// ValidateWithOverrides is a free data retrieval call binding the contract method 0xb806c805. +// ValidateWithOverrides is a free data retrieval call binding the contract method 0x0e9d5cb9. // -// Solidity: function validateWithOverrides((address,bytes32,uint256) _input, bool _allowFailure, (address,address) _overrides) view returns(string) +// Solidity: function validateWithOverrides((address,bytes32,uint256,address) _input, bool _allowFailure, (address,address) _overrides) view returns(string) func (_OPContractsManager *OPContractsManagerCallerSession) ValidateWithOverrides(_input OPContractsManagerStandardValidatorValidationInput, _allowFailure bool, _overrides OPContractsManagerStandardValidatorValidationOverrides) (string, error) { return _OPContractsManager.Contract.ValidateWithOverrides(&_OPContractsManager.CallOpts, _input, _allowFailure, _overrides) } +// ValidateWithOverrides0 is a free data retrieval call binding the contract method 0x8970ac44. +// +// Solidity: function validateWithOverrides((address,bytes32,bytes32,uint256,address) _input, bool _allowFailure, (address,address) _overrides) view returns(string) +func (_OPContractsManager *OPContractsManagerCaller) ValidateWithOverrides0(opts *bind.CallOpts, _input OPContractsManagerStandardValidatorValidationInputDev, _allowFailure bool, _overrides OPContractsManagerStandardValidatorValidationOverrides) (string, error) { + var out []interface{} + err := _OPContractsManager.contract.Call(opts, &out, "validateWithOverrides0", _input, _allowFailure, _overrides) + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// ValidateWithOverrides0 is a free data retrieval call binding the contract method 0x8970ac44. +// +// Solidity: function validateWithOverrides((address,bytes32,bytes32,uint256,address) _input, bool _allowFailure, (address,address) _overrides) view returns(string) +func (_OPContractsManager *OPContractsManagerSession) ValidateWithOverrides0(_input OPContractsManagerStandardValidatorValidationInputDev, _allowFailure bool, _overrides OPContractsManagerStandardValidatorValidationOverrides) (string, error) { + return _OPContractsManager.Contract.ValidateWithOverrides0(&_OPContractsManager.CallOpts, _input, _allowFailure, _overrides) +} + +// ValidateWithOverrides0 is a free data retrieval call binding the contract method 0x8970ac44. +// +// Solidity: function validateWithOverrides((address,bytes32,bytes32,uint256,address) _input, bool _allowFailure, (address,address) _overrides) view returns(string) +func (_OPContractsManager *OPContractsManagerCallerSession) ValidateWithOverrides0(_input OPContractsManagerStandardValidatorValidationInputDev, _allowFailure bool, _overrides OPContractsManagerStandardValidatorValidationOverrides) (string, error) { + return _OPContractsManager.Contract.ValidateWithOverrides0(&_OPContractsManager.CallOpts, _input, _allowFailure, _overrides) +} + // Version is a free data retrieval call binding the contract method 0x54fd4d50. // // Solidity: function version() pure returns(string) @@ -894,23 +936,23 @@ func (_OPContractsManager *OPContractsManagerTransactorSession) Deploy(_input OP return _OPContractsManager.Contract.Deploy(&_OPContractsManager.TransactOpts, _input) } -// Migrate is a paid mutator transaction binding the contract method 0x6d510c5e. +// Migrate is a paid mutator transaction binding the contract method 0x58084273. // -// Solidity: function migrate((bool,(bytes32,uint256),(address,address,uint256,uint256,uint256,uint64,uint64),(address,bytes32)[]) _input) returns() +// Solidity: function migrate((bool,(bytes32,uint256),(address,address,uint256,uint256,uint256,uint64,uint64),(address,bytes32,bytes32)[]) _input) returns() func (_OPContractsManager *OPContractsManagerTransactor) Migrate(opts *bind.TransactOpts, _input OPContractsManagerInteropMigratorMigrateInput) (*types.Transaction, error) { return _OPContractsManager.contract.Transact(opts, "migrate", _input) } -// Migrate is a paid mutator transaction binding the contract method 0x6d510c5e. +// Migrate is a paid mutator transaction binding the contract method 0x58084273. // -// Solidity: function migrate((bool,(bytes32,uint256),(address,address,uint256,uint256,uint256,uint64,uint64),(address,bytes32)[]) _input) returns() +// Solidity: function migrate((bool,(bytes32,uint256),(address,address,uint256,uint256,uint256,uint64,uint64),(address,bytes32,bytes32)[]) _input) returns() func (_OPContractsManager *OPContractsManagerSession) Migrate(_input OPContractsManagerInteropMigratorMigrateInput) (*types.Transaction, error) { return _OPContractsManager.Contract.Migrate(&_OPContractsManager.TransactOpts, _input) } -// Migrate is a paid mutator transaction binding the contract method 0x6d510c5e. +// Migrate is a paid mutator transaction binding the contract method 0x58084273. // -// Solidity: function migrate((bool,(bytes32,uint256),(address,address,uint256,uint256,uint256,uint64,uint64),(address,bytes32)[]) _input) returns() +// Solidity: function migrate((bool,(bytes32,uint256),(address,address,uint256,uint256,uint256,uint64,uint64),(address,bytes32,bytes32)[]) _input) returns() func (_OPContractsManager *OPContractsManagerTransactorSession) Migrate(_input OPContractsManagerInteropMigratorMigrateInput) (*types.Transaction, error) { return _OPContractsManager.Contract.Migrate(&_OPContractsManager.TransactOpts, _input) } @@ -936,44 +978,44 @@ func (_OPContractsManager *OPContractsManagerTransactorSession) UpdatePrestate(_ return _OPContractsManager.Contract.UpdatePrestate(&_OPContractsManager.TransactOpts, _prestateUpdateInputs) } -// Upgrade is a paid mutator transaction binding the contract method 0x0b8bd7cb. +// Upgrade is a paid mutator transaction binding the contract method 0xcbeda5a7. // -// Solidity: function upgrade((address,bytes32)[] _opChainConfigs) returns() +// Solidity: function upgrade((address,bytes32,bytes32)[] _opChainConfigs) returns() func (_OPContractsManager *OPContractsManagerTransactor) Upgrade(opts *bind.TransactOpts, _opChainConfigs []OPContractsManagerOpChainConfig) (*types.Transaction, error) { return _OPContractsManager.contract.Transact(opts, "upgrade", _opChainConfigs) } -// Upgrade is a paid mutator transaction binding the contract method 0x0b8bd7cb. +// Upgrade is a paid mutator transaction binding the contract method 0xcbeda5a7. // -// Solidity: function upgrade((address,bytes32)[] _opChainConfigs) returns() +// Solidity: function upgrade((address,bytes32,bytes32)[] _opChainConfigs) returns() func (_OPContractsManager *OPContractsManagerSession) Upgrade(_opChainConfigs []OPContractsManagerOpChainConfig) (*types.Transaction, error) { return _OPContractsManager.Contract.Upgrade(&_OPContractsManager.TransactOpts, _opChainConfigs) } -// Upgrade is a paid mutator transaction binding the contract method 0x0b8bd7cb. +// Upgrade is a paid mutator transaction binding the contract method 0xcbeda5a7. // -// Solidity: function upgrade((address,bytes32)[] _opChainConfigs) returns() +// Solidity: function upgrade((address,bytes32,bytes32)[] _opChainConfigs) returns() func (_OPContractsManager *OPContractsManagerTransactorSession) Upgrade(_opChainConfigs []OPContractsManagerOpChainConfig) (*types.Transaction, error) { return _OPContractsManager.Contract.Upgrade(&_OPContractsManager.TransactOpts, _opChainConfigs) } -// UpgradeSuperchainConfig is a paid mutator transaction binding the contract method 0xb0b807eb. +// UpgradeSuperchainConfig is a paid mutator transaction binding the contract method 0xc993f27c. // -// Solidity: function upgradeSuperchainConfig(address _superchainConfig, address _superchainProxyAdmin) returns() -func (_OPContractsManager *OPContractsManagerTransactor) UpgradeSuperchainConfig(opts *bind.TransactOpts, _superchainConfig common.Address, _superchainProxyAdmin common.Address) (*types.Transaction, error) { - return _OPContractsManager.contract.Transact(opts, "upgradeSuperchainConfig", _superchainConfig, _superchainProxyAdmin) +// Solidity: function upgradeSuperchainConfig(address _superchainConfig) returns() +func (_OPContractsManager *OPContractsManagerTransactor) UpgradeSuperchainConfig(opts *bind.TransactOpts, _superchainConfig common.Address) (*types.Transaction, error) { + return _OPContractsManager.contract.Transact(opts, "upgradeSuperchainConfig", _superchainConfig) } -// UpgradeSuperchainConfig is a paid mutator transaction binding the contract method 0xb0b807eb. +// UpgradeSuperchainConfig is a paid mutator transaction binding the contract method 0xc993f27c. // -// Solidity: function upgradeSuperchainConfig(address _superchainConfig, address _superchainProxyAdmin) returns() -func (_OPContractsManager *OPContractsManagerSession) UpgradeSuperchainConfig(_superchainConfig common.Address, _superchainProxyAdmin common.Address) (*types.Transaction, error) { - return _OPContractsManager.Contract.UpgradeSuperchainConfig(&_OPContractsManager.TransactOpts, _superchainConfig, _superchainProxyAdmin) +// Solidity: function upgradeSuperchainConfig(address _superchainConfig) returns() +func (_OPContractsManager *OPContractsManagerSession) UpgradeSuperchainConfig(_superchainConfig common.Address) (*types.Transaction, error) { + return _OPContractsManager.Contract.UpgradeSuperchainConfig(&_OPContractsManager.TransactOpts, _superchainConfig) } -// UpgradeSuperchainConfig is a paid mutator transaction binding the contract method 0xb0b807eb. +// UpgradeSuperchainConfig is a paid mutator transaction binding the contract method 0xc993f27c. // -// Solidity: function upgradeSuperchainConfig(address _superchainConfig, address _superchainProxyAdmin) returns() -func (_OPContractsManager *OPContractsManagerTransactorSession) UpgradeSuperchainConfig(_superchainConfig common.Address, _superchainProxyAdmin common.Address) (*types.Transaction, error) { - return _OPContractsManager.Contract.UpgradeSuperchainConfig(&_OPContractsManager.TransactOpts, _superchainConfig, _superchainProxyAdmin) +// Solidity: function upgradeSuperchainConfig(address _superchainConfig) returns() +func (_OPContractsManager *OPContractsManagerTransactorSession) UpgradeSuperchainConfig(_superchainConfig common.Address) (*types.Transaction, error) { + return _OPContractsManager.Contract.UpgradeSuperchainConfig(&_OPContractsManager.TransactOpts, _superchainConfig) } diff --git a/packages/contracts-bedrock/interfaces/L1/IOPContractsManager.sol b/packages/contracts-bedrock/interfaces/L1/IOPContractsManager.sol index fa463cea67c14..46d6db683dc7c 100644 --- a/packages/contracts-bedrock/interfaces/L1/IOPContractsManager.sol +++ b/packages/contracts-bedrock/interfaces/L1/IOPContractsManager.sol @@ -221,7 +221,8 @@ interface IOPContractsManager { /// @notice The input required to identify a chain for upgrading. struct OpChainConfig { ISystemConfig systemConfigProxy; - Claim absolutePrestate; + Claim cannonPrestate; + Claim cannonKonaPrestate; } /// @notice The input required to identify a chain for updating prestates diff --git a/packages/contracts-bedrock/scripts/deploy/GenerateOPCMMigrateCalldata.sol b/packages/contracts-bedrock/scripts/deploy/GenerateOPCMMigrateCalldata.sol index fa1d356ee9f0a..86a3a00d270b7 100644 --- a/packages/contracts-bedrock/scripts/deploy/GenerateOPCMMigrateCalldata.sol +++ b/packages/contracts-bedrock/scripts/deploy/GenerateOPCMMigrateCalldata.sol @@ -19,7 +19,7 @@ import { stdJson } from "forge-std/StdJson.sol"; /// directory located at foundry root. /// Config example: /// { -/// "absolutePrestate": "0x1234567890abcdef1234567890abcdef12345678", +/// "cannonPrestate": "0x1234567890abcdef1234567890abcdef12345678", /// "usePermissionlessGame": true, /// "startingAnchorRoot": { /// "root": "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd", @@ -44,7 +44,7 @@ import { stdJson } from "forge-std/StdJson.sol"; /// ] /// } contract GenerateOPCMMigrateCalldata is Script { - bytes32 absolutePrestate; + bytes32 cannonPrestate; bool usePermissionlessGame; Proposal startingAnchorRoot; address proposer; @@ -71,8 +71,8 @@ contract GenerateOPCMMigrateCalldata is Script { require(false, "GenerateOPCMMigrateCalldata: Failed to read config file"); } - absolutePrestate = stdJson.readBytes32(json, "$.absolutePrestate"); - require(absolutePrestate != bytes32(0), "GenerateOPCMMigrateCalldata: absolutePrestate cannot be 0"); + cannonPrestate = stdJson.readBytes32(json, "$.cannonPrestate"); + require(cannonPrestate != bytes32(0), "GenerateOPCMMigrateCalldata: cannonPrestate cannot be 0"); usePermissionlessGame = stdJson.readBool(json, "$.usePermissionlessGame"); startingAnchorRoot = Proposal({ @@ -120,7 +120,9 @@ contract GenerateOPCMMigrateCalldata is Script { for (uint256 i = 0; i < j.length; i++) { opChainConfigs[i] = IOPContractsManager.OpChainConfig({ systemConfigProxy: ISystemConfig(j[i].systemConfigProxy), - absolutePrestate: Claim.wrap(absolutePrestate) + cannonPrestate: Claim.wrap(cannonPrestate), + // TODO(#17743): cannon-kona for opcm.migrate + cannonKonaPrestate: Claim.wrap(bytes32(0)) }); require( opChainConfigs[i].systemConfigProxy != ISystemConfig(address(0)), diff --git a/packages/contracts-bedrock/snapshots/abi/OPContractsManager.json b/packages/contracts-bedrock/snapshots/abi/OPContractsManager.json index fb4b911ceb72f..ed428d40a1d6d 100644 --- a/packages/contracts-bedrock/snapshots/abi/OPContractsManager.json +++ b/packages/contracts-bedrock/snapshots/abi/OPContractsManager.json @@ -621,7 +621,12 @@ }, { "internalType": "Claim", - "name": "absolutePrestate", + "name": "cannonPrestate", + "type": "bytes32" + }, + { + "internalType": "Claim", + "name": "cannonKonaPrestate", "type": "bytes32" } ], @@ -772,7 +777,12 @@ }, { "internalType": "Claim", - "name": "absolutePrestate", + "name": "cannonPrestate", + "type": "bytes32" + }, + { + "internalType": "Claim", + "name": "cannonKonaPrestate", "type": "bytes32" } ], diff --git a/packages/contracts-bedrock/snapshots/abi/OPContractsManagerInteropMigrator.json b/packages/contracts-bedrock/snapshots/abi/OPContractsManagerInteropMigrator.json index ba80999f0628d..e50b7a602eed6 100644 --- a/packages/contracts-bedrock/snapshots/abi/OPContractsManagerInteropMigrator.json +++ b/packages/contracts-bedrock/snapshots/abi/OPContractsManagerInteropMigrator.json @@ -329,7 +329,12 @@ }, { "internalType": "Claim", - "name": "absolutePrestate", + "name": "cannonPrestate", + "type": "bytes32" + }, + { + "internalType": "Claim", + "name": "cannonKonaPrestate", "type": "bytes32" } ], diff --git a/packages/contracts-bedrock/snapshots/abi/OPContractsManagerUpgrader.json b/packages/contracts-bedrock/snapshots/abi/OPContractsManagerUpgrader.json index 0db8ae8f03793..2df9bcd824ae2 100644 --- a/packages/contracts-bedrock/snapshots/abi/OPContractsManagerUpgrader.json +++ b/packages/contracts-bedrock/snapshots/abi/OPContractsManagerUpgrader.json @@ -263,7 +263,12 @@ }, { "internalType": "Claim", - "name": "absolutePrestate", + "name": "cannonPrestate", + "type": "bytes32" + }, + { + "internalType": "Claim", + "name": "cannonKonaPrestate", "type": "bytes32" } ], diff --git a/packages/contracts-bedrock/snapshots/semver-lock.json b/packages/contracts-bedrock/snapshots/semver-lock.json index 0ad3d66132443..00159c8490830 100644 --- a/packages/contracts-bedrock/snapshots/semver-lock.json +++ b/packages/contracts-bedrock/snapshots/semver-lock.json @@ -20,8 +20,8 @@ "sourceCodeHash": "0xfca613b5d055ffc4c3cbccb0773ddb9030abedc1aa6508c9e2e7727cc0cd617b" }, "src/L1/OPContractsManager.sol:OPContractsManager": { - "initCodeHash": "0xe264ff78622d5baea636012c17562a4f105182626c3a3841cc65912cb20dff9f", - "sourceCodeHash": "0x7e4a03b442d7b9bcd43cedabc15f98740345fb3d3224cbba3b4eedc6f2fcc65d" + "initCodeHash": "0x659729d1df8a1d04fa09f8aacbd83d63511af4b41ca92f334b324dc97833839b", + "sourceCodeHash": "0x47d94eda9ea1a238d770f9a51ea3648ccd279f5b567d50844d62dddb1b910a1c" }, "src/L1/OPContractsManagerStandardValidator.sol:OPContractsManagerStandardValidator": { "initCodeHash": "0x0c8b15453d0f0bc5d9af07f104505e0bbb2b358f0df418289822fb73a8652b30", diff --git a/packages/contracts-bedrock/src/L1/OPContractsManager.sol b/packages/contracts-bedrock/src/L1/OPContractsManager.sol index 6afcd986a6f5c..e5ef8b0cf4cf3 100644 --- a/packages/contracts-bedrock/src/L1/OPContractsManager.sol +++ b/packages/contracts-bedrock/src/L1/OPContractsManager.sol @@ -1030,7 +1030,7 @@ contract OPContractsManagerUpgrader is OPContractsManagerBase { }); } } else { - setNewGameImplV2({ + setNewPermissionedGameImplV2({ _impls: _impls, _l2ChainId: _l2ChainId, _disputeGame: permissionedDisputeGame, @@ -1038,7 +1038,6 @@ contract OPContractsManagerUpgrader is OPContractsManagerBase { _newAnchorStateRegistryProxy: getAnchorStateRegistry( dgf, permissionedDisputeGame, GameTypes.PERMISSIONED_CANNON ), - _gameType: GameTypes.PERMISSIONED_CANNON, _opChainConfig: _opChainConfig }); @@ -1047,15 +1046,38 @@ contract OPContractsManagerUpgrader is OPContractsManagerBase { // If it exists, replace its implementation. // We're reusing the same DelayedWETH and ASR contracts. if (address(permissionlessDisputeGame) != address(0)) { - setNewGameImplV2({ + IDisputeGameFactory disputeGameFactory = + IDisputeGameFactory(_opChainConfig.systemConfigProxy.disputeGameFactory()); + Claim cannonPrestate = _opChainConfig.cannonPrestate.raw() != bytes32(0) + ? _opChainConfig.cannonPrestate + : getAbsolutePrestate(disputeGameFactory, address(permissionlessDisputeGame), GameTypes.CANNON); + setNewPermissionlessGameImplV2({ _impls: _impls, _l2ChainId: _l2ChainId, - _disputeGame: permissionlessDisputeGame, + _newAbsolutePrestate: cannonPrestate, _newDelayedWeth: getWETH(dgf, permissionlessDisputeGame, GameTypes.CANNON), _newAnchorStateRegistryProxy: getAnchorStateRegistry(dgf, permissionlessDisputeGame, GameTypes.CANNON), _gameType: GameTypes.CANNON, - _opChainConfig: _opChainConfig + _disputeGameFactory: disputeGameFactory }); + + if ( + isDevFeatureEnabled(DevFeatures.CANNON_KONA) + && _opChainConfig.cannonKonaPrestate.raw() != bytes32(0) + ) { + setNewPermissionlessGameImplV2({ + _impls: _impls, + _l2ChainId: _l2ChainId, + _newAbsolutePrestate: _opChainConfig.cannonKonaPrestate, + // CANNON and CANNON_KONA use the same weth and asr proxy addresses + _newDelayedWeth: getWETH(dgf, permissionlessDisputeGame, GameTypes.CANNON), + _newAnchorStateRegistryProxy: getAnchorStateRegistry( + dgf, permissionlessDisputeGame, GameTypes.CANNON + ), + _gameType: GameTypes.CANNON_KONA, + _disputeGameFactory: disputeGameFactory + }); + } } } } @@ -1127,8 +1149,8 @@ contract OPContractsManagerUpgrader is OPContractsManagerBase { // If the prestate is set in the config, use it. If not set, we'll try to use the prestate // that already exists on the current dispute game. - if (Claim.unwrap(_opChainConfig.absolutePrestate) != bytes32(0)) { - params.absolutePrestate = _opChainConfig.absolutePrestate; + if (Claim.unwrap(_opChainConfig.cannonPrestate) != bytes32(0)) { + params.absolutePrestate = _opChainConfig.cannonPrestate; } // As a sanity check, if the prestate is zero here, revert. @@ -1170,21 +1192,19 @@ contract OPContractsManagerUpgrader is OPContractsManagerBase { setDGFImplementation(dgf, _gameType, IDisputeGame(newGame)); } - /// @notice Sets the latest dispute game v2 implementations + /// @notice Sets the latest permissioned dispute game v2 implementation /// @param _impls The container for the new dispute game implementations. /// @param _l2ChainId The L2 chain ID /// @param _disputeGame The current dispute game implementation in the dispute game factory /// @param _newDelayedWeth The new delayed WETH implementation /// @param _newAnchorStateRegistryProxy The new anchor state registry proxy - /// @param _gameType The type of game to deploy /// @param _opChainConfig The OP chain configuration - function setNewGameImplV2( + function setNewPermissionedGameImplV2( OPContractsManager.Implementations memory _impls, uint256 _l2ChainId, IDisputeGame _disputeGame, IDelayedWETH _newDelayedWeth, IAnchorStateRegistry _newAnchorStateRegistryProxy, - GameType _gameType, OPContractsManager.OpChainConfig memory _opChainConfig ) internal @@ -1194,10 +1214,11 @@ contract OPContractsManagerUpgrader is OPContractsManagerBase { // If the prestate is set in the config, use it. If not set, we'll try to use the prestate // that already exists on the current dispute game. Claim absolutePrestate; - if (Claim.unwrap(_opChainConfig.absolutePrestate) == bytes32(0)) { - absolutePrestate = getAbsolutePrestate(disputeGameFactory, address(_disputeGame), _gameType); + if (Claim.unwrap(_opChainConfig.cannonPrestate) == bytes32(0)) { + absolutePrestate = + getAbsolutePrestate(disputeGameFactory, address(_disputeGame), GameTypes.PERMISSIONED_CANNON); } else { - absolutePrestate = _opChainConfig.absolutePrestate; + absolutePrestate = _opChainConfig.cannonPrestate; } // As a sanity check, if the prestate is zero here, revert. @@ -1205,35 +1226,62 @@ contract OPContractsManagerUpgrader is OPContractsManagerBase { revert OPContractsManager.PrestateNotSet(); } - IDisputeGame newGame; - bytes memory gameArgs; - if (GameType.unwrap(_gameType) == GameType.unwrap(GameTypes.PERMISSIONED_CANNON)) { - newGame = IDisputeGame(_impls.permissionedDisputeGameV2Impl); - address proposer = - getProposer(disputeGameFactory, IPermissionedDisputeGame(address(_disputeGame)), _gameType); - address challenger = - getChallenger(disputeGameFactory, IPermissionedDisputeGame(address(_disputeGame)), _gameType); - gameArgs = abi.encodePacked( - absolutePrestate, // 32 bytes - _impls.mipsImpl, // 20 bytes - address(_newAnchorStateRegistryProxy), // 20 bytes - address(_newDelayedWeth), // 20 bytes - _l2ChainId, // 32 bytes - proposer, // 20 bytes - challenger // 20 bytes - ); - } else { - newGame = IDisputeGame(_impls.faultDisputeGameV2Impl); - gameArgs = abi.encodePacked( - absolutePrestate, // 32 bytes - _impls.mipsImpl, // 20 bytes - address(_newAnchorStateRegistryProxy), // 20 bytes - address(_newDelayedWeth), // 20 bytes - _l2ChainId // 32 bytes - ); + IDisputeGame newGame = IDisputeGame(_impls.permissionedDisputeGameV2Impl); + bytes memory gameArgs = LibGameArgs.encode( + LibGameArgs.GameArgs({ + absolutePrestate: absolutePrestate.raw(), + vm: address(_impls.mipsImpl), + anchorStateRegistry: address(_newAnchorStateRegistryProxy), + weth: address(_newDelayedWeth), + l2ChainId: _l2ChainId, + proposer: getProposer( + disputeGameFactory, IPermissionedDisputeGame(address(_disputeGame)), GameTypes.PERMISSIONED_CANNON + ), + challenger: getChallenger( + disputeGameFactory, IPermissionedDisputeGame(address(_disputeGame)), GameTypes.PERMISSIONED_CANNON + ) + }) + ); + + setDGFImplementation(disputeGameFactory, GameTypes.PERMISSIONED_CANNON, IDisputeGame(newGame), gameArgs); + } + + /// @notice Sets the latest permissionless dispute game v2 implementations + /// @param _impls The container for the new dispute game implementations. + /// @param _l2ChainId The L2 chain ID + /// @param _newAbsolutePrestate The new absolute prestate for the dispute game + /// @param _newDelayedWeth The new delayed WETH implementation + /// @param _newAnchorStateRegistryProxy The new anchor state registry proxy + /// @param _disputeGameFactory The dispute game factory proxy + function setNewPermissionlessGameImplV2( + OPContractsManager.Implementations memory _impls, + uint256 _l2ChainId, + Claim _newAbsolutePrestate, + IDelayedWETH _newDelayedWeth, + IAnchorStateRegistry _newAnchorStateRegistryProxy, + GameType _gameType, + IDisputeGameFactory _disputeGameFactory + ) + internal + { + // As a sanity check, if the prestate is zero here, revert. + if (_newAbsolutePrestate.raw() == bytes32(0)) { + revert OPContractsManager.PrestateNotSet(); } - setDGFImplementation(disputeGameFactory, _gameType, IDisputeGame(newGame), gameArgs); + IDisputeGame newGame = IDisputeGame(_impls.faultDisputeGameV2Impl); + bytes memory gameArgs = LibGameArgs.encode( + LibGameArgs.GameArgs({ + absolutePrestate: _newAbsolutePrestate.raw(), + vm: address(_impls.mipsImpl), + anchorStateRegistry: address(_newAnchorStateRegistryProxy), + weth: address(_newDelayedWeth), + l2ChainId: _l2ChainId, + proposer: address(0), + challenger: address(0) + }) + ); + setDGFImplementation(_disputeGameFactory, _gameType, IDisputeGame(newGame), gameArgs); } /// @notice Retrieves the absolute prestate for a dispute game, handling both V1 and V2 games. @@ -1770,7 +1818,7 @@ contract OPContractsManagerInteropMigrator is OPContractsManagerBase { if (_input.opChainConfigs[i].systemConfigProxy.proxyAdmin().owner() != proxyAdmin.owner()) { revert OPContractsManagerInteropMigrator_ProxyAdminOwnerMismatch(); } - if (_input.opChainConfigs[i].absolutePrestate.raw() != _input.opChainConfigs[0].absolutePrestate.raw()) { + if (_input.opChainConfigs[i].cannonPrestate.raw() != _input.opChainConfigs[0].cannonPrestate.raw()) { revert OPContractsManagerInteropMigrator_AbsolutePrestateMismatch(); } } @@ -1929,7 +1977,7 @@ contract OPContractsManagerInteropMigrator is OPContractsManagerBase { // chains, the contracts enforce that the chain id is zero. bytes memory gameArgs = LibGameArgs.encode( LibGameArgs.GameArgs({ - absolutePrestate: _input.opChainConfigs[0].absolutePrestate.raw(), + absolutePrestate: _input.opChainConfigs[0].cannonPrestate.raw(), vm: address(getImplementations().mipsImpl), anchorStateRegistry: address(newAnchorStateRegistry), weth: address(newPermissionedDelayedWETHProxy), @@ -1972,7 +2020,7 @@ contract OPContractsManagerInteropMigrator is OPContractsManagerBase { // Register the new SuperFaultDisputeGame. bytes memory gameArgs = LibGameArgs.encode( LibGameArgs.GameArgs({ - absolutePrestate: _input.opChainConfigs[0].absolutePrestate.raw(), + absolutePrestate: _input.opChainConfigs[0].cannonPrestate.raw(), vm: address(getImplementations().mipsImpl), anchorStateRegistry: address(newAnchorStateRegistry), weth: address(newPermissionlessDelayedWETHProxy), @@ -2084,7 +2132,8 @@ contract OPContractsManager is ISemver { /// @notice The input required to identify a chain for upgrading, along with new prestate hashes struct OpChainConfig { ISystemConfig systemConfigProxy; - Claim absolutePrestate; + Claim cannonPrestate; + Claim cannonKonaPrestate; } /// @notice The input required to identify a chain for updating prestates @@ -2116,9 +2165,9 @@ contract OPContractsManager is ISemver { // -------- Constants and Variables -------- - /// @custom:semver 5.3.0 + /// @custom:semver 5.4.0 function version() public pure virtual returns (string memory) { - return "5.3.0"; + return "5.4.0"; } OPContractsManagerGameTypeAdder public immutable opcmGameTypeAdder; diff --git a/packages/contracts-bedrock/src/libraries/DevFeatures.sol b/packages/contracts-bedrock/src/libraries/DevFeatures.sol index 5c7b4cdb02def..5b7f8bd3cca69 100644 --- a/packages/contracts-bedrock/src/libraries/DevFeatures.sol +++ b/packages/contracts-bedrock/src/libraries/DevFeatures.sol @@ -14,6 +14,8 @@ library DevFeatures { bytes32 public constant OPTIMISM_PORTAL_INTEROP = bytes32(0x0000000000000000000000000000000000000000000000000000000000000001); + /// @notice The feature that enables deployment of the CANNON_KONA fault dispute game. + /// This feature depends on the DEPLOY_V2_DISPUTE_GAMES feature bytes32 public constant CANNON_KONA = bytes32(0x0000000000000000000000000000000000000000000000000000000000000010); /// @notice The feature that enables deployment of V2 dispute game contracts. diff --git a/packages/contracts-bedrock/test/L1/OPContractsManager.t.sol b/packages/contracts-bedrock/test/L1/OPContractsManager.t.sol index f0ace8473ef08..fcc975e2484fe 100644 --- a/packages/contracts-bedrock/test/L1/OPContractsManager.t.sol +++ b/packages/contracts-bedrock/test/L1/OPContractsManager.t.sol @@ -124,7 +124,8 @@ contract OPContractsManager_Upgrade_Harness is CommonTest, DisputeGames { uint256 l2ChainId; address upgrader; IOPContractsManager.OpChainConfig[] opChainConfigs; - Claim absolutePrestate; + Claim cannonPrestate; + Claim cannonKonaPrestate; string public opChain = Config.forkOpChain(); PreUpgradeState preUpgradeState; @@ -140,7 +141,8 @@ contract OPContractsManager_Upgrade_Harness is CommonTest, DisputeGames { "OPContractsManager_Upgrade_Harness: cannot test upgrade on superchain ops repo upgrade tests" ); - absolutePrestate = Claim.wrap(bytes32(keccak256("absolutePrestate"))); + cannonPrestate = Claim.wrap(bytes32(keccak256("cannonPrestate"))); + cannonKonaPrestate = Claim.wrap(bytes32(keccak256("cannonKonaPrestate"))); upgrader = proxyAdmin.owner(); vm.label(upgrader, "ProxyAdmin Owner"); @@ -148,7 +150,11 @@ contract OPContractsManager_Upgrade_Harness is CommonTest, DisputeGames { vm.etch(upgrader, vm.getDeployedCode("test/mocks/Callers.sol:DelegateCaller")); opChainConfigs.push( - IOPContractsManager.OpChainConfig({ systemConfigProxy: systemConfig, absolutePrestate: absolutePrestate }) + IOPContractsManager.OpChainConfig({ + systemConfigProxy: systemConfig, + cannonPrestate: cannonPrestate, + cannonKonaPrestate: cannonKonaPrestate + }) ); // Retrieve the l2ChainId, which was read from the superchain-registry, and saved in @@ -286,24 +292,49 @@ contract OPContractsManager_Upgrade_Harness is CommonTest, DisputeGames { // the prestate from the actual contracts, but that doesn't actually give us any valuable // checks. Easier to just expect the error in this case. // We add the prefix of OVERRIDES-L1PAOMULTISIG,OVERRIDES-CHALLENGER because we use validationOverrides. - if (opChainConfigs[0].absolutePrestate.raw() == bytes32(0)) { - vm.expectRevert( - "OPContractsManagerStandardValidator: OVERRIDES-L1PAOMULTISIG,OVERRIDES-CHALLENGER,PDDG-40,PLDG-40" - ); + if (opChainConfigs[0].cannonPrestate.raw() == bytes32(0)) { + if ( + opChainConfigs[0].cannonKonaPrestate.raw() == bytes32(0) && isDevFeatureEnabled(DevFeatures.CANNON_KONA) + ) { + vm.expectRevert( + "OPContractsManagerStandardValidator: OVERRIDES-L1PAOMULTISIG,OVERRIDES-CHALLENGER,PDDG-40,PLDG-40,CKDG-10" + ); + } else { + vm.expectRevert( + "OPContractsManagerStandardValidator: OVERRIDES-L1PAOMULTISIG,OVERRIDES-CHALLENGER,PDDG-40,PLDG-40" + ); + } + } else if ( + opChainConfigs[0].cannonKonaPrestate.raw() == bytes32(0) && isDevFeatureEnabled(DevFeatures.CANNON_KONA) + ) { + vm.expectRevert("OPContractsManagerStandardValidator: OVERRIDES-L1PAOMULTISIG,OVERRIDES-CHALLENGER,CKDG-10"); } // Run the StandardValidator checks. - validator.validateWithOverrides( - IOPContractsManagerStandardValidator.ValidationInput({ - sysCfg: opChainConfigs[0].systemConfigProxy, - absolutePrestate: opChainConfigs[0].absolutePrestate.raw(), - l2ChainID: l2ChainId, - proposer: initialProposer - }), - false, - validationOverrides - ); - + if (isDevFeatureEnabled(DevFeatures.CANNON_KONA)) { + validator.validateWithOverrides( + IOPContractsManagerStandardValidator.ValidationInputDev({ + sysCfg: opChainConfigs[0].systemConfigProxy, + cannonPrestate: opChainConfigs[0].cannonPrestate.raw(), + cannonKonaPrestate: opChainConfigs[0].cannonKonaPrestate.raw(), + l2ChainID: l2ChainId, + proposer: initialProposer + }), + false, + validationOverrides + ); + } else { + validator.validateWithOverrides( + IOPContractsManagerStandardValidator.ValidationInput({ + sysCfg: opChainConfigs[0].systemConfigProxy, + absolutePrestate: opChainConfigs[0].cannonPrestate.raw(), + l2ChainID: l2ChainId, + proposer: initialProposer + }), + false, + validationOverrides + ); + } _runPostUpgradeSmokeTests(_opcm, opChainConfigs[0], initialChallenger, initialProposer); } @@ -316,7 +347,7 @@ contract OPContractsManager_Upgrade_Harness is CommonTest, DisputeGames { ) internal { - bytes32 expectedAbsolutePrestate = _opChainConfig.absolutePrestate.raw(); + bytes32 expectedAbsolutePrestate = _opChainConfig.cannonPrestate.raw(); if (expectedAbsolutePrestate == bytes32(0)) { expectedAbsolutePrestate = preUpgradeState.permissionedAbsolutePrestate.raw(); } @@ -1456,7 +1487,8 @@ contract OPContractsManager_Upgrade_Test is OPContractsManager_Upgrade_Harness { assertNotEq(fdgPrestateBefore.raw(), bytes32(0)); // Set the absolute prestate input to something non-zero. - opChainConfigs[0].absolutePrestate = Claim.wrap(bytes32(uint256(1))); + opChainConfigs[0].cannonPrestate = Claim.wrap(bytes32(uint256(1))); + opChainConfigs[0].cannonKonaPrestate = Claim.wrap(bytes32(uint256(2))); // Run the upgrade. runCurrentUpgrade(upgrader); @@ -1478,6 +1510,15 @@ contract OPContractsManager_Upgrade_Test is OPContractsManager_Upgrade_Harness { // Assert that the absolute prestate is the non-zero value we set. assertEq(pdgPrestateAfter.raw(), bytes32(uint256(1))); assertEq(fdgPrestateAfter.raw(), bytes32(uint256(1))); + + if (isDevFeatureEnabled(DevFeatures.CANNON_KONA)) { + LibGameArgs.GameArgs memory cannonArgs = LibGameArgs.decode(disputeGameFactory.gameArgs(GameTypes.CANNON)); + LibGameArgs.GameArgs memory cannonKonaArgs = + LibGameArgs.decode(disputeGameFactory.gameArgs(GameTypes.CANNON_KONA)); + assertEq(cannonKonaArgs.weth, cannonArgs.weth); + assertEq(cannonKonaArgs.anchorStateRegistry, cannonArgs.anchorStateRegistry); + assertEq(cannonKonaArgs.absolutePrestate, bytes32(uint256(2))); + } } /// @notice Tests that the old absolute prestate is used if the upgrade config does not set an @@ -1493,9 +1534,11 @@ contract OPContractsManager_Upgrade_Test is OPContractsManager_Upgrade_Harness { // Assert that the prestate is not zero. assertNotEq(pdgPrestateBefore.raw(), bytes32(0)); assertNotEq(fdgPrestateBefore.raw(), bytes32(0)); + assertEq(address(0), address(disputeGameFactory.gameImpls(GameTypes.CANNON_KONA))); // Set the absolute prestate input to zero. - opChainConfigs[0].absolutePrestate = Claim.wrap(bytes32(0)); + opChainConfigs[0].cannonPrestate = Claim.wrap(bytes32(0)); + opChainConfigs[0].cannonKonaPrestate = Claim.wrap(bytes32(0)); // Run the upgrade. runCurrentUpgrade(upgrader); @@ -1517,6 +1560,102 @@ contract OPContractsManager_Upgrade_Test is OPContractsManager_Upgrade_Harness { // Assert that the absolute prestate is the same as before the upgrade. assertEq(pdgPrestateAfter.raw(), pdgPrestateBefore.raw()); assertEq(fdgPrestateAfter.raw(), fdgPrestateBefore.raw()); + + assertEq(address(0), address(disputeGameFactory.gameImpls(GameTypes.CANNON_KONA))); + assertEq(0, disputeGameFactory.gameArgs(GameTypes.CANNON_KONA).length); + } + + /// @notice Tests that the old absolute prestate is used and cannon kona is updated if the upgrade config does not + /// set a cannon prestate. + function test_upgrade_cannonPrestateNotSet_succeeds() public { + // Get the pdg and fdg before the upgrade + Claim pdgPrestateBefore = IPermissionedDisputeGame( + address(disputeGameFactory.gameImpls(GameTypes.PERMISSIONED_CANNON)) + ).absolutePrestate(); + Claim fdgPrestateBefore = + IFaultDisputeGame(address(disputeGameFactory.gameImpls(GameTypes.CANNON))).absolutePrestate(); + + // Assert that the prestate is not zero. + assertNotEq(pdgPrestateBefore.raw(), bytes32(0)); + assertNotEq(fdgPrestateBefore.raw(), bytes32(0)); + + // Set the cannon prestate input to zero. + opChainConfigs[0].cannonPrestate = Claim.wrap(bytes32(0)); + + // Run the upgrade. + runCurrentUpgrade(upgrader); + + // Get the absolute prestate after the upgrade + Claim pdgPrestateAfter; + Claim fdgPrestateAfter; + if (isDevFeatureEnabled(DevFeatures.DEPLOY_V2_DISPUTE_GAMES)) { + pdgPrestateAfter = getDisputeGameV2AbsolutePrestate(GameTypes.PERMISSIONED_CANNON); + fdgPrestateAfter = getDisputeGameV2AbsolutePrestate(GameTypes.CANNON); + } else { + pdgPrestateAfter = IPermissionedDisputeGame( + address(disputeGameFactory.gameImpls(GameTypes.PERMISSIONED_CANNON)) + ).absolutePrestate(); + fdgPrestateAfter = + IFaultDisputeGame(address(disputeGameFactory.gameImpls(GameTypes.CANNON))).absolutePrestate(); + } + + // Assert that the absolute prestate is the same as before the upgrade. + assertEq(pdgPrestateAfter.raw(), pdgPrestateBefore.raw()); + assertEq(fdgPrestateAfter.raw(), fdgPrestateBefore.raw()); + + if (isDevFeatureEnabled(DevFeatures.CANNON_KONA)) { + LibGameArgs.GameArgs memory cannonArgs = LibGameArgs.decode(disputeGameFactory.gameArgs(GameTypes.CANNON)); + LibGameArgs.GameArgs memory cannonKonaArgs = + LibGameArgs.decode(disputeGameFactory.gameArgs(GameTypes.CANNON_KONA)); + assertEq(cannonKonaArgs.weth, cannonArgs.weth); + assertEq(cannonKonaArgs.anchorStateRegistry, cannonArgs.anchorStateRegistry); + assertEq(cannonKonaArgs.absolutePrestate, cannonKonaPrestate.raw()); + } else { + assertEq(address(0), address(disputeGameFactory.gameImpls(GameTypes.CANNON_KONA))); + assertEq(0, disputeGameFactory.gameArgs(GameTypes.CANNON_KONA).length); + } + } + + /// @notice Tests that the cannon absolute prestate is updated even if the cannon kona prestate is not specified + function test_upgrade_cannonKonaPrestateNotSet_succeeds() public { + // Get the pdg and fdg before the upgrade + Claim pdgPrestateBefore = IPermissionedDisputeGame( + address(disputeGameFactory.gameImpls(GameTypes.PERMISSIONED_CANNON)) + ).absolutePrestate(); + Claim fdgPrestateBefore = + IFaultDisputeGame(address(disputeGameFactory.gameImpls(GameTypes.CANNON))).absolutePrestate(); + + // Assert that the prestate is not zero. + assertNotEq(pdgPrestateBefore.raw(), bytes32(0)); + assertNotEq(fdgPrestateBefore.raw(), bytes32(0)); + + // Set the absolute prestate input to something non-zero. + opChainConfigs[0].cannonPrestate = Claim.wrap(bytes32(uint256(1))); + opChainConfigs[0].cannonKonaPrestate = Claim.wrap(bytes32(0)); + + // Run the upgrade. + runCurrentUpgrade(upgrader); + + // Get the absolute prestate after the upgrade + Claim pdgPrestateAfter; + Claim fdgPrestateAfter; + if (isDevFeatureEnabled(DevFeatures.DEPLOY_V2_DISPUTE_GAMES)) { + pdgPrestateAfter = getDisputeGameV2AbsolutePrestate(GameTypes.PERMISSIONED_CANNON); + fdgPrestateAfter = getDisputeGameV2AbsolutePrestate(GameTypes.CANNON); + } else { + pdgPrestateAfter = IPermissionedDisputeGame( + address(disputeGameFactory.gameImpls(GameTypes.PERMISSIONED_CANNON)) + ).absolutePrestate(); + fdgPrestateAfter = + IFaultDisputeGame(address(disputeGameFactory.gameImpls(GameTypes.CANNON))).absolutePrestate(); + } + + // Assert that the absolute prestate is the non-zero value we set. + assertEq(pdgPrestateAfter.raw(), bytes32(uint256(1))); + assertEq(fdgPrestateAfter.raw(), bytes32(uint256(1))); + + assertEq(address(0), address(disputeGameFactory.gameImpls(GameTypes.CANNON_KONA))); + assertEq(0, disputeGameFactory.gameArgs(GameTypes.CANNON_KONA).length); } function test_upgrade_notDelegateCalled_reverts() public { @@ -1539,7 +1678,7 @@ contract OPContractsManager_Upgrade_Test is OPContractsManager_Upgrade_Harness { /// has an absolute prestate of zero. function test_upgrade_absolutePrestateNotSet_reverts() public { // Set the config to try to update the absolutePrestate to zero. - opChainConfigs[0].absolutePrestate = Claim.wrap(bytes32(0)); + opChainConfigs[0].cannonPrestate = Claim.wrap(bytes32(0)); // Get the address of the PermissionedDisputeGame. IPermissionedDisputeGame pdg = @@ -1669,8 +1808,12 @@ contract OPContractsManager_Migrate_Test is OPContractsManager_TestInit { }); IOPContractsManager.OpChainConfig[] memory opChainConfigs = new IOPContractsManager.OpChainConfig[](2); - opChainConfigs[0] = IOPContractsManager.OpChainConfig(chainDeployOutput1.systemConfigProxy, absolutePrestate1); - opChainConfigs[1] = IOPContractsManager.OpChainConfig(chainDeployOutput2.systemConfigProxy, absolutePrestate1); + opChainConfigs[0] = IOPContractsManager.OpChainConfig( + chainDeployOutput1.systemConfigProxy, absolutePrestate1, Claim.wrap(bytes32(0)) + ); + opChainConfigs[1] = IOPContractsManager.OpChainConfig( + chainDeployOutput2.systemConfigProxy, absolutePrestate1, Claim.wrap(bytes32(0)) + ); return IOPContractsManagerInteropMigrator.MigrateInput({ usePermissionlessGame: true, @@ -2022,8 +2165,8 @@ contract OPContractsManager_Migrate_Test is OPContractsManager_TestInit { IOPContractsManagerInteropMigrator.MigrateInput memory input = _getDefaultInput(); // Set the prestates to be different. - input.opChainConfigs[0].absolutePrestate = absolutePrestate1; - input.opChainConfigs[0].absolutePrestate = absolutePrestate2; + input.opChainConfigs[0].cannonPrestate = absolutePrestate1; + input.opChainConfigs[0].cannonPrestate = absolutePrestate2; // Execute the migration. _doMigration( diff --git a/packages/contracts-bedrock/test/L1/OPContractsManagerStandardValidator.t.sol b/packages/contracts-bedrock/test/L1/OPContractsManagerStandardValidator.t.sol index bc6a98823d4fe..5fb4992f42fc3 100644 --- a/packages/contracts-bedrock/test/L1/OPContractsManagerStandardValidator.t.sol +++ b/packages/contracts-bedrock/test/L1/OPContractsManagerStandardValidator.t.sol @@ -137,7 +137,7 @@ abstract contract OPContractsManagerStandardValidator_TestInit is CommonTest, Di // address in fork tests but it's fine. if (isForkTest()) { l2ChainId = uint256(uint160(address(artifacts.mustGetAddress("L2ChainId")))); - cannonPrestate = Claim.wrap(bytes32(keccak256("absolutePrestate"))); + cannonPrestate = Claim.wrap(bytes32(keccak256("cannonPrestate"))); proposer = address(123); vm.mockCall( diff --git a/packages/contracts-bedrock/test/opcm/InteropMigration.t.sol b/packages/contracts-bedrock/test/opcm/InteropMigration.t.sol index 64426e41e538e..27c71d4329c94 100644 --- a/packages/contracts-bedrock/test/opcm/InteropMigration.t.sol +++ b/packages/contracts-bedrock/test/opcm/InteropMigration.t.sol @@ -80,7 +80,8 @@ contract InteropMigrationInput_Test is Test { configs[0] = IOPContractsManager.OpChainConfig({ systemConfigProxy: ISystemConfig(systemConfig1), - absolutePrestate: Claim.wrap(bytes32(uint256(1))) + cannonPrestate: Claim.wrap(bytes32(uint256(1))), + cannonKonaPrestate: Claim.wrap(bytes32(uint256(11))) }); // Setup mock addresses and contracts for second config @@ -91,7 +92,8 @@ contract InteropMigrationInput_Test is Test { configs[1] = IOPContractsManager.OpChainConfig({ systemConfigProxy: ISystemConfig(systemConfig2), - absolutePrestate: Claim.wrap(bytes32(uint256(2))) + cannonPrestate: Claim.wrap(bytes32(uint256(2))), + cannonKonaPrestate: Claim.wrap(bytes32(uint256(22))) }); input.set(input.opChainConfigs.selector, configs); @@ -102,8 +104,8 @@ contract InteropMigrationInput_Test is Test { // Additional verification of stored claims if needed IOPContractsManager.OpChainConfig[] memory decodedConfigs = abi.decode(storedConfigs, (IOPContractsManager.OpChainConfig[])); - assertEq(Claim.unwrap(decodedConfigs[0].absolutePrestate), bytes32(uint256(1))); - assertEq(Claim.unwrap(decodedConfigs[1].absolutePrestate), bytes32(uint256(2))); + assertEq(Claim.unwrap(decodedConfigs[0].cannonPrestate), bytes32(uint256(1))); + assertEq(Claim.unwrap(decodedConfigs[1].cannonPrestate), bytes32(uint256(2))); } function test_setAddress_withZeroAddress_reverts() public { @@ -140,7 +142,8 @@ contract InteropMigrationInput_Test is Test { configs[0] = IOPContractsManager.OpChainConfig({ systemConfigProxy: ISystemConfig(mockSystemConfig), - absolutePrestate: Claim.wrap(bytes32(uint256(1))) + cannonPrestate: Claim.wrap(bytes32(uint256(1))), + cannonKonaPrestate: Claim.wrap(bytes32(uint256(11))) }); vm.expectRevert("InteropMigrationInput: unknown selector"); @@ -149,11 +152,11 @@ contract InteropMigrationInput_Test is Test { } contract MockOPCM { - event MigrateCalled(address indexed sysCfgProxy, bytes32 indexed absolutePrestate); + event MigrateCalled(address indexed sysCfgProxy, bytes32 indexed cannonPrestate); function migrate(IOPContractsManagerInteropMigrator.MigrateInput memory _input) public { emit MigrateCalled( - address(_input.opChainConfigs[0].systemConfigProxy), Claim.unwrap(_input.opChainConfigs[0].absolutePrestate) + address(_input.opChainConfigs[0].systemConfigProxy), Claim.unwrap(_input.opChainConfigs[0].cannonPrestate) ); } } @@ -165,7 +168,7 @@ contract InteropMigration_Test is Test { InteropMigration migration; address prank; - event MigrateCalled(address indexed sysCfgProxy, bytes32 indexed absolutePrestate); + event MigrateCalled(address indexed sysCfgProxy, bytes32 indexed cannonPrestate); function setUp() public { mockOPCM = new MockOPCM(); @@ -173,7 +176,8 @@ contract InteropMigration_Test is Test { input.set(input.opcm.selector, address(mockOPCM)); config = IOPContractsManager.OpChainConfig({ systemConfigProxy: ISystemConfig(makeAddr("systemConfigProxy")), - absolutePrestate: Claim.wrap(keccak256("absolutePrestate")) + cannonPrestate: Claim.wrap(keccak256("cannonPrestate")), + cannonKonaPrestate: Claim.wrap(keccak256("cannonKonaPrestate")) }); IOPContractsManager.OpChainConfig[] memory configs = new IOPContractsManager.OpChainConfig[](1); configs[0] = config; @@ -198,7 +202,7 @@ contract InteropMigration_Test is Test { function test_migrate_succeeds() public { // MigrateCalled should be emitted by the prank since it's a delegatecall. vm.expectEmit(address(prank)); - emit MigrateCalled(address(config.systemConfigProxy), Claim.unwrap(config.absolutePrestate)); + emit MigrateCalled(address(config.systemConfigProxy), Claim.unwrap(config.cannonPrestate)); // mocks for post-migration checks address portal = makeAddr("optimismPortal"); diff --git a/packages/contracts-bedrock/test/opcm/UpgradeOPChain.t.sol b/packages/contracts-bedrock/test/opcm/UpgradeOPChain.t.sol index 264aecb0058a3..6a662631580a5 100644 --- a/packages/contracts-bedrock/test/opcm/UpgradeOPChain.t.sol +++ b/packages/contracts-bedrock/test/opcm/UpgradeOPChain.t.sol @@ -53,7 +53,8 @@ contract UpgradeOPChainInput_Test is Test { configs[0] = OPContractsManager.OpChainConfig({ systemConfigProxy: ISystemConfig(systemConfig1), - absolutePrestate: Claim.wrap(bytes32(uint256(1))) + cannonPrestate: Claim.wrap(bytes32(uint256(1))), + cannonKonaPrestate: Claim.wrap(bytes32(uint256(2))) }); // Setup mock addresses and contracts for second config @@ -64,7 +65,8 @@ contract UpgradeOPChainInput_Test is Test { configs[1] = OPContractsManager.OpChainConfig({ systemConfigProxy: ISystemConfig(systemConfig2), - absolutePrestate: Claim.wrap(bytes32(uint256(2))) + cannonPrestate: Claim.wrap(bytes32(uint256(2))), + cannonKonaPrestate: Claim.wrap(bytes32(uint256(3))) }); input.set(input.opChainConfigs.selector, configs); @@ -75,8 +77,8 @@ contract UpgradeOPChainInput_Test is Test { // Additional verification of stored claims if needed OPContractsManager.OpChainConfig[] memory decodedConfigs = abi.decode(storedConfigs, (OPContractsManager.OpChainConfig[])); - assertEq(Claim.unwrap(decodedConfigs[0].absolutePrestate), bytes32(uint256(1))); - assertEq(Claim.unwrap(decodedConfigs[1].absolutePrestate), bytes32(uint256(2))); + assertEq(Claim.unwrap(decodedConfigs[0].cannonPrestate), bytes32(uint256(1))); + assertEq(Claim.unwrap(decodedConfigs[1].cannonPrestate), bytes32(uint256(2))); } function test_setAddress_withZeroAddress_reverts() public { @@ -107,7 +109,8 @@ contract UpgradeOPChainInput_Test is Test { configs[0] = OPContractsManager.OpChainConfig({ systemConfigProxy: ISystemConfig(mockSystemConfig), - absolutePrestate: Claim.wrap(bytes32(uint256(1))) + cannonPrestate: Claim.wrap(bytes32(uint256(1))), + cannonKonaPrestate: Claim.wrap(bytes32(uint256(2))) }); vm.expectRevert("UpgradeOPCMInput: unknown selector"); @@ -116,11 +119,15 @@ contract UpgradeOPChainInput_Test is Test { } contract MockOPCM { - event UpgradeCalled(address indexed sysCfgProxy, bytes32 indexed absolutePrestate); + event UpgradeCalled( + address indexed sysCfgProxy, bytes32 indexed absolutePrestate, bytes32 indexed cannonKonaPrestate + ); function upgrade(OPContractsManager.OpChainConfig[] memory _opChainConfigs) public { emit UpgradeCalled( - address(_opChainConfigs[0].systemConfigProxy), Claim.unwrap(_opChainConfigs[0].absolutePrestate) + address(_opChainConfigs[0].systemConfigProxy), + Claim.unwrap(_opChainConfigs[0].cannonPrestate), + Claim.unwrap(_opChainConfigs[0].cannonKonaPrestate) ); } } @@ -132,7 +139,9 @@ contract UpgradeOPChain_Test is Test { UpgradeOPChain upgradeOPChain; address prank; - event UpgradeCalled(address indexed sysCfgProxy, bytes32 indexed absolutePrestate); + event UpgradeCalled( + address indexed sysCfgProxy, bytes32 indexed absolutePrestate, bytes32 indexed cannonKonaPrestate + ); function setUp() public virtual { mockOPCM = new MockOPCM(); @@ -140,7 +149,8 @@ contract UpgradeOPChain_Test is Test { uoci.set(uoci.opcm.selector, address(mockOPCM)); config = OPContractsManager.OpChainConfig({ systemConfigProxy: ISystemConfig(makeAddr("systemConfigProxy")), - absolutePrestate: Claim.wrap(keccak256("absolutePrestate")) + cannonPrestate: Claim.wrap(keccak256("cannonPrestate")), + cannonKonaPrestate: Claim.wrap(keccak256("cannonKonaPrestate")) }); OPContractsManager.OpChainConfig[] memory configs = new OPContractsManager.OpChainConfig[](1); configs[0] = config; @@ -153,7 +163,11 @@ contract UpgradeOPChain_Test is Test { function test_upgrade_succeeds() public { // UpgradeCalled should be emitted by the prank since it's a delegate call. vm.expectEmit(address(prank)); - emit UpgradeCalled(address(config.systemConfigProxy), Claim.unwrap(config.absolutePrestate)); + emit UpgradeCalled( + address(config.systemConfigProxy), + Claim.unwrap(config.cannonPrestate), + Claim.unwrap(config.cannonKonaPrestate) + ); upgradeOPChain.run(uoci); } } diff --git a/packages/contracts-bedrock/test/setup/ForkLive.s.sol b/packages/contracts-bedrock/test/setup/ForkLive.s.sol index 941ffa55877f0..02a5999e80b5c 100644 --- a/packages/contracts-bedrock/test/setup/ForkLive.s.sol +++ b/packages/contracts-bedrock/test/setup/ForkLive.s.sol @@ -208,7 +208,8 @@ contract ForkLive is Deployer, StdAssertions, FeatureFlags { IOPContractsManager.OpChainConfig[] memory opChains = new IOPContractsManager.OpChainConfig[](1); opChains[0] = IOPContractsManager.OpChainConfig({ systemConfigProxy: systemConfig, - absolutePrestate: Claim.wrap(bytes32(keccak256("absolutePrestate"))) + cannonPrestate: Claim.wrap(bytes32(keccak256("cannonPrestate"))), + cannonKonaPrestate: Claim.wrap(bytes32(keccak256("cannonKonaPrestate"))) }); // Turn the SuperchainPAO into a DelegateCaller so we can try to upgrade the