UNPKG

@ensuro/vaults

Version:

ERC4626s for asset management, used by the Ensuro Protocol

1,559 lines 109 kB
{ "_format": "hh-sol-artifact-1", "contractName": "AccessManagedMSV", "sourceName": "contracts/AccessManagedMSV.sol", "abi": [ { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, { "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": [], "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": "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": 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": 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": "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": "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": [ { "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": "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": [], "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": "0x60a060405230608052348015610013575f5ffd5b5061001c610021565b6100d3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100715760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051614aa36100f95f395f81816125360152818161255f01526126980152614aa35ff3fe608060405260043610610254575f3560e01c80637aeedf2a1161013f578063ba087652116100b3578063d905777e11610078578063d905777e146106f7578063d9f9027f14610716578063dd62ed3e14610737578063e682324d14610756578063ef8b30f7146106b9578063f617eecc14610775575f5ffd5b8063ba0876521461065c578063bd577eb61461067b578063c63d75b61461069a578063c6e6f592146106b9578063ce96cb77146106d8575f5ffd5b806396da35da1161010457806396da35da14610591578063a7ded2ea146105b0578063a9059cbb146105cf578063ad3cb1cc146105ee578063b3d7f6b91461061e578063b460af941461063d575f5ffd5b80637aeedf2a146104e85780638cdf48a814610507578063914abf4f1461053f57806394bf804d1461055e57806395d89b411461057d575f5ffd5b8063402d267d116101d657806351a2d6d11161019b57806351a2d6d11461044257806352d1902d146104635780636e553f651461047757806370a0823114610496578063767f06ae146104b55780637ac445a7146104c9575f5ffd5b8063402d267d146103d05780634614b896146103ef57806347e57533146104105780634cdad506146102a05780634f1ef2861461042f575f5ffd5b806318160ddd1161021c57806318160ddd1461030d57806323b872dd14610340578063313ce5671461035f57806338d52e0f146103855780633aaf9048146103b1575f5ffd5b806301e1d1141461025857806306fdde031461027f57806307a2d13a146102a0578063095ea7b3146102bf5780630a28a477146102ee575b5f5ffd5b348015610263575f5ffd5b5061026c610789565b6040519081526020015b60405180910390f35b34801561028a575f5ffd5b50610293610797565b6040516102769190613f09565b3480156102ab575f5ffd5b5061026c6102ba366004613f1b565b610857565b3480156102ca575f5ffd5b506102de6102d9366004613f46565b610868565b6040519015158152602001610276565b3480156102f9575f5ffd5b5061026c610308366004613f1b565b61087f565b348015610318575f5ffd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025461026c565b34801561034b575f5ffd5b506102de61035a366004613f70565b61088b565b34801561036a575f5ffd5b506103736108b0565b60405160ff9091168152602001610276565b348015610390575f5ffd5b506103996108f2565b6040516001600160a01b039091168152602001610276565b3480156103bc575f5ffd5b506102936103cb366004614078565b610920565b3480156103db575f5ffd5b5061026c6103ea3660046140d1565b6109a5565b3480156103fa575f5ffd5b5061040e610409366004613f1b565b6109ae565b005b34801561041b575f5ffd5b5061029361042a366004613f1b565b6109ba565b61040e61043d3660046140ec565b610b3a565b34801561044d575f5ffd5b50610456610b50565b6040516102769190614138565b34801561046e575f5ffd5b5061026c610ba8565b348015610482575f5ffd5b5061026c61049136600461416c565b610bc3565b3480156104a1575f5ffd5b5061026c6104b03660046140d1565b610c20565b3480156104c0575f5ffd5b50610373602081565b3480156104d4575f5ffd5b5061040e6104e33660046141a7565b610c46565b3480156104f3575f5ffd5b5061040e6105023660046140ec565b610d7f565b348015610512575f5ffd5b50610526610521366004614215565b610f84565b6040516001600160e01b03199091168152602001610276565b34801561054a575f5ffd5b5061040e6105593660046142d9565b610fe2565b348015610569575f5ffd5b5061026c61057836600461416c565b611241565b348015610588575f5ffd5b5061029361128d565b34801561059c575f5ffd5b5061040e6105ab36600461430a565b6112cb565b3480156105bb575f5ffd5b5061040e6105ca366004614421565b6118e2565b3480156105da575f5ffd5b506102de6105e9366004613f46565b6119e5565b3480156105f9575f5ffd5b50610293604051806040016040528060058152602001640352e302e360dc1b81525081565b348015610629575f5ffd5b5061026c610638366004613f1b565b6119f2565b348015610648575f5ffd5b5061026c610657366004614538565b6119fe565b348015610667575f5ffd5b5061026c610676366004614538565b611a4b565b348015610686575f5ffd5b5061040e6106953660046142d9565b611a98565b3480156106a5575f5ffd5b5061026c6106b43660046140d1565b611ce4565b3480156106c4575f5ffd5b5061026c6106d3366004613f1b565b611d10565b3480156106e3575f5ffd5b5061026c6106f23660046140d1565b611d1b565b348015610702575f5ffd5b5061026c6107113660046140d1565b611d31565b348015610721575f5ffd5b5061072a611d76565b6040516102769190614577565b348015610742575f5ffd5b5061026c6107513660046145a8565b611dbc565b348015610761575f5ffd5b5061026c6107703660046145d4565b611e05565b348015610780575f5ffd5b50610456611ff5565b5f610792612030565b905090565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f516020614a2e5f395f51905f52916107d5906145fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610801906145fd565b801561084c5780601f106108235761010080835404028352916020019161084c565b820191905f5260205f20905b81548152906001019060200180831161082f57829003601f168201915b505050505091505090565b5f610862825f6120ab565b92915050565b5f33610875818585612102565b5060019392505050565b5f610862826001612114565b5f33610898858285612162565b6108a38585856121b3565b60019150505b9392505050565b5f807f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e0090505f81546108ec9190600160a01b900460ff16614649565b91505090565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00546001600160a01b031690565b606061092d848484612210565b5f60028560ff166020811061094457610944614662565b01546001600160a01b031690508061096f57604051632711b74d60e11b815260040160405180910390fd5b61099c848460028860ff166020811061098a5761098a614662565b01546001600160a01b0316919061232e565b95945050505050565b5f610862612380565b6109b781612414565b50565b60605f5b5f600282602081106109d2576109d2614662565b01546001600160a01b0316148015906109eb5750602081105b15610b205760028160208110610a0357610a03614662565b015f9054906101000a90046001600160a01b03166001600160a01b0316635b9a4c356040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a52573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a769190614676565b8303610b1057825483908190610a8b906145fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab7906145fd565b8015610b025780601f10610ad957610100808354040283529160200191610b02565b820191905f5260205f20905b815481529060010190602001808311610ae557829003601f168201915b505050505092505050919050565b610b198161468d565b90506109be565b5060405163213109dd60e11b815260040160405180910390fd5b610b4261252b565b610b4c82826125d1565b5050565b610b58613ebc565b6040805161040081019182905290600190602090825f855b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610b705790505050505050905090565b5f610bb161268d565b505f516020614a4e5f395f51905f5290565b5f5f610bce836109a5565b905080841115610c0057828482604051633c8097d960e11b8152600401610bf7939291906146a5565b60405180910390fd5b5f610c0a85611d10565b9050610c18338587846126d6565b949350505050565b6001600160a01b03165f9081525f516020614a2e5f395f51905f52602052604090205490565b5f60028560ff1660208110610c5d57610c5d614662565b01546001600160a01b0316905080610c8857604051632711b74d60e11b815260040160405180910390fd5b5f5b602081108015610cb757505f60028260208110610ca957610ca9614662565b01546001600160a01b031614155b15610d2d57846001600160a01b031660028260208110610cd957610cd9614662565b01546001600160a01b0316148015610cf457508560ff168114155b15610d1d5760405163b5a9314f60e01b81526001600160a01b0386166004820152602401610bf7565b610d268161468d565b9050610c8a565b50610d42818585610d3c6126eb565b866126f4565b8360028660ff1660208110610d5957610d59614662565b0180546001600160a01b0319166001600160a01b03929092169190911790555050505050565b6001600160a01b038216610da657604051632711b74d60e11b815260040160405180910390fd5b5f5b602081108015610dd557505f60028260208110610dc757610dc7614662565b01546001600160a01b031614155b15610e3b57826001600160a01b031660028260208110610df757610df7614662565b01546001600160a01b031603610e2b5760405163b5a9314f60e01b81526001600160a01b0384166004820152602401610bf7565b610e348161468d565b9050610da8565b601f198101610e6057604051600162ad1fab60e01b0319815260040160405180910390fd5b8260028260208110610e7457610e74614662565b0180546001600160a01b0319166001600160a01b0392909216919091179055610e9e8160016146c6565b5f8260208110610eb057610eb0614662565b602091828204019190066101000a81548160ff021916908360ff160217905550806001610edd91906146c6565b60018260208110610ef057610ef0614662565b602091828204019190066101000a81548160ff021916908360ff160217905550610f2b610f1b6126eb565b6001600160a01b03851690612842565b610f3e6001600160a01b038416836128d4565b60405160ff821681526001600160a01b038416907f4973f7978f2b1810531aed51dc15a8e446cb3191afcca470f8ce464af7494f589060200160405180910390a2505050565b5f5f60028460ff1660208110610f9c57610f9c614662565b0154604080516001600160a01b039092166020830181905260ff8616918301919091529150610c1890606001604051602081830303815290604052805160209091012090565b610fea613ebc565b81515f906020101561100f5760405163a29b1f1160e01b815260040160405180910390fd5b82518110156111ba57602060ff1683828151811061102f5761102f614662565b602002602001015160ff1610158061108857505f6001600160a01b0316600284838151811061106057611060614662565b602002602001015160ff166020811061107b5761107b614662565b01546001600160a01b0316145b156110a65760405163a29b1f1160e01b815260040160405180910390fd5b818382815181106110b9576110b9614662565b602002602001015160ff16602081106110d4576110d4614662565b60200201511561111b578281815181106110f0576110f0614662565b602002602001015160405163c41fdbb960e01b8152600401610bf7919060ff91909116815260200190565b60018284838151811061113057611130614662565b602002602001015160ff166020811061114b5761114b614662565b91151560209092020152825183908290811061116957611169614662565b6020026020010151600161117d9190614649565b5f826020811061118f5761118f614662565b602091828204019190066101000a81548160ff021916908360ff16021790555080600101905061100f565b6020811080156111e757505f600282602081106111d9576111d9614662565b01546001600160a01b031614155b1561120557604051636712b27b60e01b815260040160405180910390fd5b7f193fc4e628c27ae3ca098952dfc16a40425b44e7b0a97f4cc59d0f267f47caec8360405161123491906146d9565b60405180910390a1505050565b5f5f61124c83611ce4565b9050808411156112755782848260405163284ff66760e01b8152600401610bf7939291906146a5565b5f61127f856119f2565b9050610c18338583886126d6565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f516020614a2e5f395f51905f52916107d5906145fd565b602060ff8316106112ef57604051632711b74d60e11b815260040160405180910390fd5b5f60028360ff166020811061130657611306614662565b01546001600160a01b031690508061133157604051632711b74d60e11b815260040160405180910390fd5b8115801561134f575061134c816001600160a01b0316612922565b15155b1561136d576040516343c2dfef60e01b815260040160405180910390fd5b60ff831615801561138757506003546001600160a01b0316155b156113a857604051600162ad1fab60e01b0319815260040160405180910390fd5b5f6113b4846001614649565b60ff1690505b6020811080156113e757505f600282602081106113d9576113d9614662565b01546001600160a01b031614155b1561145657600281602081106113ff576113ff614662565b01546001600160a01b0316600261141760018461471e565b6020811061142757611427614662565b0180546001600160a01b0319166001600160a01b039290921691909117905561144f8161468d565b90506113ba565b5f600261146460018461471e565b6020811061147457611474614662565b0180546001600160a01b0319166001600160a01b0392909216919091179055505f80805b600183602081106114ab576114ab614662565b602081049091015460ff601f9092166101000a900416158015906114cf5750602083105b15611801578015611593576114e5866001614649565b60ff16600184602081106114fb576114fb614662565b602081049091015460ff601f9092166101000a9004161161151c575f61151f565b60015b6001846020811061153257611532614662565b602091828204019190069054906101000a900460ff166115529190614731565b600161155e818661471e565b6020811061156e5761156e614662565b602091828204019190066101000a81548160ff021916908360ff160217905550611664565b61159e866001614649565b60ff16600184602081106115b4576115b4614662565b602081049091015460ff601f9092166101000a900416036115d757506001611664565b6115e2866001614649565b60ff16600184602081106115f8576115f8614662565b602081049091015460ff601f9092166101000a900416111561166457600180846020811061162857611628614662565b602091828204019190068282829054906101000a900460ff1661164b9190614731565b92506101000a81548160ff021916908360ff1602179055505b811561172157611675866001614649565b60ff165f846020811061168a5761168a614662565b602081049091015460ff601f9092166101000a900416116116ab575f6116ae565b60015b5f84602081106116c0576116c0614662565b602091828204019190069054906101000a900460ff166116e09190614731565b5f6116ec60018661471e565b602081106116fc576116fc614662565b602091828204019190066101000a81548160ff021916908360ff1602179055506117f1565b61172c866001614649565b60ff165f846020811061174157611741614662565b602081049091015460ff601f9092166101000a9004160361176557600191506117f1565b611770866001614649565b60ff165f846020811061178557611785614662565b602081049091015460ff601f9092166101000a90041611156117f15760015f84602081106117b5576117b5614662565b602091828204019190068282829054906101000a900460ff166117d89190614731565b92506101000a81548160ff021916908360ff1602179055505b6117fa8361468d565b9250611498565b5f8061180e60018661471e565b6020811061181e5761181e614662565b602091828204019190066101000a81548160ff021916908360ff1602179055505f6001808561184d919061471e565b6020811061185d5761185d614662565b602091828204019190066101000a81548160ff021916908360ff16021790555061189985856001600160a01b031661298b90919063ffffffff16565b60405160ff871681526001600160a01b038516907f978014566e371fef52158b004e150b6e1fd723f5aa3d8c9aa2a7c98ddb0e65b89060200160405180910390a2505050505050565b5f6118eb612ab0565b805490915060ff600160401b82041615906001600160401b03165f811580156119115750825b90505f826001600160401b0316600114801561192c5750303b155b90508115801561193a575080155b156119585760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561198257845460ff60401b1916600160401b1785555b6119918c8c8c8c8c8c8c612ad8565b83156119d757845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b5f336108758185856121b3565b5f6108628260016120ab565b5f5f611a0983611d1b565b905080851115611a3257828582604051633fa733bb60e21b8152600401610bf7939291906146a5565b5f611a3c8661087f565b905061099c3386868985612b08565b5f5f611a5683611d31565b905080851115611a7f57828582604051632e52afbb60e21b8152600401610bf7939291906146a5565b5f611a8986610857565b905061099c338686848a612b08565b611aa0613ebc565b81515f9060201015611ac55760405163a29b1f1160e01b815260040160405180910390fd5b82518160ff161015611c6457602060ff16838260ff1681518110611aeb57611aeb614662565b602002602001015160ff16101580611b4757505f6001600160a01b03166002848360ff1681518110611b1f57611b1f614662565b602002602001015160ff1660208110611b3a57611b3a614662565b01546001600160a01b0316145b15611b655760405163a29b1f1160e01b815260040160405180910390fd5b81838260ff1681518110611b7b57611b7b614662565b602002602001015160ff1660208110611b9657611b96614662565b602002015115611bb557828160ff16815181106110f0576110f0614662565b600182848360ff1681518110611bcd57611bcd614662565b602002602001015160ff1660208110611be857611be8614662565b911515602090920201528251839060ff8316908110611c0957611c09614662565b60200260200101516001611c1d9190614649565b60018260ff1660208110611c3357611c33614662565b602091828204019190066101000a81548160ff021916908360ff16021790555080611c5d9061474a565b9050611ac5565b602060ff8216108015611c9757505f600260ff831660208110611c8957611c89614662565b01546001600160a01b031614155b15611cb557604051636712b27b60e01b815260040160405180910390fd5b7f3c56b6bca0d55eda581f8f2819d1f85d3b91cfcc24914a8fa39d301796d8964c8360405161123491906146d9565b5f5f611cee612380565b90505f198114611d0757611d02815f612114565b6108a9565b5f199392505050565b5f610862825f612114565b5f5f611d2683612b1e565b90506108a981612b2b565b5f5f611d3c83612bc0565b90505f611d49825f6120ab565b90505f611d5582612b2b565b9050818114611d6d57611d68815f612114565b61099c565b50909392505050565b611d7e613ebc565b604080516104008101918290529060029060209082845b81546001600160a01b03168152600190910190602001808311611d95575050505050905090565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f602060ff8516101580611e1d5750602060ff841610155b15611e3b57604051632711b74d60e11b815260040160405180910390fd5b5f60028560ff1660208110611e5257611e52614662565b01546001600160a01b031690505f600260ff861660208110611e7657611e76614662565b01546001600160a01b03908116915082161580611e9a57506001600160a01b038116155b15611eb857604051632711b74d60e11b815260040160405180910390fd5b5f198403611ed557611ed2826001600160a01b0316612922565b93505b835f03611ee6575f925050506108a9565b611ef8826001600160a01b0316612bca565b841115611f2d57611f11826001600160a01b0316612bca565b604051633ce011d560e01b8152600401610bf791815260200190565b611f3f816001600160a01b0316612bf8565b841115611f7457611f58816001600160a01b0316612bf8565b6040516350a3e37560e11b8152600401610bf791815260200190565b611f886001600160a01b038316855f612c26565b50611f9d6001600160a01b038216855f612d62565b50806001600160a01b0316826001600160a01b03167fb0850b8e0f9e8315dde3c9f9f31138283e6bbe16cd29e8552eb1dcdf9fac9e3b86604051611fe391815260200190565b60405180910390a35091949350505050565b611ffd613ebc565b604080516104008101918290525f805460ff1682529091602090826001838601808411610b705790505050505050905090565b5f5f5b5f6002826020811061204757612047614662565b01546001600160a01b0316148015906120605750602081105b156120a75761208b6002826020811061207b5761207b614662565b01546001600160a01b0316612922565b61209590836146c6565b91506120a08161468d565b9050612033565b5090565b5f6108a96120b7610789565b6120c29060016146c6565b6120cd5f600a61484b565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546120f991906146c6565b85919085612e83565b61210f8383836001612ec5565b505050565b5f6108a961212382600a61484b565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025461214f91906146c6565b612157610789565b6120f99060016146c6565b5f61216d8484611dbc565b90505f198110156121ad578181101561219f57828183604051637dc7a0d960e11b8152600401610bf7939291906146a5565b6121ad84848484035f612ec5565b50505050565b6001600160a01b0383166121dc57604051634b637e8f60e11b81525f6004820152602401610bf756