@mean-finance/dca-v2-periphery
Version:
💱 Periphery smart contracts of DCA V2 by mean.finance
1,319 lines • 125 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "DCAHubCompanion",
"sourceName": "contracts/DCAHubCompanion/DCAHubCompanion.sol",
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "_swapper",
"type": "address"
},
{
"internalType": "address",
"name": "_allowanceTarget",
"type": "address"
},
{
"internalType": "address",
"name": "_governor",
"type": "address"
},
{
"internalType": "contract IPermit2",
"name": "_permit2",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "GovernorIsZeroAddress",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
}
],
"name": "InvalidAllowanceTarget",
"type": "error"
},
{
"inputs": [],
"name": "InvalidMask",
"type": "error"
},
{
"inputs": [],
"name": "OnlyGovernor",
"type": "error"
},
{
"inputs": [],
"name": "OnlyPendingGovernor",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "received",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expected",
"type": "uint256"
}
],
"name": "ReceivedTooLittleTokenOut",
"type": "error"
},
{
"inputs": [
{
"components": [
{
"internalType": "bool",
"name": "success",
"type": "bool"
},
{
"internalType": "bytes",
"name": "result",
"type": "bytes"
},
{
"internalType": "uint256",
"name": "gasSpent",
"type": "uint256"
}
],
"internalType": "struct ISimulationAdapter.SimulationResult",
"name": "result",
"type": "tuple"
}
],
"name": "SimulatedCall",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "swapper",
"type": "address"
}
],
"name": "SwapperNotAllowlisted",
"type": "error"
},
{
"inputs": [],
"name": "UnauthorizedCaller",
"type": "error"
},
{
"inputs": [],
"name": "ZeroAddress",
"type": "error"
},
{
"anonymous": false,
"inputs": [],
"name": "PendingGovernorAccepted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "newPendingGovernor",
"type": "address"
}
],
"name": "PendingGovernorSet",
"type": "event"
},
{
"inputs": [],
"name": "PERMIT2",
"outputs": [
{
"internalType": "contract IPermit2",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "PROTOCOL_TOKEN",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "SWAPPER_REGISTRY",
"outputs": [
{
"internalType": "contract ISwapperRegistry",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "acceptPendingGovernor",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "allowanceTarget",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"internalType": "struct IPermit2.TokenPermissions[]",
"name": "_tokens",
"type": "tuple[]"
},
{
"internalType": "uint256",
"name": "_nonce",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_deadline",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "_signature",
"type": "bytes"
},
{
"internalType": "address",
"name": "_recipient",
"type": "address"
}
],
"name": "batchPermitTakeFromCaller",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IDCAHub",
"name": "_hub",
"type": "address"
},
{
"internalType": "address",
"name": "_from",
"type": "address"
},
{
"internalType": "address",
"name": "_to",
"type": "address"
},
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
},
{
"internalType": "uint32",
"name": "_amountOfSwaps",
"type": "uint32"
},
{
"internalType": "uint32",
"name": "_swapInterval",
"type": "uint32"
},
{
"internalType": "address",
"name": "_owner",
"type": "address"
},
{
"components": [
{
"internalType": "address",
"name": "operator",
"type": "address"
},
{
"internalType": "enum IDCAPermissionManager.Permission[]",
"name": "permissions",
"type": "uint8[]"
}
],
"internalType": "struct IDCAPermissionManager.PermissionSet[]",
"name": "_permissions",
"type": "tuple[]"
},
{
"internalType": "bytes",
"name": "_miscellaneous",
"type": "bytes"
}
],
"name": "deposit",
"outputs": [
{
"internalType": "uint256",
"name": "_positionId",
"type": "uint256"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IDCAHub",
"name": "_hub",
"type": "address"
},
{
"internalType": "address",
"name": "_from",
"type": "address"
},
{
"internalType": "address",
"name": "_to",
"type": "address"
},
{
"internalType": "uint32",
"name": "_amountOfSwaps",
"type": "uint32"
},
{
"internalType": "uint32",
"name": "_swapInterval",
"type": "uint32"
},
{
"internalType": "address",
"name": "_owner",
"type": "address"
},
{
"components": [
{
"internalType": "address",
"name": "operator",
"type": "address"
},
{
"internalType": "enum IDCAPermissionManager.Permission[]",
"name": "permissions",
"type": "uint8[]"
}
],
"internalType": "struct IDCAPermissionManager.PermissionSet[]",
"name": "_permissions",
"type": "tuple[]"
},
{
"internalType": "bytes",
"name": "_miscellaneous",
"type": "bytes"
}
],
"name": "depositWithBalanceOnContract",
"outputs": [
{
"internalType": "uint256",
"name": "_positionId",
"type": "uint256"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IDCAHub",
"name": "_hub",
"type": "address"
},
{
"components": [
{
"internalType": "address",
"name": "tokenA",
"type": "address"
},
{
"internalType": "address",
"name": "tokenB",
"type": "address"
}
],
"internalType": "struct Pair[]",
"name": "_pairs",
"type": "tuple[]"
},
{
"internalType": "bool",
"name": "_calculatePrivilegedAvailability",
"type": "bool"
},
{
"internalType": "bytes",
"name": "_oracleData",
"type": "bytes"
}
],
"name": "getNextSwapInfo",
"outputs": [
{
"components": [
{
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "reward",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "toProvide",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "platformFee",
"type": "uint256"
}
],
"internalType": "struct IDCAHubSwapHandler.TokenInSwap[]",
"name": "tokens",
"type": "tuple[]"
},
{
"components": [
{
"internalType": "address",
"name": "tokenA",
"type": "address"
},
{
"internalType": "address",
"name": "tokenB",
"type": "address"
},
{
"internalType": "uint256",
"name": "totalAmountToSwapTokenA",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "totalAmountToSwapTokenB",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "ratioAToB",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "ratioBToA",
"type": "uint256"
},
{
"internalType": "bytes1",
"name": "intervalsInSwap",
"type": "bytes1"
}
],
"internalType": "struct IDCAHubSwapHandler.PairInSwap[]",
"name": "pairs",
"type": "tuple[]"
}
],
"internalType": "struct IDCAHubSwapHandler.SwapInfo",
"name": "",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "governor",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IDCAHub",
"name": "_hub",
"type": "address"
},
{
"internalType": "uint256",
"name": "_positionId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
},
{
"internalType": "uint32",
"name": "_newSwaps",
"type": "uint32"
}
],
"name": "increasePosition",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IDCAHub",
"name": "_hub",
"type": "address"
},
{
"internalType": "uint256",
"name": "_positionId",
"type": "uint256"
},
{
"internalType": "uint32",
"name": "_newSwaps",
"type": "uint32"
}
],
"name": "increasePositionWithBalanceOnContract",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_account",
"type": "address"
}
],
"name": "isGovernor",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_account",
"type": "address"
}
],
"name": "isPendingGovernor",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract ILegacyDCAHub",
"name": "_hub",
"type": "address"
},
{
"components": [
{
"internalType": "address",
"name": "tokenA",
"type": "address"
},
{
"internalType": "address",
"name": "tokenB",
"type": "address"
}
],
"internalType": "struct Pair[]",
"name": "_pairs",
"type": "tuple[]"
}
],
"name": "legacyGetNextSwapInfo",
"outputs": [
{
"components": [
{
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "reward",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "toProvide",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "platformFee",
"type": "uint256"
}
],
"internalType": "struct ILegacyDCAHub.TokenInSwap[]",
"name": "tokens",
"type": "tuple[]"
},
{
"components": [
{
"internalType": "address",
"name": "tokenA",
"type": "address"
},
{
"internalType": "address",
"name": "tokenB",
"type": "address"
},
{
"internalType": "uint256",
"name": "ratioAToB",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "ratioBToA",
"type": "uint256"
},
{
"internalType": "bytes1",
"name": "intervalsInSwap",
"type": "bytes1"
}
],
"internalType": "struct ILegacyDCAHub.PairInSwap[]",
"name": "pairs",
"type": "tuple[]"
}
],
"internalType": "struct ILegacyDCAHub.SwapInfo",
"name": "",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IDCAPermissionManager",
"name": "_permissionManager",
"type": "address"
},
{
"components": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"components": [
{
"internalType": "address",
"name": "operator",
"type": "address"
},
{
"internalType": "enum IDCAPermissionManager.Permission[]",
"name": "permissions",
"type": "uint8[]"
}
],
"internalType": "struct IDCAPermissionManager.PermissionSet[]",
"name": "permissionSets",
"type": "tuple[]"
}
],
"internalType": "struct IDCAPermissionManager.PositionPermissions[]",
"name": "_permissions",
"type": "tuple[]"
},
{
"internalType": "uint256",
"name": "_deadline",
"type": "uint256"
},
{
"internalType": "uint8",
"name": "_v",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "_r",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "_s",
"type": "bytes32"
}
],
"name": "multiPermissionPermit",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes[]",
"name": "_data",
"type": "bytes[]"
}
],
"name": "multicall",
"outputs": [
{
"internalType": "bytes[]",
"name": "_results",
"type": "bytes[]"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "pendingGovernor",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IDCAPermissionManager",
"name": "_permissionManager",
"type": "address"
},
{
"components": [
{
"internalType": "address",
"name": "operator",
"type": "address"
},
{
"internalType": "enum IDCAPermissionManager.Permission[]",
"name": "permissions",
"type": "uint8[]"
}
],
"internalType": "struct IDCAPermissionManager.PermissionSet[]",
"name": "_permissions",
"type": "tuple[]"
},
{
"internalType": "uint256",
"name": "_tokenId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_deadline",
"type": "uint256"
},
{
"internalType": "uint8",
"name": "_v",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "_r",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "_s",
"type": "bytes32"
}
],
"name": "permissionPermit",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_token",
"type": "address"
},
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_nonce",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_deadline",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "_signature",
"type": "bytes"
},
{
"internalType": "address",
"name": "_recipient",
"type": "address"
}
],
"name": "permitTakeFromCaller",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IDCAHub",
"name": "_hub",
"type": "address"
},
{
"internalType": "uint256",
"name": "_positionId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
},
{
"internalType": "uint32",
"name": "_newSwaps",
"type": "uint32"
},
{
"internalType": "address",
"name": "_recipient",
"type": "address"
}
],
"name": "reducePosition",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "contract IERC20[]",
"name": "tokens",
"type": "address[]"
}
],
"internalType": "struct ISwapAdapter.RevokeAction[]",
"name": "_revokeActions",
"type": "tuple[]"
}
],
"name": "revokeAllowances",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_allowanceToken",
"type": "address"
},
{
"internalType": "uint256",
"name": "_value",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "_swapData",
"type": "bytes"
},
{
"internalType": "address",
"name": "_tokenOut",
"type": "address"
},
{
"internalType": "uint256",
"name": "_minTokenOut",
"type": "uint256"
}
],
"name": "runSwap",
"outputs": [
{
"internalType": "uint256",
"name": "_amountOut",
"type": "uint256"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IDCAHub",
"name": "_hub",
"type": "address"
},
{
"components": [
{
"internalType": "address",
"name": "tokenA",
"type": "address"
},
{
"internalType": "address",
"name": "tokenB",
"type": "address"
}
],
"internalType": "struct Pair[]",
"name": "_pairs",
"type": "tuple[]"
},
{
"internalType": "bool",
"name": "_calculatePrivilegedAvailability",
"type": "bool"
}
],
"name": "secondsUntilNextSwap",
"outputs": [
{
"internalType": "uint256[]",
"name": "",
"type": "uint256[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_token",
"type": "address"
},
{
"internalType": "address",
"name": "_recipient",
"type": "address"
}
],
"name": "sendBalanceOnContractToRecipient",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_token",
"type": "address"
},
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
},
{
"internalType": "address",
"name": "_recipient",
"type": "address"
}
],
"name": "sendToRecipient",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_pendingGovernor",
"type": "address"
}
],
"name": "setPendingGovernor",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_newSwapper",
"type": "address"
},
{
"internalType": "address",
"name": "_newAllowanceTarget",
"type": "address"
}
],
"name": "setSwapper",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes[]",
"name": "_calls",
"type": "bytes[]"
}
],
"name": "simulate",
"outputs": [
{
"components": [
{
"internalType": "bool",
"name": "success",
"type": "bool"
},
{
"internalType": "bytes",
"name": "result",
"type": "bytes"
},
{
"internalType": "uint256",
"name": "gasSpent",
"type": "uint256"
}
],
"internalType": "struct ISimulationAdapter.SimulationResult[]",
"name": "_results",
"type": "tuple[]"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes",
"name": "_call",
"type": "bytes"
}
],
"name": "simulateAndRevert",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes4",
"name": "_interfaceId",
"type": "bytes4"
}
],
"name": "supportsInterface",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "swapper",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IERC20",
"name": "_token",
"type": "address"
},
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
},
{
"internalType": "address",
"name": "_recipient",
"type": "address"
}
],
"name": "takeFromCaller",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IDCAHub",
"name": "_hub",
"type": "address"
},
{
"internalType": "uint256",
"name": "_positionId",
"type": "uint256"
},
{
"internalType": "address",
"name": "_recipientUnswapped",
"type": "address"
},
{
"internalType": "address",
"name": "_recipientSwapped",
"type": "address"
}
],
"name": "terminate",
"outputs": [
{
"internalType": "uint256",
"name": "_unswapped",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_swapped",
"type": "uint256"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IDCAHub",
"name": "_hub",
"type": "address"
},
{
"internalType": "uint256",
"name": "_positionId",
"type": "uint256"
},
{
"internalType": "address",
"name": "_recipient",
"type": "address"
}
],
"name": "withdrawSwapped",
"outputs": [
{
"internalType": "uint256",
"name": "_swapped",
"type": "uint256"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IDCAHub",
"name": "_hub",
"type": "address"
},
{
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256[]",
"name": "positionIds",
"type": "uint256[]"
}
],
"internalType": "struct IDCAHubPositionHandler.PositionSet[]",
"name": "_positions",
"type": "tuple[]"
},
{
"internalType": "address",
"name": "_recipient",
"type": "address"
}
],
"name": "withdrawSwappedMany",
"outputs": [
{
"internalType": "uint256[]",
"name": "_withdrawn",
"type": "uint256[]"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"stateMutability": "payable",
"type": "receive"
}
],
"bytecode": "0x60c06040523480156200001157600080fd5b5060405162005ca538038062005ca58339810160408190526200003491620000cf565b600160805283838383816001600160a01b038116620000665760405163e6250e3360e01b815260040160405180910390fd5b600080546001600160a01b03199081166001600160a01b0393841617909155600280548216968316969096179095556003805490951693811693909317909355501660a052506200013792505050565b6001600160a01b0381168114620000cc57600080fd5b50565b60008060008060808587031215620000e657600080fd5b8451620000f381620000b6565b60208601519094506200010681620000b6565b60408601519093506200011981620000b6565b60608601519092506200012c81620000b6565b939692955090935050565b60805160a051615b3a6200016b600039600081816104cb015281816112120152611548015260006105520152615b3a6000f3fe6080604052600436106102535760003560e01c806362b850c711610138578063d9a673ef116100b0578063e43581b81161007f578063effca70511610064578063effca7051461066b578063f235757f1461068b578063fa0c9555146106ab57600080fd5b8063e43581b81461061c578063e9c040711461064b57600080fd5b8063d9a673ef146105a7578063db8266de146105ba578063df08aed5146105cd578063e3056a34146105fc57600080fd5b8063910cab1111610107578063b3b48afb116100ec578063b3b48afb14610540578063bb2871a514610574578063bcbef2061461059457600080fd5b8063910cab1114610500578063ac9650d81461052057600080fd5b806362b850c71461049357806362dd9af3146104a65780636afdd850146104b957806389352328146104ed57600080fd5b806337b0c09d116101cb578063484b35771161019a578063585cc6a51161017f578063585cc6a5146104305780635d25d6eb146104585780635f963dcf1461046b57600080fd5b8063484b3577146103d65780635684c2751461040357600080fd5b806337b0c09d1461037d5780633a79d674146103905780633ed242b4146103a357806340c5710c146103c357600080fd5b80631f66925c116102225780632b3297f9116102075780632b3297f91461032a578063340b532f1461034a57806335ac2a501461035d57600080fd5b80631f66925c146102f65780631f8b479d1461031757600080fd5b806301ffc9a71461025f57806305ce20d6146102945780630c340a24146102a957806313f6986d146102e157600080fd5b3661025a57005b600080fd5b34801561026b57600080fd5b5061027f61027a3660046138b7565b6106be565b60405190151581526020015b60405180910390f35b6102a76102a2366004613933565b610757565b005b3480156102b557600080fd5b506000546102c9906001600160a01b031681565b6040516001600160a01b03909116815260200161028b565b3480156102ed57600080fd5b506102a761088b565b610309610304366004613988565b610937565b60405190815260200161028b565b6102a7610325366004613a27565b6109df565b34801561033657600080fd5b506002546102c9906001600160a01b031681565b6102a7610358366004613ab3565b610a30565b61037061036b366004613aec565b610a3e565b60405161028b9190613b49565b6102a761038b366004613988565b610b8d565b6102a761039e366004613988565b610ba7565b6103b66103b1366004613b8d565b610bb2565b60405161028b9190613c54565b6102a76103d1366004613cd4565b610c95565b3480156103e257600080fd5b506103f66103f1366004613da0565b610e18565b60405161028b9190613e37565b34801561040f57600080fd5b5061042361041e366004613f66565b610edf565b60405161028b9190613fbb565b34801561043c57600080fd5b506102c973eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b6103096104663660046140c7565b610f9d565b61047e610479366004614143565b611150565b6040805192835260208301919091520161028b565b6102a76104a136600461418b565b611205565b6102a76104b4366004614222565b611247565b3480156104c557600080fd5b506102c97f000000000000000000000000000000000000000000000000000000000000000081565b6103096104fb3660046142a5565b6112d1565b34801561050c57600080fd5b506003546102c9906001600160a01b031681565b61053361052e366004613b8d565b61137c565b60405161028b9190614386565b34801561054c57600080fd5b506102c97f000000000000000000000000000000000000000000000000000000000000000081565b34801561058057600080fd5b5061037061058f3660046143f9565b61145f565b6102a76105a2366004614456565b611475565b6102a76105b536600461448c565b61153b565b6102a76105c8366004614503565b611574565b3480156105d957600080fd5b5061027f6105e8366004614562565b6001546001600160a01b0391821691161490565b34801561060857600080fd5b506001546102c9906001600160a01b031681565b34801561062857600080fd5b5061027f610637366004614562565b6000546001600160a01b0391821691161490565b34801561065757600080fd5b506102a7610666366004613b8d565b6115e4565b34801561067757600080fd5b506102a7610686366004613ab3565b611632565b34801561069757600080fd5b506102a76106a6366004614562565b6116bc565b6103096106b936600461457f565b61176c565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f3ed242b400000000000000000000000000000000000000000000000000000000148061075157507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b838360006107668383836118b3565b6040517f5b6fd01d000000000000000000000000000000000000000000000000000000008152600481018790526000906001600160a01b03891690635b6fd01d9060240161010060405180830381865afa1580156107c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ec9190614794565b5190506107fa8189886119bb565b6040517fded700a6000000000000000000000000000000000000000000000000000000008152600481018890526024810187905263ffffffff861660448201526001600160a01b0389169063ded700a6906064015b600060405180830381600087803b15801561086957600080fd5b505af115801561087d573d6000803e3d6000fd5b505050505050505050505050565b6001546001600160a01b031633146108cf576040517f9ba0305d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018054600080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b0384161782559091169091556040517fdc57ca23c46d823853915ed5a090ca0ee9db5eb6a46f5c58e1c9158de861fd769190a1565b6000838360026109488383836118b3565b6040517f17621890000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b0386811660248301528816906317621890906044016020604051808303816000875af11580156109b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d49190614850565b979650505050505050565b6040517f4faa38830000000000000000000000000000000000000000000000000000000081526001600160a01b03891690634faa38839061084f908a908a908a908a908a908a908a90600401614a0a565b610a3a8282611b7b565b5050565b606060005b83811015610af3576000858583818110610a5f57610a5f614a4b565b9050602002810190610a719190614a7a565b610a7f906020810190614ab8565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201829052509394505050505b8151811015610ae957610ae188838381518110610ad257610ad2614a4b565b602002602001015160026118b3565b600101610ab3565b5050600101610a43565b506040517f480b37960000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063480b379690610b3d90879087908790600401614b20565b6000604051808303816000875af1158015610b5c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b849190810190614c38565b95945050505050565b610ba26001600160a01b038416338385611c3c565b505050565b610ba2838383611ced565b60608167ffffffffffffffff811115610bcd57610bcd61466d565b604051908082528060200260200182016040528015610c2457816020015b610c11604051806060016040528060001515815260200160608152602001600081525090565b815260200190600190039081610beb5790505b50905060005b82811015610c8e57610c5e848483818110610c4757610c47614a4b565b9050602002810190610c599190614cc3565b611d55565b828281518110610c7057610c70614a4b565b60200260200101819052508080610c8690614d57565b915050610c2a565b5092915050565b82826000610ca48383836118b3565b6040517f5b6fd01d000000000000000000000000000000000000000000000000000000008152600481018690526000906001600160a01b03881690635b6fd01d9060240161010060405180830381865afa158015610d06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2a9190614794565b516040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610d8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db29190614850565b9050610dbf8289836119bb565b6040517fded700a6000000000000000000000000000000000000000000000000000000008152600481018890526024810182905263ffffffff871660448201526001600160a01b0389169063ded700a69060640161084f565b6040805180820190915260608082526020820152600080610e398888611ed5565b6040517f4997cdc300000000000000000000000000000000000000000000000000000000815291935091506001600160a01b038a1690634997cdc390610e8b90859085908b908b908b90600401614e22565b600060405180830381865afa158015610ea8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ed09190810190614f52565b925050505b9695505050505050565b6040805180820190915260608082526020820152600080610f008585611ed5565b6040517fd2d95b2d00000000000000000000000000000000000000000000000000000000815291935091506001600160a01b0387169063d2d95b2d90610f4c90859085906004016150bd565b600060405180830381865afa158015610f69573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f9191908101906150e2565b925050505b9392505050565b60006001600160a01b03871615611041576003546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260001960248201529088169063095ea7b3906044016020604051808303816000875af115801561101b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103f9190615226565b505b600254611059906001600160a01b0316868689611f36565b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611103576040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa1580156110da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fe9190614850565b611105565b475b905081811015610ed5576040517f763dfca000000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044015b60405180910390fd5b600080858560036111628383836118b3565b6040517f72ada4c5000000000000000000000000000000000000000000000000000000008152600481018990526001600160a01b03888116602483015287811660448301528a16906372ada4c59060640160408051808303816000875af11580156111d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f59190615243565b909a909950975050505050505050565b61123e6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001688888888888888611f81565b50505050505050565b6040517f3dff05870000000000000000000000000000000000000000000000000000000081526001600160a01b03881690633dff05879061129690899089908990899089908990600401615267565b600060405180830381600087803b1580156112b057600080fd5b505af11580156112c4573d6000803e3d6000fd5b5050505050505050505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009081906001600160a01b038c16906370a0823190602401602060405180830381865afa158015611333573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113579190614850565b905061136c8c8c8c848d8d8d8d8d8d8d61176c565b9c9b505050505050505050505050565b60608167ffffffffffffffff8111156113975761139761466d565b6040519080825280602002602001820160405280156113ca57816020015b60608152602001906001900390816113b55790505b50905060005b82811015610c8e5761143a308585848181106113ee576113ee614a4b565b90506020028101906114009190614cc3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061203b92505050565b82828151811061144c5761144c614a4b565b60209081029190910101526001016113d0565b6060610b8485858585612060565b949350505050565b60005a9050600080306001600160a01b031685856040516114979291906153f6565b600060405180830381855af49150503d80600081146114d2576040519150601f19603f3d011682016040523d82523d6000602084013e6114d7565b606091505b509150915060005a6114e99085615406565b905060405180606001604052808415158152602001838152602001828152506040517f493703af0000000000000000000000000000000000000000000000000000000081526004016111479190615419565b61123e6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001688888888888888612146565b848460016115838383836118b3565b6040517ff1accf39000000000000000000000000000000000000000000000000000000008152600481018890526024810187905263ffffffff861660448201526001600160a01b03858116606483015289169063f1accf399060840161084f565b6000546001600160a01b03163314611628576040517fe0a8b92000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a3a82826121cf565b6000546001600160a01b03163314611676576040517fe0a8b92000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280546001600160a01b039384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560038054929093169116179055565b6000546001600160a01b03163314611700576040517fe0a8b92000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f56bddfa0cee9697cebddf9acd7f23dc6583663b05e007b877056d05017994def9060200160405180910390a150565b60006117798b8d8b6119bb565b81611819576040517f6b29e1bd0000000000000000000000000000000000000000000000000000000081526001600160a01b038d1690636b29e1bd906117d1908e908e908e908e908e908e908e908e9060040161542c565b6020604051808303816000875af11580156117f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118149190614850565b61136c565b6040517fb2b513c10000000000000000000000000000000000000000000000000000000081526001600160a01b038d169063b2b513c190611870908e908e908e908e908e908e908e908e908e908e9060040161548b565b6020604051808303816000875af115801561188f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136c9190614850565b826001600160a01b031663cc7a20496040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119159190615502565b6001600160a01b031663823abfd98333846040518463ffffffff1660e01b81526004016119449392919061551f565b602060405180830381865afa158015611961573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119859190615226565b610ba2576040517f5c427cd900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e90604401602060405180830381865afa158015611a24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a489190614850565b905081811015611b75578015611ae6576040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526000602483015285169063095ea7b3906044016020604051808303816000875af1158015611ac0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae49190615226565b505b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152600019602483015285169063095ea7b3906044016020604051808303816000875af1158015611b4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b739190615226565b505b50505050565b60006001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611c27576040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015611bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c229190614850565b611c29565b475b90508015610ba257610ba2838284611ced565b6040516001600160a01b0380851660248301528316604482015260648101829052611b759085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526122dd565b6001600160a01b038116611cfe5750335b7fffffffffffffffffffffffff11111111111111111111111111111111111111126001600160a01b03841601611d4157610ba26001600160a01b038216836123dc565b610ba26001600160a01b0384168284612529565b611d7b604051806060016040528060001515815260200160608152602001600081525090565b600080306001600160a01b031663bcbef20660e01b8686604051602401611da3929190615542565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611e0e9190615556565b600060405180830381855af49150503d8060008114611e49576040519150601f19603f3d011682016040523d82523d6000602084013e611e4e565b606091505b50915091508115611ebb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5754463f2053686f756c642068617665206661696c65642100000000000000006044820152606401611147565b60048101905080806020019051810190610b849190615568565b606080611f2a84846000604051908082528060200260200182016040528015611f2457816020015b6040805180820190915260008082526020820152815260200190600190039081611efd5790505b50612572565b50909590945092505050565b611b7383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050506001600160a01b038716919050836125f7565b851561203157876001600160a01b031663edd9444b60405180606001604052808a8a808060200260200160405190810160405280939291908181526020016000905b82821015611fef57611fe06040830286013681900381019061563e565b81526020019060010190611fc3565b505050505081526020018881526020018781525061200e8a8a8661261d565b3387876040518663ffffffff1660e01b815260040161084f9594939291906156c5565b5050505050505050565b6060610f968383604051806060016040528060278152602001615ade602791396126f2565b60608267ffffffffffffffff81111561207b5761207b61466d565b6040519080825280602002602001820160405280156120a4578160200160208202803683370190505b50905060005b8381101561213d5761210e868686848181106120c8576120c8614a4b565b6120de9260206040909202019081019150614562565b8787858181106120f0576120f0614a4b565b90506040020160200160208101906121089190614562565b866127f6565b82828151811061212057612120614a4b565b60209081029190910101528061213581614d57565b9150506120aa565b50949350505050565b6040805160a0810182526001600160a01b0389811660608301908152608083018a9052825260208083018990528284018890528351808501855285831681529081018a905292517f30f28b7a000000000000000000000000000000000000000000000000000000008152908b16926330f28b7a9261084f9290919033908990899060040161577c565b60005b81811015610ba25760008383838181106121ee576121ee614a4b565b90506020028101906122009190614a7a565b612209906157f5565b905060005b8160200151518110156122d3578160200151818151811061223157612231614a4b565b602090810291909101015182516040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526000602482015291169063095ea7b3906044016020604051808303816000875af11580156122a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ca9190615226565b5060010161220e565b50506001016121d2565b6000612332826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612b6d9092919063ffffffff16565b805190915015610ba257808060200190518101906123509190615226565b610ba2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420