@functionx_io/contracts
Version:
Smart Contract library for Solidity
1,385 lines • 105 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "FxBridgeLogicETH",
"sourceName": "contracts/bridge/FxBridgeLogicETH.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": "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": "0x608060405234801561001057600080fd5b50614836806100206000396000f3fe60806040526004361061020f5760003560e01c80637d9a8ea611610118578063dde65aea116100a0578063ed51dacf1161006f578063ed51dacf146106f2578063f1099f6114610722578063f2fde38b14610742578063f92367fd14610762578063fd9791bb1461077857600080fd5b8063dde65aea1461067c578063df97174b1461069c578063e5a2b5d2146106c9578063e6d69ede146106df57600080fd5b8063a36a4ab0116100e7578063a36a4ab01461055e578063a3ff31b51461057e578063a955665f14610626578063aa63a89414610646578063bb83bf961461066657600080fd5b80637d9a8ea6146104d95780638456cb591461050b5780638da5cb5b146105205780639a5aa0441461053e57600080fd5b8063474d561c1161019b5780636189d1071161016a5780636189d1071461044057806370a0eb941461046057806370e5a89814610476578063715018a6146104ae57806373b20547146104c357600080fd5b8063474d561c146103a857806354fd4d50146103e6578063561aa97d146104085780635c975abb1461042857600080fd5b806331678cf6116101e257806331678cf614610301578063332caa1f146103315780633a08e299146103535780633d1e51f9146103735780633f4ba83a1461039357600080fd5b8063011b2174146102145780630acac9421461025d5780631cb8b55b146102bf578063283040b4146102df575b600080fd5b34801561022057600080fd5b5061024a61022f3660046132d7565b6001600160a01b0316600090815260cf602052604090205490565b6040519081526020015b60405180910390f35b34801561026957600080fd5b506102a06102783660046132d7565b60d16020526000908152604090205460ff808216916101008104821691620100009091041683565b6040805193151584529115156020840152151590820152606001610254565b3480156102cb57600080fd5b5061024a6102da366004613305565b610798565b3480156102eb57600080fd5b506102f46107d2565b60405161025491906133b6565b34801561030d57600080fd5b5061032161031c366004613460565b610a46565b6040519015158152602001610254565b34801561033d57600080fd5b5061035161034c3660046136eb565b610af8565b005b34801561035f57600080fd5b5061035161036e36600461389e565b61100c565b34801561037f57600080fd5b5061024a61038e3660046139cc565b61118f565b34801561039f57600080fd5b506103516111d8565b3480156103b457600080fd5b506103216103c33660046132d7565b6001600160a01b0316600090815260d16020526040902054610100900460ff1690565b3480156103f257600080fd5b506103fb6111f2565b6040516102549190613a9c565b34801561041457600080fd5b50610351610423366004613aaf565b611280565b34801561043457600080fd5b5060975460ff16610321565b34801561044c57600080fd5b5061035161045b366004613ae3565b6114ca565b34801561046c57600080fd5b5061024a60cd5481565b34801561048257600080fd5b50610496610491366004613b1c565b611708565b6040516001600160a01b039091168152602001610254565b3480156104ba57600080fd5b50610351611732565b3480156104cf57600080fd5b5061024a60cc5481565b3480156104e557600080fd5b506104f96104f43660046132d7565b611744565b60405160ff9091168152602001610254565b34801561051757600080fd5b50610351611781565b34801561052c57600080fd5b506065546001600160a01b0316610496565b34801561054a57600080fd5b50610351610559366004613b35565b611799565b34801561056a57600080fd5b506103216105793660046132d7565b6118fe565b34801561058a57600080fd5b506105fe6105993660046132d7565b6040805160608082018352600080835260208084018290529284018190526001600160a01b0394909416845260d1825292829020825193840183525460ff80821615158552610100820481161515928501929092526201000090041615159082015290565b6040805182511515815260208084015115159082015291810151151590820152606001610254565b34801561063257600080fd5b5061024a610641366004613bb7565b611a18565b34801561065257600080fd5b50610351610661366004613c37565b611a54565b34801561067257600080fd5b5061024a60ce5481565b34801561068857600080fd5b506103216106973660046132d7565b611ccd565b3480156106a857600080fd5b5061024a6106b73660046132d7565b60cf6020526000908152604090205481565b3480156106d557600080fd5b5061024a60ca5481565b61024a6106ed366004613d24565b611de2565b3480156106fe57600080fd5b5061032161070d366004613b1c565b60d36020526000908152604090205460ff1681565b34801561072e57600080fd5b5061032161073d366004613e28565b611f1f565b34801561074e57600080fd5b5061035161075d3660046132d7565b612228565b34801561076e57600080fd5b5061024a60c95481565b34801561078457600080fd5b5060cb54610496906001600160a01b031681565b6000848484846040516020016107b194939291906140ae565b6040516020818303038152906040528051906020012090505b949350505050565b60d0546060906000906001600160401b038111156107f2576107f2613493565b60405190808252806020026020018201604052801561085a57816020015b610847604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600060ff1681525090565b8152602001906001900390816108105790505b50905060005b60d054811015610a4057600060d0828154811061087f5761087f6140dd565b9060005260206000200160009054906101000a90046001600160a01b031690506000816001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa1580156108df573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261090791908101906140f3565b90506000826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610949573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261097191908101906140f3565b90506000836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d7919061416a565b905060006040518060800160405280866001600160a01b031681526020018581526020018481526020018360ff16815250905080878781518110610a1d57610a1d6140dd565b602002602001018190525050505050508080610a389061419d565b915050610860565b50919050565b6000610a5061229e565b60405163f2fde38b60e01b81526001600160a01b03838116600483015284169063f2fde38b90602401600060405180830381600087803b158015610a9357600080fd5b505af1158015610aa7573d6000803e3d6000fd5b5050604080516001600160a01b038088168252861660208201527fb0f1bf050fff9d249d22389b0f2673295260c8deca341a2755d95318f9fbc699935001905060405180910390a150600192915050565b610b006122f8565b610b08612352565b6001600160a01b038316600090815260d160209081526040918290208251606081018452905460ff8082161515835261010082048116151593830193909352620100009004909116151591810182905290610ba65760405162461bcd60e51b8152602060048201526019602482015278556e737570706f7274656420746f6b656e206164647265737360381b60448201526064015b60405180910390fd5b8060200151610bea5760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881dd85cc81c185d5cd95960821b6044820152606401610b9d565b6020808601516001600160a01b038616600090815260cf90925260409091205410610c7d5760405162461bcd60e51b815260206004820152603760248201527f4e6577206261746368206e6f6e6365206d75737420626520677265617465722060448201527f7468616e207468652063757272656e74206e6f6e63652e0000000000000000006064820152608401610b9d565b824310610cf25760405162461bcd60e51b815260206004820152603c60248201527f42617463682074696d656f7574206d757374206265206772656174657220746860448201527f616e207468652063757272656e7420626c6f636b206865696768742e000000006064820152608401610b9d565b86518851148015610d04575085518851145b610d505760405162461bcd60e51b815260206004820181905260248201527f4d616c666f726d6564206261746368206f66207472616e73616374696f6e732e6044820152606401610b9d565b6040805160a0810182528e8152602081018e90529081018b9052606081018a9052608081018c90528551610d849082612398565b60c954610dbd908290610db8906f0e8e4c2dce6c2c6e8d2dedc84c2e8c6d60831b8d8d8d8d600160200201518d8d8d61118f565b6124ce565b6020808701516001600160a01b038716600090815260cf9092526040822055805b8a51811015610f1257610e13898281518110610dfc57610dfc6140dd565b60200260200101518361263f90919063ffffffff16565b8451909250151560011415610eb057866001600160a01b03166340c10f19308d8481518110610e4457610e446140dd565b60200260200101516040518363ffffffff1660e01b8152600401610e7d9291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015610e9757600080fd5b505af1158015610eab573d6000803e3d6000fd5b505050505b610f008a8281518110610ec557610ec56140dd565b60200260200101518c8381518110610edf57610edf6140dd565b6020026020010151896001600160a01b03166126529092919063ffffffff16565b80610f0a8161419d565b915050610dde565b508251151560011415610f80576040516340c10f1960e01b8152306004820152602481018290526001600160a01b038716906340c10f1990604401600060405180830381600087803b158015610f6757600080fd5b505af1158015610f7b573d6000803e3d6000fd5b505050505b610f946001600160a01b0387168583612652565b505060cc54610fa59150600161263f565b60cc556001600160a01b03831684600160200201517f02c7e81975f8edb86e2a0c038b7b86a49c744236abf0f6177ff5afc6986ab70860cc54604051610fed91815260200190565b60405180910390a3610ffe60018055565b505050505050505050505050565b611014612352565b8387116110895760405162461bcd60e51b815260206004820152603c60248201527f4e6577206f7261636c6520736574206e6f6e6365206d7573742062652067726560448201527f61746572207468616e207468652063757272656e74206e6f6e63652e000000006064820152608401610b9d565b87518951146110da5760405162461bcd60e51b815260206004820152601960248201527f4d616c666f726d6564206e6577206f7261636c65207365742e000000000000006044820152606401610b9d565b60006040518060a0016040528088815260200187815260200184815260200183815260200185815250905061110f8582612398565b600061111c898c8c6126bb565b905061112882826124ce565b60cd81905560ce89905560cc5461114090600161263f565b60cc8190556040518a917f36c6022aad02313069de85ca9645431c7dd5e8e7a21685586461c4b25e2374b39161117a91908f908f90614221565b60405180910390a25050505050505050505050565b60008989898989898989896040516020016111b29998979695949392919061424c565b6040516020818303038152906040528051906020012090505b9998505050505050505050565b6111e061229e565b6111e86126dc565b6111f0612725565b565b60d280546111ff906142c9565b80601f016020809104026020016040519081016040528092919081815260200182805461122b906142c9565b80156112785780601f1061124d57610100808354040283529160200191611278565b820191906000526020600020905b81548152906001019060200180831161125b57829003601f168201915b505050505081565b3033146112cf5760405162461bcd60e51b815260206004820181905260248201527f53656c6661626c653a2063616c6c6572206973206e6f74207468652073656c666044820152606401610b9d565b60006112de60408301836142fe565b9050111561137d5761137d306112fa60a08401608085016132d7565b61130760408501856142fe565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506113469250505060608601866142fe565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061277792505050565b61139f61139060a08301608084016132d7565b6001600160a01b03163b151590565b156114c75761012081013515611433576113bf60a08201608083016132d7565b6001600160a01b03166332e1e16e6101208301356113e060a0850185614347565b6040518463ffffffff1660e01b81526004016113fe9392919061438d565b600060405180830381600087803b15801561141857600080fd5b505af115801561142c573d6000803e3d6000fd5b5050505050565b61144360a08201608083016132d7565b6001600160a01b03166357ffc09261145e60208401846132d7565b61146e60408501602086016132d7565b61147b60408601866142fe565b61148860608801886142fe565b61149560a08a018a614347565b6114a260c08c018c614347565b6040518b63ffffffff1660e01b81526004016113fe9a999897969594939291906143b0565b50565b6114d26122f8565b6114da612352565b600081116115365760405162461bcd60e51b815260206004820152602360248201527f416d6f756e742073686f756c642062652067726561746572207468616e207a6560448201526239379760e91b6064820152608401610b9d565b6001600160a01b038416600090815260d160209081526040918290208251606081018452905460ff80821615158352610100820481161515938301939093526201000090049091161515918101829052906115d35760405162461bcd60e51b815260206004820152601a60248201527f556e737570706f7274656420746f6b656e20616464726573732e0000000000006044820152606401610b9d565b80602001516116185760405162461bcd60e51b81526020600482015260116024820152702a37b5b2b7103bb0b9903830bab9b2b21760791b6044820152606401610b9d565b61162d6001600160a01b038616333085612c02565b805115156001141561169457604051630852cd8d60e31b8152600481018390526001600160a01b038616906342966c6890602401600060405180830381600087803b15801561167b57600080fd5b505af115801561168f573d6000803e3d6000fd5b505050505b60cc546116a290600161263f565b60cc819055604080518581526020810185905290810191909152849033906001600160a01b038816907f034c5b22dd525a50d0a6b15549df0a6ac83b833a6c3da57ea16890832c72507c9060600160405180910390a45061170260018055565b50505050565b60d0818154811061171857600080fd5b6000918252602090912001546001600160a01b0316905081565b61173a61229e565b6111f06000612c3a565b60405162461bcd60e51b815260206004820152600f60248201526e139bdd081a5b5c1b195b595b9d1959608a1b6044820152600090606401610b9d565b61178961229e565b611791612352565b6111f0612c8c565b6117a16122f8565b6117a9612352565b6117b4838383612cc9565b602082810135600090815260d382526040808220805460ff1916600117905580518281529283019081905263561aa97d60e01b9052903063561aa97d6117fd856024850161442b565b600060405180830381600087803b15801561181757600080fd5b505af1925050508015611828575060015b6118945761183461443e565b806308c379a0141561185b575061184961445a565b80611854575061185d565b9050611899565b505b3d808015611887576040519150601f19603f3d011682016040523d82523d6000602084013e61188c565b606091505b509050611899565b600191505b60cc546118a790600161263f565b60cc81905560405132917fa274e2655558a3663f90b9ff4d5409974a0e79ba5f0fb41ec4d582d58ba70580916118e691602089013591879087906144e3565b60405180910390a250506118f960018055565b505050565b600061190861229e565b6001600160a01b038216600090815260d1602052604090205462010000900460ff16151560011461197b5760405162461bcd60e51b815260206004820152601b60248201527f42726964676520746f6b656e20646f65736e27742065786973747300000000006044820152606401610b9d565b6001600160a01b038216600090815260d1602052604090205460ff6101009091041615156001146119ee5760405162461bcd60e51b815260206004820152601b60248201527f42726964676520746f6b656e20616c72656164792070617573656400000000006044820152606401610b9d565b506001600160a01b038116600090815260d160205260409020805461ff001916905560015b919050565b60008585858585604051602001611a3395949392919061450a565b60405160208183030381529060405280519060200120905095945050505050565b600054610100900460ff1615808015611a745750600054600160ff909116105b80611a8e5750303b158015611a8e575060005460ff166001145b611af15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610b9d565b6000805460ff191660011790558015611b14576000805461ff0019166101001790555b611b1c612e5b565b611b24612e8a565b611b2c612eb9565b8151835114611b7d5760405162461bcd60e51b815260206004820152601d60248201527f4d616c666f726d65642063757272656e74206f7261636c65207365742e0000006044820152606401610b9d565b6000805b8351811015611bd057838181518110611b9c57611b9c6140dd565b602002602001015182611baf919061454d565b915085821115611bbe57611bd0565b80611bc88161419d565b915050611b81565b50848111611bf05760405162461bcd60e51b8152600401610b9d90614565565b60c9869055611c01600085856126bb565b60cd5560ca859055600060ce55600160cc55604080518082019091526005808252640312e302e360dc1b6020909201918252611c3f9160d291613227565b5060ce547f36c6022aad02313069de85ca9645431c7dd5e8e7a21685586461c4b25e2374b360cc548686604051611c7893929190614221565b60405180910390a250801561142c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6000611cd761229e565b6001600160a01b038216600090815260d1602052604090205462010000900460ff161515600114611d4a5760405162461bcd60e51b815260206004820152601c60248201527f42726964676520746f6b656e20646f65736e2774206578697374732e000000006044820152606401610b9d565b6001600160a01b038216600090815260d16020526040902054610100900460ff1615611db85760405162461bcd60e51b815260206004820152601f60248201527f42726964676520746f6b656e20616c7265616479206163746976617465642e006044820152606401610b9d565b506001600160a01b0316600090815260d160205260409020805461ff001916610100179055600190565b6000611dec6122f8565b611df4612352565b895115611e375760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b2103239ba21b430b4b71760791b6044820152606401610b9d565b875115611e94576001600160a01b038916611e945760405162461bcd60e51b815260206004820152601860248201527f526566756e64206164647265737320697320656d7074792e00000000000000006044820152606401610b9d565b611ea033308a8a612777565b60cc54611eae90600161263f565b60cc556001600160a01b03868116908a16336001600160a01b03167fcaa0e5b7ba998f542b3804184a5d30836451c57f6d1f031c466272e188f4a70f3260cc548f8e8e8d8d8d8d604051611f0a999897969594939291906145c2565b60405180910390a45060cc546111cb60018055565b6000611f2961229e565b6001600160a01b038416611f785760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b2103a37b5b2b71030b2323932b9b99760511b6044820152606401610b9d565b6001600160a01b038416600090815260d1602052604090205462010000900460ff1615611fe75760405162461bcd60e51b815260206004820152601c60248201527f42726964676520746f6b656e20616c7265616479206578697374732e000000006044820152606401610b9d565b60d0805460018181019092557fe89d44c8fd6a9bac8af33ce47f56337617d449bf7ff3956b618c646de829cbcb0180546001600160a01b0387166001600160a01b031990911681179091556040805160608101825285151581526020818101858152828401868152600095865260d19092529290932090518154925193511515620100000262ff0000199415156101000261ff00199215159290921661ffff1990941693909317179290921617905560cc546120a29161263f565b60cc81905550836001600160a01b03167f2da8f37eaabc4d44ba4fcc438e404bbed3344322280d6c67497e9c668c87ec0f856001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015612111573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261213991908101906140f3565b866001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015612177573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261219f91908101906140f3565b876001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612201919061416a565b60cc548860405161221695949392919061465b565b60405180910390a25060019392505050565b61223061229e565b6001600160a01b0381166122955760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b9d565b6114c781612c3a565b6065546001600160a01b031633146111f05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b9d565b6002600154141561234b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b9d565b6002600155565b60975460ff16156111f05760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b9d565b6020810151518151511480156123b45750608081015151815151145b80156123c65750604081015151815151145b80156123d85750606081015151815151145b6124415760405162461bcd60e51b815260206004820152603460248201527f4d616c666f726d65642063757272656e74206f7261636c65207365743a2061726044820152733930bc903632b733ba341036b4b9b6b0ba31b41760611b6064820152608401610b9d565b60cd5461245783836000015184602001516126bb565b146124ca5760405162461bcd60e51b815260206004820152603c60248201527f537570706c6965642063757272656e742