UNPKG

@luckyfinance/core

Version:

Core contracts for the LuckySwap protocol

1,159 lines 97.7 kB
{ "_format": "hh-sol-artifact-1", "contractName": "AlpineV1", "sourceName": "contracts/alpine/AlpineV1.sol", "abi": [ { "inputs": [ { "internalType": "contract IERC20", "name": "wethToken_", "type": "address" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "masterContract", "type": "address" }, { "indexed": false, "internalType": "bytes", "name": "data", "type": "bytes" }, { "indexed": true, "internalType": "address", "name": "cloneAddress", "type": "address" } ], "name": "LogDeploy", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address" }, { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "share", "type": "uint256" } ], "name": "LogDeposit", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "borrower", "type": "address" }, { "indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "feeAmount", "type": "uint256" }, { "indexed": true, "internalType": "address", "name": "receiver", "type": "address" } ], "name": "LogFlashLoan", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "protocol", "type": "address" } ], "name": "LogRegisterProtocol", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "masterContract", "type": "address" }, { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, { "indexed": false, "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "LogSetMasterContractApproval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "LogStrategyDivest", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "LogStrategyInvest", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "LogStrategyLoss", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "LogStrategyProfit", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address" }, { "indexed": true, "internalType": "contract IStrategy", "name": "strategy", "type": "address" } ], "name": "LogStrategyQueued", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address" }, { "indexed": true, "internalType": "contract IStrategy", "name": "strategy", "type": "address" } ], "name": "LogStrategySet", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "targetPercentage", "type": "uint256" } ], "name": "LogStrategyTargetPercentage", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address" }, { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "share", "type": "uint256" } ], "name": "LogTransfer", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "masterContract", "type": "address" }, { "indexed": false, "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "LogWhiteListMasterContract", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address" }, { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "share", "type": "uint256" } ], "name": "LogWithdraw", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "contract IERC20", "name": "", "type": "address" }, { "internalType": "address", "name": "", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes[]", "name": "calls", "type": "bytes[]" }, { "internalType": "bool", "name": "revertOnFail", "type": "bool" } ], "name": "batch", "outputs": [ { "internalType": "bool[]", "name": "successes", "type": "bool[]" }, { "internalType": "bytes[]", "name": "results", "type": "bytes[]" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "contract IBatchFlashBorrower", "name": "borrower", "type": "address" }, { "internalType": "address[]", "name": "receivers", "type": "address[]" }, { "internalType": "contract IERC20[]", "name": "tokens", "type": "address[]" }, { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "batchFlashLoan", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "claimOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "masterContract", "type": "address" }, { "internalType": "bytes", "name": "data", "type": "bytes" }, { "internalType": "bool", "name": "useCreate2", "type": "bool" } ], "name": "deploy", "outputs": [ { "internalType": "address", "name": "cloneAddress", "type": "address" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "contract IERC20", "name": "token_", "type": "address" }, { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "share", "type": "uint256" } ], "name": "deposit", "outputs": [ { "internalType": "uint256", "name": "amountOut", "type": "uint256" }, { "internalType": "uint256", "name": "shareOut", "type": "uint256" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "contract IFlashBorrower", "name": "borrower", "type": "address" }, { "internalType": "address", "name": "receiver", "type": "address" }, { "internalType": "contract IERC20", "name": "token", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "flashLoan", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "contract IERC20", "name": "token", "type": "address" }, { "internalType": "bool", "name": "balance", "type": "bool" }, { "internalType": "uint256", "name": "maxChangeAmount", "type": "uint256" } ], "name": "harvest", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "address", "name": "", "type": "address" } ], "name": "masterContractApproved", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "masterContractOf", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "nonces", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "pendingOwner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "contract IERC20", "name": "", "type": "address" } ], "name": "pendingStrategy", "outputs": [ { "internalType": "contract IStrategy", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "contract IERC20", "name": "token", "type": "address" }, { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" }, { "internalType": "uint8", "name": "v", "type": "uint8" }, { "internalType": "bytes32", "name": "r", "type": "bytes32" }, { "internalType": "bytes32", "name": "s", "type": "bytes32" } ], "name": "permitToken", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "registerProtocol", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "user", "type": "address" }, { "internalType": "address", "name": "masterContract", "type": "address" }, { "internalType": "bool", "name": "approved", "type": "bool" }, { "internalType": "uint8", "name": "v", "type": "uint8" }, { "internalType": "bytes32", "name": "r", "type": "bytes32" }, { "internalType": "bytes32", "name": "s", "type": "bytes32" } ], "name": "setMasterContractApproval", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "contract IERC20", "name": "token", "type": "address" }, { "internalType": "contract IStrategy", "name": "newStrategy", "type": "address" } ], "name": "setStrategy", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "contract IERC20", "name": "token", "type": "address" }, { "internalType": "uint64", "name": "targetPercentage_", "type": "uint64" } ], "name": "setStrategyTargetPercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "contract IERC20", "name": "", "type": "address" } ], "name": "strategy", "outputs": [ { "internalType": "contract IStrategy", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "contract IERC20", "name": "", "type": "address" } ], "name": "strategyData", "outputs": [ { "internalType": "uint64", "name": "strategyStartDate", "type": "uint64" }, { "internalType": "uint64", "name": "targetPercentage", "type": "uint64" }, { "internalType": "uint128", "name": "balance", "type": "uint128" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "contract IERC20", "name": "token", "type": "address" }, { "internalType": "uint256", "name": "share", "type": "uint256" }, { "internalType": "bool", "name": "roundUp", "type": "bool" } ], "name": "toAmount", "outputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "contract IERC20", "name": "token", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "bool", "name": "roundUp", "type": "bool" } ], "name": "toShare", "outputs": [ { "internalType": "uint256", "name": "share", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "contract IERC20", "name": "", "type": "address" } ], "name": "totals", "outputs": [ { "internalType": "uint128", "name": "elastic", "type": "uint128" }, { "internalType": "uint128", "name": "base", "type": "uint128" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "contract IERC20", "name": "token", "type": "address" }, { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "share", "type": "uint256" } ], "name": "transfer", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "contract IERC20", "name": "token", "type": "address" }, { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address[]", "name": "tos", "type": "address[]" }, { "internalType": "uint256[]", "name": "shares", "type": "uint256[]" } ], "name": "transferMultiple", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" }, { "internalType": "bool", "name": "direct", "type": "bool" }, { "internalType": "bool", "name": "renounce", "type": "bool" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "masterContract", "type": "address" }, { "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "whitelistMasterContract", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "whitelistedMasterContracts", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "contract IERC20", "name": "token_", "type": "address" }, { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "share", "type": "uint256" } ], "name": "withdraw", "outputs": [ { "internalType": "uint256", "name": "amountOut", "type": "uint256" }, { "internalType": "uint256", "name": "shareOut", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "stateMutability": "payable", "type": "receive" } ], "bytecode": "0x60e06040523480156200001157600080fd5b50604051620047bd380380620047bd833981016040819052620000349162000116565b600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a34660a081905262000084816200009e565b6080525060601b6001600160601b03191660c0526200016a565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667febf00f4d8daed32e5895b04dd95af96b2db26e3be3d53795c2592fadd09556178330604051602001620000f9949392919062000146565b604051602081830303815290604052805190602001209050919050565b60006020828403121562000128578081fd5b81516001600160a01b03811681146200013f578182fd5b9392505050565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60805160a05160c05160601c614614620001a9600039806106c552806109925280611ed052806120b152508061102152508061105652506146146000f3fe6080604052600436106101dc5760003560e01c80637c516e9411610102578063d2423b5111610095578063f1676d3711610064578063f1676d3714610555578063f18d03cc14610575578063f483b3da14610595578063f7888aec146105b5576101e3565b8063d2423b51146104d0578063da5139ca146104f1578063df23b45b14610511578063e30c397814610540576101e3565b806397da6d30116100d157806397da6d301461045b578063aee4d1b21461047b578063bafe4f1414610490578063c0a47c93146104b0576101e3565b80637c516e94146103e65780637ecebe00146104065780638da5cb5b1461042657806391e0eab51461043b576101e3565b80633e2a9d4e1161017a5780635662311811610149578063566231181461036657806366c6bb0b1461038657806372cb5d97146103a6578063733a9d7c146103c6576101e3565b80633e2a9d4e146102e35780634e71e0c8146103035780634ffe34db146103185780635108a55814610346576101e3565b806312a90c8a116101b657806312a90c8a146102545780631f54245b14610281578063228bfd9f146102a15780633644e515146102c1576101e3565b806302b9446c146101e8578063078dfbe7146102125780630fca884314610234576101e3565b366101e357005b600080fd5b6101fb6101f6366004613795565b6105d5565b6040516102099291906144ea565b60405180910390f35b34801561021e57600080fd5b5061023261022d36600461354c565b610a99565b005b34801561024057600080fd5b5061023261024f366004613870565b610b7f565b34801561026057600080fd5b5061027461026f36600461345f565b610e30565b6040516102099190613e01565b61029461028f366004613596565b610e45565b6040516102099190613bc8565b3480156102ad57600080fd5b506102946102bc36600461345f565b611001565b3480156102cd57600080fd5b506102d661101c565b6040516102099190613e0c565b3480156102ef57600080fd5b506102326102fe366004613977565b61107c565b34801561030f57600080fd5b50610232611147565b34801561032457600080fd5b5061033861033336600461345f565b6111d4565b6040516102099291906144d0565b34801561035257600080fd5b5061029461036136600461345f565b6111fa565b34801561037257600080fd5b506102d6610381366004613941565b611215565b34801561039257600080fd5b506102326103a1366004613901565b611269565b3480156103b257600080fd5b506102326103c1366004613733565b611832565b3480156103d257600080fd5b506102326103e136600461351f565b611c90565b3480156103f257600080fd5b506102326104013660046137ef565b611d34565b34801561041257600080fd5b506102d661042136600461345f565b611da8565b34801561043257600080fd5b50610294611dba565b34801561044757600080fd5b5061027461045636600461347b565b611dc9565b34801561046757600080fd5b506101fb610476366004613795565b611de9565b34801561048757600080fd5b506102326121fd565b34801561049c57600080fd5b506102946104ab36600461345f565b612244565b3480156104bc57600080fd5b506102326104cb3660046134b3565b61225f565b6104e36104de3660046135fb565b61256e565b604051610209929190613d67565b3480156104fd57600080fd5b506102d661050c366004613941565b6126fe565b34801561051d57600080fd5b5061053161052c36600461345f565b61274a565b6040516102099392919061450c565b34801561054c57600080fd5b50610294612783565b34801561056157600080fd5b506102326105703660046139af565b612792565b34801561058157600080fd5b50610232610590366004613745565b6128e3565b3480156105a157600080fd5b506102326105b0366004613660565b612a87565b3480156105c157600080fd5b506102d66105d0366004613733565b612d47565b600080856001600160a01b03811633148015906105fb57506001600160a01b0381163014155b1561068657336000908152600260205260409020546001600160a01b03168061063f5760405162461bcd60e51b8152600401610636906143c0565b60405180910390fd5b6001600160a01b0380821660009081526003602090815260408083209386168352929052205460ff166106845760405162461bcd60e51b81526004016106369061427a565b505b6001600160a01b0386166106ac5760405162461bcd60e51b815260040161063690613fb5565b60006001600160a01b038916156106c357886106e5565b7f00000000000000000000000000000000000000000000000000000000000000005b90506106ef613385565b506001600160a01b0381166000908152600760209081526040918290208251808401909352546001600160801b03808216808552600160801b90920416918301919091521515806107b057506000826001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561077657600080fd5b505afa15801561078a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ae9190613a1f565b115b6107cc5760405162461bcd60e51b8152600401610636906140d2565b85610824576107dd81886000612d64565b95506103e86108026107ee88612dfe565b60208401516001600160801b031690612e2b565b6001600160801b0316101561081f57600080945094505050610a8e565b610833565b61083081876001612e60565b96505b6001600160a01b0389163014158061085257506001600160a01b038a16155b8061087a57508051610876906001600160801b031661087084612edf565b90612f87565b8711155b6108965760405162461bcd60e51b815260040161063690613f86565b6001600160a01b038083166000908152600660209081526040808320938c16835292905220546108c69087612faa565b6001600160a01b038084166000908152600660209081526040808320938d168352929052205561090c6108f887612dfe565b60208301516001600160801b031690612e2b565b6001600160801b0316602082015261093761092688612dfe565b82516001600160801b031690612e2b565b6001600160801b0390811682526001600160a01b03808416600090815260076020908152604090912084518154928601518516600160801b029085166001600160801b031990931692909217909316179091558a16610a09577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0886040518263ffffffff1660e01b81526004016000604051808303818588803b1580156109eb57600080fd5b505af11580156109ff573d6000803e3d6000fd5b5050505050610a2e565b6001600160a01b0389163014610a2e57610a2e6001600160a01b0383168a308a612fcd565b876001600160a01b0316896001600160a01b0316836001600160a01b03167fb2346165e782564f17f5b7e555c21f4fd96fbc93458572bf0113ea35a958fc558a8a604051610a7d9291906144ea565b60405180910390a486945085935050505b509550959350505050565b6000546001600160a01b03163314610ac35760405162461bcd60e51b81526004016106369061416b565b8115610b5e576001600160a01b038316151580610add5750805b610af95760405162461bcd60e51b81526004016106369061403d565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0385166001600160a01b031991821617909155600180549091169055610b7a565b600180546001600160a01b0319166001600160a01b0385161790555b505050565b846001600160a01b0381163314801590610ba257506001600160a01b0381163014155b15610c2457336000908152600260205260409020546001600160a01b031680610bdd5760405162461bcd60e51b8152600401610636906143c0565b6001600160a01b0380821660009081526003602090815260408083209386168352929052205460ff16610c225760405162461bcd60e51b81526004016106369061427a565b505b600085858281610c3057fe5b9050602002016020810190610c45919061345f565b6001600160a01b03161415610c6c5760405162461bcd60e51b8152600401610636906140a3565b600084815b81811015610dc8576000888883818110610c8757fe5b9050602002016020810190610c9c919061345f565b9050610d0b878784818110610cad57fe5b90506020020135600660008e6001600160a01b03166001600160a01b031681526020019081526020016000206000846001600160a01b03166001600160a01b0316815260200190815260200160002054612faa90919063ffffffff16565b6001600160a01b03808d16600090815260066020908152604080832093861683529290522055610d56878784818110610d4057fe5b9050602002013585612faa90919063ffffffff16565b9350806001600160a01b03168a6001600160a01b03168c6001600160a01b03167f6eabe333476233fd382224f233210cb808a7bc4c4de64f9d76628bf63c677b1a8a8a87818110610da357fe5b90506020020135604051610db79190613e0c565b60405180910390a450600101610c71565b506001600160a01b03808a166000908152600660209081526040808320938c1683529290522054610df99083612f87565b6001600160a01b03998a1660009081526006602090815260408083209b909c16825299909952989097209790975550505050505050565b60046020526000908152604090205460ff1681565b60006001600160a01b038516610e6d5760405162461bcd60e51b8152600401610636906142b1565b606085901b8215610edf5760008585604051610e8a929190613b72565b60405180910390209050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260148201526e5af43d82803e903d91602b57fd5bf360881b6028820152816037826000f593505050610f24565b604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09250505b6001600160a01b038281166000818152600260205260409081902080546001600160a01b031916938a16939093179092559051631377d1f560e21b8152634ddf47d4903490610f799089908990600401613e8b565b6000604051808303818588803b158015610f9257600080fd5b505af1158015610fa6573d6000803e3d6000fd5b5050505050816001600160a01b0316866001600160a01b03167fd62166f3c2149208e51788b1401cc356bf5da1fc6c7886a32e18570f57d88b3b8787604051610ff0929190613e8b565b60405180910390a350949350505050565b6008602052600090815260409020546001600160a01b031681565b6000467f000000000000000000000000000000000000000000000000000000000000000081146110545761104f816130c6565b611076565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b6000546001600160a01b031633146110a65760405162461bcd60e51b81526004016106369061416b565b605f816001600160401b031611156110d05760405162461bcd60e51b815260040161063690614465565b6001600160a01b0382166000818152600a602052604090819020805467ffffffffffffffff60401b1916600160401b6001600160401b03861602179055517f7543af99b5602c06e62da0631b5308489a5ff859150105a623b6eb15e8deae0b9061113b9084906144f8565b60405180910390a25050565b6001546001600160a01b03163381146111725760405162461bcd60e51b8152600401610636906141a0565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b6007602052600090815260409020546001600160801b0380821691600160801b90041682565b6009602052600090815260409020546001600160a01b031681565b6001600160a01b03831660009081526007602090815260408083208151808301909252546001600160801b038082168352600160801b9091041691810191909152611261908484612e60565b949350505050565b61127161339c565b506001600160a01b038381166000818152600a60209081526040808320815160608101835290546001600160401b038082168352600160401b82041682850152600160801b90046001600160801b031681830190815294845260089092528083205493519051630c7e663b60e11b81529194939093169283916318fccc76916112fe9133906004016144ae565b602060405180830381600087803b15801561131857600080fd5b505af115801561132c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113509190613a1f565b90508015801561135e575084155b1561136b57505050610b7a565b6001600160a01b0386166000908152600760205260408120546001600160801b03169082131561142157816113a08282612faa565b91506113ab82612dfe565b6001600160a01b0389166000818152600760205260409081902080546001600160801b0319166001600160801b03949094169390931790925590517f911c9f20a03edabcbcbd18dca1174cce47a91b234ced7a5a3c60ba0d5b56c5d290611413908490613e0c565b60405180910390a2506114ef565b60008212156114ef5760008290036114398282612f87565b915061144482612dfe565b6001600160a01b038916600090815260076020526040902080546001600160801b0319166001600160801b039290921691909117905561149a61148682612dfe565b60408701516001600160801b03169061313d565b6001600160801b0316604080870191909152516001600160a01b038916907f8f1f26eb9b6aa8689dbdd519ead1999d9c8819d4738e403b2003b18197d9cf97906114e5908490613e0c565b60405180910390a2505b85156117ae576000606461151986602001516001600160401b03168461316c90919063ffffffff16565b8161152057fe5b0490508085604001516001600160801b0316101561165b57600061155a86604001516001600160801b031683612f8790919063ffffffff16565b9050861580159061156a57508681115b156115725750855b6115866001600160a01b038a1686836131a3565b6115a661159282612dfe565b60408801516001600160801b031690612e2b565b6001600160801b031660408088019190915251636939aaf560e01b81526001600160a01b03861690636939aaf5906115e2908490600401613e0c565b600060405180830381600087803b1580156115fc57600080fd5b505af1158015611610573d6000803e3d6000fd5b50505050886001600160a01b03167fb18e7e4f6eac147a63a3bb6beb2d9039c88698623aff3efc4febbc20b0164ee58260405161164d9190613e0c565b60405180910390a2506117ac565b8085604001516001600160801b031611156117ac57600061169261167e83612dfe565b60408801516001600160801b03169061313d565b6001600160801b0316905086158015906116ab57508681115b156116b35750855b604051632e1a7d4d60e01b81526000906001600160a01b03871690632e1a7d4d906116e2908590600401613e0c565b602060405180830381600087803b1580156116fc57600080fd5b505af1158015611710573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117349190613a1f565b905061175661174282612dfe565b60408901516001600160801b03169061313d565b6001600160801b0316604080890191909152516001600160a01b038b16907f39aa22060f8dd4d291720311feedf3b72fef47c06c66ccf5c22b502c62e7550a906117a1908490613e0c565b60405180910390a250505b505b5050506001600160a01b0384166000908152600a6020908152604091829020835181549285015193909401516001600160801b03908116600160801b026001600160401b03948516600160401b0267ffffffffffffffff60401b199590961667ffffffffffffffff1990941693909317939093169390931791909116179055505050565b6000546001600160a01b0316331461185c5760405162461bcd60e51b81526004016106369061416b565b61186461339c565b506001600160a01b038281166000818152600a60209081526040808320815160608101835290546001600160401b038082168352600160401b8204811683860152600160801b9091046001600160801b0316828401529484526009909252909120548151919316911615806118eb5750826001600160a01b0316816001600160a01b031614155b15611975576001600160a01b03848116600090815260096020526040902080546001600160a01b03191691851691909117905561192c621275004201613299565b6001600160401b031682526040516001600160a01b0380851691908616907f6f7ccdf3f86039e5a1dcf6028bf7b4773cbf7a234716ba2e5392b12bb0f8558f90600090a3611c10565b81516001600160401b031615801590611998575081516001600160401b03164210155b6119b45760405162461bcd60e51b815260040161063690614134565b6001600160a01b038481166000908152600860205260409020541615611b99576001600160a01b0380851660009081526008602052604080822054858201519151637f8661a160e01b815292931691637f8661a191611a159160040161449a565b602060405180830381600087803b158015611a2f57600080fd5b505af1158015611a43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a679190613a1f565b90506000811315611ade576001600160a01b03851660009081526007602052604090208190611a9690826132c2565b50856001600160a01b03167f911c9f20a03edabcbcbd18dca1174cce47a91b234ced7a5a3c60ba0d5b56c5d282604051611ad09190613e0c565b60405180910390a250611b52565b6000811215611b52576001600160a01b03851660009081526007602052604081209082900390611b0e9082613306565b50856001600160a01b03167f8f1f26eb9b6aa8689dbdd519ead1999d9c8819d4738e403b2003b18197d9cf9782604051611b489190613e0c565b60405180910390a2505b846001600160a01b03167f39aa22060f8dd4d291720311feedf3b72fef47c06c66ccf5c22b502c62e7550a8460400151604051611b8f919061449a565b60405180910390a2505b6001600160a01b03808516600081815260086020908152604080832080548688166001600160a01b0319918216179091558388528782018490528484526009909252808320805490921690915551928616927f03e6352a885adc4cc54767592939c3b1bbd65685658c3beaaba66a888120e2179190a35b506001600160a01b03929092166000908152600a60209081526040918290208451815492860151939095015167ffffffffffffffff199092166001600160401b039586161767ffffffffffffffff60401b1916600160401b9590931694909402919091176001600160801b03908116600160801b91909216021790915550565b6000546001600160a01b03163314611cba5760405162461bcd60e51b81526004016106369061416b565b6001600160a01b038216611ce05760405162461bcd60e51b815260040161063690613ee1565b6001600160a01b03821660008181526004602052604090819020805460ff1916841515179055517f31a1e0eac44b54ac6c2a2efa87e92c83405ffcf33fceef02a7bca695130e26009061113b908490613e01565b60405163d505accf60e01b81526001600160a01b0389169063d505accf90611d6c908a908a908a908a908a908a908a90600401613d0d565b600060405180830381600087803b158015611d8657600080fd5b505af1158015611d9a573d6000803e3d6000fd5b505050505050505050505050565b60056020526000908152604090205481565b6000546001600160a01b031681565b600360209081526000928352604080842090915290825290205460ff1681565b600080856001600160a01b0381163314801590611e0f57506001600160a01b0381163014155b15611e9157336000908152600260205260409020546001600160a01b031680611e4a5760405162461bcd60e51b8152600401610636906143c0565b6001600160a01b0380821660009081526003602090815260408083209386168352929052205460ff16611e8f5760405162461bcd60e51b81526004016106369061427a565b505b6001600160a01b038616611eb75760405162461bcd60e51b815260040161063690613fb5565b60006001600160a01b03891615611ece5788611ef0565b7f00000000000000000000000000000000000000000000000000000000000000005b9050611efa613385565b506001600160a01b0381166000908152600760209081526040918290208251808401909352546001600160801b038082168452600160801b909104169082015285611f5257611f4b81886001612d64565b9550611f61565b611f5e81876000612e60565b96505b6001600160a01b038083166000908152600660209081526040808320938d1683529290522054611f919087612f87565b6001600160a01b038084166000908152600660209081526040808320938e1683529290522055611fd4611fc388612dfe565b82516001600160801b03169061313d565b6001600160801b03168152611fff611feb87612dfe565b60208301516001600160801b03169061313d565b6001600160801b0316602082018190526103e811158061202a575060208101516001600160801b0316155b6120465760405162461bcd60e51b81526004016106369061400f565b6001600160a01b03828116600090815260076020908152604090912083518154928501516001600160801b03199093166001600160801b03918216178116600160801b91909316029190911790558a1661219a57604051632e1a7d4d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d906120e6908a90600401613e0c565b600060405180830381600087803b15801561210057600080fd5b505af1158015612114573d6000803e3d6000fd5b505050506000886001600160a01b03168860405161213190613bc5565b60006040518083038185875af1925050503d806000811461216e576040519150601f19603f3d011682016040523d82523d6000602084013e612173565b606091505b50509050806121945760405162461bcd60e51b815260040161063690614389565b506121ae565b6121ae6001600160a01b03831689896131a3565b876001600160a01b0316896001600160a01b0316836001600160a01b03167fad9ab9ee6953d4d177f4a03b3a3ac3178ffcb9816319f348060194aa76b144868a8a604051610a7d9291906144ea565b3360008181526002602052604080822080546001600160a01b03191684179055517fdfb44ffabf0d3a8f650d3ce43eff98f6d050e7ea1a396d5794f014e7dadabacb9190a2565b6002602052600090815260409020546001600160a01b031681565b6001600160a01b0385166122855760405162461bcd60e51b8152600401610636906142e6565b81158015612291575080155b801561229e575060ff8316155b15612340576001600160a01b03861633146122cb5760405162461bcd60e51b815260040161063690613f18565b6001600160a01b0386811660009081526002602052604090205416156123035760405162461bcd60e51b81526004016106369061420c565b6001600160a01b03851660009081526004602052604090205460ff1661233b5760405162461bcd60e51b8152600401610636906143f7565b6124fa565b6001600160a01b0386166123665760405162461bcd60e51b815260040161063690614352565b600060405180604001604052806002815260200161190160f01b81525061238b61101c565b7f1962bc9f5484cb7a998701b81090e966ee1fce5771af884cceee7c081b14ade2876123d7577f46503c95e3ff9150f30fb502f601c7b704a954200aff7ff12c0b7b5217144b746123f9565b7fbcec9f09e2a02097d0e3cca689b007f034427df5af78723f4be3c67e6e9d19c15b6001600160a01b038b1660009081526005602090815260409182902080546001810190915591516124339493928e928e928e929101613e15565b6040516020818303038152906040528051906020012060405160200161245b93929190613b9e565b6040516020818303038152906040528051906020012090506000600182868686604051600081526020016040526040516124989493929190613e6d565b6020604051602081039080840390855afa1580156124ba573d6000803e3d6000fd5b505050602060405103519050876001600160a01b0316816001600160a01b0316146124f75760405162461bcd60e51b815260040161063690614243565b50505b6001600160a01b038581166000818152600360209081526040808320948b168084529490915290819020805460ff1916881515179055517f5f6ebb64ba012a851c6f014e6cad458ddf213d1512049b31cd06365c2b0592579061255e908890613e01565b60405180910390a3505050505050565b606080836001600160401b038111801561258757600080fd5b506040519080825280602002602001820160405280156125b1578160200160208202803683370190505b509150836001600160401b03811180156125ca57600080fd5b506040519080825280602002602001820160405280156125fe57816020015b60608152602001906001900390816125e95790505b50905060005b848110156126f557600060603088888581811061261d57fe5b905060200281019061262f9190614538565b60405161263d929190613b72565b600060405180830381855af49150503d8060008114612678576040519150601f19603f3d011682016040523d82523d6000602084013e61267d565b606091505b5091509150818061268c575085155b61269582613325565b906126b35760405162461bcd60e51b81526004016106369190613e9f565b50818584815181106126c157fe5b602002602001019015159081151581525050808484815181106126e057fe5b60209081029190910101525050600101612604565b50935093915050565b6001600160a01b03831660009081526007602090815260408083208151808301909252546001600160801b038082168352600160801b9091041691810191909152611261908484612d64565b600a602052600090815260409020546001600160401b0380821691600160401b810490911690600160801b90046001600160801b031683565b6001546001600160a01b031681565b6000620186a06127a385603261316c565b816127aa57fe5b0490506127c16001600160a01b03861687866131a3565b6040516323e30c8b60e01b81526001600160a01b038816906323e30c8b906127f79033908990899087908a908a90600401613ca2565b600060405180830381600087803b15801561281157600080fd5b505af1158015612825573d6000803e3d6000fd5b5050505061285c61283582612dfe565b6001600160a01b0387166000908152600760205260409020906001600160801b03166132c2565b61286586612edf565b10156128835760405162461bcd60e51b815260040161063690613fe1565b856001600160a01b0316856001600160a01b0316886001600160a01b03167f3be9b85936d5d30a1655ea116a17ee3d827b2cd428cc026ce5bf2ac46a22320487856040516128d29291906144ea565b60405180910390a450505050505050565b826001600160a01b038116331480159061290657506001600160a01b0381163014155b1561298857336000908152600260205260409020546001600160a01b0316806129415760405162461bcd60e51b8152600401610636906143c0565b6001600160a01b0380821660009081526003602090815260408083209386168352929052205460ff166129865760405162461bcd60e51b81526004016106369061427a565b505b6001600160a01b0383166129ae5760405162461bcd60e51b815260040161063690613fb5565b6001600160a01b038086166000908152600660209081526040808320938816835292905220546129de9083612f87565b6001600160a01b03868116600090815260066020908152604080832089851684529091528082209390935590851681522054612a1a9083612faa565b6001600160a01b0380871660008181526006602090815260408083208986168085529252918290209490945551918716917f6eabe333476233fd382224f233210cb808a7bc4c4de64f9d76628bf63c677b1a90612a78908790613e0c565b60405180910390a45050505050565b6060856001600160401b0381118015612a9f57600080fd5b50604051908082528060200260200182016040528015612ac9578160200160208202803683370190505b5090508560005b81811015612b98576000878783818110612ae657fe5b905060200201359050620186a0612b0760328361316c90919063ffffffff16565b81612b0e57fe5b04848381518110612b1b57fe5b602002602001018181525050612b8f8c8c84818110612b3657fe5b9050602002016020810190612b4b919061345f565b898985818110612b5757fe5b905060200201358c8c86818110612b6a57fe5b9050602002016020810190612b7f919061345f565b6001600160a01b031691906131a3565b50600101612ad0565b5060405163d9d1762360e01b81526001600160a01b038c169063d9d1762390612bd39033908c908c908c908c908a908d908d90600401613bdc565b600060405180830381600087803b158015612bed57600080fd5b505af1158015612c01573d6000803e3d6000fd5b5050505060005b81811015611d9a576000898983818110612c1e57fe5b9050602002016020810190612c33919061345f565b9050612c7b612c54858481518110612c4757fe5b6020026020010151612dfe565b6001600160a01b0383166000908152600760205260409020906001600160801b03166132c2565b612c8482612edf565b1015612ca25760405162461bcd60e51b815260040161063690613fe1565b8b8b83818110612cae57fe5b9050602002016020810190612cc3919061345f565b6001600160a01b0316816001600160a01b03168e6001600160a01b03167f3be9b85936d5d30a1655ea116a17ee3d827b2cd428cc026ce5bf2ac46a2232048b8b87818110612d0d57fe5b90506020020135888781518110612d2057fe5b6020026020010151604051612d369291906144ea565b60405180910390a450600101612c08565b600660209081526000928352604080842090915290825290205481565b82516000906001600160801b0316612d7d575081612df7565b835160208501516001600160801b0391821691612d9c9186911661316c565b81612da357fe5b049050818015612de757508284602001516001600160801b0316612ddd86600001516001600160801b03168461316c90919063ffffffff16565b81612de457fe5b04105b15612df757611261816001612faa565b9392505050565b60006001600160801b03821115612e275760405162461bcd60e51b81526004016106369061406c565b5090565b8181016001600160801b038083169082161015612e5a5760405162461bcd60e51b8152600401610636906140fd565b92915050565b600083602001516001600160801b031660001415612e7f575081612df7565b602084015184516001600160801b0391821691612e9e9186911661316c565b81612ea557fe5b049050818015612de757508284600001516001600160801b0316612ddd86602001516001600160801b03168461316c90919063ffffffff16565b6001600160a01b0381166000818152600a60205260408082205490516370a0823160e01b81529192612e5a92600160801b9092046001600160801b0316916370a0823190612f31903090600401613bc8565b602060405180830