UNPKG

@functionx_io/contracts

Version:
1,437 lines 111 kB
{ "_format": "hh-sol-artifact-1", "contractName": "FxBridgeMigrateLogic", "sourceName": "contracts/migrate/FxBridgeMigrateLogic.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": "_memo", "type": "bytes32" } ], "name": "AddBridgeTokenEvent", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "_sender", "type": "address" }, { "indexed": true, "internalType": "address", "name": "_refund", "type": "address" }, { "indexed": true, "internalType": "address", "name": "_to", "type": "address" }, { "indexed": false, "internalType": "address", "name": "_txOrigin", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "_eventNonce", "type": "uint256" }, { "indexed": false, "internalType": "string", "name": "_dstChain", "type": "string" }, { "indexed": false, "internalType": "address[]", "name": "_tokens", "type": "address[]" }, { "indexed": false, "internalType": "uint256[]", "name": "_amounts", "type": "uint256[]" }, { "indexed": false, "internalType": "bytes", "name": "_data", "type": "bytes" }, { "indexed": false, "internalType": "uint256", "name": "_quoteId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "_gasLimit", "type": "uint256" }, { "indexed": false, "internalType": "bytes", "name": "_memo", "type": "bytes" } ], "name": "BridgeCallEvent", "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": "address", "name": "_txOrigin", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "_nonce", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "_eventNonce", "type": "uint256" }, { "indexed": false, "internalType": "bool", "name": "_success", "type": "bool" }, { "indexed": false, "internalType": "bytes", "name": "_cause", "type": "bytes" } ], "name": "SubmitBridgeCallEvent", "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": [ { "components": [ { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "address", "name": "refund", "type": "address" }, { "internalType": "address[]", "name": "tokens", "type": "address[]" }, { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "bytes", "name": "data", "type": "bytes" }, { "internalType": "bytes", "name": "memo", "type": "bytes" }, { "internalType": "uint256", "name": "timeout", "type": "uint256" }, { "internalType": "uint256", "name": "gasLimit", "type": "uint256" }, { "internalType": "uint256", "name": "eventNonce", "type": "uint256" } ], "internalType": "struct FxBridgeBase.BridgeCallData", "name": "_input", "type": "tuple" } ], "name": "_onBridgeCall", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "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": "_memo", "type": "bytes32" }, { "internalType": "bool", "name": "_isOriginated", "type": "bool" } ], "name": "addBridgeToken", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "_dstChain", "type": "string" }, { "internalType": "address", "name": "_refund", "type": "address" }, { "internalType": "address[]", "name": "_tokens", "type": "address[]" }, { "internalType": "uint256[]", "name": "_amounts", "type": "uint256[]" }, { "internalType": "address", "name": "_to", "type": "address" }, { "internalType": "bytes", "name": "_data", "type": "bytes" }, { "internalType": "uint256", "name": "_quoteId", "type": "uint256" }, { "internalType": "uint256", "name": "_gasLimit", "type": "uint256" }, { "internalType": "bytes", "name": "_memo", "type": "bytes" } ], "name": "bridgeCall", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "_fxBridgeId", "type": "bytes32" }, { "internalType": "bytes32", "name": "_methodName", "type": "bytes32" }, { "internalType": "uint256", "name": "_nonce", "type": "uint256" }, { "components": [ { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "address", "name": "refund", "type": "address" }, { "internalType": "address[]", "name": "tokens", "type": "address[]" }, { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "bytes", "name": "data", "type": "bytes" }, { "internalType": "bytes", "name": "memo", "type": "bytes" }, { "internalType": "uint256", "name": "timeout", "type": "uint256" }, { "internalType": "uint256", "name": "gasLimit", "type": "uint256" }, { "internalType": "uint256", "name": "eventNonce", "type": "uint256" } ], "internalType": "struct FxBridgeBase.BridgeCallData", "name": "_input", "type": "tuple" } ], "name": "bridgeCallCheckpoint", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "pure", "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": "", "type": "address" } ], "name": "convert_decimals", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "pure", "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 FxBridgeBase.BridgeToken[]", "name": "", "type": "tuple[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_tokenAddr", "type": "address" } ], "name": "getTokenStatus", "outputs": [ { "components": [ { "internalType": "bool", "name": "isOriginated", "type": "bool" }, { "internalType": "bool", "name": "isActive", "type": "bool" }, { "internalType": "bool", "name": "isExist", "type": "bool" } ], "internalType": "struct FxBridgeBase.TokenStatus", "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": "bytes32", "name": "_fxBridgeId", "type": "bytes32" }, { "internalType": "uint256", "name": "_powerThreshold", "type": "uint256" }, { "internalType": "uint256", "name": "_lastEventNonce", "type": "uint256" }, { "internalType": "bytes32", "name": "_lastOracleSetCheckpoint", "type": "bytes32" }, { "internalType": "uint256", "name": "_lastOracleSetNonce", "type": "uint256" }, { "internalType": "address[]", "name": "_bridgeTokens", "type": "address[]" }, { "internalType": "uint256[]", "name": "_lastBatchNonces", "type": "uint256[]" }, { "components": [ { "internalType": "bool", "name": "isOriginated", "type": "bool" }, { "internalType": "bool", "name": "isActive", "type": "bool" }, { "internalType": "bool", "name": "isExist", "type": "bool" } ], "internalType": "struct FxBridgeBase.TokenStatus[]", "name": "_tokenStatuses", "type": "tuple[]" } ], "name": "migrateInit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "_fxBridgeId", "type": "bytes32" }, { "internalType": "bytes32", "name": "_methodName", "type": "bytes32" }, { "internalType": "uint256", "name": "_oracleSetNonce", "type": "uint256" }, { "internalType": "address[]", "name": "_oracles", "type": "address[]" }, { "internalType": "uint256[]", "name": "_powers", "type": "uint256[]" } ], "name": "oracleSetCheckpoint", "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": "nonpayable", "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": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "state_lastBridgeCallNonces", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "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": "bytes32", "name": "_fxBridgeId", "type": "bytes32" }, { "internalType": "bytes32", "name": "_methodName", "type": "bytes32" }, { "internalType": "uint256[]", "name": "_amounts", "type": "uint256[]" }, { "internalType": "address[]", "name": "_destinations", "type": "address[]" }, { "internalType": "uint256[]", "name": "_fees", "type": "uint256[]" }, { "internalType": "uint256", "name": "_batchNonce", "type": "uint256" }, { "internalType": "address", "name": "_tokenContract", "type": "address" }, { "internalType": "uint256", "name": "_batchTimeout", "type": "uint256" }, { "internalType": "address", "name": "_feeReceive", "type": "address" } ], "name": "submitBatchCheckpoint", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "address[]", "name": "oracles", "type": "address[]" }, { "internalType": "uint256[]", "name": "powers", "type": "uint256[]" }, { "internalType": "bytes32[]", "name": "r", "type": "bytes32[]" }, { "internalType": "bytes32[]", "name": "s", "type": "bytes32[]" }, { "internalType": "uint8[]", "name": "v", "type": "uint8[]" } ], "internalType": "struct FxBridgeBase.OracleSignatures", "name": "_curOracleSigns", "type": "tuple" }, { "internalType": "uint256[2]", "name": "_nonceArray", "type": "uint256[2]" }, { "components": [ { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "address", "name": "refund", "type": "address" }, { "internalType": "address[]", "name": "tokens", "type": "address[]" }, { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "bytes", "name": "data", "type": "bytes" }, { "internalType": "bytes", "name": "memo", "type": "bytes" }, { "internalType": "uint256", "name": "timeout", "type": "uint256" }, { "internalType": "uint256", "name": "gasLimit", "type": "uint256" }, { "internalType": "uint256", "name": "eventNonce", "type": "uint256" } ], "internalType": "struct FxBridgeBase.BridgeCallData", "name": "_input", "type": "tuple" } ], "name": "submitBridgeCall", "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": [], "name": "version", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" } ], "bytecode": "0x608060405234801561001057600080fd5b50614cc1806100206000396000f3fe60806040526004361061020f5760003560e01c80637d9a8ea611610118578063dde65aea116100a0578063e6d69ede1161006f578063e6d69ede146106ff578063ed51dacf14610712578063f1099f6114610742578063f2fde38b14610762578063f92367fd1461078257600080fd5b8063dde65aea1461067c578063df97174b1461069c578063e55bedc1146106c9578063e5a2b5d2146106e957600080fd5b8063a36a4ab0116100e7578063a36a4ab01461055e578063a3ff31b51461057e578063a955665f14610626578063aa63a89414610646578063bb83bf961461066657600080fd5b80637d9a8ea6146104d95780638456cb591461050b5780638da5cb5b146105205780639a5aa0441461053e57600080fd5b8063474d561c1161019b5780636189d1071161016a5780636189d1071461044057806370a0eb941461046057806370e5a89814610476578063715018a6146104ae57806373b20547146104c357600080fd5b8063474d561c146103a857806354fd4d50146103e6578063561aa97d146104085780635c975abb1461042857600080fd5b806331678cf6116101e257806331678cf614610301578063332caa1f146103315780633a08e299146103535780633d1e51f9146103735780633f4ba83a1461039357600080fd5b8063011b2174146102145780630acac9421461025d5780631cb8b55b146102bf578063283040b4146102df575b600080fd5b34801561022057600080fd5b5061024a61022f366004613589565b6001600160a01b0316600090815260ce602052604090205490565b6040519081526020015b60405180910390f35b34801561026957600080fd5b506102a0610278366004613589565b60d06020526000908152604090205460ff808216916101008104821691620100009091041683565b6040805193151584529115156020840152151590820152606001610254565b3480156102cb57600080fd5b5061024a6102da3660046135b7565b610798565b3480156102eb57600080fd5b506102f46107d2565b6040516102549190613668565b34801561030d57600080fd5b5061032161031c366004613712565b610a46565b6040519015158152602001610254565b34801561033d57600080fd5b5061035161034c3660046139c2565b610af8565b005b34801561035f57600080fd5b5061035161036e366004613b75565b61100c565b34801561037f57600080fd5b5061024a61038e366004613ca3565b61118f565b34801561039f57600080fd5b506103516111d8565b3480156103b457600080fd5b506103216103c3366004613589565b6001600160a01b0316600090815260d06020526040902054610100900460ff1690565b3480156103f257600080fd5b506103fb6111f2565b6040516102549190613d73565b34801561041457600080fd5b50610351610423366004613d86565b611280565b34801561043457600080fd5b5060975460ff16610321565b34801561044c57600080fd5b5061035161045b366004613dba565b6114ca565b34801561046c57600080fd5b5061024a60cc5481565b34801561048257600080fd5b50610496610491366004613df3565b611708565b6040516001600160a01b039091168152602001610254565b3480156104ba57600080fd5b50610351611732565b3480156104cf57600080fd5b5061024a60cb5481565b3480156104e557600080fd5b506104f96104f4366004613589565b611744565b60405160ff9091168152602001610254565b34801561051757600080fd5b50610351611781565b34801561052c57600080fd5b506065546001600160a01b0316610496565b34801561054a57600080fd5b50610351610559366004613e0c565b611799565b34801561056a57600080fd5b50610321610579366004613589565b6118fe565b34801561058a57600080fd5b506105fe610599366004613589565b6040805160608082018352600080835260208084018290529284018190526001600160a01b0394909416845260d0825292829020825193840183525460ff80821615158552610100820481161515928501929092526201000090041615159082015290565b6040805182511515815260208084015115159082015291810151151590820152606001610254565b34801561063257600080fd5b5061024a610641366004613e8e565b611a18565b34801561065257600080fd5b50610351610661366004613f0e565b611a54565b34801561067257600080fd5b5061024a60cd5481565b34801561068857600080fd5b50610321610697366004613589565b611c86565b3480156106a857600080fd5b5061024a6106b7366004613589565b60ce6020526000908152604090205481565b3480156106d557600080fd5b506103516106e4366004614034565b611d9b565b3480156106f557600080fd5b5061024a60ca5481565b61024a61070d36600461416f565b612094565b34801561071e57600080fd5b5061032161072d366004613df3565b60d26020526000908152604090205460ff1681565b34801561074e57600080fd5b5061032161075d366004614265565b6121d1565b34801561076e57600080fd5b5061035161077d366004613589565b6124da565b34801561078e57600080fd5b5061024a60c95481565b6000848484846040516020016107b194939291906144eb565b6040516020818303038152906040528051906020012090505b949350505050565b60cf546060906000906001600160401b038111156107f2576107f2613745565b60405190808252806020026020018201604052801561085a57816020015b610847604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600060ff1681525090565b8152602001906001900390816108105790505b50905060005b60cf54811015610a4057600060cf828154811061087f5761087f61451a565b9060005260206000200160009054906101000a90046001600160a01b031690506000816001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa1580156108df573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109079190810190614530565b90506000826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610949573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109719190810190614530565b90506000836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d791906145a7565b905060006040518060800160405280866001600160a01b031681526020018581526020018481526020018360ff16815250905080878781518110610a1d57610a1d61451a565b602002602001018190525050505050508080610a38906145da565b915050610860565b50919050565b6000610a50612550565b60405163f2fde38b60e01b81526001600160a01b03838116600483015284169063f2fde38b90602401600060405180830381600087803b158015610a9357600080fd5b505af1158015610aa7573d6000803e3d6000fd5b5050604080516001600160a01b038088168252861660208201527fb0f1bf050fff9d249d22389b0f2673295260c8deca341a2755d95318f9fbc699935001905060405180910390a150600192915050565b610b006125aa565b610b08612604565b6001600160a01b038316600090815260d060209081526040918290208251606081018452905460ff8082161515835261010082048116151593830193909352620100009004909116151591810182905290610ba65760405162461bcd60e51b8152602060048201526019602482015278556e737570706f7274656420746f6b656e206164647265737360381b60448201526064015b60405180910390fd5b8060200151610bea5760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881dd85cc81c185d5cd95960821b6044820152606401610b9d565b6020808601516001600160a01b038616600090815260ce90925260409091205410610c7d5760405162461bcd60e51b815260206004820152603760248201527f4e6577206261746368206e6f6e6365206d75737420626520677265617465722060448201527f7468616e207468652063757272656e74206e6f6e63652e0000000000000000006064820152608401610b9d565b824310610cf25760405162461bcd60e51b815260206004820152603c60248201527f42617463682074696d656f7574206d757374206265206772656174657220746860448201527f616e207468652063757272656e7420626c6f636b206865696768742e000000006064820152608401610b9d565b86518851148015610d04575085518851145b610d505760405162461bcd60e51b815260206004820181905260248201527f4d616c666f726d6564206261746368206f66207472616e73616374696f6e732e6044820152606401610b9d565b6040805160a0810182528e8152602081018e90529081018b9052606081018a9052608081018c90528551610d84908261264a565b60c954610dbd908290610db8906f0e8e4c2dce6c2c6e8d2dedc84c2e8c6d60831b8d8d8d8d600160200201518d8d8d61118f565b612780565b6020808701516001600160a01b038716600090815260ce9092526040822055805b8a51811015610f1257610e13898281518110610dfc57610dfc61451a565b6020026020010151836128f190919063ffffffff16565b8451909250151560011415610eb057866001600160a01b03166340c10f19308d8481518110610e4457610e4461451a565b60200260200101516040518363ffffffff1660e01b8152600401610e7d9291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015610e9757600080fd5b505af1158015610eab573d6000803e3d6000fd5b505050505b610f008a8281518110610ec557610ec561451a565b60200260200101518c8381518110610edf57610edf61451a565b6020026020010151896001600160a01b03166129049092919063ffffffff16565b80610f0a816145da565b915050610dde565b508251151560011415610f80576040516340c10f1960e01b8152306004820152602481018290526001600160a01b038716906340c10f1990604401600060405180830381600087803b158015610f6757600080fd5b505af1158015610f7b573d6000803e3d6000fd5b505050505b610f946001600160a01b0387168583612904565b505060cb54610fa5915060016128f1565b60cb556001600160a01b03831684600160200201517f02c7e81975f8edb86e2a0c038b7b86a49c744236abf0f6177ff5afc6986ab70860cb54604051610fed91815260200190565b60405180910390a3610ffe60018055565b505050505050505050505050565b611014612604565b8387116110895760405162461bcd60e51b815260206004820152603c60248201527f4e6577206f7261636c6520736574206e6f6e6365206d7573742062652067726560448201527f61746572207468616e207468652063757272656e74206e6f6e63652e000000006064820152608401610b9d565b87518951146110da5760405162461bcd60e51b815260206004820152601960248201527f4d616c666f726d6564206e6577206f7261636c65207365742e000000000000006044820152606401610b9d565b60006040518060a0016040528088815260200187815260200184815260200183815260200185815250905061110f858261264a565b600061111c898c8c61296d565b90506111288282612780565b60cc81905560cd89905560cb546111409060016128f1565b60cb8190556040518a917f36c6022aad02313069de85ca9645431c7dd5e8e7a21685586461c4b25e2374b39161117a91908f908f9061465e565b60405180910390a25050505050505050505050565b60008989898989898989896040516020016111b299989796959493929190614689565b6040516020818303038152906040528051906020012090505b9998505050505050505050565b6111e0612550565b6111e861298e565b6111f06129d7565b565b60d180546111ff90614706565b80601f016020809104026020016040519081016040528092919081815260200182805461122b90614706565b80156112785780601f1061124d57610100808354040283529160200191611278565b820191906000526020600020905b81548152906001019060200180831161125b57829003601f168201915b505050505081565b3033146112cf5760405162461bcd60e51b815260206004820181905260248201527f53656c6661626c653a2063616c6c6572206973206e6f74207468652073656c666044820152606401610b9d565b60006112de604083018361473b565b9050111561137d5761137d306112fa60a0840160808501613589565b611307604085018561473b565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061134692505050606086018661473b565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612a2992505050565b61139f61139060a0830160808401613589565b6001600160a01b03163b151590565b156114c75761012081013515611433576113bf60a0820160808301613589565b6001600160a01b03166332e1e16e6101208301356113e060a0850185614784565b6040518463ffffffff1660e01b81526004016113fe939291906147ca565b600060405180830381600087803b15801561141857600080fd5b505af115801561142c573d6000803e3d6000fd5b5050505050565b61144360a0820160808301613589565b6001600160a01b03166357ffc09261145e6020840184613589565b61146e6040850160208601613589565b61147b604086018661473b565b611488606088018861473b565b61149560a08a018a614784565b6114a260c08c018c614784565b6040518b63ffffffff1660e01b81526004016113fe9a999897969594939291906147ed565b50565b6114d26125aa565b6114da612604565b600081116115365760405162461bcd60e51b815260206004820152602360248201527f416d6f756e742073686f756c642062652067726561746572207468616e207a6560448201526239379760e91b6064820152608401610b9d565b6001600160a01b038416600090815260d060209081526040918290208251606081018452905460ff80821615158352610100820481161515938301939093526201000090049091161515918101829052906115d35760405162461bcd60e51b815260206004820152601a60248201527f556e737570706f7274656420746f6b656e20616464726573732e0000000000006044820152606401610b9d565b80602001516116185760405162461bcd60e51b81526020600482015260116024820152702a37b5b2b7103bb0b9903830bab9b2b21760791b6044820152606401610b9d565b61162d6001600160a01b038616333085612eb4565b805115156001141561169457604051630852cd8d60e31b8152600481018390526001600160a01b038616906342966c6890602401600060405180830381600087803b15801561167b57600080fd5b505af115801561168f573d6000803e3d6000fd5b505050505b60cb546116a29060016128f1565b60cb819055604080518581526020810185905290810191909152849033906001600160a01b038816907f034c5b22dd525a50d0a6b15549df0a6ac83b833a6c3da57ea16890832c72507c9060600160405180910390a45061170260018055565b50505050565b60cf818154811061171857600080fd5b6000918252602090912001546001600160a01b0316905081565b61173a612550565b6111f06000612eec565b60405162461bcd60e51b815260206004820152600f60248201526e139bdd081a5b5c1b195b595b9d1959608a1b6044820152600090606401610b9d565b611789612550565b611791612604565b6111f0612f3e565b6117a16125aa565b6117a9612604565b6117b4838383612f7b565b602082810135600090815260d282526040808220805460ff1916600117905580518281529283019081905263561aa97d60e01b9052903063561aa97d6117fd8560248501614868565b600060405180830381600087803b15801561181757600080fd5b505af1925050508015611828575060015b6118945761183461487b565b806308c379a0141561185b5750611849614897565b80611854575061185d565b9050611899565b505b3d808015611887576040519150601f19603f3d011682016040523d82523d6000602084013e61188c565b606091505b509050611899565b600191505b60cb546118a79060016128f1565b60cb81905560405132917fa274e2655558a3663f90b9ff4d5409974a0e79ba5f0fb41ec4d582d58ba70580916118e69160208901359187908790614920565b60405180910390a250506118f960018055565b505050565b6000611908612550565b6001600160a01b038216600090815260d0602052604090205462010000900460ff16151560011461197b5760405162461bcd60e51b815260206004820152601b60248201527f42726964676520746f6b656e20646f65736e27742065786973747300000000006044820152606401610b9d565b6001600160a01b038216600090815260d0602052604090205460ff6101009091041615156001146119ee5760405162461bcd60e51b815260206004820152601b60248201527f42726964676520746f6b656e20616c72656164792070617573656400000000006044820152606401610b9d565b506001600160a01b038116600090815260d060205260409020805461ff001916905560015b919050565b60008585858585604051602001611a33959493929190614947565b60405160208183030381529060405280519060200120905095945050505050565b600054610100900460ff1615808015611a745750600054600160ff909116105b80611a8e5750303b158015611a8e575060005460ff166001145b611aaa5760405162461bcd60e51b8152600401610b9d9061498a565b6000805460ff191660011790558015611acd576000805461ff0019166101001790555b611ad561310d565b611add61313c565b611ae561316b565b8151835114611b365760405162461bcd60e51b815260206004820152601d60248201527f4d616c666f726d65642063757272656e74206f7261636c65207365742e0000006044820152606401610b9d565b6000805b8351811015611b8957838181518110611b5557611b5561451a565b602002602001015182611b6891906149d8565b915085821115611b7757611b89565b80611b81816145da565b915050611b3a565b50848111611ba95760405162461bcd60e51b8152600401610b9d906149f0565b60c9869055611bba6000858561296d565b60cc5560ca859055600060cd55600160cb55604080518082019091526005808252640312e302e360dc1b6020909201918252611bf89160d1916134d9565b5060cd547f36c6022aad02313069de85ca9645431c7dd5e8e7a21685586461c4b25e2374b360cb548686604051611c319392919061465e565b60405180910390a250801561142c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6000611c90612550565b6001600160a01b038216600090815260d0602052604090205462010000900460ff161515600114611d035760405162461bcd60e51b815260206004820152601c60248201527f42726964676520746f6b656e20646f65736e2774206578697374732e000000006044820152606401610b9d565b6001600160a01b038216600090815260d06020526040902054610100900460ff1615611d715760405162461bcd60e51b815260206004820152601f60248201527f42726964676520746f6b656e20616c7265616479206163746976617465642e006044820152606401610b9d565b506001600160a01b0316600090815260d060205260409020805461ff001916610100179055600190565b600054610100900460ff1615808015611dbb5750600054600160ff909116105b80611dd55750303b158015611dd5575060005460ff166001145b611df15760405162461bcd60e51b8152600401610b9d9061498a565b6000805460ff191660011790558015611e14576000805461ff0019166101001790555b611e1c61310d565b611e2461313c565b611e2c61316b565b83518351148015611e3e575081518451145b611e9a5760405162461bcd60e51b815260206004820152602760248201527f4d616c666f726d6564206c61737420626174636820746f6b656e20696e666f7260448201526636b0ba34b7b71760c91b6064820152608401610b9d565b60c989905560ca88905560cb87905560cc86905560cd85905560005b84518110156120155760cf858281518110611ed357611ed361451a565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790558351849082908110611f2257611f2261451a565b602002602001015160ce6000878481518110611f4057611f4061451a565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550828181518110611f7e57611f7e61451a565b602002602001015160d06000878481518110611f9c57611f9c61451a565b6020908102919091018101516001600160a01b03168252818101929092526040908101600020835181549385015194909201511515620100000262ff0000199415156101000261ff00199315159390931661ffff199094169390931791909117929092161790558061200d816145da565b915050611eb6565b50604080518082019091526005808252640312e302e360dc1b60209092019182526120429160d1916134d9565b508015612089576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b600061209e6125aa565b6120a6612604565b8951156120e95760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b2103239ba21b430b4b71760791b6044820152606401610b9d565b875115612146576001600160a01b0389166121465760405162461bcd60e51b815260206004820152601860248201527f526566756e64206164647265737320697320656d7074792e00000000000000006044820152606401610b9d565b61215233308a8a612a29565b60cb546121609060016128f1565b60cb556001600160a01b03868116908a16336001600160a01b03167fcaa0e5b7ba998f542b3804184a5d30836451c57f6d1f031c466272e188f4a70f3260cb548f8e8e8d8d8d8d6040516121bc99989796959493929190614a4d565b60405180910390a45060cb546111cb60018055565b60006121db612550565b6001600160a01b0384