UNPKG

@functionx_io/contracts

Version:
1,450 lines 112 kB
{ "_format": "hh-sol-artifact-1", "contractName": "FxBridgeMigrateLogicETH", "sourceName": "contracts/migrate/FxBridgeMigrateLogicETH.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": [], "name": "state_fxOriginatedToken", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "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": "0x608060405234801561001057600080fd5b50614cec806100206000396000f3fe60806040526004361061021a5760003560e01c80637d9a8ea611610123578063dde65aea116100ab578063ed51dacf1161006f578063ed51dacf1461071d578063f1099f611461074d578063f2fde38b1461076d578063f92367fd1461078d578063fd9791bb146107a357600080fd5b8063dde65aea14610687578063df97174b146106a7578063e55bedc1146106d4578063e5a2b5d2146106f4578063e6d69ede1461070a57600080fd5b8063a36a4ab0116100f2578063a36a4ab014610569578063a3ff31b514610589578063a955665f14610631578063aa63a89414610651578063bb83bf961461067157600080fd5b80637d9a8ea6146104e45780638456cb59146105165780638da5cb5b1461052b5780639a5aa0441461054957600080fd5b8063474d561c116101a65780636189d107116101755780636189d1071461044b57806370a0eb941461046b57806370e5a89814610481578063715018a6146104b957806373b20547146104ce57600080fd5b8063474d561c146103b357806354fd4d50146103f1578063561aa97d146104135780635c975abb1461043357600080fd5b806331678cf6116101ed57806331678cf61461030c578063332caa1f1461033c5780633a08e2991461035e5780633d1e51f91461037e5780633f4ba83a1461039e57600080fd5b8063011b21741461021f5780630acac942146102685780631cb8b55b146102ca578063283040b4146102ea575b600080fd5b34801561022b57600080fd5b5061025561023a3660046135b4565b6001600160a01b0316600090815260cf602052604090205490565b6040519081526020015b60405180910390f35b34801561027457600080fd5b506102ab6102833660046135b4565b60d16020526000908152604090205460ff808216916101008104821691620100009091041683565b604080519315158452911515602084015215159082015260600161025f565b3480156102d657600080fd5b506102556102e53660046135e2565b6107c3565b3480156102f657600080fd5b506102ff6107fd565b60405161025f9190613693565b34801561031857600080fd5b5061032c61032736600461373d565b610a71565b604051901515815260200161025f565b34801561034857600080fd5b5061035c6103573660046139ed565b610b23565b005b34801561036a57600080fd5b5061035c610379366004613ba0565b611037565b34801561038a57600080fd5b50610255610399366004613cce565b6111ba565b3480156103aa57600080fd5b5061035c611203565b3480156103bf57600080fd5b5061032c6103ce3660046135b4565b6001600160a01b0316600090815260d16020526040902054610100900460ff1690565b3480156103fd57600080fd5b5061040661121d565b60405161025f9190613d9e565b34801561041f57600080fd5b5061035c61042e366004613db1565b6112ab565b34801561043f57600080fd5b5060975460ff1661032c565b34801561045757600080fd5b5061035c610466366004613de5565b6114f5565b34801561047757600080fd5b5061025560cd5481565b34801561048d57600080fd5b506104a161049c366004613e1e565b611733565b6040516001600160a01b03909116815260200161025f565b3480156104c557600080fd5b5061035c61175d565b3480156104da57600080fd5b5061025560cc5481565b3480156104f057600080fd5b506105046104ff3660046135b4565b61176f565b60405160ff909116815260200161025f565b34801561052257600080fd5b5061035c6117ac565b34801561053757600080fd5b506065546001600160a01b03166104a1565b34801561055557600080fd5b5061035c610564366004613e37565b6117c4565b34801561057557600080fd5b5061032c6105843660046135b4565b611929565b34801561059557600080fd5b506106096105a43660046135b4565b6040805160608082018352600080835260208084018290529284018190526001600160a01b0394909416845260d1825292829020825193840183525460ff80821615158552610100820481161515928501929092526201000090041615159082015290565b604080518251151581526020808401511515908201529181015115159082015260600161025f565b34801561063d57600080fd5b5061025561064c366004613eb9565b611a43565b34801561065d57600080fd5b5061035c61066c366004613f39565b611a7f565b34801561067d57600080fd5b5061025560ce5481565b34801561069357600080fd5b5061032c6106a23660046135b4565b611cb1565b3480156106b357600080fd5b506102556106c23660046135b4565b60cf6020526000908152604090205481565b3480156106e057600080fd5b5061035c6106ef36600461405f565b611dc6565b34801561070057600080fd5b5061025560ca5481565b61025561071836600461419a565b6120bf565b34801561072957600080fd5b5061032c610738366004613e1e565b60d36020526000908152604090205460ff1681565b34801561075957600080fd5b5061032c610768366004614290565b6121fc565b34801561077957600080fd5b5061035c6107883660046135b4565b612505565b34801561079957600080fd5b5061025560c95481565b3480156107af57600080fd5b5060cb546104a1906001600160a01b031681565b6000848484846040516020016107dc9493929190614516565b6040516020818303038152906040528051906020012090505b949350505050565b60d0546060906000906001600160401b0381111561081d5761081d613770565b60405190808252806020026020018201604052801561088557816020015b610872604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600060ff1681525090565b81526020019060019003908161083b5790505b50905060005b60d054811015610a6b57600060d082815481106108aa576108aa614545565b9060005260206000200160009054906101000a90046001600160a01b031690506000816001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa15801561090a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610932919081019061455b565b90506000826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610974573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261099c919081019061455b565b90506000836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0291906145d2565b905060006040518060800160405280866001600160a01b031681526020018581526020018481526020018360ff16815250905080878781518110610a4857610a48614545565b602002602001018190525050505050508080610a6390614605565b91505061088b565b50919050565b6000610a7b61257b565b60405163f2fde38b60e01b81526001600160a01b03838116600483015284169063f2fde38b90602401600060405180830381600087803b158015610abe57600080fd5b505af1158015610ad2573d6000803e3d6000fd5b5050604080516001600160a01b038088168252861660208201527fb0f1bf050fff9d249d22389b0f2673295260c8deca341a2755d95318f9fbc699935001905060405180910390a150600192915050565b610b2b6125d5565b610b3361262f565b6001600160a01b038316600090815260d160209081526040918290208251606081018452905460ff8082161515835261010082048116151593830193909352620100009004909116151591810182905290610bd15760405162461bcd60e51b8152602060048201526019602482015278556e737570706f7274656420746f6b656e206164647265737360381b60448201526064015b60405180910390fd5b8060200151610c155760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881dd85cc81c185d5cd95960821b6044820152606401610bc8565b6020808601516001600160a01b038616600090815260cf90925260409091205410610ca85760405162461bcd60e51b815260206004820152603760248201527f4e6577206261746368206e6f6e6365206d75737420626520677265617465722060448201527f7468616e207468652063757272656e74206e6f6e63652e0000000000000000006064820152608401610bc8565b824310610d1d5760405162461bcd60e51b815260206004820152603c60248201527f42617463682074696d656f7574206d757374206265206772656174657220746860448201527f616e207468652063757272656e7420626c6f636b206865696768742e000000006064820152608401610bc8565b86518851148015610d2f575085518851145b610d7b5760405162461bcd60e51b815260206004820181905260248201527f4d616c666f726d6564206261746368206f66207472616e73616374696f6e732e6044820152606401610bc8565b6040805160a0810182528e8152602081018e90529081018b9052606081018a9052608081018c90528551610daf9082612675565b60c954610de8908290610de3906f0e8e4c2dce6c2c6e8d2dedc84c2e8c6d60831b8d8d8d8d600160200201518d8d8d6111ba565b6127ab565b6020808701516001600160a01b038716600090815260cf9092526040822055805b8a51811015610f3d57610e3e898281518110610e2757610e27614545565b60200260200101518361291c90919063ffffffff16565b8451909250151560011415610edb57866001600160a01b03166340c10f19308d8481518110610e6f57610e6f614545565b60200260200101516040518363ffffffff1660e01b8152600401610ea89291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015610ec257600080fd5b505af1158015610ed6573d6000803e3d6000fd5b505050505b610f2b8a8281518110610ef057610ef0614545565b60200260200101518c8381518110610f0a57610f0a614545565b6020026020010151896001600160a01b031661292f9092919063ffffffff16565b80610f3581614605565b915050610e09565b508251151560011415610fab576040516340c10f1960e01b8152306004820152602481018290526001600160a01b038716906340c10f1990604401600060405180830381600087803b158015610f9257600080fd5b505af1158015610fa6573d6000803e3d6000fd5b505050505b610fbf6001600160a01b038716858361292f565b505060cc54610fd09150600161291c565b60cc556001600160a01b03831684600160200201517f02c7e81975f8edb86e2a0c038b7b86a49c744236abf0f6177ff5afc6986ab70860cc5460405161101891815260200190565b60405180910390a361102960018055565b505050505050505050505050565b61103f61262f565b8387116110b45760405162461bcd60e51b815260206004820152603c60248201527f4e6577206f7261636c6520736574206e6f6e6365206d7573742062652067726560448201527f61746572207468616e207468652063757272656e74206e6f6e63652e000000006064820152608401610bc8565b87518951146111055760405162461bcd60e51b815260206004820152601960248201527f4d616c666f726d6564206e6577206f7261636c65207365742e000000000000006044820152606401610bc8565b60006040518060a0016040528088815260200187815260200184815260200183815260200185815250905061113a8582612675565b6000611147898c8c612998565b905061115382826127ab565b60cd81905560ce89905560cc5461116b90600161291c565b60cc8190556040518a917f36c6022aad02313069de85ca9645431c7dd5e8e7a21685586461c4b25e2374b3916111a591908f908f90614689565b60405180910390a25050505050505050505050565b60008989898989898989896040516020016111dd999897969594939291906146b4565b6040516020818303038152906040528051906020012090505b9998505050505050505050565b61120b61257b565b6112136129b9565b61121b612a02565b565b60d2805461122a90614731565b80601f016020809104026020016040519081016040528092919081815260200182805461125690614731565b80156112a35780601f10611278576101008083540402835291602001916112a3565b820191906000526020600020905b81548152906001019060200180831161128657829003601f168201915b505050505081565b3033146112fa5760405162461bcd60e51b815260206004820181905260248201527f53656c6661626c653a2063616c6c6572206973206e6f74207468652073656c666044820152606401610bc8565b60006113096040830183614766565b905011156113a8576113a83061132560a08401608085016135b4565b6113326040850185614766565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611371925050506060860186614766565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612a5492505050565b6113ca6113bb60a08301608084016135b4565b6001600160a01b03163b151590565b156114f2576101208101351561145e576113ea60a08201608083016135b4565b6001600160a01b03166332e1e16e61012083013561140b60a08501856147af565b6040518463ffffffff1660e01b8152600401611429939291906147f5565b600060405180830381600087803b15801561144357600080fd5b505af1158015611457573d6000803e3d6000fd5b5050505050565b61146e60a08201608083016135b4565b6001600160a01b03166357ffc09261148960208401846135b4565b61149960408501602086016135b4565b6114a66040860186614766565b6114b36060880188614766565b6114c060a08a018a6147af565b6114cd60c08c018c6147af565b6040518b63ffffffff1660e01b81526004016114299a99989796959493929190614818565b50565b6114fd6125d5565b61150561262f565b600081116115615760405162461bcd60e51b815260206004820152602360248201527f416d6f756e742073686f756c642062652067726561746572207468616e207a6560448201526239379760e91b6064820152608401610bc8565b6001600160a01b038416600090815260d160209081526040918290208251606081018452905460ff80821615158352610100820481161515938301939093526201000090049091161515918101829052906115fe5760405162461bcd60e51b815260206004820152601a60248201527f556e737570706f7274656420746f6b656e20616464726573732e0000000000006044820152606401610bc8565b80602001516116435760405162461bcd60e51b81526020600482015260116024820152702a37b5b2b7103bb0b9903830bab9b2b21760791b6044820152606401610bc8565b6116586001600160a01b038616333085612edf565b80511515600114156116bf57604051630852cd8d60e31b8152600481018390526001600160a01b038616906342966c6890602401600060405180830381600087803b1580156116a657600080fd5b505af11580156116ba573d6000803e3d6000fd5b505050505b60cc546116cd90600161291c565b60cc819055604080518581526020810185905290810191909152849033906001600160a01b038816907f034c5b22dd525a50d0a6b15549df0a6ac83b833a6c3da57ea16890832c72507c9060600160405180910390a45061172d60018055565b50505050565b60d0818154811061174357600080fd5b6000918252602090912001546001600160a01b0316905081565b61176561257b565b61121b6000612f17565b60405162461bcd60e51b815260206004820152600f60248201526e139bdd081a5b5c1b195b595b9d1959608a1b6044820152600090606401610bc8565b6117b461257b565b6117bc61262f565b61121b612f69565b6117cc6125d5565b6117d461262f565b6117df838383612fa6565b602082810135600090815260d382526040808220805460ff1916600117905580518281529283019081905263561aa97d60e01b9052903063561aa97d6118288560248501614893565b600060405180830381600087803b15801561184257600080fd5b505af1925050508015611853575060015b6118bf5761185f6148a6565b806308c379a0141561188657506118746148c2565b8061187f5750611888565b90506118c4565b505b3d8080156118b2576040519150601f19603f3d011682016040523d82523d6000602084013e6118b7565b606091505b5090506118c4565b600191505b60cc546118d290600161291c565b60cc81905560405132917fa274e2655558a3663f90b9ff4d5409974a0e79ba5f0fb41ec4d582d58ba7058091611911916020890135918790879061494b565b60405180910390a2505061192460018055565b505050565b600061193361257b565b6001600160a01b038216600090815260d1602052604090205462010000900460ff1615156001146119a65760405162461bcd60e51b815260206004820152601b60248201527f42726964676520746f6b656e20646f65736e27742065786973747300000000006044820152606401610bc8565b6001600160a01b038216600090815260d1602052604090205460ff610100909104161515600114611a195760405162461bcd60e51b815260206004820152601b60248201527f42726964676520746f6b656e20616c72656164792070617573656400000000006044820152606401610bc8565b506001600160a01b038116600090815260d160205260409020805461ff001916905560015b919050565b60008585858585604051602001611a5e959493929190614972565b60405160208183030381529060405280519060200120905095945050505050565b600054610100900460ff1615808015611a9f5750600054600160ff909116105b80611ab95750303b158015611ab9575060005460ff166001145b611ad55760405162461bcd60e51b8152600401610bc8906149b5565b6000805460ff191660011790558015611af8576000805461ff0019166101001790555b611b00613138565b611b08613167565b611b10613196565b8151835114611b615760405162461bcd60e51b815260206004820152601d60248201527f4d616c666f726d65642063757272656e74206f7261636c65207365742e0000006044820152606401610bc8565b6000805b8351811015611bb457838181518110611b8057611b80614545565b602002602001015182611b939190614a03565b915085821115611ba257611bb4565b80611bac81614605565b915050611b65565b50848111611bd45760405162461bcd60e51b8152600401610bc890614a1b565b60c9869055611be560008585612998565b60cd5560ca859055600060ce55600160cc55604080518082019091526005808252640312e302e360dc1b6020909201918252611c239160d291613504565b5060ce547f36c6022aad02313069de85ca9645431c7dd5e8e7a21685586461c4b25e2374b360cc548686604051611c5c93929190614689565b60405180910390a2508015611457576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6000611cbb61257b565b6001600160a01b038216600090815260d1602052604090205462010000900460ff161515600114611d2e5760405162461bcd60e51b815260206004820152601c60248201527f42726964676520746f6b656e20646f65736e2774206578697374732e000000006044820152606401610bc8565b6001600160a01b038216600090815260d16020526040902054610100900460ff1615611d9c5760405162461bcd60e51b815260206004820152601f60248201527f42726964676520746f6b656e20616c7265616479206163746976617465642e006044820152606401610bc8565b506001600160a01b0316600090815260d160205260409020805461ff001916610100179055600190565b600054610100900460ff1615808015611de65750600054600160ff909116105b80611e005750303b158015611e00575060005460ff166001145b611e1c5760405162461bcd60e51b8152600401610bc8906149b5565b6000805460ff191660011790558015611e3f576000805461ff0019166101001790555b611e47613138565b611e4f613167565b611e57613196565b83518351148015611e69575081518451145b611ec55760405162461bcd60e51b815260206004820152602760248201527f4d616c666f726d6564206c61737420626174636820746f6b656e20696e666f7260448201526636b0ba34b7b71760c91b6064820152608401610bc8565b60c989905560ca88905560cc87905560cd86905560ce85905560005b84518110156120405760d0858281518110611efe57611efe614545565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790558351849082908110611f4d57611f4d614545565b602002602001015160cf6000878481518110611f6b57611f6b614545565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550828181518110611fa957611fa9614545565b602002602001015160d16000878481518110611fc757611fc7614545565b6020908102919091018101516001600160a01b03168252818101929092526040908101600020835181549385015194909201511515620100000262ff0000199415156101000261ff00199315159390931661ffff199094169390931791909117929092161790558061203881614605565b915050611ee1565b50604080518082019091526005808252640312e302e360dc1b602090920191825261206d9160d291613504565b5080156120b4576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b60006120c96125d5565b6120d161262f565b8951156121145760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b2103239ba21b430b4b71760791b6044820152606401610bc8565b875115612171576001600160a01b0389166121715760405162461bcd60e51b815260206004820152601860248201527f526566756e64206164647265737320697320656d7074792