@functionx_io/contracts
Version:
Smart Contract library for Solidity
1,437 lines • 111 kB
JSON
{
"_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