UNPKG

test-contracts-sovryn

Version:

Smart contracts for the Sovryn protocol and external integrations.

1,323 lines 87.8 kB
{ "_format": "hh-sol-artifact-1", "contractName": "LiquidityMiningMockup", "sourceName": "contracts/mockup/LiquidityMiningMockup.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": "uint256", "name": "_from", "type": "uint256" }, { "internalType": "uint256", "name": "_to", "type": "uint256" } ], "name": "getPassedBlocksWithBonusMultiplier", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "_poolToken", "type": "address" } ], "name": "getPoolAccumulatedReward", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" }, { "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": "0x608060405260006100176001600160e01b0361006616565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061006a565b3390565b61392d806200007a6000396000f3fe608060405234801561001057600080fd5b506004361061030c5760003560e01c8063787b40261161019d578063c680c0b7116100e9578063e3866c9a116100a2578063f2f46b3b1161007c578063f2f46b3b14610695578063f2fde38b1461069d578063f45346dc146106b0578063f729a404146106c35761030c565b8063e3866c9a1461064d578063e788d8d114610660578063f2801fe7146106755761030c565b8063c680c0b7146105e6578063caa9a08d146105f9578063d0452aa61461060c578063d6a49f0e1461061f578063d8c173c414610632578063da408679146106455761030c565b8063aaf5eb6811610156578063b9ec7d7411610130578063b9ec7d74146105b0578063c1d74258146105b8578063c2167d93146105c0578063c35a934d146105d35761030c565b8063aaf5eb6814610598578063ac210cc7146105a0578063b3944d52146105a85761030c565b8063787b4026146105355780637b46c54f146105585780638da5cb5b1461056b5780638f32d59b146105805780639a13ba2914610588578063a1a6690f146105905761030c565b8063429b62e51161025c5780635d50d0601161021557806362748fbb116101ef57806362748fbb146104dc57806369328dec146104fc5780636ff1c9bc1461050f57806370480275146105225761030c565b80635d50d060146104875780635e379679146104a75780635f02c145146104ba5761030c565b8063429b62e5146103f857806348c84d9e1461041857806348cd4cb114610438578063492e019d146104405780634953c7821461046157806356085d4c146104745761030c565b80631785f53c116102c957806329d0fa3e116102a357806329d0fa3e146103c25780632d0857a2146103ca5780633723de42146103dd578063414d57fb146103e55761030c565b80631785f53c146103945780631aed6553146103a75780631d8f889c146103af5761030c565b806306bfa93814610311578063083c63231461033a57806308dcb3601461034f5780630b1a2851146103645780630c43a7cd1461037757806310a168f91461038c575b600080fd5b61032461031f366004612996565b6106cb565b60405161033191906137bb565b60405180910390f35b61034261074b565b60405161033191906137d7565b610357610751565b60405161033191906135de565b610342610372366004612a6b565b610760565b61038a610385366004612aae565b6107f9565b005b610342610a42565b61038a6103a2366004612996565b610a47565b610342610ac6565b61038a6103bd366004612c31565b610acc565b610342610b52565b61038a6103d8366004612c4f565b610b58565b610342610bbc565b61038a6103f3366004612af1565b610c6e565b61040b610406366004612996565b610d69565b60405161033191906135d0565b61042b610426366004612996565b610d7e565b60405161033191906135bf565b610342610def565b61045361044e366004612996565b610df5565b6040516103319291906137e5565b61038a61046f3660046129b4565b610e38565b6103426104823660046129b4565b610e64565b61049a610495366004612996565b610e86565b604051610331919061358c565b6103426104b5366004612caa565b610f57565b6104cd6104c8366004612c8b565b610f63565b604051610331939291906137f3565b6104ef6104ea366004612996565b610f8f565b60405161033191906135ae565b61038a61050a366004612a1e565b611046565b61038a61051d366004612996565b6111d9565b61038a610530366004612996565b6112dc565b610548610543366004612c4f565b611355565b60405161033194939291906135ec565b61038a610566366004612996565b6113a1565b6105736113bb565b6040516103319190613520565b61040b6113ca565b6103426113ee565b6103426113f4565b6103426113fa565b610573611403565b610342611412565b61038a611418565b610342611437565b61038a6105ce366004612996565b61143c565b61038a6105e1366004612aae565b61149c565b61038a6105f43660046129ee565b611505565b610342610607366004612996565b6116fb565b61034261061a3660046129b4565b611706565b61038a61062d366004612996565b611723565b61038a6106403660046129ee565b6117b4565b61038a6117c1565b61038a61065b366004612b95565b611825565b61066861194c565b604051610331919061359d565b6106886106833660046129b4565b6119e2565b60405161033191906137c9565b610357611a44565b61038a6106ab366004612996565b611a53565b61038a6106be366004612a1e565b611a83565b610342611a90565b6106d3612887565b60006106de83611a96565b9050600781815481106106ed57fe5b60009182526020918290206040805160808101825260039390930290910180546001600160a01b0381168452600160a01b90046001600160601b03169383019390935260018301549082015260029091015460608201529392505050565b60055481565b600c546001600160a01b031681565b60008061076c85611a96565b905060006007828154811061077d57fe5b600091825260208220600390910201915043906107b16107a487601e63ffffffff611ad616565b839063ffffffff611b1816565b905060006107c184898585611b3d565b91506107ea905064e8d4a510006107de8a8463ffffffff611c6016565b9063ffffffff611ad616565b955050505050505b9392505050565b6108016113ca565b8061081b57503360009081526001602052604090205460ff165b6108405760405162461bcd60e51b81526004016108379061371b565b60405180910390fd5b6000826001600160601b0316116108695760405162461bcd60e51b81526004016108379061363b565b6001600160a01b03831661088f5760405162461bcd60e51b81526004016108379061376b565b6001600160a01b038316600090815260086020526040902054156108c55760405162461bcd60e51b81526004016108379061373b565b80156108d3576108d3611418565b600060035443116108e6576003546108e8565b435b600954909150610907906001600160601b03851663ffffffff611b1816565b600955604080516080810182526001600160a01b038087168083526001600160601b0380881660208086019182528587018881526000606088018181526007805460018101825581845299516003909a027fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688810180549751909816600160a01b029a8a166001600160a01b03199097169690961790981698909817909455517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68983015594517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a90910155915481835260089093529083902091909155905133907f38132ae9e6e6c4e777015bac3679dadd42206fad607b97846830be4b412908c390610a34908790613801565b60405180910390a350505050565b600a81565b610a4f6113ca565b610a6b5760405162461bcd60e51b81526004016108379061371b565b6001600160a01b03811660009081526001602052604090819020805460ff19169055517fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f90610abb908390613520565b60405180910390a150565b60045481565b610ad46113ca565b80610aee57503360009081526001602052604090205460ff165b610b0a5760405162461bcd60e51b81526004016108379061371b565b6001600160a01b038116610b305760405162461bcd60e51b81526004016108379061365b565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b60025481565b610b606113ca565b80610b7a57503360009081526001602052604090205460ff165b610b965760405162461bcd60e51b81526004016108379061371b565b6127108110610bb75760405162461bcd60e51b8152600401610837906136bb565b600e55565b600c546040516370a0823160e01b815260009182916001600160a01b03909116906370a0823190610bf1903090600401613520565b60206040518083038186803b158015610c0957600080fd5b505afa158015610c1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610c419190810190612c6d565b9050600b54811015610c6557600b54610c60908263ffffffff611c9a16565b610c68565b60005b91505090565b610c766113ca565b80610c9057503360009081526001602052604090205460ff165b610cac5760405162461bcd60e51b81526004016108379061371b565b838214610ccb5760405162461bcd60e51b81526004016108379061372b565b8015610cd957610cd9611418565b8360005b81811015610d605782610d0e57610d0e878783818110610cf957fe5b90506020020160206105669190810190612996565b610d58878783818110610d1d57fe5b9050602002016020610d329190810190612996565b868684818110610d3e57fe5b9050602002016020610d539190810190612cc9565b611cdc565b600101610cdd565b50505050505050565b60016020526000908152604090205460ff1681565b600754604080518281526020808402820101909152606091908290828015610db0578160200160208202803883390190505b50905060005b82811015610de757610dc88186611dc1565b828281518110610dd457fe5b6020908102919091010152600101610db6565b509392505050565b60035481565b6000806000610e0384611a96565b9050600060078281548110610e1457fe5b90600052602060002090600302019050610e2d81611eff565b935093505050915091565b6000610e4382611f1c565b90506000610e5084611a96565b9050610e5e81836001611f78565b50505050565b600080610e7084611a96565b9050610e7c8184611dc1565b9150505b92915050565b600754604080518281526020808402820101909152606091908290828015610ec857816020015b610eb56128c1565b815260200190600190039081610ead5790505b50905060005b82811015610de7576000818152600a602090815260408083206001600160a01b03891684529091529020548251839083908110610f0757fe5b6020026020010151600060028110610f1b57fe5b6020020152610f2a8186611dc1565b828281518110610f3657fe5b6020026020010151600160028110610f4a57fe5b6020020152600101610ece565b60006107f28383611ff5565b600a60209081526000928352604080842090915290825290208054600182015460029092015490919083565b600754604080518281526020808402820101909152606091908290828015610fd157816020015b610fbe6128df565b815260200190600190039081610fb65790505b50905060005b82811015610de7576000818152600a602090815260408083206001600160a01b03891684528252918290208251606081018452815481526001820154928101929092526002015491810191909152825183908390811061103357fe5b6020908102919091010152600101610fd7565b6001600160a01b03831660009081526008602052604090205461107b5760405162461bcd60e51b81526004016108379061367b565b600061108682611f1c565b9050600061109385611a96565b90506000600782815481106110a457fe5b60009182526020808320858452600a825260408085206001600160a01b038916865290925292208054600390920290920192508611156110f65760405162461bcd60e51b8152600401610837906136cb565b6110ff83612095565b61110982826121a7565b6111178782866000806121fe565b8054611129908763ffffffff611c9a16565b81556006546001600160a01b031633141561115f57815461115a906001600160a01b0316338863ffffffff61248c16565b61117b565b815461117b906001600160a01b0316858863ffffffff61248c16565b61118582826124e5565b866001600160a01b0316846001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb886040516111c891906137d7565b60405180910390a350505050505050565b60006111e482611a96565b90506000600782815481106111f557fe5b60009182526020808320858452600a8252604080852033865290925292206003909102909101915061122683612095565b61123082826121a7565b6002810154600b546112479163ffffffff611c9a16565b600b558054600282018054600080855560018501819055909155835461127d906001600160a01b0316338463ffffffff61248c16565b61128784846124e5565b856001600160a01b0316336001600160a01b03167f1401b6ff3b281e84fd77353369caed48ba7e787dd3821db05cc006437360820184846040516112cc9291906137e5565b60405180910390a3505050505050565b6112e46113ca565b6113005760405162461bcd60e51b81526004016108379061371b565b6001600160a01b038116600090815260016020819052604091829020805460ff19169091179055517f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e33990610abb908390613520565b6007818154811061136257fe5b60009182526020909120600390910201805460018201546002909201546001600160a01b0382169350600160a01b9091046001600160601b0316919084565b60006113ac82611a96565b90506113b781612095565b5050565b6000546001600160a01b031690565b600080546001600160a01b03166113df61250f565b6001600160a01b031614905090565b600b5481565b60095481565b64e8d4a5100081565b6006546001600160a01b031681565b60075490565b60075460005b818110156113b75761142f81612095565b60010161141e565b601e81565b6114446113ca565b8061145e57503360009081526001602052604090205460ff165b61147a5760405162461bcd60e51b81526004016108379061371b565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6114a46113ca565b806114be57503360009081526001602052604090205460ff165b6114da5760405162461bcd60e51b81526004016108379061371b565b80156114ed576114e8611418565b6114f6565b6114f6836113a1565b6115008383611cdc565b505050565b61150d6113ca565b8061152757503360009081526001602052604090205460ff165b6115435760405162461bcd60e51b81526004016108379061371b565b6001600160a01b0382166115695760405162461bcd60e51b8152600401610837906136fb565b806115865760405162461bcd60e51b81526004016108379061374b565b600c546040516370a0823160e01b81526000916001600160a01b0316906370a08231906115b7903090600401613520565b60206040518083038186803b1580156115cf57600080fd5b505afa1580156115e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116079190810190612c6d565b905080821115611615578091505b600c5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906116479086908690600401613556565b602060405180830381600087803b15801561166157600080fd5b505af1158015611675573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116999190810190612b77565b6116b55760405162461bcd60e51b81526004016108379061368b565b826001600160a01b03167fe1b0ada289bf82fb641c8c1e1c78f820fae44e8f845760725cdeb09167a289ad836040516116ee91906137d7565b60405180910390a2505050565b6000610e8082611a96565b60006117106128df565b61171a84846119e2565b51949350505050565b600061172e82611f1c565b60075490915060005b81811015611755578061174c81856000611f78565b50600101611737565b50600d546040516315b6fc1560e11b81526001600160a01b0390911690632b6df82a90611786908590600401613520565b600060405180830381600087803b1580156117a057600080fd5b505af1158015610d60573d6000803e3d6000fd5b6113b73382846001612513565b6117c96113ca565b806117e357503360009081526001602052604090205460ff165b6117ff5760405162461bcd60e51b81526004016108379061371b565b6005541561181f5760405162461bcd60e51b81526004016108379061379b565b43600555565b61182d6113ca565b8061184757503360009081526001602052604090205460ff165b6118635760405162461bcd60e51b81526004016108379061371b565b600c546001600160a01b03161561188c5760405162461bcd60e51b81526004016108379061377b565b6001600160a01b0387166118b25760405162461bcd60e51b81526004016108379061376b565b600085116118d25760405162461bcd60e51b8152600401610837906136db565b61271081106118f35760405162461bcd60e51b8152600401610837906136bb565b600c80546001600160a01b03199081166001600160a01b03998a16179091556002969096554394909401600381905592909201600455600680548516918616919091179055600d80549093169316929092179055600e55565b60606007805480602002602001604051908101604052809291908181526020016000905b828210156119d9576000848152602090819020604080516080810182526003860290920180546001600160a01b0381168452600160a01b90046001600160601b031683850152600180820154928401929092526002015460608301529083529092019101611970565b50505050905090565b6119ea6128df565b60006119f584611a96565b6000908152600a602090815260408083206001600160a01b0387168452825291829020825160608101845281548152600182015492810192909252600201549181019190915291505092915050565b600d546001600160a01b031681565b611a5b6113ca565b611a775760405162461bcd60e51b81526004016108379061371b565b611a808161265e565b50565b6115008383836000612513565b600e5481565b6001600160a01b03811660009081526008602052604081205480611acc5760405162461bcd60e51b81526004016108379061367b565b6000190192915050565b60006107f283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506126df565b6000828201838110156107f25760405162461bcd60e51b81526004016108379061369b565b6000806000611b4c8585611ff5565b90506000611b9b6009546107de8a60000160149054906101000a90046001600160601b03166001600160601b0316611b8f60025487611c6090919063ffffffff16565b9063ffffffff611c6016565b88546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190611bd0903090600401613520565b60206040518083038186803b158015611be857600080fd5b505afa158015611bfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c209190810190612c6d565b9050611c32818963ffffffff611b1816565b90506000611c4f826107de8564e8d4a5100063ffffffff611c6016565b929a92995091975050505050505050565b600082611c6f57506000610e80565b82820282848281611c7c57fe5b04146107f25760405162461bcd60e51b81526004016108379061370b565b60006107f283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612716565b6000611ce783611a96565b9050600060078281548110611cf857fe5b60009182526020909120600390910201546009546001600160601b03600160a01b90920482169250611d4391851690611d37908463ffffffff611c9a16565b9063ffffffff611b1816565b6009819055508260078381548110611d5757fe5b6000918252602090912060039091020180546001600160601b0392909216600160a01b026001600160a01b039283161790556040519085169033907f7b327867ecd5d7f5165f3d8af5193f1255f215acb14e229b529a4f8a9991abbc90610a34908790869061380f565b60008060078481548110611dd157fe5b60009182526020808320878452600a825260408085206001600160a01b03808a16875293528085206002600390950290920193840154845491516370a0823160e01b815294965091949193919216906370a0823190611e34903090600401613520565b60206040518083038186803b158015611e4c57600080fd5b505afa158015611e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611e849190810190612c6d565b9050836001015443118015611e9857508015155b15611ec0576000611ea885611eff565b9150611ebc9050838263ffffffff611b1816565b9250505b611ef48360010154611ee864e8d4a510006107de868860000154611c6090919063ffffffff16565b9063ffffffff611c9a16565b979650505050505050565b600080611f13836000856001015443611b3d565b91509150915091565b6000336001600160a01b03831615610e80576006546001600160a01b0316331480611f5557503360009081526008602052604090205415155b611f715760405162461bcd60e51b81526004016108379061375b565b5090919050565b600060078481548110611f8757fe5b60009182526020808320878452600a825260408085206001600160a01b0389168652909252922060039091029091019150611fc185612095565b611fcb82826121a7565b8154611fe4906001600160a01b031682868660016121fe565b611fee82826124e5565b5050505050565b60006003548310156120075760035492505b600060055411801561201a575060055482115b156120255760055491505b600454821161204a57612043600a611b8f848663ffffffff611c9a16565b9050610e80565b600454831061206357612043828463ffffffff611c9a16565b61204361207b60045484611c9a90919063ffffffff16565b611d37600a611b8f87600454611c9a90919063ffffffff16565b6000600782815481106120a457fe5b90600052602060002090600302019050806001015443116120c55750611a80565b80546040516370a0823160e01b81526000916001600160a01b0316906370a08231906120f5903090600401613520565b60206040518083038186803b15801561210d57600080fd5b505afa158015612121573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121459190810190612c6d565b905080612159575043600190910155611a80565b60008061216584611eff565b6002860154919350915061217f908263ffffffff611b1816565b6002850155436001850155600b5461219d908363ffffffff611b1816565b600b555050505050565b8054156113b75760006121dc8260010154611ee864e8d4a510006107de87600201548760000154611c6090919063ffffffff16565b60028301549091506121f4908263ffffffff611b1816565b6002830155505050565b6002840154600c546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612234903090600401613520565b60206040518083038186803b15801561224c57600080fd5b505afa158015612260573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122849190810190612c6d565b905081811061246e57600b546122a0908363ffffffff611c9a16565b600b5560006002870155600c54600d5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926122e0929116908690600401613556565b602060405180830381600087803b1580156122fa57600080fd5b505af115801561230e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506123329190810190612b77565b61234e5760405162461bcd60e51b8152600401610837906136eb565b600d54600e54604051630efe6a8b60e01b81526001600160a01b0390921691630efe6a8b916123839189918791600401613571565b600060405180830381600087803b15801561239d57600080fd5b505af11580156123b1573d6000803e3d6000fd5b50505050831561241e57600d546040516315b6fc1560e11b81526001600160a01b0390911690632b6df82a906123eb908890600401613520565b600060405180830381600087803b15801561240557600080fd5b505af1158015612419573d6000803e3d6000fd5b505050505b866001600160a01b0316856001600160a01b03167f0aa4d283470c904c551d18bb894d37e17674920f3261a7f854be501e25f421b78460405161246191906137d7565b60405180910390a3610d60565b8215610d605760405162461bcd60e51b81526004016108379061364b565b60405161150090849063a9059cbb60e01b906124ae9086908690602401613556565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612742565b600282015481546125069164e8d4a51000916107de9163ffffffff611c6016565b60019091015550565b3390565b6001600160a01b0384166000908152600860205260409020546125485760405162461bcd60e51b81526004016108379061367b565b60006001600160a01b03831661255e5733612560565b825b9050600061256d86611a96565b905060006007828154811061257e57fe5b60009182526020808320858452600a825260408085206001600160a01b03891686529092529220600390910290910191506125b883612095565b6125c282826121a7565b86156125ff57846125ea5781546125ea906001600160a01b031633308a63ffffffff61282716565b80546125fc908863ffffffff611b1816565b81555b61260982826124e5565b876001600160a01b0316846001600160a01b03167f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f628960405161264c91906137d7565b60405180910390a35050505050505050565b6001600160a01b0381166126845760405162461bcd60e51b81526004016108379061366b565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600081836127005760405162461bcd60e51b8152600401610837919061362a565b50600083858161270c57fe5b0495945050505050565b6000818484111561273a5760405162461bcd60e51b8152600401610837919061362a565b505050900390565b612754826001600160a01b031661284b565b6127705760405162461bcd60e51b8152600401610837906137ab565b60006060836001600160a01b03168360405161278c9190613514565b6000604051808303816000865af19150503d80600081146127c9576040519150601f19603f3d011682016040523d82523d6000602084013e6127ce565b606091505b5091509150816127f05760405162461bcd60e51b8152600401610837906136ab565b805115610e5e578080602001905161280b9190810190612b77565b610e5e5760405162461bcd60e51b81526004016108379061378b565b604051610e5e9085906323b872dd60e01b906124ae9087908790879060240161352e565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061287f57508115155b949350505050565b604051806080016040528060006001600160a01b0316815260200160006001600160601b0316815260200160008152602