@tokamak-network/titan-contracts
Version:
L1 and L2 smart contracts for Titan
701 lines • 76.7 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "L1CrossDomainMessenger",
"sourceName": "contracts/L1/messaging/L1CrossDomainMessenger.sol",
"abi": [
{
"inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "target",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"indexed": false,
"internalType": "bytes",
"name": "message",
"type": "bytes"
},
{
"indexed": false,
"internalType": "uint256",
"name": "messageNonce",
"type": "uint256"
}
],
"name": "FailedRelayedFastMessage",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "msgHash",
"type": "bytes32"
}
],
"name": "FailedRelayedMessage",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint8",
"name": "version",
"type": "uint8"
}
],
"name": "Initialized",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "_xDomainCalldataHash",
"type": "bytes32"
}
],
"name": "MessageAllowed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "_xDomainCalldataHash",
"type": "bytes32"
}
],
"name": "MessageBlocked",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "Paused",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "target",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"indexed": false,
"internalType": "bytes",
"name": "message",
"type": "bytes"
},
{
"indexed": false,
"internalType": "uint256",
"name": "messageNonce",
"type": "uint256"
}
],
"name": "RelayedFastMessage",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "msgHash",
"type": "bytes32"
}
],
"name": "RelayedMessage",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "target",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"indexed": false,
"internalType": "bytes",
"name": "message",
"type": "bytes"
},
{
"indexed": false,
"internalType": "uint256",
"name": "messageNonce",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "gasLimit",
"type": "uint256"
}
],
"name": "SentMessage",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "Unpaused",
"type": "event"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "_xDomainCalldataHash",
"type": "bytes32"
}
],
"name": "allowMessage",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "bytes",
"name": "message",
"type": "bytes"
},
{
"internalType": "uint256",
"name": "messageNonce",
"type": "uint256"
},
{
"components": [
{
"internalType": "bytes32",
"name": "stateRoot",
"type": "bytes32"
},
{
"components": [
{
"internalType": "uint256",
"name": "batchIndex",
"type": "uint256"
},
{
"internalType": "bytes32",
"name": "batchRoot",
"type": "bytes32"
},
{
"internalType": "uint256",
"name": "batchSize",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "prevTotalElements",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "extraData",
"type": "bytes"
}
],
"internalType": "struct Lib_OVMCodec.ChainBatchHeader",
"name": "stateRootBatchHeader",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "index",
"type": "uint256"
},
{
"internalType": "bytes32[]",
"name": "siblings",
"type": "bytes32[]"
}
],
"internalType": "struct Lib_OVMCodec.ChainInclusionProof",
"name": "stateRootProof",
"type": "tuple"
},
{
"internalType": "bytes",
"name": "stateTrieWitness",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "storageTrieWitness",
"type": "bytes"
}
],
"internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof",
"name": "proof",
"type": "tuple"
}
],
"internalType": "struct IL1CrossDomainMessenger.L2ToL1Message[]",
"name": "_messages",
"type": "tuple[]"
}
],
"name": "batchRelayMessages",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "_xDomainCalldataHash",
"type": "bytes32"
}
],
"name": "blockMessage",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"name": "blockedMessages",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"name": "failedMessages",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_libAddressManager",
"type": "address"
}
],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "libAddressManager",
"outputs": [
{
"internalType": "contract Lib_AddressManager",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "pause",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "paused",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_target",
"type": "address"
},
{
"internalType": "address",
"name": "_sender",
"type": "address"
},
{
"internalType": "bytes",
"name": "_message",
"type": "bytes"
},
{
"internalType": "uint256",
"name": "_messageNonce",
"type": "uint256"
},
{
"components": [
{
"internalType": "bytes32",
"name": "stateRoot",
"type": "bytes32"
},
{
"components": [
{
"internalType": "uint256",
"name": "batchIndex",
"type": "uint256"
},
{
"internalType": "bytes32",
"name": "batchRoot",
"type": "bytes32"
},
{
"internalType": "uint256",
"name": "batchSize",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "prevTotalElements",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "extraData",
"type": "bytes"
}
],
"internalType": "struct Lib_OVMCodec.ChainBatchHeader",
"name": "stateRootBatchHeader",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "index",
"type": "uint256"
},
{
"internalType": "bytes32[]",
"name": "siblings",
"type": "bytes32[]"
}
],
"internalType": "struct Lib_OVMCodec.ChainInclusionProof",
"name": "stateRootProof",
"type": "tuple"
},
{
"internalType": "bytes",
"name": "stateTrieWitness",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "storageTrieWitness",
"type": "bytes"
}
],
"internalType": "struct IL1CrossDomainMessenger.L2MessageInclusionProof",
"name": "_proof",
"type": "tuple"
}
],
"name": "relayMessage",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"name": "relayedMessages",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_target",
"type": "address"
},
{
"internalType": "address",
"name": "_sender",
"type": "address"
},
{
"internalType": "bytes",
"name": "_message",
"type": "bytes"
},
{
"internalType": "uint256",
"name": "_queueIndex",
"type": "uint256"
},
{
"internalType": "uint32",
"name": "_oldGasLimit",
"type": "uint32"
},
{
"internalType": "uint32",
"name": "_newGasLimit",
"type": "uint32"
}
],
"name": "replayMessage",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "_name",
"type": "string"
}
],
"name": "resolve",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_target",
"type": "address"
},
{
"internalType": "bytes",
"name": "_message",
"type": "bytes"
},
{
"internalType": "uint32",
"name": "_gasLimit",
"type": "uint32"
}
],
"name": "sendMessage",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"name": "successfulMessages",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "xDomainMessageSender",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
}
],
"bytecode": "0x608060405260cd80546001600160a01b03191661dead17905534801561002457600080fd5b50600080546001600160a01b0319169055613a89806100446000396000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c8063715018a6116100cd578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab0146102e1578063d7fd19dd14610304578063f2fde38b1461031757600080fd5b8063b1b1b209146102ab578063c4d66de8146102ce57600080fd5b80638456cb59116100b25780638456cb59146102625780638da5cb5b1461026a578063a4e7f8bd1461028857600080fd5b8063715018a61461024757806381ada46c1461024f57600080fd5b80633dbb202b116101245780635c975abb116101095780635c975abb146102215780636e296e451461022c5780636f1c8d471461023457600080fd5b80633dbb202b146101fb578063461a44781461020e57600080fd5b80630ecf2eea1461015657806316e9cd9b1461016b57806321d800ec1461017e578063299ca478146101b6575b600080fd5b610169610164366004612e24565b61032a565b005b610169610179366004612e3d565b610375565b6101a161018c366004612e24565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101d69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ad565b610169610209366004613011565b6103ea565b6101d661021c366004613071565b610532565b60655460ff166101a1565b6101d66105df565b6101696102423660046130c2565b61066e565b610169610855565b61016961025d366004612e24565b610869565b6101696108b1565b60335473ffffffffffffffffffffffffffffffffffffffff166101d6565b6101a1610296366004612e24565b60cc6020526000908152604090205460ff1681565b6101a16102b9366004612e24565b60cb6020526000908152604090205460ff1681565b6101696102dc36600461314e565b6108c1565b6101a16102ef366004612e24565b60c96020526000908152604090205460ff1681565b61016961031236600461334e565b610b99565b61016961032536600461314e565b611032565b6103326110cf565b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60005b818110156103e5576000838383818110610394576103946133e1565b90506020028101906103a69190613410565b6103af9061344e565b90506103d281600001518260200151836040015184606001518560800151610b99565b50806103dd8161350e565b915050610378565b505050565b600061042a6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610532565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b15801561047457600080fd5b505afa158015610488573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ac919061355c565b905060006104c38633878564ffffffffff16611136565b90506104d683828663ffffffff166111b1565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a3387858860405161052294939291906135d3565b60405180910390a2505050505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610589908590600401613626565b60206040518083038186803b1580156105a157600080fd5b505afa1580156105b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d99190613639565b92915050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead14156106515760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f74207365740060448201526064015b60405180910390fd5b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b60006106ae6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610532565b6040517f2a7f18be0000000000000000000000000000000000000000000000000000000081526004810186905290915060009073ffffffffffffffffffffffffffffffffffffffff831690632a7f18be9060240160606040518083038186803b15801561071a57600080fd5b505afa15801561072e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107529190613656565b9050600061076289898989611136565b90506000731111000000000000000000000000000000001111300173420000000000000000000000000000000000000787846040516020016107a794939291906136bb565b604051602081830303815290604052805190602001209050826000015181146108385760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565642e000000000000000000000000000000000000000000000000006064820152608401610648565b61084984838763ffffffff166111b1565b50505050505050505050565b61085d6110cf565b6108676000611252565b565b6108716110cf565b600081815260c96020526040808220805460ff191690555182917f52c8a2680a9f4cc0ad0bf88f32096eadbebf0646ea611d93a0ce6a29a024040591a250565b6108b96110cf565b6108676112c9565b6000547501000000000000000000000000000000000000000000900460ff161580801561090c575060005460017401000000000000000000000000000000000000000090910460ff16105b8061093e5750303b15801561093e575060005474010000000000000000000000000000000000000000900460ff166001145b6109b05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610648565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790558015610a3657600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b60005473ffffffffffffffffffffffffffffffffffffffff1615610ac25760405162461bcd60e51b815260206004820152602a60248201527f4c3143726f7373446f6d61696e4d657373656e67657220616c7265616479206960448201527f6e7469616c697a65642e000000000000000000000000000000000000000000006064820152608401610648565b6000805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cd805490911661dead179055610b1a611330565b610b226113c1565b610b2a61145b565b610b326114f8565b8015610b9557600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b60026097541415610bec5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610648565b6002609755610bf9611590565b6000610c0786868686611136565b9050610c1381836115e3565b1515600114610c8a5760405162461bcd60e51b815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610648565b8051602080830191909120600081815260cb90925260409091205460ff1615610d1b5760405162461bcd60e51b815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610648565b600081815260c9602052604090205460ff1615610da05760405162461bcd60e51b815260206004820152602260248201527f50726f7669646564206d65737361676520686173206265656e20626c6f636b6560448201527f642e0000000000000000000000000000000000000000000000000000000000006064820152608401610648565b610dde6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610532565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610e7f5760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073656e64204c322d3e4c31206d6573736167657320746f204c60448201527f312073797374656d20636f6e7472616374732e000000000000000000000000006064820152608401610648565b60cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155604051600091891690610ed8908890613700565b6000604051808303816000865af19150503d8060008114610f15576040519150601f19603f3d011682016040523d82523d6000602084013e610f1a565b606091505b505060cd80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080151560011415610f9a57600082815260cb6020526040808220805460ff191660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2610fdb565b600082815260cc6020526040808220805460ff191660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b6000833343604051602001610ff293929190613712565b60408051601f198184030181529181528151602092830120600090815260ca9092529020805460ff19166001908117909155609755505050505050505050565b61103a6110cf565b73ffffffffffffffffffffffffffffffffffffffff81166110c35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610648565b6110cc81611252565b50565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108675760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610648565b60608484848460405160240161114f9493929190613764565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6040517f6fee07e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636fee07e09061121b9073420000000000000000000000000000000000000790859087906004016137ae565b600060405180830381600087803b15801561123557600080fd5b505af1158015611249573d6000803e3d6000fd5b50505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6112d1611590565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113063390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000547501000000000000000000000000000000000000000000900460ff166108675760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610648565b6000547501000000000000000000000000000000000000000000900460ff166114525760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610648565b61086733611252565b6000547501000000000000000000000000000000000000000000900460ff166114ec5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610648565b6065805460ff19169055565b6000547501000000000000000000000000000000000000000000900460ff166115895760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610648565b6001609755565b60655460ff16156108675760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610648565b60006115ee82611606565b80156115ff57506115ff83836117a8565b9392505050565b6000806116476040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e000000000000000000000000815250610532565b60208401516040517f9418bddd00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff831691639418bddd9161169f91600401613820565b60206040518083038186803b1580156116b757600080fd5b505afa1580156116cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ef9190613833565b1580156115ff57508251602084015160408086015190517f4d69ee5700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851693634d69ee5793611758939192909190600401613855565b60206040518083038186803b15801561177057600080fd5b505afa158015611784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ff9190613833565b600080837342000000000000000000000000000000000000076040516020016117d29291906138cd565b60408051601f1981840301815282825280516020918201209083015260009082015260600160408051601f198184030181529082905280516020918201207f420000000000000000000000000000000000000000000000000000000000000091830191909152915060009081906118629060340160408051601f198184030181529190526060870151875161198c565b90925090506001821515146119055760405162461bcd60e51b815260206004820152604d60248201527f4d6573736167652070617373696e67207072656465706c6f7920686173206e6f60448201527f74206265656e20696e697469616c697a6564206f7220696e76616c696420707260648201527f6f6f662070726f76696465642e00000000000000000000000000000000000000608482015260a401610648565b6000611910826119b5565b90506119818460405160200161192891815260200190565b60408051601f19818403018152908290527f010000000000000000000000000000000000000000000000000000000000000060208301529060210160405160208183030381529060405288608001518460400151611a79565b979650505050505050565b60006060600061199b86611a9d565b90506119a8818686611acf565b9250925050935093915050565b6040805160808101825260008082526020820181905291810182905260608101829052906119e283611baa565b90506040518060800160405280611a1283600081518110611a0557611a056133e1565b6020026020010151611bdd565b8152602001611a2d83600181518110611a0557611a056133e1565b8152602001611a5583600281518110611a4857611a486133e1565b6020026020010151611be4565b8152602001611a7083600381518110611a4857611a486133e1565b90529392505050565b600080611a8586611a9d565b9050611a9381868686611ce6565b9695505050505050565b60608180519060200120604051602001611ab991815260200190565b6040516020818303038152906040529050919050565b600060606000611ade85611d1c565b90506000806000611af0848a89611e17565b81519295509093509150158080611b045750815b611b505760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e0000000000006044820152606401610648565b600081611b6c5760405180602001604052806000815250611b98565b611b9886611b7b600188613917565b81518110611b8b57611b8b6133e1565b60200260200101516122b2565b919b919a509098505050505050505050565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906105d9906122dc565b60006105d9825b6000602182600001511115611c3b5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610648565b6000806000611c49856124db565b919450925090506000816001811115611c6457611c6461392e565b14611cb15760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610648565b6000838660200151611cc3919061395d565b80519091506020841015611a935760208490036101000a90049695505050505050565b6000806000611cf6878686611acf565b915091508180156119815750805160208083019190912087519188019190912014611981565b60606000611d2983611baa565b90506000815167ffffffffffffffff811115611d4757611d47612ed4565b604051908082528060200260200182016040528015611d8c57816020015b6040805180820190915260608082526020820152815260200190600190039081611d655790505b50905060005b8251811015611e0f576000611dbf848381518110611db257611db26133e1565b602002602001015161282c565b90506040518060400160405280828152602001611ddb83611baa565b815250838381518110611df057611df06133e1565b6020026020010181905250508080611e079061350e565b915050611d92565b509392505050565b60006060818080611e27876128bc565b90506000869050600080611e4e604051806040016040528060608152602001606081525090565b60005b8c5181101561226e578c8181518110611e6c57611e6c6133e1565b602002602001015191508284611e82919061395d565b9350611e8f60018861395d565b965083611ef357815180516020909101208514611eee5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420726f6f7420686173680000000000000000000000000000006044820152606401610648565b611fb0565b815151602011611f5557815180516020909101208514611eee5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610648565b84611f638360000151612a3f565b14611fb05760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610648565b611fbc6010600161395d565b8260200151511415612035578551841415611fd65761226e565b6000868581518110611fea57611fea6133e1565b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110612015576120156133e1565b6020026020010151905061202881612a67565b965060019450505061225c565b6002826020015151141561221457600061204e83612a9d565b9050600081600081518110612065576120656133e1565b016020015160f81c9050600061207c6002836139a4565b6120879060026139c6565b90506000612098848360ff16612ac1565b905060006120a68b8a612ac1565b905060006120b48383612af7565b905060ff8516600214806120cb575060ff85166003145b15612121578083511480156120e05750808251145b156120f2576120ef818b61395d565b99505b507f8000000000000000000000000000000000000000000000000000000000000000995061226e945050505050565b60ff85161580612134575060ff85166001145b156121a6578251811461217057507f8000000000000000000000000000000000000000000000000000000000000000995061226e945050505050565b612197886020015160018151811061218a5761218a6133e1565b6020026020010151612a67565b9a50975061225c945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f70726566697800000000000000000000000000000000000000000000000000006064820152608401610648565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610648565b806122668161350e565b915050611e51565b507f800000000000000000000000000000000000000000000000000000000000000084148661229d8786612ac1565b909e909d50909b509950505050505050505050565b602081015180516060916105d9916122cc90600190613917565b81518110611db257611db26133e1565b60606000806122ea846124db565b919350909150600190508160018111156123065761230661392e565b146123535760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610648565b6040805160208082526104208201909252600091816020015b604080518082019091526000808252602082015281526020019060019003908161236c5790505090506000835b86518110156124d057602082106124185760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610648565b6000806124556040518060400160405280858c600001516124399190613917565b8152602001858c6020015161244e919061395d565b90526124db565b509150915060405180604001604052808383612471919061395d565b8152602001848b60200151612486919061395d565b81525085858151811061249b5761249b6133e1565b60209081029190910101526124b160018561395d565b93506124bd818361395d565b6124c7908461395d565b92505050612399565b508152949350505050565b6000806000808460000151116125335760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610648565b6020840151805160001a607f8111612558576000600160009450945094505050612825565b60b781116125d457600061256d608083613917565b9050808760000151116125c25760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610648565b60019550935060009250612825915050565b60bf81116126c35760006125e960b783613917565b90508087600001511161263e5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610648565b600183015160208290036101000a9004612658818361395d565b8851116126a75760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610648565b6126b282600161395d565b965094506000935061282592505050565b60f7811161273e5760006126d860c083613917565b90508087600001511161272d5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610648565b600195509350849250612825915050565b600061274b60f783613917565b9050808760000151116127a05760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610648565b600183015160208290036101000a90046127ba818361395d565b8851116128095760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610648565b61281482600161395d565b965094506001935061282592505050565b9193909250565b6060600080600061283c856124db565b9194509250905060008160018111156128575761285761392e565b146128a45760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610648565b6128b385602001518484612ba3565b95945050505050565b60606000825160026128ce91906139e9565b67ffffffffffffffff8111156128e6576128e6612ed4565b6040519080825280601f01601f191660200182016040528015612910576020820181803683370190505b50905060005b8351811015612a38576004848281518110612933576129336133e1565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c826129688360026139e9565b81518110612978576129786133e1565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060108482815181106129bb576129bb6133e1565b01602001516129cd919060f81c6139a4565b60f81b826129dc8360026139e9565b6129e790600161395d565b815181106129f7576129f76133e1565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612a308161350e565b915050612916565b5092915050565b6000602082511015612a5357506020015190565b818060200190518101906105d99190613a26565b60006060602083600001511015612a8857612a8183612c82565b9050612a94565b612a918361282c565b90505b6115ff81612a3f565b60606105d9612abc8360200151600081518110611db257611db26133e1565b6128bc565b606082518210612ae057506040805160208101909152600081526105d9565b6115ff8383848651612af29190613917565b612c8d565b6000805b808451118015612b0b5750808351115b8015612b8c5750828181518110612b2457612b246133e1565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612b6357612b636133e1565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156115ff5780612b9b8161350e565b915050612afb565b606060008267ffffffffffffffff811115612bc057612bc0612ed4565b6040519080825280601f01601f191660200182016040528015612bea576020820181803683370190505b509050805160001415612bfe5790506115ff565b6000612c0a858761395d565b90506020820160005b612c1e602087613a3f565b811015612c555782518252612c3460208461395d565b9250612c4160208361395d565b915080612c4d8161350e565b915050612c13565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b60606105d982612e0e565b606081612c9b81601f61395d565b1015612ce95760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610648565b82612cf4838261395d565b1015612d425760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610648565b612d4c828461395d565b84511015612d9c5760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610648565b606082158015612dbb5760405191506000825260208201604052612e05565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015612df4578051835260209283019201612ddc565b5050858452601f01601f1916604052505b50949350505050565b60606105d9826020015160008460000151612ba3565b600060208284031215612e3657600080fd5b5035919050565b60008060208385031215612e5057600080fd5b823567ffffffffffffffff80821115612e6857600080fd5b818501915085601f830112612e7c57600080fd5b813581811115612e8b57600080fd5b8660208260051b8501011115612ea057600080fd5b60209290920196919550909350505050565b73ffffffffffffffffffffffffffffffffffffffff811681146110cc57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff81118282101715612f2657612f26612ed4565b60405290565b6040805190810167ffffffffffffffff81118282101715612f2657612f26612ed4565b604051601f8201601f1916810167ffffffffffffffff81118282101715612f7857612f78612ed4565b604052919050565b600067ffffffffffffffff831115612f9a57612f9a612ed4565b612fad6020601f19601f86011601612f4f565b9050828152838383011115612fc157600080fd5b828260208301376000602084830101529392505050565b600082601f830112612fe957600080fd5b6115ff83833560208501612f80565b803563ffffffff8116811461300c57600080fd5b919050565b60008060006060848603121561302657600080fd5b833561303181612eb2565b9250602084013567ffffffffffffffff81111561304d57600080fd5b61305986828701612fd8565b92505061306860408501612ff8565b90509250925092565b60006020828403121561308357600080fd5b813567ffffffffffffffff81111561309a57600080fd5b8201601f810184136130ab57600080fd5b6130ba84823560208401612f80565b949350505050565b60008060008060008060c087890312156130db57600080fd5b86356130e681612eb2565b955060208701356130f681612eb2565b9450604087013567ffffffffffffffff81111561311257600080fd5b61311e89828a01612fd8565b9450506060870135925061313460808801612ff8565b915061314260a08801612ff8565b90509295509295509295565b60006020828403121561316057600080fd5b81356115ff81612eb2565b600060a0828403121561317d57600080fd5b613185612f03565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156131c357600080fd5b6131cf84828501612fd8565b60808301525092915050565b6000604082840312156131ed57600080fd5b6131f5612f2c565b90508135815260208083013567ffffffffffffffff8082111561321757600080fd5b818501915085601f83011261322b57600080fd5b81358181111561323d5761323d612ed4565b8060051b915061324e848301612f4f565b818152918301840191848101908884111561326857600080fd5b938501935b838510156132865784358252938501939085019061326d565b808688015250505050505092915050565b600060a082840312156132a957600080fd5b6132b1612f03565b905081358152602082013567ffffffffffffffff808211156132d257600080fd5b6132de8583860161316b565b602084015260408401359150808211156132f757600080fd5b613303858386016131db565b6040840152606084013591508082111561331c57600080fd5b61332885838601612fd8565b6060840152608084013591508082111561334157600080fd5b506131cf84828501612fd8565b600080600080600060a0868803121561336657600080fd5b853561337181612eb2565b9450602086013561338181612eb2565b9350604086013567ffffffffffffffff8082111561339e57600080fd5b6133aa89838a01612fd8565b94506060880135935060808801359150808211156133c757600080fd5b506133d488828901613297565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261344457600080fd5b9190910192915050565b600060a0823603121561346057600080fd5b613468612f03565b823561347381612eb2565b8152602083013561348381612eb2565b6020820152604083013567ffffffffffffffff808211156134a357600080fd5b6134af36838701612fd8565b60408401526060850135606084015260808501359150808211156134d257600080fd5b506131cf36828601613297565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613540576135406134df565b5060010190565b805164ffffffffff8116811461300c57600080fd5b60006020828403121561356e57600080fd5b6115ff82613547565b60005b8381101561359257818101518382015260200161357a565b838111156135a1576000848401525b50505050565b600081518084526135bf816020860160208601613577565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8516815260806020820152600061360260808301866135a7565b905064ffffffffff8416604083015263ffffffff8316606083015295945050505050565b6020815260006115ff60208301846135a7565b60006020828403121561364b57600080fd5b81516115ff81612eb2565b60006060828403121561366857600080fd5b6040516060810181811067ffffffffffffffff8211171561368b5761368b612ed4565b6040528251815261369e60208401613547565b60208201526136af60408401613547565b60408201529392505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525063ffffffff8416604083015260806060830152611a9360808301846135a7565b60008251613444818460208701613577565b60008451613724818460208901613577565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152506080604083015261379d60808301856135a7565b905082606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff841681528260208201526060604082015260006128b360608301846135a7565b805182526020810151602083015260408101516040830152606081015160608301526000608082015160a060808501526130ba60a08501826135a7565b6020815260006115ff60208301846137e3565b60006020828403121561384557600080fd5b815180151581146115ff57600080fd5b8381526000602060608184015261386f60608401866137e3565b83810360408501526040810185518252828601516040848401528181518084526060850191508583019450600093505b808410156138bf578451825293850193600193909301929085019061389f565b509998505050505050505050565b600083516138df818460208801613577565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b600082821015613929576139296134df565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008219821115613970576139706134df565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060ff8316806139b7576139b7613975565b8060ff84160691505092915050565b600060ff821660ff8416808210156139e0576139e06134df565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a2157613a216134df565b500290565b600060208284031215613a3857600080fd5b5051919050565b600082613a4e57613a4e613975565b50049056fea2646970667358221220b304948fc723bfb6fb96719a6d4390a7b27cd73cc905943fe6c3a27702dbf44f64736f6c63430008090033",
"deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101515760003560e01c8063715018a6116100cd578063b1b1b20911610081578063c6b94ab011610066578063c6b94ab0146102e1578063d7fd19dd14610304578063f2fde38b1461031757600080fd5b8063b1b1b209146102ab578063c4d66de8146102ce57600080fd5b80638456cb59116100b25780638456cb59146102625780638da5cb5b1461026a578063a4e7f8bd1461028857600080fd5b8063715018a61461024757806381ada46c1461024f57600080fd5b80633dbb202b116101245780635c975abb116101095780635c975abb146102215780636e296e451461022c5780636f1c8d471461023457600080fd5b80633dbb202b146101fb578063461a44781461020e57600080fd5b80630ecf2eea1461015657806316e9cd9b1461016b57806321d800ec1461017e578063299ca478146101b6575b600080fd5b610169610164366004612e24565b61032a565b005b610169610179366004612e3d565b610375565b6101a161018c366004612e24565b60ca6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6000546101d69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ad565b610169610209366004613011565b6103ea565b6101d661021c366004613071565b610532565b60655460ff166101a1565b6101d66105df565b6101696102423660046130c2565b61066e565b610169610855565b61016961025d366004612e24565b610869565b6101696108b1565b60335473ffffffffffffffffffffffffffffffffffffffff166101d6565b6101a1610296366004612e24565b60cc6020526000908152604090205460ff1681565b6101a16102b9366004612e24565b60cb6020526000908152604090205460ff1681565b6101696102dc36600461314e565b6108c1565b6101a16102ef366004612e24565b60c96020526000908152604090205460ff1681565b61016961031236600461334e565b610b99565b61016961032536600461314e565b611032565b6103326110cf565b600081815260c96020526040808220805460ff191660011790555182917ff52508d5339edf0d7e5060a416df98db067af561bdc60872d29c0439eaa13a0291a250565b60005b818110156103e5576000838383818110610394576103946133e1565b90506020028101906103a69190613410565b6103af9061344e565b90506103d281600001518260200151836040015184606001518560800151610b99565b50806103dd8161350e565b915050610378565b505050565b600061042a6040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e00000000000000815250610532565b905060008173ffffffffffffffffffffffffffffffffffffffff1663b8f770056040518163ffffffff1660e01b815260040160206040518083038186803b15801561047457600080fd5b505afa158015610488573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ac919061355c565b905060006104c38633878564ffffffffff16611136565b90506104d683828663ffffffff166111b1565b8573ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a3387858860405161052294939291906135d3565b60405180910390a2505050505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac190610589908590600401613626565b60206040518083038186803b1580156105a157600080fd5b505afa1580156105b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d99190613639565b92915050565b60cd5460009073ffffffffffffffffffffffffffffffffffffffff1661dead14156106515760405162461bcd60e51b815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f74207365740060448201526064015b60405180910390fd5b5060cd5473ffffffffffffffffffffffffffffffffffffffff1690565b60006106ae6040518060400160405280601981526020017f43616e6f6e6963616c547