UNPKG

test-contracts-sovryn

Version:

Smart contracts for the Sovryn protocol and external integrations.

1,271 lines 85.8 kB
{ "_format": "hh-sol-artifact-1", "contractName": "LiquidityMining", "sourceName": "contracts/farm/LiquidityMining.sol", "abi": [ { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "admin", "type": "address" } ], "name": "AdminAdded", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "admin", "type": "address" } ], "name": "AdminRemoved", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, { "indexed": true, "internalType": "address", "name": "poolToken", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "Deposit", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, { "indexed": true, "internalType": "address", "name": "poolToken", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "accumulatedReward", "type": "uint256" } ], "name": "EmergencyWithdraw", "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" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, { "indexed": true, "internalType": "address", "name": "poolToken", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "allocationPoint", "type": "uint256" } ], "name": "PoolTokenAdded", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, { "indexed": true, "internalType": "address", "name": "poolToken", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "newAllocationPoint", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "oldAllocationPoint", "type": "uint256" } ], "name": "PoolTokenUpdated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, { "indexed": true, "internalType": "address", "name": "poolToken", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "RewardClaimed", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "receiver", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "SOVTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, { "indexed": true, "internalType": "address", "name": "poolToken", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "Withdraw", "type": "event" }, { "constant": true, "inputs": [], "name": "BONUS_BLOCK_MULTIPLIER", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "PRECISION", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "SECONDS_PER_BLOCK", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "SOV", "outputs": [ { "internalType": "contract IERC20", "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "_poolToken", "type": "address" }, { "internalType": "uint96", "name": "_allocationPoint", "type": "uint96" }, { "internalType": "bool", "name": "_withUpdate", "type": "bool" } ], "name": "add", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "_admin", "type": "address" } ], "name": "addAdmin", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "admins", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "bonusEndBlock", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "_poolToken", "type": "address" }, { "internalType": "address", "name": "_user", "type": "address" } ], "name": "claimReward", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "_user", "type": "address" } ], "name": "claimRewardFromAllPools", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "_poolToken", "type": "address" }, { "internalType": "uint256", "name": "_amount", "type": "uint256" }, { "internalType": "address", "name": "_user", "type": "address" } ], "name": "deposit", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "_poolToken", "type": "address" } ], "name": "emergencyWithdraw", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [], "name": "endBlock", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "_poolToken", "type": "address" }, { "internalType": "uint256", "name": "_amount", "type": "uint256" }, { "internalType": "uint256", "name": "_duration", "type": "uint256" } ], "name": "getEstimatedReward", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "getMissedBalance", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "_poolToken", "type": "address" } ], "name": "getPoolId", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "_poolToken", "type": "address" } ], "name": "getPoolInfo", "outputs": [ { "components": [ { "internalType": "contract IERC20", "name": "poolToken", "type": "address" }, { "internalType": "uint96", "name": "allocationPoint", "type": "uint96" }, { "internalType": "uint256", "name": "lastRewardBlock", "type": "uint256" }, { "internalType": "uint256", "name": "accumulatedRewardPerShare", "type": "uint256" } ], "internalType": "struct LiquidityMiningStorage.PoolInfo", "name": "", "type": "tuple" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "getPoolInfoList", "outputs": [ { "components": [ { "internalType": "contract IERC20", "name": "poolToken", "type": "address" }, { "internalType": "uint96", "name": "allocationPoint", "type": "uint96" }, { "internalType": "uint256", "name": "lastRewardBlock", "type": "uint256" }, { "internalType": "uint256", "name": "accumulatedRewardPerShare", "type": "uint256" } ], "internalType": "struct LiquidityMiningStorage.PoolInfo[]", "name": "", "type": "tuple[]" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "getPoolLength", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "_poolToken", "type": "address" }, { "internalType": "address", "name": "_user", "type": "address" } ], "name": "getUserAccumulatedReward", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "_user", "type": "address" } ], "name": "getUserAccumulatedRewardList", "outputs": [ { "internalType": "uint256[]", "name": "", "type": "uint256[]" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "_user", "type": "address" } ], "name": "getUserBalanceList", "outputs": [ { "internalType": "uint256[2][]", "name": "", "type": "uint256[2][]" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "_poolToken", "type": "address" }, { "internalType": "address", "name": "_user", "type": "address" } ], "name": "getUserInfo", "outputs": [ { "components": [ { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "rewardDebt", "type": "uint256" }, { "internalType": "uint256", "name": "accumulatedReward", "type": "uint256" } ], "internalType": "struct LiquidityMiningStorage.UserInfo", "name": "", "type": "tuple" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "_user", "type": "address" } ], "name": "getUserInfoList", "outputs": [ { "components": [ { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "rewardDebt", "type": "uint256" }, { "internalType": "uint256", "name": "accumulatedReward", "type": "uint256" } ], "internalType": "struct LiquidityMiningStorage.UserInfo[]", "name": "", "type": "tuple[]" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "_poolToken", "type": "address" }, { "internalType": "address", "name": "_user", "type": "address" } ], "name": "getUserPoolTokenBalance", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "contract IERC20", "name": "_SOV", "type": "address" }, { "internalType": "uint256", "name": "_rewardTokensPerBlock", "type": "uint256" }, { "internalType": "uint256", "name": "_startDelayBlocks", "type": "uint256" }, { "internalType": "uint256", "name": "_numberOfBonusBlocks", "type": "uint256" }, { "internalType": "address", "name": "_wrapper", "type": "address" }, { "internalType": "contract ILockedSOV", "name": "_lockedSOV", "type": "address" }, { "internalType": "uint256", "name": "_unlockedImmediatelyPercent", "type": "uint256" } ], "name": "initialize", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [], "name": "isOwner", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "lockedSOV", "outputs": [ { "internalType": "contract ILockedSOV", "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "_user", "type": "address" }, { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "onTokensDeposited", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "poolInfoList", "outputs": [ { "internalType": "contract IERC20", "name": "poolToken", "type": "address" }, { "internalType": "uint96", "name": "allocationPoint", "type": "uint96" }, { "internalType": "uint256", "name": "lastRewardBlock", "type": "uint256" }, { "internalType": "uint256", "name": "accumulatedRewardPerShare", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "_admin", "type": "address" } ], "name": "removeAdmin", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [], "name": "rewardTokensPerBlock", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "contract ILockedSOV", "name": "_lockedSOV", "type": "address" } ], "name": "setLockedSOV", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "uint256", "name": "_unlockedImmediatelyPercent", "type": "uint256" } ], "name": "setUnlockedImmediatelyPercent", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "_wrapper", "type": "address" } ], "name": "setWrapper", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [], "name": "startBlock", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [], "name": "stopMining", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [], "name": "totalAllocationPoint", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "totalUsersBalance", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "_receiver", "type": "address" }, { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "transferSOV", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [], "name": "unlockedImmediatelyPercent", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "_poolToken", "type": "address" }, { "internalType": "uint96", "name": "_allocationPoint", "type": "uint96" }, { "internalType": "bool", "name": "_updateAllFlag", "type": "bool" } ], "name": "update", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [], "name": "updateAllPools", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "_poolToken", "type": "address" } ], "name": "updatePool", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address[]", "name": "_poolTokens", "type": "address[]" }, { "internalType": "uint96[]", "name": "_allocationPoints", "type": "uint96[]" }, { "internalType": "bool", "name": "_updateAllFlag", "type": "bool" } ], "name": "updateTokens", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "address", "name": "", "type": "address" } ], "name": "userInfoMap", "outputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "rewardDebt", "type": "uint256" }, { "internalType": "uint256", "name": "accumulatedReward", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "_poolToken", "type": "address" }, { "internalType": "uint256", "name": "_amount", "type": "uint256" }, { "internalType": "address", "name": "_user", "type": "address" } ], "name": "withdraw", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [], "name": "wrapper", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" } ], "bytecode": "0x608060405260006100176001600160e01b0361006616565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061006a565b3390565b613855806200007a6000396000f3fe608060405234801561001057600080fd5b50600436106102d65760003560e01c80637b46c54f11610182578063c680c0b7116100e9578063e3866c9a116100a2578063f2f46b3b1161007c578063f2f46b3b1461062b578063f2fde38b14610633578063f45346dc14610646578063f729a40414610659576102d6565b8063e3866c9a146105e3578063e788d8d1146105f6578063f2801fe71461060b576102d6565b8063c680c0b71461057c578063caa9a08d1461058f578063d0452aa6146105a2578063d6a49f0e146105b5578063d8c173c4146105c8578063da408679146105db576102d6565b8063ac210cc71161013b578063ac210cc714610536578063b3944d521461053e578063b9ec7d7414610546578063c1d742581461054e578063c2167d9314610556578063c35a934d14610569576102d6565b80637b46c54f146104ee5780638da5cb5b146105015780638f32d59b146105165780639a13ba291461051e578063a1a6690f14610526578063aaf5eb681461052e576102d6565b8063414d57fb116102415780635d50d060116101fa57806369328dec116101d457806369328dec146104925780636ff1c9bc146104a557806370480275146104b8578063787b4026146104cb576102d6565b80635d50d060146104305780635f02c1451461045057806362748fbb14610472576102d6565b8063414d57fb146103af578063429b62e5146103c257806348c84d9e146103e257806348cd4cb1146104025780634953c7821461040a57806356085d4c1461041d576102d6565b80631785f53c116102935780631785f53c1461035e5780631aed6553146103715780631d8f889c1461037957806329d0fa3e1461038c5780632d0857a2146103945780633723de42146103a7576102d6565b806306bfa938146102db578063083c63231461030457806308dcb360146103195780630b1a28511461032e5780630c43a7cd1461034157806310a168f914610356575b600080fd5b6102ee6102e93660046128dd565b610661565b6040516102fb91906136e3565b60405180910390f35b61030c6106e1565b6040516102fb91906136ff565b6103216106e7565b6040516102fb9190613506565b61030c61033c3660046129b2565b6106f6565b61035461034f3660046129f5565b61078f565b005b61030c6109d8565b61035461036c3660046128dd565b6109dd565b61030c610a5c565b610354610387366004612b78565b610a62565b61030c610ae8565b6103546103a2366004612b96565b610aee565b61030c610b52565b6103546103bd366004612a38565b610c04565b6103d56103d03660046128dd565b610cff565b6040516102fb91906134f8565b6103f56103f03660046128dd565b610d14565b6040516102fb91906134e7565b61030c610d85565b6103546104183660046128fb565b610d8b565b61030c61042b3660046128fb565b610db7565b61044361043e3660046128dd565b610dd9565b6040516102fb91906134b4565b61046361045e366004612bd2565b610eaa565b6040516102fb9392919061371b565b6104856104803660046128dd565b610ed6565b6040516102fb91906134d6565b6103546104a0366004612965565b610f8d565b6103546104b33660046128dd565b611120565b6103546104c63660046128dd565b611223565b6104de6104d9366004612b96565b61129c565b6040516102fb9493929190613514565b6103546104fc3660046128dd565b6112e8565b610509611302565b6040516102fb9190613448565b6103d5611311565b61030c611335565b61030c61133b565b61030c611341565b61050961134a565b61030c611359565b61035461135f565b61030c61137e565b6103546105643660046128dd565b611383565b6103546105773660046129f5565b6113e3565b61035461058a366004612935565b61144c565b61030c61059d3660046128dd565b611642565b61030c6105b03660046128fb565b61164d565b6103546105c33660046128dd565b61166a565b6103546105d6366004612935565b6116fb565b610354611708565b6103546105f1366004612adc565b61176c565b6105fe611893565b6040516102fb91906134c5565b61061e6106193660046128fb565b611929565b6040516102fb91906136f1565b61032161198b565b6103546106413660046128dd565b61199a565b610354610654366004612965565b6119ca565b61030c6119d7565b6106696127ce565b6000610674836119dd565b90506007818154811061068357fe5b60009182526020918290206040805160808101825260039390930290910180546001600160a01b0381168452600160a01b90046001600160601b03169383019390935260018301549082015260029091015460608201529392505050565b60055481565b600c546001600160a01b031681565b600080610702856119dd565b905060006007828154811061071357fe5b6000918252602082206003909102019150439061074761073a87601e63ffffffff611a1d16565b839063ffffffff611a5f16565b9050600061075784898585611a84565b9150610780905064e8d4a510006107748a8463ffffffff611ba716565b9063ffffffff611a1d16565b955050505050505b9392505050565b610797611311565b806107b157503360009081526001602052604090205460ff165b6107d65760405162461bcd60e51b81526004016107cd90613643565b60405180910390fd5b6000826001600160601b0316116107ff5760405162461bcd60e51b81526004016107cd90613563565b6001600160a01b0383166108255760405162461bcd60e51b81526004016107cd90613693565b6001600160a01b0383166000908152600860205260409020541561085b5760405162461bcd60e51b81526004016107cd90613663565b80156108695761086961135f565b6000600354431161087c5760035461087e565b435b60095490915061089d906001600160601b03851663ffffffff611a5f16565b600955604080516080810182526001600160a01b038087168083526001600160601b0380881660208086019182528587018881526000606088018181526007805460018101825581845299516003909a027fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688810180549751909816600160a01b029a8a166001600160a01b03199097169690961790981698909817909455517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68983015594517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a90910155915481835260089093529083902091909155905133907f38132ae9e6e6c4e777015bac3679dadd42206fad607b97846830be4b412908c3906109ca908790613729565b60405180910390a350505050565b600a81565b6109e5611311565b610a015760405162461bcd60e51b81526004016107cd90613643565b6001600160a01b03811660009081526001602052604090819020805460ff19169055517fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f90610a51908390613448565b60405180910390a150565b60045481565b610a6a611311565b80610a8457503360009081526001602052604090205460ff165b610aa05760405162461bcd60e51b81526004016107cd90613643565b6001600160a01b038116610ac65760405162461bcd60e51b81526004016107cd90613583565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b60025481565b610af6611311565b80610b1057503360009081526001602052604090205460ff165b610b2c5760405162461bcd60e51b81526004016107cd90613643565b6127108110610b4d5760405162461bcd60e51b81526004016107cd906135e3565b600e55565b600c546040516370a0823160e01b815260009182916001600160a01b03909116906370a0823190610b87903090600401613448565b60206040518083038186803b158015610b9f57600080fd5b505afa158015610bb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610bd79190810190612bb4565b9050600b54811015610bfb57600b54610bf6908263ffffffff611be116565b610bfe565b60005b91505090565b610c0c611311565b80610c2657503360009081526001602052604090205460ff165b610c425760405162461bcd60e51b81526004016107cd90613643565b838214610c615760405162461bcd60e51b81526004016107cd90613653565b8015610c6f57610c6f61135f565b8360005b81811015610cf65782610ca457610ca4878783818110610c8f57fe5b90506020020160206104fc91908101906128dd565b610cee878783818110610cb357fe5b9050602002016020610cc891908101906128dd565b868684818110610cd457fe5b9050602002016020610ce99190810190612bf1565b611c23565b600101610c73565b50505050505050565b60016020526000908152604090205460ff1681565b600754604080518281526020808402820101909152606091908290828015610d46578160200160208202803883390190505b50905060005b82811015610d7d57610d5e8186611d08565b828281518110610d6a57fe5b6020908102919091010152600101610d4c565b509392505050565b60035481565b6000610d9682611e46565b90506000610da3846119dd565b9050610db181836001611ea2565b50505050565b600080610dc3846119dd565b9050610dcf8184611d08565b9150505b92915050565b600754604080518281526020808402820101909152606091908290828015610e1b57816020015b610e08612808565b815260200190600190039081610e005790505b50905060005b82811015610d7d576000818152600a602090815260408083206001600160a01b03891684529091529020548251839083908110610e5a57fe5b6020026020010151600060028110610e6e57fe5b6020020152610e7d8186611d08565b828281518110610e8957fe5b6020026020010151600160028110610e9d57fe5b6020020152600101610e21565b600a60209081526000928352604080842090915290825290208054600182015460029092015490919083565b600754604080518281526020808402820101909152606091908290828015610f1857816020015b610f05612826565b815260200190600190039081610efd5790505b50905060005b82811015610d7d576000818152600a602090815260408083206001600160a01b038916845282529182902082516060810184528154815260018201549281019290925260020154918101919091528251839083908110610f7a57fe5b6020908102919091010152600101610f1e565b6001600160a01b038316600090815260086020526040902054610fc25760405162461bcd60e51b81526004016107cd906135a3565b6000610fcd82611e46565b90506000610fda856119dd565b9050600060078281548110610feb57fe5b60009182526020808320858452600a825260408085206001600160a01b0389168652909252922080546003909202909201925086111561103d5760405162461bcd60e51b81526004016107cd906135f3565b61104683611f1f565b6110508282612031565b61105e878286600080612088565b8054611070908763ffffffff611be116565b81556006546001600160a01b03163314156110a65781546110a1906001600160a01b0316338863ffffffff61231616565b6110c2565b81546110c2906001600160a01b0316858863ffffffff61231616565b6110cc828261236f565b866001600160a01b0316846001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb8860405161110f91906136ff565b60405180910390a350505050505050565b600061112b826119dd565b905060006007828154811061113c57fe5b60009182526020808320858452600a8252604080852033865290925292206003909102909101915061116d83611f1f565b6111778282612031565b6002810154600b5461118e9163ffffffff611be116565b600b55805460028201805460008085556001850181905590915583546111c4906001600160a01b0316338463ffffffff61231616565b6111ce848461236f565b856001600160a01b0316336001600160a01b03167f1401b6ff3b281e84fd77353369caed48ba7e787dd3821db05cc0064373608201848460405161121392919061370d565b60405180910390a3505050505050565b61122b611311565b6112475760405162461bcd60e51b81526004016107cd90613643565b6001600160a01b038116600090815260016020819052604091829020805460ff19169091179055517f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e33990610a51908390613448565b600781815481106112a957fe5b60009182526020909120600390910201805460018201546002909201546001600160a01b0382169350600160a01b9091046001600160601b0316919084565b60006112f3826119dd565b90506112fe81611f1f565b5050565b6000546001600160a01b031690565b600080546001600160a01b0316611326612399565b6001600160a01b031614905090565b600b5481565b60095481565b64e8d4a5100081565b6006546001600160a01b031681565b60075490565b60075460005b818110156112fe5761137681611f1f565b600101611365565b601e81565b61138b611311565b806113a557503360009081526001602052604090205460ff165b6113c15760405162461bcd60e51b81526004016107cd90613643565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6113eb611311565b8061140557503360009081526001602052604090205460ff165b6114215760405162461bcd60e51b81526004016107cd90613643565b80156114345761142f61135f565b61143d565b61143d836112e8565b6114478383611c23565b505050565b611454611311565b8061146e57503360009081526001602052604090205460ff165b61148a5760405162461bcd60e51b81526004016107cd90613643565b6001600160a01b0382166114b05760405162461bcd60e51b81526004016107cd90613623565b806114cd5760405162461bcd60e51b81526004016107cd90613673565b600c546040516370a0823160e01b81526000916001600160a01b0316906370a08231906114fe903090600401613448565b60206040518083038186803b15801561151657600080fd5b505afa15801561152a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061154e9190810190612bb4565b90508082111561155c578091505b600c5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061158e908690869060040161347e565b602060405180830381600087803b1580156115a857600080fd5b505af11580156115bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115e09190810190612abe565b6115fc5760405162461bcd60e51b81526004016107cd906135b3565b826001600160a01b03167fe1b0ada289bf82fb641c8c1e1c78f820fae44e8f845760725cdeb09167a289ad8360405161163591906136ff565b60405180910390a2505050565b6000610dd3826119dd565b6000611657612826565b6116618484611929565b51949350505050565b600061167582611e46565b60075490915060005b8181101561169c578061169381856000611ea2565b5060010161167e565b50600d546040516315b6fc1560e11b81526001600160a01b0390911690632b6df82a906116cd908590600401613448565b600060405180830381600087803b1580156116e757600080fd5b505af1158015610cf6573d6000803e3d6000fd5b6112fe338284600161239d565b611710611311565b8061172a57503360009081526001602052604090205460ff165b6117465760405162461bcd60e51b81526004016107cd90613643565b600554156117665760405162461bcd60e51b81526004016107cd906136c3565b43600555565b611774611311565b8061178e57503360009081526001602052604090205460ff165b6117aa5760405162461bcd60e51b81526004016107cd90613643565b600c546001600160a01b0316156117d35760405162461bcd60e51b81526004016107cd906136a3565b6001600160a01b0387166117f95760405162461bcd60e51b81526004016107cd90613693565b600085116118195760405162461bcd60e51b81526004016107cd90613603565b612710811061183a5760405162461bcd60e51b81526004016107cd906135e3565b600c80546001600160a01b03199081166001600160a01b03998a16179091556002969096554394909401600381905592909201600455600680548516918616919091179055600d80549093169316929092179055600e55565b60606007805480602002602001604051908101604052809291908181526020016000905b82821015611920576000848152602090819020604080516080810182526003860290920180546001600160a01b0381168452600160a01b90046001600160601b0316838501526001808201549284019290925260020154606083015290835290920191016118b7565b50505050905090565b611931612826565b600061193c846119dd565b6000908152600a602090815260408083206001600160a01b0387168452825291829020825160608101845281548152600182015492810192909252600201549181019190915291505092915050565b600d546001600160a01b031681565b6119a2611311565b6119be5760405162461bcd60e51b81526004016107cd90613643565b6119c7816124e8565b50565b611447838383600061239d565b600e5481565b6001600160a01b03811660009081526008602052604081205480611a135760405162461bcd60e51b81526004016107cd906135a3565b6000190192915050565b600061078883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612569565b6000828201838110156107885760405162461bcd60e51b81526004016107cd906135c3565b6000806000611a9385856125a0565b90506000611ae26009546107748a60000160149054906101000a90046001600160601b03166001600160601b0316611ad660025487611ba790919063ffffffff16565b9063ffffffff611ba716565b88546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190611b17903090600401613448565b60206040518083038186803b158015611b2f57600080fd5b505afa158015611b43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611b679190810190612bb4565b9050611b79818963ffffffff611a5f16565b90506000611b96826107748564e8d4a5100063ffffffff611ba716565b929a92995091975050505050505050565b600082611bb657506000610dd3565b82820282848281611bc357fe5b04146107885760405162461bcd60e51b81526004016107cd90613633565b600061078883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612640565b6000611c2e836119dd565b9050600060078281548110611c3f57fe5b60009182526020909120600390910201546009546001600160601b03600160a01b90920482169250611c8a91851690611c7e908463ffffffff611be116565b9063ffffffff611a5f16565b6009819055508260078381548110611c9e57fe5b6000918252602090912060039091020180546001600160601b0392909216600160a01b026001600160a01b039283161790556040519085169033907f7b327867ecd5d7f5165f3d8af5193f1255f215acb14e229b529a4f8a9991abbc906109ca9087908690613737565b60008060078481548110611d1857fe5b60009182526020808320878452600a825260408085206001600160a01b03808a16875293528085206002600390950290920193840154845491516370a0823160e01b815294965091949193919216906370a0823190611d7b903090600401613448565b60206040518083038186803b158015611d9357600080fd5b505afa158015611da7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611dcb9190810190612bb4565b9050836001015443118015611ddf57508015155b15611e07576000611def8561266c565b9150611e039050838263ffffffff611a5f16565b9250505b611e3b8360010154611e2f64e8d4a51000610774868860000154611ba790919063ffffffff16565b9063ffffffff611be116565b979650505050505050565b6000336001600160a01b03831615610dd3576006546001600160a01b0316331480611e7f57503360009081526008602052604090205415155b611e9b5760405162461bcd60e51b81526004016107cd90613683565b5090919050565b600060078481548110611eb157fe5b60009182526020808320878452600a825260408085206001600160a01b0389168652909252922060039091029091019150611eeb85611f1f565b611ef58282612031565b8154611f0e906001600160a01b03168286866001612088565b611f18828261236f565b5050505050565b600060078281548110611f2e57fe5b9060005260206000209060030201905080600101544311611f4f57506119c7565b80546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611f7f903090600401613448565b60206040518083038186803b158015611f9757600080fd5b505afa158015611fab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611fcf9190810190612bb4565b905080611fe35750436001909101556119c7565b600080611fef8461266c565b60028601549193509150612009908263ffffffff611a5f16565b6002850155436001850155600b54612027908363ffffffff611a5f16565b600b555050505050565b8054156112fe5760006120668260010154611e2f64e8d4a5100061077487600201548760000154611ba790919063ffffffff16565b600283015490915061207e908263ffffffff611a5f16565b6002830155505050565b6002840154600c546040516370a0823160e01b81526000916001600160a01b0316906370a08231906120be903090600401613448565b60206040518083038186803b1580156120d657600080fd5b505afa1580156120ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061210e9190810190612bb4565b90508181106122f857600b5461212a908363ffffffff611be116565b600b5560006002870155600c54600d5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b39261216a92911690869060040161347e565b602060405180830381600087803b15801561218457600080fd5b505af1158015612198573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121bc9190810190612abe565b6121d85760405162461bcd60e51b81526004016107cd90613613565b600d54600e54604051630efe6a8b60e01b81526001600160a01b0390921691630efe6a8b9161220d9189918791600401613499565b600060405180830381600087803b15801561222757600080fd5b505af115801561223b573d6000803e3d6000fd5b5050505083156122a857600d546040516315b6fc1560e11b81526001600160a01b0390911690632b6df82a90612275908890600401613448565b600060405180830381600087803b15801561228f57600080fd5b505af11580156122a3573d6000803e3d6000fd5b505050505b866001600160a01b0316856001600160a01b03167f0aa4d283470c904c551d18bb894d37e17674920f3261a7f854be501e25f421b7846040516122eb91906136ff565b60405180910390a3610cf6565b8215610cf65760405162461bcd60e51b81526004016107cd90613573565b60405161144790849063a9059cbb60e01b90612338908690869060240161347e565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612689565b600282015481546123909164e8d4a51000916107749163ffffffff611ba716565b60019091015550565b3390565b6001600160a01b0384166000908152600860205260409020546123d25760405162461bcd60e51b81526004016107cd906135a3565b60006001600160a01b0383166123e857336123ea565b825b905060006123f7866119dd565b905060006007828154811061240857fe5b60009182526020808320858452600a825260408085206001600160a01b038916865290925292206003909102909101915061244283611f1f565b61244c8282612031565b86156124895784612474578154612474906001600160a01b031633308a63ffffffff61276e16565b8054612486908863ffffffff611a5f16565b81555b612493828261236f565b876001600160a01b0316846001600160a01b03167f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62896040516124d691906136ff565b60405180910390a35050505050505050565b6001600160a01b03811661250e5760405162461bcd60e51b81526004016107cd90613593565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000818361258a5760405162461bcd60e51b81526004016107cd9190613552565b50600083858161259657fe5b0495945050505050565b60006003548310156125b25760035492505b60006005541180156125c5575060055482115b156125d05760055491505b60045482116125f5576125ee600a611ad6848663ffffffff611be116565b9050610dd3565b600454831061260e576125ee828463ffffffff611be116565b6125ee61262660045484611be190919063ffffffff16565b611c7e600a611ad687600454611be190919063ffffffff16565b600081848411156126645760405162461bcd60e51b81526004016107cd9190613552565b505050900390565b600080612680836000856001015443611a84565b91509150915091565b61269b826001600160a01b0316612792565b6126b75760405162461bcd60e51b81526004016107cd906136d3565b60006060836001600160a01b0316836040516126d3919061343c565b6000604051808303816000865af19150503d8060008114612710576040519150601f19603f3d011682016040523d82523d6000602084013e612715565b606091505b5091509150816127375760405162461bcd60e51b81526004016107cd906135d3565b805115610db157808060200190516127529190810190612abe565b610db15760405162461bcd60e51b81526004016107cd906136b3565b604051610db19085906323b872dd60e01b9061233890879087908790602401613456565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906127c657508115155b949350505050565b604051806080016040528060006001600160a01b0316815260200160006001600160601b0316815260200160008152602001600081525090565b60405180604001604052806002906020820280388339509192915050565b60405180606001604052806000815260200160008152602001600081525090565b8035610dd3816137da565b60008083601f84011261286457600080fd5b50813567ffffffffffffffff81111561287c57600080fd5b60208301915083602082028301111561289457600080fd5b9250929050565b8035610dd3816137ee565b8051610dd3816137ee565b8035610dd3816137f7565b8035610dd381613800565b8051610dd381613800565b8035610dd381613809565b6000602082840312156128ef57600080fd5b6000610dcf8484612847565b6000806040838503121561290e57600080fd5b600061291a8585612847565b925050602061292b85828601612847565b9150509250929050565b6000806040838503121561294857600080fd5b60006129548585612847565b925050602061292b858286016128bc565b60008060006060848603121561297a57600080fd5b60006129868686612847565b9350506020612997868287016128bc565b92505060406129a886828701612847565b9150509250925092565b6000806000606084860312156129c757600080fd5b60006129d38686612847565b93505060206129e4868287016128bc565b92505060406129a8868287016128bc565b600080600060608486031215612a0a57600080fd5b6000612a168686612847565b9350506020612a27868287016128d2565b92505060406129a88682870161289b565b600080600080600060608688031215612a5057600080fd5b853567ffffffffffffffff811115612a6757600080fd5b612a7388828901612852565b9550955050602086013567ffffffffffffffff811115612a9257600080fd5b612a9e88828901612852565b93509350506040612ab18882890161289b565b9150509295509295909350565b600060208284031215612ad057600080fd5b6000610dcf84846128a6565b600080600080600080600