UNPKG

@ensuro/vaults

Version:

ERC4626s for asset management, used by the Ensuro Protocol

1,446 lines 85 kB
{ "_format": "hh-sol-artifact-1", "contractName": "CompoundV3ERC4626", "sourceName": "contracts/CompoundV3ERC4626.sol", "abi": [ { "inputs": [ { "internalType": "contract ICompoundV3", "name": "cToken_", "type": "address" }, { "internalType": "contract ICometRewards", "name": "rewardsManager_", "type": "address" } ], "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": "NotInitializing", "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": "uint64", "name": "version", "type": "uint64" } ], "name": "Initialized", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "token", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "rewards", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "receivedInAsset", "type": "uint256" } ], "name": "RewardsClaimed", "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": [ { "components": [ { "internalType": "enum SwapLibrary.SwapProtocol", "name": "protocol", "type": "uint8" }, { "internalType": "uint256", "name": "maxSlippage", "type": "uint256" }, { "internalType": "bytes", "name": "customParams", "type": "bytes" } ], "indexed": false, "internalType": "struct SwapLibrary.SwapConfig", "name": "oldConfig", "type": "tuple" }, { "components": [ { "internalType": "enum SwapLibrary.SwapProtocol", "name": "protocol", "type": "uint8" }, { "internalType": "uint256", "name": "maxSlippage", "type": "uint256" }, { "internalType": "bytes", "name": "customParams", "type": "bytes" } ], "indexed": false, "internalType": "struct SwapLibrary.SwapConfig", "name": "newConfig", "type": "tuple" } ], "name": "SwapConfigChanged", "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" }, { "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": "HARVEST_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": "SWAP_ADMIN_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": "bytes32", "name": "role", "type": "bytes32" } ], "name": "getRoleAdmin", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getSwapConfig", "outputs": [ { "components": [ { "internalType": "enum SwapLibrary.SwapProtocol", "name": "protocol", "type": "uint8" }, { "internalType": "uint256", "name": "maxSlippage", "type": "uint256" }, { "internalType": "bytes", "name": "customParams", "type": "bytes" } ], "internalType": "struct SwapLibrary.SwapConfig", "name": "", "type": "tuple" } ], "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": "uint256", "name": "price", "type": "uint256" } ], "name": "harvestRewards", "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" }, { "components": [ { "internalType": "enum SwapLibrary.SwapProtocol", "name": "protocol", "type": "uint8" }, { "internalType": "uint256", "name": "maxSlippage", "type": "uint256" }, { "internalType": "bytes", "name": "customParams", "type": "bytes" } ], "internalType": "struct SwapLibrary.SwapConfig", "name": "swapConfig_", "type": "tuple" } ], "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": [ { "components": [ { "internalType": "enum SwapLibrary.SwapProtocol", "name": "protocol", "type": "uint8" }, { "internalType": "uint256", "name": "maxSlippage", "type": "uint256" }, { "internalType": "bytes", "name": "customParams", "type": "bytes" } ], "internalType": "struct SwapLibrary.SwapConfig", "name": "swapConfig_", "type": "tuple" } ], "name": "setSwapConfig", "outputs": [], "stateMutability": "nonpayable", "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": "0x60e060405230608052348015610013575f5ffd5b506040516135923803806135928339810160408190526100329161011a565b6001600160a01b0380831660a052811660c05261004d610054565b5050610152565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a45760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101035780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6001600160a01b0381168114610103575f5ffd5b5f5f6040838503121561012b575f5ffd5b825161013681610106565b602084015190925061014781610106565b809150509250929050565b60805160a05160c0516133c26101d05f395f8181610caf0152610d7f01525f81816107ea01528181610b7701528181610c8501528181610d4a015281816113e30152818161149501528181611a8201528181611b0001528181611baa0152611c5701525f8181611899015281816118c20152611a2501526133c25ff3fe60806040526004361061025f575f3560e01c80636e553f651161013f578063ba087652116100b3578063d547741f11610078578063d547741f14610710578063d905777e1461072f578063dd62ed3e1461074e578063e1d394501461076d578063ef8b30f7146106d2578063fbb12d07146107a0575f5ffd5b8063ba08765214610694578063c2f09e2b146106b3578063c63d75b6146104e0578063c6e6f592146106d2578063ce96cb77146106f1575f5ffd5b8063a217fddf11610104578063a217fddf146105d5578063a9059cbb146105e8578063ad3cb1cc14610607578063b3d7f6b914610637578063b460af9414610656578063b740a83f14610675575f5ffd5b80636e553f651461054557806370a082311461056457806391d148541461058357806394bf804d146105a257806395d89b41146105c1575f5ffd5b8063248a9ca3116101d657806338d52e0f1161019b57806338d52e0f146104b4578063402d267d146104e05780634cdad506146102da5780634f1ef286146104ff57806352d1902d1461051257806357126d0d14610526575f5ffd5b8063248a9ca3146103fe57806324ea54f41461041d5780632f2ff15d14610450578063313ce5671461046f57806336568abe14610495575f5ffd5b80630a28a477116102275780630a28a477146103185780630b2ce411146103375780631389c0291461035857806318160ddd1461038b5780631e4e0091146103be57806323b872dd146103df575f5ffd5b806301e1d1141461026357806301ffc9a71461028a57806306fdde03146102b957806307a2d13a146102da578063095ea7b3146102f9575b5f5ffd5b34801561026e575f5ffd5b506102776107d3565b6040519081526020015b60405180910390f35b348015610295575f5ffd5b506102a96102a43660046127d3565b610860565b6040519015158152602001610281565b3480156102c4575f5ffd5b506102cd610896565b6040516102819190612828565b3480156102e5575f5ffd5b506102776102f436600461283a565b610956565b348015610304575f5ffd5b506102a9610313366004612865565b610961565b348015610323575f5ffd5b5061027761033236600461283a565b610978565b348015610342575f5ffd5b5061034b610984565b60405161028191906128c3565b348015610363575f5ffd5b506102777f471cfe1a44bf1b786db7d7104d51e6728ed7b90a35394ad7cc424adf8ed1681681565b348015610396575f5ffd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610277565b3480156103c9575f5ffd5b506103dd6103d83660046128f8565b610a77565b005b3480156103ea575f5ffd5b506102a96103f9366004612918565b610a90565b348015610409575f5ffd5b5061027761041836600461283a565b610ab5565b348015610428575f5ffd5b506102777f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b34801561045b575f5ffd5b506103dd61046a366004612956565b610ad5565b34801561047a575f5ffd5b50610483610af7565b60405160ff9091168152602001610281565b3480156104a0575f5ffd5b506103dd6104af366004612956565b610b26565b3480156104bf575f5ffd5b506104c8610b59565b6040516001600160a01b039091168152602001610281565b3480156104eb575f5ffd5b506102776104fa366004612984565b610b74565b6103dd61050d366004612a42565b610c0a565b34801561051d575f5ffd5b50610277610c29565b348015610531575f5ffd5b506103dd61054036600461283a565b610c44565b348015610550575f5ffd5b5061027761055f366004612956565b610fea565b34801561056f575f5ffd5b5061027761057e366004612984565b611047565b34801561058e575f5ffd5b506102a961059d366004612956565b61106d565b3480156105ad575f5ffd5b506102776105bc366004612956565b6110a3565b3480156105cc575f5ffd5b506102cd6110ef565b3480156105e0575f5ffd5b506102775f81565b3480156105f3575f5ffd5b506102a9610602366004612865565b61112d565b348015610612575f5ffd5b506102cd604051806040016040528060058152602001640352e302e360dc1b81525081565b348015610642575f5ffd5b5061027761065136600461283a565b61113a565b348015610661575f5ffd5b50610277610670366004612a8e565b611146565b348015610680575f5ffd5b506103dd61068f366004612ae3565b61119c565b34801561069f575f5ffd5b506102776106ae366004612a8e565b611276565b3480156106be575f5ffd5b506103dd6106cd366004612b14565b6112c3565b3480156106dd575f5ffd5b506102776106ec36600461283a565b6113d5565b3480156106fc575f5ffd5b5061027761070b366004612984565b6113e0565b34801561071b575f5ffd5b506103dd61072a366004612956565b611476565b34801561073a575f5ffd5b50610277610749366004612984565b611492565b348015610759575f5ffd5b50610277610768366004612bb2565b611528565b348015610778575f5ffd5b506102777fb0296ea8dd3227371927b1c1cea2b12ea394743ddf2f32f58024ce26f83a24a681565b3480156107ab575f5ffd5b506102777f90ff0fdc2a5e2f52090b2c8a629804c58d5c1156b5405c8437a00da5abba239c81565b6040516370a0823160e01b81523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610837573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085b9190612bde565b905090565b5f6001600160e01b03198216637965db0b60e01b148061089057506301ffc9a760e01b6001600160e01b03198316145b92915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f51602061330d5f395f51905f52916108d490612bf5565b80601f016020809104026020016040519081016040528092919081815260200182805461090090612bf5565b801561094b5780601f106109225761010080835404028352916020019161094b565b820191905f5260205f20905b81548152906001019060200180831161092e57829003601f168201915b505050505091505090565b5f610890825f611571565b5f3361096e8185856115c8565b5060019392505050565b5f6108908260016115d5565b60408051606080820183525f80835260208301529181019190915260408051606081019091525f8054829060ff1660028111156109c3576109c361288f565b60028111156109d4576109d461288f565b8152602001600182015481526020016002820180546109f290612bf5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1e90612bf5565b8015610a695780601f10610a4057610100808354040283529160200191610a69565b820191905f5260205f20905b815481529060010190602001808311610a4c57829003601f168201915b505050505081525050905090565b5f610a8181611623565b610a8b8383611630565b505050565b5f33610a9d858285611690565b610aa88585856116da565b60019150505b9392505050565b5f9081525f51602061334d5f395f51905f52602052604090206001015490565b610ade82610ab5565b610ae781611623565b610af18383611737565b50505050565b5f805f51602061336d5f395f51905f5290505f8154610b209190600160a01b900460ff16612c3b565b91505090565b6001600160a01b0381163314610b4f5760405163334bd91960e11b815260040160405180910390fd5b610a8b82826117d8565b5f51602061336d5f395f51905f52546001600160a01b031690565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630bc47ad16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bd1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf59190612c68565b15610c0157505f919050565b61089082611851565b610c1261188e565b610c1b82611934565b610c25828261195e565b5050565b5f610c32611a1a565b505f51602061332d5f395f51905f5290565b7f90ff0fdc2a5e2f52090b2c8a629804c58d5c1156b5405c8437a00da5abba239c610c6e81611623565b60405163045136d760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f917f000000000000000000000000000000000000000000000000000000000000000090911690632289b6b8906024016060604051808303815f875af1158015610cf7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d1b9190612c81565b50909150506001600160a01b038116610d3357505050565b604051635b81a7bf60e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152306024830152600160448301527f0000000000000000000000000000000000000000000000000000000000000000169063b7034f7e906064015f604051808303815f87803b158015610dc0575f5ffd5b505af1158015610dd2573d5f5f3e3d5ffd5b50506040516370a0823160e01b81523060048201525f92506001600160a01b03841691506370a0823190602401602060405180830381865afa158015610e1a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3e9190612bde565b60408051606081019091525f8054929350918290829060ff166002811115610e6857610e6861288f565b6002811115610e7957610e7961288f565b815260200160018201548152602001600282018054610e9790612bf5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ec390612bf5565b8015610f0e5780601f10610ee557610100808354040283529160200191610f0e565b820191905f5260205f20905b815481529060010190602001808311610ef157829003601f168201915b50505050508152505073__$acbb9ece542dcf2065f41aa3c8cca5827e$__6377566915909185610f3c610b59565b868a6040518663ffffffff1660e01b8152600401610f5e959493929190612d00565b602060405180830381865af4158015610f79573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f9d9190612bde565b9050610fa881611a63565b7fdacbdde355ba930696a362ea6738feb9f8bd52dfb3d81947558fd3217e23e325838383604051610fdb93929190612d3f565b60405180910390a15050505050565b5f5f610ff583610b74565b90508084111561102757828482604051633c8097d960e11b815260040161101e93929190612d3f565b60405180910390fd5b5f611031856113d5565b905061103f33858784611b93565b949350505050565b6001600160a01b03165f9081525f51602061330d5f395f51905f52602052604090205490565b5f9182525f51602061334d5f395f51905f52602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f5f6110ae83610b74565b9050808411156110d75782848260405163284ff66760e01b815260040161101e93929190612d3f565b5f6110e18561113a565b905061103f33858388611b93565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f51602061330d5f395f51905f52916108d490612bf5565b5f3361096e8185856116da565b5f610890826001611571565b5f5f611151836113e0565b90508085111561117a57828582604051633fa733bb60e21b815260040161101e93929190612d3f565b5f61118486610978565b90506111933386868985611ba8565b95945050505050565b7f471cfe1a44bf1b786db7d7104d51e6728ed7b90a35394ad7cc424adf8ed168166111c681611623565b6111cf82612d6c565b604051632cbf28cb60e21b815273__$acbb9ece542dcf2065f41aa3c8cca5827e$__9163b2fca32c916112059190600401612de8565b5f6040518083038186803b15801561121b575f5ffd5b505af415801561122d573d5f5f3e3d5ffd5b505050507fca7f7aa563866a1d31c74deba224724d1da9c35cbb6f783f2ccf0182f91e34f85f83604051611262929190612e8e565b60405180910390a1815f610af1828261304c565b5f5f61128183611492565b9050808511156112aa57828582604051632e52afbb60e21b815260040161101e93929190612d3f565b5f6112b486610956565b9050611193338686848a611ba8565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156113075750825b90505f826001600160401b031660011480156113225750303b155b905081158015611330575080155b1561134e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561137857845460ff60401b1916600160401b1785555b61138489898989611c47565b83156113ca57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b5f610890825f6115d5565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166367800b5f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561143d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114619190612c68565b1561146d57505f919050565b61089082611ce3565b61147f82610ab5565b61148881611623565b610af183836117d8565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166367800b5f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114ef573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115139190612c68565b1561151f57505f919050565b61089082611cf6565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f610aae61157d6107d3565b6115889060016130dc565b6115935f600a6131d2565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546115bf91906130dc565b85919085611d00565b610a8b8383836001611d42565b5f610aae6115e482600a6131d2565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025461161091906130dc565b6116186107d3565b6115bf9060016130dc565b61162d8133611e25565b50565b5f51602061334d5f395f51905f525f61164884610ab5565b5f85815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b5f61169b8484611528565b90505f198114610af157818110156116cc57828183604051637dc7a0d960e11b815260040161101e93929190612d3f565b610af184848484035f611d42565b6001600160a01b03831661170357604051634b637e8f60e11b81525f600482015260240161101e565b6001600160a01b03821661172c5760405163ec442f0560e01b81525f600482015260240161101e565b610a8b838383611e5e565b5f5f51602061334d5f395f51905f52611750848461106d565b6117cf575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556117853390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610890565b5f915050610890565b5f5f51602061334d5f395f51905f526117f1848461106d565b156117cf575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610890565b5f61187c7fb0296ea8dd3227371927b1c1cea2b12ea394743ddf2f32f58024ce26f83a24a68361106d565b61188757505f919050565b5f19610890565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061191457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166119085f51602061332d5f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156119325760405163703e46dd60e11b815260040160405180910390fd5b565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610c2581611623565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156119b8575060408051601f3d908101601f191682019092526119b591810190612bde565b60015b6119e057604051634c9c8ce360e01b81526001600160a01b038316600482015260240161101e565b5f51602061332d5f395f51905f528114611a1057604051632a87526960e21b81526004810182905260240161101e565b610a8b8383611f84565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146119325760405163703e46dd60e11b815260040160405180910390fd5b611a6b610b59565b60405163095ea7b360e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201849052919091169063095ea7b3906044016020604051808303815f875af1158015611ad9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611afd9190612c68565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f2b9fdb8611b35610b59565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044015f604051808303815f87803b158015611b7a575f5ffd5b505af1158015611b8c573d5f5f3e3d5ffd5b5050505050565b611b9f84848484611fd9565b610af182611a63565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f3fef3a3611bdf610b59565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018590526044015f604051808303815f87803b158015611c24575f5ffd5b505af1158015611c36573d5f5f3e3d5ffd5b50505050611b8c8585858585612056565b611c4f61210a565b611cda8484847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c55dae636040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cb1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cd591906131e0565b612153565b610af1816121b0565b5f610890611cf083611047565b5f611571565b5f61089082611047565b5f611d2d611d0d83612231565b8015611d2857505f8480611d2357611d236131fb565b868809115b151590565b611d3886868661225d565b61119391906130dc565b5f51602061330d5f395f51905f526001600160a01b038516611d795760405163e602df0560e01b81525f600482015260240161101e565b6001600160a01b038416611da257604051634a1406b160e11b81525f600482015260240161101e565b6001600160a01b038086165f90815260018301602090815260408083209388168352929052208390558115611b8c57836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051611e1691815260200190565b60405180910390a35050505050565b611e2f828261106d565b610c255760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161101e565b5f51602061330d5f395f51905f526001600160a01b038416611e985781816002015f828254611e8d91906130dc565b90915550611ef59050565b6001600160a01b0384165f9081526020829052604090205482811015611ed75784818460405163391434e360e21b815260040161101e93929190612d3f565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316611f13576002810180548390039055611f31565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611f7691815260200190565b60405180910390a350505050565b611f8d82612313565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611fd157610a8b8282612376565b610c256123df565b5f51602061336d5f395f51905f528054611ffe906001600160a01b03168630866123fe565b6120088483612465565b836001600160a01b0316856001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78585604051611e16929190918252602082015260400190565b5f51602061336d5f395f51905f526001600160a01b038681169085161461208257612082848784611690565b61208c8483612499565b80546120a2906001600160a01b031686856124cd565b836001600160a01b0316856001600160a01b0316876001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db86866040516120fa929190918252602082015260400190565b60405180910390a4505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661193257604051631afcd79f60e31b815260040160405180910390fd5b61215b61210a565b6121636124fe565b61216b6124fe565b6001600160a01b038116612194576040516337bce3c560e11b81525f600482015260240161101e565b61219d81612506565b6121a78484612517565b610af182612529565b6121b861210a565b6121c181612d6c565b604051632cbf28cb60e21b815273__$acbb9ece542dcf2065f41aa3c8cca5827e$__9163b2fca32c916121f79190600401612de8565b5f6040518083038186803b15801561220d575f5ffd5b505af415801561221f573d5f5f3e3d5ffd5b50505050805f8181610a8b919061304c565b5f60028260038111156122465761224661288f565b612250919061320f565b60ff166001149050919050565b5f838302815f1985870982811083820303915050805f0361229157838281612287576122876131fb565b0492505050610aae565b8084116122a8576122a8600385150260111861253b565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b806001600160a01b03163b5f0361234857604051634c9c8ce360e01b81526001600160a01b038216600482015260240161101e565b5f51602061332d5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b031684604051612392919061323c565b5f60405180830381855af49150503d805f81146123ca576040519150601f19603f3d011682016040523d82523d5f602084013e6123cf565b606091505b509150915061119385838361254c565b34156119325760405163b398979f60e01b815260040160405180910390fd5b6040516001600160a01b038481166024830152838116604483015260648201839052610af19186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506125a8565b6001600160a01b03821661248e57