{
  "abi": [
    {
      "type": "constructor",
      "inputs": [],
      "stateMutability": "nonpayable"
    },
    {
      "type": "function",
      "name": "MESSAGE_VERSION",
      "inputs": [],
      "outputs": [
        {
          "name": "",
          "type": "uint16",
          "internalType": "uint16"
        }
      ],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "MIN_GAS_CALLDATA_OVERHEAD",
      "inputs": [],
      "outputs": [
        {
          "name": "",
          "type": "uint64",
          "internalType": "uint64"
        }
      ],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR",
      "inputs": [],
      "outputs": [
        {
          "name": "",
          "type": "uint64",
          "internalType": "uint64"
        }
      ],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR",
      "inputs": [],
      "outputs": [
        {
          "name": "",
          "type": "uint64",
          "internalType": "uint64"
        }
      ],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "OTHER_MESSENGER",
      "inputs": [],
      "outputs": [
        {
          "name": "",
          "type": "address",
          "internalType": "contract CrossDomainMessenger"
        }
      ],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "PORTAL",
      "inputs": [],
      "outputs": [
        {
          "name": "",
          "type": "address",
          "internalType": "contract OptimismPortal"
        }
      ],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "RELAY_CALL_OVERHEAD",
      "inputs": [],
      "outputs": [
        {
          "name": "",
          "type": "uint64",
          "internalType": "uint64"
        }
      ],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "RELAY_CONSTANT_OVERHEAD",
      "inputs": [],
      "outputs": [
        {
          "name": "",
          "type": "uint64",
          "internalType": "uint64"
        }
      ],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "RELAY_GAS_CHECK_BUFFER",
      "inputs": [],
      "outputs": [
        {
          "name": "",
          "type": "uint64",
          "internalType": "uint64"
        }
      ],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "RELAY_RESERVED_GAS",
      "inputs": [],
      "outputs": [
        {
          "name": "",
          "type": "uint64",
          "internalType": "uint64"
        }
      ],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "baseGas",
      "inputs": [
        {
          "name": "_message",
          "type": "bytes",
          "internalType": "bytes"
        },
        {
          "name": "_minGasLimit",
          "type": "uint32",
          "internalType": "uint32"
        }
      ],
      "outputs": [
        {
          "name": "",
          "type": "uint64",
          "internalType": "uint64"
        }
      ],
      "stateMutability": "pure"
    },
    {
      "type": "function",
      "name": "failedMessages",
      "inputs": [
        {
          "name": "",
          "type": "bytes32",
          "internalType": "bytes32"
        }
      ],
      "outputs": [
        {
          "name": "",
          "type": "bool",
          "internalType": "bool"
        }
      ],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "initialize",
      "inputs": [
        {
          "name": "_superchainConfig",
          "type": "address",
          "internalType": "contract SuperchainConfig"
        },
        {
          "name": "_portal",
          "type": "address",
          "internalType": "contract OptimismPortal"
        },
        {
          "name": "_systemConfig",
          "type": "address",
          "internalType": "contract SystemConfig"
        }
      ],
      "outputs": [],
      "stateMutability": "nonpayable"
    },
    {
      "type": "function",
      "name": "messageNonce",
      "inputs": [],
      "outputs": [
        {
          "name": "",
          "type": "uint256",
          "internalType": "uint256"
        }
      ],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "nativeTokenAddress",
      "inputs": [],
      "outputs": [
        {
          "name": "",
          "type": "address",
          "internalType": "address"
        }
      ],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "onApprove",
      "inputs": [
        {
          "name": "_owner",
          "type": "address",
          "internalType": "address"
        },
        {
          "name": "",
          "type": "address",
          "internalType": "address"
        },
        {
          "name": "_amount",
          "type": "uint256",
          "internalType": "uint256"
        },
        {
          "name": "_data",
          "type": "bytes",
          "internalType": "bytes"
        }
      ],
      "outputs": [
        {
          "name": "",
          "type": "bool",
          "internalType": "bool"
        }
      ],
      "stateMutability": "nonpayable"
    },
    {
      "type": "function",
      "name": "otherMessenger",
      "inputs": [],
      "outputs": [
        {
          "name": "",
          "type": "address",
          "internalType": "contract CrossDomainMessenger"
        }
      ],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "paused",
      "inputs": [],
      "outputs": [
        {
          "name": "",
          "type": "bool",
          "internalType": "bool"
        }
      ],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "portal",
      "inputs": [],
      "outputs": [
        {
          "name": "",
          "type": "address",
          "internalType": "contract OptimismPortal"
        }
      ],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "relayMessage",
      "inputs": [
        {
          "name": "_nonce",
          "type": "uint256",
          "internalType": "uint256"
        },
        {
          "name": "_sender",
          "type": "address",
          "internalType": "address"
        },
        {
          "name": "_target",
          "type": "address",
          "internalType": "address"
        },
        {
          "name": "_value",
          "type": "uint256",
          "internalType": "uint256"
        },
        {
          "name": "_minGasLimit",
          "type": "uint256",
          "internalType": "uint256"
        },
        {
          "name": "_message",
          "type": "bytes",
          "internalType": "bytes"
        }
      ],
      "outputs": [],
      "stateMutability": "payable"
    },
    {
      "type": "function",
      "name": "sendMessage",
      "inputs": [
        {
          "name": "_target",
          "type": "address",
          "internalType": "address"
        },
        {
          "name": "_message",
          "type": "bytes",
          "internalType": "bytes"
        },
        {
          "name": "_minGasLimit",
          "type": "uint32",
          "internalType": "uint32"
        }
      ],
      "outputs": [],
      "stateMutability": "payable"
    },
    {
      "type": "function",
      "name": "sendNativeTokenMessage",
      "inputs": [
        {
          "name": "_target",
          "type": "address",
          "internalType": "address"
        },
        {
          "name": "_amount",
          "type": "uint256",
          "internalType": "uint256"
        },
        {
          "name": "_message",
          "type": "bytes",
          "internalType": "bytes"
        },
        {
          "name": "_minGasLimit",
          "type": "uint32",
          "internalType": "uint32"
        }
      ],
      "outputs": [],
      "stateMutability": "nonpayable"
    },
    {
      "type": "function",
      "name": "successfulMessages",
      "inputs": [
        {
          "name": "",
          "type": "bytes32",
          "internalType": "bytes32"
        }
      ],
      "outputs": [
        {
          "name": "",
          "type": "bool",
          "internalType": "bool"
        }
      ],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "superchainConfig",
      "inputs": [],
      "outputs": [
        {
          "name": "",
          "type": "address",
          "internalType": "contract SuperchainConfig"
        }
      ],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "supportsInterface",
      "inputs": [
        {
          "name": "interfaceId",
          "type": "bytes4",
          "internalType": "bytes4"
        }
      ],
      "outputs": [
        {
          "name": "",
          "type": "bool",
          "internalType": "bool"
        }
      ],
      "stateMutability": "pure"
    },
    {
      "type": "function",
      "name": "systemConfig",
      "inputs": [],
      "outputs": [
        {
          "name": "",
          "type": "address",
          "internalType": "contract SystemConfig"
        }
      ],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "unpackOnApproveData",
      "inputs": [
        {
          "name": "_data",
          "type": "bytes",
          "internalType": "bytes"
        }
      ],
      "outputs": [
        {
          "name": "_from",
          "type": "address",
          "internalType": "address"
        },
        {
          "name": "_to",
          "type": "address",
          "internalType": "address"
        },
        {
          "name": "_amount",
          "type": "uint256",
          "internalType": "uint256"
        },
        {
          "name": "_minGasLimit",
          "type": "uint32",
          "internalType": "uint32"
        },
        {
          "name": "_message",
          "type": "bytes",
          "internalType": "bytes"
        }
      ],
      "stateMutability": "pure"
    },
    {
      "type": "function",
      "name": "version",
      "inputs": [],
      "outputs": [
        {
          "name": "",
          "type": "string",
          "internalType": "string"
        }
      ],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "xDomainMessageSender",
      "inputs": [],
      "outputs": [
        {
          "name": "",
          "type": "address",
          "internalType": "address"
        }
      ],
      "stateMutability": "view"
    },
    {
      "type": "event",
      "name": "FailedRelayedMessage",
      "inputs": [
        {
          "name": "msgHash",
          "type": "bytes32",
          "indexed": true,
          "internalType": "bytes32"
        }
      ],
      "anonymous": false
    },
    {
      "type": "event",
      "name": "Initialized",
      "inputs": [
        {
          "name": "version",
          "type": "uint8",
          "indexed": false,
          "internalType": "uint8"
        }
      ],
      "anonymous": false
    },
    {
      "type": "event",
      "name": "RelayedMessage",
      "inputs": [
        {
          "name": "msgHash",
          "type": "bytes32",
          "indexed": true,
          "internalType": "bytes32"
        }
      ],
      "anonymous": false
    },
    {
      "type": "event",
      "name": "SentMessage",
      "inputs": [
        {
          "name": "target",
          "type": "address",
          "indexed": true,
          "internalType": "address"
        },
        {
          "name": "sender",
          "type": "address",
          "indexed": false,
          "internalType": "address"
        },
        {
          "name": "message",
          "type": "bytes",
          "indexed": false,
          "internalType": "bytes"
        },
        {
          "name": "messageNonce",
          "type": "uint256",
          "indexed": false,
          "internalType": "uint256"
        },
        {
          "name": "gasLimit",
          "type": "uint256",
          "indexed": false,
          "internalType": "uint256"
        }
      ],
      "anonymous": false
    },
    {
      "type": "event",
      "name": "SentMessageExtension1",
      "inputs": [
        {
          "name": "sender",
          "type": "address",
          "indexed": true,
          "internalType": "address"
        },
        {
          "name": "value",
          "type": "uint256",
          "indexed": false,
          "internalType": "uint256"
        }
      ],
      "anonymous": false
    }
  ],
  "address": "0x9A503aFa7e924382DAdE98d09187b94Fb4A07Fb0",
  "args": [],
  "bytecode": "0x60806040523480156200001157600080fd5b50620000206000808062000026565b6200023f565b600054600390600160a81b900460ff1615801562000052575060005460ff808316600160a01b90920416105b620000bb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff60a81b1960ff8416600160a01b021661ffff60a01b1990911617600160a81b17905560fb80546001600160a01b038087166001600160a01b03199283161790925560fc805486841690831617905560fd8054928516929091169190911790556200013f73420000000000000000000000000000000000000762000188565b6000805460ff60a81b1916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b600054600160a81b900460ff16620001f75760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000b2565b60cc546001600160a01b03166200021d5760cc80546001600160a01b03191661dead1790555b60cf80546001600160a01b0319166001600160a01b0392909216919091179055565b612d6c806200024f6000396000f3fe6080604052600436106101c25760003560e01c80635c975abb116100f7578063a4e7f8bd11610095578063d764ad0b11610064578063d764ad0b14610559578063db505d801461056c578063e0e593c514610599578063ecc70428146105b957600080fd5b8063a4e7f8bd146104b9578063b1b1b209146104e9578063b28ade2514610519578063c0c53b8b1461053957600080fd5b806383a74074116100d157806383a74074146104455780638cbeeef21461035757806392a162cf1461045c5780639fce812c1461048e57600080fd5b80635c975abb146103ee5780636425666b146104035780636e296e451461043057600080fd5b80633dbb202b116101645780634c1d6a691161013e5780634c1d6a69146103575780634d0047ee1461036d57806354fd4d50146103825780635644cfdf146103d857600080fd5b80633dbb202b146102fa5780633f827a5a1461030f5780634273ca161461033757600080fd5b80630ff754ea116101a05780630ff754ea1461023f5780632828d7e81461028b57806333d7e2bd146102a057806335e80ab3146102cd57600080fd5b806301ffc9a7146101c7578063028f85f7146101fc5780630c5684981461022a575b600080fd5b3480156101d357600080fd5b506101e76101e2366004612592565b61061e565b60405190151581526020015b60405180910390f35b34801561020857600080fd5b50610211601081565b60405167ffffffffffffffff90911681526020016101f3565b34801561023657600080fd5b50610211603f81565b34801561024b57600080fd5b5060fc5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101f3565b34801561029757600080fd5b50610211604081565b3480156102ac57600080fd5b5060fd546102669073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102d957600080fd5b5060fb546102669073ffffffffffffffffffffffffffffffffffffffff1681565b61030d61030836600461265b565b6106b7565b005b34801561031b57600080fd5b50610324600181565b60405161ffff90911681526020016101f3565b34801561034357600080fd5b506101e76103523660046126c2565b610914565b34801561036357600080fd5b50610211619c4081565b34801561037957600080fd5b50610266610ac8565b34801561038e57600080fd5b506103cb6040518060400160405280600581526020017f322e332e3000000000000000000000000000000000000000000000000000000081525081565b6040516101f391906127ab565b3480156103e457600080fd5b5061021161138881565b3480156103fa57600080fd5b506101e7610b61565b34801561040f57600080fd5b5060fc546102669073ffffffffffffffffffffffffffffffffffffffff1681565b34801561043c57600080fd5b50610266610bf5565b34801561045157600080fd5b5061021162030d4081565b34801561046857600080fd5b5061047c6104773660046127be565b610cdc565b6040516101f396959493929190612849565b34801561049a57600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff16610266565b3480156104c557600080fd5b506101e76104d43660046128a1565b60ce6020526000908152604090205460ff1681565b3480156104f557600080fd5b506101e76105043660046128a1565b60cb6020526000908152604090205460ff1681565b34801561052557600080fd5b506102116105343660046128ba565b610dc5565b34801561054557600080fd5b5061030d61055436600461290e565b610e35565b61030d610567366004612959565b611072565b34801561057857600080fd5b5060cf546102669073ffffffffffffffffffffffffffffffffffffffff1681565b3480156105a557600080fd5b5061030d6105b43660046129df565b611a95565b3480156105c557600080fd5b5061061060cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101f3565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4273ca160000000000000000000000000000000000000000000000000000000014806106b157507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60cf546107e99073ffffffffffffffffffffffffffffffffffffffff166106df858585610dc5565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061074b60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016107679796959493929190612a50565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611aaa565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a33858561086e60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b86604051610880959493929190612aaf565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b600061091e610ac8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f6f6e6c7920616363657074206e617469766520746f6b656e20617070726f766560448201527f2063616c6c6261636b000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000806000803660006109f08989610cdc565b9550955095509550955095508573ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff16148015610a365750838a145b8015610a425750600084115b610aa8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f696e76616c6964206f6e417070726f766520646174610000000000000000000060448201526064016109d4565b610ab6868686868686611bab565b5060019b9a5050505050505050505050565b60fd54604080517f4d0047ee000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691634d0047ee9160048083019260209291908290030181865afa158015610b38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5c9190612afd565b905090565b60fb54604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa158015610bd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5c9190612b1a565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff215301610cbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f7420736574000000000000000000000060648201526084016109d4565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b60008080803681604c871015610d74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f496e76616c6964206f6e417070726f7665206461746120666f72204c3143726f60448201527f7373446f6d61696e4d657373656e67657200000000000000000000000000000060648201526084016109d4565b5050508435606090811c96601487013590911c95602881013595604882013560e01c9550604c90910193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4019150565b6000611388619c4080603f610de1604063ffffffff8816612b6b565b610deb9190612b9b565b610df6601088612b6b565b610e039062030d40612be9565b610e0d9190612be9565b610e179190612be9565b610e219190612be9565b610e2b9190612be9565b90505b9392505050565b6000546003907501000000000000000000000000000000000000000000900460ff16158015610e83575060005460ff8083167401000000000000000000000000000000000000000090920416105b610f0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016109d4565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff60ff84167401000000000000000000000000000000000000000002167fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff90911617750100000000000000000000000000000000000000000017905560fb805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fc805486841690831617905560fd80549285169290911691909117905561100e734200000000000000000000000000000000000007611e77565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b3415611100576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f00000000000000000000000000000000000000000000000060648201526084016109d4565b60f087901c600281106111bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a4016109d4565b8061ffff166000036112b057600061120c878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f9250611fb3915050565b600081815260cb602052604090205490915060ff16156112ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c6179656400000000000000000060648201526084016109d4565b505b60006112f6898989898989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611fd292505050565b90506000611302610ac8565b905061130c611ff5565b1561136357600082815260ce602052604090205460ff161561133057611330612c15565b861561135e5760fc5461135e9073ffffffffffffffffffffffffffffffffffffffff8381169116308a6120d1565b611401565b600082815260ce602052604090205460ff16611401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c617965640000000000000000000000000000000060648201526084016109d4565b61140a8861216c565b15801561144357508073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614155b6114f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605960248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f657373206f72206e6174697665546f6b656e4164647265737300000000000000608482015260a4016109d4565b600082815260cb602052604090205460ff1615611594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c617965640000000000000000000060648201526084016109d4565b6115b5866115a6611388619c40612be9565b67ffffffffffffffff166121af565b15806115db575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b156116f557600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016116ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016109d4565b505050611a8c565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8b16179055600187156117d9576040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152602482018a905283169063095ea7b3906044016020604051808303816000875af11580156117b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d69190612b1a565b90505b600061182b8a619c405a6117ed9190612c44565b60008a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506121cd92505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905590508815801590611866575080155b15611907576040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301526000602483015284169063095ea7b3906044016020604051808303816000875af11580156118e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119049190612b1a565b91505b8080156119115750815b1561197957600084815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555185917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611a86565b600084815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555185917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3201611a86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016109d4565b50505050505b50505050505050565b611aa3338686848787611bab565b5050505050565b3415611b12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f44656e79206465706f736974696e67204554480000000000000000000000000060448201526064016109d4565b60fc546040517fb9e5595800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063b9e5595890611b739087908690819089906000908990600401612c5b565b600060405180830381600087803b158015611b8d57600080fd5b505af1158015611ba1573d6000803e3d6000fd5b5050505050505050565b8315611c7f576000611bbb610ac8565b9050611bdf73ffffffffffffffffffffffffffffffffffffffff82168830886120d1565b60fc546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152602481018790529082169063095ea7b3906044016020604051808303816000875af1158015611c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7c9190612b1a565b50505b60cf54611d2f9073ffffffffffffffffffffffffffffffffffffffff16611ca7848487610dc5565b867fd764ad0b00000000000000000000000000000000000000000000000000000000611d1360cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b8b8b8b8b8b8b6040516024016107679796959493929190612a50565b8473ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a878484611db460cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b88604051611dc6959493929190612aaf565b60405180910390a28573ffffffffffffffffffffffffffffffffffffffff167f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d54685604051611e1691815260200190565b60405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff00000000000000000000000000000000000000000000000000000000000090911617905550505050565b6000547501000000000000000000000000000000000000000000900460ff16611f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109d4565b60cc5473ffffffffffffffffffffffffffffffffffffffff16611f6c5760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000611fc1858585856121e7565b805190602001209050949350505050565b6000611fe2878787878787612280565b8051906020012090509695505050505050565b60fc5460009073ffffffffffffffffffffffffffffffffffffffff1633148015610b5c575060cf5460fc54604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691639bf62d82916004808201926020929091908290030181865afa158015612091573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b59190612afd565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261216690859061231f565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff82163014806106b157505060fc5473ffffffffffffffffffffffffffffffffffffffff90811691161490565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b6060848484846040516024016122009493929190612cae565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b606086868686868660405160240161229d96959493929190612cf8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b6000612381826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166124309092919063ffffffff16565b80519091501561242b578080602001905181019061239f9190612b1a565b61242b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016109d4565b505050565b6060610e2b84846000858573ffffffffffffffffffffffffffffffffffffffff85163b6124b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109d4565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516124e29190612d43565b60006040518083038185875af1925050503d806000811461251f576040519150601f19603f3d011682016040523d82523d6000602084013e612524565b606091505b509150915061253482828661253f565b979650505050505050565b6060831561254e575081610e2e565b82511561255e5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d491906127ab565b6000602082840312156125a457600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610e2e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff811681146125f657600080fd5b50565b60008083601f84011261260b57600080fd5b50813567ffffffffffffffff81111561262357600080fd5b60208301915083602082850101111561263b57600080fd5b9250929050565b803563ffffffff8116811461265657600080fd5b919050565b6000806000806060858703121561267157600080fd5b843561267c816125d4565b9350602085013567ffffffffffffffff81111561269857600080fd5b6126a4878288016125f9565b90945092506126b7905060408601612642565b905092959194509250565b6000806000806000608086880312156126da57600080fd5b85356126e5816125d4565b945060208601356126f5816125d4565b935060408601359250606086013567ffffffffffffffff81111561271857600080fd5b612724888289016125f9565b969995985093965092949392505050565b60005b83811015612750578181015183820152602001612738565b838111156121665750506000910152565b60008151808452612779816020860160208601612735565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610e2e6020830184612761565b600080602083850312156127d157600080fd5b823567ffffffffffffffff8111156127e857600080fd5b6127f4858286016125f9565b90969095509350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600073ffffffffffffffffffffffffffffffffffffffff808916835280881660208401525085604083015263ffffffff8516606083015260a0608083015261289560a083018486612800565b98975050505050505050565b6000602082840312156128b357600080fd5b5035919050565b6000806000604084860312156128cf57600080fd5b833567ffffffffffffffff8111156128e657600080fd5b6128f2868287016125f9565b9094509250612905905060208501612642565b90509250925092565b60008060006060848603121561292357600080fd5b833561292e816125d4565b9250602084013561293e816125d4565b9150604084013561294e816125d4565b809150509250925092565b600080600080600080600060c0888a03121561297457600080fd5b873596506020880135612986816125d4565b95506040880135612996816125d4565b9450606088013593506080880135925060a088013567ffffffffffffffff8111156129c057600080fd5b6129cc8a828b016125f9565b989b979a50959850939692959293505050565b6000806000806000608086880312156129f757600080fd5b8535612a02816125d4565b945060208601359350604086013567ffffffffffffffff811115612a2557600080fd5b612a31888289016125f9565b9094509250612a44905060608701612642565b90509295509295909350565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152612aa260c083018486612800565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000612adf608083018688612800565b905083604083015263ffffffff831660608301529695505050505050565b600060208284031215612b0f57600080fd5b8151610e2e816125d4565b600060208284031215612b2c57600080fd5b81518015158114610e2e57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615612b9257612b92612b3c565b02949350505050565b600067ffffffffffffffff80841680612bdd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115612c0c57612c0c612b3c565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082821015612c5657612c56612b3c565b500390565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015284604082015267ffffffffffffffff84166060820152821515608082015260c060a0820152600061289560c0830184612761565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152612ce76080830185612761565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261289560c0830184612761565b60008251612d55818460208701612735565b919091019291505056fea164736f6c634300080f000a",
  "deployedBytecode": "0x6080604052600436106101c25760003560e01c80635c975abb116100f7578063a4e7f8bd11610095578063d764ad0b11610064578063d764ad0b14610559578063db505d801461056c578063e0e593c514610599578063ecc70428146105b957600080fd5b8063a4e7f8bd146104b9578063b1b1b209146104e9578063b28ade2514610519578063c0c53b8b1461053957600080fd5b806383a74074116100d157806383a74074146104455780638cbeeef21461035757806392a162cf1461045c5780639fce812c1461048e57600080fd5b80635c975abb146103ee5780636425666b146104035780636e296e451461043057600080fd5b80633dbb202b116101645780634c1d6a691161013e5780634c1d6a69146103575780634d0047ee1461036d57806354fd4d50146103825780635644cfdf146103d857600080fd5b80633dbb202b146102fa5780633f827a5a1461030f5780634273ca161461033757600080fd5b80630ff754ea116101a05780630ff754ea1461023f5780632828d7e81461028b57806333d7e2bd146102a057806335e80ab3146102cd57600080fd5b806301ffc9a7146101c7578063028f85f7146101fc5780630c5684981461022a575b600080fd5b3480156101d357600080fd5b506101e76101e2366004612592565b61061e565b60405190151581526020015b60405180910390f35b34801561020857600080fd5b50610211601081565b60405167ffffffffffffffff90911681526020016101f3565b34801561023657600080fd5b50610211603f81565b34801561024b57600080fd5b5060fc5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101f3565b34801561029757600080fd5b50610211604081565b3480156102ac57600080fd5b5060fd546102669073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102d957600080fd5b5060fb546102669073ffffffffffffffffffffffffffffffffffffffff1681565b61030d61030836600461265b565b6106b7565b005b34801561031b57600080fd5b50610324600181565b60405161ffff90911681526020016101f3565b34801561034357600080fd5b506101e76103523660046126c2565b610914565b34801561036357600080fd5b50610211619c4081565b34801561037957600080fd5b50610266610ac8565b34801561038e57600080fd5b506103cb6040518060400160405280600581526020017f322e332e3000000000000000000000000000000000000000000000000000000081525081565b6040516101f391906127ab565b3480156103e457600080fd5b5061021161138881565b3480156103fa57600080fd5b506101e7610b61565b34801561040f57600080fd5b5060fc546102669073ffffffffffffffffffffffffffffffffffffffff1681565b34801561043c57600080fd5b50610266610bf5565b34801561045157600080fd5b5061021162030d4081565b34801561046857600080fd5b5061047c6104773660046127be565b610cdc565b6040516101f396959493929190612849565b34801561049a57600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff16610266565b3480156104c557600080fd5b506101e76104d43660046128a1565b60ce6020526000908152604090205460ff1681565b3480156104f557600080fd5b506101e76105043660046128a1565b60cb6020526000908152604090205460ff1681565b34801561052557600080fd5b506102116105343660046128ba565b610dc5565b34801561054557600080fd5b5061030d61055436600461290e565b610e35565b61030d610567366004612959565b611072565b34801561057857600080fd5b5060cf546102669073ffffffffffffffffffffffffffffffffffffffff1681565b3480156105a557600080fd5b5061030d6105b43660046129df565b611a95565b3480156105c557600080fd5b5061061060cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101f3565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4273ca160000000000000000000000000000000000000000000000000000000014806106b157507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60cf546107e99073ffffffffffffffffffffffffffffffffffffffff166106df858585610dc5565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061074b60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016107679796959493929190612a50565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611aaa565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a33858561086e60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b86604051610880959493929190612aaf565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b600061091e610ac8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f6f6e6c7920616363657074206e617469766520746f6b656e20617070726f766560448201527f2063616c6c6261636b000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000806000803660006109f08989610cdc565b9550955095509550955095508573ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff16148015610a365750838a145b8015610a425750600084115b610aa8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f696e76616c6964206f6e417070726f766520646174610000000000000000000060448201526064016109d4565b610ab6868686868686611bab565b5060019b9a5050505050505050505050565b60fd54604080517f4d0047ee000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691634d0047ee9160048083019260209291908290030181865afa158015610b38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5c9190612afd565b905090565b60fb54604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa158015610bd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5c9190612b1a565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff215301610cbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f7420736574000000000000000000000060648201526084016109d4565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b60008080803681604c871015610d74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f496e76616c6964206f6e417070726f7665206461746120666f72204c3143726f60448201527f7373446f6d61696e4d657373656e67657200000000000000000000000000000060648201526084016109d4565b5050508435606090811c96601487013590911c95602881013595604882013560e01c9550604c90910193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4019150565b6000611388619c4080603f610de1604063ffffffff8816612b6b565b610deb9190612b9b565b610df6601088612b6b565b610e039062030d40612be9565b610e0d9190612be9565b610e179190612be9565b610e219190612be9565b610e2b9190612be9565b90505b9392505050565b6000546003907501000000000000000000000000000000000000000000900460ff16158015610e83575060005460ff8083167401000000000000000000000000000000000000000090920416105b610f0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016109d4565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff60ff84167401000000000000000000000000000000000000000002167fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff90911617750100000000000000000000000000000000000000000017905560fb805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fc805486841690831617905560fd80549285169290911691909117905561100e734200000000000000000000000000000000000007611e77565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b3415611100576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f00000000000000000000000000000000000000000000000060648201526084016109d4565b60f087901c600281106111bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a4016109d4565b8061ffff166000036112b057600061120c878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f9250611fb3915050565b600081815260cb602052604090205490915060ff16156112ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c6179656400000000000000000060648201526084016109d4565b505b60006112f6898989898989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611fd292505050565b90506000611302610ac8565b905061130c611ff5565b1561136357600082815260ce602052604090205460ff161561133057611330612c15565b861561135e5760fc5461135e9073ffffffffffffffffffffffffffffffffffffffff8381169116308a6120d1565b611401565b600082815260ce602052604090205460ff16611401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c617965640000000000000000000000000000000060648201526084016109d4565b61140a8861216c565b15801561144357508073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614155b6114f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605960248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f657373206f72206e6174697665546f6b656e4164647265737300000000000000608482015260a4016109d4565b600082815260cb602052604090205460ff1615611594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c617965640000000000000000000060648201526084016109d4565b6115b5866115a6611388619c40612be9565b67ffffffffffffffff166121af565b15806115db575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b156116f557600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016116ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016109d4565b505050611a8c565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8b16179055600187156117d9576040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152602482018a905283169063095ea7b3906044016020604051808303816000875af11580156117b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d69190612b1a565b90505b600061182b8a619c405a6117ed9190612c44565b60008a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506121cd92505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905590508815801590611866575080155b15611907576040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301526000602483015284169063095ea7b3906044016020604051808303816000875af11580156118e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119049190612b1a565b91505b8080156119115750815b1561197957600084815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555185917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611a86565b600084815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555185917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3201611a86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016109d4565b50505050505b50505050505050565b611aa3338686848787611bab565b5050505050565b3415611b12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f44656e79206465706f736974696e67204554480000000000000000000000000060448201526064016109d4565b60fc546040517fb9e5595800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063b9e5595890611b739087908690819089906000908990600401612c5b565b600060405180830381600087803b158015611b8d57600080fd5b505af1158015611ba1573d6000803e3d6000fd5b5050505050505050565b8315611c7f576000611bbb610ac8565b9050611bdf73ffffffffffffffffffffffffffffffffffffffff82168830886120d1565b60fc546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152602481018790529082169063095ea7b3906044016020604051808303816000875af1158015611c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7c9190612b1a565b50505b60cf54611d2f9073ffffffffffffffffffffffffffffffffffffffff16611ca7848487610dc5565b867fd764ad0b00000000000000000000000000000000000000000000000000000000611d1360cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b8b8b8b8b8b8b6040516024016107679796959493929190612a50565b8473ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a878484611db460cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b88604051611dc6959493929190612aaf565b60405180910390a28573ffffffffffffffffffffffffffffffffffffffff167f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d54685604051611e1691815260200190565b60405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff00000000000000000000000000000000000000000000000000000000000090911617905550505050565b6000547501000000000000000000000000000000000000000000900460ff16611f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109d4565b60cc5473ffffffffffffffffffffffffffffffffffffffff16611f6c5760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000611fc1858585856121e7565b805190602001209050949350505050565b6000611fe2878787878787612280565b8051906020012090509695505050505050565b60fc5460009073ffffffffffffffffffffffffffffffffffffffff1633148015610b5c575060cf5460fc54604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691639bf62d82916004808201926020929091908290030181865afa158015612091573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b59190612afd565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261216690859061231f565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff82163014806106b157505060fc5473ffffffffffffffffffffffffffffffffffffffff90811691161490565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b6060848484846040516024016122009493929190612cae565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b606086868686868660405160240161229d96959493929190612cf8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b6000612381826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166124309092919063ffffffff16565b80519091501561242b578080602001905181019061239f9190612b1a565b61242b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016109d4565b505050565b6060610e2b84846000858573ffffffffffffffffffffffffffffffffffffffff85163b6124b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109d4565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516124e29190612d43565b60006040518083038185875af1925050503d806000811461251f576040519150601f19603f3d011682016040523d82523d6000602084013e612524565b606091505b509150915061253482828661253f565b979650505050505050565b6060831561254e575081610e2e565b82511561255e5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d491906127ab565b6000602082840312156125a457600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610e2e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff811681146125f657600080fd5b50565b60008083601f84011261260b57600080fd5b50813567ffffffffffffffff81111561262357600080fd5b60208301915083602082850101111561263b57600080fd5b9250929050565b803563ffffffff8116811461265657600080fd5b919050565b6000806000806060858703121561267157600080fd5b843561267c816125d4565b9350602085013567ffffffffffffffff81111561269857600080fd5b6126a4878288016125f9565b90945092506126b7905060408601612642565b905092959194509250565b6000806000806000608086880312156126da57600080fd5b85356126e5816125d4565b945060208601356126f5816125d4565b935060408601359250606086013567ffffffffffffffff81111561271857600080fd5b612724888289016125f9565b969995985093965092949392505050565b60005b83811015612750578181015183820152602001612738565b838111156121665750506000910152565b60008151808452612779816020860160208601612735565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610e2e6020830184612761565b600080602083850312156127d157600080fd5b823567ffffffffffffffff8111156127e857600080fd5b6127f4858286016125f9565b90969095509350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600073ffffffffffffffffffffffffffffffffffffffff808916835280881660208401525085604083015263ffffffff8516606083015260a0608083015261289560a083018486612800565b98975050505050505050565b6000602082840312156128b357600080fd5b5035919050565b6000806000604084860312156128cf57600080fd5b833567ffffffffffffffff8111156128e657600080fd5b6128f2868287016125f9565b9094509250612905905060208501612642565b90509250925092565b60008060006060848603121561292357600080fd5b833561292e816125d4565b9250602084013561293e816125d4565b9150604084013561294e816125d4565b809150509250925092565b600080600080600080600060c0888a03121561297457600080fd5b873596506020880135612986816125d4565b95506040880135612996816125d4565b9450606088013593506080880135925060a088013567ffffffffffffffff8111156129c057600080fd5b6129cc8a828b016125f9565b989b979a50959850939692959293505050565b6000806000806000608086880312156129f757600080fd5b8535612a02816125d4565b945060208601359350604086013567ffffffffffffffff811115612a2557600080fd5b612a31888289016125f9565b9094509250612a44905060608701612642565b90509295509295909350565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152612aa260c083018486612800565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000612adf608083018688612800565b905083604083015263ffffffff831660608301529695505050505050565b600060208284031215612b0f57600080fd5b8151610e2e816125d4565b600060208284031215612b2c57600080fd5b81518015158114610e2e57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615612b9257612b92612b3c565b02949350505050565b600067ffffffffffffffff80841680612bdd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115612c0c57612c0c612b3c565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082821015612c5657612c56612b3c565b500390565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015284604082015267ffffffffffffffff84166060820152821515608082015260c060a0820152600061289560c0830184612761565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152612ce76080830185612761565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261289560c0830184612761565b60008251612d55818460208701612735565b919091019291505056fea164736f6c634300080f000a",
  "devdoc": {
    "version": 1,
    "kind": "dev",
    "methods": {
      "OTHER_MESSENGER()": {
        "returns": {
          "_0": "CrossDomainMessenger contract on the other chain."
        }
      },
      "PORTAL()": {
        "returns": {
          "_0": "Contract of the OptimismPortal on this chain."
        }
      },
      "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,address)": {
        "params": {
          "_portal": "Contract of the OptimismPortal contract on this network.",
          "_superchainConfig": "Contract of the SuperchainConfig 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"
        }
      },
      "paused()": {
        "returns": {
          "_0": "Whether or not the contract is paused."
        }
      },
      "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\":\"contract CrossDomainMessenger\",\"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 SuperchainConfig\",\"name\":\"_superchainConfig\",\"type\":\"address\"},{\"internalType\":\"contract OptimismPortal\",\"name\":\"_portal\",\"type\":\"address\"},{\"internalType\":\"contract SystemConfig\",\"name\":\"_systemConfig\",\"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\":\"otherMessenger\",\"outputs\":[{\"internalType\":\"contract CrossDomainMessenger\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"portal\",\"outputs\":[{\"internalType\":\"contract OptimismPortal\",\"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\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"superchainConfig\",\"outputs\":[{\"internalType\":\"contract SuperchainConfig\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"systemConfig\",\"outputs\":[{\"internalType\":\"contract SystemConfig\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"unpackOnApproveData\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"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\":{\"OTHER_MESSENGER()\":{\"custom:legacy\":\"\",\"returns\":{\"_0\":\"CrossDomainMessenger contract on the other chain.\"}},\"PORTAL()\":{\"returns\":{\"_0\":\"Contract of the OptimismPortal on this chain.\"}},\"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,address)\":{\"params\":{\"_portal\":\"Contract of the OptimismPortal contract on this network.\",\"_superchainConfig\":\"Contract of the SuperchainConfig 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\"}},\"paused()\":{\"returns\":{\"_0\":\"Whether or not the contract is paused.\"}},\"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\":\"Retrieves the address of the paired CrossDomainMessenger contract on the other chain         Public getter is legacy and will be removed in the future. Use `otherMessenger()` instead.\"},\"PORTAL()\":{\"notice\":\"Getter for the OptimismPortal contract.\"},\"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,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.\"},\"onApprove(address,address,uint256,bytes)\":{\"notice\":\"ERC20 onApprove callback\"},\"otherMessenger()\":{\"notice\":\"CrossDomainMessenger contract on the other chain.\"},\"paused()\":{\"notice\":\"This function should return true if the contract is paused.         On L1 this function will check the SuperchainConfig for its paused status.         On L2 this function should be a no-op.\"},\"portal()\":{\"notice\":\"Contract of the OptimismPortal.\"},\"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.\"},\"superchainConfig()\":{\"notice\":\"Contract of the SuperchainConfig.\"},\"systemConfig()\":{\"notice\":\"Address of the SystemConfig contract.\"},\"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/\",\"@lib-keccak/=lib/lib-keccak/contracts/lib/\",\"@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\"@openzeppelin/contracts_v3.1.0/=lib/openzeppelin-contracts_v3.1.0/contracts/\",\"@openzeppelin/contracts_v5.0.1/=lib/openzeppelin-contracts_v5.0.1/contracts/\",\"@rari-capital/solmate/=lib/solmate/\",\"@solady-test/=lib/lib-keccak/lib/solady/test/\",\"@solady/=lib/lib-keccak/lib/solady/src/\",\"clones-with-immutable-args/=lib/clones-with-immutable-args/src/\",\"ds-test/=lib/forge-std/lib/ds-test/src/\",\"erc4626-tests/=lib/openzeppelin-contracts_v5.0.1/lib/erc4626-tests/\",\"forge-std/=lib/forge-std/src/\",\"kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\"lib-keccak/=lib/lib-keccak/contracts/\",\"openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\"openzeppelin-contracts/=lib/openzeppelin-contracts/\",\"openzeppelin-contracts_v3.1.0/=lib/openzeppelin-contracts_v3.1.0/contracts/\",\"openzeppelin-contracts_v5.0.1/=lib/openzeppelin-contracts_v5.0.1/\",\"safe-contracts/=lib/safe-contracts/contracts/\",\"solady/=lib/solady/src/\",\"solmate/=lib/solmate/src/\"],\"optimizer\":{\"enabled\":true,\"runs\":999999},\"metadata\":{\"bytecodeHash\":\"none\"},\"compilationTarget\":{\"src/L1/L1CrossDomainMessenger.sol\":\"L1CrossDomainMessenger\"},\"evmVersion\":\"london\",\"libraries\":{\"src/tokamak-contracts/USDC/L2/tokamak-USDC/v2/FiatTokenV2_2.sol:SignatureChecker\":\"0x4200000000000000000000000000000000000776\"}},\"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\":\"0xa2c96a4f6a1f2f698240ee90547ec1583d7fed6e8f46f3d2b7f5c20e32efa157\",\"urls\":[\"bzz-raw://f3654dcf093fe9f467889cbd3b85ea21425f0766c77d3c4a775d9017f5da5b0f\",\"dweb:/ipfs/QmYcunBuNUUxTnyQv5VmWPFEmRLrp7f8mk5HcKAqPaVq2H\"],\"license\":\"MIT\"},\"src/L1/L2OutputOracle.sol\":{\"keccak256\":\"0x342c5084f3c640c90530122bd78372c011d6162e698dd8c8daec9496fef01d42\",\"urls\":[\"bzz-raw://8700a3d486bd62cbb861ff80175b8040336940515791073af6a036db7c2df303\",\"dweb:/ipfs/QmSGKTH84rVHWgMg4d6GQZCmCJ16KuUuTsMwPMDdJxCsww\"],\"license\":\"MIT\"},\"src/L1/OnApprove.sol\":{\"keccak256\":\"0x40cee21f13053d860ab0aaaf77ff596f7131cb39ab21963d076e9e276492d31a\",\"urls\":[\"bzz-raw://b384a3225e25c0232aaa775d0f4df514ad7423228810e157ba921b736421c6b1\",\"dweb:/ipfs/QmcPTPwvhqtHLQAgntzVdqeptDDgmnEafnZwgAK7D7AoV1\"],\"license\":\"MIT\"},\"src/L1/OptimismPortal.sol\":{\"keccak256\":\"0xc0ce6ad53e823b15c020d6aaf54b4619856bb15a55adb7f6c6a9dedc44bff4c0\",\"urls\":[\"bzz-raw://2b228c7678c11cf66a044b856a864af05f3f21094b4b65626bc72505d766d6c2\",\"dweb:/ipfs/QmeiSMbhAPv3mWSJpG7BrXLgg9y3DwR8mfPAxJ9kkBoexa\"],\"license\":\"MIT\"},\"src/L1/ResourceMetering.sol\":{\"keccak256\":\"0xa4d524f2a5e91a0b63a62603e712001c51c77e8371b93cbb576bcb7d074b7588\",\"urls\":[\"bzz-raw://d6d8141b6c6dc72d2e684c1ae388c005fd78c9ca7fc9c15dddebd227ca4fd730\",\"dweb:/ipfs/QmPfJrR4qssu769TDWJnxdTozqKtZUxiY8fs95bhfECTvG\"],\"license\":\"MIT\"},\"src/L1/SuperchainConfig.sol\":{\"keccak256\":\"0x5fab874f980fe3e52c3398ddd25b655c56af0c98c15588b2ad9ebf30671d859d\",\"urls\":[\"bzz-raw://4e0aa613d38eceb621f8569fc714f521bc1f2df3d029552186ab3cdf2ee5d53f\",\"dweb:/ipfs/QmZDzFxhTXLW79eohQbr1nghNh3oNC4CUfH7uMX8CsjVAB\"],\"license\":\"MIT\"},\"src/L1/SystemConfig.sol\":{\"keccak256\":\"0x7ac167b28985ba0ce2bb0ff977d62d924e09af2a26e34f6dab34cbee3726efb2\",\"urls\":[\"bzz-raw://c11ed2ff66aa5b3d5f60898c7d3ed2bd1b08d4de00ba9a5d4c3d1c209564d4fa\",\"dweb:/ipfs/QmVSV12CWoh8j9tQgsCwwia2iGngURoqQY86Kz46G9oAwe\"],\"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\":\"0x456363d6428b9495ef57b2430d0ad99c93d7556196cfc2f76e28acf95919101e\",\"urls\":[\"bzz-raw://a055ed06e2843dbc9b3f896837fa12e12e2e20254e0e1ef5011a3e3708f6baed\",\"dweb:/ipfs/QmQ5oNWk6o4vVWJiVE8F3wBhM1wkwuFZ7VXZY6wqHbhA2H\"],\"license\":\"MIT\"},\"src/libraries/Hashing.sol\":{\"keccak256\":\"0x44e2b2dcfffc39c0fc95ccd3c2118c7e7585fadf3dca327877d5756c7d4b21c3\",\"urls\":[\"bzz-raw://6c89e0d9cfcb08a0d3c46c85367a32bbd9703468ba4c0c5bb6e124c1d173b26b\",\"dweb:/ipfs/QmaY3nQHBBhHK1wrurVXiEeNL8hfZ1pRmhpqW44tFDJnDf\"],\"license\":\"MIT\"},\"src/libraries/Predeploys.sol\":{\"keccak256\":\"0x65832a219fbfc48a0fd15ec3427416be47ddb391e73f1c1424a1bb5b8113bcc5\",\"urls\":[\"bzz-raw://081e7d404a438f12b80065f1b30511d4c78f3f129c808d842079212ffe4b4afe\",\"dweb:/ipfs/QmYypGQr1XV86R8iVorNgek77wnvpixBdrffksE7goRWwk\"],\"license\":\"MIT\"},\"src/libraries/SafeCall.sol\":{\"keccak256\":\"0x0636a7abb242bb5d6f5606967c8929e6aa7e63468c1e2ce40ad4780d4c4bf94f\",\"urls\":[\"bzz-raw://a4daec2ac8f9907bbf84ef0a1c48f03bae8657619bc6f42b3a672f25c516f17a\",\"dweb:/ipfs/Qmf8gfRxBv8gEmCkP8YMPb2GGfj9QUnoNUyKE7UR2SWGnq\"],\"license\":\"MIT\"},\"src/libraries/Storage.sol\":{\"keccak256\":\"0x7ce27a05552aa69afa6b2ab6684dfe99f27366cf8ef2046baeb1fb62fff0022f\",\"urls\":[\"bzz-raw://a6a24f3ed56681720707a5ab0372fd67fcb1a4f6fb072c7140cda28bdb70f269\",\"dweb:/ipfs/QmW9uTpUULV4xmP7A7MoBDeDhVfQgmJG5qVUFGtXxWpWWK\"],\"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\":\"0x3e2381f8c840788aaa91c9a05b4bcf010fb981a2242783af7919e85260b29f4b\",\"urls\":[\"bzz-raw://7cd49c629ef72732987ed63f52d125dd261b10815e0caf53da3a46d2511263ad\",\"dweb:/ipfs/QmcDc6cakKUyFkFeo8p5MoVjZT4vjWRAHb3BNa6Vz5J7vQ\"],\"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": 100485,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "spacer_0_0_20",
        "offset": 0,
        "slot": "0",
        "type": "t_address"
      },
      {
        "astId": 45180,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "_initialized",
        "offset": 20,
        "slot": "0",
        "type": "t_uint8"
      },
      {
        "astId": 45183,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "_initializing",
        "offset": 21,
        "slot": "0",
        "type": "t_bool"
      },
      {
        "astId": 100492,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "spacer_1_0_1600",
        "offset": 0,
        "slot": "1",
        "type": "t_array(t_uint256)50_storage"
      },
      {
        "astId": 100495,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "spacer_51_0_20",
        "offset": 0,
        "slot": "51",
        "type": "t_address"
      },
      {
        "astId": 100500,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "spacer_52_0_1568",
        "offset": 0,
        "slot": "52",
        "type": "t_array(t_uint256)49_storage"
      },
      {
        "astId": 100503,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "spacer_101_0_1",
        "offset": 0,
        "slot": "101",
        "type": "t_bool"
      },
      {
        "astId": 100508,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "spacer_102_0_1568",
        "offset": 0,
        "slot": "102",
        "type": "t_array(t_uint256)49_storage"
      },
      {
        "astId": 100511,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "spacer_151_0_32",
        "offset": 0,
        "slot": "151",
        "type": "t_uint256"
      },
      {
        "astId": 100516,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "spacer_152_0_1568",
        "offset": 0,
        "slot": "152",
        "type": "t_array(t_uint256)49_storage"
      },
      {
        "astId": 100521,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "spacer_201_0_32",
        "offset": 0,
        "slot": "201",
        "type": "t_mapping(t_bytes32,t_bool)"
      },
      {
        "astId": 100526,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "spacer_202_0_32",
        "offset": 0,
        "slot": "202",
        "type": "t_mapping(t_bytes32,t_bool)"
      },
      {
        "astId": 100571,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "successfulMessages",
        "offset": 0,
        "slot": "203",
        "type": "t_mapping(t_bytes32,t_bool)"
      },
      {
        "astId": 100574,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "xDomainMsgSender",
        "offset": 0,
        "slot": "204",
        "type": "t_address"
      },
      {
        "astId": 100577,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "msgNonce",
        "offset": 0,
        "slot": "205",
        "type": "t_uint240"
      },
      {
        "astId": 100582,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "failedMessages",
        "offset": 0,
        "slot": "206",
        "type": "t_mapping(t_bytes32,t_bool)"
      },
      {
        "astId": 100586,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "otherMessenger",
        "offset": 0,
        "slot": "207",
        "type": "t_contract(CrossDomainMessenger)101049"
      },
      {
        "astId": 100591,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "__gap",
        "offset": 0,
        "slot": "208",
        "type": "t_array(t_uint256)43_storage"
      },
      {
        "astId": 73062,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "superchainConfig",
        "offset": 0,
        "slot": "251",
        "type": "t_contract(SuperchainConfig)80234"
      },
      {
        "astId": 73066,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "portal",
        "offset": 0,
        "slot": "252",
        "type": "t_contract(OptimismPortal)78472"
      },
      {
        "astId": 73070,
        "contract": "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger",
        "label": "systemConfig",
        "offset": 0,
        "slot": "253",
        "type": "t_contract(SystemConfig)81092"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_array(t_uint256)43_storage": {
        "encoding": "inplace",
        "label": "uint256[43]",
        "numberOfBytes": "1376",
        "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(CrossDomainMessenger)101049": {
        "encoding": "inplace",
        "label": "contract CrossDomainMessenger",
        "numberOfBytes": "20"
      },
      "t_contract(OptimismPortal)78472": {
        "encoding": "inplace",
        "label": "contract OptimismPortal",
        "numberOfBytes": "20"
      },
      "t_contract(SuperchainConfig)80234": {
        "encoding": "inplace",
        "label": "contract SuperchainConfig",
        "numberOfBytes": "20"
      },
      "t_contract(SystemConfig)81092": {
        "encoding": "inplace",
        "label": "contract SystemConfig",
        "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": "0xa7eca946aeb17bf99f5872f1b32ad79356703c4a5f57e4366f711058e66c33fa",
  "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": "Retrieves the address of the paired CrossDomainMessenger contract on the other chain         Public getter is legacy and will be removed in the future. Use `otherMessenger()` instead."
      },
      "PORTAL()": {
        "notice": "Getter for the OptimismPortal contract."
      },
      "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,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."
      },
      "onApprove(address,address,uint256,bytes)": {
        "notice": "ERC20 onApprove callback"
      },
      "otherMessenger()": {
        "notice": "CrossDomainMessenger contract on the other chain."
      },
      "paused()": {
        "notice": "This function should return true if the contract is paused.         On L1 this function will check the SuperchainConfig for its paused status.         On L2 this function should be a no-op."
      },
      "portal()": {
        "notice": "Contract of the OptimismPortal."
      },
      "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."
      },
      "superchainConfig()": {
        "notice": "Contract of the SuperchainConfig."
      },
      "systemConfig()": {
        "notice": "Address of the SystemConfig contract."
      },
      "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."
  }
}