@functionx_io/contracts
Version:
Smart Contract library for Solidity
893 lines • 75.3 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "FxBridgeLogicBSC",
"sourceName": "contracts/bridge/FxBridgeLogicBSC.sol",
"abi": [
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "_tokenContract",
"type": "address"
},
{
"indexed": false,
"internalType": "string",
"name": "_name",
"type": "string"
},
{
"indexed": false,
"internalType": "string",
"name": "_symbol",
"type": "string"
},
{
"indexed": false,
"internalType": "uint8",
"name": "_decimals",
"type": "uint8"
},
{
"indexed": false,
"internalType": "uint256",
"name": "_eventNonce",
"type": "uint256"
},
{
"indexed": false,
"internalType": "bytes32",
"name": "_channelIBC",
"type": "bytes32"
}
],
"name": "AddBridgeTokenEvent",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint8",
"name": "version",
"type": "uint8"
}
],
"name": "Initialized",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "_newOracleSetNonce",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "_eventNonce",
"type": "uint256"
},
{
"indexed": false,
"internalType": "address[]",
"name": "_oracles",
"type": "address[]"
},
{
"indexed": false,
"internalType": "uint256[]",
"name": "_powers",
"type": "uint256[]"
}
],
"name": "OracleSetUpdatedEvent",
"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": "_tokenContract",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "_sender",
"type": "address"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "_destination",
"type": "bytes32"
},
{
"indexed": false,
"internalType": "bytes32",
"name": "_targetIBC",
"type": "bytes32"
},
{
"indexed": false,
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "_eventNonce",
"type": "uint256"
}
],
"name": "SendToFxEvent",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "_batchNonce",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "_token",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "_eventNonce",
"type": "uint256"
}
],
"name": "TransactionBatchExecutedEvent",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "_token",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "_newOwner",
"type": "address"
}
],
"name": "TransferOwnerEvent",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "Unpaused",
"type": "event"
},
{
"inputs": [
{
"internalType": "address",
"name": "_tokenAddr",
"type": "address"
}
],
"name": "activeBridgeToken",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_tokenAddr",
"type": "address"
},
{
"internalType": "bytes32",
"name": "_channelIBC",
"type": "bytes32"
},
{
"internalType": "bool",
"name": "_isOriginated",
"type": "bool"
}
],
"name": "addBridgeToken",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "bridgeTokens",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_tokenAddr",
"type": "address"
}
],
"name": "checkAssetStatus",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "_currentOracles",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "_currentPowers",
"type": "uint256[]"
},
{
"internalType": "uint8[]",
"name": "_v",
"type": "uint8[]"
},
{
"internalType": "bytes32[]",
"name": "_r",
"type": "bytes32[]"
},
{
"internalType": "bytes32[]",
"name": "_s",
"type": "bytes32[]"
},
{
"internalType": "bytes32",
"name": "_theHash",
"type": "bytes32"
},
{
"internalType": "uint256",
"name": "_powerThreshold",
"type": "uint256"
}
],
"name": "checkOracleSignatures",
"outputs": [],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "convert_decimals",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "getBridgeTokenList",
"outputs": [
{
"components": [
{
"internalType": "address",
"name": "addr",
"type": "address"
},
{
"internalType": "string",
"name": "name",
"type": "string"
},
{
"internalType": "string",
"name": "symbol",
"type": "string"
},
{
"internalType": "uint8",
"name": "decimals",
"type": "uint8"
}
],
"internalType": "struct FxBridgeLogicBSC.BridgeToken[]",
"name": "",
"type": "tuple[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "_fxBridgeId",
"type": "bytes32"
},
{
"internalType": "uint256",
"name": "_powerThreshold",
"type": "uint256"
},
{
"internalType": "address[]",
"name": "_oracles",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "_powers",
"type": "uint256[]"
}
],
"name": "init",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_erc20Address",
"type": "address"
}
],
"name": "lastBatchNonce",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "_oracles",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "_powers",
"type": "uint256[]"
},
{
"internalType": "uint256",
"name": "_oracleSetNonce",
"type": "uint256"
},
{
"internalType": "bytes32",
"name": "_fxBridgeId",
"type": "bytes32"
}
],
"name": "makeCheckpoint",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "pause",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_tokenAddr",
"type": "address"
}
],
"name": "pauseBridgeToken",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "paused",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_tokenContract",
"type": "address"
},
{
"internalType": "bytes32",
"name": "_destination",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "_targetIBC",
"type": "bytes32"
},
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
}
],
"name": "sendToFx",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "state_fxBridgeId",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "state_lastBatchNonces",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "state_lastEventNonce",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "state_lastOracleSetCheckpoint",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "state_lastOracleSetNonce",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "state_powerThreshold",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "_currentOracles",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "_currentPowers",
"type": "uint256[]"
},
{
"internalType": "uint8[]",
"name": "_v",
"type": "uint8[]"
},
{
"internalType": "bytes32[]",
"name": "_r",
"type": "bytes32[]"
},
{
"internalType": "bytes32[]",
"name": "_s",
"type": "bytes32[]"
},
{
"internalType": "uint256[]",
"name": "_amounts",
"type": "uint256[]"
},
{
"internalType": "address[]",
"name": "_destinations",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "_fees",
"type": "uint256[]"
},
{
"internalType": "uint256[2]",
"name": "_nonceArray",
"type": "uint256[2]"
},
{
"internalType": "address",
"name": "_tokenContract",
"type": "address"
},
{
"internalType": "uint256",
"name": "_batchTimeout",
"type": "uint256"
},
{
"internalType": "address",
"name": "_feeReceive",
"type": "address"
}
],
"name": "submitBatch",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "tokenStatus",
"outputs": [
{
"internalType": "bool",
"name": "isOriginated",
"type": "bool"
},
{
"internalType": "bool",
"name": "isActive",
"type": "bool"
},
{
"internalType": "bool",
"name": "isExist",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_token",
"type": "address"
},
{
"internalType": "address",
"name": "_newOwner",
"type": "address"
}
],
"name": "transferOwner",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "unpause",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "_newOracles",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "_newPowers",
"type": "uint256[]"
},
{
"internalType": "uint256",
"name": "_newOracleSetNonce",
"type": "uint256"
},
{
"internalType": "address[]",
"name": "_currentOracles",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "_currentPowers",
"type": "uint256[]"
},
{
"internalType": "uint256",
"name": "_currentOracleSetNonce",
"type": "uint256"
},
{
"internalType": "uint8[]",
"name": "_v",
"type": "uint8[]"
},
{
"internalType": "bytes32[]",
"name": "_r",
"type": "bytes32[]"
},
{
"internalType": "bytes32[]",
"name": "_s",
"type": "bytes32[]"
}
],
"name": "updateOracleSet",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_token",
"type": "address"
},
{
"internalType": "uint8",
"name": "_to",
"type": "uint8"
}
],
"name": "updateTokenDecimalsConvert",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "version",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
}
],
"bytecode": "0x608060405234801561001057600080fd5b5061367a806100206000396000f3fe6080604052600436106101cd5760003560e01c8063715018a6116100f7578063aa63a89411610095578063e5a2b5d211610064578063e5a2b5d2146105a2578063f1099f61146105b8578063f2fde38b146105d8578063f92367fd146105f857600080fd5b8063aa63a8941461051f578063bb83bf961461053f578063dde65aea14610555578063df97174b1461057557600080fd5b80637d9a8ea6116100d15780637d9a8ea61461048a5780638456cb59146104cc5780638da5cb5b146104e1578063a36a4ab0146104ff57600080fd5b8063715018a61461043f57806371cbf3811461045457806373b205471461047457600080fd5b80633f4ba83a1161016f5780635c975abb1161013e5780635c975abb146103c65780636189d107146103de57806370a0eb94146103f157806370e5a8981461040757600080fd5b80633f4ba83a14610331578063474d561c1461034657806354fd4d50146103845780635ab3716c146103a657600080fd5b8063285a190a116101ab578063285a190a1461029f57806331678cf6146102c1578063332caa1f146102f15780633a08e2991461031157600080fd5b8063011b2174146101d25780630acac9421461021b578063283040b41461027d575b600080fd5b3480156101de57600080fd5b506102086101ed3660046127e2565b6001600160a01b0316600090815260ce602052604090205490565b6040519081526020015b60405180910390f35b34801561022757600080fd5b5061025e6102363660046127e2565b60d06020526000908152604090205460ff808216916101008104821691620100009091041683565b6040805193151584529115156020840152151590820152606001610212565b34801561028957600080fd5b5061029261060e565b6040516102129190612855565b3480156102ab57600080fd5b506102bf6102ba366004612aa8565b610870565b005b3480156102cd57600080fd5b506102e16102dc366004612b8c565b6109d3565b6040519015158152602001610212565b3480156102fd57600080fd5b506102bf61030c366004612c2e565b610a86565b34801561031d57600080fd5b506102bf61032c366004612de1565b6110d7565b34801561033d57600080fd5b506102bf6112d4565b34801561035257600080fd5b506102e16103613660046127e2565b6001600160a01b0316600090815260d06020526040902054610100900460ff1690565b34801561039057600080fd5b506103996112ee565b6040516102129190612f0f565b3480156103b257600080fd5b506102e16103c1366004612f22565b61137c565b3480156103d257600080fd5b5060975460ff166102e1565b6102bf6103ec366004612f59565b6113b6565b3480156103fd57600080fd5b5061020860cc5481565b34801561041357600080fd5b50610427610422366004612f92565b611703565b6040516001600160a01b039091168152602001610212565b34801561044b57600080fd5b506102bf61172d565b34801561046057600080fd5b5061020861046f366004612fab565b61173f565b34801561048057600080fd5b5061020860cb5481565b34801561049657600080fd5b506104ba6104a53660046127e2565b60d16020526000908152604090205460ff1681565b60405160ff9091168152602001610212565b3480156104d857600080fd5b506102bf61178c565b3480156104ed57600080fd5b506065546001600160a01b0316610427565b34801561050b57600080fd5b506102e161051a3660046127e2565b6117a4565b34801561052b57600080fd5b506102bf61053a36600461301e565b6118be565b34801561054b57600080fd5b5061020860cd5481565b34801561056157600080fd5b506102e16105703660046127e2565b611b42565b34801561058157600080fd5b506102086105903660046127e2565b60ce6020526000908152604090205481565b3480156105ae57600080fd5b5061020860ca5481565b3480156105c457600080fd5b506102e16105d33660046130a2565b611c57565b3480156105e457600080fd5b506102bf6105f33660046127e2565b611f11565b34801561060457600080fd5b5061020860c95481565b60cf546060906000906001600160401b0381111561062e5761062e6128ff565b60405190808252806020026020018201604052801561069657816020015b610683604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600060ff1681525090565b81526020019060019003908161064c5790505b50905060005b60cf5481101561086a57600060cf82815481106106bb576106bb6130e2565b9060005260206000200160009054906101000a90046001600160a01b0316905060006040518060800160405280836001600160a01b03168152602001836001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015610735573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261075d91908101906130f8565b8152602001836001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156107a0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107c891908101906130f8565b8152602001836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561080b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082f919061318b565b60ff1681525090508084848151811061084a5761084a6130e2565b602002602001018190525050508080610862906131be565b91505061069c565b50919050565b6000805b88518110156109a95786818151811061088f5761088f6130e2565b602002602001015160ff16600014610997576109128982815181106108b6576108b66130e2565b6020026020010151858984815181106108d1576108d16130e2565b60200260200101518985815181106108eb576108eb6130e2565b6020026020010151898681518110610905576109056130e2565b6020026020010151611f8a565b6109635760405162461bcd60e51b815260206004820181905260248201527f4f7261636c65207369676e617475726520646f6573206e6f74206d617463682e60448201526064015b60405180910390fd5b878181518110610975576109756130e2565b60200260200101518261098891906131d9565b915082821115610997576109a9565b806109a1816131be565b915050610874565b508181116109c95760405162461bcd60e51b815260040161095a906131f1565b5050505050505050565b60006109dd612054565b60405163f2fde38b60e01b81526001600160a01b03838116600483015284169063f2fde38b90602401600060405180830381600087803b158015610a2057600080fd5b505af1158015610a34573d6000803e3d6000fd5b5050604080516001600160a01b038088168252861660208201527fb0f1bf050fff9d249d22389b0f2673295260c8deca341a2755d95318f9fbc699935001905060405180910390a15060015b92915050565b610a8e6120ae565b610a96612108565b6001600160a01b038316600090815260d060209081526040918290208251606081018452905460ff8082161515835261010082048116151593830193909352620100009004909116151591810182905290610b2f5760405162461bcd60e51b8152602060048201526019602482015278556e737570706f7274656420746f6b656e206164647265737360381b604482015260640161095a565b8060200151610b735760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881dd85cc81c185d5cd95960821b604482015260640161095a565b6020808601516001600160a01b038616600090815260ce90925260409091205410610c065760405162461bcd60e51b815260206004820152603760248201527f4e6577206261746368206e6f6e6365206d75737420626520677265617465722060448201527f7468616e207468652063757272656e74206e6f6e63652e000000000000000000606482015260840161095a565b824310610c7b5760405162461bcd60e51b815260206004820152603c60248201527f42617463682074696d656f7574206d757374206265206772656174657220746860448201527f616e207468652063757272656e7420626c6f636b206865696768742e00000000606482015260840161095a565b8b518d51148015610c8d57508a518d51145b8015610c9a575089518d51145b8015610ca7575088518d51145b610cf35760405162461bcd60e51b815260206004820152601d60248201527f4d616c666f726d65642063757272656e74206f7261636c65207365742e000000604482015260640161095a565b60cc54610d0b8e8e886000602002015160c95461173f565b14610d285760405162461bcd60e51b815260040161095a9061324e565b86518851148015610d3a575085518851145b610d865760405162461bcd60e51b815260206004820181905260248201527f4d616c666f726d6564206261746368206f66207472616e73616374696f6e732e604482015260640161095a565b610df98d8d8d8d8d60c9546f0e8e4c2dce6c2c6e8d2dedc84c2e8c6d60831b8f8f8f8f600160028110610dbb57610dbb6130e2565b60200201518f8f8f604051602001610ddb9998979695949392919061331f565b6040516020818303038152906040528051906020012060ca54610870565b6020808601516001600160a01b038616600090815260ce835260408082209290925560d190925281205460ff16908115610e9557856001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8f919061318b565b60ff1690505b6000805b8b51811015610fcf57610ece8a8281518110610eb757610eb76130e2565b60200260200101518361214e90919063ffffffff16565b8551909250151560011415610f6b57876001600160a01b03166340c10f19308e8481518110610eff57610eff6130e2565b60200260200101516040518363ffffffff1660e01b8152600401610f389291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015610f5257600080fd5b505af1158015610f66573d6000803e3d6000fd5b505050505b610fbd8b8281518110610f8057610f806130e2565b6020026020010151610fac8e8481518110610f9d57610f9d6130e2565b6020026020010151878761215a565b6001600160a01b038b169190612191565b80610fc7816131be565b915050610e99565b50835115156001141561103d576040516340c10f1960e01b8152306004820152602481018290526001600160a01b038816906340c10f1990604401600060405180830381600087803b15801561102457600080fd5b505af1158015611038573d6000803e3d6000fd5b505050505b61105d8561104c83868661215a565b6001600160a01b038a169190612191565b505060cb5461107092509050600161214e565b60cb556001600160a01b03831684600160200201517f02c7e81975f8edb86e2a0c038b7b86a49c744236abf0f6177ff5afc6986ab70860cb546040516110b891815260200190565b60405180910390a36110c960018055565b505050505050505050505050565b6110df612108565b8387116111545760405162461bcd60e51b815260206004820152603b60248201527f4e6577206f7261636c6520736574206e6f6e6365206d7573742062652067726560448201527f61746572207468616e207468652063757272656e74206e6f6e63650000000000606482015260840161095a565b87518951146111a55760405162461bcd60e51b815260206004820152601860248201527f4d616c666f726d6564206e6577206f7261636c65207365740000000000000000604482015260640161095a565b845186511480156111b7575082518651145b80156111c4575081518651145b80156111d1575080518651145b61121d5760405162461bcd60e51b815260206004820152601c60248201527f4d616c666f726d65642063757272656e74206f7261636c652073657400000000604482015260640161095a565b60cc5461122e87878760c95461173f565b1461124b5760405162461bcd60e51b815260040161095a9061324e565b600061125b8a8a8a60c95461173f565b905061126e87878686868660ca54610870565b60cc81905560cd88905560cb5461128690600161214e565b60cb81905560405189917f36c6022aad02313069de85ca9645431c7dd5e8e7a21685586461c4b25e2374b3916112c091908e908e9061339c565b60405180910390a250505050505050505050565b6112dc612054565b6112e46121ff565b6112ec612248565b565b60d280546112fb906133d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611327906133d1565b80156113745780601f1061134957610100808354040283529160200191611374565b820191906000526020600020905b81548152906001019060200180831161135757829003601f168201915b505050505081565b6000611386612054565b506001600160a01b038216600090815260d160205260409020805460ff831660ff19909116179055600192915050565b6113be6120ae565b6113c6612108565b600081116114215760405162461bcd60e51b815260206004820152602260248201527f616d6f756e742073686f756c642062652067726561746572207468616e207a65604482015261726f60f01b606482015260840161095a565b6001600160a01b038416600090815260d060209081526040918290208251606081018452905460ff80821615158352610100820481161515938301939093526201000090049091161515918101829052906114ba5760405162461bcd60e51b8152602060048201526019602482015278556e737570706f7274656420746f6b656e206164647265737360381b604482015260640161095a565b80602001516114fe5760405162461bcd60e51b815260206004820152601060248201526f1d1bdad95b881dd85cc81c185d5cd95960821b604482015260640161095a565b80518290151560011415611580576115216001600160a01b03871633308661229a565b604051630852cd8d60e31b8152600481018490526001600160a01b038716906342966c6890602401600060405180830381600087803b15801561156357600080fd5b505af1158015611577573d6000803e3d6000fd5b5050505061168e565b6001600160a01b038616600090815260d1602052604090205460ff168015611677576000876001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611606919061318b565b60ff16905061161685828461215a565b925061162383838361215a565b9450600085116116755760405162461bcd60e51b815260206004820152601860248201527f436f6e76657274656420616d6f756e74206973207a65726f0000000000000000604482015260640161095a565b505b61168c6001600160a01b03881633308761229a565b505b60cb5461169c90600161214e565b60cb819055604080518681526020810184905290810191909152859033906001600160a01b038916907f034c5b22dd525a50d0a6b15549df0a6ac83b833a6c3da57ea16890832c72507c9060600160405180910390a450506116fd60018055565b50505050565b60cf818154811061171357600080fd5b6000918252602090912001546001600160a01b0316905081565b611735612054565b6112ec60006122d2565b6040516000906918da1958dadc1bda5b9d60b21b9061176a908490839087908a908a90602001613406565b604051602081830303815290604052805190602001209150505b949350505050565b611794612054565b61179c612108565b6112ec612324565b60006117ae612054565b6001600160a01b038216600090815260d0602052604090205462010000900460ff1615156001146118215760405162461bcd60e51b815260206004820152601b60248201527f42726964676520746f6b656e20646f65736e2774206578697374730000000000604482015260640161095a565b6001600160a01b038216600090815260d0602052604090205460ff6101009091041615156001146118945760405162461bcd60e51b815260206004820152601b60248201527f42726964676520746f6b656e20616c7265616479207061757365640000000000604482015260640161095a565b506001600160a01b038116600090815260d060205260409020805461ff001916905560015b919050565b600054610100900460ff16158080156118de5750600054600160ff909116105b806118f85750303b1580156118f8575060005460ff166001145b61195b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161095a565b6000805460ff19166001179055801561197e576000805461ff0019166101001790555b611986612361565b61198e612390565b6119966123bf565b81518351146119e75760405162461bcd60e51b815260206004820152601c60248201527f4d616c666f726d65642063757272656e74206f7261636c652073657400000000604482015260640161095a565b6000805b8351811015611a3a57838181518110611a0657611a066130e2565b602002602001015182611a1991906131d9565b915085821115611a2857611a3a565b80611a32816131be565b9150506119eb565b50848111611a5a5760405162461bcd60e51b815260040161095a906131f1565b6000611a69858560008a61173f565b60c988905560ca87905560cc819055600060cd55600160cb55604080518082019091526005808252640312e302e360dc1b6020909201918252919250611ab29160d29190612732565b5060cd547f36c6022aad02313069de85ca9645431c7dd5e8e7a21685586461c4b25e2374b360cb548787604051611aeb9392919061339c565b60405180910390a250508015611b3b576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6000611b4c612054565b6001600160a01b038216600090815260d0602052604090205462010000900460ff161515600114611bbf5760405162461bcd60e51b815260206004820152601b60248201527f42726964676520746f6b656e20646f65736e2774206578697374730000000000604482015260640161095a565b6001600160a01b038216600090815260d06020526040902054610100900460ff1615611c2d5760405162461bcd60e51b815260206004820152601c60248201527f42726964676520746f6b656e20616c7265616479206163746976656400000000604482015260640161095a565b506001600160a01b0316600090815260d060205260409020805461ff001916610100179055600190565b6000611c61612054565b6001600160a01b038416611caf5760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b604482015260640161095a565b6001600160a01b038416600090815260d0602052604090205462010000900460ff1615611d1e5760405162461bcd60e51b815260206004820152601b60248201527f42726964676520746f6b656e20616c7265616479206578697374730000000000604482015260640161095a565b611d4a8460405180606001604052808515158152602001600115158152602001600115158152506123ee565b6000846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dae919061318b565b6001600160a01b038616600090815260d1602052604090205490915060ff1615611df057506001600160a01b038416600090815260d1602052604090205460ff165b846001600160a01b03167f2da8f37eaabc4d44ba4fcc438e404bbed3344322280d6c67497e9c668c87ec0f866001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015611e59573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611e8191908101906130f8565b876001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015611ebf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ee791908101906130f8565b60cb54604051611efc93929187918b90613449565b60405180910390a260019150505b9392505050565b611f19612054565b6001600160a01b038116611f7e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161095a565b611f87816122d2565b50565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018590526000908190605c0160408051601f1981840301815282825280516020918201206000845290830180835281905260ff8816918301919091526060820186905260808201859052915060019060a0016020604051602081039080840390855afa15801561202a573d6000803e3d6000fd5b505050602060405103516001600160a01b0316876001600160a01b03161491505095945050505050565b6065546001600160a01b031633146112ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161095a565b600260015414156121015760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161095a565b6002600155565b60975460ff16156112ec5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161095a565b6000611f0a82846131d9565b600081612168575082611f0a565b61178461217684600a613573565b61218b61218485600a613573565b879061249b565b906124a7565b6040516001600160a01b0383166024820152604481018290526121f490849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526124b3565b505050565b60018055565b60975460ff166112ec5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161095a565b6122506121ff565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6040516001600160a01b03808516602483015283166044820152606481018290526116fd9085906323b872dd60e01b906084016121bd565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61232c612108565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861227d3390565b600054610100900460ff166123885760405162461bcd60e51b815260040161095a9061357f565b6112ec612588565b600054610100900460ff166123b75760405162461bcd60e51b815260040161095a9061357f565b6112ec6125bb565b600054610100900460ff166123e65760405162461bcd60e51b815260040161095a9061357f565b6112ec6125eb565b60cf805460018181019092557facb8d954e2cfef495862221e91bd7523613cf8808827cb33edfe4904cc51bf290180546001600160a01b0385166001600160a01b03199091168117909155600090815260d060209081526040918290208451815492860151938601511515620100000262ff0000199415156101000261ff00199215159290921661ffff1990941693909317179290921617905560cb546124949161214e565b60cb555050565b6000611f0a82846135ca565b6000611f0a82846135e9565b6000612508826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166126129092919063ffffffff16565b9050805160001480612529575080806020019051810190612529919061360b565b6121f45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161095a565b600054610100900460ff166125af5760405162461bcd60e51b815260040161095a9061357f565b6097805460ff19169055565b600054610100900460ff166125e25760405162461bcd60e51b815260040161095a9061357f565b6112ec336122d2565b600054610100900460ff166121f95760405162461bcd60e51b815260040161095a9061357f565b6060611784848460008585600080866001600160a01b031685876040516126399190613628565b60006040518083038185875af1925050503d8060008114612676576040519150601f19603f3d011682016040523d82523d6000602084013e61267b565b606091505b509150915061268c87838387612697565b979650505050505050565b606083156127035782516126fc576001600160a01b0385163b6126fc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161095a565b5081611784565b61178483838151156127185781518083602001fd5b8060405162461bcd60e51b815260040161095a9190612f0f565b82805461273e906133d1565b90600052602060002090601f01602090048101928261276057600085556127a6565b82601f1061277957805160ff19168380011785556127a6565b828001600101855582156127a6579182015b828111156127a657825182559160200191906001019061278b565b506127b29291506127b6565b5090565b5b808211156127b257600081556001016127b7565b80356001600160a01b03811681146118b957600080fd5b6000602082840312156127f457600080fd5b611f0a826127cb565b60005b83811015612818578181015183820152602001612800565b838111156116fd5750506000910152565b600081518084526128418160208601602086016127fd565b601f01601f19169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156128f157888303603f19018552815180516001600160a01b03168452878101516080898601819052906128b582870182612829565b91505087820151858203898701526128cd8282612829565b60609384015160ff169690930195909552509487019492509086019060010161287c565b509098975050505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561293d5761293d6128ff565b604052919050565b60006001600160401b0382111561295e5761295e6128ff565b5060051b60200190565b600082601f83011261297957600080fd5b8135602061298e61298983612945565b612915565b82815260059290921b840181019181810190868411156129ad57600080fd5b8286015b848110156129cf576129c2816127cb565b83529183019183016129b1565b509695505050505050565b600082601f8301126129eb57600080fd5b813560206129fb61298983612945565b82815260059290921b84018101918181019086841115612a1a57600080fd5b8286015b848110156129cf5780358352918301918301612a1e565b60ff81168114611f8757600080fd5b600082601f830112612a5557600080fd5b81356020612a6561298983612945565b82815260059290921b84018101918181019086841115612a8457600080fd5b8286015b848110156129cf578035612a9b81612a35565b8352918301918301612a88565b600080600080600080600060e0888a031215612ac357600080fd5b87356001600160401b0380821115612ada57600080fd5b612ae68b838c01612968565b985060208a0135915080821115612afc57600080fd5b612b088b838c016129da565b975060408a0135915080821115612b1e57600080fd5b612b2a8b838c01612a44565b965060608a0135915080821115612b4057600080fd5b612b4c8b838c016129da565b955060808a0135915080821115612b6257600080fd5b50612b6f8a828b016129da565b93505060a0880135915060c0880135905092959891949750929550565b60008060408385031215612b9f57600080fd5b612ba8836127cb565b9150612bb6602084016127cb565b90509250929050565b600082601f830112612bd057600080fd5b604051604081018181106001600160401b0382111715612bf257612bf26128ff565b8060405250806040840185811115612c0957600080fd5b845b81811015612c23578035835260209283019201612c0b565b509195945050505050565b6000806000806000806000806000806000806101a08d8f031215612c5157600080fd5b6001600160401b038d351115612c6657600080fd5b612c738e8e358f01612968565b9b506001600160401b0360208e01351115612c8d57600080fd5b612c9d8e60208f01358f016129da565b9a506001600160401b0360408e01351115612cb757600080fd5b612cc78e60408f01358f01612a44565b99506001600160401b0360608e01351115612ce157600080fd5b612cf18e60608f01358f016129da565b98506001600160401b0360808e01351115612d0b57600080fd5b612d1b8e60808f01358f016129da565b97506001600160401b0360a08e01351115612d3557600080fd5b612d458e60a08f01358f016129da565b96506001600160401b0360c08e01351115612d5f57600080fd5b612d6f8e60c08f01358f01612968565b95506001600160401b0360e08e01351115612d8957600080fd5b612d998e60e08f01358f016129da565b9450612da98e6101008f01612bbf565b9350612db86101408e016127cb565b92506101608d01359150612dcf6101808e016127cb565b90509295989b509295989b509295989b565b60008060008060008060008060006101208a8c031215612e0057600080fd5b89356001600160401b0380821115612e1757600080fd5b612e238d838e01612968565b9a5060208c0135915080821115612e3957600080fd5b612e458d838e016129da565b995060408c0135985060608c0135915080821115612e6257600080fd5b612e6e8d838e01612968565b975060808c0135915080821115612e8457600080fd5b612e908d838e016129da565b965060a08c0135955060c08c0135915080821115612ead57600080fd5b612eb98d838e01612a44565b945060e08c0135915080821115612ecf57600080fd5b612edb8d838e016129da565b93506101008c0135915080821115612ef257600080fd5b50612eff8c828d016129da565b9150509295985092959850929598565b602081526000611f0a6020830184612829565b60008060408385031215612f3557600080fd5b612f3e836127cb565b91506020830135612f4e81612a35565b809150509250929050565b60008060008060808587031215612f6f57600080fd5b612f78856127cb565b966020860135965060408601359560600135945092505050565b600060208284031215612fa457600080fd5b5035919050565b60008060008060808587031215612fc157600080fd5b84356001600160401b0380821115612fd857600080fd5b612fe488838901612968565b95506020870135915080821115612ffa57600080fd5b50613007878288016129da565b949794965050505060408301359260600135919050565b6000806000806080858703121561303457600080fd5b843593506020850135925060408501356001600160401b038082111561305957600080fd5b61306588838901612968565b9350606087013591508082111561307b57600080fd5b50613088878288016129da565b91505092959194509250565b8015158114611f8757600080fd5b6000806000606084860312156130b757600080fd5b6130c0846127cb565b92506020840135915060408401356130d781613094565b809150509250925092565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561310a57600080fd5b81516001600160401b038082111561312157600080fd5b818401915084601f83011261313557600080fd5b815181811115613147576131476128ff565b61315a601f8201601f1916602001612915565b915080825285602082850101111561317157600080fd5b6131828160208401602086016127fd565b50949350505050565b60006020828403121561319d57600080fd5b8151611f0a81612a35565b634e487b7160e01b600052601160045260246000fd5b60006000198214156131d2576131d26131a8565b5060010190565b600082198211156131ec576131ec6131a8565b500190565b60208082526039908201527f5375626d6974746564206f7261636c6520736574207369676e6174757265732060408201527f646f206e6f74206861766520656e6f75676820706f7765722e00000000000000606082015260800190565b6020808252603c908201527f537570706c6965642063757272656e74206f7261636c657320616e6420706f7760408201527f65727320646f206e6f74206d6174636820636865636b706f696e742e00000000606082015260800190565b600081518084526020808501945080840160005b838110156132db578151875295820195908201906001016132bf565b509495945050505050565b600081518084526020808501945080840160005b838110156132db5781516001600160a01b0316875295820195908201906001016132fa565b60006101208b83528a602084015280604084015261333f8184018b6132ab565b90508281036060840152613353818a6132e6565b9050828103608084015261336781896132ab565b60a084019790975250506001600160a01b0393841660c082015260e08101929092529091166101009091015295945050505050565b8381526060602082015260006133b560608301856132e6565b82810360408401526133c781856132ab565b9695505050505050565b600181811c908216806133e557607f821691505b6020821081141561086a57634e487b7160e01b600052602260045260246000fd5b85815284602082015283604082015260a06060820152600061342b60a08301856132e6565b828103608084015261343d81856132ab565b98975050505050505050565b60a08152600061345c60a0830188612829565b828103602084015261346e8188612829565b60ff9690961660408401525050606081019290925260809091015292915050565b600181815b808511156134ca5781600019048211156134b0576134b06131a8565b808516156134bd57918102915b93841c9390800290613494565b509250929050565b6000826134e157506001610a80565b816134ee57506000610a80565b8160018114613504576002811461350e5761352a565b6001915050610a80565b60ff84111561351f5761351f6131a8565b50506001821b610a80565b5060208310610133831016604e8410600b841016171561354d575081810a610a80565b613557838361348f565b806000190482111561356b5761356b6131a8565b029392505050565b6000611f0a83836134d2565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60008160001904831182151516156135e4576135e46131a8565b500290565b60008261360657634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561361d57600080fd5b8151611f0a81613094565b6000825161363a8184602087016127fd565b919091019291505056fea26469706673582212204834a4eb18b9e7f92d099357e3818ce5c59f5a4633fe0d2e59dde162500181f364736f6c634300080a0033",
"deployedBytecode": "0x6080604052600436106101cd5760003560e01c8063715018a6116100f7578063aa63a89411610095578063e5a2b5d211610064578063e5a2b5d2146105a2578063f1099f61146105b8578063f2fde38b146105d8578063f92367fd146105f857600080fd5b8063aa63a8941461051f578063bb83bf961461053f578063dde65aea14610555578063df97174b1461057557600080fd5b80637d9a8ea6116100d15780637d9a8ea61461048a5780638456cb59146104cc5780638da5cb5b146104e1578063a36a4ab0146104ff57600080fd5b8063715018a61461043f57806371cbf3811461045457806373b205471461047457600080fd5b80633f4ba83a1161016f5780635c975abb1161013e5780635c975abb146103c65780636189d107146103de57806370a0eb94146103f157806370e5a8981461040757600080fd5b80633f4ba83a14610331578063474d561c1461034657806354fd4d50146103845780635ab3716c146103a657600080fd5b8063285a190a116101ab578063285a190a1461029f57806331678cf6146102c1578063332caa1f146102f15780633a08e2991461031157600080fd5b8063011b2174146101d25780630acac9421461021b578063283040b41461027d575b600080fd5b3480156101de57600080fd5b506102086101ed3660046127e2565b6001600160a01b0316600090815260ce602052604090205490565b6040519081526020015b60405180910390f35b34801561022757600080fd5b5061025e6102363660046127e2565b60d06020526000908152604090205460ff808216916101008104821691620100009091041683565b6040805193151584529115156020840152151590820152606001610212565b34801561028957600080fd5b5061029261060e565b6040516102129190612855565b3480156102ab57600080fd5b506102bf6102ba366004612aa8565b610870565b005b3480156102cd57600080fd5b506102e16102dc366004612b8c565b6109d3565b6040519015158152602001610212565b3480156102fd57600080fd5b506102bf61030c366004612c2e565b610a86565b34801561031d57600080fd5b506102bf61032c366004612de1565b6110d7565b34801561033d57600080fd5b506102bf6112d4565b34801561035257600080fd5b506102e16103613660046127e2565b6001600160a01b0316600090815260d06020526040902054610100900460ff1690565b34801561039057600080fd5b506103996112ee565b6040516102129190612f0f565b3480156103b257600080fd5b506102e16103c1366004612f22565b61137c565b3480156103d257600080fd5b5060975460ff166102e1565b6102bf6103ec366004612f59565b6113b6565b3480156103fd57600080fd5b5061020860cc5481565b34801561041357600080fd5b50610427610422366004612f92565b611703565b6040516001600160a01b039091168152602001610212565b34801561044b57600080fd5b506102bf61172d565b34801561046057600080fd5b5061020861046f366004612fab565b61173f565b34801561048057600080fd5b5061020860cb5481565b34801561049657600080fd5b506104ba6104a53660046127e2565b60d16020526000908152604090205460ff1681565b60405160ff9091168152602001610212565b3480156104d857600080fd5b506102bf61178c565b3480156104ed57600080fd5b506065546001600160a01b0316610427565b34801561050b57600080fd5b506102e161051a3660046127e2565b6117a4565b34801561052b57600080fd5b506102bf61053a36600461301e565b6