diff --git a/op-wheel/cheat/cheat.go b/op-wheel/cheat/cheat.go index 0431c2c9823cd..835bc3ffee4b8 100644 --- a/op-wheel/cheat/cheat.go +++ b/op-wheel/cheat/cheat.go @@ -17,6 +17,7 @@ import ( "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/trie" @@ -316,6 +317,7 @@ func StoragePatch(patch io.Reader, address common.Address) HeadFn { } type OvmOwnersConfig struct { + Network string `json:"network"` Owner common.Address `json:"owner"` Sequencer common.Address `json:"sequencer"` Proposer common.Address `json:"proposer"` @@ -323,17 +325,42 @@ type OvmOwnersConfig struct { func OvmOwners(conf *OvmOwnersConfig) HeadFn { return func(headState *state.StateDB) error { + var addressManager common.Address // Lib_AddressManager + var l1SBProxy common.Address // Proxy__OVM_L1StandardBridge + var l1XDMProxy common.Address // Proxy__OVM_L1CrossDomainMessenger + var l1ERC721BridgeProxy common.Address + switch conf.Network { + case "mainnet": + addressManager = common.HexToAddress("0xdE1FCfB0851916CA5101820A69b13a4E276bd81F") + l1SBProxy = common.HexToAddress("0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1") + l1XDMProxy = common.HexToAddress("0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1") + l1ERC721BridgeProxy = common.HexToAddress("0x5a7749f83b81B301cAb5f48EB8516B986DAef23D") + case "goerli": + addressManager = common.HexToAddress("0xa6f73589243a6A7a9023b1Fa0651b1d89c177111") + l1SBProxy = common.HexToAddress("0x636Af16bf2f682dD3109e60102b8E1A089FedAa8") + l1XDMProxy = common.HexToAddress("0x5086d1eEF304eb5284A0f6720f79403b4e9bE294") + l1ERC721BridgeProxy = common.HexToAddress("0x8DD330DdE8D9898d43b4dc840Da27A07dF91b3c9") + default: + return fmt.Errorf("unknown network: %q", conf.Network) + } + // See Proxy.sol OWNER_KEY: https://eips.ethereum.org/EIPS/eip-1967#admin-address + ownerSlot := common.HexToHash("0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103") + // Address manager owner - headState.SetState(common.HexToAddress("0xa6f73589243a6A7a9023b1Fa0651b1d89c177111"), common.Hash{}, conf.Owner.Hash()) + // Ownable, first storage slot + headState.SetState(addressManager, common.Hash{}, conf.Owner.Hash()) // L1SB proxy owner - headState.SetState(common.HexToAddress("0x636Af16bf2f682dD3109e60102b8E1A089FedAa8"), common.HexToHash("0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"), conf.Owner.Hash()) + headState.SetState(l1SBProxy, ownerSlot, conf.Owner.Hash()) // L1XDM owner - headState.SetState(common.HexToAddress("0x5086d1eEF304eb5284A0f6720f79403b4e9bE294"), common.Hash{31: 0x33}, conf.Owner.Hash()) + // 0x33 = 51. L1CrossDomainMessenger is L1CrossDomainMessenger (0) Lib_AddressResolver (1) OwnableUpgradeable (1, but covered by gap) + ContextUpgradeable (special gap of 50) and then _owner + headState.SetState(l1XDMProxy, common.Hash{31: 0x33}, conf.Owner.Hash()) // L1 ERC721 bridge owner - headState.SetState(common.HexToAddress("0x8DD330DdE8D9898d43b4dc840Da27A07dF91b3c9"), common.HexToHash("0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"), conf.Owner.Hash()) + headState.SetState(l1ERC721BridgeProxy, ownerSlot, conf.Owner.Hash()) // Legacy sequencer/proposer addresses - headState.SetState(common.HexToAddress("0xa6f73589243a6A7a9023b1Fa0651b1d89c177111"), common.HexToHash("0x2e0dfce60e9e27f035ce28f63c1bdd77cff6b13d8909da4d81d623ff9123fbdc"), conf.Sequencer.Hash()) - headState.SetState(common.HexToAddress("0xa6f73589243a6A7a9023b1Fa0651b1d89c177111"), common.HexToHash("0x9776dbdebd0d5eedaea450b21da9901ecd5254e5136a3a9b7b0ecd532734d5b5"), conf.Proposer.Hash()) + // See AddressManager.sol "addresses" mapping(bytes32 => address), at slot position 1 + addressesSlot := common.BigToHash(big.NewInt(1)) + headState.SetState(addressManager, crypto.Keccak256Hash(crypto.Keccak256([]byte("OVM_Sequencer")), addressesSlot.Bytes()), conf.Sequencer.Hash()) + headState.SetState(addressManager, crypto.Keccak256Hash(crypto.Keccak256([]byte("OVM_Proposer")), addressesSlot.Bytes()), conf.Proposer.Hash()) // Fund sequencer and proposer with 100 ETH headState.SetBalance(conf.Sequencer, HundredETH) headState.SetBalance(conf.Proposer, HundredETH)