Contract 0xa2195CA7A955C688404bBf93BE2b912342aC0522

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x531c399ff9bd7125ac3d8f3e18459e1b394807f1a44129a15a8a533c6571c490Deposit167110732022-06-30 10:43:5611 mins ago0xb3949e48b7b12fa507ec256b652ee53e17147372 IN  0xa2195ca7a955c688404bbf93be2b912342ac05220 AVAX0.0032402975 27.5
0xfe12e93d66655b0f84a01794e2070c6f35fde6f0a407276512d61078f5410774Withdraw167100722022-06-30 10:10:2345 mins ago0xf94dfff330fdc8ac582e7e72b4ced5e90d1bced4 IN  0xa2195ca7a955c688404bbf93be2b912342ac05220 AVAX0.002679765 27.5
0xa164e791e895f9134dbd1f51bf836298b187eb35b2a9a413da5f1c48b112ec61Deposit167091492022-06-30 9:39:381 hr 16 mins ago0x56881967f3f1a310fcd2132ae608f5e7732d6e3d IN  0xa2195ca7a955c688404bbf93be2b912342ac05220 AVAX0.003302829 27
0x85b2e262bfcfc6ef8663e9b7267fbd083879a093ad073ca3ce3d8a6d3118c596Deposit167055422022-06-30 7:40:053 hrs 15 mins ago0x46f99c0ba0706759efce1f269cd8b3a6be102e5b IN  0xa2195ca7a955c688404bbf93be2b912342ac05220 AVAX0.0032406275 27.5
0x57a8b1b1eaa3256555080950cfbdba7b52a303fb59fb4916ab4bd1fd76b87b12Withdraw167048582022-06-30 7:17:143 hrs 38 mins ago0xdbbb318767bd516941936345364fed06d53715b5 IN  0xa2195ca7a955c688404bbf93be2b912342ac05220 AVAX0.0028633525
0x1eec44ee116f6fcc9b2a8e4628e24df14574fc4d43d910e322e4c690e5526781Deposit167046812022-06-30 7:11:203 hrs 44 mins ago0xf032764b5ef842c220527f4ad428080b6984873b IN  0xa2195ca7a955c688404bbf93be2b912342ac05220 AVAX0.0032402975 27.5
0xb90a4ce98eba0068bc72e2c9164519781a5c365e5c7309d664fd2fa0c680fee5Deposit167046012022-06-30 7:08:373 hrs 47 mins ago0xdbbb318767bd516941936345364fed06d53715b5 IN  0xa2195ca7a955c688404bbf93be2b912342ac05220 AVAX0.00294572525
0x1ad1404f3db1637f3c32440df61ed943bd0f36bad7acea6e2bf6909e87f5a6bbDeposit167021992022-06-30 5:48:515 hrs 7 mins ago0xf94dfff330fdc8ac582e7e72b4ced5e90d1bced4 IN  0xa2195ca7a955c688404bbf93be2b912342ac05220 AVAX0.0032406275 27.5
0xa82742a2e6b4a3e3f884282fc7cf32ecaf7c9d8ddd43540596bee2e7f5676263Deposit167006002022-06-30 4:55:326 hrs ago0x94ab260aff09f6eb5bedc37f72489264f9bcff2a IN  0xa2195ca7a955c688404bbf93be2b912342ac05220 AVAX0.003236635414 26.458880009
0x876c1eb70be67f79e900714764c7b180b1709414522e50845c56ae72a5d32fa1Deposit166990762022-06-30 4:04:096 hrs 51 mins ago0x619596f2ba8a160b81df6524ce6ee5d013fa7f9e IN  0xa2195ca7a955c688404bbf93be2b912342ac05220 AVAX0.0033636625 27.5
0x74daf7a0671227c04aae0731d1b82ff343c11767e2604f125b2ecbd026cf8bf9Deposit166981962022-06-30 3:34:527 hrs 21 mins ago0xf06e7817718475c8b199e10af7dd0af4fa5fb115 IN  0xa2195ca7a955c688404bbf93be2b912342ac05220 AVAX0.0028934125 27.5
0x2f4867f664912181ff9b680128e7db243ae7fe78a079c2395371008138b1c74fDeposit166963852022-06-30 2:34:238 hrs 21 mins ago0x92fd5634ddab159ce2e956755470b90b7da7fce8 IN  0xa2195ca7a955c688404bbf93be2b912342ac05220 AVAX0.0026408965 25.1
0x550478175a47596dc633a2ea57848aa8d6da4d027dfdb282d61c1eadd8b212c9Deposit166958172022-06-30 2:15:208 hrs 40 mins ago0x0a1d82a7fe7d665a532f175026913ec8295bbe57 IN  0xa2195ca7a955c688404bbf93be2b912342ac05220 AVAX0.0032406275 27.5
0x932f5bd970186b932c7c899ba85a51ec6bbdc1c73e698948edc180aaae809c92Deposit166943982022-06-30 1:27:479 hrs 28 mins ago0xb2782039d3fd2130926c1acd39d13481d8662c2c IN  0xa2195ca7a955c688404bbf93be2b912342ac05220 AVAX0.0032406275 27.5
0xad31da470ca0f94a5de80e6774a8b7c595688155224446712168104ad05890f2Deposit166939862022-06-30 1:14:089 hrs 41 mins ago0xb9d09a07cb46993b9d2fa55ee3b5c2581363badc IN  0xa2195ca7a955c688404bbf93be2b912342ac05220 AVAX0.003063866 26
0x116efb721fd904a6c3db1d48a8c683115f64b63559bf0556edc4fde6bc0a6548Deposit166937172022-06-30 1:05:109 hrs 50 mins ago0x84a642d8f5af837256eac4c46264a0d53d66fd65 IN  0xa2195ca7a955c688404bbf93be2b912342ac05220 AVAX0.0028934125 27.5
0xd32cc483e550e9ed45a07b8b35e052e58631528aa3ea929ee7134f593ef33969Deposit166913792022-06-29 23:47:2111 hrs 8 mins ago0xb01c83121da102f72940f3f965d99245f523a460 IN  0xa2195ca7a955c688404bbf93be2b912342ac05220 AVAX0.0032402975 27.5
0xffe3a16207c78ea88c49230f970403b9054532d07e25525536b138683e378ab5Deposit166902032022-06-29 23:08:1111 hrs 47 mins ago0xf180c14dcd820f4622dc9a653f8688844968e47d IN  0xa2195ca7a955c688404bbf93be2b912342ac05220 AVAX0.0032402975 27.5
0xa4e0583a7c4197b78387c16d87146c436b5d82d8047fe446b317a7e6dbcc4d26Deposit166888892022-06-29 22:24:2812 hrs 31 mins ago0x7a287520a611d2c87f68f05a1319399d57cf3ca9 IN  0xa2195ca7a955c688404bbf93be2b912342ac05220 AVAX0.0028937425 27.5
0x6d6d4a1d83c7fc598c64ecdf09b4b7edd0c9eb4c066328274c6c80abf1bed661Deposit166885512022-06-29 22:13:0412 hrs 42 mins ago0xad61c1a640f023b610425c492b86b77eba4d300d IN  0xa2195ca7a955c688404bbf93be2b912342ac05220 AVAX0.00311218081 26.41
0x424c66812880439797a8db684ca52003e208a53b1f5843476d7638b0aaba410bDeposit166875962022-06-29 21:41:0713 hrs 14 mins ago0x2a236bf6a6cf4cb64622567bfa12473ee4e04ac8 IN  0xa2195ca7a955c688404bbf93be2b912342ac05220 AVAX0.0028937425 27.5
0xfea7fc40416c6d194748e35e098bbf05686decb6ffa0aee5a1005beea1a90f09Deposit166866932022-06-29 21:10:5313 hrs 44 mins ago0xffa2bfc40d9c363bad51df5b971686d1b4fa8ced IN  0xa2195ca7a955c688404bbf93be2b912342ac05220 AVAX0.0032406275 27.5
0x46bc8ed8e32025d312c969995e20919642199aee556fda5853cee2a96e722eefDeposit166860812022-06-29 20:50:2414 hrs 5 mins ago0xcec41a6ccf0e86230802862f68f7d023fbae0235 IN  0xa2195ca7a955c688404bbf93be2b912342ac05220 AVAX0.00283481538 26.94
0x78f4288e1307017df3a92518a50e9e24dbceed5a3a5e1017dbaf77d017c4056cWithdraw166858072022-06-29 20:41:0914 hrs 14 mins ago0x292d3316a143699bc3c01d5a91702767657dac25 IN  0xa2195ca7a955c688404bbf93be2b912342ac05220 AVAX0.003150015 27.5
0xf5c5a3b39549cb3d7f618b07b00110203f017c17c0db66ec22e6f8daa12dee0dDeposit166857232022-06-29 20:38:2214 hrs 17 mins ago0xa9b7c99554df215c0da89ef37874ea54ce2a55f1 IN  0xa2195ca7a955c688404bbf93be2b912342ac05220 AVAX0.0033636625 27.5
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RoniBank

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 9 : RoniBank.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.4;

import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "./libraries/BoringERC20.sol";

// Adapted from MasterChefJoeV2 and Police And Thieves Vault
contract RoniBank is Ownable, Pausable, ReentrancyGuard {
    using SafeMath for uint256;
    using BoringERC20 for IERC20;

    // Info of each user.
    struct UserInfo {
        uint256 amount; // How many LP tokens the user has provided.
        uint256 rewardDebt; // Reward debt. See explanation below.
    }


    IERC20 public lpToken; // Address of LP token contract.
    uint256 public lastRewardTimestamp; // Last timestamp that Reward distribution occurs.
    uint256 public accRewardTokenPerShare; // Accumulated Reward per share, times 1e12. See below.

    uint256 public bonusEndTimestamp; // deadline of the vault

    IERC20 public rewardToken;
    // Reward tokens created per second.
    uint256 public manualRewardPerSecond = 3472222222222; // 0.3 * 1e18 / 86400

    // Info of each user that stakes LP tokens.
    mapping (address => UserInfo) public userInfo;

    event Deposit(address indexed user, uint256 amount);
    event Withdraw(address indexed user, uint256 amount);
    event Harvest(address indexed user, uint256 amount);
    event EmergencyWithdraw(address indexed user, uint256 amount);
    event DepositRewards(uint256 amount);
    event EmergencyRewardWithdraw(address indexed user, uint256 amount);
    
    function setStakeToken(IERC20 _stakeToken) external onlyOwner {
        lpToken = _stakeToken;
    }

    function setRewardToken(IERC20 _rewardToken) external onlyOwner {
        rewardToken = _rewardToken;
    }

    function setStartTimeStamp(uint256 _startTimestamp) external onlyOwner {
        lastRewardTimestamp = _startTimestamp;
    }

        /// The block when rewards will end
    function setBonusEndTimestamp(uint256 _bonusEndTimestamp) external onlyOwner {
        require(_bonusEndTimestamp > bonusEndTimestamp, 'new bonus end block must be greater than current');
        bonusEndTimestamp = _bonusEndTimestamp;
    }

    // Returns calculated or manual rewards per second
    function getRewardPerSecond() public view returns (uint256) {
            return manualRewardPerSecond;
   }

    // Return reward multiplier over the given _from to _to block.
    function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) {
        if (_to <= bonusEndTimestamp) {
            return _to.sub(_from);
        } else if (_from >= bonusEndTimestamp) {
            return 0;
        } else {
            return bonusEndTimestamp.sub(_from);
        }
    }

    function vaultStarted() public view returns (bool) {
        return lastRewardTimestamp != 0 && bonusEndTimestamp != 0;
    }

    function rewardBalance() public view returns (uint256) {
        return rewardToken.balanceOf(address(this));
    }

    function depositedBalance() public view returns (uint256) {
        return lpToken.balanceOf(address(this));
    }

    // View function to see pending Token on frontend.
    function pendingRewards(address _user) external view returns (uint256) {
        UserInfo storage user = userInfo[_user];
        uint256 accRewardToken = accRewardTokenPerShare;
        uint256 lpSupply = lpToken.balanceOf(address(this));
        if (block.timestamp > lastRewardTimestamp && lpSupply != 0) {
            uint256 multiplier = getMultiplier(lastRewardTimestamp, block.timestamp);
            uint256 tokenReward = multiplier.mul(getRewardPerSecond());
            accRewardToken = accRewardToken.add(tokenReward.mul(1e12).div(lpSupply));
        }
        return user.amount.mul(accRewardToken).div(1e12).sub(user.rewardDebt);
    }

    // Update reward variables of the given pool to be up-to-date.
    function updatePool() public whenNotPaused {
        if (block.timestamp <= lastRewardTimestamp) {
            return;
        }
        uint256 lpSupply = lpToken.balanceOf(address(this));

        if (lpSupply == 0) {
            lastRewardTimestamp = block.timestamp;
            return;
        }
        uint256 multiplier = getMultiplier(lastRewardTimestamp, block.timestamp);
        accRewardTokenPerShare = accRewardTokenPerShare.add(multiplier.mul(getRewardPerSecond()).mul(1e12).div(lpSupply));
        lastRewardTimestamp = block.timestamp;
    }

    // Deposit LP tokens to MasterChef for Reward allocation.
    function deposit(uint256 _amount) public whenNotPaused nonReentrant {
        require(vaultStarted(), "You can't deposit yet");
        UserInfo storage user = userInfo[msg.sender];
        updatePool();
        if (user.amount > 0) {
            uint256 pending = user.amount.mul(accRewardTokenPerShare).div(1e12).sub(user.rewardDebt);
            if(pending > 0) {
                safeTokenTransfer(msg.sender, pending);
                emit Harvest(msg.sender, pending);
            }
        }
        user.amount = user.amount.add(_amount);
        user.rewardDebt = user.amount.mul(accRewardTokenPerShare).div(1e12);

        if(_amount > 0) {
            lpToken.safeTransferFrom(address(msg.sender), address(this), _amount);
        }
        emit Deposit(msg.sender, _amount);
    }

    // Withdraw LP tokens from MasterChef.
    function withdraw(uint256 _amount) public whenNotPaused nonReentrant {
        UserInfo storage user = userInfo[msg.sender];
        require(user.amount >= _amount, "withdraw: not good");

        updatePool();

        // Harvest Reward
        uint256 pending = user.amount.mul(accRewardTokenPerShare).div(1e12).sub(user.rewardDebt);
        if(pending > 0) {
            safeTokenTransfer(msg.sender, pending);
            emit Harvest(msg.sender, pending);
        }

        user.amount = user.amount.sub(_amount);
        user.rewardDebt = user.amount.mul(accRewardTokenPerShare).div(1e12);

        if(_amount > 0) {
            lpToken.safeTransfer(address(msg.sender), _amount);
        }
        emit Withdraw(msg.sender, _amount);
    }

    // Withdraw without caring about rewards. EMERGENCY ONLY.
    function emergencyWithdraw() public nonReentrant {
        UserInfo storage user = userInfo[msg.sender];
        lpToken.safeTransfer(address(msg.sender), user.amount);
        user.amount = 0;
        user.rewardDebt = 0;
        emit EmergencyWithdraw(msg.sender, user.amount);
    }

    // Safe Reward transfer function, just in case if rounding error causes pool to not have enough Reward.
    function safeTokenTransfer(address _to, uint256 _amount) internal {
        uint256 rewardBal = rewardToken.balanceOf(address(this));
        if (_amount > rewardBal) {
            rewardToken.safeTransfer(_to, rewardBal);
        } else {
            rewardToken.safeTransfer(_to, _amount);
        }
    }

    function depositRewards(uint256 _amount) external {
        require(_amount > 0, 'Deposit value must be greater than 0.');
        rewardToken.safeTransferFrom(address(msg.sender), address(this), _amount);
        emit DepositRewards(_amount);
    }

    // Withdraw reward. EMERGENCY ONLY.
    function emergencyRewardWithdraw(uint256 _amount) external onlyOwner {
        require(_amount <= rewardToken.balanceOf(address(this)), 'not enough rewards');
        // Withdraw rewards
        rewardToken.safeTransfer(address(msg.sender), _amount);
        emit EmergencyRewardWithdraw(msg.sender, _amount);
    }

    function setManualRewardPerSecond(uint256 _manualRewardPerSecond) external onlyOwner {
        manualRewardPerSecond = _manualRewardPerSecond;
    }

    /**
     * enables owner to pause / unpause minting
     */
    function setPaused(bool _paused) external onlyOwner {
        if (_paused) _pause();
        else _unpause();
    }

}

File 2 of 9 : BoringERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

// solhint-disable avoid-low-level-calls

library BoringERC20 {
    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()
    bytes4 private constant SIG_NAME = 0x06fdde03; // name()
    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()
    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)
    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)

    function returnDataToString(bytes memory data) internal pure returns (string memory) {
        if (data.length >= 64) {
            return abi.decode(data, (string));
        } else if (data.length == 32) {
            uint8 i = 0;
            while (i < 32 && data[i] != 0) {
                i++;
            }
            bytes memory bytesArray = new bytes(i);
            for (i = 0; i < 32 && data[i] != 0; i++) {
                bytesArray[i] = data[i];
            }
            return string(bytesArray);
        } else {
            return "???";
        }
    }

    /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.
    /// @param token The address of the ERC-20 token contract.
    /// @return (string) Token symbol.
    function safeSymbol(IERC20 token) internal view returns (string memory) {
        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL));
        return success ? returnDataToString(data) : "???";
    }

    /// @notice Provides a safe ERC20.name version which returns '???' as fallback string.
    /// @param token The address of the ERC-20 token contract.
    /// @return (string) Token name.
    function safeName(IERC20 token) internal view returns (string memory) {
        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME));
        return success ? returnDataToString(data) : "???";
    }

    /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.
    /// @param token The address of the ERC-20 token contract.
    /// @return (uint8) Token decimals.
    function safeDecimals(IERC20 token) internal view returns (uint8) {
        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS));
        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;
    }

    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.
    /// Reverts on a failed transfer.
    /// @param token The address of the ERC-20 token.
    /// @param to Transfer tokens to.
    /// @param amount The token amount.
    function safeTransfer(
        IERC20 token,
        address to,
        uint256 amount
    ) internal {
        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: Transfer failed");
    }

    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.
    /// Reverts on a failed transfer.
    /// @param token The address of the ERC-20 token.
    /// @param from Transfer tokens from.
    /// @param to Transfer tokens to.
    /// @param amount The token amount.
    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        (bool success, bytes memory data) = address(token).call(
            abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount)
        );
        require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: TransferFrom failed");
    }
}

File 3 of 9 : SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 4 of 9 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 5 of 9 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 6 of 9 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 7 of 9 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 8 of 9 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 9 of 9 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "evmVersion": "london",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DepositRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyRewardWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Harvest","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"accRewardTokenPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusEndTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRewardTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualRewardPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bonusEndTimestamp","type":"uint256"}],"name":"setBonusEndTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_manualRewardPerSecond","type":"uint256"}],"name":"setManualRewardPerSecond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_rewardToken","type":"address"}],"name":"setRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_stakeToken","type":"address"}],"name":"setStakeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTimestamp","type":"uint256"}],"name":"setStartTimeStamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526503287092778e60075534801561001a57600080fd5b506100243361003a565b6000805460ff60a01b191690556001805561008a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61164e806100996000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80638dbb1e3a11610104578063da5b4ee7116100a2578063e4a337f311610071578063e4a337f3146103ad578063f2fde38b146103b6578063f7c618c1146103c9578063f8077fae146103dc57600080fd5b8063da5b4ee71461038c578063db2e21bc14610394578063dd69f04f1461039c578063e3161ddd146103a557600080fd5b8063b6b55f25116100de578063b6b55f251461034b578063b98ad1011461035e578063c79fa87d14610371578063cee73a761461038457600080fd5b80638dbb1e3a1461031d5780639499668014610330578063aa5c3ab41461034357600080fd5b80635c975abb116101715780638294a88e1161014b5780638294a88e146102dd5780638aee8127146102e65780638bdf67f2146102f95780638da5cb5b1461030c57600080fd5b80635c975abb1461028c5780635fcbd285146102aa578063715018a6146102d557600080fd5b80632e1a7d4d116101ad5780632e1a7d4d1461023d57806331d7a262146102505780633279beab1461027157806344bfc6bf1461028457600080fd5b80630397d458146101d457806316c38b3c146101e95780631959a002146101fc575b600080fd5b6101e76101e2366004611408565b6103e5565b005b6101e76101f7366004611433565b61043a565b61022361020a366004611408565b6008602052600090815260409020805460019091015482565b604080519283526020830191909152015b60405180910390f35b6101e761024b366004611450565b61047d565b61026361025e366004611408565b610632565b604051908152602001610234565b6101e761027f366004611450565b61074b565b610263610874565b600054600160a01b900460ff165b6040519015158152602001610234565b6002546102bd906001600160a01b031681565b6040516001600160a01b039091168152602001610234565b6101e76108e7565b61026360075481565b6101e76102f4366004611408565b61091d565b6101e7610307366004611450565b610969565b6000546001600160a01b03166102bd565b61026361032b366004611469565b610a15565b6101e761033e366004611450565b610a55565b610263610a84565b6101e7610359366004611450565b610ab5565b6101e761036c366004611450565b610c6d565b6101e761037f366004611450565b610d06565b61029a610d35565b600754610263565b6101e7610d4e565b61026360045481565b6101e7610dea565b61026360055481565b6101e76103c4366004611408565b610ee9565b6006546102bd906001600160a01b031681565b61026360035481565b6000546001600160a01b031633146104185760405162461bcd60e51b815260040161040f9061148b565b60405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146104645760405162461bcd60e51b815260040161040f9061148b565b801561047557610472610f81565b50565b610472611003565b600054600160a01b900460ff16156104a75760405162461bcd60e51b815260040161040f906114c0565b6002600154036104c95760405162461bcd60e51b815260040161040f906114ea565b600260015533600090815260086020526040902080548211156105235760405162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604482015260640161040f565b61052b610dea565b6000610563826001015461055d64e8d4a51000610557600454876000015461108790919063ffffffff16565b9061109a565b906110a6565b905080156105ab5761057533826110b2565b60405181815233907fc9695243a805adb74c91f28311176c65b417e842d5699893cef56d18bfa48cba9060200160405180910390a25b81546105b790846110a6565b8083556004546105d29164e8d4a51000916105579190611087565b600183015582156105f4576002546105f4906001600160a01b03163385611158565b60405183815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a250506001805550565b6001600160a01b038181166000908152600860205260408082206004805460025493516370a0823160e01b815230928101929092529394919392859216906370a0823190602401602060405180830381865afa158015610696573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ba9190611521565b9050600354421180156106cc57508015155b1561071a5760006106df60035442610a15565b905060006106f66106ef60075490565b8390611087565b905061071561070e846105578464e8d4a51000611087565b8590611273565b935050505b610742836001015461055d64e8d4a5100061055786886000015461108790919063ffffffff16565b95945050505050565b6000546001600160a01b031633146107755760405162461bcd60e51b815260040161040f9061148b565b6006546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156107bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e19190611521565b8111156108255760405162461bcd60e51b81526020600482015260126024820152716e6f7420656e6f756768207265776172647360701b604482015260640161040f565b60065461083c906001600160a01b03163383611158565b60405181815233907f2d4434bb59801e733e9ce3df40b0c5518861a5fcdeec1906e83e03c755872b429060200160405180910390a250565b6002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a08231906024015b602060405180830381865afa1580156108be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e29190611521565b905090565b6000546001600160a01b031633146109115760405162461bcd60e51b815260040161040f9061148b565b61091b600061127f565b565b6000546001600160a01b031633146109475760405162461bcd60e51b815260040161040f9061148b565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b600081116109c75760405162461bcd60e51b815260206004820152602560248201527f4465706f7369742076616c7565206d757374206265206772656174657220746860448201526430b710181760d91b606482015260840161040f565b6006546109df906001600160a01b03163330846112cf565b6040518181527f754fe3a3c69256b66ca56365fda4bbf3299d7c94038c105ffd43fb4b37f56db69060200160405180910390a150565b60006005548211610a3157610a2a82846110a6565b9050610a4f565b6005548310610a4257506000610a4f565b600554610a2a90846110a6565b92915050565b6000546001600160a01b03163314610a7f5760405162461bcd60e51b815260040161040f9061148b565b600355565b6006546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a08231906024016108a1565b600054600160a01b900460ff1615610adf5760405162461bcd60e51b815260040161040f906114c0565b600260015403610b015760405162461bcd60e51b815260040161040f906114ea565b6002600155610b0e610d35565b610b525760405162461bcd60e51b8152602060048201526015602482015274165bdd4818d85b89dd0819195c1bdcda5d081e595d605a1b604482015260640161040f565b336000908152600860205260409020610b69610dea565b805415610be6576000610b9c826001015461055d64e8d4a51000610557600454876000015461108790919063ffffffff16565b90508015610be457610bae33826110b2565b60405181815233907fc9695243a805adb74c91f28311176c65b417e842d5699893cef56d18bfa48cba9060200160405180910390a25b505b8054610bf29083611273565b808255600454610c0d9164e8d4a51000916105579190611087565b60018201558115610c3057600254610c30906001600160a01b03163330856112cf565b60405182815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2505060018055565b6000546001600160a01b03163314610c975760405162461bcd60e51b815260040161040f9061148b565b6005548111610d015760405162461bcd60e51b815260206004820152603060248201527f6e657720626f6e757320656e6420626c6f636b206d757374206265206772656160448201526f1d195c881d1a185b8818dd5c9c995b9d60821b606482015260840161040f565b600555565b6000546001600160a01b03163314610d305760405162461bcd60e51b815260040161040f9061148b565b600755565b60006003546000141580156108e2575050600554151590565b600260015403610d705760405162461bcd60e51b815260040161040f906114ea565b60026001819055336000818152600860205260409020805492549092610da2926001600160a01b039092169190611158565b60008082556001820181905560405190815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a25060018055565b600054600160a01b900460ff1615610e145760405162461bcd60e51b815260040161040f906114c0565b60035442111561091b576002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610e67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8b9190611521565b905080600003610e9c575042600355565b6000610eaa60035442610a15565b9050610ede610ed58361055764e8d4a51000610ecf610ec860075490565b8790611087565b90611087565b60045490611273565b600455505042600355565b6000546001600160a01b03163314610f135760405162461bcd60e51b815260040161040f9061148b565b6001600160a01b038116610f785760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161040f565b6104728161127f565b600054600160a01b900460ff1615610fab5760405162461bcd60e51b815260040161040f906114c0565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610fe63390565b6040516001600160a01b03909116815260200160405180910390a1565b600054600160a01b900460ff166110535760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161040f565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33610fe6565b60006110938284611550565b9392505050565b6000611093828461156f565b60006110938284611591565b6006546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156110fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111f9190611521565b90508082111561114557600654611140906001600160a01b03168483611158565b505050565b600654611140906001600160a01b031684845b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916111b491906115a8565b6000604051808303816000865af19150503d80600081146111f1576040519150601f19603f3d011682016040523d82523d6000602084013e6111f6565b606091505b509150915081801561122057508051158061122057508080602001905181019061122091906115e3565b61126c5760405162461bcd60e51b815260206004820152601c60248201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604482015260640161040f565b5050505050565b60006110938284611600565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161133391906115a8565b6000604051808303816000865af19150503d8060008114611370576040519150601f19603f3d011682016040523d82523d6000602084013e611375565b606091505b509150915081801561139f57508051158061139f57508080602001905181019061139f91906115e3565b6113eb5760405162461bcd60e51b815260206004820181905260248201527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604482015260640161040f565b505050505050565b6001600160a01b038116811461047257600080fd5b60006020828403121561141a57600080fd5b8135611093816113f3565b801515811461047257600080fd5b60006020828403121561144557600080fd5b813561109381611425565b60006020828403121561146257600080fd5b5035919050565b6000806040838503121561147c57600080fd5b50508035926020909101359150565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60006020828403121561153357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561156a5761156a61153a565b500290565b60008261158c57634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156115a3576115a361153a565b500390565b6000825160005b818110156115c957602081860181015185830152016115af565b818111156115d8576000828501525b509190910192915050565b6000602082840312156115f557600080fd5b815161109381611425565b600082198211156116135761161361153a565b50019056fea26469706673582212200d89a7bba6fffaf205d08ed9e922d435a72d453024cbffea4c4e63bdbbad0be264736f6c634300080f0033

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.