UNPKG

@mean-finance/dca-v2-periphery

Version:

💱 Periphery smart contracts of DCA V2 by mean.finance

1,319 lines • 125 kB
{ "_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