UNPKG

@ensuro/vaults

Version:

ERC4626s for asset management, used by the Ensuro Protocol

1,172 lines 66.4 kB
{ "_format": "hh-sol-artifact-1", "contractName": "SingleStrategyERC4626", "sourceName": "contracts/mock/SingleStrategyERC4626.sol", "abi": [ { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, { "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": [], "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": 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": "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": "string", "name": "name_", "type": "string" }, { "internalType": "string", "name": "symbol_", "type": "string" }, { "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": "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": [], "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": "0x60a060405230608052348015610013575f5ffd5b5061001c610021565b6100d3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100715760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6080516128c86100f95f395f8181610ef701528181610f20015261105c01526128c85ff3fe6080604052600436106101e6575f3560e01c806394bf804d11610108578063c63d75b61161009d578063d905777e1161006d578063d905777e1461055f578063d9221bb51461057e578063dd62ed3e1461059d578063ef8b30f714610502578063effe0e1c146105bc575f5ffd5b8063c63d75b6146104e3578063c6e6f59214610502578063ce96cb7714610521578063d4f3911014610540575f5ffd5b8063ad3cb1cc116100d8578063ad3cb1cc14610456578063b3d7f6b914610486578063b460af94146104a5578063ba087652146104c4575f5ffd5b806394bf804d146103e857806395d89b4114610407578063a8c62e761461041b578063a9059cbb14610437575f5ffd5b806338d52e0f1161017e5780634f1ef2861161014e5780634f1ef2861461038157806352d1902d146103965780636e553f65146103aa57806370a08231146103c9575f5ffd5b806338d52e0f14610317578063402d267d1461034357806347e57533146103625780634cdad50614610232575f5ffd5b80630a28a477116101b95780630a28a4771461028057806318160ddd1461029f57806323b872dd146102d2578063313ce567146102f1575f5ffd5b806301e1d114146101ea57806306fdde031461021157806307a2d13a14610232578063095ea7b314610251575b5f5ffd5b3480156101f5575f5ffd5b506101fe6105db565b6040519081526020015b60405180910390f35b34801561021c575f5ffd5b506102256105f5565b6040516102089190612199565b34801561023d575f5ffd5b506101fe61024c3660046121ab565b6106b5565b34801561025c575f5ffd5b5061027061026b3660046121d6565b6106c6565b6040519015158152602001610208565b34801561028b575f5ffd5b506101fe61029a3660046121ab565b6106dd565b3480156102aa575f5ffd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546101fe565b3480156102dd575f5ffd5b506102706102ec366004612200565b6106e9565b3480156102fc575f5ffd5b5061030561070e565b60405160ff9091168152602001610208565b348015610322575f5ffd5b5061032b610750565b6040516001600160a01b039091168152602001610208565b34801561034e575f5ffd5b506101fe61035d36600461223e565b61077e565b34801561036d575f5ffd5b5061022561037c3660046121ab565b6107a3565b61039461038f3660046122fe565b6108c0565b005b3480156103a1575f5ffd5b506101fe6108d6565b3480156103b5575f5ffd5b506101fe6103c436600461234b565b6108f1565b3480156103d4575f5ffd5b506101fe6103e336600461223e565b61094e565b3480156103f3575f5ffd5b506101fe61040236600461234b565b610974565b348015610412575f5ffd5b506102256109c0565b348015610426575f5ffd5b505f546001600160a01b031661032b565b348015610442575f5ffd5b506102706104513660046121d6565b6109fe565b348015610461575f5ffd5b50610225604051806040016040528060058152602001640352e302e360dc1b81525081565b348015610491575f5ffd5b506101fe6104a03660046121ab565b610a0b565b3480156104b0575f5ffd5b506101fe6104bf366004612379565b610a17565b3480156104cf575f5ffd5b506101fe6104de366004612379565b610a6d565b3480156104ee575f5ffd5b506101fe6104fd36600461223e565b610aba565b34801561050d575f5ffd5b506101fe61051c3660046121ab565b610ae0565b34801561052c575f5ffd5b506101fe61053b36600461223e565b610aeb565b34801561054b575f5ffd5b5061022561055a3660046123b8565b610b0d565b34801561056a575f5ffd5b506101fe61057936600461223e565b610b26565b348015610589575f5ffd5b506103946105983660046123d9565b610b55565b3480156105a8575f5ffd5b506101fe6105b7366004612432565b610b97565b3480156105c7575f5ffd5b506103946105d636600461245e565b610be0565b5f80546105f0906001600160a01b0316610ce1565b905090565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f5160206128535f395f51905f529161063390612511565b80601f016020809104026020016040519081016040528092919081815260200182805461065f90612511565b80156106aa5780601f10610681576101008083540402835291602001916106aa565b820191905f5260205f20905b81548152906001019060200180831161068d57829003601f168201915b505050505091505090565b5f6106c0825f610d4a565b92915050565b5f336106d3818585610da1565b5060019392505050565b5f6106c0826001610db3565b5f336106f6858285610e01565b610701858585610e52565b60019150505b9392505050565b5f807f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e0090505f815461074a9190600160a01b900460ff1661255d565b91505090565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00546001600160a01b031690565b5f80546106c090610797906001600160a01b0316610eaf565b5f19610edd565b610edd565b5f5460408051635b9a4c3560e01b815290516060926001600160a01b031691635b9a4c359160048083019260209291908290030181865afa1580156107ea573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061080e9190612576565b821461082d5760405163213109dd60e11b815260040160405180910390fd5b81548290819061083c90612511565b80601f016020809104026020016040519081016040528092919081815260200182805461086890612511565b80156108b35780601f1061088a576101008083540402835291602001916108b3565b820191905f5260205f20905b81548152906001019060200180831161089657829003601f168201915b5050505050915050919050565b6108c8610eec565b6108d28282610f95565b5050565b5f6108df611051565b505f5160206128735f395f51905f5290565b5f5f6108fc8361077e565b90508084111561092e57828482604051633c8097d960e11b81526004016109259392919061258d565b60405180910390fd5b5f61093885610ae0565b90506109463385878461109a565b949350505050565b6001600160a01b03165f9081525f5160206128535f395f51905f52602052604090205490565b5f5f61097f83610aba565b9050808411156109a85782848260405163284ff66760e01b81526004016109259392919061258d565b5f6109b285610a0b565b90506109463385838861109a565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f5160206128535f395f51905f529161063390612511565b5f336106d3818585610e52565b5f6106c0826001610d4a565b5f5f610a2283610aeb565b905080851115610a4b57828582604051633fa733bb60e21b81526004016109259392919061258d565b5f610a55866106dd565b9050610a6433868689856110c7565b95945050505050565b5f5f610a7883610b26565b905080851115610aa157828582604051632e52afbb60e21b81526004016109259392919061258d565b5f610aab866106b5565b9050610a64338686848a6110c7565b5f80548190610ad1906001600160a01b0316610eaf565b9050610707610797825f610db3565b5f6106c0825f610db3565b5f80546106c090610b04906001600160a01b03166110ef565b61079e8461111d565b5f54606090610707906001600160a01b0316848461112a565b5f80548190610b3d906001600160a01b03166110ef565b9050610707610b4c825f610db3565b61079e8561117c565b5f54610b74906001600160a01b03168484610b6e610750565b85611186565b50505f80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f610be96112d4565b805490915060ff600160401b820416159067ffffffffffffffff165f81158015610c105750825b90505f8267ffffffffffffffff166001148015610c2c5750303b155b905081158015610c3a575080155b15610c585760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c8257845460ff60401b1916600160401b1785555b610c8f8a8a8a8a8a6112fc565b8315610cd557845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b60405163f3e0ffbf60e01b81523060048201525f906001600160a01b0383169063f3e0ffbf906024015b602060405180830381865afa158015610d26573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c09190612576565b5f610707610d566105db565b610d619060016125ae565b610d6c5f600a6126a4565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610d9891906125ae565b85919085611321565b610dae8383836001611363565b505050565b5f610707610dc282600a6126a4565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610dee91906125ae565b610df66105db565b610d989060016125ae565b5f610e0c8484610b97565b90505f19811015610e4c5781811015610e3e57828183604051637dc7a0d960e11b81526004016109259392919061258d565b610e4c84848484035f611363565b50505050565b6001600160a01b038316610e7b57604051634b637e8f60e11b81525f6004820152602401610925565b6001600160a01b038216610ea45760405163ec442f0560e01b81525f6004820152602401610925565b610dae838383611446565b60405163402d267d60e01b81523060048201525f906001600160a01b0383169063402d267d90602401610d0b565b5f828218828410028218610707565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610f7257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610f665f5160206128735f395f51905f52546001600160a01b031690565b6001600160a01b031614155b15610f905760405163703e46dd60e11b815260040160405180910390fd5b565b50565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610fef575060408051601f3d908101601f19168201909252610fec91810190612576565b60015b61101757604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610925565b5f5160206128735f395f51905f52811461104757604051632a87526960e21b815260048101829052602401610925565b610dae838361156c565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f905760405163703e46dd60e11b815260040160405180910390fd5b6110a6848484846115c1565b5f80546110c0916001600160a01b0390911690849061162c565b5050505050565b5f80546110e1916001600160a01b03909116908490611768565b506110c08585858585611889565b60405163ce96cb7760e01b81523060048201525f906001600160a01b0383169063ce96cb7790602401610d0b565b5f6106c061024c83610b26565b606061094683836040516024016111429291906126b2565b60408051601f198184030181529190526020810180516001600160e01b03166304c0d8e160e11b1790526001600160a01b03861690611930565b5f6106c08261094e565b61119084836119d0565b60405163f3e0ffbf60e01b81523060048201526112029086906001600160a01b0382169063f3e0ffbf90602401602060405180830381865afa1580156111d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111fc9190612576565b83611768565b5061120d8582611a62565b6112178484611b87565b6040516370a0823160e01b81523060048201526112899085906001600160a01b038516906370a0823190602401602060405180830381865afa15801561125f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112839190612576565b8361162c565b50604080516001600160a01b038088168252861660208201527f254c88e7a2ea123aeeb89b7cc413fb949188fefcdb7584c4f3d493294daf65c5910160405180910390a15050505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006106c0565b611304611bd5565b61130e8585611bfa565b61131783611c0c565b6110c08282611c1d565b5f61134e61132e83611c6f565b801561134957505f8480611344576113446126cd565b868809115b151590565b611359868686611c9b565b610a6491906125ae565b5f5160206128535f395f51905f526001600160a01b03851661139a5760405163e602df0560e01b81525f6004820152602401610925565b6001600160a01b0384166113c357604051634a1406b160e11b81525f6004820152602401610925565b6001600160a01b038086165f908152600183016020908152604080832093881683529290522083905581156110c057836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161143791815260200190565b60405180910390a35050505050565b5f5160206128535f395f51905f526001600160a01b0384166114805781816002015f82825461147591906125ae565b909155506114dd9050565b6001600160a01b0384165f90815260208290526040902054828110156114bf5784818460405163391434e360e21b81526004016109259392919061258d565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b0383166114fb576002810180548390039055611519565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161155e91815260200190565b60405180910390a350505050565b61157582611d4b565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156115b957610dae8282611930565b6108d2611dae565b6115d46115cc610750565b853085611dcd565b6115de8382611e03565b826001600160a01b0316846001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7848460405161155e929190918252602082015260400190565b5f811561170e575f5f856001600160a01b03168560405160240161165291815260200190565b60408051601f198184030181529181526020820180516001600160e01b031663b6b55f2560e01b1790525161168791906126e1565b5f60405180830381855af49150503d805f81146116bf576040519150601f19603f3d011682016040523d82523d5f602084013e6116c4565b606091505b509150915081611706577ff8e68f23d3b33772e986cc9861e94e8fd6b9461d62bc1fb21cd754bbaf726bd3816040516116fd9190612199565b60405180910390a15b509050610707565b61175e8360405160240161172491815260200190565b60408051601f198184030181529190526020810180516001600160e01b031663b6b55f2560e01b1790526001600160a01b03861690611930565b5060019050610707565b5f8115611839575f5f856001600160a01b03168560405160240161178e91815260200190565b60408051601f198184030181529181526020820180516001600160e01b0316632e1a7d4d60e01b179052516117c391906126e1565b5f60405180830381855af49150503d805f81146117fb576040519150601f19603f3d011682016040523d82523d5f602084013e611800565b606091505b509150915081611706577fad0ad28a12a6ed800f1a7b398454913afe6826c175e6cc28f2e8e2c175b0d728816040516116fd9190612199565b61175e8360405160240161184f91815260200190565b60408051601f198184030181529190526020810180516001600160e01b0316632e1a7d4d60e01b1790526001600160a01b03861690611930565b826001600160a01b0316856001600160a01b0316146118ad576118ad838683610e01565b6118b78382611e37565b6118c96118c2610750565b8584611e6b565b826001600160a01b0316846001600160a01b0316866001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db8585604051611921929190918252602082015260400190565b60405180910390a45050505050565b60605f61193d8484611ea0565b905080801561195e57505f3d118061195e57505f846001600160a01b03163b115b156119735761196b611eb3565b9150506106c0565b801561199d57604051639996b31560e01b81526001600160a01b0385166004820152602401610925565b3d156119b0576119ab611ecc565b6119c9565b60405163d6bda27560e01b815260040160405180910390fd5b5092915050565b604051634e2333d160e11b81523060048201526001600160a01b038083169190841690639c4667a290602401602060405180830381865afa158015611a17573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3b91906126f7565b6001600160a01b0316146108d25760405163e76673ef60e01b815260040160405180910390fd5b8015611b3d57604051600160248201525f9081906001600160a01b0385169060440160408051601f198184030181529181526020820180516001600160e01b0316632d08ba2b60e11b17905251611ab991906126e1565b5f60405180830381855af49150503d805f8114611af1576040519150601f19603f3d011682016040523d82523d5f602084013e611af6565b606091505b509150915081610e4c577f9f864ace9f45c2734f9444cb9a0c1ade6f1b15a8c202c17175b759728a4a0bf881604051611b2f9190612199565b60405180910390a150505050565b6040515f6024820152610dae9060440160408051601f198184030181529190526020810180516001600160e01b0316632d08ba2b60e11b1790526001600160a01b03841690611930565b610dae81604051602401611b9b9190612199565b60408051601f198184030181529190526020810180516001600160e01b031663139a8e2560e31b1790526001600160a01b03841690611930565b611bdd611ed7565b610f9057604051631afcd79f60e31b815260040160405180910390fd5b611c02611bd5565b6108d28282611ef0565b611c14611bd5565b610f9281611f40565b611c25611bd5565b5f80546001600160a01b0319166001600160a01b038416179055611c5a611c4a610750565b6001600160a01b038416906119d0565b5f546108d2906001600160a01b031682611b87565b5f6002826003811115611c8457611c84612712565b611c8e9190612726565b60ff166001149050919050565b5f5f5f611ca88686611fc3565b91509150815f03611ccc57838181611cc257611cc26126cd565b0492505050610707565b818411611ce357611ce36003851502601118611fdf565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b806001600160a01b03163b5f03611d8057604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610925565b5f5160206128735f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b3415610f905760405163b398979f60e01b815260040160405180910390fd5b611ddb848484846001611ff0565b610e4c57604051635274afe760e01b81526001600160a01b0385166004820152602401610925565b6001600160a01b038216611e2c5760405163ec442f0560e01b81525f6004820152602401610925565b6108d25f8383611446565b6001600160a01b038216611e6057604051634b637e8f60e11b81525f6004820152602401610925565b6108d2825f83611446565b611e78838383600161205d565b610dae57604051635274afe760e01b81526001600160a01b0384166004820152602401610925565b5f5f5f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b5f611ee06112d4565b54600160401b900460ff16919050565b611ef8611bd5565b5f5160206128535f395f51905f527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03611f318482612797565b5060048101610e4c8382612797565b611f48611bd5565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005f80611f74846120bf565b9150915081611f84576012611f86565b805b83546001600160a81b031916600160a01b60ff92909216919091026001600160a01b031916176001600160a01b0394909416939093179091555050565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b6040516323b872dd60e01b5f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f5114831661204c578383151615612040573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f511483166120b35783831516156120a7573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b5f5f5f6120cb60405190565b6040805160048152602481019091526020810180516001600160e01b031663313ce56760e01b1790529091505f90819061210690879061214a565b509150915061211483604052565b818015612122575060203d10155b801561212f575060ff8111155b61213a575f5f61213e565b6001815b94509450505050915091565b5f5f5f60405f855160208701885afa92505f51915060205190509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610707602083018461216b565b5f602082840312156121bb575f5ffd5b5035919050565b6001600160a01b0381168114610f92575f5ffd5b5f5f604083850312156121e7575f5ffd5b82356121f2816121c2565b946020939093013593505050565b5f5f5f60608486031215612212575f5ffd5b833561221d816121c2565b9250602084013561222d816121c2565b929592945050506040919091013590565b5f6020828403121561224e575f5ffd5b8135610707816121c2565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261227c575f5ffd5b8135602083015f5f67ffffffffffffffff84111561229c5761229c612259565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff821117156122cb576122cb612259565b6040528381529050808284018710156122e2575f5ffd5b838360208301375f602085830101528094505050505092915050565b5f5f6040838503121561230f575f5ffd5b823561231a816121c2565b9150602083013567ffffffffffffffff811115612335575f5ffd5b6123418582860161226d565b9150509250929050565b5f5f6040838503121561235c575f5ffd5b82359150602083013561236e816121c2565b809150509250929050565b5f5f5f6060848603121561238b575f5ffd5b83359250602084013561239d816121c2565b915060408401356123ad816121c2565b809150509250925092565b5f5f604083850312156123c9575f5ffd5b823560ff8116811461231a575f5ffd5b5f5f5f606084860312156123eb575f5ffd5b83356123f6816121c2565b9250602084013567ffffffffffffffff811115612411575f5ffd5b61241d8682870161226d565b925050604084013580151581146123ad575f5ffd5b5f5f60408385031215612443575f5ffd5b823561244e816121c2565b9150602083013561236e816121c2565b5f5f5f5f5f60a08688031215612472575f5ffd5b853567ffffffffffffffff811115612488575f5ffd5b6124948882890161226d565b955050602086013567ffffffffffffffff8111156124b0575f5ffd5b6124bc8882890161226d565b94505060408601356124cd816121c2565b925060608601356124dd816121c2565b9150608086013567ffffffffffffffff8111156124f8575f5ffd5b6125048882890161226d565b9150509295509295909350565b600181811c9082168061252557607f821691505b60208210810361254357634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b60ff81811683821601908111156106c0576106c0612549565b5f60208284031215612586575f5ffd5b5051919050565b6001600160a01b039390931683526020830191909152604082015260600190565b808201808211156106c0576106c0612549565b6001815b60018411156125fc578085048111156125e0576125e0612549565b60018416156125ee57908102905b60019390931c9280026125c5565b935093915050565b5f82612612575060016106c0565b8161261e57505f6106c0565b8160018114612634576002811461263e5761265a565b60019150506106c0565b60ff84111561264f5761264f612549565b50506001821b6106c0565b5060208310610133831016604e8410600b841016171561267d575081810a6106c0565b6126895f1984846125c1565b805f190482111561269c5761269c612549565b029392505050565b5f61070760ff841683612604565b60ff83168152604060208201525f610946604083018461216b565b634e487b7160e01b5f52601260045260245ffd5b5f82518060208501845e5f920191825250919050565b5f60208284031215612707575f5ffd5b8151610707816121c2565b634e487b7160e01b5f52602160045260245ffd5b5f60ff83168061274457634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b601f821115610dae57805f5260205f20601f840160051c810160208510156127785750805b601f840160051c820191505b818110156110c0575f8155600101612784565b815167ffffffffffffffff8111156127b1576127b1612259565b6127c5816127bf8454612511565b84612753565b6020601f8211600181146127f7575f83156127e05750848201515b5f19600385901b1c1916600184901b1784556110c0565b5f84815260208120601f198516915b828110156128265787850151825560209485019460019092019101612806565b508482101561284357868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca264697066735822122066b88bc495245f8bc6ee8839d24d6d9c3d76729af71ac31f0634dfd8054c470864736f6c634300081e0033", "deployedBytecode": "0x6080604052600436106101e6575f3560e01c806394bf804d11610108578063c63d75b61161009d578063d905777e1161006d578063d905777e1461055f578063d9221bb51461057e578063dd62ed3e1461059d578063ef8b30f714610502578063effe0e1c146105bc575f5ffd5b8063c63d75b6146104e3578063c6e6f59214610502578063ce96cb7714610521578063d4f3911014610540575f5ffd5b8063ad3cb1cc116100d8578063ad3cb1cc14610456578063b3d7f6b914610486578063b460af94146104a5578063ba087652146104c4575f5ffd5b806394bf804d146103e857806395d89b4114610407578063a8c62e761461041b578063a9059cbb14610437575f5ffd5b806338d52e0f1161017e5780634f1ef2861161014e5780634f1ef2861461038157806352d1902d146103965780636e553f65146103aa57806370a08231146103c9575f5ffd5b806338d52e0f14610317578063402d267d1461034357806347e57533146103625780634cdad50614610232575f5ffd5b80630a28a477116101b95780630a28a4771461028057806318160ddd1461029f57806323b872dd146102d2578063313ce567146102f1575f5ffd5b806301e1d114146101ea57806306fdde031461021157806307a2d13a14610232578063095ea7b314610251575b5f5ffd5b3480156101f5575f5ffd5b506101fe6105db565b6040519081526020015b60405180910390f35b34801561021c575f5ffd5b506102256105f5565b6040516102089190612199565b34801561023d575f5ffd5b506101fe61024c3660046121ab565b6106b5565b34801561025c575f5ffd5b5061027061026b3660046121d6565b6106c6565b6040519015158152602001610208565b34801561028b575f5ffd5b506101fe61029a3660046121ab565b6106dd565b3480156102aa575f5ffd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546101fe565b3480156102dd575f5ffd5b506102706102ec366004612200565b6106e9565b3480156102fc575f5ffd5b5061030561070e565b60405160ff9091168152602001610208565b348015610322575f5ffd5b5061032b610750565b6040516001600160a01b039091168152602001610208565b34801561034e575f5ffd5b506101fe61035d36600461223e565b61077e565b34801561036d575f5ffd5b5061022561037c3660046121ab565b6107a3565b61039461038f3660046122fe565b6108c0565b005b3480156103a1575f5ffd5b506101fe6108d6565b3480156103b5575f5ffd5b506101fe6103c436600461234b565b6108f1565b3480156103d4575f5ffd5b506101fe6103e336600461223e565b61094e565b3480156103f3575f5ffd5b506101fe61040236600461234b565b610974565b348015610412575f5ffd5b506102256109c0565b348015610426575f5ffd5b505f546001600160a01b031661032b565b348015610442575f5ffd5b506102706104513660046121d6565b6109fe565b348015610461575f5ffd5b50610225604051806040016040528060058152602001640352e302e360dc1b81525081565b348015610491575f5ffd5b506101fe6104a03660046121ab565b610a0b565b3480156104b0575f5ffd5b506101fe6104bf366004612379565b610a17565b3480156104cf575f5ffd5b506101fe6104de366004612379565b610a6d565b3480156104ee575f5ffd5b506101fe6104fd36600461223e565b610aba565b34801561050d575f5ffd5b506101fe61051c3660046121ab565b610ae0565b34801561052c575f5ffd5b506101fe61053b36600461223e565b610aeb565b34801561054b575f5ffd5b5061022561055a3660046123b8565b610b0d565b34801561056a575f5ffd5b506101fe61057936600461223e565b610b26565b348015610589575f5ffd5b506103946105983660046123d9565b610b55565b3480156105a8575f5ffd5b506101fe6105b7366004612432565b610b97565b3480156105c7575f5ffd5b506103946105d636600461245e565b610be0565b5f80546105f0906001600160a01b0316610ce1565b905090565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f5160206128535f395f51905f529161063390612511565b80601f016020809104026020016040519081016040528092919081815260200182805461065f90612511565b80156106aa5780601f10610681576101008083540402835291602001916106aa565b820191905f5260205f20905b81548152906001019060200180831161068d57829003601f168201915b505050505091505090565b5f6106c0825f610d4a565b92915050565b5f336106d3818585610da1565b5060019392505050565b5f6106c0826001610db3565b5f336106f6858285610e01565b610701858585610e52565b60019150505b9392505050565b5f807f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e0090505f815461074a9190600160a01b900460ff1661255d565b91505090565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00546001600160a01b031690565b5f80546106c090610797906001600160a01b0316610eaf565b5f19610edd565b610edd565b5f5460408051635b9a4c3560e01b815290516060926001600160a01b031691635b9a4c359160048083019260209291908290030181865afa1580156107ea573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061080e9190612576565b821461082d5760405163213109dd60e11b815260040160405180910390fd5b81548290819061083c90612511565b80601f016020809104026020016040519081016040528092919081815260200182805461086890612511565b80156108b35780601f1061088a576101008083540402835291602001916108b3565b820191905f5260205f20905b81548152906001019060200180831161089657829003601f168201915b5050505050915050919050565b6108c8610eec565b6108d28282610f95565b5050565b5f6108df611051565b505f5160206128735f395