@ensuro/vaults
Version:
ERC4626s for asset management, used by the Ensuro Protocol
1,469 lines • 79 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "SingleStrategyERC4626",
"sourceName": "contracts/mock/SingleStrategyERC4626.sol",
"abi": [
{
"inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "AccessControlBadConfirmation",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "bytes32",
"name": "neededRole",
"type": "bytes32"
}
],
"name": "AccessControlUnauthorizedAccount",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
}
],
"name": "AddressEmptyCode",
"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": [
{
"internalType": "address",
"name": "asset",
"type": "address"
}
],
"name": "InvalidAsset",
"type": "error"
},
{
"inputs": [],
"name": "InvalidInitialization",
"type": "error"
},
{
"inputs": [],
"name": "InvalidStrategyAsset",
"type": "error"
},
{
"inputs": [],
"name": "NotInitializing",
"type": "error"
},
{
"inputs": [],
"name": "OnlyStrategyStorageExposed",
"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"
},
{
"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": "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": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "previousAdminRole",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "newAdminRole",
"type": "bytes32"
}
],
"name": "RoleAdminChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "RoleGranted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "RoleRevoked",
"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": "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"
},
{
"inputs": [],
"name": "DEFAULT_ADMIN_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "GUARDIAN_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "LP_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "SET_STRATEGY_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "UPGRADE_INTERFACE_VERSION",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"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": "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": [
{
"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": "bytes32",
"name": "role",
"type": "bytes32"
}
],
"name": "getRoleAdmin",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "grantRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "hasRole",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "name_",
"type": "string"
},
{
"internalType": "string",
"name": "symbol_",
"type": "string"
},
{
"internalType": "address",
"name": "admin_",
"type": "address"
},
{
"internalType": "contract IERC20",
"name": "asset_",
"type": "address"
},
{
"internalType": "contract IInvestStrategy",
"name": "strategy_",
"type": "address"
},
{
"internalType": "bytes",
"name": "initStrategyData",
"type": "bytes"
}
],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "maxDeposit",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"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": "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": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "callerConfirmation",
"type": "address"
}
],
"name": "renounceRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "revokeRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "adminRole",
"type": "bytes32"
}
],
"name": "setRoleAdmin",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IInvestStrategy",
"name": "newStrategy",
"type": "address"
},
{
"internalType": "bytes",
"name": "initStrategyData",
"type": "bytes"
},
{
"internalType": "bool",
"name": "force",
"type": "bool"
}
],
"name": "setStrategy",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "strategy",
"outputs": [
{
"internalType": "contract IInvestStrategy",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes4",
"name": "interfaceId",
"type": "bytes4"
}
],
"name": "supportsInterface",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"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"
}
],
"bytecode": "0x60a060405230608052348015610013575f5ffd5b5061001c610021565b6100d3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100715760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051612f196100f95f395f81816114140152818161143d01526115a00152612f195ff3fe60806040526004361061025f575f3560e01c806370a082311161013f578063baaf36b5116100b3578063d547741f11610078578063d547741f1461072a578063d905777e14610749578063d9221bb514610768578063dd62ed3e14610787578063e1d39450146107a6578063ef8b30f7146106cd575f5ffd5b8063baaf36b51461067b578063c63d75b6146106ae578063c6e6f592146106cd578063ce96cb77146106ec578063d4f391101461070b575f5ffd5b8063a8c62e7611610104578063a8c62e76146105b3578063a9059cbb146105cf578063ad3cb1cc146105ee578063b3d7f6b91461061e578063b460af941461063d578063ba0876521461065c575f5ffd5b806370a082311461052f57806391d148541461054e57806394bf804d1461056d57806395d89b411461058c578063a217fddf146105a0575f5ffd5b806324ea54f4116101d6578063402d267d1161019b578063402d267d146104ab57806347e57533146104ca5780634cdad506146102fb5780634f1ef286146104e957806352d1902d146104fc5780636e553f6514610510575f5ffd5b806324ea54f4146103e85780632f2ff15d1461041b578063313ce5671461043a57806336568abe1461046057806338d52e0f1461047f575f5ffd5b8063095ea7b311610227578063095ea7b31461031a5780630a28a4771461033957806318160ddd146103585780631e4e00911461038b57806323b872dd146103aa578063248a9ca3146103c9575f5ffd5b806301e1d1141461026357806301ffc9a71461028a57806302a602e9146102b957806306fdde03146102da57806307a2d13a146102fb575b5f5ffd5b34801561026e575f5ffd5b506102776107d9565b6040519081526020015b60405180910390f35b348015610295575f5ffd5b506102a96102a4366004612724565b6107f3565b6040519015158152602001610281565b3480156102c4575f5ffd5b506102d86102d3366004612804565b610829565b005b3480156102e5575f5ffd5b506102ee610941565b60405161028191906128f6565b348015610306575f5ffd5b50610277610315366004612908565b610a01565b348015610325575f5ffd5b506102a961033436600461291f565b610a0c565b348015610344575f5ffd5b50610277610353366004612908565b610a23565b348015610363575f5ffd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610277565b348015610396575f5ffd5b506102d86103a5366004612949565b610a2f565b3480156103b5575f5ffd5b506102a96103c4366004612969565b610a48565b3480156103d4575f5ffd5b506102776103e3366004612908565b610a6d565b3480156103f3575f5ffd5b506102777f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b348015610426575f5ffd5b506102d86104353660046129a7565b610a8d565b348015610445575f5ffd5b5061044e610aaf565b60405160ff9091168152602001610281565b34801561046b575f5ffd5b506102d861047a3660046129a7565b610ade565b34801561048a575f5ffd5b50610493610b11565b6040516001600160a01b039091168152602001610281565b3480156104b6575f5ffd5b506102776104c53660046129d5565b610b2c565b3480156104d5575f5ffd5b506102ee6104e4366004612908565b610b53565b6102d86104f73660046129f0565b610c70565b348015610507575f5ffd5b50610277610c8f565b34801561051b575f5ffd5b5061027761052a3660046129a7565b610caa565b34801561053a575f5ffd5b506102776105493660046129d5565b610d07565b348015610559575f5ffd5b506102a96105683660046129a7565b610d2d565b348015610578575f5ffd5b506102776105873660046129a7565b610d63565b348015610597575f5ffd5b506102ee610daf565b3480156105ab575f5ffd5b506102775f81565b3480156105be575f5ffd5b505f546001600160a01b0316610493565b3480156105da575f5ffd5b506102a96105e936600461291f565b610ded565b3480156105f9575f5ffd5b506102ee604051806040016040528060058152602001640352e302e360dc1b81525081565b348015610629575f5ffd5b50610277610638366004612908565b610dfa565b348015610648575f5ffd5b50610277610657366004612a3d565b610e06565b348015610667575f5ffd5b50610277610676366004612a3d565b610e5c565b348015610686575f5ffd5b506102777f2e704739166abb26e88a93c0d60bae654bea582d8d8fa53cd8580ca0878fb54881565b3480156106b9575f5ffd5b506102776106c83660046129d5565b610ea9565b3480156106d8575f5ffd5b506102776106e7366004612908565b610ed8565b3480156106f7575f5ffd5b506102776107063660046129d5565b610ee3565b348015610716575f5ffd5b506102ee610725366004612a7c565b610f05565b348015610735575f5ffd5b506102d86107443660046129a7565b610f1e565b348015610754575f5ffd5b506102776107633660046129d5565b610f3a565b348015610773575f5ffd5b506102d8610782366004612a9d565b610f69565b348015610792575f5ffd5b506102776107a1366004612af6565b610fd7565b3480156107b1575f5ffd5b506102777fb0296ea8dd3227371927b1c1cea2b12ea394743ddf2f32f58024ce26f83a24a681565b5f80546107ee906001600160a01b0316611020565b905090565b5f6001600160e01b03198216637965db0b60e01b148061082357506301ffc9a760e01b6001600160e01b03198316145b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f8115801561086e5750825b90505f8267ffffffffffffffff16600114801561088a5750303b155b905081158015610898575080155b156108b65760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156108e057845460ff60401b1916600160401b1785555b6108ee8b8b8b8b8b8b611089565b831561093457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f516020612e645f395f51905f529161097f90612b22565b80601f01602080910402602001604051908101604052809291908181526020018280546109ab90612b22565b80156109f65780601f106109cd576101008083540402835291602001916109f6565b820191905f5260205f20905b8154815290600101906020018083116109d957829003601f168201915b505050505091505090565b5f610823825f6110af565b5f33610a19818585611106565b5060019392505050565b5f610823826001611113565b5f610a3981611161565b610a43838361116e565b505050565b5f33610a558582856111ce565b610a60858585611218565b60019150505b9392505050565b5f9081525f516020612ea45f395f51905f52602052604090206001015490565b610a9682610a6d565b610a9f81611161565b610aa98383611275565b50505050565b5f805f516020612ec45f395f51905f5290505f8154610ad89190600160a01b900460ff16612b6e565b91505090565b6001600160a01b0381163314610b075760405163334bd91960e11b815260040160405180910390fd5b610a438282611316565b5f516020612ec45f395f51905f52546001600160a01b031690565b5f805461082390610b45906001600160a01b031661138f565b610b4e846113bd565b6113fa565b5f5460408051635b9a4c3560e01b815290516060926001600160a01b031691635b9a4c359160048083019260209291908290030181865afa158015610b9a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bbe9190612b87565b8214610bdd5760405163213109dd60e11b815260040160405180910390fd5b815482908190610bec90612b22565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1890612b22565b8015610c635780601f10610c3a57610100808354040283529160200191610c63565b820191905f5260205f20905b815481529060010190602001808311610c4657829003601f168201915b5050505050915050919050565b610c78611409565b610c81826114af565b610c8b82826114d9565b5050565b5f610c98611595565b505f516020612e845f395f51905f5290565b5f5f610cb583610b2c565b905080841115610ce757828482604051633c8097d960e11b8152600401610cde93929190612b9e565b60405180910390fd5b5f610cf185610ed8565b9050610cff338587846115de565b949350505050565b6001600160a01b03165f9081525f516020612e645f395f51905f52602052604090205490565b5f9182525f516020612ea45f395f51905f52602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f5f610d6e83610ea9565b905080841115610d975782848260405163284ff66760e01b8152600401610cde93929190612b9e565b5f610da185610dfa565b9050610cff338583886115de565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f516020612e645f395f51905f529161097f90612b22565b5f33610a19818585611218565b5f6108238260016110af565b5f5f610e1183610ee3565b905080851115610e3a57828582604051633fa733bb60e21b8152600401610cde93929190612b9e565b5f610e4486610a23565b9050610e53338686898561160b565b95945050505050565b5f5f610e6783610f3a565b905080851115610e9057828582604051632e52afbb60e21b8152600401610cde93929190612b9e565b5f610e9a86610a01565b9050610e53338686848a61160b565b5f80548190610ec0906001600160a01b031661138f565b9050610a66610ecf825f611113565b610b4e856113bd565b5f610823825f611113565b5f805461082390610efc906001600160a01b0316611633565b610b4e84611661565b5f54606090610a66906001600160a01b03168484611674565b610f2782610a6d565b610f3081611161565b610aa98383611316565b5f80548190610f51906001600160a01b0316611633565b9050610a66610f60825f611113565b610b4e856116c6565b7f2e704739166abb26e88a93c0d60bae654bea582d8d8fa53cd8580ca0878fb548610f9381611161565b5f54610fb2906001600160a01b03168585610fac610b11565b866116d0565b50505f80546001600160a01b0319166001600160a01b03939093169290921790915550565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b60405163f3e0ffbf60e01b81523060048201525f906001600160a01b0383169063f3e0ffbf906024015b602060405180830381865afa158015611065573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108239190612b87565b61109161181e565b61109d86868686611867565b6110a782826118c4565b505050505050565b5f610a666110bb6107d9565b6110c6906001612bbf565b6110d15f600a612cb5565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546110fd9190612bbf565b85919085611916565b610a438383836001611958565b5f610a6661112282600a612cb5565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025461114e9190612bbf565b6111566107d9565b6110fd906001612bbf565b61116b8133611a3b565b50565b5f516020612ea45f395f51905f525f61118684610a6d565b5f85815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b5f6111d98484610fd7565b90505f198114610aa9578181101561120a57828183604051637dc7a0d960e11b8152600401610cde93929190612b9e565b610aa984848484035f611958565b6001600160a01b03831661124157604051634b637e8f60e11b81525f6004820152602401610cde565b6001600160a01b03821661126a5760405163ec442f0560e01b81525f6004820152602401610cde565b610a43838383611a74565b5f5f516020612ea45f395f51905f5261128e8484610d2d565b61130d575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556112c33390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610823565b5f915050610823565b5f5f516020612ea45f395f51905f5261132f8484610d2d565b1561130d575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610823565b60405163402d267d60e01b81523060048201525f906001600160a01b0383169063402d267d9060240161104a565b5f6113e87fb0296ea8dd3227371927b1c1cea2b12ea394743ddf2f32f58024ce26f83a24a683610d2d565b6113f357505f919050565b5f19610823565b5f828218828410028218610a66565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061148f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166114835f516020612e845f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156114ad5760405163703e46dd60e11b815260040160405180910390fd5b565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610c8b81611161565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611533575060408051601f3d908101601f1916820190925261153091810190612b87565b60015b61155b57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610cde565b5f516020612e845f395f51905f52811461158b57604051632a87526960e21b815260048101829052602401610cde565b610a438383611b9a565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114ad5760405163703e46dd60e11b815260040160405180910390fd5b6115ea84848484611bef565b5f8054611604916001600160a01b03909116908490611c6c565b5050505050565b5f8054611625916001600160a01b03909116908490611da8565b506116048585858585611ec9565b60405163ce96cb7760e01b81523060048201525f906001600160a01b0383169063ce96cb779060240161104a565b5f61082361166e83610d07565b5f6110af565b6060610cff838360405160240161168c929190612cc3565b60408051601f198184030181529190526020810180516001600160e01b03166304c0d8e160e11b1790526001600160a01b03861690611f7d565b5f61082382610d07565b6116da8483611fe6565b60405163f3e0ffbf60e01b815230600482015261174c9086906001600160a01b0382169063f3e0ffbf90602401602060405180830381865afa158015611722573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117469190612b87565b83611da8565b506117578582612078565b611761848461219d565b6040516370a0823160e01b81523060048201526117d39085906001600160a01b038516906370a0823190602401602060405180830381865afa1580156117a9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117cd9190612b87565b83611c6c565b50604080516001600160a01b038088168252861660208201527f254c88e7a2ea123aeeb89b7cc413fb949188fefcdb7584c4f3d493294daf65c5910160405180910390a15050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166114ad57604051631afcd79f60e31b815260040160405180910390fd5b61186f61181e565b6118776121eb565b61187f6121eb565b6001600160a01b0381166118a8576040516337bce3c560e11b81525f6004820152602401610cde565b6118b1816121f3565b6118bb8484612204565b610aa982612216565b6118cc61181e565b5f80546001600160a01b0319166001600160a01b0384161790556119016118f1610b11565b6001600160a01b03841690611fe6565b5f54610c8b906001600160a01b03168261219d565b5f61194361192383612228565b801561193e57505f848061193957611939612cde565b868809115b151590565b61194e868686612254565b610e539190612bbf565b5f516020612e645f395f51905f526001600160a01b03851661198f5760405163e602df0560e01b81525f6004820152602401610cde565b6001600160a01b0384166119b857604051634a1406b160e11b81525f6004820152602401610cde565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561160457836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051611a2c91815260200190565b60405180910390a35050505050565b611a458282610d2d565b610c8b5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610cde565b5f516020612e645f395f51905f526001600160a01b038416611aae5781816002015f828254611aa39190612bbf565b90915550611b0b9050565b6001600160a01b0384165f9081526020829052604090205482811015611aed5784818460405163391434e360e21b8152600401610cde93929190612b9e565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316611b29576002810180548390039055611b47565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611b8c91815260200190565b60405180910390a350505050565b611ba38261230a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611be757610a438282611f7d565b610c8b61236d565b5f516020612ec45f395f51905f528054611c14906001600160a01b031686308661238c565b611c1e84836123f3565b836001600160a01b0316856001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78585604051611a2c929190918252602082015260400190565b5f8115611d4e575f5f856001600160a01b031685604051602401611c9291815260200190565b60408051601f198184030181529181526020820180516001600160e01b031663b6b55f2560e01b17905251611cc79190612cf2565b5f60405180830381855af49150503d805f8114611cff576040519150601f19603f3d011682016040523d82523d5f602084013e611d04565b606091505b509150915081611d46577ff8e68f23d3b33772e986cc9861e94e8fd6b9461d62bc1fb21cd754bbaf726bd381604051611d3d91906128f6565b60405180910390a15b509050610a66565b611d9e83604051602401611d6491815260200190565b60408051601f198184030181529190526020810180516001600160e01b031663b6b55f2560e01b1790526001600160a01b03861690611f7d565b5060019050610a66565b5f8115611e79575f5f856001600160a01b031685604051602401611dce91815260200190565b60408051601f198184030181529181526020820180516001600160e01b0316632e1a7d4d60e01b17905251611e039190612cf2565b5f60405180830381855af49150503d805f8114611e3b576040519150601f19603f3d011682016040523d82523d5f602084013e611e40565b606091505b509150915081611d46577fad0ad28a12a6ed800f1a7b398454913afe6826c175e6cc28f2e8e2c175b0d72881604051611d3d91906128f6565b611d9e83604051602401611e8f91815260200190565b60408051601f198184030181529190526020810180516001600160e01b0316632e1a7d4d60e01b1790526001600160a01b03861690611f7d565b5f516020612ec45f395f51905f526001600160a01b0386811690851614611ef557611ef58487846111ce565b611eff8483612427565b8054611f15906001600160a01b0316868561245b565b836001600160a01b0316856001600160a01b0316876001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db8686604051611f6d929190918252602082015260400190565b60405180910390a4505050505050565b60605f5f846001600160a01b031684604051611f999190612cf2565b5f60405180830381855af49150503d805f8114611fd1576040519150601f19603f3d011682016040523d82523d5f602084013e611fd6565b606091505b5091509150610e5385838361248c565b604051634e2333d160e11b81523060048201526001600160a01b038083169190841690639c4667a290602401602060405180830381865afa15801561202d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120519190612d08565b6001600160a01b031614610c8b5760405163e76673ef60e01b815260040160405180910390fd5b801561215357604051600160248201525f9081906001600160a01b0385169060440160408051601f198184030181529181526020820180516001600160e01b0316632d08ba2b60e11b179052516120cf9190612cf2565b5f60405180830381855af49150503d805f8114612107576040519150601f19603f3d011682016040523d82523d5f602084013e61210c565b606091505b509150915081610aa9577f9f864ace9f45c2734f9444cb9a0c1ade6f1b15a8c202c17175b759728a4a0bf88160405161214591906128f6565b60405180910390a150505050565b6040515f6024820152610a439060440160408051601f198184030181529190526020810180516001600160e01b0316632d08ba2b60e11b1790526001600160a01b03841690611f7d565b610a43816040516024016121b191906128f6565b60408051601f198184030181529190526020810180516001600160e01b031663139a8e2560e31b1790526001600160a01b03841690611f7d565b6114ad61181e565b6121fb61181e565b61116b816124e8565b61220c61181e565b610c8b8282612558565b61221e61181e565b610c8b5f82611275565b5f600282600381111561223d5761223d612d23565b6122479190612d37565b60ff166001149050919050565b5f838302815f1985870982811083820303915050805f036122885783828161227e5761227e612cde565b0492505050610a66565b80841161229f5761229f60038515026011186125a8565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b806001600160a01b03163b5f0361233f57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610cde565b5f516020612e845f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b34156114ad5760405163b398979f60e01b815260040160405180910390fd5b6040516001600160a01b038481166024830152838116604483015260648201839052610aa99186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506125b9565b6001600160a01b03821661241c5760405163ec442f0560e01b81525f6004820152602401610cde565b610c8b5f8383611a74565b6001600160a01b03821661245057604051634b637e8f60e11b81525f6004820152602401610cde565b610c8b825f83611a74565b6040516001600160a01b03838116602483015260448201839052610a4391859182169063a9059cbb906064016123c1565b6060826124a15761249c82612625565b610a66565b81511580156124b857506001600160a01b0384163b155b156124e157604051639996b31560e01b81526001600160a01b0385166004820152602401610cde565b5080610a66565b6124f061181e565b5f516020612ec45f395f51905f525f806125098461264e565b915091508161251957601261251b565b805b83546001600160a81b031916600160a01b60ff92909216919091026001600160a01b031916176001600160a01b0394909416939093179091555050565b61256061181e565b5f516020612e645f395f51905f527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036125998482612da8565b5060048101610aa98382612da8565b