@ensuro/vaults
Version:
ERC4626s for asset management, used by the Ensuro Protocol
1,546 lines • 109 kB
JSON
{
"_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": "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": "0x60a060405230608052348015610013575f5ffd5b5061001c610021565b6100d3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100715760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051614a956100f95f395f81816123bc015281816123e501526125210152614a955ff3fe608060405260043610610249575f3560e01c80638cdf48a811610134578063ba087652116100b3578063d905777e11610078578063d905777e146106d4578063d9f9027f146106f3578063dd62ed3e14610714578063e682324d14610733578063ef8b30f714610696578063f617eecc14610752575f5ffd5b8063ba08765214610639578063bd577eb614610658578063c63d75b614610677578063c6e6f59214610696578063ce96cb77146106b5575f5ffd5b8063a7ded2ea116100f9578063a7ded2ea1461058d578063a9059cbb146105ac578063ad3cb1cc146105cb578063b3d7f6b9146105fb578063b460af941461061a575f5ffd5b80638cdf48a8146104e4578063914abf4f1461051c57806394bf804d1461053b57806395d89b411461055a57806396da35da1461056e575f5ffd5b8063402d267d116101cb57806352d1902d1161019057806352d1902d146104405780636e553f651461045457806370a0823114610473578063767f06ae146104925780637ac445a7146104a65780637aeedf2a146104c5575f5ffd5b8063402d267d146103cc57806347e57533146103eb5780634cdad506146102955780634f1ef2861461040a57806351a2d6d11461041f575f5ffd5b806318160ddd1161021157806318160ddd1461030257806323b872dd14610335578063313ce5671461035457806338d52e0f1461037a5780633aaf9048146103ad575f5ffd5b806301e1d1141461024d57806306fdde031461027457806307a2d13a14610295578063095ea7b3146102b45780630a28a477146102e3575b5f5ffd5b348015610258575f5ffd5b50610261610766565b6040519081526020015b60405180910390f35b34801561027f575f5ffd5b50610288610774565b60405161026b9190613edb565b3480156102a0575f5ffd5b506102616102af366004613eed565b610834565b3480156102bf575f5ffd5b506102d36102ce366004613f18565b610845565b604051901515815260200161026b565b3480156102ee575f5ffd5b506102616102fd366004613eed565b61085c565b34801561030d575f5ffd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610261565b348015610340575f5ffd5b506102d361034f366004613f42565b610868565b34801561035f575f5ffd5b5061036861088d565b60405160ff909116815260200161026b565b348015610385575f5ffd5b505f516020614a405f395f51905f52546040516001600160a01b03909116815260200161026b565b3480156103b8575f5ffd5b506102886103c736600461404a565b6108bc565b3480156103d7575f5ffd5b506102616103e63660046140a3565b610941565b3480156103f6575f5ffd5b50610288610405366004613eed565b61094a565b61041d6104183660046140be565b610aca565b005b34801561042a575f5ffd5b50610433610ae0565b60405161026b919061410a565b34801561044b575f5ffd5b50610261610b38565b34801561045f575f5ffd5b5061026161046e36600461413e565b610b53565b34801561047e575f5ffd5b5061026161048d3660046140a3565b610bb0565b34801561049d575f5ffd5b50610368602081565b3480156104b1575f5ffd5b5061041d6104c0366004614179565b610bd6565b3480156104d0575f5ffd5b5061041d6104df3660046140be565b610d0f565b3480156104ef575f5ffd5b506105036104fe3660046141e7565b610f14565b6040516001600160e01b0319909116815260200161026b565b348015610527575f5ffd5b5061041d6105363660046142ab565b610f73565b348015610546575f5ffd5b5061026161055536600461413e565b6111d2565b348015610565575f5ffd5b5061028861121e565b348015610579575f5ffd5b5061041d6105883660046142dc565b61125c565b348015610598575f5ffd5b5061041d6105a73660046143f3565b611873565b3480156105b7575f5ffd5b506102d36105c6366004613f18565b61198b565b3480156105d6575f5ffd5b50610288604051806040016040528060058152602001640352e302e360dc1b81525081565b348015610606575f5ffd5b50610261610615366004613eed565b611998565b348015610625575f5ffd5b5061026161063436600461450a565b6119a4565b348015610644575f5ffd5b5061026161065336600461450a565b6119f1565b348015610663575f5ffd5b5061041d6106723660046142ab565b611a3e565b348015610682575f5ffd5b506102616106913660046140a3565b611c8a565b3480156106a1575f5ffd5b506102616106b0366004613eed565b611cb6565b3480156106c0575f5ffd5b506102616106cf3660046140a3565b611cc1565b3480156106df575f5ffd5b506102616106ee3660046140a3565b611cd7565b3480156106fe575f5ffd5b50610707611d1c565b60405161026b9190614549565b34801561071f575f5ffd5b5061026161072e36600461457a565b611d62565b34801561073e575f5ffd5b5061026161074d3660046145a6565b611dab565b34801561075d575f5ffd5b50610433611f9b565b5f61076f611fd6565b905090565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f516020614a005f395f51905f52916107b2906145cf565b80601f01602080910402602001604051908101604052809291908181526020018280546107de906145cf565b80156108295780601f1061080057610100808354040283529160200191610829565b820191905f5260205f20905b81548152906001019060200180831161080c57829003601f168201915b505050505091505090565b5f61083f825f612051565b92915050565b5f336108528185856120a8565b5060019392505050565b5f61083f8260016120ba565b5f33610875858285612108565b610880858585612158565b60019150505b9392505050565b5f805f516020614a405f395f51905f5290505f81546108b69190600160a01b900460ff1661461b565b91505090565b60606108c98484846121b5565b5f60028560ff16602081106108e0576108e0614634565b01546001600160a01b031690508061090b57604051632711b74d60e11b815260040160405180910390fd5b610938848460028860ff166020811061092657610926614634565b01546001600160a01b031691906122d3565b95945050505050565b5f61083f612325565b60605f5b5f6002826020811061096257610962614634565b01546001600160a01b03161480159061097b5750602081105b15610ab0576002816020811061099357610993614634565b015f9054906101000a90046001600160a01b03166001600160a01b0316635b9a4c356040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109e2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a069190614648565b8303610aa057825483908190610a1b906145cf565b80601f0160208091040260200160405190810160405280929190818152602001828054610a47906145cf565b8015610a925780601f10610a6957610100808354040283529160200191610a92565b820191905f5260205f20905b815481529060010190602001808311610a7557829003601f168201915b505050505092505050919050565b610aa98161465f565b905061094e565b5060405163213109dd60e11b815260040160405180910390fd5b610ad26123b1565b610adc828261245a565b5050565b610ae8613e8e565b6040805161040081019182905290600190602090825f855b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610b005790505050505050905090565b5f610b41612516565b505f516020614a205f395f51905f5290565b5f5f610b5e83610941565b905080841115610b9057828482604051633c8097d960e11b8152600401610b8793929190614677565b60405180910390fd5b5f610b9a85611cb6565b9050610ba83385878461255f565b949350505050565b6001600160a01b03165f9081525f516020614a005f395f51905f52602052604090205490565b5f60028560ff1660208110610bed57610bed614634565b01546001600160a01b0316905080610c1857604051632711b74d60e11b815260040160405180910390fd5b5f5b602081108015610c4757505f60028260208110610c3957610c39614634565b01546001600160a01b031614155b15610cbd57846001600160a01b031660028260208110610c6957610c69614634565b01546001600160a01b0316148015610c8457508560ff168114155b15610cad5760405163b5a9314f60e01b81526001600160a01b0386166004820152602401610b87565b610cb68161465f565b9050610c1a565b50610cd2818585610ccc612574565b86612593565b8360028660ff1660208110610ce957610ce9614634565b0180546001600160a01b0319166001600160a01b03929092169190911790555050505050565b6001600160a01b038216610d3657604051632711b74d60e11b815260040160405180910390fd5b5f5b602081108015610d6557505f60028260208110610d5757610d57614634565b01546001600160a01b031614155b15610dcb57826001600160a01b031660028260208110610d8757610d87614634565b01546001600160a01b031603610dbb5760405163b5a9314f60e01b81526001600160a01b0384166004820152602401610b87565b610dc48161465f565b9050610d38565b601f198101610df057604051600162ad1fab60e01b0319815260040160405180910390fd5b8260028260208110610e0457610e04614634565b0180546001600160a01b0319166001600160a01b0392909216919091179055610e2e816001614698565b5f8260208110610e4057610e40614634565b602091828204019190066101000a81548160ff021916908360ff160217905550806001610e6d9190614698565b60018260208110610e8057610e80614634565b602091828204019190066101000a81548160ff021916908360ff160217905550610ebb610eab612574565b6001600160a01b038516906126e1565b610ece6001600160a01b03841683612773565b60405160ff821681526001600160a01b038416907f4973f7978f2b1810531aed51dc15a8e446cb3191afcca470f8ce464af7494f589060200160405180910390a2505050565b5f5f60028460ff1660208110610f2c57610f2c614634565b0154604080516001600160a01b039092166020830181905260ff86169183019190915291506060016040516020818303038152906040528051906020012091505092915050565b610f7b613e8e565b81515f9060201015610fa05760405163a29b1f1160e01b815260040160405180910390fd5b825181101561114b57602060ff16838281518110610fc057610fc0614634565b602002602001015160ff1610158061101957505f6001600160a01b03166002848381518110610ff157610ff1614634565b602002602001015160ff166020811061100c5761100c614634565b01546001600160a01b0316145b156110375760405163a29b1f1160e01b815260040160405180910390fd5b8183828151811061104a5761104a614634565b602002602001015160ff166020811061106557611065614634565b6020020151156110ac5782818151811061108157611081614634565b602002602001015160405163c41fdbb960e01b8152600401610b87919060ff91909116815260200190565b6001828483815181106110c1576110c1614634565b602002602001015160ff16602081106110dc576110dc614634565b9115156020909202015282518390829081106110fa576110fa614634565b6020026020010151600161110e919061461b565b5f826020811061112057611120614634565b602091828204019190066101000a81548160ff021916908360ff160217905550806001019050610fa0565b60208110801561117857505f6002826020811061116a5761116a614634565b01546001600160a01b031614155b1561119657604051636712b27b60e01b815260040160405180910390fd5b7f193fc4e628c27ae3ca098952dfc16a40425b44e7b0a97f4cc59d0f267f47caec836040516111c591906146ab565b60405180910390a1505050565b5f5f6111dd83611c8a565b9050808411156112065782848260405163284ff66760e01b8152600401610b8793929190614677565b5f61121085611998565b9050610ba83385838861255f565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f516020614a005f395f51905f52916107b2906145cf565b602060ff83161061128057604051632711b74d60e11b815260040160405180910390fd5b5f60028360ff166020811061129757611297614634565b01546001600160a01b03169050806112c257604051632711b74d60e11b815260040160405180910390fd5b811580156112e057506112dd816001600160a01b03166127c1565b15155b156112fe576040516343c2dfef60e01b815260040160405180910390fd5b60ff831615801561131857506003546001600160a01b0316155b1561133957604051600162ad1fab60e01b0319815260040160405180910390fd5b5f61134584600161461b565b60ff1690505b60208110801561137857505f6002826020811061136a5761136a614634565b01546001600160a01b031614155b156113e7576002816020811061139057611390614634565b01546001600160a01b031660026113a86001846146f0565b602081106113b8576113b8614634565b0180546001600160a01b0319166001600160a01b03929092169190911790556113e08161465f565b905061134b565b5f60026113f56001846146f0565b6020811061140557611405614634565b0180546001600160a01b0319166001600160a01b0392909216919091179055505f80805b6001836020811061143c5761143c614634565b602081049091015460ff601f9092166101000a900416158015906114605750602083105b156117925780156115245761147686600161461b565b60ff166001846020811061148c5761148c614634565b602081049091015460ff601f9092166101000a900416116114ad575f6114b0565b60015b600184602081106114c3576114c3614634565b602091828204019190069054906101000a900460ff166114e39190614703565b60016114ef81866146f0565b602081106114ff576114ff614634565b602091828204019190066101000a81548160ff021916908360ff1602179055506115f5565b61152f86600161461b565b60ff166001846020811061154557611545614634565b602081049091015460ff601f9092166101000a90041603611568575060016115f5565b61157386600161461b565b60ff166001846020811061158957611589614634565b602081049091015460ff601f9092166101000a90041611156115f55760018084602081106115b9576115b9614634565b602091828204019190068282829054906101000a900460ff166115dc9190614703565b92506101000a81548160ff021916908360ff1602179055505b81156116b25761160686600161461b565b60ff165f846020811061161b5761161b614634565b602081049091015460ff601f9092166101000a9004161161163c575f61163f565b60015b5f846020811061165157611651614634565b602091828204019190069054906101000a900460ff166116719190614703565b5f61167d6001866146f0565b6020811061168d5761168d614634565b602091828204019190066101000a81548160ff021916908360ff160217905550611782565b6116bd86600161461b565b60ff165f84602081106116d2576116d2614634565b602081049091015460ff601f9092166101000a900416036116f65760019150611782565b61170186600161461b565b60ff165f846020811061171657611716614634565b602081049091015460ff601f9092166101000a90041611156117825760015f846020811061174657611746614634565b602091828204019190068282829054906101000a900460ff166117699190614703565b92506101000a81548160ff021916908360ff1602179055505b61178b8361465f565b9250611429565b5f8061179f6001866146f0565b602081106117af576117af614634565b602091828204019190066101000a81548160ff021916908360ff1602179055505f600180856117de91906146f0565b602081106117ee576117ee614634565b602091828204019190066101000a81548160ff021916908360ff16021790555061182a85856001600160a01b031661282a90919063ffffffff16565b60405160ff871681526001600160a01b038516907f978014566e371fef52158b004e150b6e1fd723f5aa3d8c9aa2a7c98ddb0e65b89060200160405180910390a2505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156118b75750825b90505f826001600160401b031660011480156118d25750303b155b9050811580156118e0575080155b156118fe5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561192857845460ff60401b1916600160401b1785555b6119378c8c8c8c8c8c8c61294f565b831561197d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b5f33610852818585612158565b5f61083f826001612051565b5f5f6119af83611cc1565b9050808511156119d857828582604051633fa733bb60e21b8152600401610b8793929190614677565b5f6119e28661085c565b90506109383386868985612987565b5f5f6119fc83611cd7565b905080851115611a2557828582604051632e52afbb60e21b8152600401610b8793929190614677565b5f611a2f86610834565b9050610938338686848a612987565b611a46613e8e565b81515f9060201015611a6b5760405163a29b1f1160e01b815260040160405180910390fd5b82518160ff161015611c0a57602060ff16838260ff1681518110611a9157611a91614634565b602002602001015160ff16101580611aed57505f6001600160a01b03166002848360ff1681518110611ac557611ac5614634565b602002602001015160ff1660208110611ae057611ae0614634565b01546001600160a01b0316145b15611b0b5760405163a29b1f1160e01b815260040160405180910390fd5b81838260ff1681518110611b2157611b21614634565b602002602001015160ff1660208110611b3c57611b3c614634565b602002015115611b5b57828160ff168151811061108157611081614634565b600182848360ff1681518110611b7357611b73614634565b602002602001015160ff1660208110611b8e57611b8e614634565b911515602090920201528251839060ff8316908110611baf57611baf614634565b60200260200101516001611bc3919061461b565b60018260ff1660208110611bd957611bd9614634565b602091828204019190066101000a81548160ff021916908360ff16021790555080611c039061471c565b9050611a6b565b602060ff8216108015611c3d57505f600260ff831660208110611c2f57611c2f614634565b01546001600160a01b031614155b15611c5b57604051636712b27b60e01b815260040160405180910390fd5b7f3c56b6bca0d55eda581f8f2819d1f85d3b91cfcc24914a8fa39d301796d8964c836040516111c591906146ab565b5f5f611c94612325565b90505f198114611cad57611ca8815f6120ba565b610886565b5f199392505050565b5f61083f825f6120ba565b5f5f611ccc8361299d565b9050610886816129b0565b5f5f611ce283612a45565b90505f611cef825f612051565b90505f611cfb826129b0565b9050818114611d1357611d0e815f6120ba565b610938565b50909392505050565b611d24613e8e565b604080516104008101918290529060029060209082845b81546001600160a01b03168152600190910190602001808311611d3b575050505050905090565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f602060ff8516101580611dc35750602060ff841610155b15611de157604051632711b74d60e11b815260040160405180910390fd5b5f60028560ff1660208110611df857611df8614634565b01546001600160a01b031690505f600260ff861660208110611e1c57611e1c614634565b01546001600160a01b03908116915082161580611e4057506001600160a01b038116155b15611e5e57604051632711b74d60e11b815260040160405180910390fd5b5f198403611e7b57611e78826001600160a01b03166127c1565b93505b835f03611e8c575f92505050610886565b611e9e826001600160a01b0316612a4f565b841115611ed357611eb7826001600160a01b0316612a4f565b604051633ce011d560e01b8152600401610b8791815260200190565b611ee5816001600160a01b0316612a7d565b841115611f1a57611efe816001600160a01b0316612a7d565b6040516350a3e37560e11b8152600401610b8791815260200190565b611f2e6001600160a01b038316855f612aab565b50611f436001600160a01b038216855f612be7565b50806001600160a01b0316826001600160a01b03167fb0850b8e0f9e8315dde3c9f9f31138283e6bbe16cd29e8552eb1dcdf9fac9e3b86604051611f8991815260200190565b60405180910390a35091949350505050565b611fa3613e8e565b604080516104008101918290525f805460ff1682529091602090826001838601808411610b005790505050505050905090565b5f5f5b5f60028260208110611fed57611fed614634565b01546001600160a01b0316148015906120065750602081105b1561204d576120316002826020811061202157612021614634565b01546001600160a01b03166127c1565b61203b9083614698565b91506120468161465f565b9050611fd9565b5090565b5f61088661205d610766565b612068906001614698565b6120735f600a61481d565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025461209f9190614698565b85919085612d08565b6120b58383836001612d4a565b505050565b5f6108866120c982600a61481d565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546120f59190614698565b6120fd610766565b61209f906001614698565b5f6121138484611d62565b90505f198114612152578181101561214457828183604051637dc7a0d960e11b8152600401610b8793929190614677565b61215284848484035f612d4a565b50505050565b6001600160a01b03831661218157604051634b637e8f60e11b81525f6004820152602401610b87565b6001600160a01b0382166121aa5760405163ec442f0560e01b81525f6004820152602401610b87565b6120b5838383612e2d565b5f306001600160a01b0316633a7b7a396040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121f2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612216919061482b565b90505f816001600160a01b031663b700961333306122348989610f14565b60405160e085901b6001600160e01b031990811682526001600160a01b039485166004830152929093166024840152166