diff --git a/op-chain-ops/interopgen/deploy.go b/op-chain-ops/interopgen/deploy.go index 987e6683ae3b4..7028d43f51e08 100644 --- a/op-chain-ops/interopgen/deploy.go +++ b/op-chain-ops/interopgen/deploy.go @@ -274,7 +274,6 @@ func MigrateInterop( l2Deployment := l2Deployments[l2ChainID] chainConfigs[i] = manage.OPChainConfig{ SystemConfigProxy: l2Deployment.SystemConfigProxy, - ProxyAdmin: superDeployment.ProxyAdmin, AbsolutePrestate: l2Cfgs[l2ChainID].DisputeAbsolutePrestate, } } diff --git a/op-deployer/pkg/deployer/integration_test/apply_test.go b/op-deployer/pkg/deployer/integration_test/apply_test.go index 949798986d079..5e3aa96b92a11 100644 --- a/op-deployer/pkg/deployer/integration_test/apply_test.go +++ b/op-deployer/pkg/deployer/integration_test/apply_test.go @@ -37,7 +37,6 @@ import ( "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum-optimism/optimism/op-deployer/pkg/deployer/upgrade/embedded" - "github.com/ethereum-optimism/optimism/op-deployer/pkg/deployer/upgrade/v2_0_0" op_e2e "github.com/ethereum-optimism/optimism/op-e2e" "github.com/holiman/uint256" @@ -757,13 +756,12 @@ func runEndToEndBootstrapAndApplyUpgradeTest(t *testing.T, afactsFS foundry.Stat // Then run the OPCM upgrade t.Run("upgrade opcm", func(t *testing.T) { - upgradeConfig := v2_0_0.UpgradeOPChainInput{ + upgradeConfig := embedded.UpgradeOPChainInput{ Prank: superchainProxyAdminOwner, Opcm: impls.Opcm, - EncodedChainConfigs: []v2_0_0.OPChainConfig{ + EncodedChainConfigs: []embedded.OPChainConfig{ { SystemConfigProxy: common.HexToAddress("034edD2A225f7f429A63E0f1D2084B9E0A93b538"), - ProxyAdmin: implementationsConfig.SuperchainProxyAdmin, AbsolutePrestate: common.Hash{'A', 'P'}, }, }, diff --git a/op-deployer/pkg/deployer/manage/add_game_type.go b/op-deployer/pkg/deployer/manage/add_game_type.go index 42ace1af1125c..5ee3d36ed29bb 100644 --- a/op-deployer/pkg/deployer/manage/add_game_type.go +++ b/op-deployer/pkg/deployer/manage/add_game_type.go @@ -35,7 +35,6 @@ type AddGameTypeConfig struct { L1ProxyAdminOwner common.Address OPCMImpl common.Address SystemConfigProxy common.Address - OPChainProxyAdmin common.Address DelayedWETHProxy common.Address DisputeGameType uint32 DisputeAbsolutePrestate common.Hash @@ -78,10 +77,6 @@ func (c *AddGameTypeConfig) Check() error { return fmt.Errorf("systemConfigProxy address must be specified") } - if c.OPChainProxyAdmin == (common.Address{}) { - return fmt.Errorf("opChainProxyAdmin address must be specified") - } - if c.DisputeAbsolutePrestate == (common.Hash{}) { return fmt.Errorf("disputeAbsolutePrestate must be specified") } @@ -221,7 +216,6 @@ func populateConfigFromWorkdir(cfg *AddGameTypeConfig, cliCtx *cli.Context) erro } cfg.OPCMImpl = *state.AppliedIntent.OPCMAddress cfg.SystemConfigProxy = chainState.SystemConfigProxy - cfg.OPChainProxyAdmin = chainState.OpChainProxyAdminImpl cfg.VM = state.ImplementationsDeployment.MipsImpl return nil } @@ -234,7 +228,6 @@ func populateConfigFromFlags(cfg *AddGameTypeConfig, cliCtx *cli.Context) error cfg.L1ProxyAdminOwner = common.HexToAddress(cliCtx.String(L1ProxyAdminOwnerFlag.Name)) cfg.OPCMImpl = common.HexToAddress(cliCtx.String(OPCMImplFlag.Name)) cfg.SystemConfigProxy = common.HexToAddress(cliCtx.String(SystemConfigProxyFlag.Name)) - cfg.OPChainProxyAdmin = common.HexToAddress(cliCtx.String(OPChainProxyAdminFlag.Name)) cfg.VM = common.HexToAddress(cliCtx.String(VMFlag.Name)) return nil } @@ -280,7 +273,6 @@ func AddGameType(ctx context.Context, cfg AddGameTypeConfig) (opcm.AddGameTypeOu L1ProxyAdminOwner: cfg.L1ProxyAdminOwner, OPCMImpl: cfg.OPCMImpl, SystemConfigProxy: cfg.SystemConfigProxy, - OPChainProxyAdmin: cfg.OPChainProxyAdmin, DelayedWETHProxy: cfg.DelayedWETHProxy, DisputeGameType: cfg.DisputeGameType, DisputeAbsolutePrestate: cfg.DisputeAbsolutePrestate, diff --git a/op-deployer/pkg/deployer/manage/add_game_type_test.go b/op-deployer/pkg/deployer/manage/add_game_type_test.go index b19d51ae6ee32..0f7aa80435abf 100644 --- a/op-deployer/pkg/deployer/manage/add_game_type_test.go +++ b/op-deployer/pkg/deployer/manage/add_game_type_test.go @@ -6,102 +6,93 @@ import ( "fmt" "log/slog" "math/big" - "os" "testing" "time" "github.com/ethereum-optimism/optimism/op-service/testlog" "github.com/ethereum-optimism/optimism/op-service/testutils" - "github.com/lmittmann/w3" - "github.com/lmittmann/w3/module/eth" + "github.com/ethereum-optimism/optimism/op-service/testutils/devnet" + "github.com/ethereum-optimism/optimism/op-deployer/pkg/deployer/bootstrap" + "github.com/ethereum-optimism/optimism/op-deployer/pkg/deployer/integration_test/shared" "github.com/ethereum-optimism/optimism/op-deployer/pkg/deployer/standard" - "github.com/ethereum/go-ethereum/superchain" "github.com/ethereum-optimism/optimism/op-deployer/pkg/deployer/testutil" - "github.com/ethereum-optimism/superchain-registry/validation" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/superchain" "github.com/stretchr/testify/require" "github.com/urfave/cli/v2" ) -// getAddressesOnchain reads addresses from on-chain contracts (using chainConfig to get entrypoints) -func getAddressesOnchain(ctx context.Context, rpcURL string, chainConfig *superchain.ChainConfig) (opChainProxyAdmin, delayedWETHProxy common.Address, err error) { - var proxyAdminFn = w3.MustNewFunc("proxyAdmin()", "address") - var gameImplsFn = w3.MustNewFunc("gameImpls(uint32)", "address") - var wethFn = w3.MustNewFunc("weth()", "address") - - client, err := w3.Dial(rpcURL) - if err != nil { - return common.Address{}, common.Address{}, fmt.Errorf("failed to connect to RPC: %w", err) - } - defer client.Close() - - systemConfigProxy := *chainConfig.Addresses.SystemConfigProxy - disputeGameFactoryProxy := *chainConfig.Addresses.DisputeGameFactoryProxy - - // Read OPChainProxyAdmin from systemConfigProxy.proxyAdmin() - err = client.CallCtx(ctx, eth.CallFunc(systemConfigProxy, proxyAdminFn).Returns(&opChainProxyAdmin)) - if err != nil { - return common.Address{}, common.Address{}, fmt.Errorf("failed to read proxyAdmin from SystemConfig: %w", err) - } +func TestAddGameType(t *testing.T) { + // Since the opcm version is not yet on sepolia, we create a fork of sepolia then deploy the opcm via deploy implementations. + lgr := testlog.Logger(t, slog.LevelDebug) + forkedL1, stopL1, err := devnet.NewForkedSepolia(lgr) + pkHex, _, _ := shared.DefaultPrivkey(t) + require.NoError(t, err) + t.Cleanup(func() { + require.NoError(t, stopL1()) + }) - // Read permissionless dispute game address from disputeGameFactoryProxy.gameImpls(0) - // GameTypes.CANNON = 0 (permissionless) - var permissionlessDisputeGame common.Address - err = client.CallCtx(ctx, eth.CallFunc(disputeGameFactoryProxy, gameImplsFn, uint32(0)).Returns(&permissionlessDisputeGame)) - if err != nil { - return common.Address{}, common.Address{}, fmt.Errorf("failed to read gameImpls(0) from DisputeGameFactory: %w", err) - } + afacts, _ := testutil.LocalArtifacts(t) + ctx, cancel := context.WithTimeout(context.Background(), 90*time.Second) + defer cancel() + testCacheDir := testutils.IsolatedTestDirWithAutoCleanup(t) - // Read DelayedWETHProxy from permissionlessDisputeGame.weth() - err = client.CallCtx(ctx, eth.CallFunc(permissionlessDisputeGame, wethFn).Returns(&delayedWETHProxy)) - if err != nil { - return common.Address{}, common.Address{}, fmt.Errorf("failed to read weth from permissionless dispute game: %w", err) - } + sChain, err := standard.SuperchainFor(11155111) + require.NoError(t, err) - return opChainProxyAdmin, delayedWETHProxy, nil -} + superchainProxyAdmin, err := standard.SuperchainProxyAdminAddrFor(11155111) + require.NoError(t, err) -func TestAddGameType(t *testing.T) { - rpcURL := os.Getenv("SEPOLIA_RPC_URL") - require.NotEmpty(t, rpcURL, "must specify RPC url via SEPOLIA_RPC_URL env var") + superchainProxyAdminOwner, err := standard.L1ProxyAdminOwner(11155111) + require.NoError(t, err) - afacts, _ := testutil.LocalArtifacts(t) - v200SepoliaAddrs := validation.StandardVersionsSepolia[standard.ContractsV200Tag] - testCacheDir := testutils.IsolatedTestDirWithAutoCleanup(t) + impls, err := bootstrap.Implementations(ctx, bootstrap.ImplementationsConfig{ + L1RPCUrl: forkedL1.RPCUrl(), + PrivateKey: pkHex, + ArtifactsLocator: afacts, + MIPSVersion: int(standard.MIPSVersion), + WithdrawalDelaySeconds: standard.WithdrawalDelaySeconds, + MinProposalSizeBytes: standard.MinProposalSizeBytes, + ChallengePeriodSeconds: standard.ChallengePeriodSeconds, + ProofMaturityDelaySeconds: standard.ProofMaturityDelaySeconds, + DisputeGameFinalityDelaySeconds: standard.DisputeGameFinalityDelaySeconds, + DevFeatureBitmap: common.Hash{}, + SuperchainConfigProxy: sChain.SuperchainConfigAddr, + ProtocolVersionsProxy: sChain.ProtocolVersionsAddr, + L1ProxyAdminOwner: superchainProxyAdminOwner, + SuperchainProxyAdmin: superchainProxyAdmin, + CacheDir: testCacheDir, + Logger: lgr, + Challenger: common.Address{'C'}, + }) + require.NoError(t, err) chain, err := superchain.GetChain(11155420) require.NoError(t, err) chainConfig, err := chain.Config() require.NoError(t, err) - readCtx, readCancel := context.WithTimeout(context.Background(), 10*time.Second) - defer readCancel() - - opChainProxyAdmin, delayedWETHProxy, err := getAddressesOnchain(readCtx, rpcURL, chainConfig) - require.NoError(t, err, "failed to read addresses from chain") - cfg := AddGameTypeConfig{ - L1RPCUrl: rpcURL, + L1RPCUrl: forkedL1.RPCUrl(), Logger: testlog.Logger(t, slog.LevelInfo), ArtifactsLocator: afacts, SaltMixer: "foo", // The values below were pulled from the Superchain Registry for OP Sepolia. SystemConfigProxy: *chainConfig.Addresses.SystemConfigProxy, - OPChainProxyAdmin: opChainProxyAdmin, - DelayedWETHProxy: delayedWETHProxy, - DisputeGameType: 999, + DelayedWETHProxy: common.Address{}, // Let the OPCM create a new one. + DisputeGameType: 0, DisputeAbsolutePrestate: common.HexToHash("0x1234"), DisputeMaxGameDepth: big.NewInt(73), DisputeSplitDepth: big.NewInt(30), DisputeClockExtension: 10800, DisputeMaxClockDuration: 302400, InitialBond: big.NewInt(1), - VM: common.Address(*v200SepoliaAddrs.Mips.Address), - Permissionless: false, - L1ProxyAdminOwner: *chainConfig.Roles.ProxyAdminOwner, - OPCMImpl: common.Address(*v200SepoliaAddrs.OPContractsManager.Address), + VM: impls.MipsSingleton, + Permissionless: true, + L1ProxyAdminOwner: superchainProxyAdminOwner, + OPCMImpl: impls.Opcm, CacheDir: testCacheDir, } @@ -113,7 +104,8 @@ func TestAddGameType(t *testing.T) { require.Equal(t, 1, len(broadcasts)) // Selector for addGameType - require.EqualValues(t, []byte{0x16, 0x61, 0xa2, 0xe9}, broadcasts[0].Data[0:4]) + // Gotten from `cast sig "addGameType((string,address,address,uint32,bytes32,uint256,uint256,uint64,uint64,uint256,address,bool)[])"` + require.EqualValues(t, []byte{0x60, 0x4a, 0xa6, 0x28}, broadcasts[0].Data[0:4]) require.NotEqual(t, common.Address{}, output.DelayedWETHProxy) require.NotEqual(t, common.Address{}, output.FaultDisputeGameProxy) @@ -127,7 +119,6 @@ func TestAddGameType_CLI(t *testing.T) { {L1ProxyAdminOwnerFlag, common.Address{0x01}.String()}, {OPCMImplFlag, common.Address{0x02}.String()}, {SystemConfigProxyFlag, common.Address{0x03}.String()}, - {OPChainProxyAdminFlag, common.Address{0x04}.String()}, {VMFlag, common.Address{0x05}.String()}, } @@ -175,7 +166,6 @@ func TestAddGameType_CLI(t *testing.T) { require.Equal(t, common.HexToAddress("0x1eb2ffc903729a0f03966b917003800b145f56e2"), cfg.L1ProxyAdminOwner) require.Equal(t, common.HexToAddress("0xfbceed4de885645fbded164910e10f52febfab35"), cfg.OPCMImpl) - require.Equal(t, common.HexToAddress("0x7bd8879acf1e74547455c7ddc07f5c3f4a3c133d"), cfg.OPChainProxyAdmin) require.Equal(t, common.HexToAddress("0x02f909cf91c2134e70a67950b7f27db7c8ee55d6"), cfg.SystemConfigProxy) require.Equal(t, common.HexToAddress("0x0000000000000000000000000000000000000001"), cfg.VM) }) @@ -186,7 +176,6 @@ func TestAddGameType_CLI(t *testing.T) { flagSet.String(L1ProxyAdminOwnerFlag.Name, "0x1eb2ffc903729a0f03966b917003800b145f56e2", "doc") flagSet.String(OPCMImplFlag.Name, "0xfbceed4de885645fbded164910e10f52febfab35", "doc") - flagSet.String(OPChainProxyAdminFlag.Name, "0x7bd8879acf1e74547455c7ddc07f5c3f4a3c133d", "doc") flagSet.String(SystemConfigProxyFlag.Name, "0x02f909cf91c2134e70a67950b7f27db7c8ee55d6", "doc") flagSet.String(VMFlag.Name, "0x0000000000000000000000000000000000000001", "doc") @@ -197,7 +186,6 @@ func TestAddGameType_CLI(t *testing.T) { require.Equal(t, common.HexToAddress("0x1eb2ffc903729a0f03966b917003800b145f56e2"), cfg.L1ProxyAdminOwner) require.Equal(t, common.HexToAddress("0xfbceed4de885645fbded164910e10f52febfab35"), cfg.OPCMImpl) - require.Equal(t, common.HexToAddress("0x7bd8879acf1e74547455c7ddc07f5c3f4a3c133d"), cfg.OPChainProxyAdmin) require.Equal(t, common.HexToAddress("0x02f909cf91c2134e70a67950b7f27db7c8ee55d6"), cfg.SystemConfigProxy) require.Equal(t, common.HexToAddress("0x0000000000000000000000000000000000000001"), cfg.VM) }) diff --git a/op-deployer/pkg/deployer/manage/migrate.go b/op-deployer/pkg/deployer/manage/migrate.go index af6c074478775..3c8b3899c9c70 100644 --- a/op-deployer/pkg/deployer/manage/migrate.go +++ b/op-deployer/pkg/deployer/manage/migrate.go @@ -54,7 +54,6 @@ func (u *InteropMigrationInput) OpChainConfigs() ([]byte, error) { type OPChainConfig struct { SystemConfigProxy common.Address `json:"systemConfigProxy"` - ProxyAdmin common.Address `json:"proxyAdmin"` AbsolutePrestate common.Hash `json:"absolutePrestate"` } @@ -66,7 +65,7 @@ func (output *InteropMigrationOutput) CheckOutput(input common.Address) error { return nil } -var opChainConfigEncoder = w3.MustNewFunc("dummy((address systemConfigProxy,address proxyAdmin,bytes32 absolutePrestate)[])", "") +var opChainConfigEncoder = w3.MustNewFunc("dummy((address systemConfigProxy,bytes32 absolutePrestate)[])", "") type InteropMigration struct { Run func(input common.Address) @@ -112,7 +111,6 @@ func MigrateCLI(cliCtx *cli.Context) error { EncodedChainConfigs: []OPChainConfig{ { SystemConfigProxy: common.HexToAddress(cliCtx.String(SystemConfigProxyFlag.Name)), - ProxyAdmin: common.HexToAddress(cliCtx.String(OPChainProxyAdminFlag.Name)), AbsolutePrestate: 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 9366572bf8d06..f735e3ea34aaf 100644 --- a/op-deployer/pkg/deployer/manage/migrate_test.go +++ b/op-deployer/pkg/deployer/manage/migrate_test.go @@ -64,7 +64,6 @@ func TestInteropMigration(t *testing.T) { EncodedChainConfigs: []OPChainConfig{ { SystemConfigProxy: common.HexToAddress("0x034edD2A225f7f429A63E0f1D2084B9E0A93b538"), - ProxyAdmin: common.HexToAddress("0x189aBAAaa82DfC015A588A7dbaD6F13b1D3485Bc"), AbsolutePrestate: common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000abc"), }, }, diff --git a/op-deployer/pkg/deployer/opcm/add_game_type.go b/op-deployer/pkg/deployer/opcm/add_game_type.go index ed9cd70681702..6b2798de9e78a 100644 --- a/op-deployer/pkg/deployer/opcm/add_game_type.go +++ b/op-deployer/pkg/deployer/opcm/add_game_type.go @@ -13,7 +13,6 @@ type AddGameTypeInput struct { L1ProxyAdminOwner common.Address `abi:"prank"` OPCMImpl common.Address `abi:"opcmImpl"` SystemConfigProxy common.Address - OPChainProxyAdmin common.Address `abi:"opChainProxyAdmin"` DelayedWETHProxy common.Address DisputeGameType uint32 DisputeAbsolutePrestate common.Hash @@ -31,7 +30,6 @@ type addGameTypeInputJSON struct { Prank common.Address `json:"prank"` OPCMImpl common.Address `json:"opcmimpl"` SystemConfigProxy common.Address `json:"systemConfigProxy"` - OPChainProxyAdmin common.Address `json:"opChainProxyAdmin"` DelayedWETHProxy common.Address `json:"delayedWETHProxy"` DisputeGameType uint32 `json:"disputeGameType"` DisputeAbsolutePrestate common.Hash `json:"disputeAbsolutePrestate"` @@ -54,7 +52,6 @@ func (a *AddGameTypeInput) UnmarshalJSON(b []byte) error { a.L1ProxyAdminOwner = alias.Prank a.OPCMImpl = alias.OPCMImpl a.SystemConfigProxy = alias.SystemConfigProxy - a.OPChainProxyAdmin = alias.OPChainProxyAdmin a.DelayedWETHProxy = alias.DelayedWETHProxy a.DisputeGameType = alias.DisputeGameType a.DisputeAbsolutePrestate = alias.DisputeAbsolutePrestate @@ -86,7 +83,6 @@ func (a AddGameTypeInput) MarshalJSON() ([]byte, error) { Prank: a.L1ProxyAdminOwner, OPCMImpl: a.OPCMImpl, SystemConfigProxy: a.SystemConfigProxy, - OPChainProxyAdmin: a.OPChainProxyAdmin, DelayedWETHProxy: a.DelayedWETHProxy, DisputeGameType: a.DisputeGameType, DisputeAbsolutePrestate: a.DisputeAbsolutePrestate, diff --git a/op-deployer/pkg/deployer/opcm/add_game_type_test.go b/op-deployer/pkg/deployer/opcm/add_game_type_test.go index be7175526d5e3..b87cc435b95e6 100644 --- a/op-deployer/pkg/deployer/opcm/add_game_type_test.go +++ b/op-deployer/pkg/deployer/opcm/add_game_type_test.go @@ -26,7 +26,6 @@ func compareAddGameTypeInputs(t *testing.T, expected, actual AddGameTypeInput) { require.Equal(t, expected.L1ProxyAdminOwner, actual.L1ProxyAdminOwner) require.Equal(t, expected.OPCMImpl, actual.OPCMImpl) require.Equal(t, expected.SystemConfigProxy, actual.SystemConfigProxy) - require.Equal(t, expected.OPChainProxyAdmin, actual.OPChainProxyAdmin) require.Equal(t, expected.DelayedWETHProxy, actual.DelayedWETHProxy) require.Equal(t, expected.DisputeGameType, actual.DisputeGameType) require.Equal(t, expected.DisputeAbsolutePrestate, actual.DisputeAbsolutePrestate) @@ -54,7 +53,6 @@ func TestAddGameTypeInput_MarshalUnmarshalJSON(t *testing.T) { L1ProxyAdminOwner: common.HexToAddress("0x1111111111111111111111111111111111111111"), OPCMImpl: common.HexToAddress("0x2222222222222222222222222222222222222222"), SystemConfigProxy: common.HexToAddress("0x3333333333333333333333333333333333333333"), - OPChainProxyAdmin: common.HexToAddress("0x4444444444444444444444444444444444444444"), DelayedWETHProxy: common.HexToAddress("0x5555555555555555555555555555555555555555"), DisputeGameType: 1, DisputeAbsolutePrestate: common.HexToHash("0x6666666666666666666666666666666666666666666666666666666666666666"), @@ -74,7 +72,6 @@ func TestAddGameTypeInput_MarshalUnmarshalJSON(t *testing.T) { L1ProxyAdminOwner: common.HexToAddress("0x1111111111111111111111111111111111111111"), OPCMImpl: common.HexToAddress("0x2222222222222222222222222222222222222222"), SystemConfigProxy: common.HexToAddress("0x3333333333333333333333333333333333333333"), - OPChainProxyAdmin: common.HexToAddress("0x4444444444444444444444444444444444444444"), DelayedWETHProxy: common.HexToAddress("0x5555555555555555555555555555555555555555"), DisputeGameType: 1, DisputeAbsolutePrestate: common.HexToHash("0x6666666666666666666666666666666666666666666666666666666666666666"), diff --git a/op-deployer/pkg/deployer/upgrade/embedded/upgrade.go b/op-deployer/pkg/deployer/upgrade/embedded/upgrade.go index eaa7bad52d4b0..93803f5f3540c 100644 --- a/op-deployer/pkg/deployer/upgrade/embedded/upgrade.go +++ b/op-deployer/pkg/deployer/upgrade/embedded/upgrade.go @@ -2,17 +2,52 @@ package embedded import ( "encoding/json" + "fmt" "github.com/ethereum-optimism/optimism/op-chain-ops/script" "github.com/ethereum-optimism/optimism/op-deployer/pkg/deployer/artifacts" - v200 "github.com/ethereum-optimism/optimism/op-deployer/pkg/deployer/upgrade/v2_0_0" + "github.com/ethereum-optimism/optimism/op-deployer/pkg/deployer/opcm" + "github.com/ethereum/go-ethereum/common" + "github.com/lmittmann/w3" ) -type Upgrader struct { +type UpgradeOPChainInput struct { + Prank common.Address `json:"prank"` + Opcm common.Address `json:"opcm"` + EncodedChainConfigs []OPChainConfig `evm:"-" json:"chainConfigs"` } +type OPChainConfig struct { + SystemConfigProxy common.Address `json:"systemConfigProxy"` + AbsolutePrestate common.Hash `json:"absolutePrestate"` +} + +var opChainConfigEncoder = w3.MustNewFunc("dummy((address systemConfigProxy,bytes32 absolutePrestate)[])", "") + +func (u *UpgradeOPChainInput) OpChainConfigs() ([]byte, error) { + data, err := opChainConfigEncoder.EncodeArgs(u.EncodedChainConfigs) + if err != nil { + return nil, fmt.Errorf("failed to encode chain configs: %w", err) + } + return data[4:], nil +} + +type UpgradeOPChain struct { + Run func(input common.Address) +} + +func Upgrade(host *script.Host, input UpgradeOPChainInput) error { + return opcm.RunScriptVoid[UpgradeOPChainInput](host, input, "UpgradeOPChain.s.sol", "UpgradeOPChain") +} + +type Upgrader struct{} + func (u *Upgrader) Upgrade(host *script.Host, input json.RawMessage) error { - return v200.DefaultUpgrader.Upgrade(host, input) + var upgradeInput UpgradeOPChainInput + if err := json.Unmarshal(input, &upgradeInput); err != nil { + return fmt.Errorf("failed to unmarshal input: %w", err) + } + return Upgrade(host, upgradeInput) } func (u *Upgrader) ArtifactsURL() string { diff --git a/op-deployer/pkg/deployer/upgrade/v2_0_0/upgrade_test.go b/op-deployer/pkg/deployer/upgrade/v2_0_0/upgrade_test.go index 95585401b1182..f4127089dd725 100644 --- a/op-deployer/pkg/deployer/upgrade/v2_0_0/upgrade_test.go +++ b/op-deployer/pkg/deployer/upgrade/v2_0_0/upgrade_test.go @@ -1,22 +1,10 @@ package v2_0_0 import ( - "context" "encoding/hex" - "log/slog" - "os" "testing" - "time" - "github.com/ethereum-optimism/optimism/op-service/testutils/devnet" - - "github.com/ethereum-optimism/optimism/op-deployer/pkg/deployer/broadcaster" - "github.com/ethereum-optimism/optimism/op-deployer/pkg/deployer/testutil" - "github.com/ethereum-optimism/optimism/op-deployer/pkg/env" - "github.com/ethereum-optimism/optimism/op-service/testlog" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/rpc" "github.com/stretchr/testify/require" ) @@ -52,71 +40,3 @@ func TestUpgradeOPChainInput_OpChainConfigs(t *testing.T) { hex.EncodeToString(data), ) } - -func TestUpgrader_Upgrade(t *testing.T) { - lgr := testlog.Logger(t, slog.LevelDebug) - - forkedL1, stopL1, err := devnet.NewForkedSepolia(lgr) - require.NoError(t, err) - t.Cleanup(func() { - require.NoError(t, stopL1()) - }) - l1RPC := forkedL1.RPCUrl() - - _, afactsFS := testutil.LocalArtifacts(t) - - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) - defer cancel() - - rpcClient, err := rpc.Dial(l1RPC) - require.NoError(t, err) - - bcast := new(broadcaster.CalldataBroadcaster) - host, err := env.DefaultForkedScriptHost( - ctx, - bcast, - lgr, - common.Address{'D'}, - afactsFS, - rpcClient, - ) - require.NoError(t, err) - - configFile, err := os.ReadFile("testdata/config.json") - require.NoError(t, err) - - upgrader := DefaultUpgrader - require.NoError(t, upgrader.Upgrade(host, configFile)) - - dump, err := bcast.Dump() - require.NoError(t, err) - - addr := common.HexToAddress("0x1Eb2fFc903729a0F03966B917003800b145F56E2") - require.True(t, dump[0].Value.ToInt().Cmp(common.Big0) == 0) - // Have to do this to normalize zero values which can either set nat to nil - // or to a zero value. They mean the same thing, but aren't equal according to - // EqualValues. - dump[0].Value = (*hexutil.Big)(common.Big0) - - require.EqualValues(t, []broadcaster.CalldataDump{ - { - To: &addr, - Data: []byte{ - 0xff, 0x2d, 0xd5, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x03, 0x4e, 0xdd, 0x2a, 0x22, 0x5f, 0x7f, 0x42, 0x9a, 0x63, 0xe0, - 0xf1, 0xd2, 0x08, 0x4b, 0x9e, 0x0a, 0x93, 0xb5, 0x38, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x9a, 0xba, 0xaa, 0xa8, - 0x2d, 0xfc, 0x01, 0x5a, 0x58, 0x8a, 0x7d, 0xba, 0xd6, 0xf1, 0x3b, 0x1d, 0x34, - 0x85, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa, 0xbc, - }, - Value: (*hexutil.Big)(common.Big0), - }, - }, dump) -} diff --git a/op-devstack/sysgo/add_game_type.go b/op-devstack/sysgo/add_game_type.go index 05de1a0e02a9d..0274928eae2ac 100644 --- a/op-devstack/sysgo/add_game_type.go +++ b/op-devstack/sysgo/add_game_type.go @@ -57,7 +57,6 @@ func addGameType(o *Orchestrator, absolutePrestate common.Hash, gameType uint32, L1ProxyAdminOwner: l1PAO, OPCMImpl: opcmAddr, SystemConfigProxy: o.wb.outL2Deployment[l2ChainID].SystemConfigProxyAddr(), - OPChainProxyAdmin: o.wb.outL2Deployment[l2ChainID].ProxyAdminAddr(), DelayedWETHProxy: o.wb.outL2Deployment[l2ChainID].PermissionlessDelayedWETHProxyAddr(), DisputeGameType: gameType, DisputeAbsolutePrestate: absolutePrestate, @@ -71,6 +70,8 @@ func addGameType(o *Orchestrator, absolutePrestate common.Hash, gameType uint32, SaltMixer: fmt.Sprintf("devstack-%s-%s", l2ChainID, absolutePrestate.Hex()), } + OPChainProxyAdmin := o.wb.outL2Deployment[l2ChainID].ProxyAdminAddr() + _, addGameTypeCalldata, err := manage.AddGameType(t.Ctx(), cfg) require.NoError(err, "failed to create add game type calldata") require.Len(addGameTypeCalldata, 1, "calldata must contain one entry") @@ -85,7 +86,7 @@ func addGameType(o *Orchestrator, absolutePrestate common.Hash, gameType uint32, t.Log("Deploying delegate call proxy contract") delegateCallProxy, proxyContract := deployDelegateCallProxy(t, transactOpts, client, l1PAO) // transfer ownership to the proxy so that we can delegatecall the opcm - transferOwnership(t, l1PAOKey, client, cfg.OPChainProxyAdmin, delegateCallProxy) + transferOwnership(t, l1PAOKey, client, OPChainProxyAdmin, delegateCallProxy) dgf := o.wb.outL2Deployment[l2ChainID].DisputeGameFactoryProxyAddr() transferOwnership(t, l1PAOKey, client, dgf, delegateCallProxy) @@ -96,7 +97,7 @@ func addGameType(o *Orchestrator, absolutePrestate common.Hash, gameType uint32, require.NoError(err, "failed to wait for add game type receipt") // reset ProxyAdmin ownership transfers - transferOwnershipForDelegateCallProxy(t, l1ChainID.ToBig(), l1PAOKey, client, delegateCallProxy, cfg.OPChainProxyAdmin, l1PAO) + transferOwnershipForDelegateCallProxy(t, l1ChainID.ToBig(), l1PAOKey, client, delegateCallProxy, OPChainProxyAdmin, l1PAO) transferOwnershipForDelegateCallProxy(t, l1ChainID.ToBig(), l1PAOKey, client, delegateCallProxy, dgf, l1PAO) } diff --git a/op-devstack/sysgo/superroot.go b/op-devstack/sysgo/superroot.go index 633a295aead3a..5193be24b6022 100644 --- a/op-devstack/sysgo/superroot.go +++ b/op-devstack/sysgo/superroot.go @@ -72,7 +72,6 @@ func WithSuperRoots(l1ChainID eth.ChainID, l1ELID stack.L1ELNodeID, l2CLID stack l2ChainIDs = append(l2ChainIDs, l2ChainID) opChainConfigs = append(opChainConfigs, bindings.OPContractsManagerOpChainConfig{ SystemConfigProxy: l2Deployment.SystemConfigProxyAddr(), - ProxyAdmin: superchainProxyAdmin, AbsolutePrestate: absolutePrestate, }) } @@ -179,6 +178,9 @@ func WithSuperRoots(l1ChainID eth.ChainID, l1ELID stack.L1ELNodeID, l2CLID stack delegateCallProxy, oldDisputeGameFactories, ) + + transferOwnershipForDelegateCallProxy(t, l1ChainID.ToBig(), l1PAOKey, client, delegateCallProxy, superchainProxyAdmin, oldSuperchainProxyAdminOwner) + superchainProxyAdminOwner := getOwner(t, w3Client, superchainProxyAdmin) t.Require().Equal(oldSuperchainProxyAdminOwner, superchainProxyAdminOwner, "superchain proxy admin owner is not the L1PAO") diff --git a/op-e2e/bindings/opcontractsmanager.go b/op-e2e/bindings/opcontractsmanager.go index 26dea347ff642..c65d6dd091c3c 100644 --- a/op-e2e/bindings/opcontractsmanager.go +++ b/op-e2e/bindings/opcontractsmanager.go @@ -33,7 +33,6 @@ var ( type OPContractsManagerAddGameInput struct { SaltMixer string SystemConfig common.Address - ProxyAdmin common.Address DelayedWETH common.Address DisputeGameType uint32 DisputeAbsolutePrestate [32]byte @@ -145,7 +144,6 @@ type OPContractsManagerInteropMigratorMigrateInput struct { // OPContractsManagerOpChainConfig is an auto generated low-level Go binding around an user-defined struct. type OPContractsManagerOpChainConfig struct { SystemConfigProxy common.Address - ProxyAdmin common.Address AbsolutePrestate [32]byte } @@ -161,7 +159,6 @@ type OPContractsManagerRoles struct { // OPContractsManagerStandardValidatorValidationInput is an auto generated low-level Go binding around an user-defined struct. type OPContractsManagerStandardValidatorValidationInput struct { - ProxyAdmin common.Address SysCfg common.Address AbsolutePrestate [32]byte L2ChainID *big.Int @@ -173,6 +170,13 @@ type OPContractsManagerStandardValidatorValidationOverrides struct { Challenger common.Address } +// OPContractsManagerUpdatePrestateInput is an auto generated low-level Go binding around an user-defined struct. +type OPContractsManagerUpdatePrestateInput struct { + SystemConfigProxy common.Address + CannonPrestate [32]byte + CannonKonaPrestate [32]byte +} + // Proposal is an auto generated low-level Go binding around an user-defined struct. type Proposal struct { Root [32]byte @@ -181,8 +185,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\":\"proxyAdmin\",\"type\":\"address\",\"internalType\":\"contractIProxyAdmin\"},{\"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\":\"proxyAdmin\",\"type\":\"address\",\"internalType\":\"contractIProxyAdmin\"},{\"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.OpChainConfig[]\",\"components\":[{\"name\":\"systemConfigProxy\",\"type\":\"address\",\"internalType\":\"contractISystemConfig\"},{\"name\":\"proxyAdmin\",\"type\":\"address\",\"internalType\":\"contractIProxyAdmin\"},{\"name\":\"absolutePrestate\",\"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\":\"proxyAdmin\",\"type\":\"address\",\"internalType\":\"contractIProxyAdmin\"},{\"name\":\"absolutePrestate\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validate\",\"inputs\":[{\"name\":\"_input\",\"type\":\"tuple\",\"internalType\":\"structOPContractsManagerStandardValidator.ValidationInput\",\"components\":[{\"name\":\"proxyAdmin\",\"type\":\"address\",\"internalType\":\"contractIProxyAdmin\"},{\"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\":\"proxyAdmin\",\"type\":\"address\",\"internalType\":\"contractIProxyAdmin\"},{\"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: "0x6101a06040523480156200001257600080fd5b5060405162002cd838038062002cd883398101604081905262000035916200030c565b60405163b6a4cd2160e01b81526001600160a01b03848116600483015288169063b6a4cd219060240160006040518083038186803b1580156200007757600080fd5b505afa1580156200008c573d6000803e3d6000fd5b505060405163b6a4cd2160e01b81526001600160a01b0385811660048301528a16925063b6a4cd21915060240160006040518083038186803b158015620000d257600080fd5b505afa158015620000e7573d6000803e3d6000fd5b505060405163b6a4cd2160e01b81526001600160a01b038b811660048301528a16925063b6a4cd21915060240160006040518083038186803b1580156200012d57600080fd5b505afa15801562000142573d6000803e3d6000fd5b505060405163b6a4cd2160e01b81526001600160a01b038a1660048201819052925063b6a4cd21915060240160006040518083038186803b1580156200018757600080fd5b505afa1580156200019c573d6000803e3d6000fd5b505060405163b6a4cd2160e01b81526001600160a01b0389811660048301528a16925063b6a4cd21915060240160006040518083038186803b158015620001e257600080fd5b505afa158015620001f7573d6000803e3d6000fd5b505060405163b6a4cd2160e01b81526001600160a01b0388811660048301528a16925063b6a4cd21915060240160006040518083038186803b1580156200023d57600080fd5b505afa15801562000252573d6000803e3d6000fd5b505060405163b6a4cd2160e01b81526001600160a01b0387811660048301528a16925063b6a4cd21915060240160006040518083038186803b1580156200029857600080fd5b505afa158015620002ad573d6000803e3d6000fd5b5050506001600160a01b039889166080525095871660a05293861660c05291851660e05284166101005283166101205282166101405216610160523061018052620003cd565b6001600160a01b03811681146200030957600080fd5b50565b600080600080600080600080610100898b0312156200032a57600080fd5b88516200033781620002f3565b60208a01519098506200034a81620002f3565b60408a01519097506200035d81620002f3565b60608a01519096506200037081620002f3565b60808a01519095506200038381620002f3565b60a08a01519094506200039681620002f3565b60c08a0151909350620003a981620002f3565b60e08a0151909250620003bc81620002f3565b809150509295985092959890939650565b60805160a05160c05160e051610100516101205161014051610160516101805161281c620004bc600039600081816104580152818161084f01528181610be501528181610cf10152610ed60152600061022d0152600061035801526000818161029c0152610a170152600081816103f0015281816106230152610ab80152600081816101d0015261091901526000818161018c01528181610cbc0152610fa00152600081816103310152818161056b01528181610719015281816107cc015281816109e001528181610b680152610e4b015260008181610417015281816105240152610dbb015261281c6000f3fe608060405234801561001057600080fd5b50600436106101825760003560e01c8063613e827b116100d8578063b0b807eb1161008c578063ba7903db11610066578063ba7903db146103eb578063becbdf4a14610412578063ff2dd5a11461043957600080fd5b8063b0b807eb146103b0578063b23cc044146103c3578063b51f9c2b146103d657600080fd5b80636624856a116100bd5780636624856a1461035357806367cda69c1461037a57806378ecabce1461038d57600080fd5b8063613e827b1461030c578063622d56f11461032c57600080fd5b806330d148881161013a57806335e80ab31161011457806335e80ab3146102975780633fe13f3f146102be57806354fd4d50146102d357600080fd5b806330d148881461024f57806330e9012c1461026f578063318b1b801461028457600080fd5b80631661a2e91161016b5780631661a2e9146101f25780631d8a4e92146102125780632b96b8391461022857600080fd5b806303dbe68c146101875780631481a724146101cb575b600080fd5b6101ae7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6101ae7f000000000000000000000000000000000000000000000000000000000000000081565b610205610200366004611260565b61044c565b6040516101c29190611408565b61021a610567565b6040519081526020016101c2565b6101ae7f000000000000000000000000000000000000000000000000000000000000000081565b61026261025d3660046114dc565b6105f0565b6040516101c2919061156c565b6102776106a6565b6040516101c2919061157f565b6101ae6102923660046116b3565b61079a565b6101ae7f000000000000000000000000000000000000000000000000000000000000000081565b6102d16102cc3660046116cc565b610845565b005b60408051808201909152600581527f342e302e300000000000000000000000000000000000000000000000000000006020820152610262565b61031f61031a366004611708565b610943565b6040516101c29190611744565b6101ae7f000000000000000000000000000000000000000000000000000000000000000081565b6101ae7f000000000000000000000000000000000000000000000000000000000000000081565b610262610388366004611881565b610a85565b6103a061039b3660046116b3565b610b36565b60405190151581526020016101c2565b6102d16103be36600461191b565b610bdb565b6102d16103d1366004611949565b610ce7565b6103de610de0565b6040516101c29190611a10565b6101ae7f000000000000000000000000000000000000000000000000000000000000000081565b6101ae7f000000000000000000000000000000000000000000000000000000000000000081565b6102d1610447366004611b33565b610ecc565b60606001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036104b0576040517f0a57d61d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000826040516024016104c39190611bf7565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1661a2e900000000000000000000000000000000000000000000000000000000179052905060006105497f000000000000000000000000000000000000000000000000000000000000000083610fc1565b90508080602001905181019061055f9190611d44565b949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631d8a4e926040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105eb9190611e0d565b905090565b6040517f30d148880000000000000000000000000000000000000000000000000000000081526060906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906330d148889061065a9086908690600401611e26565b600060405180830381865afa158015610677573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261069f9190810190611e71565b9392505050565b604080516101c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a08101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166330e9012c6040518163ffffffff1660e01b81526004016101c060405180830381865afa158015610776573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105eb9190611ee8565b6040517f318b1b80000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063318b1b8090602401602060405180830381865afa15801561081b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083f9190611ff8565b92915050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036108a7576040517f0a57d61d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816040516024016108ba91906120ed565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f3fe13f3f00000000000000000000000000000000000000000000000000000000179052905061093e7f000000000000000000000000000000000000000000000000000000000000000082610fc1565b505050565b604080516101e081018252600080825260208201819052818301819052606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a082018190526101c082015290517fb2e48a3f0000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b2e48a3f90610a419085907f0000000000000000000000000000000000000000000000000000000000000000903390600401612300565b6101e0604051808303816000875af1158015610a61573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083f91906124b5565b6040517f67cda69c0000000000000000000000000000000000000000000000000000000081526060906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906367cda69c90610af1908790879087906004016125cc565b600060405180830381865afa158015610b0e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261055f9190810190611e71565b6040517f78ecabce000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906378ecabce90602401602060405180830381865afa158015610bb7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083f9190612636565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610c3d576040517f0a57d61d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b0380841660248301528216604482015260009060640160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb0b807eb000000000000000000000000000000000000000000000000000000001790529050610ce17f000000000000000000000000000000000000000000000000000000000000000082610fc1565b50505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610d49576040517f0a57d61d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081604051602401610d5c9190612653565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb23cc04400000000000000000000000000000000000000000000000000000000179052905061093e7f000000000000000000000000000000000000000000000000000000000000000082610fc1565b604080516101a081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101829052610140810182905261016081018290526101808101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b51f9c2b6040518163ffffffff1660e01b81526004016101a060405180830381865afa158015610ea8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105eb91906126a8565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610f2e576040517f0a57d61d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081604051602401610f41919061279b565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fff2dd5a100000000000000000000000000000000000000000000000000000000179052905061093e7f0000000000000000000000000000000000000000000000000000000000000000825b6060600080846001600160a01b031684604051610fde91906127f3565b600060405180830381855af49150503d8060008114611019576040519150601f19603f3d011682016040523d82523d6000602084013e61101e565b606091505b50915091508161055f57805160208201fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516101a0810167ffffffffffffffff8111828210171561108357611083611030565b60405290565b6040805190810167ffffffffffffffff8111828210171561108357611083611030565b6040516060810167ffffffffffffffff8111828210171561108357611083611030565b6040516101c0810167ffffffffffffffff8111828210171561108357611083611030565b6040516101e0810167ffffffffffffffff8111828210171561108357611083611030565b604051601f8201601f1916810167ffffffffffffffff8111828210171561114057611140611030565b604052919050565b600067ffffffffffffffff82111561116257611162611030565b5060051b60200190565b600067ffffffffffffffff82111561118657611186611030565b50601f01601f191660200190565b600082601f8301126111a557600080fd5b81356111b86111b38261116c565b611117565b8181528460208386010111156111cd57600080fd5b816020850160208301376000918101602001919091529392505050565b6001600160a01b03811681146111ff57600080fd5b50565b803561120d816111ea565b919050565b803563ffffffff8116811461120d57600080fd5b67ffffffffffffffff811681146111ff57600080fd5b803561120d81611226565b80151581146111ff57600080fd5b803561120d81611247565b6000602080838503121561127357600080fd5b823567ffffffffffffffff8082111561128b57600080fd5b818501915085601f83011261129f57600080fd5b81356112ad6111b382611148565b81815260059190911b830184019084810190888311156112cc57600080fd5b8585015b838110156113fb578035858111156112e85760008081fd5b86016101a0818c03601f19018113156113015760008081fd5b61130961105f565b898301358881111561131b5760008081fd5b6113298e8c83870101611194565b8252506040611339818501611202565b8b830152606061134a818601611202565b828401526080915061135d828601611202565b9083015260a061136e858201611212565b8284015260c0915081850135818401525060e0808501358284015261010091508185013581840152506101206113a581860161123c565b8284015261014091506113b982860161123c565b8184015250610160808501358284015261018091506113d9828601611202565b908301526113e8848401611255565b90820152855250509186019186016112d0565b5098975050505050505050565b602080825282518282018190526000919060409081850190868401855b8281101561145757815180516001600160a01b0390811686529087015116868501529284019290850190600101611425565b5091979650505050505050565b60006080828403121561147657600080fd5b6040516080810181811067ffffffffffffffff8211171561149957611499611030565b60405290508082356114aa816111ea565b815260208301356114ba816111ea565b8060208301525060408301356040820152606083013560608201525092915050565b60008060a083850312156114ef57600080fd5b6114f98484611464565b9150608083013561150981611247565b809150509250929050565b60005b8381101561152f578181015183820152602001611517565b83811115610ce15750506000910152565b60008151808452611558816020860160208601611514565b601f01601f19169290920160200192915050565b60208152600061069f6020830184611540565b81516001600160a01b031681526101c0810160208301516115ab60208401826001600160a01b03169052565b5060408301516115c660408401826001600160a01b03169052565b5060608301516115e160608401826001600160a01b03169052565b5060808301516115fc60808401826001600160a01b03169052565b5060a083015161161760a08401826001600160a01b03169052565b5060c083015161163260c08401826001600160a01b03169052565b5060e083015161164d60e08401826001600160a01b03169052565b50610100838101516001600160a01b0390811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a08085015191821681850152905b505092915050565b6000602082840312156116c557600080fd5b5035919050565b6000602082840312156116de57600080fd5b813567ffffffffffffffff8111156116f557600080fd5b8201610160818503121561069f57600080fd5b60006020828403121561171a57600080fd5b813567ffffffffffffffff81111561173157600080fd5b8201610240818503121561069f57600080fd5b81516001600160a01b031681526101e08101602083015161177060208401826001600160a01b03169052565b50604083015161178b60408401826001600160a01b03169052565b5060608301516117a660608401826001600160a01b03169052565b5060808301516117c160808401826001600160a01b03169052565b5060a08301516117dc60a08401826001600160a01b03169052565b5060c08301516117f760c08401826001600160a01b03169052565b5060e083015161181260e08401826001600160a01b03169052565b50610100838101516001600160a01b0390811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c08085015191821681850152906116ab565b600080600083850360e081121561189757600080fd5b6118a18686611464565b935060808501356118b181611247565b925060407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60820112156118e357600080fd5b506118ec611089565b60a08501356118fa816111ea565b815260c085013561190a816111ea565b602082015292959194509192509050565b6000806040838503121561192e57600080fd5b8235611939816111ea565b91506020830135611509816111ea565b6000602080838503121561195c57600080fd5b823567ffffffffffffffff81111561197357600080fd5b8301601f8101851361198457600080fd5b80356119926111b382611148565b818152606091820283018401918482019190888411156119b157600080fd5b938501935b83851015611a045780858a0312156119ce5760008081fd5b6119d66110ac565b85356119e1816111ea565b8152858701358782015260408087013590820152835293840193918501916119b6565b50979650505050505050565b81516001600160a01b031681526101a081016020830151611a3c60208401826001600160a01b03169052565b506040830151611a5760408401826001600160a01b03169052565b506060830151611a7260608401826001600160a01b03169052565b506080830151611a8d60808401826001600160a01b03169052565b5060a0830151611aa860a08401826001600160a01b03169052565b5060c0830151611ac360c08401826001600160a01b03169052565b5060e0830151611ade60e08401826001600160a01b03169052565b50610100838101516001600160a01b03908116918401919091526101208085015182169084015261014080850151821690840152610160808501518216908401526101808085015191821681850152906116ab565b60006020808385031215611b4657600080fd5b823567ffffffffffffffff811115611b5d57600080fd5b8301601f81018513611b6e57600080fd5b8035611b7c6111b382611148565b81815260609182028301840191848201919088841115611b9b57600080fd5b938501935b83851015611a045780858a031215611bb85760008081fd5b611bc06110ac565b8535611bcb816111ea565b815285870135611bda816111ea565b818801526040868101359082015283529384019391850191611ba0565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015611d2b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc089840301855281516101a08151818652611c6382870182611540565b91505088820151611c7e8a8701826001600160a01b03169052565b50878201516001600160a01b03908116868a015260608084015182169087015260808084015163ffffffff169087015260a0808401519087015260c0808401519087015260e080840151908701526101008084015167ffffffffffffffff9081169188019190915261012080850151909116908701526101408084015190870152610160808401519091169086015261018091820151151591909401529386019390860190600101611c1e565b509098975050505050505050565b805161120d816111ea565b60006020808385031215611d5757600080fd5b825167ffffffffffffffff811115611d6e57600080fd5b8301601f81018513611d7f57600080fd5b8051611d8d6111b382611148565b81815260069190911b82018301908381019087831115611dac57600080fd5b928401925b82841015611e025760408489031215611dca5760008081fd5b611dd2611089565b8451611ddd816111ea565b815284860151611dec816111ea565b8187015282526040939093019290840190611db1565b979650505050505050565b600060208284031215611e1f57600080fd5b5051919050565b60a08101611e6282856001600160a01b038082511683528060208301511660208401525060408101516040830152606081015160608301525050565b82151560808301529392505050565b600060208284031215611e8357600080fd5b815167ffffffffffffffff811115611e9a57600080fd5b8201601f81018413611eab57600080fd5b8051611eb96111b38261116c565b818152856020838501011115611ece57600080fd5b611edf826020830160208601611514565b95945050505050565b60006101c08284031215611efb57600080fd5b611f036110cf565b611f0c83611d39565b8152611f1a60208401611d39565b6020820152611f2b60408401611d39565b6040820152611f3c60608401611d39565b6060820152611f4d60808401611d39565b6080820152611f5e60a08401611d39565b60a0820152611f6f60c08401611d39565b60c0820152611f8060e08401611d39565b60e0820152610100611f93818501611d39565b90820152610120611fa5848201611d39565b90820152610140611fb7848201611d39565b90820152610160611fc9848201611d39565b90820152610180611fdb848201611d39565b908201526101a0611fed848201611d39565b908201529392505050565b60006020828403121561200a57600080fd5b815161069f816111ea565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261204a57600080fd5b830160208101925035905067ffffffffffffffff81111561206a57600080fd5b60608102360382131561207c57600080fd5b9250929050565b8183526000602080850194508260005b858110156120e25781356120a6816111ea565b6001600160a01b03908116885282840135906120c1826111ea565b16878401526040828101359088015260609687019690910190600101612093565b509495945050505050565b60208152600082356120fe81611247565b80151560208401525060208301356040830152604083013560608301526060830135612129816111ea565b6001600160a01b03808216608085015260808501359150612149826111ea565b80821660a0850152505060a083013560c083015260c083013560e083015261010060e08401358184015280840135905061218281611226565b61012067ffffffffffffffff82168185015261219f81860161123c565b9150506101406121ba8185018367ffffffffffffffff169052565b6121c681860186612015565b6101608681015292509050611edf61018085018383612083565b80356121eb816111ea565b6001600160a01b039081168352602082013590612207826111ea565b908116602084015260408201359061221e826111ea565b9081166040840152606082013590612235826111ea565b908116606084015260808201359061224c826111ea565b908116608084015260a082013590612263826111ea565b80821660a085015250505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126122a657600080fd5b830160208101925035905067ffffffffffffffff8111156122c657600080fd5b80360382131561207c57600080fd5b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b6060815261231160608201856121e0565b600061231f60c08601611212565b6101206123338185018363ffffffff169052565b61233f60e08801611212565b91506101406123558186018463ffffffff169052565b61016092506101008801358386015261237082890189612271565b9250610240610180818189015261238c6102a0890186856122d5565b945061239a848c018c612271565b945092506101a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa089870301818a01526123d58686866122d5565b95506123e2878d0161123c565b96506101c094506123fe858a018867ffffffffffffffff169052565b612409828d01611212565b96506101e09350612421848a018863ffffffff169052565b6102009650808c0135878a01525050610220838b013581890152828b01358289015261244e868c0161123c565b67ffffffffffffffff81166102608a0152955061246c818c0161123c565b95505050505061248961028085018367ffffffffffffffff169052565b6001600160a01b038616602085015291506124a19050565b6001600160a01b038316604083015261055f565b60006101e082840312156124c857600080fd5b6124d06110f3565b6124d983611d39565b81526124e760208401611d39565b60208201526124f860408401611d39565b604082015261250960608401611d39565b606082015261251a60808401611d39565b608082015261252b60a08401611d39565b60a082015261253c60c08401611d39565b60c082015261254d60e08401611d39565b60e0820152610100612560818501611d39565b90820152610120612572848201611d39565b90820152610140612584848201611d39565b90820152610160612596848201611d39565b908201526101806125a8848201611d39565b908201526101a06125ba848201611d39565b908201526101c0611fed848201611d39565b60e0810161260882866001600160a01b038082511683528060208301511660208401525060408101516040830152606081015160608301525050565b83151560808301526001600160a01b038084511660a08401528060208501511660c084015250949350505050565b60006020828403121561264857600080fd5b815161069f81611247565b602080825282518282018190526000919060409081850190868401855b8281101561145757815180516001600160a01b0316855286810151878601528501518585015260609093019290850190600101612670565b60006101a082840312156126bb57600080fd5b6126c361105f565b6126cc83611d39565b81526126da60208401611d39565b60208201526126eb60408401611d39565b60408201526126fc60608401611d39565b606082015261270d60808401611d39565b608082015261271e60a08401611d39565b60a082015261272f60c08401611d39565b60c082015261274060e08401611d39565b60e0820152610100612753818501611d39565b90820152610120612765848201611d39565b90820152610140612777848201611d39565b90820152610160612789848201611d39565b90820152610180611fed848201611d39565b602080825282518282018190526000919060409081850190868401855b8281101561145757815180516001600160a01b03908116865287820151168786015285015185850152606090930192908501906001016127b8565b60008251612805818460208701611514565b919091019291505056fea164736f6c634300080f000a", + 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", } // OPContractsManagerABI is the input ABI used to generate the binding from. @@ -194,7 +198,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, _l1PAO 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, _superchainProxyAdmin common.Address) (common.Address, *types.Transaction, *OPContractsManager, error) { parsed, err := OPContractsManagerMetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err @@ -203,7 +207,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, _l1PAO) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(OPContractsManagerBin), backend, _opcmGameTypeAdder, _opcmDeployer, _opcmUpgrader, _opcmInteropMigrator, _opcmStandardValidator, _superchainConfig, _protocolVersions, _superchainProxyAdmin) if err != nil { return common.Address{}, nil, nil, err } @@ -755,9 +759,9 @@ func (_OPContractsManager *OPContractsManagerCallerSession) SuperchainProxyAdmin return _OPContractsManager.Contract.SuperchainProxyAdmin(&_OPContractsManager.CallOpts) } -// Validate is a free data retrieval call binding the contract method 0x30d14888. +// Validate is a free data retrieval call binding the contract method 0xa9008b69. // -// Solidity: function validate((address,address,bytes32,uint256) _input, bool _allowFailure) view returns(string) +// 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) { var out []interface{} err := _OPContractsManager.contract.Call(opts, &out, "validate", _input, _allowFailure) @@ -772,23 +776,23 @@ func (_OPContractsManager *OPContractsManagerCaller) Validate(opts *bind.CallOpt } -// Validate is a free data retrieval call binding the contract method 0x30d14888. +// Validate is a free data retrieval call binding the contract method 0xa9008b69. // -// Solidity: function validate((address,address,bytes32,uint256) _input, bool _allowFailure) view returns(string) +// 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) } -// Validate is a free data retrieval call binding the contract method 0x30d14888. +// Validate is a free data retrieval call binding the contract method 0xa9008b69. // -// Solidity: function validate((address,address,bytes32,uint256) _input, bool _allowFailure) view returns(string) +// 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) } -// ValidateWithOverrides is a free data retrieval call binding the contract method 0x67cda69c. +// ValidateWithOverrides is a free data retrieval call binding the contract method 0xb806c805. // -// Solidity: function validateWithOverrides((address,address,bytes32,uint256) _input, bool _allowFailure, (address,address) _overrides) view returns(string) +// Solidity: function validateWithOverrides((address,bytes32,uint256) _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) @@ -803,16 +807,16 @@ func (_OPContractsManager *OPContractsManagerCaller) ValidateWithOverrides(opts } -// ValidateWithOverrides is a free data retrieval call binding the contract method 0x67cda69c. +// ValidateWithOverrides is a free data retrieval call binding the contract method 0xb806c805. // -// Solidity: function validateWithOverrides((address,address,bytes32,uint256) _input, bool _allowFailure, (address,address) _overrides) view returns(string) +// Solidity: function validateWithOverrides((address,bytes32,uint256) _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 0x67cda69c. +// ValidateWithOverrides is a free data retrieval call binding the contract method 0xb806c805. // -// Solidity: function validateWithOverrides((address,address,bytes32,uint256) _input, bool _allowFailure, (address,address) _overrides) view returns(string) +// Solidity: function validateWithOverrides((address,bytes32,uint256) _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) } @@ -848,23 +852,23 @@ func (_OPContractsManager *OPContractsManagerCallerSession) Version() (string, e return _OPContractsManager.Contract.Version(&_OPContractsManager.CallOpts) } -// AddGameType is a paid mutator transaction binding the contract method 0x1661a2e9. +// AddGameType is a paid mutator transaction binding the contract method 0x604aa628. // -// Solidity: function addGameType((string,address,address,address,uint32,bytes32,uint256,uint256,uint64,uint64,uint256,address,bool)[] _gameConfigs) returns((address,address)[]) +// Solidity: function addGameType((string,address,address,uint32,bytes32,uint256,uint256,uint64,uint64,uint256,address,bool)[] _gameConfigs) returns((address,address)[]) func (_OPContractsManager *OPContractsManagerTransactor) AddGameType(opts *bind.TransactOpts, _gameConfigs []OPContractsManagerAddGameInput) (*types.Transaction, error) { return _OPContractsManager.contract.Transact(opts, "addGameType", _gameConfigs) } -// AddGameType is a paid mutator transaction binding the contract method 0x1661a2e9. +// AddGameType is a paid mutator transaction binding the contract method 0x604aa628. // -// Solidity: function addGameType((string,address,address,address,uint32,bytes32,uint256,uint256,uint64,uint64,uint256,address,bool)[] _gameConfigs) returns((address,address)[]) +// Solidity: function addGameType((string,address,address,uint32,bytes32,uint256,uint256,uint64,uint64,uint256,address,bool)[] _gameConfigs) returns((address,address)[]) func (_OPContractsManager *OPContractsManagerSession) AddGameType(_gameConfigs []OPContractsManagerAddGameInput) (*types.Transaction, error) { return _OPContractsManager.Contract.AddGameType(&_OPContractsManager.TransactOpts, _gameConfigs) } -// AddGameType is a paid mutator transaction binding the contract method 0x1661a2e9. +// AddGameType is a paid mutator transaction binding the contract method 0x604aa628. // -// Solidity: function addGameType((string,address,address,address,uint32,bytes32,uint256,uint256,uint64,uint64,uint256,address,bool)[] _gameConfigs) returns((address,address)[]) +// Solidity: function addGameType((string,address,address,uint32,bytes32,uint256,uint256,uint64,uint64,uint256,address,bool)[] _gameConfigs) returns((address,address)[]) func (_OPContractsManager *OPContractsManagerTransactorSession) AddGameType(_gameConfigs []OPContractsManagerAddGameInput) (*types.Transaction, error) { return _OPContractsManager.Contract.AddGameType(&_OPContractsManager.TransactOpts, _gameConfigs) } @@ -890,65 +894,86 @@ func (_OPContractsManager *OPContractsManagerTransactorSession) Deploy(_input OP return _OPContractsManager.Contract.Deploy(&_OPContractsManager.TransactOpts, _input) } -// Migrate is a paid mutator transaction binding the contract method 0x3fe13f3f. +// Migrate is a paid mutator transaction binding the contract method 0x6d510c5e. // -// Solidity: function migrate((bool,(bytes32,uint256),(address,address,uint256,uint256,uint256,uint64,uint64),(address,address,bytes32)[]) _input) returns() +// Solidity: function migrate((bool,(bytes32,uint256),(address,address,uint256,uint256,uint256,uint64,uint64),(address,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 0x3fe13f3f. +// Migrate is a paid mutator transaction binding the contract method 0x6d510c5e. // -// Solidity: function migrate((bool,(bytes32,uint256),(address,address,uint256,uint256,uint256,uint64,uint64),(address,address,bytes32)[]) _input) returns() +// Solidity: function migrate((bool,(bytes32,uint256),(address,address,uint256,uint256,uint256,uint64,uint64),(address,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 0x3fe13f3f. +// Migrate is a paid mutator transaction binding the contract method 0x6d510c5e. // -// Solidity: function migrate((bool,(bytes32,uint256),(address,address,uint256,uint256,uint256,uint64,uint64),(address,address,bytes32)[]) _input) returns() +// Solidity: function migrate((bool,(bytes32,uint256),(address,address,uint256,uint256,uint256,uint64,uint64),(address,bytes32)[]) _input) returns() func (_OPContractsManager *OPContractsManagerTransactorSession) Migrate(_input OPContractsManagerInteropMigratorMigrateInput) (*types.Transaction, error) { return _OPContractsManager.Contract.Migrate(&_OPContractsManager.TransactOpts, _input) } -// UpdatePrestate is a paid mutator transaction binding the contract method 0x9a72745b. +// UpdatePrestate is a paid mutator transaction binding the contract method 0xb23cc044. // -// Solidity: function updatePrestate((address,address,bytes32)[] _prestateUpdateInputs) returns() -func (_OPContractsManager *OPContractsManagerTransactor) UpdatePrestate(opts *bind.TransactOpts, _prestateUpdateInputs []OPContractsManagerOpChainConfig) (*types.Transaction, error) { +// Solidity: function updatePrestate((address,bytes32,bytes32)[] _prestateUpdateInputs) returns() +func (_OPContractsManager *OPContractsManagerTransactor) UpdatePrestate(opts *bind.TransactOpts, _prestateUpdateInputs []OPContractsManagerUpdatePrestateInput) (*types.Transaction, error) { return _OPContractsManager.contract.Transact(opts, "updatePrestate", _prestateUpdateInputs) } -// UpdatePrestate is a paid mutator transaction binding the contract method 0x9a72745b. +// UpdatePrestate is a paid mutator transaction binding the contract method 0xb23cc044. // -// Solidity: function updatePrestate((address,address,bytes32)[] _prestateUpdateInputs) returns() -func (_OPContractsManager *OPContractsManagerSession) UpdatePrestate(_prestateUpdateInputs []OPContractsManagerOpChainConfig) (*types.Transaction, error) { +// Solidity: function updatePrestate((address,bytes32,bytes32)[] _prestateUpdateInputs) returns() +func (_OPContractsManager *OPContractsManagerSession) UpdatePrestate(_prestateUpdateInputs []OPContractsManagerUpdatePrestateInput) (*types.Transaction, error) { return _OPContractsManager.Contract.UpdatePrestate(&_OPContractsManager.TransactOpts, _prestateUpdateInputs) } -// UpdatePrestate is a paid mutator transaction binding the contract method 0x9a72745b. +// UpdatePrestate is a paid mutator transaction binding the contract method 0xb23cc044. // -// Solidity: function updatePrestate((address,address,bytes32)[] _prestateUpdateInputs) returns() -func (_OPContractsManager *OPContractsManagerTransactorSession) UpdatePrestate(_prestateUpdateInputs []OPContractsManagerOpChainConfig) (*types.Transaction, error) { +// Solidity: function updatePrestate((address,bytes32,bytes32)[] _prestateUpdateInputs) returns() +func (_OPContractsManager *OPContractsManagerTransactorSession) UpdatePrestate(_prestateUpdateInputs []OPContractsManagerUpdatePrestateInput) (*types.Transaction, error) { return _OPContractsManager.Contract.UpdatePrestate(&_OPContractsManager.TransactOpts, _prestateUpdateInputs) } -// Upgrade is a paid mutator transaction binding the contract method 0xff2dd5a1. +// Upgrade is a paid mutator transaction binding the contract method 0x0b8bd7cb. // -// Solidity: function upgrade((address,address,bytes32)[] _opChainConfigs) returns() +// Solidity: function upgrade((address,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 0xff2dd5a1. +// Upgrade is a paid mutator transaction binding the contract method 0x0b8bd7cb. // -// Solidity: function upgrade((address,address,bytes32)[] _opChainConfigs) returns() +// Solidity: function upgrade((address,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 0xff2dd5a1. +// Upgrade is a paid mutator transaction binding the contract method 0x0b8bd7cb. // -// Solidity: function upgrade((address,address,bytes32)[] _opChainConfigs) returns() +// Solidity: function upgrade((address,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. +// +// 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) +} + +// UpgradeSuperchainConfig is a paid mutator transaction binding the contract method 0xb0b807eb. +// +// 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) +} + +// UpgradeSuperchainConfig is a paid mutator transaction binding the contract method 0xb0b807eb. +// +// 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) +} diff --git a/packages/contracts-bedrock/interfaces/L1/IOPContractsManager.sol b/packages/contracts-bedrock/interfaces/L1/IOPContractsManager.sol index 697f1a30b55d3..fa463cea67c14 100644 --- a/packages/contracts-bedrock/interfaces/L1/IOPContractsManager.sol +++ b/packages/contracts-bedrock/interfaces/L1/IOPContractsManager.sol @@ -221,7 +221,6 @@ interface IOPContractsManager { /// @notice The input required to identify a chain for upgrading. struct OpChainConfig { ISystemConfig systemConfigProxy; - IProxyAdmin proxyAdmin; Claim absolutePrestate; } @@ -235,7 +234,6 @@ interface IOPContractsManager { struct AddGameInput { string saltMixer; ISystemConfig systemConfig; - IProxyAdmin proxyAdmin; IDelayedWETH delayedWETH; GameType disputeGameType; Claim disputeAbsolutePrestate; diff --git a/packages/contracts-bedrock/interfaces/L1/IOPContractsManagerStandardValidator.sol b/packages/contracts-bedrock/interfaces/L1/IOPContractsManagerStandardValidator.sol index 6820c1b3acdd7..71f54bc521360 100644 --- a/packages/contracts-bedrock/interfaces/L1/IOPContractsManagerStandardValidator.sol +++ b/packages/contracts-bedrock/interfaces/L1/IOPContractsManagerStandardValidator.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.0; // Interfaces import { ISuperchainConfig } from "interfaces/L1/ISuperchainConfig.sol"; import { ISystemConfig } from "interfaces/L1/ISystemConfig.sol"; -import { IProxyAdmin } from "interfaces/universal/IProxyAdmin.sol"; interface IOPContractsManagerStandardValidator { struct Implementations { @@ -23,7 +22,6 @@ interface IOPContractsManagerStandardValidator { } struct ValidationInput { - IProxyAdmin proxyAdmin; ISystemConfig sysCfg; bytes32 absolutePrestate; uint256 l2ChainID; @@ -31,7 +29,6 @@ interface IOPContractsManagerStandardValidator { } struct ValidationInputDev { - IProxyAdmin proxyAdmin; ISystemConfig sysCfg; bytes32 cannonPrestate; bytes32 cannonKonaPrestate; @@ -83,9 +80,9 @@ interface IOPContractsManagerStandardValidator { bool _allowFailure, ValidationOverrides memory _overrides ) - external - view - returns (string memory); + external + view + returns (string memory); function validate(ValidationInputDev memory _input, bool _allowFailure) external view returns (string memory); diff --git a/packages/contracts-bedrock/scripts/deploy/AddGameType.s.sol b/packages/contracts-bedrock/scripts/deploy/AddGameType.s.sol index 5d65d1111cdcc..f4956c6b4bdf5 100644 --- a/packages/contracts-bedrock/scripts/deploy/AddGameType.s.sol +++ b/packages/contracts-bedrock/scripts/deploy/AddGameType.s.sol @@ -8,9 +8,8 @@ import { Script } from "forge-std/Script.sol"; import { DeployUtils } from "scripts/libraries/DeployUtils.sol"; // Interfaces -import { OPContractsManager } from "src/L1/OPContractsManager.sol"; +import { IOPContractsManager } from "interfaces/L1/IOPContractsManager.sol"; import { ISystemConfig } from "interfaces/L1/ISystemConfig.sol"; -import { IProxyAdmin } from "interfaces/universal/IProxyAdmin.sol"; import { IDelayedWETH } from "interfaces/dispute/IDelayedWETH.sol"; import { IBigStepper } from "interfaces/dispute/IBigStepper.sol"; import { GameType, Duration, Claim } from "src/dispute/lib/Types.sol"; @@ -22,11 +21,9 @@ contract AddGameType is Script { // Address that will be used for the DummyCaller contract address prank; // OPCM contract address - OPContractsManager opcmImpl; + IOPContractsManager opcmImpl; // SystemConfig contract address ISystemConfig systemConfigProxy; - // ProxyAdmin contract address - IProxyAdmin opChainProxyAdmin; // DelayedWETH contract address (optional) IDelayedWETH delayedWETHProxy; // Game type to add @@ -57,12 +54,19 @@ contract AddGameType is Script { } function run(Input memory _agi) public returns (Output memory) { + // Etch DummyCaller contract + address prank = _agi.prank; + + bytes memory code = vm.getDeployedCode("AddGameType.s.sol:DummyCaller"); + vm.etch(prank, code); + vm.store(prank, bytes32(0), bytes32(uint256(uint160(address(_agi.opcmImpl))))); + vm.label(prank, "DummyCaller"); + // Create the game input - OPContractsManager.AddGameInput[] memory gameConfigs = new OPContractsManager.AddGameInput[](1); - gameConfigs[0] = OPContractsManager.AddGameInput({ + IOPContractsManager.AddGameInput[] memory gameConfigs = new IOPContractsManager.AddGameInput[](1); + gameConfigs[0] = IOPContractsManager.AddGameInput({ saltMixer: _agi.saltMixer, systemConfig: _agi.systemConfigProxy, - proxyAdmin: _agi.opChainProxyAdmin, delayedWETH: _agi.delayedWETHProxy, disputeGameType: _agi.disputeGameType, disputeAbsolutePrestate: _agi.disputeAbsolutePrestate, @@ -75,20 +79,14 @@ contract AddGameType is Script { permissioned: _agi.permissioned }); - // Etch DummyCaller contract - address prank = _agi.prank; - bytes memory code = vm.getDeployedCode("AddGameType.s.sol:DummyCaller"); - vm.etch(prank, code); - vm.store(prank, bytes32(0), bytes32(uint256(uint160(address(_agi.opcmImpl))))); - vm.label(prank, "DummyCaller"); - // Call into the DummyCaller to perform the delegatecall vm.broadcast(msg.sender); + (bool success, bytes memory result) = DummyCaller(prank).addGameType(gameConfigs); require(success, "AddGameType: addGameType failed"); // Decode the result and set it in the output - OPContractsManager.AddGameOutput[] memory outputs = abi.decode(result, (OPContractsManager.AddGameOutput[])); + IOPContractsManager.AddGameOutput[] memory outputs = abi.decode(result, (IOPContractsManager.AddGameOutput[])); require(outputs.length == 1, "AddGameType: unexpected number of outputs"); return Output({ delayedWETHProxy: outputs[0].delayedWETH, faultDisputeGameProxy: outputs[0].faultDisputeGame }); } @@ -100,10 +98,16 @@ contract AddGameType is Script { } /// @title DummyCaller +/// @notice This contract is used to mimic the contract that is used as the source of the delegatecall to the OPCM. +/// @dev This contract is used for OPCM versions 4.1.0 and above. + contract DummyCaller { address internal _opcmAddr; - function addGameType(OPContractsManager.AddGameInput[] memory _gameConfigs) external returns (bool, bytes memory) { + function addGameType(IOPContractsManager.AddGameInput[] memory _gameConfigs) + external + returns (bool, bytes memory) + { bytes memory data = abi.encodeCall(DummyCaller.addGameType, _gameConfigs); (bool success, bytes memory result) = _opcmAddr.delegatecall(data); return (success, result); diff --git a/packages/contracts-bedrock/scripts/deploy/GenerateOPCMMigrateCalldata.sol b/packages/contracts-bedrock/scripts/deploy/GenerateOPCMMigrateCalldata.sol index 50ad81865add4..fa1d356ee9f0a 100644 --- a/packages/contracts-bedrock/scripts/deploy/GenerateOPCMMigrateCalldata.sol +++ b/packages/contracts-bedrock/scripts/deploy/GenerateOPCMMigrateCalldata.sol @@ -2,7 +2,6 @@ pragma solidity 0.8.15; import { Script } from "forge-std/Script.sol"; -import { IProxyAdmin } from "interfaces/universal/IProxyAdmin.sol"; import { ISystemConfig } from "interfaces/L1/ISystemConfig.sol"; import { IOPContractsManagerInteropMigrator, IOPContractsManager } from "interfaces/L1/IOPContractsManager.sol"; import { Claim, Duration, Proposal, Hash } from "src/dispute/lib/Types.sol"; @@ -121,17 +120,12 @@ contract GenerateOPCMMigrateCalldata is Script { for (uint256 i = 0; i < j.length; i++) { opChainConfigs[i] = IOPContractsManager.OpChainConfig({ systemConfigProxy: ISystemConfig(j[i].systemConfigProxy), - proxyAdmin: IProxyAdmin(j[i].proxyAdmin), absolutePrestate: Claim.wrap(absolutePrestate) }); require( opChainConfigs[i].systemConfigProxy != ISystemConfig(address(0)), "GenerateOPCMMigrateCalldata: systemConfigProxy cannot be 0" ); - require( - opChainConfigs[i].proxyAdmin != IProxyAdmin(address(0)), - "GenerateOPCMMigrateCalldata: proxyAdmin cannot be 0" - ); } return IOPContractsManagerInteropMigrator.MigrateInput({ diff --git a/packages/contracts-bedrock/snapshots/abi/OPContractsManager.json b/packages/contracts-bedrock/snapshots/abi/OPContractsManager.json index cd167bfb29e42..fb4b911ceb72f 100644 --- a/packages/contracts-bedrock/snapshots/abi/OPContractsManager.json +++ b/packages/contracts-bedrock/snapshots/abi/OPContractsManager.json @@ -54,11 +54,6 @@ "name": "systemConfig", "type": "address" }, - { - "internalType": "contract IProxyAdmin", - "name": "proxyAdmin", - "type": "address" - }, { "internalType": "contract IDelayedWETH", "name": "delayedWETH", @@ -624,11 +619,6 @@ "name": "systemConfigProxy", "type": "address" }, - { - "internalType": "contract IProxyAdmin", - "name": "proxyAdmin", - "type": "address" - }, { "internalType": "Claim", "name": "absolutePrestate", @@ -780,11 +770,6 @@ "name": "systemConfigProxy", "type": "address" }, - { - "internalType": "contract IProxyAdmin", - "name": "proxyAdmin", - "type": "address" - }, { "internalType": "Claim", "name": "absolutePrestate", @@ -818,11 +803,6 @@ "inputs": [ { "components": [ - { - "internalType": "contract IProxyAdmin", - "name": "proxyAdmin", - "type": "address" - }, { "internalType": "contract ISystemConfig", "name": "sysCfg", @@ -869,11 +849,6 @@ "inputs": [ { "components": [ - { - "internalType": "contract IProxyAdmin", - "name": "proxyAdmin", - "type": "address" - }, { "internalType": "contract ISystemConfig", "name": "sysCfg", @@ -925,11 +900,6 @@ "inputs": [ { "components": [ - { - "internalType": "contract IProxyAdmin", - "name": "proxyAdmin", - "type": "address" - }, { "internalType": "contract ISystemConfig", "name": "sysCfg", @@ -993,11 +963,6 @@ "inputs": [ { "components": [ - { - "internalType": "contract IProxyAdmin", - "name": "proxyAdmin", - "type": "address" - }, { "internalType": "contract ISystemConfig", "name": "sysCfg", diff --git a/packages/contracts-bedrock/snapshots/abi/OPContractsManagerGameTypeAdder.json b/packages/contracts-bedrock/snapshots/abi/OPContractsManagerGameTypeAdder.json index 444a1c2817c85..16debf40454f8 100644 --- a/packages/contracts-bedrock/snapshots/abi/OPContractsManagerGameTypeAdder.json +++ b/packages/contracts-bedrock/snapshots/abi/OPContractsManagerGameTypeAdder.json @@ -24,11 +24,6 @@ "name": "systemConfig", "type": "address" }, - { - "internalType": "contract IProxyAdmin", - "name": "proxyAdmin", - "type": "address" - }, { "internalType": "contract IDelayedWETH", "name": "delayedWETH", diff --git a/packages/contracts-bedrock/snapshots/abi/OPContractsManagerInteropMigrator.json b/packages/contracts-bedrock/snapshots/abi/OPContractsManagerInteropMigrator.json index 3d0eee9abde67..ba80999f0628d 100644 --- a/packages/contracts-bedrock/snapshots/abi/OPContractsManagerInteropMigrator.json +++ b/packages/contracts-bedrock/snapshots/abi/OPContractsManagerInteropMigrator.json @@ -327,11 +327,6 @@ "name": "systemConfigProxy", "type": "address" }, - { - "internalType": "contract IProxyAdmin", - "name": "proxyAdmin", - "type": "address" - }, { "internalType": "Claim", "name": "absolutePrestate", diff --git a/packages/contracts-bedrock/snapshots/abi/OPContractsManagerStandardValidator.json b/packages/contracts-bedrock/snapshots/abi/OPContractsManagerStandardValidator.json index 45c3b77e14589..7d149dff61c7b 100644 --- a/packages/contracts-bedrock/snapshots/abi/OPContractsManagerStandardValidator.json +++ b/packages/contracts-bedrock/snapshots/abi/OPContractsManagerStandardValidator.json @@ -335,11 +335,6 @@ "inputs": [ { "components": [ - { - "internalType": "contract IProxyAdmin", - "name": "proxyAdmin", - "type": "address" - }, { "internalType": "contract ISystemConfig", "name": "sysCfg", @@ -386,11 +381,6 @@ "inputs": [ { "components": [ - { - "internalType": "contract IProxyAdmin", - "name": "proxyAdmin", - "type": "address" - }, { "internalType": "contract ISystemConfig", "name": "sysCfg", @@ -442,11 +432,6 @@ "inputs": [ { "components": [ - { - "internalType": "contract IProxyAdmin", - "name": "proxyAdmin", - "type": "address" - }, { "internalType": "contract ISystemConfig", "name": "sysCfg", @@ -510,11 +495,6 @@ "inputs": [ { "components": [ - { - "internalType": "contract IProxyAdmin", - "name": "proxyAdmin", - "type": "address" - }, { "internalType": "contract ISystemConfig", "name": "sysCfg", diff --git a/packages/contracts-bedrock/snapshots/abi/OPContractsManagerUpgrader.json b/packages/contracts-bedrock/snapshots/abi/OPContractsManagerUpgrader.json index abe8bf8f11868..0db8ae8f03793 100644 --- a/packages/contracts-bedrock/snapshots/abi/OPContractsManagerUpgrader.json +++ b/packages/contracts-bedrock/snapshots/abi/OPContractsManagerUpgrader.json @@ -261,11 +261,6 @@ "name": "systemConfigProxy", "type": "address" }, - { - "internalType": "contract IProxyAdmin", - "name": "proxyAdmin", - "type": "address" - }, { "internalType": "Claim", "name": "absolutePrestate", diff --git a/packages/contracts-bedrock/snapshots/semver-lock.json b/packages/contracts-bedrock/snapshots/semver-lock.json index b29bd4dd5fb5c..0ad3d66132443 100644 --- a/packages/contracts-bedrock/snapshots/semver-lock.json +++ b/packages/contracts-bedrock/snapshots/semver-lock.json @@ -20,12 +20,12 @@ "sourceCodeHash": "0xfca613b5d055ffc4c3cbccb0773ddb9030abedc1aa6508c9e2e7727cc0cd617b" }, "src/L1/OPContractsManager.sol:OPContractsManager": { - "initCodeHash": "0x103775faed94486265eb7f68a9ae83b3055aa34f635c3a03938f1e57917eebca", - "sourceCodeHash": "0x7b627075f2ee890e526e038e47b9cc8f70f93e971f2cbebaed6ef93631bc4b00" + "initCodeHash": "0xe264ff78622d5baea636012c17562a4f105182626c3a3841cc65912cb20dff9f", + "sourceCodeHash": "0x7e4a03b442d7b9bcd43cedabc15f98740345fb3d3224cbba3b4eedc6f2fcc65d" }, "src/L1/OPContractsManagerStandardValidator.sol:OPContractsManagerStandardValidator": { - "initCodeHash": "0xa5113ddf9f502b9ebf1b2d487f24caed21a5946c271ba69cb381f1a8cad27fcb", - "sourceCodeHash": "0x5a28bd2252503efdd3622aca1a3bbf253e6e757b4008520950c3a2177acb6fa0" + "initCodeHash": "0x0c8b15453d0f0bc5d9af07f104505e0bbb2b358f0df418289822fb73a8652b30", + "sourceCodeHash": "0x8c156f9f46ae60d928dcc49355519281d019cafabb327103db3094f28ed03537" }, "src/L1/OptimismPortal2.sol:OptimismPortal2": { "initCodeHash": "0x5bf576ea7f566e402a997204988471fc9b971410aa9dff8fe810b10baf6b7456", diff --git a/packages/contracts-bedrock/src/L1/OPContractsManager.sol b/packages/contracts-bedrock/src/L1/OPContractsManager.sol index 3247cb9c3ebb3..6afcd986a6f5c 100644 --- a/packages/contracts-bedrock/src/L1/OPContractsManager.sol +++ b/packages/contracts-bedrock/src/L1/OPContractsManager.sol @@ -577,7 +577,7 @@ contract OPContractsManagerGameTypeAdder is OPContractsManagerBase { payable( deployProxy( l2ChainId, - gameConfig.proxyAdmin, + gameConfig.systemConfig.proxyAdmin(), gameConfig.saltMixer, string.concat("DelayedWETH-", Strings.toString(uint256(gameTypeInt))) ) @@ -586,7 +586,7 @@ contract OPContractsManagerGameTypeAdder is OPContractsManagerBase { // Initialize the proxy. upgradeToAndCall( - gameConfig.proxyAdmin, + gameConfig.systemConfig.proxyAdmin(), address(outputs[i].delayedWETH), getImplementations().delayedWETHImpl, abi.encodeCall(IDelayedWETH.initialize, (gameConfig.systemConfig)) @@ -824,7 +824,6 @@ contract OPContractsManagerGameTypeAdder is OPContractsManagerBase { disputeAbsolutePrestate: prestate, saltMixer: reusableSaltMixer(_prestateUpdateInputs[i].systemConfigProxy), systemConfig: _prestateUpdateInputs[i].systemConfigProxy, - proxyAdmin: _prestateUpdateInputs[i].systemConfigProxy.proxyAdmin(), delayedWETH: getWETH(dgf, existingGame, gameType), disputeGameType: gameType, disputeMaxGameDepth: existingGame.maxGameDepth(), @@ -908,8 +907,11 @@ contract OPContractsManagerUpgrader is OPContractsManagerBase { ) internal { + // Get the proxyAdmin from the systemConfig. + IProxyAdmin proxyAdmin = _opChainConfig.systemConfigProxy.proxyAdmin(); + // Upgrade the SystemConfig first. - upgradeTo(_opChainConfig.proxyAdmin, address(_opChainConfig.systemConfigProxy), _impls.systemConfigImpl); + upgradeTo(proxyAdmin, address(_opChainConfig.systemConfigProxy), _impls.systemConfigImpl); // Grab the OptimismPortal contract. IOptimismPortal optimismPortal = IOptimismPortal(payable(_opChainConfig.systemConfigProxy.optimismPortal())); @@ -918,7 +920,7 @@ contract OPContractsManagerUpgrader is OPContractsManagerBase { if (isDevFeatureEnabled(DevFeatures.OPTIMISM_PORTAL_INTEROP)) { // This does NOT run in production. // Upgrade the OptimismPortal contract implementation. - upgradeTo(_opChainConfig.proxyAdmin, address(optimismPortal), _impls.optimismPortalInteropImpl); + upgradeTo(proxyAdmin, address(optimismPortal), _impls.optimismPortalInteropImpl); // If we don't already have an ETHLockbox, deploy and initialize it. IETHLockbox ethLockbox = optimismPortal.ethLockbox(); @@ -927,7 +929,7 @@ contract OPContractsManagerUpgrader is OPContractsManagerBase { ethLockbox = IETHLockbox( deployProxy({ _l2ChainId: _l2ChainId, - _proxyAdmin: _opChainConfig.proxyAdmin, + _proxyAdmin: proxyAdmin, _saltMixer: reusableSaltMixer(_opChainConfig.systemConfigProxy), _contractName: "ETHLockbox-U16a" }) @@ -937,7 +939,7 @@ contract OPContractsManagerUpgrader is OPContractsManagerBase { IOptimismPortal[] memory portals = new IOptimismPortal[](1); portals[0] = optimismPortal; upgradeToAndCall( - _opChainConfig.proxyAdmin, + proxyAdmin, address(ethLockbox), _impls.ethLockboxImpl, abi.encodeCall(IETHLockbox.initialize, (_opChainConfig.systemConfigProxy, portals)) @@ -955,12 +957,12 @@ contract OPContractsManagerUpgrader is OPContractsManagerBase { IOptimismPortalInterop(payable(optimismPortal)).upgrade(anchorStateRegistry, ethLockbox); } else { // This runs in production. - upgradeTo(_opChainConfig.proxyAdmin, address(optimismPortal), _impls.optimismPortalImpl); + upgradeTo(proxyAdmin, address(optimismPortal), _impls.optimismPortalImpl); } // Upgrade the OptimismMintableERC20Factory contract. upgradeTo( - _opChainConfig.proxyAdmin, + proxyAdmin, _opChainConfig.systemConfigProxy.optimismMintableERC20Factory(), _impls.optimismMintableERC20FactoryImpl ); @@ -969,7 +971,7 @@ contract OPContractsManagerUpgrader is OPContractsManagerBase { IDisputeGameFactory dgf = IDisputeGameFactory(_opChainConfig.systemConfigProxy.disputeGameFactory()); // Need to upgrade the DisputeGameFactory implementation, no internal upgrade call. - upgradeTo(_opChainConfig.proxyAdmin, address(dgf), _impls.disputeGameFactoryImpl); + upgradeTo(proxyAdmin, address(dgf), _impls.disputeGameFactoryImpl); // Separate context to avoid stack too deep. { @@ -979,24 +981,20 @@ contract OPContractsManagerUpgrader is OPContractsManagerBase { // Upgrade the L1CrossDomainMessenger contract. upgradeTo( - _opChainConfig.proxyAdmin, + proxyAdmin, address(IL1CrossDomainMessenger(opChainAddrs.l1CrossDomainMessenger)), _impls.l1CrossDomainMessengerImpl ); // Upgrade the L1StandardBridge contract. upgradeTo( - _opChainConfig.proxyAdmin, + proxyAdmin, address(IL1StandardBridge(payable(opChainAddrs.l1StandardBridge))), _impls.l1StandardBridgeImpl ); // Upgrade the L1ERC721Bridge contract. - upgradeTo( - _opChainConfig.proxyAdmin, - address(IL1ERC721Bridge(opChainAddrs.l1ERC721Bridge)), - _impls.l1ERC721BridgeImpl - ); + upgradeTo(proxyAdmin, address(IL1ERC721Bridge(opChainAddrs.l1ERC721Bridge)), _impls.l1ERC721BridgeImpl); } // All chains have the PermissionedDisputeGame, grab that. @@ -1096,7 +1094,6 @@ contract OPContractsManagerUpgrader is OPContractsManagerBase { /// @notice Verifies that all OpChainConfig inputs are valid and reverts if any are invalid. function assertValidOpChainConfig(OPContractsManager.OpChainConfig memory _config) internal view { assertValidContractAddress(address(_config.systemConfigProxy)); - assertValidContractAddress(address(_config.proxyAdmin)); } /// @notice Deploys and sets a new v1 dispute game implementation @@ -1763,11 +1760,14 @@ contract OPContractsManagerInteropMigrator is OPContractsManagerBase { /// you know what you're doing and that you are prepared to fully execute this migration. /// @param _input The input parameters for the migration. function migrate(MigrateInput calldata _input) public virtual { + // Get the proxyAdmin from the first system config. + IProxyAdmin proxyAdmin = _input.opChainConfigs[0].systemConfigProxy.proxyAdmin(); + // Check that all of the configs have the same proxy admin owner and prestate. for (uint256 i = 0; i < _input.opChainConfigs.length; i++) { // Different chains might actually have different ProxyAdmin contracts, but it's fine // as long as the owner of all of those contracts is the same. - if (_input.opChainConfigs[i].proxyAdmin.owner() != _input.opChainConfigs[0].proxyAdmin.owner()) { + if (_input.opChainConfigs[i].systemConfigProxy.proxyAdmin().owner() != proxyAdmin.owner()) { revert OPContractsManagerInteropMigrator_ProxyAdminOwnerMismatch(); } if (_input.opChainConfigs[i].absolutePrestate.raw() != _input.opChainConfigs[0].absolutePrestate.raw()) { @@ -1792,7 +1792,7 @@ contract OPContractsManagerInteropMigrator is OPContractsManagerBase { // ProxyAdmin contract as the ProxyAdmin for all of the newly shared contracts. This is // safe because we already checked that all of the provided chains have the same ProxyAdmin // owner and therefore have the same access models. - address proxyAdminOwner = _input.opChainConfigs[0].proxyAdmin.owner(); + address proxyAdminOwner = proxyAdmin.owner(); // Deploy the new ETHLockbox. // NOTE that here and in the rest of this function we use block.timestamp as a fake chain @@ -1803,7 +1803,7 @@ contract OPContractsManagerInteropMigrator is OPContractsManagerBase { IETHLockbox newEthLockbox = IETHLockbox( deployProxy({ _l2ChainId: block.timestamp, - _proxyAdmin: _input.opChainConfigs[0].proxyAdmin, + _proxyAdmin: proxyAdmin, _saltMixer: reusableSaltMixer(_input.opChainConfigs[0].systemConfigProxy), _contractName: "ETHLockbox-Interop" }) @@ -1820,7 +1820,7 @@ contract OPContractsManagerInteropMigrator is OPContractsManagerBase { // Initialize the new ETHLockbox. // Note that this authorizes the portals to use the ETHLockbox. upgradeToAndCall( - _input.opChainConfigs[0].proxyAdmin, + proxyAdmin, address(newEthLockbox), getImplementations().ethLockboxImpl, abi.encodeCall(IETHLockbox.initialize, (portals[0].systemConfig(), castedPortals)) @@ -1831,7 +1831,7 @@ contract OPContractsManagerInteropMigrator is OPContractsManagerBase { IDisputeGameFactory newDisputeGameFactory = IDisputeGameFactory( deployProxy({ _l2ChainId: block.timestamp, - _proxyAdmin: _input.opChainConfigs[0].proxyAdmin, + _proxyAdmin: proxyAdmin, _saltMixer: reusableSaltMixer(_input.opChainConfigs[0].systemConfigProxy), _contractName: "DisputeGameFactory-Interop" }) @@ -1839,7 +1839,7 @@ contract OPContractsManagerInteropMigrator is OPContractsManagerBase { // Initialize the new DisputeGameFactory. upgradeToAndCall( - _input.opChainConfigs[0].proxyAdmin, + proxyAdmin, address(newDisputeGameFactory), getImplementations().disputeGameFactoryImpl, abi.encodeCall(IDisputeGameFactory.initialize, (proxyAdminOwner)) @@ -1849,7 +1849,7 @@ contract OPContractsManagerInteropMigrator is OPContractsManagerBase { IAnchorStateRegistry newAnchorStateRegistry = IAnchorStateRegistry( deployProxy({ _l2ChainId: block.timestamp, - _proxyAdmin: _input.opChainConfigs[0].proxyAdmin, + _proxyAdmin: proxyAdmin, _saltMixer: reusableSaltMixer(_input.opChainConfigs[0].systemConfigProxy), _contractName: "AnchorStateRegistry-Interop" }) @@ -1866,7 +1866,7 @@ contract OPContractsManagerInteropMigrator is OPContractsManagerBase { // We can use portals[0].systemConfig() as they are members of the same superchain cluster (shared lockbox) // Initialize the new AnchorStateRegistry. upgradeToAndCall( - _input.opChainConfigs[0].proxyAdmin, + proxyAdmin, address(newAnchorStateRegistry), getImplementations().anchorStateRegistryImpl, abi.encodeCall( @@ -1908,7 +1908,7 @@ contract OPContractsManagerInteropMigrator is OPContractsManagerBase { payable( deployProxy({ _l2ChainId: block.timestamp, - _proxyAdmin: _input.opChainConfigs[0].proxyAdmin, + _proxyAdmin: proxyAdmin, _saltMixer: reusableSaltMixer(_input.opChainConfigs[0].systemConfigProxy), _contractName: "DelayedWETH-Interop-Permissioned" }) @@ -1917,7 +1917,7 @@ contract OPContractsManagerInteropMigrator is OPContractsManagerBase { // Initialize the new DelayedWETH proxy. upgradeToAndCall( - _input.opChainConfigs[0].proxyAdmin, + proxyAdmin, address(newPermissionedDelayedWETHProxy), getImplementations().delayedWETHImpl, abi.encodeCall(IDelayedWETH.initialize, (portals[0].systemConfig())) @@ -1954,7 +1954,7 @@ contract OPContractsManagerInteropMigrator is OPContractsManagerBase { payable( deployProxy({ _l2ChainId: block.timestamp, - _proxyAdmin: _input.opChainConfigs[0].proxyAdmin, + _proxyAdmin: proxyAdmin, _saltMixer: reusableSaltMixer(_input.opChainConfigs[0].systemConfigProxy), _contractName: "DelayedWETH-Interop-Permissionless" }) @@ -1963,7 +1963,7 @@ contract OPContractsManagerInteropMigrator is OPContractsManagerBase { // Initialize the new DelayedWETH proxy. upgradeToAndCall( - _input.opChainConfigs[0].proxyAdmin, + proxyAdmin, address(newPermissionlessDelayedWETHProxy), getImplementations().delayedWETHImpl, abi.encodeCall(IDelayedWETH.initialize, (portals[0].systemConfig())) @@ -2084,7 +2084,6 @@ contract OPContractsManager is ISemver { /// @notice The input required to identify a chain for upgrading, along with new prestate hashes struct OpChainConfig { ISystemConfig systemConfigProxy; - IProxyAdmin proxyAdmin; Claim absolutePrestate; } @@ -2098,7 +2097,6 @@ contract OPContractsManager is ISemver { struct AddGameInput { string saltMixer; ISystemConfig systemConfig; - IProxyAdmin proxyAdmin; IDelayedWETH delayedWETH; GameType disputeGameType; Claim disputeAbsolutePrestate; @@ -2118,9 +2116,9 @@ contract OPContractsManager is ISemver { // -------- Constants and Variables -------- - /// @custom:semver 5.2.0 + /// @custom:semver 5.3.0 function version() public pure virtual returns (string memory) { - return "5.2.0"; + return "5.3.0"; } OPContractsManagerGameTypeAdder public immutable opcmGameTypeAdder; diff --git a/packages/contracts-bedrock/src/L1/OPContractsManagerStandardValidator.sol b/packages/contracts-bedrock/src/L1/OPContractsManagerStandardValidator.sol index 63c762308ec77..d3f498bbb0640 100644 --- a/packages/contracts-bedrock/src/L1/OPContractsManagerStandardValidator.sol +++ b/packages/contracts-bedrock/src/L1/OPContractsManagerStandardValidator.sol @@ -40,8 +40,8 @@ import { IBigStepper } from "interfaces/dispute/IBigStepper.sol"; /// before and after an upgrade. contract OPContractsManagerStandardValidator is ISemver { /// @notice The semantic version of the OPContractsManagerStandardValidator contract. - /// @custom:semver 2.1.0 - string public constant version = "2.1.0"; + /// @custom:semver 2.2.0 + string public constant version = "2.2.0"; /// @notice The SuperchainConfig contract. ISuperchainConfig public superchainConfig; @@ -114,7 +114,6 @@ contract OPContractsManagerStandardValidator is ISemver { /// @notice Struct containing the input parameters for the validation process. struct ValidationInput { - IProxyAdmin proxyAdmin; ISystemConfig sysCfg; bytes32 absolutePrestate; uint256 l2ChainID; @@ -123,7 +122,6 @@ contract OPContractsManagerStandardValidator is ISemver { /// @notice Struct containing the input parameters for the validation process when dev features are enabled. struct ValidationInputDev { - IProxyAdmin proxyAdmin; ISystemConfig sysCfg; bytes32 cannonPrestate; bytes32 cannonKonaPrestate; @@ -297,8 +295,7 @@ contract OPContractsManagerStandardValidator is ISemver { _errors = internalRequire(outputConfig.maximumBaseFee == type(uint128).max, "SYSCON-100", _errors); _errors = internalRequire(_sysCfg.operatorFeeScalar() == 0, "SYSCON-110", _errors); _errors = internalRequire(_sysCfg.operatorFeeConstant() == 0, "SYSCON-120", _errors); - _errors = internalRequire(getProxyAdmin(address(_sysCfg)) == _admin, "SYSCON-130", _errors); - _errors = internalRequire(_sysCfg.superchainConfig() == superchainConfig, "SYSCON-140", _errors); + _errors = internalRequire(_sysCfg.superchainConfig() == superchainConfig, "SYSCON-130", _errors); return _errors; } @@ -866,23 +863,19 @@ contract OPContractsManagerStandardValidator is ISemver { { string memory _errors = ""; + IProxyAdmin _proxyAdmin = _input.sysCfg.proxyAdmin(); + _errors = assertValidSuperchainConfig(_errors); - _errors = assertValidProxyAdmin(_errors, _input.proxyAdmin, _overrides); - _errors = assertValidSystemConfig(_errors, _input.sysCfg, _input.proxyAdmin); - _errors = assertValidL1CrossDomainMessenger(_errors, _input.sysCfg, _input.proxyAdmin); - _errors = assertValidL1StandardBridge(_errors, _input.sysCfg, _input.proxyAdmin); - _errors = assertValidOptimismMintableERC20Factory(_errors, _input.sysCfg, _input.proxyAdmin); - _errors = assertValidL1ERC721Bridge(_errors, _input.sysCfg, _input.proxyAdmin); - _errors = assertValidOptimismPortal(_errors, _input.sysCfg, _input.proxyAdmin); - _errors = assertValidDisputeGameFactory(_errors, _input.sysCfg, _input.proxyAdmin, _overrides); + _errors = assertValidProxyAdmin(_errors, _proxyAdmin, _overrides); + _errors = assertValidSystemConfig(_errors, _input.sysCfg, _proxyAdmin); + _errors = assertValidL1CrossDomainMessenger(_errors, _input.sysCfg, _proxyAdmin); + _errors = assertValidL1StandardBridge(_errors, _input.sysCfg, _proxyAdmin); + _errors = assertValidOptimismMintableERC20Factory(_errors, _input.sysCfg, _proxyAdmin); + _errors = assertValidL1ERC721Bridge(_errors, _input.sysCfg, _proxyAdmin); + _errors = assertValidOptimismPortal(_errors, _input.sysCfg, _proxyAdmin); + _errors = assertValidDisputeGameFactory(_errors, _input.sysCfg, _proxyAdmin, _overrides); _errors = assertValidPermissionedDisputeGame( - _errors, - _input.sysCfg, - _input.cannonPrestate, - _input.l2ChainID, - _input.proxyAdmin, - _input.proposer, - _overrides + _errors, _input.sysCfg, _input.cannonPrestate, _input.l2ChainID, _proxyAdmin, _input.proposer, _overrides ); _errors = assertValidPermissionlessDisputeGame( _errors, @@ -890,7 +883,7 @@ contract OPContractsManagerStandardValidator is ISemver { GameTypes.CANNON, _input.cannonPrestate, _input.l2ChainID, - _input.proxyAdmin, + _proxyAdmin, _overrides, "PLDG" ); @@ -901,13 +894,13 @@ contract OPContractsManagerStandardValidator is ISemver { GameTypes.CANNON_KONA, _input.cannonKonaPrestate, _input.l2ChainID, - _input.proxyAdmin, + _proxyAdmin, _overrides, "CKDG" ); } - _errors = assertValidETHLockbox(_errors, _input.sysCfg, _input.proxyAdmin); + _errors = assertValidETHLockbox(_errors, _input.sysCfg, _proxyAdmin); string memory overridesString = getOverridesString(_overrides); string memory finalErrors = _errors; @@ -934,7 +927,6 @@ contract OPContractsManagerStandardValidator is ISemver { /// @notice Transforms current ValidationInput structs into the dev feature format. function _toValidationInputDev(ValidationInput memory _input) internal pure returns (ValidationInputDev memory) { return ValidationInputDev({ - proxyAdmin: _input.proxyAdmin, sysCfg: _input.sysCfg, cannonPrestate: _input.absolutePrestate, cannonKonaPrestate: bytes32(0), diff --git a/packages/contracts-bedrock/test/L1/OPContractsManager.t.sol b/packages/contracts-bedrock/test/L1/OPContractsManager.t.sol index bb69d641585d6..f0ace8473ef08 100644 --- a/packages/contracts-bedrock/test/L1/OPContractsManager.t.sol +++ b/packages/contracts-bedrock/test/L1/OPContractsManager.t.sol @@ -148,11 +148,7 @@ contract OPContractsManager_Upgrade_Harness is CommonTest, DisputeGames { vm.etch(upgrader, vm.getDeployedCode("test/mocks/Callers.sol:DelegateCaller")); opChainConfigs.push( - IOPContractsManager.OpChainConfig({ - systemConfigProxy: systemConfig, - proxyAdmin: proxyAdmin, - absolutePrestate: absolutePrestate - }) + IOPContractsManager.OpChainConfig({ systemConfigProxy: systemConfig, absolutePrestate: absolutePrestate }) ); // Retrieve the l2ChainId, which was read from the superchain-registry, and saved in @@ -276,7 +272,7 @@ contract OPContractsManager_Upgrade_Harness is CommonTest, DisputeGames { // Create validationOverrides IOPContractsManagerStandardValidator.ValidationOverrides memory validationOverrides = IOPContractsManagerStandardValidator.ValidationOverrides({ - l1PAOMultisig: opChainConfigs[0].proxyAdmin.owner(), + l1PAOMultisig: opChainConfigs[0].systemConfigProxy.proxyAdmin().owner(), challenger: initialChallenger }); @@ -299,7 +295,6 @@ contract OPContractsManager_Upgrade_Harness is CommonTest, DisputeGames { // Run the StandardValidator checks. validator.validateWithOverrides( IOPContractsManagerStandardValidator.ValidationInput({ - proxyAdmin: opChainConfigs[0].proxyAdmin, sysCfg: opChainConfigs[0].systemConfigProxy, absolutePrestate: opChainConfigs[0].absolutePrestate.raw(), l2ChainID: l2ChainId, @@ -501,7 +496,6 @@ abstract contract OPContractsManager_TestInit is CommonTest, DisputeGames { return IOPContractsManager.AddGameInput({ saltMixer: "hello", systemConfig: chainDeployOutput1.systemConfigProxy, - proxyAdmin: chainDeployOutput1.opChainProxyAdmin, delayedWETH: IDelayedWETH(payable(address(0))), disputeGameType: _gameType, disputeAbsolutePrestate: Claim.wrap(bytes32(hex"deadbeef1234")), @@ -1675,12 +1669,8 @@ contract OPContractsManager_Migrate_Test is OPContractsManager_TestInit { }); IOPContractsManager.OpChainConfig[] memory opChainConfigs = new IOPContractsManager.OpChainConfig[](2); - opChainConfigs[0] = IOPContractsManager.OpChainConfig( - chainDeployOutput1.systemConfigProxy, chainDeployOutput1.opChainProxyAdmin, absolutePrestate1 - ); - opChainConfigs[1] = IOPContractsManager.OpChainConfig( - chainDeployOutput2.systemConfigProxy, chainDeployOutput2.opChainProxyAdmin, absolutePrestate1 - ); + opChainConfigs[0] = IOPContractsManager.OpChainConfig(chainDeployOutput1.systemConfigProxy, absolutePrestate1); + opChainConfigs[1] = IOPContractsManager.OpChainConfig(chainDeployOutput2.systemConfigProxy, absolutePrestate1); return IOPContractsManagerInteropMigrator.MigrateInput({ usePermissionlessGame: true, @@ -2010,12 +2000,12 @@ contract OPContractsManager_Migrate_Test is OPContractsManager_TestInit { // Mock out the owners of the ProxyAdmins to be different. vm.mockCall( - address(input.opChainConfigs[0].proxyAdmin), + address(input.opChainConfigs[0].systemConfigProxy.proxyAdmin()), abi.encodeCall(IProxyAdmin.owner, ()), abi.encode(address(1234)) ); vm.mockCall( - address(input.opChainConfigs[1].proxyAdmin), + address(input.opChainConfigs[1].systemConfigProxy.proxyAdmin()), abi.encodeCall(IProxyAdmin.owner, ()), abi.encode(address(5678)) ); diff --git a/packages/contracts-bedrock/test/L1/OPContractsManagerStandardValidator.t.sol b/packages/contracts-bedrock/test/L1/OPContractsManagerStandardValidator.t.sol index 94e943ac52e8f..b0394a4ed7613 100644 --- a/packages/contracts-bedrock/test/L1/OPContractsManagerStandardValidator.t.sol +++ b/packages/contracts-bedrock/test/L1/OPContractsManagerStandardValidator.t.sol @@ -211,7 +211,6 @@ abstract contract OPContractsManagerStandardValidator_TestInit is CommonTest, Di if (isDevFeatureEnabled(DevFeatures.CANNON_KONA)) { return opcm.validate( IOPContractsManagerStandardValidator.ValidationInputDev({ - proxyAdmin: proxyAdmin, sysCfg: systemConfig, cannonPrestate: cannonPrestate.raw(), cannonKonaPrestate: cannonKonaPrestate.raw(), @@ -223,7 +222,6 @@ abstract contract OPContractsManagerStandardValidator_TestInit is CommonTest, Di } else { return opcm.validate( IOPContractsManagerStandardValidator.ValidationInput({ - proxyAdmin: proxyAdmin, sysCfg: systemConfig, absolutePrestate: cannonPrestate.raw(), l2ChainID: l2ChainId, @@ -248,7 +246,6 @@ abstract contract OPContractsManagerStandardValidator_TestInit is CommonTest, Di if (isDevFeatureEnabled(DevFeatures.CANNON_KONA)) { return opcm.validateWithOverrides( IOPContractsManagerStandardValidator.ValidationInputDev({ - proxyAdmin: proxyAdmin, sysCfg: systemConfig, cannonPrestate: cannonPrestate.raw(), cannonKonaPrestate: cannonKonaPrestate.raw(), @@ -261,7 +258,6 @@ abstract contract OPContractsManagerStandardValidator_TestInit is CommonTest, Di } else { return opcm.validateWithOverrides( IOPContractsManagerStandardValidator.ValidationInput({ - proxyAdmin: proxyAdmin, sysCfg: systemConfig, absolutePrestate: cannonPrestate.raw(), l2ChainID: l2ChainId, @@ -325,7 +321,6 @@ abstract contract OPContractsManagerStandardValidator_TestInit is CommonTest, Di return IOPContractsManager.AddGameInput({ saltMixer: "hello", systemConfig: systemConfig, - proxyAdmin: proxyAdmin, delayedWETH: delayedWeth, disputeGameType: _gameType, disputeAbsolutePrestate: _prestate, @@ -596,22 +591,13 @@ contract OPContractsManagerStandardValidator_SystemConfig_Test is OPContractsMan assertEq("SYSCON-120", _validate(true)); } - /// @notice Tests that the validate function successfully returns the right error when the - /// SystemConfig proxyAdmin is invalid. - function test_validate_systemConfigInvalidProxyAdmin_succeeds() public { - vm.mockCall( - address(systemConfig), abi.encodeCall(IProxyAdminOwnedBase.proxyAdmin, ()), abi.encode(address(0xbad)) - ); - assertEq("SYSCON-130", _validate(true)); - } - /// @notice Tests that the validate function successfully returns the right error when the /// SystemConfig superchainConfig is invalid. function test_validate_systemConfigInvalidSuperchainConfig_succeeds() public { vm.mockCall( address(systemConfig), abi.encodeCall(ISystemConfig.superchainConfig, ()), abi.encode(address(0xbad)) ); - assertEq("SYSCON-140", _validate(true)); + assertEq("SYSCON-130", _validate(true)); } } diff --git a/packages/contracts-bedrock/test/opcm/InteropMigration.t.sol b/packages/contracts-bedrock/test/opcm/InteropMigration.t.sol index d4c7cc4dca6c4..64426e41e538e 100644 --- a/packages/contracts-bedrock/test/opcm/InteropMigration.t.sol +++ b/packages/contracts-bedrock/test/opcm/InteropMigration.t.sol @@ -7,7 +7,6 @@ import { InteropMigrationInput, InteropMigration, InteropMigrationOutput } from import { IOPContractsManagerInteropMigrator, IOPContractsManager } from "interfaces/L1/IOPContractsManager.sol"; import { IOptimismPortal2 as IOptimismPortal } from "interfaces/L1/IOptimismPortal2.sol"; import { ISystemConfig } from "interfaces/L1/ISystemConfig.sol"; -import { IProxyAdmin } from "interfaces/universal/IProxyAdmin.sol"; import { Claim } from "src/dispute/lib/Types.sol"; contract InteropMigrationInput_Test is Test { @@ -81,7 +80,6 @@ contract InteropMigrationInput_Test is Test { configs[0] = IOPContractsManager.OpChainConfig({ systemConfigProxy: ISystemConfig(systemConfig1), - proxyAdmin: IProxyAdmin(proxyAdmin1), absolutePrestate: Claim.wrap(bytes32(uint256(1))) }); @@ -93,7 +91,6 @@ contract InteropMigrationInput_Test is Test { configs[1] = IOPContractsManager.OpChainConfig({ systemConfigProxy: ISystemConfig(systemConfig2), - proxyAdmin: IProxyAdmin(proxyAdmin2), absolutePrestate: Claim.wrap(bytes32(uint256(2))) }); @@ -143,7 +140,6 @@ contract InteropMigrationInput_Test is Test { configs[0] = IOPContractsManager.OpChainConfig({ systemConfigProxy: ISystemConfig(mockSystemConfig), - proxyAdmin: IProxyAdmin(mockProxyAdmin), absolutePrestate: Claim.wrap(bytes32(uint256(1))) }); @@ -153,13 +149,11 @@ contract InteropMigrationInput_Test is Test { } contract MockOPCM { - event MigrateCalled(address indexed sysCfgProxy, address indexed proxyAdmin, bytes32 indexed absolutePrestate); + event MigrateCalled(address indexed sysCfgProxy, bytes32 indexed absolutePrestate); function migrate(IOPContractsManagerInteropMigrator.MigrateInput memory _input) public { emit MigrateCalled( - address(_input.opChainConfigs[0].systemConfigProxy), - address(_input.opChainConfigs[0].proxyAdmin), - Claim.unwrap(_input.opChainConfigs[0].absolutePrestate) + address(_input.opChainConfigs[0].systemConfigProxy), Claim.unwrap(_input.opChainConfigs[0].absolutePrestate) ); } } @@ -171,7 +165,7 @@ contract InteropMigration_Test is Test { InteropMigration migration; address prank; - event MigrateCalled(address indexed sysCfgProxy, address indexed proxyAdmin, bytes32 indexed absolutePrestate); + event MigrateCalled(address indexed sysCfgProxy, bytes32 indexed absolutePrestate); function setUp() public { mockOPCM = new MockOPCM(); @@ -179,7 +173,6 @@ contract InteropMigration_Test is Test { input.set(input.opcm.selector, address(mockOPCM)); config = IOPContractsManager.OpChainConfig({ systemConfigProxy: ISystemConfig(makeAddr("systemConfigProxy")), - proxyAdmin: IProxyAdmin(makeAddr("proxyAdmin")), absolutePrestate: Claim.wrap(keccak256("absolutePrestate")) }); IOPContractsManager.OpChainConfig[] memory configs = new IOPContractsManager.OpChainConfig[](1); @@ -205,9 +198,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), address(config.proxyAdmin), Claim.unwrap(config.absolutePrestate) - ); + emit MigrateCalled(address(config.systemConfigProxy), Claim.unwrap(config.absolutePrestate)); // 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 06e20c078c122..264aecb0058a3 100644 --- a/packages/contracts-bedrock/test/opcm/UpgradeOPChain.t.sol +++ b/packages/contracts-bedrock/test/opcm/UpgradeOPChain.t.sol @@ -5,7 +5,6 @@ import { Test } from "forge-std/Test.sol"; import { Claim } from "src/dispute/lib/Types.sol"; import { ISystemConfig } from "interfaces/L1/ISystemConfig.sol"; -import { IProxyAdmin } from "interfaces/universal/IProxyAdmin.sol"; import { OPContractsManager } from "src/L1/OPContractsManager.sol"; import { UpgradeOPChain, UpgradeOPChainInput } from "scripts/deploy/UpgradeOPChain.s.sol"; @@ -54,7 +53,6 @@ contract UpgradeOPChainInput_Test is Test { configs[0] = OPContractsManager.OpChainConfig({ systemConfigProxy: ISystemConfig(systemConfig1), - proxyAdmin: IProxyAdmin(proxyAdmin1), absolutePrestate: Claim.wrap(bytes32(uint256(1))) }); @@ -66,7 +64,6 @@ contract UpgradeOPChainInput_Test is Test { configs[1] = OPContractsManager.OpChainConfig({ systemConfigProxy: ISystemConfig(systemConfig2), - proxyAdmin: IProxyAdmin(proxyAdmin2), absolutePrestate: Claim.wrap(bytes32(uint256(2))) }); @@ -110,7 +107,6 @@ contract UpgradeOPChainInput_Test is Test { configs[0] = OPContractsManager.OpChainConfig({ systemConfigProxy: ISystemConfig(mockSystemConfig), - proxyAdmin: IProxyAdmin(mockProxyAdmin), absolutePrestate: Claim.wrap(bytes32(uint256(1))) }); @@ -120,13 +116,11 @@ contract UpgradeOPChainInput_Test is Test { } contract MockOPCM { - event UpgradeCalled(address indexed sysCfgProxy, address indexed proxyAdmin, bytes32 indexed absolutePrestate); + event UpgradeCalled(address indexed sysCfgProxy, bytes32 indexed absolutePrestate); function upgrade(OPContractsManager.OpChainConfig[] memory _opChainConfigs) public { emit UpgradeCalled( - address(_opChainConfigs[0].systemConfigProxy), - address(_opChainConfigs[0].proxyAdmin), - Claim.unwrap(_opChainConfigs[0].absolutePrestate) + address(_opChainConfigs[0].systemConfigProxy), Claim.unwrap(_opChainConfigs[0].absolutePrestate) ); } } @@ -138,7 +132,7 @@ contract UpgradeOPChain_Test is Test { UpgradeOPChain upgradeOPChain; address prank; - event UpgradeCalled(address indexed sysCfgProxy, address indexed proxyAdmin, bytes32 indexed absolutePrestate); + event UpgradeCalled(address indexed sysCfgProxy, bytes32 indexed absolutePrestate); function setUp() public virtual { mockOPCM = new MockOPCM(); @@ -146,7 +140,6 @@ contract UpgradeOPChain_Test is Test { uoci.set(uoci.opcm.selector, address(mockOPCM)); config = OPContractsManager.OpChainConfig({ systemConfigProxy: ISystemConfig(makeAddr("systemConfigProxy")), - proxyAdmin: IProxyAdmin(makeAddr("proxyAdmin")), absolutePrestate: Claim.wrap(keccak256("absolutePrestate")) }); OPContractsManager.OpChainConfig[] memory configs = new OPContractsManager.OpChainConfig[](1); @@ -160,9 +153,7 @@ 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), address(config.proxyAdmin), Claim.unwrap(config.absolutePrestate) - ); + emit UpgradeCalled(address(config.systemConfigProxy), Claim.unwrap(config.absolutePrestate)); upgradeOPChain.run(uoci); } } diff --git a/packages/contracts-bedrock/test/setup/ForkLive.s.sol b/packages/contracts-bedrock/test/setup/ForkLive.s.sol index 3f3d62b2ceaa3..941ffa55877f0 100644 --- a/packages/contracts-bedrock/test/setup/ForkLive.s.sol +++ b/packages/contracts-bedrock/test/setup/ForkLive.s.sol @@ -205,12 +205,9 @@ contract ForkLive is Deployer, StdAssertions, FeatureFlags { /// @param _delegateCaller The address of the upgrader to use for the upgrade. function _doUpgrade(IOPContractsManager _opcm, address _delegateCaller) internal { ISystemConfig systemConfig = ISystemConfig(artifacts.mustGetAddress("SystemConfigProxy")); - IProxyAdmin proxyAdmin = IProxyAdmin(EIP1967Helper.getAdmin(address(systemConfig))); - IOPContractsManager.OpChainConfig[] memory opChains = new IOPContractsManager.OpChainConfig[](1); opChains[0] = IOPContractsManager.OpChainConfig({ systemConfigProxy: systemConfig, - proxyAdmin: proxyAdmin, absolutePrestate: Claim.wrap(bytes32(keccak256("absolutePrestate"))) });