{
  "abi": [
    {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "msgHash",
          "type": "bytes32"
        }
      ],
      "name": "FailedRelayedMessage",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "version",
          "type": "uint8"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "msgHash",
          "type": "bytes32"
        }
      ],
      "name": "RelayedMessage",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "message",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "messageNonce",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "gasLimit",
          "type": "uint256"
        }
      ],
      "name": "SentMessage",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "SentMessageExtension1",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "MESSAGE_VERSION",
      "outputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MIN_GAS_CALLDATA_OVERHEAD",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "OTHER_MESSENGER",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "PORTAL",
      "outputs": [
        {
          "internalType": "contract OptimismPortal",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "RELAY_CALL_OVERHEAD",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "RELAY_CONSTANT_OVERHEAD",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "RELAY_GAS_CHECK_BUFFER",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "RELAY_RESERVED_GAS",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "_message",
          "type": "bytes"
        },
        {
          "internalType": "uint32",
          "name": "_minGasLimit",
          "type": "uint32"
        }
      ],
      "name": "baseGas",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "failedMessages",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract OptimismPortal",
          "name": "_portal",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_nativeTokenAddress",
          "type": "address"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "messageNonce",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "nativeTokenAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "onApprove",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "portal",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_nonce",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_sender",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_target",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_value",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_minGasLimit",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "_message",
          "type": "bytes"
        }
      ],
      "name": "relayMessage",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_target",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "_message",
          "type": "bytes"
        },
        {
          "internalType": "uint32",
          "name": "_minGasLimit",
          "type": "uint32"
        }
      ],
      "name": "sendMessage",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_target",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "_message",
          "type": "bytes"
        },
        {
          "internalType": "uint32",
          "name": "_minGasLimit",
          "type": "uint32"
        }
      ],
      "name": "sendNativeTokenMessage",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "successfulMessages",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "unpackOnApproveData",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "_minGasLimit",
          "type": "uint32"
        },
        {
          "internalType": "bytes",
          "name": "_message",
          "type": "bytes"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "version",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "xDomainMessageSender",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "address": "0x556Ab37b5DDF003D4349024fa2aEA23D71971881",
  "args": [],
  "bytecode": "0x60a06040523480156200001157600080fd5b50734200000000000000000000000000000000000007608052620000376000806200003d565b62000227565b600054600390600160a81b900460ff1615801562000069575060005460ff808316600160a01b90920416105b620000d25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff60a81b1960ff8416600160a01b021661ffff60a01b1990911617600160a81b17905560f980546001600160a01b038086166001600160a01b03199283161790925560fa80549285169290911691909117905562000134620001a2565b60f9546001600160a01b03161580159062000159575060fa546001600160a01b031615155b506000805460ff60a81b1916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b600054600160a81b900460ff16620002115760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000c9565b60cc80546001600160a01b03191661dead179055565b608051612bc3620002586000396000818161043d01528181610615015281816118a90152611e750152612bc36000f3fe6080604052600436106101965760003560e01c80635644cfdf116100e15780639fce812c1161008a578063b28ade2511610064578063b28ade25146104bf578063d764ad0b146104df578063e0e593c5146104f2578063ecc704281461051257600080fd5b80639fce812c1461042b578063a4e7f8bd1461045f578063b1b1b2091461048f57600080fd5b806383a74074116100bb57806383a74074146103e65780638cbeeef2146102f757806392a162cf146103fd57600080fd5b80635644cfdf146103905780636425666b146103a65780636e296e45146103d157600080fd5b80633f827a5a116101435780634c1d6a691161011d5780634c1d6a69146102f75780634d0047ee1461030d57806354fd4d501461033a57600080fd5b80633f827a5a1461028f5780634273ca16146102b7578063485cc955146102d757600080fd5b80630ff754ea116101745780630ff754ea146102135780632828d7e8146102655780633dbb202b1461027a57600080fd5b806301ffc9a71461019b578063028f85f7146101d05780630c568498146101fe575b600080fd5b3480156101a757600080fd5b506101bb6101b6366004612329565b610577565b60405190151581526020015b60405180910390f35b3480156101dc57600080fd5b506101e5601081565b60405167ffffffffffffffff90911681526020016101c7565b34801561020a57600080fd5b506101e5603f81565b34801561021f57600080fd5b5060f9546102409073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c7565b34801561027157600080fd5b506101e5604081565b61028d6102883660046123f2565b610610565b005b34801561029b57600080fd5b506102a4600181565b60405161ffff90911681526020016101c7565b3480156102c357600080fd5b506101bb6102d2366004612459565b610874565b3480156102e357600080fd5b5061028d6102f23660046124cc565b610ad5565b34801561030357600080fd5b506101e5619c4081565b34801561031957600080fd5b5060fa546102409073ffffffffffffffffffffffffffffffffffffffff1681565b34801561034657600080fd5b506103836040518060400160405280600581526020017f312e372e3100000000000000000000000000000000000000000000000000000081525081565b6040516101c7919061257b565b34801561039c57600080fd5b506101e561138881565b3480156103b257600080fd5b5060f95473ffffffffffffffffffffffffffffffffffffffff16610240565b3480156103dd57600080fd5b50610240610d2e565b3480156103f257600080fd5b506101e562030d4081565b34801561040957600080fd5b5061041d6104183660046125bd565b610e15565b6040516101c792919061268c565b34801561043757600080fd5b506102407f000000000000000000000000000000000000000000000000000000000000000081565b34801561046b57600080fd5b506101bb61047a3660046126ab565b60ce6020526000908152604090205460ff1681565b34801561049b57600080fd5b506101bb6104aa3660046126ab565b60cb6020526000908152604090205460ff1681565b3480156104cb57600080fd5b506101e56104da3660046126c4565b610e5e565b61028d6104ed366004612718565b610ece565b3480156104fe57600080fd5b5061028d61050d36600461279e565b6118a4565b34801561051e57600080fd5b5061056960cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101c7565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4273ca1600000000000000000000000000000000000000000000000000000000148061060a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6107497f000000000000000000000000000000000000000000000000000000000000000061063f858585610e5e565b347fd764ad0b000000000000000000000000000000000000000000000000000000006106ab60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016106c79796959493929190612858565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611a8c565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a3385856107ce60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516107e09594939291906128b7565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60fa5460009073ffffffffffffffffffffffffffffffffffffffff163314610923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f6f6e6c7920616363657074206e617469766520746f6b656e20617070726f766560448201527f2063616c6c6261636b000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b60008061096585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e1592505050565b90925090508515610a365760fa546109959073ffffffffffffffffffffffffffffffffffffffff16893089611c57565b60fa5460f9546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201526024810189905291169063095ea7b3906044016020604051808303816000875af1158015610a10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a349190612905565b505b60f9546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c4290610a95908b908a9087906000908890600401612927565b600060405180830381600087803b158015610aaf57600080fd5b505af1158015610ac3573d6000803e3d6000fd5b5060019b9a5050505050505050505050565b6000546003907501000000000000000000000000000000000000000000900460ff16158015610b23575060005460ff8083167401000000000000000000000000000000000000000090920416105b610baf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161091a565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff60ff84167401000000000000000000000000000000000000000002167fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff90911617750100000000000000000000000000000000000000000017905560f9805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fa805492851692909116919091179055610c8c611cf2565b60f95473ffffffffffffffffffffffffffffffffffffffff1615801590610cca575060fa5473ffffffffffffffffffffffffffffffffffffffff1615155b50600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff215301610df8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f74207365740000000000000000000000606482015260840161091a565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b60006060600483511015610e3a57505060408051602081019091526000815262030d40905b825160208401805160e01c93509060048114610e57576004820192505b5050915091565b6000611388619c4080603f610e7a604063ffffffff881661299f565b610e8491906129cf565b610e8f60108861299f565b610e9c9062030d40612a1d565b610ea69190612a1d565b610eb09190612a1d565b610eba9190612a1d565b610ec49190612a1d565b90505b9392505050565b3415610f5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f000000000000000000000000000000000000000000000000606482015260840161091a565b60f087901c60028110611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a40161091a565b8061ffff1660000361110c576000611068878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f9250611dcb915050565b600081815260cb602052604090205490915060ff161561110a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c61796564000000000000000000606482015260840161091a565b505b6000611152898989898989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611dea92505050565b905061115c611e0d565b156111b057600081815260ce602052604090205460ff161561118057611180612a49565b85156111ab5760fa546111ab9073ffffffffffffffffffffffffffffffffffffffff16333089611c57565b61124e565b600081815260ce602052604090205460ff1661124e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c6179656400000000000000000000000000000000606482015260840161091a565b61125787611f03565b1561130a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a40161091a565b600081815260cb602052604090205460ff16156113a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c6179656400000000000000000000606482015260840161091a565b6113ca856113bb611388619c40612a1d565b67ffffffffffffffff16611f46565b15806113f0575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561150957600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3201611502576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161091a565b505061189b565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a16179055600186156115f15760fa546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152602482018a90529091169063095ea7b3906044016020604051808303816000875af11580156115ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ee9190612905565b90505b600061164389619c405a6116059190612a78565b600089898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f6492505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905087156117175760fa546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81166004830152600060248301529091169063095ea7b3906044016020604051808303816000875af11580156116f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117149190612905565b91505b8080156117215750815b1561178957600083815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555184917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611896565b600083815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555184917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3201611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161091a565b505050505b50505050505050565b61195b7f00000000000000000000000000000000000000000000000000000000000000006118d3858585610e5e565b867fd764ad0b0000000000000000000000000000000000000000000000000000000061193f60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338b8b898c8c6040516024016106c79796959493929190612858565b8473ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a3385856119e060cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516119f29594939291906128b7565b60405180910390a260405184815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff000000000000000000000000000000000000000000000000000000000000909116179055505050565b905090565b3415611af4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f44656e79206465706f736974696e672045544800000000000000000000000000604482015260640161091a565b8115611bc05760fa54611b1f9073ffffffffffffffffffffffffffffffffffffffff16333085611c57565b60fa5460f9546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201526024810185905291169063095ea7b3906044016020604051808303816000875af1158015611b9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbe9190612905565b505b60f9546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c4290611c1f908790869088906000908890600401612a8f565b600060405180830381600087803b158015611c3957600080fd5b505af1158015611c4d573d6000803e3d6000fd5b5050505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052611cec908590611f7e565b50505050565b6000547501000000000000000000000000000000000000000000900460ff16611d9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161091a565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055565b6000611dd98585858561208f565b805190602001209050949350505050565b6000611dfa878787878787612128565b8051906020012090509695505050505050565b60f95460009073ffffffffffffffffffffffffffffffffffffffff1633148015611a87575060f954604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116931691639bf62d829160048083019260209291908290030181865afa158015611ec3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee79190612adc565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff821630148061060a57505060f95473ffffffffffffffffffffffffffffffffffffffff90811691161490565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b6000611fe0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166121c79092919063ffffffff16565b80519091501561208a5780806020019051810190611ffe9190612905565b61208a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161091a565b505050565b6060848484846040516024016120a89493929190612af9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b606086868686868660405160240161214596959493929190612b43565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b6060610ec484846000858573ffffffffffffffffffffffffffffffffffffffff85163b612250576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161091a565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516122799190612b9a565b60006040518083038185875af1925050503d80600081146122b6576040519150601f19603f3d011682016040523d82523d6000602084013e6122bb565b606091505b50915091506122cb8282866122d6565b979650505050505050565b606083156122e5575081610ec7565b8251156122f55782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091a919061257b565b60006020828403121561233b57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610ec757600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461238d57600080fd5b50565b60008083601f8401126123a257600080fd5b50813567ffffffffffffffff8111156123ba57600080fd5b6020830191508360208285010111156123d257600080fd5b9250929050565b803563ffffffff811681146123ed57600080fd5b919050565b6000806000806060858703121561240857600080fd5b84356124138161236b565b9350602085013567ffffffffffffffff81111561242f57600080fd5b61243b87828801612390565b909450925061244e9050604086016123d9565b905092959194509250565b60008060008060006080868803121561247157600080fd5b853561247c8161236b565b9450602086013561248c8161236b565b935060408601359250606086013567ffffffffffffffff8111156124af57600080fd5b6124bb88828901612390565b969995985093965092949392505050565b600080604083850312156124df57600080fd5b82356124ea8161236b565b915060208301356124fa8161236b565b809150509250929050565b60005b83811015612520578181015183820152602001612508565b83811115611cec5750506000910152565b60008151808452612549816020860160208601612505565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610ec76020830184612531565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156125cf57600080fd5b813567ffffffffffffffff808211156125e757600080fd5b818401915084601f8301126125fb57600080fd5b81358181111561260d5761260d61258e565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156126535761265361258e565b8160405282815287602084870101111561266c57600080fd5b826020860160208301376000928101602001929092525095945050505050565b63ffffffff83168152604060208201526000610ec46040830184612531565b6000602082840312156126bd57600080fd5b5035919050565b6000806000604084860312156126d957600080fd5b833567ffffffffffffffff8111156126f057600080fd5b6126fc86828701612390565b909450925061270f9050602085016123d9565b90509250925092565b600080600080600080600060c0888a03121561273357600080fd5b8735965060208801356127458161236b565b955060408801356127558161236b565b9450606088013593506080880135925060a088013567ffffffffffffffff81111561277f57600080fd5b61278b8a828b01612390565b989b979a50959850939692959293505050565b6000806000806000608086880312156127b657600080fd5b85356127c18161236b565b945060208601359350604086013567ffffffffffffffff8111156127e457600080fd5b6127f088828901612390565b90945092506128039050606087016123d9565b90509295509295909350565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a08301526128aa60c08301848661280f565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff861681526080602082015260006128e760808301868861280f565b905083604083015263ffffffff831660608301529695505050505050565b60006020828403121561291757600080fd5b81518015158114610ec757600080fd5b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015263ffffffff84166040820152821515606082015260a0608082015260006122cb60a0830184612531565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff808316818516818304811182151516156129c6576129c6612970565b02949350505050565b600067ffffffffffffffff80841680612a11577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115612a4057612a40612970565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082821015612a8a57612a8a612970565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a0608082015260006122cb60a0830184612531565b600060208284031215612aee57600080fd5b8151610ec78161236b565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152612b326080830185612531565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152612b8e60c0830184612531565b98975050505050505050565b60008251612bac818460208701612505565b919091019291505056fea164736f6c634300080f000a",
  "deployedBytecode": "0x6080604052600436106101965760003560e01c80635644cfdf116100e15780639fce812c1161008a578063b28ade2511610064578063b28ade25146104bf578063d764ad0b146104df578063e0e593c5146104f2578063ecc704281461051257600080fd5b80639fce812c1461042b578063a4e7f8bd1461045f578063b1b1b2091461048f57600080fd5b806383a74074116100bb57806383a74074146103e65780638cbeeef2146102f757806392a162cf146103fd57600080fd5b80635644cfdf146103905780636425666b146103a65780636e296e45146103d157600080fd5b80633f827a5a116101435780634c1d6a691161011d5780634c1d6a69146102f75780634d0047ee1461030d57806354fd4d501461033a57600080fd5b80633f827a5a1461028f5780634273ca16146102b7578063485cc955146102d757600080fd5b80630ff754ea116101745780630ff754ea146102135780632828d7e8146102655780633dbb202b1461027a57600080fd5b806301ffc9a71461019b578063028f85f7146101d05780630c568498146101fe575b600080fd5b3480156101a757600080fd5b506101bb6101b6366004612329565b610577565b60405190151581526020015b60405180910390f35b3480156101dc57600080fd5b506101e5601081565b60405167ffffffffffffffff90911681526020016101c7565b34801561020a57600080fd5b506101e5603f81565b34801561021f57600080fd5b5060f9546102409073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c7565b34801561027157600080fd5b506101e5604081565b61028d6102883660046123f2565b610610565b005b34801561029b57600080fd5b506102a4600181565b60405161ffff90911681526020016101c7565b3480156102c357600080fd5b506101bb6102d2366004612459565b610874565b3480156102e357600080fd5b5061028d6102f23660046124cc565b610ad5565b34801561030357600080fd5b506101e5619c4081565b34801561031957600080fd5b5060fa546102409073ffffffffffffffffffffffffffffffffffffffff1681565b34801561034657600080fd5b506103836040518060400160405280600581526020017f312e372e3100000000000000000000000000000000000000000000000000000081525081565b6040516101c7919061257b565b34801561039c57600080fd5b506101e561138881565b3480156103b257600080fd5b5060f95473ffffffffffffffffffffffffffffffffffffffff16610240565b3480156103dd57600080fd5b50610240610d2e565b3480156103f257600080fd5b506101e562030d4081565b34801561040957600080fd5b5061041d6104183660046125bd565b610e15565b6040516101c792919061268c565b34801561043757600080fd5b506102407f000000000000000000000000000000000000000000000000000000000000000081565b34801561046b57600080fd5b506101bb61047a3660046126ab565b60ce6020526000908152604090205460ff1681565b34801561049b57600080fd5b506101bb6104aa3660046126ab565b60cb6020526000908152604090205460ff1681565b3480156104cb57600080fd5b506101e56104da3660046126c4565b610e5e565b61028d6104ed366004612718565b610ece565b3480156104fe57600080fd5b5061028d61050d36600461279e565b6118a4565b34801561051e57600080fd5b5061056960cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101c7565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4273ca1600000000000000000000000000000000000000000000000000000000148061060a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6107497f000000000000000000000000000000000000000000000000000000000000000061063f858585610e5e565b347fd764ad0b000000000000000000000000000000000000000000000000000000006106ab60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016106c79796959493929190612858565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611a8c565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a3385856107ce60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516107e09594939291906128b7565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60fa5460009073ffffffffffffffffffffffffffffffffffffffff163314610923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f6f6e6c7920616363657074206e617469766520746f6b656e20617070726f766560448201527f2063616c6c6261636b000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b60008061096585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e1592505050565b90925090508515610a365760fa546109959073ffffffffffffffffffffffffffffffffffffffff16893089611c57565b60fa5460f9546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201526024810189905291169063095ea7b3906044016020604051808303816000875af1158015610a10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a349190612905565b505b60f9546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c4290610a95908b908a9087906000908890600401612927565b600060405180830381600087803b158015610aaf57600080fd5b505af1158015610ac3573d6000803e3d6000fd5b5060019b9a5050505050505050505050565b6000546003907501000000000000000000000000000000000000000000900460ff16158015610b23575060005460ff8083167401000000000000000000000000000000000000000090920416105b610baf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161091a565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff60ff84167401000000000000000000000000000000000000000002167fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff90911617750100000000000000000000000000000000000000000017905560f9805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fa805492851692909116919091179055610c8c611cf2565b60f95473ffffffffffffffffffffffffffffffffffffffff1615801590610cca575060fa5473ffffffffffffffffffffffffffffffffffffffff1615155b50600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff215301610df8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f74207365740000000000000000000000606482015260840161091a565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b60006060600483511015610e3a57505060408051602081019091526000815262030d40905b825160208401805160e01c93509060048114610e57576004820192505b5050915091565b6000611388619c4080603f610e7a604063ffffffff881661299f565b610e8491906129cf565b610e8f60108861299f565b610e9c9062030d40612a1d565b610ea69190612a1d565b610eb09190612a1d565b610eba9190612a1d565b610ec49190612a1d565b90505b9392505050565b3415610f5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f000000000000000000000000000000000000000000000000606482015260840161091a565b60f087901c60028110611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a40161091a565b8061ffff1660000361110c576000611068878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f9250611dcb915050565b600081815260cb602052604090205490915060ff161561110a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c61796564000000000000000000606482015260840161091a565b505b6000611152898989898989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611dea92505050565b905061115c611e0d565b156111b057600081815260ce602052604090205460ff161561118057611180612a49565b85156111ab5760fa546111ab9073ffffffffffffffffffffffffffffffffffffffff16333089611c57565b61124e565b600081815260ce602052604090205460ff1661124e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c6179656400000000000000000000000000000000606482015260840161091a565b61125787611f03565b1561130a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a40161091a565b600081815260cb602052604090205460ff16156113a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c6179656400000000000000000000606482015260840161091a565b6113ca856113bb611388619c40612a1d565b67ffffffffffffffff16611f46565b15806113f0575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561150957600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3201611502576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161091a565b505061189b565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a16179055600186156115f15760fa546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152602482018a90529091169063095ea7b3906044016020604051808303816000875af11580156115ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ee9190612905565b90505b600061164389619c405a6116059190612a78565b600089898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f6492505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905087156117175760fa546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81166004830152600060248301529091169063095ea7b3906044016020604051808303816000875af11580156116f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117149190612905565b91505b8080156117215750815b1561178957600083815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555184917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611896565b600083815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555184917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3201611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161091a565b505050505b50505050505050565b61195b7f00000000000000000000000000000000000000000000000000000000000000006118d3858585610e5e565b867fd764ad0b0000000000000000000000000000000000000000000000000000000061193f60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338b8b898c8c6040516024016106c79796959493929190612858565b8473ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a3385856119e060cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516119f29594939291906128b7565b60405180910390a260405184815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff000000000000000000000000000000000000000000000000000000000000909116179055505050565b905090565b3415611af4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f44656e79206465706f736974696e672045544800000000000000000000000000604482015260640161091a565b8115611bc05760fa54611b1f9073ffffffffffffffffffffffffffffffffffffffff16333085611c57565b60fa5460f9546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201526024810185905291169063095ea7b3906044016020604051808303816000875af1158015611b9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbe9190612905565b505b60f9546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c4290611c1f908790869088906000908890600401612a8f565b600060405180830381600087803b158015611c3957600080fd5b505af1158015611c4d573d6000803e3d6000fd5b5050505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052611cec908590611f7e565b50505050565b6000547501000000000000000000000000000000000000000000900460ff16611d9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161091a565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055565b6000611dd98585858561208f565b805190602001209050949350505050565b6000611dfa878787878787612128565b8051906020012090509695505050505050565b60f95460009073ffffffffffffffffffffffffffffffffffffffff1633148015611a87575060f954604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116931691639bf62d829160048083019260209291908290030181865afa158015611ec3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee79190612adc565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff821630148061060a57505060f95473ffffffffffffffffffffffffffffffffffffffff90811691161490565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b6000611fe0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166121c79092919063ffffffff16565b80519091501561208a5780806020019051810190611ffe9190612905565b61208a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161091a565b505050565b6060848484846040516024016120a89493929190612af9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b606086868686868660405160240161214596959493929190612b43565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b6060610ec484846000858573ffffffffffffffffffffffffffffffffffffffff85163b612250576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161091a565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516122799190612b9a565b60006040518083038185875af1925050503d80600081146122b6576040519150601f19603f3d011682016040523d82523d6000602084013e6122bb565b606091505b50915091506122cb8282866122d6565b979650505050505050565b606083156122e5575081610ec7565b8251156122f55782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091a919061257b565b60006020828403121561233b57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610ec757600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461238d57600080fd5b50565b60008083601f8401126123a257600080fd5b50813567ffffffffffffffff8111156123ba57600080fd5b6020830191508360208285010111156123d257600080fd5b9250929050565b803563ffffffff811681146123ed57600080fd5b919050565b6000806000806060858703121561240857600080fd5b84356124138161236b565b9350602085013567ffffffffffffffff81111561242f57600080fd5b61243b87828801612390565b909450925061244e9050604086016123d9565b905092959194509250565b60008060008060006080868803121561247157600080fd5b853561247c8161236b565b9450602086013561248c8161236b565b935060408601359250606086013567ffffffffffffffff8111156124af57600080fd5b6124bb88828901612390565b969995985093965092949392505050565b600080604083850312156124df57600080fd5b82356124ea8161236b565b915060208301356124fa8161236b565b809150509250929050565b60005b83811015612520578181015183820152602001612508565b83811115611cec5750506000910152565b60008151808452612549816020860160208601612505565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610ec76020830184612531565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156125cf57600080fd5b813567ffffffffffffffff808211156125e757600080fd5b818401915084601f8301126125fb57600080fd5b81358181111561260d5761260d61258e565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156126535761265361258e565b8160405282815287602084870101111561266c57600080fd5b826020860160208301376000928101602001929092525095945050505050565b63ffffffff83168152604060208201526000610ec46040830184612531565b6000602082840312156126bd57600080fd5b5035919050565b6000806000604084860312156126d957600080fd5b833567ffffffffffffffff8111156126f057600080fd5b6126fc86828701612390565b909450925061270f9050602085016123d9565b90509250925092565b600080600080600080600060c0888a03121561273357600080fd5b8735965060208801356127458161236b565b955060408801356127558161236b565b9450606088013593506080880135925060a088013567ffffffffffffffff81111561277f57600080fd5b61278b8a828b01612390565b989b979a50959850939692959293505050565b6000806000806000608086880312156127b657600080fd5b85356127c18161236b565b945060208601359350604086013567ffffffffffffffff8111156127e457600080fd5b6127f088828901612390565b90945092506128039050606087016123d9565b90509295509295909350565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a08301526128aa60c08301848661280f565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff861681526080602082015260006128e760808301868861280f565b905083604083015263ffffffff831660608301529695505050505050565b60006020828403121561291757600080fd5b81518015158114610ec757600080fd5b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015263ffffffff84166040820152821515606082015260a0608082015260006122cb60a0830184612531565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff808316818516818304811182151516156129c6576129c6612970565b02949350505050565b600067ffffffffffffffff80841680612a11577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115612a4057612a40612970565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082821015612a8a57612a8a612970565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a0608082015260006122cb60a0830184612531565b600060208284031215612aee57600080fd5b8151610ec78161236b565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152612b326080830185612531565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152612b8e60c0830184612531565b98975050505050505050565b60008251612bac818460208701612505565b919091019291505056fea164736f6c634300080f000a",
  "devdoc": {
    "version": 1,
    "kind": "dev",
    "methods": {
      "baseGas(bytes,uint32)": {
        "params": {
          "_message": "Message to compute the amount of required gas for.",
          "_minGasLimit": "Minimum desired gas limit when message goes to target."
        },
        "returns": {
          "_0": "Amount of gas required to guarantee message receipt."
        }
      },
      "initialize(address,address)": {
        "params": {
          "_portal": "Address of the OptimismPortal contract on this network."
        }
      },
      "messageNonce()": {
        "returns": {
          "_0": "Nonce of the next message to be sent, with added message version."
        }
      },
      "onApprove(address,address,uint256,bytes)": {
        "params": {
          "_amount": "Approved amount",
          "_data": "Data used in OnApprove contract",
          "_owner": "Account that called approveAndCall"
        }
      },
      "relayMessage(uint256,address,address,uint256,uint256,bytes)": {
        "params": {
          "_message": "Message to send to the target.",
          "_minGasLimit": "Minimum amount of gas that the message can be executed with.",
          "_nonce": "Nonce of the message being relayed.",
          "_sender": "Address of the user who sent the message.",
          "_target": "Address that the message is targeted at.",
          "_value": "Native token value to send with the message."
        }
      },
      "sendMessage(address,bytes,uint32)": {
        "params": {
          "_message": "Message to trigger the target address with.",
          "_minGasLimit": "Minimum gas limit that the message can be executed with.",
          "_target": "Target contract or wallet address."
        }
      },
      "sendNativeTokenMessage(address,uint256,bytes,uint32)": {
        "params": {
          "_amount": "Amount of deposit native token.",
          "_message": "Message to trigger the target address with.",
          "_minGasLimit": "Minimum gas limit that the message can be executed with.",
          "_target": "Target contract or wallet address."
        }
      },
      "unpackOnApproveData(bytes)": {
        "params": {
          "_data": "Data used in OnApprove contract"
        }
      },
      "xDomainMessageSender()": {
        "returns": {
          "_0": "Address of the sender of the currently executing message on the other chain."
        }
      }
    }
  },
  "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true}],\"type\":\"event\",\"name\":\"FailedRelayedMessage\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false}],\"type\":\"event\",\"name\":\"Initialized\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true}],\"type\":\"event\",\"name\":\"RelayedMessage\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\",\"indexed\":true},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\",\"indexed\":false},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\",\"indexed\":false}],\"type\":\"event\",\"name\":\"SentMessage\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false}],\"type\":\"event\",\"name\":\"SentMessageExtension1\",\"anonymous\":false},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MESSAGE_VERSION\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MIN_GAS_CALLDATA_OVERHEAD\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"OTHER_MESSENGER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"PORTAL\",\"outputs\":[{\"internalType\":\"contract OptimismPortal\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"RELAY_CALL_OVERHEAD\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"RELAY_CONSTANT_OVERHEAD\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"RELAY_GAS_CHECK_BUFFER\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"RELAY_RESERVED_GAS\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}]},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"baseGas\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}]},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"failedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}]},{\"inputs\":[{\"internalType\":\"contract OptimismPortal\",\"name\":\"_portal\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_nativeTokenAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"initialize\"},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"messageNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"nativeTokenAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"onApprove\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"portal\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_minGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"function\",\"name\":\"relayMessage\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"}],\"stateMutability\":\"payable\",\"type\":\"function\",\"name\":\"sendMessage\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"sendNativeTokenMessage\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}]},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}]},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"unpackOnApproveData\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"baseGas(bytes,uint32)\":{\"params\":{\"_message\":\"Message to compute the amount of required gas for.\",\"_minGasLimit\":\"Minimum desired gas limit when message goes to target.\"},\"returns\":{\"_0\":\"Amount of gas required to guarantee message receipt.\"}},\"initialize(address,address)\":{\"params\":{\"_portal\":\"Address of the OptimismPortal contract on this network.\"}},\"messageNonce()\":{\"returns\":{\"_0\":\"Nonce of the next message to be sent, with added message version.\"}},\"onApprove(address,address,uint256,bytes)\":{\"params\":{\"_amount\":\"Approved amount\",\"_data\":\"Data used in OnApprove contract\",\"_owner\":\"Account that called approveAndCall\"}},\"relayMessage(uint256,address,address,uint256,uint256,bytes)\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_minGasLimit\":\"Minimum amount of gas that the message can be executed with.\",\"_nonce\":\"Nonce of the message being relayed.\",\"_sender\":\"Address of the user who sent the message.\",\"_target\":\"Address that the message is targeted at.\",\"_value\":\"Native token value to send with the message.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_message\":\"Message to trigger the target address with.\",\"_minGasLimit\":\"Minimum gas limit that the message can be executed with.\",\"_target\":\"Target contract or wallet address.\"}},\"sendNativeTokenMessage(address,uint256,bytes,uint32)\":{\"params\":{\"_amount\":\"Amount of deposit native token.\",\"_message\":\"Message to trigger the target address with.\",\"_minGasLimit\":\"Minimum gas limit that the message can be executed with.\",\"_target\":\"Target contract or wallet address.\"}},\"unpackOnApproveData(bytes)\":{\"params\":{\"_data\":\"Data used in OnApprove contract\"}},\"xDomainMessageSender()\":{\"returns\":{\"_0\":\"Address of the sender of the currently executing message on the other chain.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"MESSAGE_VERSION()\":{\"notice\":\"Current message version identifier.\"},\"MIN_GAS_CALLDATA_OVERHEAD()\":{\"notice\":\"Extra gas added to base gas for each byte of calldata in a message.\"},\"MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR()\":{\"notice\":\"Denominator for dynamic overhead added to the base gas for a message.\"},\"MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR()\":{\"notice\":\"Numerator for dynamic overhead added to the base gas for a message.\"},\"OTHER_MESSENGER()\":{\"notice\":\"Address of the paired CrossDomainMessenger contract on the other chain.\"},\"PORTAL()\":{\"notice\":\"Address of the OptimismPortal. The public getter for this         is legacy and will be removed in the future. Use `portal()` instead.\"},\"RELAY_CALL_OVERHEAD()\":{\"notice\":\"Gas reserved for performing the external call in `relayMessage`.\"},\"RELAY_CONSTANT_OVERHEAD()\":{\"notice\":\"Constant overhead added to the base gas for a message.\"},\"RELAY_GAS_CHECK_BUFFER()\":{\"notice\":\"Gas reserved for the execution between the `hasMinGas` check and the external         call in `relayMessage`.\"},\"RELAY_RESERVED_GAS()\":{\"notice\":\"Gas reserved for finalizing the execution of `relayMessage` after the safe call.\"},\"baseGas(bytes,uint32)\":{\"notice\":\"Computes the amount of gas required to guarantee that a given message will be         received on the other chain without running out of gas. Guaranteeing that a message         will not run out of gas is important because this ensures that a message can always         be replayed on the other chain if it fails to execute completely.\"},\"constructor\":{\"notice\":\"Constructs the L1CrossDomainMessenger contract.\"},\"failedMessages(bytes32)\":{\"notice\":\"Mapping of message hashes to a boolean if and only if the message has failed to be         executed at least once. A message will not be present in this mapping if it         successfully executed on the first attempt.\"},\"initialize(address,address)\":{\"notice\":\"Initializes the contract.\"},\"messageNonce()\":{\"notice\":\"Retrieves the next message nonce. Message version will be added to the upper two         bytes of the message nonce. Message version allows us to treat messages as having         different structures.\"},\"nativeTokenAddress()\":{\"notice\":\"Address of native token (ERC-20 token)\"},\"onApprove(address,address,uint256,bytes)\":{\"notice\":\"ERC20 onApprove callback\"},\"portal()\":{\"notice\":\"Getter for the OptimismPortal address.\"},\"relayMessage(uint256,address,address,uint256,uint256,bytes)\":{\"notice\":\"Relays a message that was sent by the other CrossDomainMessenger contract. Can only         be executed via cross-chain call from the other messenger OR if the message was         already received once and is currently being replayed.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a message to some target address on the other chain. Note that if the call         always reverts, then the message will be unrelayable, and any ETH sent will be         permanently locked. The same will occur if the target on the other chain is         considered unsafe (see the _isUnsafeTarget() function).\"},\"sendNativeTokenMessage(address,uint256,bytes,uint32)\":{\"notice\":\"Sends a deposit native token message to some target address on the other chain. Note that if the call         always reverts, then the message will be unrelayable, and any ETH sent will be         permanently locked. The same will occur if the target on the other chain is         considered unsafe (see the _isUnsafeTarget() function).\"},\"successfulMessages(bytes32)\":{\"notice\":\"Mapping of message hashes to boolean receipt values. Note that a message will only         be present in this mapping if it has successfully been relayed on this chain, and         can therefore not be relayed again.\"},\"unpackOnApproveData(bytes)\":{\"notice\":\"unpack onApprove data\"},\"version()\":{\"notice\":\"Semantic version.\"},\"xDomainMessageSender()\":{\"notice\":\"Retrieves the address of the contract or wallet that initiated the currently         executing message on the other chain. Will throw an error if there is no message         currently being executed. Allows the recipient of a call to see who triggered it.\"}},\"version\":1}},\"settings\":{\"remappings\":[\"@cwia/=lib/clones-with-immutable-args/src/\",\"@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\"@rari-capital/solmate/=lib/solmate/\",\"clones-with-immutable-args/=lib/clones-with-immutable-args/src/\",\"ds-test/=lib/forge-std/lib/ds-test/src/\",\"forge-std/=lib/forge-std/src/\",\"openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\"openzeppelin-contracts/=lib/openzeppelin-contracts/\",\"safe-contracts/=lib/safe-contracts/contracts/\",\"solmate/=lib/solmate/src/\"],\"optimizer\":{\"enabled\":true,\"runs\":999999},\"metadata\":{\"bytecodeHash\":\"none\"},\"compilationTarget\":{\"src/L1/L1CrossDomainMessenger.sol\":\"L1CrossDomainMessenger\"},\"libraries\":{}},\"sources\":{\"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888\",\"urls\":[\"bzz-raw://d7fc8396619de513c96b6e00301b88dd790e83542aab918425633a5f7297a15a\",\"dweb:/ipfs/QmXbP4kiZyp7guuS7xe8KaybnwkRPGrBc2Kbi3vhcTfpxb\"],\"license\":\"MIT\"},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e\",\"urls\":[\"bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497\",\"dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8\"],\"license\":\"MIT\"},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3\",\"urls\":[\"bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4\",\"dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt\"],\"license\":\"MIT\"},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"],\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66\",\"urls\":[\"bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f\",\"dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV\"],\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"urls\":[\"bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34\",\"dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr\"],\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"urls\":[\"bzz-raw://b2717fd2bdac99daa960a6de500754ea1b932093c946388c381da48658234b95\",\"dweb:/ipfs/QmP6QVMn6UeA3ByahyJbYQr5M6coHKBKsf3ySZSfbyA8R7\"],\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x032807210d1d7d218963d7355d62e021a84bf1b3339f4f50be2f63b53cccaf29\",\"urls\":[\"bzz-raw://11756f42121f6541a35a8339ea899ee7514cfaa2e6d740625fcc844419296aa6\",\"dweb:/ipfs/QmekMuk6BY4DAjzeXr4MSbKdgoqqsZnA8JPtuyWc6CwXHf\"],\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"urls\":[\"bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487\",\"dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG\"],\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"urls\":[\"bzz-raw://b600b852e0597aa69989cc263111f02097e2827edc1bdc70306303e3af5e9929\",\"dweb:/ipfs/QmU4WfM28A1nDqghuuGeFmN3CnVrk6opWtiF65K4vhFPeC\"],\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7\",\"urls\":[\"bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689\",\"dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy\"],\"license\":\"MIT\"},\"lib/solmate/src/utils/FixedPointMathLib.sol\":{\"keccak256\":\"0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d\",\"urls\":[\"bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c\",\"dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8\"],\"license\":\"MIT\"},\"src/L1/L1CrossDomainMessenger.sol\":{\"keccak256\":\"0x2e0934728da1a087267bf2b2a90e05b37e78235d0f9800e5e7e1b548c7a6b42b\",\"urls\":[\"bzz-raw://b706a5a44ef6a9f262d115daa5ac46a144587a9f97691fd6d3ff8a24bb59ea9e\",\"dweb:/ipfs/QmeBzC8NNXXSbcjeNNGNYRDLn4EUNgLRhajpjv1vsd9xdK\"],\"license\":\"MIT\"},\"src/L1/L2OutputOracle.sol\":{\"keccak256\":\"0x60042eb3e619518cab9a8f2480b62871c2d813716e2e60d9a5e0c5f271c58705\",\"urls\":[\"bzz-raw://08538ef2aa99c508b56a8bb9b3c7b93476cba9dbf0b47783141e5e50a02156cc\",\"dweb:/ipfs/QmdvFZ1fUaTkNdmtB66rNAo73RxY7kccsgR6Uqz7psoXGN\"],\"license\":\"MIT\"},\"src/L1/OnApprove.sol\":{\"keccak256\":\"0xe25cdee8494fdad1df7f58d4d9bdc3c86717c4a9c1284c6b7f01c24fab9f62f6\",\"urls\":[\"bzz-raw://88bcdc10a43cb49a53ab2b13e3d4b517fafc7964e302e21ca2408cc67072ce5f\",\"dweb:/ipfs/QmdkZrScguyEFndS2r1TrXY7aPsyfJp1had8VMX3S3En6C\"],\"license\":\"MIT\"},\"src/L1/OptimismPortal.sol\":{\"keccak256\":\"0x40592466b0286174c250d1cb8d25ded2d65a606a1a81850c7b2f5a6fd423680d\",\"urls\":[\"bzz-raw://3607e06fa66dbbe51c003949bbd29dc74b6ec1da9dd756f001a96596c3326c3c\",\"dweb:/ipfs/QmWxY1AGGecbM7cZLpoREJidJq371Q1HixXiyzXpwM1mQ5\"],\"license\":\"MIT\"},\"src/L1/ResourceMetering.sol\":{\"keccak256\":\"0xa4d524f2a5e91a0b63a62603e712001c51c77e8371b93cbb576bcb7d074b7588\",\"urls\":[\"bzz-raw://d6d8141b6c6dc72d2e684c1ae388c005fd78c9ca7fc9c15dddebd227ca4fd730\",\"dweb:/ipfs/QmPfJrR4qssu769TDWJnxdTozqKtZUxiY8fs95bhfECTvG\"],\"license\":\"MIT\"},\"src/L1/SystemConfig.sol\":{\"keccak256\":\"0x4bbbc7868e948c44f29285a69383e93251a0c330a67929fb72def01cec060d4e\",\"urls\":[\"bzz-raw://1e7ea2f8b3d49bee9c753f107ede6eda93b2cc0e34d0643fa14ebbb26c19e71b\",\"dweb:/ipfs/QmRP81F8FRVXVZs6u2f2poEPDnbFZhNwNYxHgCVEhGpEmB\"],\"license\":\"MIT\"},\"src/libraries/Arithmetic.sol\":{\"keccak256\":\"0x06a5a8b00527843f0cfc1bb3c0661316966a6cc432f88be31f23cde78cd07560\",\"urls\":[\"bzz-raw://d5209e78e5415c0bf8b350362a825cc56152811abd6fcf2df3d4fa47766d3dee\",\"dweb:/ipfs/Qmf43xyc4Um32NmccayDfhm8kSnS2mhHXpPZnwABJS7cWm\"],\"license\":\"MIT\"},\"src/libraries/Burn.sol\":{\"keccak256\":\"0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010\",\"urls\":[\"bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f\",\"dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb\"],\"license\":\"MIT\"},\"src/libraries/Bytes.sol\":{\"keccak256\":\"0x827f47d123b0fdf3b08816d5b33831811704dbf4e554e53f2269354f6bba8859\",\"urls\":[\"bzz-raw://3137ac7204d30a245a8b0d67aa6da5286f1bd8c90379daab561f84963b6db782\",\"dweb:/ipfs/QmWRhisw3axJK833gUScs23ETh2MLFbVzzqzYVMKSDN3S9\"],\"license\":\"MIT\"},\"src/libraries/Constants.sol\":{\"keccak256\":\"0xe12e392f05f80d3837c9392d016471181ae1ee6b84ea91b4e125e6523e5f18a2\",\"urls\":[\"bzz-raw://a3509231c228b7a4352573cd422cf0260dcbb94cfd915e5b664643db5475a5b7\",\"dweb:/ipfs/QmU2QERY4mHxqWFqSE5Exsy6Ftc5MTjTtYHC11fahLJWDC\"],\"license\":\"MIT\"},\"src/libraries/Encoding.sol\":{\"keccak256\":\"0xd5bbcb7da113e69562498d9543765e03912558ad66348682c2049c31e19f9d9b\",\"urls\":[\"bzz-raw://afc6656ea10062c0c9d0817bb8683636caebf9222c9c102f29ea54fff74a2f93\",\"dweb:/ipfs/QmTNWtMgrTRHM6XtdUmA8bMZcuFpXoFCXgXR5vRihZWLuW\"],\"license\":\"MIT\"},\"src/libraries/Hashing.sol\":{\"keccak256\":\"0x44e2b2dcfffc39c0fc95ccd3c2118c7e7585fadf3dca327877d5756c7d4b21c3\",\"urls\":[\"bzz-raw://6c89e0d9cfcb08a0d3c46c85367a32bbd9703468ba4c0c5bb6e124c1d173b26b\",\"dweb:/ipfs/QmaY3nQHBBhHK1wrurVXiEeNL8hfZ1pRmhpqW44tFDJnDf\"],\"license\":\"MIT\"},\"src/libraries/Predeploys.sol\":{\"keccak256\":\"0x551ea124b7ffe63c4715e165de13709fb91044c2bac2b5a3a13397e7ed579b0f\",\"urls\":[\"bzz-raw://36fa2454dc8f597780f7caf024263a45d66c5e267ab5f3715764f0d2b8e7fb32\",\"dweb:/ipfs/QmY45MpqrJEeE3KCGdnF2WDK3Be2ddBxUHVVw97LbfK7LZ\"],\"license\":\"MIT\"},\"src/libraries/SafeCall.sol\":{\"keccak256\":\"0x0636a7abb242bb5d6f5606967c8929e6aa7e63468c1e2ce40ad4780d4c4bf94f\",\"urls\":[\"bzz-raw://a4daec2ac8f9907bbf84ef0a1c48f03bae8657619bc6f42b3a672f25c516f17a\",\"dweb:/ipfs/Qmf8gfRxBv8gEmCkP8YMPb2GGfj9QUnoNUyKE7UR2SWGnq\"],\"license\":\"MIT\"},\"src/libraries/Storage.sol\":{\"keccak256\":\"0x902a0a815272a5b76c647d9e82101aca765e9835a6624d0857088b9da0f58afd\",\"urls\":[\"bzz-raw://9c39a697aacb0a2eac0bf1fbd7790d835a685c61006f6d3464e19cbc96a24480\",\"dweb:/ipfs/QmV3T8ZTRWPB5CNuZjxwWQNoENd7W4SoBMnFG6Y6g6xYV4\"],\"license\":\"MIT\"},\"src/libraries/Types.sol\":{\"keccak256\":\"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4\",\"urls\":[\"bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e\",\"dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc\"],\"license\":\"MIT\"},\"src/libraries/rlp/RLPReader.sol\":{\"keccak256\":\"0x9ba74a3b0a11693e622380807d213d5d1250d974e18b2cd768da9cbe719a6778\",\"urls\":[\"bzz-raw://0808d721ed9e05707526ee134faa051d707a95ee6b8bd6e0b1972275da8e5723\",\"dweb:/ipfs/QmcTTPu9xgckfWdbFUAcr2RAgk3J6vzyR4FpV798TjFMeN\"],\"license\":\"MIT\"},\"src/libraries/rlp/RLPWriter.sol\":{\"keccak256\":\"0x60ac401490f321c9c55e996a2c65151cd5e60de5f8f297e7c94d541c29820bb6\",\"urls\":[\"bzz-raw://070f5814db07e4a89173d44a36d90e4261ce530f7336034c01635347f2c2d88b\",\"dweb:/ipfs/QmXqr9yW5Kc8MYgr5wSehU5AiqS9pZ4FKxv7vwiwpZCcyV\"],\"license\":\"MIT\"},\"src/libraries/trie/MerkleTrie.sol\":{\"keccak256\":\"0xf8ba770ee6666e73ae43184c700e9c704b2c4ace71f9e3c2227ddc11a8148b4c\",\"urls\":[\"bzz-raw://4702ccee1fe44aea3ee01d59e6152eb755da083f786f00947fec4437c064fe74\",\"dweb:/ipfs/QmQjFj5J7hrEM1dxJjFszzW2Cs7g7eMhYNBXonF2DXBstE\"],\"license\":\"MIT\"},\"src/libraries/trie/SecureMerkleTrie.sol\":{\"keccak256\":\"0xeaff8315cfd21197bc6bc859c2decf5d4f4838c9c357c502cdf2b1eac863d288\",\"urls\":[\"bzz-raw://79dcdcaa560aea51d138da4f5dc553a1808b6de090b2dc1629f18375edbff681\",\"dweb:/ipfs/QmbE4pUPhf5fLKW4W6cEjhQs55gEDvHmbmoBqkW1yz3bnw\"],\"license\":\"MIT\"},\"src/universal/CrossDomainMessenger.sol\":{\"keccak256\":\"0x6876fa0706a4647f4247eea58228dc650a39ff42fb2495ac2f8a37dcc99075b6\",\"urls\":[\"bzz-raw://a61d10bd62b6f4bbc5cc2b6c765c96cfc67e132a808f691ef1d8175eaf363363\",\"dweb:/ipfs/QmdBHpzFQpxVA9L9s3jiwHpB1SDtEeN3yqDazS7wnmEpFY\"],\"license\":\"MIT\"},\"src/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"],\"license\":\"MIT\"},\"src/vendor/AddressAliasHelper.sol\":{\"keccak256\":\"0x6ecb83b4ec80fbe49c22f4f95d90482de64660ef5d422a19f4d4b04df31c1237\",\"urls\":[\"bzz-raw://1d0885be6e473962f9a0622176a22300165ac0cc1a1d7f2e22b11c3d656ace88\",\"dweb:/ipfs/QmPRa3KmRpXW5P9ykveKRDgYN5zYo4cYLAYSnoqHX3KnXR\"],\"license\":\"Apache-2.0\"}},\"version\":1}",
  "numDeployments": 1,
  "receipt": "",
  "solcInputHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "storageLayout": {
    "storage": [
      {
        "astId": 80366,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "spacer_0_0_20",
        "offset": 0,
        "slot": "0",
        "type": "t_address"
      },
      {
        "astId": 29536,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "_initialized",
        "offset": 20,
        "slot": "0",
        "type": "t_uint8"
      },
      {
        "astId": 29539,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "_initializing",
        "offset": 21,
        "slot": "0",
        "type": "t_bool"
      },
      {
        "astId": 80373,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "spacer_1_0_1600",
        "offset": 0,
        "slot": "1",
        "type": "t_array(t_uint256)50_storage"
      },
      {
        "astId": 80376,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "spacer_51_0_20",
        "offset": 0,
        "slot": "51",
        "type": "t_address"
      },
      {
        "astId": 80381,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "spacer_52_0_1568",
        "offset": 0,
        "slot": "52",
        "type": "t_array(t_uint256)49_storage"
      },
      {
        "astId": 80384,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "spacer_101_0_1",
        "offset": 0,
        "slot": "101",
        "type": "t_bool"
      },
      {
        "astId": 80389,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "spacer_102_0_1568",
        "offset": 0,
        "slot": "102",
        "type": "t_array(t_uint256)49_storage"
      },
      {
        "astId": 80392,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "spacer_151_0_32",
        "offset": 0,
        "slot": "151",
        "type": "t_uint256"
      },
      {
        "astId": 80397,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "spacer_152_0_1568",
        "offset": 0,
        "slot": "152",
        "type": "t_array(t_uint256)49_storage"
      },
      {
        "astId": 80402,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "spacer_201_0_32",
        "offset": 0,
        "slot": "201",
        "type": "t_mapping(t_bytes32,t_bool)"
      },
      {
        "astId": 80407,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "spacer_202_0_32",
        "offset": 0,
        "slot": "202",
        "type": "t_mapping(t_bytes32,t_bool)"
      },
      {
        "astId": 80455,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "successfulMessages",
        "offset": 0,
        "slot": "203",
        "type": "t_mapping(t_bytes32,t_bool)"
      },
      {
        "astId": 80458,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "xDomainMsgSender",
        "offset": 0,
        "slot": "204",
        "type": "t_address"
      },
      {
        "astId": 80461,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "msgNonce",
        "offset": 0,
        "slot": "205",
        "type": "t_uint240"
      },
      {
        "astId": 80466,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "failedMessages",
        "offset": 0,
        "slot": "206",
        "type": "t_mapping(t_bytes32,t_bool)"
      },
      {
        "astId": 80471,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "__gap",
        "offset": 0,
        "slot": "207",
        "type": "t_array(t_uint256)42_storage"
      },
      {
        "astId": 59432,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "PORTAL",
        "offset": 0,
        "slot": "249",
        "type": "t_contract(OptimismPortal)64657"
      },
      {
        "astId": 59435,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "nativeTokenAddress",
        "offset": 0,
        "slot": "250",
        "type": "t_address"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_array(t_uint256)42_storage": {
        "encoding": "inplace",
        "label": "uint256[42]",
        "numberOfBytes": "1344",
        "base": "t_uint256"
      },
      "t_array(t_uint256)49_storage": {
        "encoding": "inplace",
        "label": "uint256[49]",
        "numberOfBytes": "1568",
        "base": "t_uint256"
      },
      "t_array(t_uint256)50_storage": {
        "encoding": "inplace",
        "label": "uint256[50]",
        "numberOfBytes": "1600",
        "base": "t_uint256"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_bytes32": {
        "encoding": "inplace",
        "label": "bytes32",
        "numberOfBytes": "32"
      },
      "t_contract(OptimismPortal)64657": {
        "encoding": "inplace",
        "label": "contract OptimismPortal",
        "numberOfBytes": "20"
      },
      "t_mapping(t_bytes32,t_bool)": {
        "encoding": "mapping",
        "key": "t_bytes32",
        "label": "mapping(bytes32 => bool)",
        "numberOfBytes": "32",
        "value": "t_bool"
      },
      "t_uint240": {
        "encoding": "inplace",
        "label": "uint240",
        "numberOfBytes": "30"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      },
      "t_uint8": {
        "encoding": "inplace",
        "label": "uint8",
        "numberOfBytes": "1"
      }
    }
  },
  "transactionHash": "0xb83d9bc4d4cb9a4bcae881075a39ee25d7232c7306c76c0875463e653809f37e",
  "userdoc": {
    "version": 1,
    "kind": "user",
    "methods": {
      "MESSAGE_VERSION()": {
        "notice": "Current message version identifier."
      },
      "MIN_GAS_CALLDATA_OVERHEAD()": {
        "notice": "Extra gas added to base gas for each byte of calldata in a message."
      },
      "MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR()": {
        "notice": "Denominator for dynamic overhead added to the base gas for a message."
      },
      "MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR()": {
        "notice": "Numerator for dynamic overhead added to the base gas for a message."
      },
      "OTHER_MESSENGER()": {
        "notice": "Address of the paired CrossDomainMessenger contract on the other chain."
      },
      "PORTAL()": {
        "notice": "Address of the OptimismPortal. The public getter for this         is legacy and will be removed in the future. Use `portal()` instead."
      },
      "RELAY_CALL_OVERHEAD()": {
        "notice": "Gas reserved for performing the external call in `relayMessage`."
      },
      "RELAY_CONSTANT_OVERHEAD()": {
        "notice": "Constant overhead added to the base gas for a message."
      },
      "RELAY_GAS_CHECK_BUFFER()": {
        "notice": "Gas reserved for the execution between the `hasMinGas` check and the external         call in `relayMessage`."
      },
      "RELAY_RESERVED_GAS()": {
        "notice": "Gas reserved for finalizing the execution of `relayMessage` after the safe call."
      },
      "baseGas(bytes,uint32)": {
        "notice": "Computes the amount of gas required to guarantee that a given message will be         received on the other chain without running out of gas. Guaranteeing that a message         will not run out of gas is important because this ensures that a message can always         be replayed on the other chain if it fails to execute completely."
      },
      "constructor": {
        "notice": "Constructs the L1CrossDomainMessenger contract."
      },
      "failedMessages(bytes32)": {
        "notice": "Mapping of message hashes to a boolean if and only if the message has failed to be         executed at least once. A message will not be present in this mapping if it         successfully executed on the first attempt."
      },
      "initialize(address,address)": {
        "notice": "Initializes the contract."
      },
      "messageNonce()": {
        "notice": "Retrieves the next message nonce. Message version will be added to the upper two         bytes of the message nonce. Message version allows us to treat messages as having         different structures."
      },
      "nativeTokenAddress()": {
        "notice": "Address of native token (ERC-20 token)"
      },
      "onApprove(address,address,uint256,bytes)": {
        "notice": "ERC20 onApprove callback"
      },
      "portal()": {
        "notice": "Getter for the OptimismPortal address."
      },
      "relayMessage(uint256,address,address,uint256,uint256,bytes)": {
        "notice": "Relays a message that was sent by the other CrossDomainMessenger contract. Can only         be executed via cross-chain call from the other messenger OR if the message was         already received once and is currently being replayed."
      },
      "sendMessage(address,bytes,uint32)": {
        "notice": "Sends a message to some target address on the other chain. Note that if the call         always reverts, then the message will be unrelayable, and any ETH sent will be         permanently locked. The same will occur if the target on the other chain is         considered unsafe (see the _isUnsafeTarget() function)."
      },
      "sendNativeTokenMessage(address,uint256,bytes,uint32)": {
        "notice": "Sends a deposit native token message to some target address on the other chain. Note that if the call         always reverts, then the message will be unrelayable, and any ETH sent will be         permanently locked. The same will occur if the target on the other chain is         considered unsafe (see the _isUnsafeTarget() function)."
      },
      "successfulMessages(bytes32)": {
        "notice": "Mapping of message hashes to boolean receipt values. Note that a message will only         be present in this mapping if it has successfully been relayed on this chain, and         can therefore not be relayed again."
      },
      "unpackOnApproveData(bytes)": {
        "notice": "unpack onApprove data"
      },
      "version()": {
        "notice": "Semantic version."
      },
      "xDomainMessageSender()": {
        "notice": "Retrieves the address of the contract or wallet that initiated the currently         executing message on the other chain. Will throw an error if there is no message         currently being executed. Allows the recipient of a call to see who triggered it."
      }
    },
    "events": {
      "FailedRelayedMessage(bytes32)": {
        "notice": "Emitted whenever a message fails to be relayed on this chain."
      },
      "RelayedMessage(bytes32)": {
        "notice": "Emitted whenever a message is successfully relayed on this chain."
      },
      "SentMessage(address,address,bytes,uint256,uint256)": {
        "notice": "Emitted whenever a message is sent to the other chain."
      },
      "SentMessageExtension1(address,uint256)": {
        "notice": "Additional event data to emit, required as of Bedrock. Cannot be merged with the         SentMessage event without breaking the ABI of this contract, this is good enough."
      }
    },
    "notice": "The L1CrossDomainMessenger is a message passing interface between L1 and L2 responsible         for sending and receiving data on the L1 side. Users are encouraged to use this         interface instead of interacting with lower-level contracts directly."
  }
}