UNPKG

@mantleio/contracts

Version:
360 lines 36.1 kB
{ "address": "0x0B59785f4dD909B6d2c94090fDa6A2d447f478E8", "abi": [ { "inputs": [ { "internalType": "contract L1ChugSplashProxy", "name": "_target", "type": "address" }, { "internalType": "address", "name": "_finalOwner", "type": "address" }, { "internalType": "bytes32", "name": "_codeHash", "type": "bytes32" }, { "internalType": "bytes32", "name": "_messengerSlotKey", "type": "bytes32" }, { "internalType": "bytes32", "name": "_messengerSlotVal", "type": "bytes32" }, { "internalType": "bytes32", "name": "_bridgeSlotKey", "type": "bytes32" }, { "internalType": "bytes32", "name": "_bridgeSlotVal", "type": "bytes32" }, { "internalType": "bytes32", "name": "_mantleAddressSlotKey", "type": "bytes32" }, { "internalType": "bytes32", "name": "_mantleAddressSlotVal", "type": "bytes32" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "bridgeSlotKey", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "bridgeSlotVal", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "codeHash", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes", "name": "_code", "type": "bytes" } ], "name": "doActions", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "finalOwner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "isUpgrading", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "mantleAddressSlotKey", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "mantleAddressSlotVal", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "messengerSlotKey", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "messengerSlotVal", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "returnOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "target", "outputs": [ { "internalType": "contract L1ChugSplashProxy", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" } ], "transactionHash": "0x2003fcd7f68a9c8e329de3ca4bb938c2ab8a890f35ac92c9528a42d54dc03bf2", "receipt": { "to": null, "from": "0x2A2954F3989a83Cc43DD58B0f038D5F276f21333", "contractAddress": "0x0B59785f4dD909B6d2c94090fDa6A2d447f478E8", "transactionIndex": 5, "gasUsed": "584754", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "blockHash": "0xef151f4acccbd98c3965057f875c575e515e7f8efd149d0518d46850f20bfc81", "transactionHash": "0x2003fcd7f68a9c8e329de3ca4bb938c2ab8a890f35ac92c9528a42d54dc03bf2", "logs": [], "blockNumber": 17578055, "cumulativeGasUsed": "2222571", "status": 1, "byzantium": true }, "args": [ "0x95fC37A27a2f68e3A647CDc081F0A89bb47c3012", "0x4e59e778a0fb77fBb305637435C62FaeD9aED40f", "0xa4e8ade53991df2db68673244884495593ed6c3cc59073dde4bf14a543e0c400", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x000000000000000000000000676A795fe6E43C17c668de16730c3F690FEB7120", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000004200000000000000000000000000000000000010", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000003c3a81e81dc49a522a592e7622a7e711c06bf354" ], "numDeployments": 1, "solcInputHash": "d54656ad11a7a79b199c84917c77d37b", "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract L1ChugSplashProxy\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_finalOwner\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_codeHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_messengerSlotKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_messengerSlotVal\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_bridgeSlotKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_bridgeSlotVal\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_mantleAddressSlotKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_mantleAddressSlotVal\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"bridgeSlotKey\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bridgeSlotVal\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"codeHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"name\":\"doActions\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isUpgrading\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mantleAddressSlotKey\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mantleAddressSlotVal\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messengerSlotKey\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messengerSlotVal\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"returnOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"target\",\"outputs\":[{\"internalType\":\"contract L1ChugSplashProxy\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Like the AddressDictator, but specifically for the Proxy__BVM_L1StandardBridge. We're working on a generalized version of this but this is good enough for the moment.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"ChugSplashDictator\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"returnOwnership()\":{\"notice\":\"Transfers ownership of this contract to the finalOwner. Only callable by the finalOwner, which is intended to be our multisig. This function shouldn't be necessary, but it gives a sense of reassurance that we can recover if something really surprising goes wrong.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/deployment/ChugSplashDictator.sol\":\"ChugSplashDictator\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/L1/deployment/ChugSplashDictator.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\nimport { L1ChugSplashProxy } from \\\"../../chugsplash/L1ChugSplashProxy.sol\\\";\\nimport { iL1ChugSplashDeployer } from \\\"../../chugsplash/interfaces/iL1ChugSplashDeployer.sol\\\";\\n\\n/**\\n * @title ChugSplashDictator\\n * @dev Like the AddressDictator, but specifically for the Proxy__BVM_L1StandardBridge. We're\\n * working on a generalized version of this but this is good enough for the moment.\\n */\\ncontract ChugSplashDictator is iL1ChugSplashDeployer {\\n /*************\\n * Variables *\\n *************/\\n\\n // slither-disable-next-line constable-states\\n bool public isUpgrading = true;\\n L1ChugSplashProxy public target;\\n address public finalOwner;\\n bytes32 public codeHash;\\n bytes32 public messengerSlotKey;\\n bytes32 public messengerSlotVal;\\n bytes32 public bridgeSlotKey;\\n bytes32 public bridgeSlotVal;\\n bytes32 public mantleAddressSlotKey;\\n bytes32 public mantleAddressSlotVal;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n constructor(\\n L1ChugSplashProxy _target,\\n address _finalOwner,\\n bytes32 _codeHash,\\n bytes32 _messengerSlotKey,\\n bytes32 _messengerSlotVal,\\n bytes32 _bridgeSlotKey,\\n bytes32 _bridgeSlotVal,\\n bytes32 _mantleAddressSlotKey,\\n bytes32 _mantleAddressSlotVal\\n ) {\\n target = _target;\\n finalOwner = _finalOwner;\\n codeHash = _codeHash;\\n messengerSlotKey = _messengerSlotKey;\\n messengerSlotVal = _messengerSlotVal;\\n bridgeSlotKey = _bridgeSlotKey;\\n bridgeSlotVal = _bridgeSlotVal;\\n mantleAddressSlotKey = _mantleAddressSlotKey;\\n mantleAddressSlotVal = _mantleAddressSlotVal;\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n function doActions(bytes memory _code) external {\\n require(keccak256(_code) == codeHash, \\\"ChugSplashDictator: Incorrect code hash.\\\");\\n\\n target.setCode(_code);\\n target.setStorage(messengerSlotKey, messengerSlotVal);\\n target.setStorage(bridgeSlotKey, bridgeSlotVal);\\n target.setStorage(mantleAddressSlotKey, mantleAddressSlotVal);\\n target.setOwner(finalOwner);\\n }\\n\\n /**\\n * Transfers ownership of this contract to the finalOwner.\\n * Only callable by the finalOwner, which is intended to be our multisig.\\n * This function shouldn't be necessary, but it gives a sense of reassurance that we can\\n * recover if something really surprising goes wrong.\\n */\\n function returnOwnership() external {\\n require(msg.sender == finalOwner, \\\"ChugSplashDictator: only callable by finalOwner\\\");\\n\\n target.setOwner(finalOwner);\\n }\\n}\\n\",\"keccak256\":\"0x4a1b006935c40eeac819b281cf20a094f96e3f6957b3c20280c6795ee314ac23\",\"license\":\"MIT\"},\"contracts/chugsplash/L1ChugSplashProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\nimport { iL1ChugSplashDeployer } from \\\"./interfaces/iL1ChugSplashDeployer.sol\\\";\\n\\n/**\\n * @title L1ChugSplashProxy\\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\\n *\\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\\n * you're doing. Anything public can potentially have a function signature that conflicts with a\\n * signature attached to the implementation contract. Public functions SHOULD always have the\\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\\n */\\ncontract L1ChugSplashProxy {\\n /*************\\n * Constants *\\n *************/\\n\\n // \\\"Magic\\\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\\n // appended bytecode will be deployed as given.\\n bytes13 internal constant DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\\n bytes32 internal constant IMPLEMENTATION_KEY =\\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\\n bytes32 internal constant OWNER_KEY =\\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _owner Address of the initial contract owner.\\n */\\n constructor(address _owner) {\\n _setOwner(_owner);\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks a function from being called when the parent signals that the system should be paused\\n * via an isUpgrading function.\\n */\\n modifier onlyWhenNotPaused() {\\n address owner = _getOwner();\\n\\n // We do a low-level call because there's no guarantee that the owner actually *is* an\\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\\n // it turns out that it isn't the right type of contract.\\n (bool success, bytes memory returndata) = owner.staticcall(\\n abi.encodeWithSelector(iL1ChugSplashDeployer.isUpgrading.selector)\\n );\\n\\n // If the call was unsuccessful then we assume that there's no \\\"isUpgrading\\\" method and we\\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\\n // long. If this isn't the case then we can safely ignore the result.\\n if (success && returndata.length == 32) {\\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\\n // case that the isUpgrading function returned something other than 0 or 1. But we only\\n // really care about the case where this value is 0 (= false).\\n uint256 ret = abi.decode(returndata, (uint256));\\n require(ret == 0, \\\"L1ChugSplashProxy: system is currently being upgraded\\\");\\n }\\n\\n _;\\n }\\n\\n /**\\n * Makes a proxy call instead of triggering the given function when the caller is either the\\n * owner or the zero address. Caller can only ever be the zero address if this function is\\n * being called off-chain via eth_call, which is totally fine and can be convenient for\\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\\n * and the proxy function ends up being called instead of the implementation one.\\n *\\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\\n * we have much bigger problems. Primary reason to include this additional allowed sender is\\n * because the owner address can be changed dynamically and we do not want clients to have to\\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\\n * proxied contract.\\n */\\n // slither-disable-next-line incorrect-modifier\\n modifier proxyCallIfNotOwner() {\\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\\n _;\\n } else {\\n // This WILL halt the call frame on completion.\\n _doProxyCall();\\n }\\n }\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n // slither-disable-next-line locked-ether\\n fallback() external payable {\\n // Proxy call by default.\\n _doProxyCall();\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\\n * different from the standard proxy scheme where one would typically deploy the code\\n * separately and then set the implementation address. We're doing it this way because it gives\\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\\n * @param _code New contract code to run inside this contract.\\n */\\n // slither-disable-next-line external-function\\n function setCode(bytes memory _code) public proxyCallIfNotOwner {\\n // Get the code hash of the current implementation.\\n address implementation = _getImplementation();\\n\\n // If the code hash matches the new implementation then we return early.\\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\\n return;\\n }\\n\\n // Create the deploycode by appending the magic prefix.\\n bytes memory deploycode = abi.encodePacked(DEPLOY_CODE_PREFIX, _code);\\n\\n // Deploy the code and set the new implementation address.\\n address newImplementation;\\n assembly {\\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\\n }\\n\\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\\n // actually fail this check. Should only happen if the contract creation from above runs\\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\\n // should be doing this check anyway though.\\n require(\\n _getAccountCodeHash(newImplementation) == keccak256(_code),\\n \\\"L1ChugSplashProxy: code was not correctly deployed.\\\"\\n );\\n\\n _setImplementation(newImplementation);\\n }\\n\\n /**\\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\\n * upgrades in a more transparent way. Only callable by the owner.\\n * @param _key Storage key to modify.\\n * @param _value New value for the storage key.\\n */\\n // slither-disable-next-line external-function\\n function setStorage(bytes32 _key, bytes32 _value) public proxyCallIfNotOwner {\\n assembly {\\n sstore(_key, _value)\\n }\\n }\\n\\n /**\\n * Changes the owner of the proxy contract. Only callable by the owner.\\n * @param _owner New owner of the proxy contract.\\n */\\n // slither-disable-next-line external-function\\n function setOwner(address _owner) public proxyCallIfNotOwner {\\n _setOwner(_owner);\\n }\\n\\n /**\\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Owner address.\\n */\\n // slither-disable-next-line external-function\\n function getOwner() public proxyCallIfNotOwner returns (address) {\\n return _getOwner();\\n }\\n\\n /**\\n * Queries the implementation address. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Implementation address.\\n */\\n // slither-disable-next-line external-function\\n function getImplementation() public proxyCallIfNotOwner returns (address) {\\n return _getImplementation();\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Sets the implementation address.\\n * @param _implementation New implementation address.\\n */\\n function _setImplementation(address _implementation) internal {\\n assembly {\\n sstore(IMPLEMENTATION_KEY, _implementation)\\n }\\n }\\n\\n /**\\n * Queries the implementation address.\\n * @return Implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n address implementation;\\n assembly {\\n implementation := sload(IMPLEMENTATION_KEY)\\n }\\n return implementation;\\n }\\n\\n /**\\n * Changes the owner of the proxy contract.\\n * @param _owner New owner of the proxy contract.\\n */\\n function _setOwner(address _owner) internal {\\n assembly {\\n sstore(OWNER_KEY, _owner)\\n }\\n }\\n\\n /**\\n * Queries the owner of the proxy contract.\\n * @return Owner address.\\n */\\n function _getOwner() internal view returns (address) {\\n address owner;\\n assembly {\\n owner := sload(OWNER_KEY)\\n }\\n return owner;\\n }\\n\\n /**\\n * Gets the code hash for a given account.\\n * @param _account Address of the account to get a code hash for.\\n * @return Code hash for the account.\\n */\\n function _getAccountCodeHash(address _account) internal view returns (bytes32) {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_account)\\n }\\n return codeHash;\\n }\\n\\n /**\\n * Performs the proxy call via a delegatecall.\\n */\\n function _doProxyCall() internal onlyWhenNotPaused {\\n address implementation = _getImplementation();\\n\\n require(implementation != address(0), \\\"L1ChugSplashProxy: implementation is not set yet\\\");\\n\\n assembly {\\n // Copy calldata into memory at 0x0....calldatasize.\\n calldatacopy(0x0, 0x0, calldatasize())\\n\\n // Perform the delegatecall, make sure to pass all available gas.\\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\\n\\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\\n // overwrite the calldata that we just copied into memory but that doesn't really\\n // matter because we'll be returning in a second anyway.\\n returndatacopy(0x0, 0x0, returndatasize())\\n\\n // Success == 0 means a revert. We'll revert too and pass the data up.\\n if iszero(success) {\\n revert(0x0, returndatasize())\\n }\\n\\n // Otherwise we'll just return and pass the data up.\\n return(0x0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc3cb52dfdc2706992572dd5621ae89ba919fd20539b73488a455d564f16f1b8d\",\"license\":\"MIT\"},\"contracts/chugsplash/interfaces/iL1ChugSplashDeployer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title iL1ChugSplashDeployer\\n */\\ninterface iL1ChugSplashDeployer {\\n function isUpgrading() external view returns (bool);\\n}\\n\",\"keccak256\":\"0x9a496d99f111c1091f0c33d6bfc7802a522baa7235614b0014f35e4bbe280e57\",\"license\":\"MIT\"}},\"version\":1}", "bytecode": "0x60806040526000805460ff1916600117905534801561001d57600080fd5b5060405161077b38038061077b83398101604081905261003c916100b1565b60008054610100600160a81b0319166101006001600160a01b039b8c1602179055600180546001600160a01b031916989099169790971790975560029490945560039290925560045560055560065560079190915560085561012f565b6001600160a01b03811681146100ae57600080fd5b50565b60008060008060008060008060006101208a8c0312156100d057600080fd5b89516100db81610099565b60208b01519099506100ec81610099565b8098505060408a0151965060608a0151955060808a0151945060a08a0151935060c08a0151925060e08a015191506101008a015190509295985092959850929598565b61063d8061013e6000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063708518de11610071578063708518de1461012f578063907023dd14610138578063a3b2d8a514610141578063b0175cb01461014a578063b794726214610153578063d4b839921461017057600080fd5b80630bf56f21146100b957806317ad94ec146100ce57806318edaaf2146100fe578063297d1a341461011557806341cd1c721461011d5780635307023b14610126575b600080fd5b6100cc6100c7366004610501565b610188565b005b6001546100e1906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61010760025481565b6040519081526020016100f5565b6100cc610411565b61010760075481565b61010760045481565b61010760035481565b61010760065481565b61010760055481565b61010760085481565b6000546101609060ff1681565b60405190151581526020016100f5565b6000546100e19061010090046001600160a01b031681565b60025481516020830120146101f55760405162461bcd60e51b815260206004820152602860248201527f4368756753706c6173684469637461746f723a20496e636f727265637420636f6044820152673232903430b9b41760c11b60648201526084015b60405180910390fd5b6000546040516306c5d4ad60e41b81526101009091046001600160a01b031690636c5d4ad0906102299084906004016105b2565b600060405180830381600087803b15801561024357600080fd5b505af1158015610257573d6000803e3d6000fd5b505060005460035460048054604051634d8587ed60e11b81529182019290925260248101919091526101009091046001600160a01b03169250639b0b0fda9150604401600060405180830381600087803b1580156102b457600080fd5b505af11580156102c8573d6000803e3d6000fd5b5050600054600554600654604051634d8587ed60e11b8152600481019290925260248201526101009091046001600160a01b03169250639b0b0fda9150604401600060405180830381600087803b15801561032257600080fd5b505af1158015610336573d6000803e3d6000fd5b5050600054600754600854604051634d8587ed60e11b8152600481019290925260248201526101009091046001600160a01b03169250639b0b0fda9150604401600060405180830381600087803b15801561039057600080fd5b505af11580156103a4573d6000803e3d6000fd5b50506000546001546040516313af403560e01b81526001600160a01b0391821660048201526101009092041692506313af40359150602401600060405180830381600087803b1580156103f657600080fd5b505af115801561040a573d6000803e3d6000fd5b5050505050565b6001546001600160a01b031633146104835760405162461bcd60e51b815260206004820152602f60248201527f4368756753706c6173684469637461746f723a206f6e6c792063616c6c61626c60448201526e3290313c903334b730b627bbb732b960891b60648201526084016101ec565b6000546001546040516313af403560e01b81526001600160a01b03918216600482015261010090920416906313af403590602401600060405180830381600087803b1580156104d157600080fd5b505af11580156104e5573d6000803e3d6000fd5b50505050565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561051357600080fd5b813567ffffffffffffffff8082111561052b57600080fd5b818401915084601f83011261053f57600080fd5b813581811115610551576105516104eb565b604051601f8201601f19908116603f01168101908382118183101715610579576105796104eb565b8160405282815287602084870101111561059257600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b818110156105df578581018301518582016040015282016105c3565b818111156105f1576000604083870101525b50601f01601f191692909201604001939250505056fea26469706673582212207b01409ca74ea9beb00c4afd0793cc78c604ec8e75228d28e2d3913d45ef3dc064736f6c63430008090033", "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c8063708518de11610071578063708518de1461012f578063907023dd14610138578063a3b2d8a514610141578063b0175cb01461014a578063b794726214610153578063d4b839921461017057600080fd5b80630bf56f21146100b957806317ad94ec146100ce57806318edaaf2146100fe578063297d1a341461011557806341cd1c721461011d5780635307023b14610126575b600080fd5b6100cc6100c7366004610501565b610188565b005b6001546100e1906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61010760025481565b6040519081526020016100f5565b6100cc610411565b61010760075481565b61010760045481565b61010760035481565b61010760065481565b61010760055481565b61010760085481565b6000546101609060ff1681565b60405190151581526020016100f5565b6000546100e19061010090046001600160a01b031681565b60025481516020830120146101f55760405162461bcd60e51b815260206004820152602860248201527f4368756753706c6173684469637461746f723a20496e636f727265637420636f6044820152673232903430b9b41760c11b60648201526084015b60405180910390fd5b6000546040516306c5d4ad60e41b81526101009091046001600160a01b031690636c5d4ad0906102299084906004016105b2565b600060405180830381600087803b15801561024357600080fd5b505af1158015610257573d6000803e3d6000fd5b505060005460035460048054604051634d8587ed60e11b81529182019290925260248101919091526101009091046001600160a01b03169250639b0b0fda9150604401600060405180830381600087803b1580156102b457600080fd5b505af11580156102c8573d6000803e3d6000fd5b5050600054600554600654604051634d8587ed60e11b8152600481019290925260248201526101009091046001600160a01b03169250639b0b0fda9150604401600060405180830381600087803b15801561032257600080fd5b505af1158015610336573d6000803e3d6000fd5b5050600054600754600854604051634d8587ed60e11b8152600481019290925260248201526101009091046001600160a01b03169250639b0b0fda9150604401600060405180830381600087803b15801561039057600080fd5b505af11580156103a4573d6000803e3d6000fd5b50506000546001546040516313af403560e01b81526001600160a01b0391821660048201526101009092041692506313af40359150602401600060405180830381600087803b1580156103f657600080fd5b505af115801561040a573d6000803e3d6000fd5b5050505050565b6001546001600160a01b031633146104835760405162461bcd60e51b815260206004820152602f60248201527f4368756753706c6173684469637461746f723a206f6e6c792063616c6c61626c60448201526e3290313c903334b730b627bbb732b960891b60648201526084016101ec565b6000546001546040516313af403560e01b81526001600160a01b03918216600482015261010090920416906313af403590602401600060405180830381600087803b1580156104d157600080fd5b505af11580156104e5573d6000803e3d6000fd5b50505050565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561051357600080fd5b813567ffffffffffffffff8082111561052b57600080fd5b818401915084601f83011261053f57600080fd5b813581811115610551576105516104eb565b604051601f8201601f19908116603f01168101908382118183101715610579576105796104eb565b8160405282815287602084870101111561059257600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b818110156105df578581018301518582016040015282016105c3565b818111156105f1576000604083870101525b50601f01601f191692909201604001939250505056fea26469706673582212207b01409ca74ea9beb00c4afd0793cc78c604ec8e75228d28e2d3913d45ef3dc064736f6c63430008090033", "devdoc": { "details": "Like the AddressDictator, but specifically for the Proxy__BVM_L1StandardBridge. We're working on a generalized version of this but this is good enough for the moment.", "kind": "dev", "methods": {}, "title": "ChugSplashDictator", "version": 1 }, "userdoc": { "kind": "user", "methods": { "returnOwnership()": { "notice": "Transfers ownership of this contract to the finalOwner. Only callable by the finalOwner, which is intended to be our multisig. This function shouldn't be necessary, but it gives a sense of reassurance that we can recover if something really surprising goes wrong." } }, "version": 1 }, "storageLayout": { "storage": [ { "astId": 13219, "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", "label": "isUpgrading", "offset": 0, "slot": "0", "type": "t_bool" }, { "astId": 13222, "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", "label": "target", "offset": 1, "slot": "0", "type": "t_contract(L1ChugSplashProxy)47142" }, { "astId": 13224, "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", "label": "finalOwner", "offset": 0, "slot": "1", "type": "t_address" }, { "astId": 13226, "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", "label": "codeHash", "offset": 0, "slot": "2", "type": "t_bytes32" }, { "astId": 13228, "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", "label": "messengerSlotKey", "offset": 0, "slot": "3", "type": "t_bytes32" }, { "astId": 13230, "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", "label": "messengerSlotVal", "offset": 0, "slot": "4", "type": "t_bytes32" }, { "astId": 13232, "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", "label": "bridgeSlotKey", "offset": 0, "slot": "5", "type": "t_bytes32" }, { "astId": 13234, "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", "label": "bridgeSlotVal", "offset": 0, "slot": "6", "type": "t_bytes32" }, { "astId": 13236, "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", "label": "mantleAddressSlotKey", "offset": 0, "slot": "7", "type": "t_bytes32" }, { "astId": 13238, "contract": "contracts/L1/deployment/ChugSplashDictator.sol:ChugSplashDictator", "label": "mantleAddressSlotVal", "offset": 0, "slot": "8", "type": "t_bytes32" } ], "types": { "t_address": { "encoding": "inplace", "label": "address", "numberOfBytes": "20" }, "t_bool": { "encoding": "inplace", "label": "bool", "numberOfBytes": "1" }, "t_bytes32": { "encoding": "inplace", "label": "bytes32", "numberOfBytes": "32" }, "t_contract(L1ChugSplashProxy)47142": { "encoding": "inplace", "label": "contract L1ChugSplashProxy", "numberOfBytes": "20" } } } }