UNPKG

@ensuro/vaults

Version:

ERC4626s for asset management, used by the Ensuro Protocol

1,752 lines 119 kB
{ "_format": "hh-sol-artifact-1", "contractName": "OutflowLimitedAMMSV", "sourceName": "contracts/OutflowLimitedAMMSV.sol", "abi": [ { "inputs": [ { "internalType": "address", "name": "caller", "type": "address" } ], "name": "AccessManagedUnauthorized", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "target", "type": "address" } ], "name": "AddressEmptyCode", "type": "error" }, { "inputs": [], "name": "CannotRemoveStrategyWithAssets", "type": "error" }, { "inputs": [], "name": "DepositError", "type": "error" }, { "inputs": [ { "internalType": "contract IInvestStrategy", "name": "strategy", "type": "address" } ], "name": "DuplicatedStrategy", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "implementation", "type": "address" } ], "name": "ERC1967InvalidImplementation", "type": "error" }, { "inputs": [], "name": "ERC1967NonPayable", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "allowance", "type": "uint256" }, { "internalType": "uint256", "name": "needed", "type": "uint256" } ], "name": "ERC20InsufficientAllowance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "uint256", "name": "balance", "type": "uint256" }, { "internalType": "uint256", "name": "needed", "type": "uint256" } ], "name": "ERC20InsufficientBalance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "approver", "type": "address" } ], "name": "ERC20InvalidApprover", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "receiver", "type": "address" } ], "name": "ERC20InvalidReceiver", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" } ], "name": "ERC20InvalidSender", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" } ], "name": "ERC20InvalidSpender", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "receiver", "type": "address" }, { "internalType": "uint256", "name": "assets", "type": "uint256" }, { "internalType": "uint256", "name": "max", "type": "uint256" } ], "name": "ERC4626ExceededMaxDeposit", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "receiver", "type": "address" }, { "internalType": "uint256", "name": "shares", "type": "uint256" }, { "internalType": "uint256", "name": "max", "type": "uint256" } ], "name": "ERC4626ExceededMaxMint", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "uint256", "name": "shares", "type": "uint256" }, { "internalType": "uint256", "name": "max", "type": "uint256" } ], "name": "ERC4626ExceededMaxRedeem", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "uint256", "name": "assets", "type": "uint256" }, { "internalType": "uint256", "name": "max", "type": "uint256" } ], "name": "ERC4626ExceededMaxWithdraw", "type": "error" }, { "inputs": [], "name": "FailedCall", "type": "error" }, { "inputs": [], "name": "InvalidInitialization", "type": "error" }, { "inputs": [], "name": "InvalidQueue", "type": "error" }, { "inputs": [ { "internalType": "uint8", "name": "index", "type": "uint8" } ], "name": "InvalidQueueIndexDuplicated", "type": "error" }, { "inputs": [], "name": "InvalidQueueLength", "type": "error" }, { "inputs": [], "name": "InvalidStrategiesLength", "type": "error" }, { "inputs": [], "name": "InvalidStrategy", "type": "error" }, { "inputs": [], "name": "InvalidStrategyAsset", "type": "error" }, { "inputs": [ { "internalType": "uint8", "name": "index", "type": "uint8" } ], "name": "InvalidStrategyInDepositQueue", "type": "error" }, { "inputs": [ { "internalType": "uint8", "name": "index", "type": "uint8" } ], "name": "InvalidStrategyInWithdrawQueue", "type": "error" }, { "inputs": [ { "internalType": "int256", "name": "assetsDelta", "type": "int256" }, { "internalType": "uint256", "name": "limit", "type": "uint256" } ], "name": "LimitReached", "type": "error" }, { "inputs": [], "name": "NotInitializing", "type": "error" }, { "inputs": [], "name": "OnlyStrategyStorageExposed", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "max", "type": "uint256" } ], "name": "RebalanceAmountExceedsMaxDeposit", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "max", "type": "uint256" } ], "name": "RebalanceAmountExceedsMaxWithdraw", "type": "error" }, { "inputs": [ { "internalType": "uint8", "name": "bits", "type": "uint8" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "SafeCastOverflowedUintDowncast", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "SafeCastOverflowedUintToInt", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "token", "type": "address" } ], "name": "SafeERC20FailedOperation", "type": "error" }, { "inputs": [], "name": "UUPSUnauthorizedCallContext", "type": "error" }, { "inputs": [ { "internalType": "bytes32", "name": "slot", "type": "bytes32" } ], "name": "UUPSUnsupportedProxiableUUID", "type": "error" }, { "inputs": [], "name": "WithdrawError", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "OutflowLimitedAMMSV.SlotIndex", "name": "slot", "type": "uint256" }, { "indexed": false, "internalType": "int256", "name": "oldDelta", "type": "int256" }, { "indexed": false, "internalType": "int256", "name": "newDelta", "type": "int256" } ], "name": "DeltaManuallySet", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "assets", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "shares", "type": "uint256" } ], "name": "Deposit", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "bytes", "name": "reason", "type": "bytes" } ], "name": "DepositFailed", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "bytes", "name": "reason", "type": "bytes" } ], "name": "DepositFailed", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint8[]", "name": "queue", "type": "uint8[]" } ], "name": "DepositQueueChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "bytes", "name": "reason", "type": "bytes" } ], "name": "DisconnectFailed", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "bytes", "name": "reason", "type": "bytes" } ], "name": "DisconnectFailed", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint64", "name": "version", "type": "uint64" } ], "name": "Initialized", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "slotSize", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "newLimit", "type": "uint256" } ], "name": "LimitChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "contract IInvestStrategy", "name": "strategyFrom", "type": "address" }, { "indexed": true, "internalType": "contract IInvestStrategy", "name": "strategyTo", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "Rebalance", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "contract IInvestStrategy", "name": "strategy", "type": "address" }, { "indexed": false, "internalType": "uint8", "name": "index", "type": "uint8" } ], "name": "StrategyAdded", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "contract IInvestStrategy", "name": "oldStrategy", "type": "address" }, { "indexed": false, "internalType": "contract IInvestStrategy", "name": "newStrategy", "type": "address" } ], "name": "StrategyChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "contract IInvestStrategy", "name": "oldStrategy", "type": "address" }, { "indexed": false, "internalType": "contract IInvestStrategy", "name": "newStrategy", "type": "address" } ], "name": "StrategyChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "contract IInvestStrategy", "name": "strategy", "type": "address" }, { "indexed": false, "internalType": "uint8", "name": "index", "type": "uint8" } ], "name": "StrategyRemoved", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "implementation", "type": "address" } ], "name": "Upgraded", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "address", "name": "receiver", "type": "address" }, { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "assets", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "shares", "type": "uint256" } ], "name": "Withdraw", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "bytes", "name": "reason", "type": "bytes" } ], "name": "WithdrawFailed", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "bytes", "name": "reason", "type": "bytes" } ], "name": "WithdrawFailed", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint8[]", "name": "queue", "type": "uint8[]" } ], "name": "WithdrawQueueChanged", "type": "event" }, { "inputs": [], "name": "MAX_STRATEGIES", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "UPGRADE_INTERFACE_VERSION", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "contract IInvestStrategy", "name": "newStrategy", "type": "address" }, { "internalType": "bytes", "name": "initStrategyData", "type": "bytes" } ], "name": "addStrategy", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" } ], "name": "allowance", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "approve", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "asset", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "OutflowLimitedAMMSV.SlotIndex", "name": "slot", "type": "uint256" }, { "internalType": "int256", "name": "deltaChange", "type": "int256" } ], "name": "changeDelta", "outputs": [ { "internalType": "int256", "name": "newDelta", "type": "int256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint8[]", "name": "newDepositQueue_", "type": "uint8[]" } ], "name": "changeDepositQueue", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint8[]", "name": "newWithdrawQueue_", "type": "uint8[]" } ], "name": "changeWithdrawQueue", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "shares", "type": "uint256" } ], "name": "convertToAssets", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "assets", "type": "uint256" } ], "name": "convertToShares", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "decimals", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "assets", "type": "uint256" }, { "internalType": "address", "name": "receiver", "type": "address" } ], "name": "deposit", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "depositQueue", "outputs": [ { "internalType": "uint8[32]", "name": "", "type": "uint8[32]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "assets", "type": "uint256" } ], "name": "depositToStrategies", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint8", "name": "strategyIndex", "type": "uint8" }, { "internalType": "uint8", "name": "method", "type": "uint8" }, { "internalType": "bytes", "name": "extraData", "type": "bytes" } ], "name": "forwardToStrategy", "outputs": [ { "internalType": "bytes", "name": "", "type": "bytes" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "OutflowLimitedAMMSV.SlotIndex", "name": "slot", "type": "uint256" } ], "name": "getAssetsDelta", "outputs": [ { "internalType": "int256", "name": "", "type": "int256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "slot", "type": "bytes32" } ], "name": "getBytesSlot", "outputs": [ { "internalType": "bytes", "name": "", "type": "bytes" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint8", "name": "strategyIndex", "type": "uint8" }, { "internalType": "uint8", "name": "method", "type": "uint8" } ], "name": "getForwardToStrategySelector", "outputs": [ { "internalType": "bytes4", "name": "selector", "type": "bytes4" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getOutflowLimit", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getOutflowLimitSlotSize", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "name_", "type": "string" }, { "internalType": "string", "name": "symbol_", "type": "string" }, { "internalType": "contract IERC20", "name": "asset_", "type": "address" }, { "internalType": "contract IInvestStrategy[]", "name": "strategies_", "type": "address[]" }, { "internalType": "bytes[]", "name": "initStrategyDatas", "type": "bytes[]" }, { "internalType": "uint8[]", "name": "depositQueue_", "type": "uint8[]" }, { "internalType": "uint8[]", "name": "withdrawQueue_", "type": "uint8[]" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "slotSize", "type": "uint256" }, { "internalType": "uint40", "name": "timestamp", "type": "uint40" } ], "name": "makeOutflowSlot", "outputs": [ { "internalType": "OutflowLimitedAMMSV.SlotIndex", "name": "", "type": "uint256" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "maxDeposit", "outputs": [ { "internalType": "uint256", "name": "ret", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "maxMint", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "maxRedeem", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "maxWithdraw", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "shares", "type": "uint256" }, { "internalType": "address", "name": "receiver", "type": "address" } ], "name": "mint", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "assets", "type": "uint256" } ], "name": "previewDeposit", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "shares", "type": "uint256" } ], "name": "previewMint", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "shares", "type": "uint256" } ], "name": "previewRedeem", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "assets", "type": "uint256" } ], "name": "previewWithdraw", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "proxiableUUID", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint8", "name": "strategyFromIdx", "type": "uint8" }, { "internalType": "uint8", "name": "strategyToIdx", "type": "uint8" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "rebalance", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "shares", "type": "uint256" }, { "internalType": "address", "name": "receiver", "type": "address" }, { "internalType": "address", "name": "owner", "type": "address" } ], "name": "redeem", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint8", "name": "strategyIndex", "type": "uint8" }, { "internalType": "bool", "name": "force", "type": "bool" } ], "name": "removeStrategy", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint8", "name": "strategyIndex", "type": "uint8" }, { "internalType": "contract IInvestStrategy", "name": "newStrategy", "type": "address" }, { "internalType": "bytes", "name": "initStrategyData", "type": "bytes" }, { "internalType": "bool", "name": "force", "type": "bool" } ], "name": "replaceStrategy", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "slotSize", "type": "uint256" }, { "internalType": "uint256", "name": "limit", "type": "uint256" } ], "name": "setupOutflowLimit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "strategies", "outputs": [ { "internalType": "contract IInvestStrategy[32]", "name": "", "type": "address[32]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalAssets", "outputs": [ { "internalType": "uint256", "name": "assets", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "transfer", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "transferFrom", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newImplementation", "type": "address" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "upgradeToAndCall", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "assets", "type": "uint256" }, { "internalType": "address", "name": "receiver", "type": "address" }, { "internalType": "address", "name": "owner", "type": "address" } ], "name": "withdraw", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "withdrawQueue", "outputs": [ { "internalType": "uint8[32]", "name": "", "type": "uint8[32]" } ], "stateMutability": "view", "type": "function" } ], "bytecode": "0x60a060405230608052348015610013575f5ffd5b5061001c610021565b6100d3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100715760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b60805161500e6100f95f395f81816127f50152818161281e0152612957015261500e5ff3fe6080604052600436106102a5575f3560e01c80637aeedf2a1161016f578063b460af94116100d8578063d89b074d11610092578063dd62ed3e1161006d578063dd62ed3e14610888578063e682324d146108a7578063ef8b30f7146107da578063f617eecc146108c6575f5ffd5b8063d89b074d14610818578063d905777e14610848578063d9f9027f14610867575f5ffd5b8063b460af941461075e578063ba0876521461077d578063bd577eb61461079c578063c63d75b6146107bb578063c6e6f592146107da578063ce96cb77146107f9575f5ffd5b806395d89b411161012957806395d89b411461069e57806396da35da146106b2578063a7ded2ea146106d1578063a9059cbb146106f0578063ad3cb1cc1461070f578063b3d7f6b91461073f575f5ffd5b80637aeedf2a146105a05780638cdf48a8146105bf5780638eef8380146105f7578063914abf4f1461061657806392ce412e1461063557806394bf804d1461067f575f5ffd5b8063402d267d1161021157806351a2d6d1116101cb57806351a2d6d1146104fa57806352d1902d1461051b5780636e553f651461052f57806370a082311461054e578063767f06ae1461056d5780637ac445a714610581575f5ffd5b8063402d267d1461046b5780634614b8961461048a57806347e57533146104a95780634cdad506146102f15780634f1ef286146104c8578063508a0538146104db575f5ffd5b806318160ddd1161026257806318160ddd1461037f57806323b872dd146103b25780632e6863da146103d1578063313ce567146103fa57806338d52e0f146104205780633aaf90481461044c575f5ffd5b806301e1d114146102a957806306fdde03146102d057806307a2d13a146102f1578063095ea7b3146103105780630a28a4771461033f5780630a6045841461035e575b5f5ffd5b3480156102b4575f5ffd5b506102bd6108da565b6040519081526020015b60405180910390f35b3480156102db575f5ffd5b506102e46108e8565b6040516102c791906143a1565b3480156102fc575f5ffd5b506102bd61030b3660046143b3565b6109a8565b34801561031b575f5ffd5b5061032f61032a3660046143de565b6109b9565b60405190151581526020016102c7565b34801561034a575f5ffd5b506102bd6103593660046143b3565b6109d0565b348015610369575f5ffd5b5061037d610378366004614408565b6109dc565b005b34801561038a575f5ffd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546102bd565b3480156103bd575f5ffd5b5061032f6103cc366004614428565b610a77565b3480156103dc575f5ffd5b505f516020614f795f395f51905f52546001600160801b03166102bd565b348015610405575f5ffd5b5061040e610a9c565b60405160ff90911681526020016102c7565b34801561042b575f5ffd5b50610434610ade565b6040516001600160a01b0390911681526020016102c7565b348015610457575f5ffd5b506102e4610466366004614530565b610b0c565b348015610476575f5ffd5b506102bd610485366004614589565b610b91565b348015610495575f5ffd5b5061037d6104a43660046143b3565b610b9a565b3480156104b4575f5ffd5b506102e46104c33660046143b3565b610ba6565b61037d6104d63660046145a4565b610d26565b3480156104e6575f5ffd5b506102bd6104f5366004614408565b610d3c565b348015610505575f5ffd5b5061050e610dc9565b6040516102c791906145f0565b348015610526575f5ffd5b506102bd610e21565b34801561053a575f5ffd5b506102bd610549366004614624565b610e3c565b348015610559575f5ffd5b506102bd610568366004614589565b610e99565b348015610578575f5ffd5b5061040e602081565b34801561058c575f5ffd5b5061037d61059b36600461465f565b610ebf565b3480156105ab575f5ffd5b5061037d6105ba3660046145a4565b610ff8565b3480156105ca575f5ffd5b506105de6105d93660046146cd565b6111fd565b6040516001600160e01b031990911681526020016102c7565b348015610602575f5ffd5b506102bd6106113660046146fe565b61125b565b348015610621575f5ffd5b5061037d6106303660046147bd565b61127b565b348015610640575f5ffd5b506102bd61064f3660046143b3565b5f9081527fa2ada5d673dba5eecea7c7503ee87e29913d0d36ae093e950d632f7b86891f01602052604090205490565b34801561068a575f5ffd5b506102bd610699366004614624565b6114cd565b3480156106a9575f5ffd5b506102e4611519565b3480156106bd575f5ffd5b5061037d6106cc3660046147ee565b611557565b3480156106dc575f5ffd5b5061037d6106eb366004614905565b611b6e565b3480156106fb575f5ffd5b5061032f61070a3660046143de565b611c71565b34801561071a575f5ffd5b506102e4604051806040016040528060058152602001640352e302e360dc1b81525081565b34801561074a575f5ffd5b506102bd6107593660046143b3565b611c7e565b348015610769575f5ffd5b506102bd610778366004614a1c565b611c8a565b348015610788575f5ffd5b506102bd610797366004614a1c565b611cd7565b3480156107a7575f5ffd5b5061037d6107b63660046147bd565b611d24565b3480156107c6575f5ffd5b506102bd6107d5366004614589565b611f70565b3480156107e5575f5ffd5b506102bd6107f43660046143b3565b611f9c565b348015610804575f5ffd5b506102bd610813366004614589565b611fa7565b348015610823575f5ffd5b505f516020614f795f395f51905f5254600160801b90046001600160801b03166102bd565b348015610853575f5ffd5b506102bd610862366004614589565b611fbd565b348015610872575f5ffd5b5061087b612002565b6040516102c79190614a5b565b348015610893575f5ffd5b506102bd6108a2366004614a8c565b612048565b3480156108b2575f5ffd5b506102bd6108c1366004614ab8565b612091565b3480156108d1575f5ffd5b5061050e612281565b5f6108e36122bc565b905090565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f516020614f995f395f51905f529161092690614ae1565b80601f016020809104026020016040519081016040528092919081815260200182805461095290614ae1565b801561099d5780601f106109745761010080835404028352916020019161099d565b820191905f5260205f20905b81548152906001019060200180831161098057829003601f168201915b505050505091505090565b5f6109b3825f612337565b92915050565b5f336109c681858561238e565b5060019392505050565b5f6109b38260016123a0565b5f516020614f795f395f51905f526109f3826123ee565b81546001600160801b03918216600160801b029116178155610a14836123ee565b81546fffffffffffffffffffffffffffffffff19166001600160801b039190911617815560408051848152602081018490527fb60cc7dc67f7eca3662ae255cd7c76bb80b4229692532f6af8851a2a119e6b8591015b60405180910390a1505050565b5f33610a84858285612421565b610a8f858585612472565b60019150505b9392505050565b5f807f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e0090505f8154610ad89190600160a01b900460ff16614b2d565b91505090565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00546001600160a01b031690565b6060610b198484846124cf565b5f60028560ff1660208110610b3057610b30614b46565b01546001600160a01b0316905080610b5b57604051632711b74d60e11b815260040160405180910390fd5b610b88848460028860ff1660208110610b7657610b76614b46565b01546001600160a01b031691906125ed565b95945050505050565b5f6109b361263f565b610ba3816126d3565b50565b60605f5b5f60028260208110610bbe57610bbe614b46565b01546001600160a01b031614801590610bd75750602081105b15610d0c5760028160208110610bef57610bef614b46565b015f9054906101000a90046001600160a01b03166001600160a01b0316635b9a4c356040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c3e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c629190614b5a565b8303610cfc57825483908190610c7790614ae1565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca390614ae1565b8015610cee5780601f10610cc557610100808354040283529160200191610cee565b820191905f5260205f20905b815481529060010190602001808311610cd157829003601f168201915b505050505092505050919050565b610d0581614b71565b9050610baa565b5060405163213109dd60e11b815260040160405180910390fd5b610d2e6127ea565b610d388282612890565b5050565b5f8281527fa2ada5d673dba5eecea7c7503ee87e29913d0d36ae093e950d632f7b86891f0160205260408120805490839083610d788385614b89565b918290555060408051878152602081018590529081018290529093507f177df7ef9e6eced78bb1837ddf81f055288f88e41ca91a74d394b2c8f0660ff2915060600160405180910390a15092915050565b610dd1614354565b6040805161040081019182905290600190602090825f855b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610de95790505050505050905090565b5f610e2a61294c565b505f516020614fb95f395f51905f5290565b5f5f610e4783610b91565b905080841115610e7957828482604051633c8097d960e11b8152600401610e7093929190614bb0565b60405180910390fd5b5f610e8385611f9c565b9050610e9133858784612995565b949350505050565b6001600160a01b03165f9081525f516020614f995f395f51905f52602052604090205490565b5f60028560ff1660208110610ed657610ed6614b46565b01546001600160a01b0316905080610f0157604051632711b74d60e11b815260040160405180910390fd5b5f5b602081108015610f3057505f60028260208110610f2257610f22614b46565b01546001600160a01b031614155b15610fa657846001600160a01b031660028260208110610f5257610f52614b46565b01546001600160a01b0316148015610f6d57508560ff168114155b15610f965760405163b5a9314f60e01b81526001600160a01b0386166004820152602401610e70565b610f9f81614b71565b9050610f03565b50610fbb818585610fb56129f9565b86612a02565b8360028660ff1660208110610fd257610fd2614b46565b0180546001600160a01b0319166001600160a01b03929092169190911790555050505050565b6001600160a01b03821661101f57604051632711b74d60e11b815260040160405180910390fd5b5f5b60208110801561104e57505f6002826020811061104057611040614b46565b01546001600160a01b031614155b156110b457826001600160a01b03166002826020811061107057611070614b46565b01546001600160a01b0316036110a45760405163b5a9314f60e01b81526001600160a01b0384166004820152602401610e70565b6110ad81614b71565b9050611021565b601f1981016110d957604051600162ad1fab60e01b0319815260040160405180910390fd5b82600282602081106110ed576110ed614b46565b0180546001600160a01b0319166001600160a01b0392909216919091179055611117816001614bd1565b5f826020811061112957611129614b46565b602091828204019190066101000a81548160ff021916908360ff1602179055508060016111569190614bd1565b6001826020811061116957611169614b46565b602091828204019190066101000a81548160ff021916908360ff1602179055506111a46111946129f9565b6001600160a01b03851690612b50565b6111b76001600160a01b03841683612be2565b60405160ff821681526001600160a01b038416907f4973f7978f2b1810531aed51dc15a8e446cb3191afcca470f8ce464af7494f589060200160405180910390a2505050565b5f5f60028460ff166020811061121557611215614b46565b0154604080516001600160a01b039092166020830181905260ff8616918301919091529150610e9190606001604051602081830303815290604052805160209091012090565b5f61126d8364ffffffffff8416614bf8565b610a9590608085901b614bd1565b611283614354565b81515f90602010156112a85760405163a29b1f1160e01b815260040160405180910390fd5b825181101561145357602060ff168382815181106112c8576112c8614b46565b602002602001015160ff1610158061132157505f6001600160a01b031660028483815181106112f9576112f9614b46565b602002602001015160ff166020811061131457611314614b46565b01546001600160a01b0316145b1561133f5760405163a29b1f1160e01b815260040160405180910390fd5b8183828151811061135257611352614b46565b602002602001015160ff166020811061136d5761136d614b46565b6020020151156113b45782818151811061138957611389614b46565b602002602001015160405163c41fdbb960e01b8152600401610e70919060ff91909116815260200190565b6001828483815181106113c9576113c9614b46565b602002602001015160ff16602081106113e4576113e4614b46565b91151560209092020152825183908290811061140257611402614b46565b602002602001015160016114169190614b2d565b5f826020811061142857611428614b46565b602091828204019190066101000a81548160ff021916908360ff1602179055508060010190506112a8565b60208110801561148057505f6002826020811061147257611472614b46565b01546001600160a01b031614155b1561149e57604051636712b27b60e01b815260040160405180910390fd5b7f193fc4e628c27ae3ca098952dfc16a40425b44e7b0a97f4cc59d0f267f47caec83604051610a6a9190614c0b565b5f5f6114d883611f70565b9050808411156115015782848260405163284ff66760e01b8152600401610e7093929190614bb0565b5f61150b85611c7e565b9050610e9133858388612995565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f516020614f995f395f51905f529161092690614ae1565b602060ff83161061157b57604051632711b74d60e11b815260040160405180910390fd5b5f60028360ff166020811061159257611592614b46565b01546001600160a01b03169050806115bd57604051632711b74d60e11b815260040160405180910390fd5b811580156115db57506115d8816001600160a01b0316612c30565b15155b156115f9576040516343c2dfef60e01b815260040160405180910390fd5b60ff831615801561161357506003546001600160a01b0316155b1561163457604051600162ad1fab60e01b0319815260040160405180910390fd5b5f611640846001614b2d565b60ff1690505b60208110801561167357505f6002826020811061166557611665614b46565b01546001600160a01b031614155b156116e2576002816020811061168b5761168b614b46565b01546001600160a01b031660026116a3600184614c50565b602081106116b3576116b3614b46565b0180546001600160a01b0319166001600160a01b03929092169190911790556116db81614b71565b9050611646565b5f60026116f0600184614c50565b6020811061170057611700614b46565b0180546001600160a01b0319166001600160a01b0392909216919091179055505f80805b6001836020811061173757611737614b46565b602081049091015460ff601f9092166101000a9004161580159061175b5750602083105b15611a8d57801561181f57611771866001614b2d565b60ff166001846020811061178757611787614b46565b602081049091015460ff601f9092166101000a900416116117a8575f6117ab565b60015b600184602081106117be576117be614b46565b602091828204019190069054906101000a900460ff166117de9190614c63565b60016117ea8186614c50565b602081106117fa576117fa614b46565b602091828204019190066101000a81548160ff021916908360ff1602179055506118f0565b61182a866001614b2d565b60ff166001846020811061184057611840614b46565b602081049091015460ff601f9092166101000a90041603611863575060016118f0565b61186e866001614b2d565b60ff166001846020811061188457611884614b46565b602081049091015460ff601f9092166101000a90041611156118f05760018084602081106118b4576118b4614b46565b602091828204019190068282829054906101000a900460ff166118d79190614c63565b92506101000a81548160ff021916908360ff1602179055505b81156119ad57611901866001614b2d565b60ff165f846020811061191657611916614b46565b602081049091015460ff601f9092166101000a90041611611937575f61193a565b60015b5f846020811061194c5761194c614b46565b602091828204019190069054906101000a900460ff1661196c9190614c63565b5f611978600186614c50565b6020811061198857611988614b46565b602091828204019190066101000a81548160ff021916908360ff160217905550611a7d565b6119b8866001614b2d565b60ff165f84602081106119cd576119cd614b46565b602081049091015460ff601f