Contract 0x4Fc8ceF7fa9F330a29332bDC773ae45eafBBB815 1

 
Txn Hash Method
Block
From
To
Value
0xd646f6177650f6da3e7fec2c1542e113d219c7c5a5bf7b8500d910ac8a881837Get Reward(pending)2021-09-17 7:20:1648 secs ago0x89082a56fa47446911b9709c97cbeb53966f2b00 IN 0x4fc8cef7fa9f330a29332bdc773ae45eafbbb8150 Ether(Pending)(Pending)
0xf47fbf2e92ad63ea938c93b673db2be3eb1a101bd744b91d32286bbc29f446f5Get Reward132417362021-09-17 6:58:5422 mins ago0x78bf86fa943de7407021d2f7778a546eda88c5de IN  0x4fc8cef7fa9f330a29332bdc773ae45eafbbb8150 Ether0.004227853072 55.288457709
0xf63b751973b01620632173df2ec7c75b20ce3b14f5d483f08898c44e275206f5Get Reward132415842021-09-17 6:20:351 hr ago0xc459df05657efe9770c6454a8cb21c08037cbc2a IN  0x4fc8cef7fa9f330a29332bdc773ae45eafbbb8150 Ether0.004201678759 54.946171117
0x99dd4311ac09ab64d8291fe716430ec1fa8bd3d304f21dc3bfb07c631b1dce5eGet Reward132411842021-09-17 4:47:352 hrs 33 mins ago0x09416dc6da825a2f9e4c41ba483b350af78cbe8d IN  0x4fc8cef7fa9f330a29332bdc773ae45eafbbb8150 Ether0.004141653201 45.619954633
0x753b25805bb3eb8109415c4ccd209e6a26beb6a0d70462854c19e9b39213df4cStake132397872021-09-16 23:34:147 hrs 46 mins ago0xaad143a4d63132ee4310ad3beea38aaa55b5ee0d IN  0x4fc8cef7fa9f330a29332bdc773ae45eafbbb8150 Ether0.004759256114 41.956169352
0xcf1abd13c3e9558c1a0287f971771596c1ce920f29aabc04638aeb51a8cdecc6Get Reward132395642021-09-16 22:51:018 hrs 30 mins ago0xe5b317c59182797673fbe5779296a45e70b68592 IN  0x4fc8cef7fa9f330a29332bdc773ae45eafbbb8150 Ether0.00576673052 62.150868884
0x4ebb0cc3dfcebfcc32715116ca58a4d41d0e5b1f330da965a5fc24fdfb56b252Stake132394662021-09-16 22:28:518 hrs 52 mins ago0x827eebb010754a72595cb13f3daa5f4e3080154a IN  0x4fc8cef7fa9f330a29332bdc773ae45eafbbb8150 Ether0.007670154409 77.336476563
0x9aebcbfd45d2124d3c605fd56511c076fc243ca1de6897506d0fd2ed51c86b85Get Reward132394652021-09-16 22:28:418 hrs 52 mins ago0x71e9baf1bdaefb89694058dd3f9fe1ae3d20b6bf IN  0x4fc8cef7fa9f330a29332bdc773ae45eafbbb8150 Ether0.005130981451 67.098843345
0xd7ddaf4b07a573ddc51125c34a30fd0a463e2c4edea685474e29eb22462d0ec8Get Reward132393252021-09-16 21:57:489 hrs 23 mins ago0x827eebb010754a72595cb13f3daa5f4e3080154a IN  0x4fc8cef7fa9f330a29332bdc773ae45eafbbb8150 Ether0.004544252646 97.060010826
0xcfdd9c0820baf4592ee4a0acabd645942c1d48f912e74528fce8b549408cbaaaGet Reward132393252021-09-16 21:57:489 hrs 23 mins ago0x827eebb010754a72595cb13f3daa5f4e3080154a IN  0x4fc8cef7fa9f330a29332bdc773ae45eafbbb8150 Ether0.004505875258 96.240313939
0xf83ef3170b619b8a2d38174d601bb66c48004476876fa18ec2101b325857fc34Get Reward132393252021-09-16 21:57:489 hrs 23 mins ago0x827eebb010754a72595cb13f3daa5f4e3080154a IN  0x4fc8cef7fa9f330a29332bdc773ae45eafbbb8150 Ether0.005683745053 62.605964063
0x80c4dc77d32743d6af0705331dd99090423537ad179e240670696b48393767a4Stake132391902021-09-16 21:26:169 hrs 54 mins ago0x1a5744145a147e73d38472162cbe00f06fcdeb2a IN  0x4fc8cef7fa9f330a29332bdc773ae45eafbbb8150 Ether0.011675851912 117.739287393
0x9ea8b2be08c1cba8c4a0b06c1c27a37602aeae542f4b0171d1c50ba1bfd0487aGet Reward132391362021-09-16 21:14:5910 hrs 6 mins ago0x1a5744145a147e73d38472162cbe00f06fcdeb2a IN  0x4fc8cef7fa9f330a29332bdc773ae45eafbbb8150 Ether0.005656006816 78.646311955
0x9f797eebdcae23de622dde8e7d12b33f1a996cda20b49bacb298ca614943e510Stake132391362021-09-16 21:14:5910 hrs 6 mins ago0x4d65bda74b0935672dbc055990ec9d29c1c6350f IN  0x4fc8cef7fa9f330a29332bdc773ae45eafbbb8150 Ether0.00892116575 78.646311955
0x10d07896b0817f00586dcf174807d7f1fb8415e67430b909102e9fdf30c06144Get Reward132391192021-09-16 21:10:5410 hrs 10 mins ago0x331dc2e09ea320720e128c8e7a0fcf377c2573ad IN  0x4fc8cef7fa9f330a29332bdc773ae45eafbbb8150 Ether0.005209884286 70.703855362
0x4c468084afe806b2dad08ea4486f05980bd36927fedf23ff4d6b9a589d12307dGet Reward132390512021-09-16 20:55:2210 hrs 25 mins ago0x64767fb2e4edf110bc2ac1eac451a1af8798c889 IN  0x4fc8cef7fa9f330a29332bdc773ae45eafbbb8150 Ether0.006328905112 82.764324275
0x20d22cb310fdff06dad1d7d46c9400a93e9e363c7b5560801e31798116d2c4a7Get Reward132389592021-09-16 20:37:2610 hrs 43 mins ago0x2f7705273fc8b9096f9b8b5bda95c21dd267a0ec IN  0x4fc8cef7fa9f330a29332bdc773ae45eafbbb8150 Ether0.007730418461 101.092187179
0xfa52e3f6ffcb7bc07c1f902985004ed9b3ab0faed2bd8b4ebe19220265072d72Get Reward132388422021-09-16 20:09:2411 hrs 11 mins ago0x95926cbebaf2857e0b17690bcf6218cfabc7f57f IN  0x4fc8cef7fa9f330a29332bdc773ae45eafbbb8150 Ether0.008677474898 113.477028575
0x309c2d52328fedeec6222d2424dad6a695bdbd61f54320ab6670699b7e9b43beStake132383822021-09-16 18:25:4612 hrs 55 mins ago0x89133b9783920b8e50a4b1299bfecb70745e99f7 IN  0x4fc8cef7fa9f330a29332bdc773ae45eafbbb8150 Ether0.012404289525 109.352482726
0x43d48006a981ced1a893d7570a3ad296238dd2f0343534ca60b1767df1fec2fcGet Reward132383212021-09-16 18:12:3213 hrs 8 mins ago0xd3d6f039a880bcc4f9ca323b8da0ac3e9000a3bf IN  0x4fc8cef7fa9f330a29332bdc773ae45eafbbb8150 Ether0.007861746128 102.809584652
0xdb074a67237fec657c9d11cf485d270867fd7a49de09f0a4f8dfa5c0f5af2c9fStake132374402021-09-16 14:58:4716 hrs 22 mins ago0x623ef0b83cb9a8319a2c4c1c06ab87248e03921e IN  0x4fc8cef7fa9f330a29332bdc773ae45eafbbb8150 Ether0.006114159522 61.655182897
0x3de522074d552bb74582eb05a339b1f0d4c048a88084c12d59d019f3a7e59db4Get Reward132373942021-09-16 14:48:5416 hrs 32 mins ago0x03f69cc9233830886274157cf1a299a8e7cfec1d IN  0x4fc8cef7fa9f330a29332bdc773ae45eafbbb8150 Ether0.006888755917 90.085602244
0xa5fe92f5233f56f25302b13e512683e344d09eb0653fcd7406b7aacc3d55dfadStake132372172021-09-16 14:09:1717 hrs 11 mins ago0x5a26990caa441cf13e473c0f7d670c03a28e2b9e IN  0x4fc8cef7fa9f330a29332bdc773ae45eafbbb8150 Ether0.00774766489 78.117997662
0xdc4c039238075e7923500db8c6065b72fa09e664102c290611170d7289e9ea69Get Reward132372052021-09-16 14:06:2317 hrs 14 mins ago0x722539f076ebcc50b66ccb3d50700906cdc0eda8 IN  0x4fc8cef7fa9f330a29332bdc773ae45eafbbb8150 Ether0.00540279445162.032635846
0x00ffeed39576faea2b55badeb408eb7fc7779ff55f1d9d5afb45f9581f7e558eGet Reward132372052021-09-16 14:06:2317 hrs 14 mins ago0x9c3da4c1278303fe3d8b65ca0dd6310cb6f13abe IN  0x4fc8cef7fa9f330a29332bdc773ae45eafbbb8150 Ether0.005755760149 62.032635846
[ Download CSV Export 
View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PeakStakingRewards

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-24
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }
}

interface IStakingRewards {
    // Views
    function lastTimeRewardApplicable() external view returns (uint256);

    function rewardPerToken() external view returns (uint256);

    function earned(address account) external view returns (uint256);

    function getRewardForDuration() external view returns (uint256);

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    // Mutative

    function stake(uint256 amount) external;

    function withdraw(uint256 amount) external;

    function getReward() external;

    function exit() external;
}

interface IUniswapV2ERC20 {
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
}

abstract contract ReentrancyGuard {
    /// @dev counter to allow mutex lock with only one SSTORE operation
    uint256 private _guardCounter;

    constructor () {
        // The counter starts at one to prevent changing it from zero to a non-zero
        // value, which is a more expensive operation.
        _guardCounter = 1;
    }

    /**
     * @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 make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _guardCounter += 1;
        uint256 localCounter = _guardCounter;
        _;
        require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call");
    }
}

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
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) {
        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) {
        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) {
        // 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) {
        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) {
        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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @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) {
        require(b <= a, "SafeMath: subtraction overflow");
        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) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @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. 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) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        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) {
        require(b > 0, "SafeMath: modulo by zero");
        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) {
        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.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * 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) {
        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) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

/**
 * @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;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @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);
}

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

abstract contract RewardsDistributionRecipient {
    address public rewardsDistribution;

    function notifyRewardAmount(uint256 reward) external virtual;

    modifier onlyRewardsDistribution() {
        require(msg.sender == rewardsDistribution, "Caller is not RewardsDistribution contract");
        _;
    }
}

contract PeakStakingRewards is IStakingRewards, RewardsDistributionRecipient, ReentrancyGuard {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    /* ========== STATE VARIABLES ========== */

    IERC20 public rewardsToken;
    IERC20 public stakingToken;
    uint256 public periodFinish = 0;
    uint256 public rewardRate = 0;
    uint256 public rewardsDuration =30 days;
    uint256 public lastUpdateTime;
    uint256 public rewardPerTokenStored;

    mapping(address => uint256) public userRewardPerTokenPaid;
    mapping(address => uint256) public rewards;

    uint256 private _totalSupply;
    mapping(address => uint256) private _balances;

    /* ========== EVENTS ========== */

    event RewardAdded(uint256 reward);
    event Staked(address indexed user, uint256 amount);
    event Withdrawn(address indexed user, uint256 amount);
    event RewardPaid(address indexed user, uint256 reward);

    /* ========== MODIFIERS ========== */

    modifier updateReward(address account) {
        rewardPerTokenStored = rewardPerToken();
        lastUpdateTime = lastTimeRewardApplicable();
        if (account != address(0)) {
            rewards[account] = earned(account);
            userRewardPerTokenPaid[account] = rewardPerTokenStored;
        }
        _;
    }

    /* ========== CONSTRUCTOR ========== */

    constructor(
        address _rewardsDistribution,
        address _rewardsToken,
        address _stakingToken
    ) ReentrancyGuard() {
        rewardsToken = IERC20(_rewardsToken);
        stakingToken = IERC20(_stakingToken);
        rewardsDistribution = _rewardsDistribution;
    }

    /* ========== VIEWS ========== */

    function totalSupply() external view override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) external view override returns (uint256) {
        return _balances[account];
    }

    function lastTimeRewardApplicable() public view override returns (uint256) {
        return Math.min(block.timestamp, periodFinish);
    }

    function rewardPerToken() public view override returns (uint256) {
        if (_totalSupply == 0) {
            return rewardPerTokenStored;
        }
        return
        rewardPerTokenStored.add(
            lastTimeRewardApplicable().sub(lastUpdateTime).mul(rewardRate).mul(1e18).div(_totalSupply)
        );
    }

    function earned(address account) public view override returns (uint256) {
        return _balances[account].mul(rewardPerToken().sub(userRewardPerTokenPaid[account])).div(1e18).add(rewards[account]);
    }

    function getRewardForDuration() external view override returns (uint256) {
        return rewardRate.mul(rewardsDuration);
    }

    /* ========== MUTATIVE FUNCTIONS ========== */

    function stakeWithPermit(uint256 amount, uint deadline, uint8 v, bytes32 r, bytes32 s) external nonReentrant updateReward(msg.sender) {
        require(amount > 0, "Cannot stake 0");
        _totalSupply = _totalSupply.add(amount);
        _balances[msg.sender] = _balances[msg.sender].add(amount);

        // permit
        IUniswapV2ERC20(address(stakingToken)).permit(msg.sender, address(this), amount, deadline, v, r, s);

        stakingToken.safeTransferFrom(msg.sender, address(this), amount);
        emit Staked(msg.sender, amount);
    }

    function stake(uint256 amount) external override nonReentrant updateReward(msg.sender) {
        require(amount > 0, "Cannot stake 0");
        _totalSupply = _totalSupply.add(amount);
        _balances[msg.sender] = _balances[msg.sender].add(amount);
        stakingToken.safeTransferFrom(msg.sender, address(this), amount);
        emit Staked(msg.sender, amount);
    }

    function withdraw(uint256 amount) public override nonReentrant updateReward(msg.sender) {
        require(amount > 0, "Cannot withdraw 0");
        _totalSupply = _totalSupply.sub(amount);
        _balances[msg.sender] = _balances[msg.sender].sub(amount);
        stakingToken.safeTransfer(msg.sender, amount);
        emit Withdrawn(msg.sender, amount);
    }

    function getReward() public override nonReentrant updateReward(msg.sender) {
        uint256 reward = rewards[msg.sender];
        if (reward > 0) {
            rewards[msg.sender] = 0;
            rewardsToken.safeTransfer(msg.sender, reward);
            emit RewardPaid(msg.sender, reward);
        }
    }

    function exit() external override {
        withdraw(_balances[msg.sender]);
        getReward();
    }

    /* ========== RESTRICTED FUNCTIONS ========== */

    function notifyRewardAmount(uint256 reward) external override onlyRewardsDistribution updateReward(address(0)) {
        if (block.timestamp >= periodFinish) {
            rewardRate = reward.div(rewardsDuration);
        } else {
            uint256 remaining = periodFinish.sub(block.timestamp);
            uint256 leftover = remaining.mul(rewardRate);
            rewardRate = reward.add(leftover).div(rewardsDuration);
        }

        // Ensure the provided reward amount is not more than the balance in the contract.
        // This keeps the reward rate in the right range, preventing overflows due to
        // very high values of rewardRate in the earned and rewardsPerToken functions;
        // Reward + leftover must be less than 2^256 / 10^18 to avoid overflow.
        uint balance = rewardsToken.balanceOf(address(this));
        require(rewardRate <= balance.div(rewardsDuration), "Provided reward too high");

        lastUpdateTime = block.timestamp;
        periodFinish = block.timestamp.add(rewardsDuration);
        emit RewardAdded(reward);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_rewardsDistribution","type":"address"},{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_stakingToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsDistribution","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"stakeWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600455600060055562278d0060065534801561002157600080fd5b506040516112983803806112988339818101604052606081101561004457600080fd5b508051602082015160409092015160018055600280546001600160a01b039485166001600160a01b0319918216179091556003805492851692821692909217909155600080549390921692169190911790556111f3806100a56000396000f3fe608060405234801561001057600080fd5b50600436106101415760003560e01c80637b0a47ee116100b8578063cd3daf9d1161007c578063cd3daf9d146102ad578063d1af0c7d146102b5578063df136d65146102bd578063e9fad8ee146102c5578063ebe2b12b146102cd578063ecd9ba82146102d557610141565b80637b0a47ee1461025257806380faa57d1461025a5780638b87634714610262578063a694fc3a14610288578063c8f33c91146102a557610141565b8063386a95251161010a578063386a9525146101d35780633c6b16ab146101db5780633d18b912146101f85780633fc6df6e1461020057806370a082311461022457806372f702f31461024a57610141565b80628cc262146101465780630700037d1461017e57806318160ddd146101a45780631c1f78eb146101ac5780632e1a7d4d146101b4575b600080fd5b61016c6004803603602081101561015c57600080fd5b50356001600160a01b031661030d565b60408051918252519081900360200190f35b61016c6004803603602081101561019457600080fd5b50356001600160a01b031661038b565b61016c61039d565b61016c6103a4565b6101d1600480360360208110156101ca57600080fd5b50356103c2565b005b61016c610545565b6101d1600480360360208110156101f157600080fd5b503561054b565b6101d161077e565b6102086108a2565b604080516001600160a01b039092168252519081900360200190f35b61016c6004803603602081101561023a57600080fd5b50356001600160a01b03166108b1565b6102086108cc565b61016c6108db565b61016c6108e1565b61016c6004803603602081101561027857600080fd5b50356001600160a01b03166108ef565b6101d16004803603602081101561029e57600080fd5b5035610901565b61016c610a7e565b61016c610a84565b610208610ad2565b61016c610ae1565b6101d1610ae7565b61016c610b0a565b6101d1600480360360a08110156102eb57600080fd5b5080359060208101359060ff6040820135169060608101359060800135610b10565b6001600160a01b0381166000908152600a60209081526040808320546009909252822054610385919061037f90670de0b6b3a7640000906103799061035a90610354610a84565b90610d20565b6001600160a01b0388166000908152600c602052604090205490610d7d565b90610ddd565b90610e44565b92915050565b600a6020526000908152604090205481565b600b545b90565b60006103bd600654600554610d7d90919063ffffffff16565b905090565b60018054810190819055336103d5610a84565b6008556103e06108e1565b6007556001600160a01b03811615610427576103fb8161030d565b6001600160a01b0382166000908152600a60209081526040808320939093556008546009909152919020555b60008311610470576040805162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015290519081900360640190fd5b600b5461047d9084610d20565b600b55336000908152600c602052604090205461049a9084610d20565b336000818152600c60205260409020919091556003546104c6916001600160a01b039091169085610e9e565b60408051848152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a2506001548114610541576040805162461bcd60e51b815260206004820152601f6024820152600080516020611129833981519152604482015290519081900360640190fd5b5050565b60065481565b6000546001600160a01b031633146105945760405162461bcd60e51b815260040180806020018281038252602a81526020018061116a602a913960400191505060405180910390fd5b600061059e610a84565b6008556105a96108e1565b6007556001600160a01b038116156105f0576105c48161030d565b6001600160a01b0382166000908152600a60209081526040808320939093556008546009909152919020555b600454421061060f57600654610607908390610ddd565b600555610652565b60045460009061061f9042610d20565b9050600061063860055483610d7d90919063ffffffff16565b60065490915061064c906103798684610e44565b60055550505b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561069d57600080fd5b505afa1580156106b1573d6000803e3d6000fd5b505050506040513d60208110156106c757600080fd5b50516006549091506106da908290610ddd565b6005541115610730576040805162461bcd60e51b815260206004820152601860248201527f50726f76696465642072657761726420746f6f20686967680000000000000000604482015290519081900360640190fd5b4260078190556006546107439190610e44565b6004556040805184815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a1505050565b6001805481019081905533610791610a84565b60085561079c6108e1565b6007556001600160a01b038116156107e3576107b78161030d565b6001600160a01b0382166000908152600a60209081526040808320939093556008546009909152919020555b336000908152600a6020526040902054801561085957336000818152600a6020526040812055600254610822916001600160a01b039091169083610e9e565b60408051828152905133917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b5050600154811461089f576040805162461bcd60e51b815260206004820152601f6024820152600080516020611129833981519152604482015290519081900360640190fd5b50565b6000546001600160a01b031681565b6001600160a01b03166000908152600c602052604090205490565b6003546001600160a01b031681565b60055481565b60006103bd42600454610ef5565b60096020526000908152604090205481565b6001805481019081905533610914610a84565b60085561091f6108e1565b6007556001600160a01b038116156109665761093a8161030d565b6001600160a01b0382166000908152600a60209081526040808320939093556008546009909152919020555b600083116109ac576040805162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015290519081900360640190fd5b600b546109b99084610e44565b600b55336000908152600c60205260409020546109d69084610e44565b336000818152600c6020526040902091909155600354610a03916001600160a01b03909116903086610f0b565b60408051848152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a2506001548114610541576040805162461bcd60e51b815260206004820152601f6024820152600080516020611129833981519152604482015290519081900360640190fd5b60075481565b6000600b5460001415610a9a57506008546103a1565b6103bd610ac9600b54610379670de0b6b3a7640000610ac3600554610ac36007546103546108e1565b90610d7d565b60085490610e44565b6002546001600160a01b031681565b60085481565b336000908152600c6020526040902054610b00906103c2565b610b0861077e565b565b60045481565b6001805481019081905533610b23610a84565b600855610b2e6108e1565b6007556001600160a01b03811615610b7557610b498161030d565b6001600160a01b0382166000908152600a60209081526040808320939093556008546009909152919020555b60008711610bbb576040805162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015290519081900360640190fd5b600b54610bc89088610e44565b600b55336000908152600c6020526040902054610be59088610e44565b336000818152600c602052604080822093909355600354835163d505accf60e01b81526004810193909352306024840152604483018b9052606483018a905260ff8916608484015260a4830188905260c4830187905292516001600160a01b039093169263d505accf9260e480820193929182900301818387803b158015610c6c57600080fd5b505af1158015610c80573d6000803e3d6000fd5b5050600354610c9d92506001600160a01b0316905033308a610f0b565b60408051888152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a2506001548114610d18576040805162461bcd60e51b815260206004820152601f6024820152600080516020611129833981519152604482015290519081900360640190fd5b505050505050565b600082821115610d77576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082610d8c57506000610385565b82820282848281610d9957fe5b0414610dd65760405162461bcd60e51b81526004018080602001828103825260218152602001806111496021913960400191505060405180910390fd5b9392505050565b6000808211610e33576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381610e3c57fe5b049392505050565b600082820183811015610dd6576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ef0908490610f6b565b505050565b6000818310610f045781610dd6565b5090919050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610f65908590610f6b565b50505050565b610f7d826001600160a01b0316611122565b610fce576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b600080836001600160a01b0316836040518082805190602001908083835b6020831061100b5780518252601f199092019160209182019101610fec565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461106d576040519150601f19603f3d011682016040523d82523d6000602084013e611072565b606091505b5091509150816110c9576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115610f65578080602001905160208110156110e557600080fd5b5051610f655760405162461bcd60e51b815260040180806020018281038252602a815260200180611194602a913960400191505060405180910390fd5b3b15159056fe5265656e7472616e637947756172643a207265656e7472616e742063616c6c00536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7743616c6c6572206973206e6f742052657761726473446973747269627574696f6e20636f6e74726163745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220413d64e8e50c87e4aa32bca32c4485333e942be6bfe4c043b97f0f055a9a78a464736f6c63430007060033000000000000000000000000eff81b475d97f8074f23d54cf465e65b4dd43b7d000000000000000000000000630d98424efe0ea27fb1b3ab7741907dffeaad780000000000000000000000009c18a2f9545112ab2fcbdd228536562406a53232

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000eff81b475d97f8074f23d54cf465e65b4dd43b7d000000000000000000000000630d98424efe0ea27fb1b3ab7741907dffeaad780000000000000000000000009c18a2f9545112ab2fcbdd228536562406a53232

-----Decoded View---------------
Arg [0] : _rewardsDistribution (address): 0xeff81b475d97f8074f23d54cf465e65b4dd43b7d
Arg [1] : _rewardsToken (address): 0x630d98424efe0ea27fb1b3ab7741907dffeaad78
Arg [2] : _stakingToken (address): 0x9c18a2f9545112ab2fcbdd228536562406a53232

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000eff81b475d97f8074f23d54cf465e65b4dd43b7d
Arg [1] : 000000000000000000000000630d98424efe0ea27fb1b3ab7741907dffeaad78
Arg [2] : 0000000000000000000000009c18a2f9545112ab2fcbdd228536562406a53232


Deployed ByteCode Sourcemap

24610:5770:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27058:207;;;;;;;;;;;;;;;;-1:-1:-1;27058:207:0;-1:-1:-1;;;;;27058:207:0;;:::i;:::-;;;;;;;;;;;;;;;;25160:42;;;;;;;;;;;;;;;;-1:-1:-1;25160:42:0;-1:-1:-1;;;;;25160:42:0;;:::i;26336:102::-;;;:::i;27273:130::-;;;:::i;28417:366::-;;;;;;;;;;;;;;;;-1:-1:-1;28417:366:0;;:::i;:::-;;24970:39;;;:::i;29285:1092::-;;;;;;;;;;;;;;;;-1:-1:-1;29285:1092:0;;:::i;28791:316::-;;;:::i;24337:34::-;;;:::i;:::-;;;;-1:-1:-1;;;;;24337:34:0;;;;;;;;;;;;;;26446:121;;;;;;;;;;;;;;;;-1:-1:-1;26446:121:0;-1:-1:-1;;;;;26446:121:0;;:::i;24863:26::-;;;:::i;24934:29::-;;;:::i;26575:140::-;;;:::i;25096:57::-;;;;;;;;;;;;;;;;-1:-1:-1;25096:57:0;-1:-1:-1;;;;;25096:57:0;;:::i;28031:378::-;;;;;;;;;;;;;;;;-1:-1:-1;28031:378:0;;:::i;25016:29::-;;;:::i;26723:327::-;;;:::i;24830:26::-;;;:::i;25052:35::-;;;:::i;29115:106::-;;;:::i;24896:31::-;;;:::i;27465:558::-;;;;;;;;;;;;;;;;-1:-1:-1;27465:558:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;27058:207::-;-1:-1:-1;;;;;27240:16:0;;27121:7;27240:16;;;:7;:16;;;;;;;;;27192:22;:31;;;;;;27148:109;;27240:16;27148:87;;27230:4;;27148:77;;27171:53;;:16;:14;:16::i;:::-;:20;;:53::i;:::-;-1:-1:-1;;;;;27148:18:0;;;;;;:9;:18;;;;;;;:22;:77::i;:::-;:81;;:87::i;:::-;:91;;:109::i;:::-;27141:116;27058:207;-1:-1:-1;;27058:207:0:o;25160:42::-;;;;;;;;;;;;;:::o;26336:102::-;26418:12;;26336:102;;:::o;27273:130::-;27337:7;27364:31;27379:15;;27364:10;;:14;;:31;;;;:::i;:::-;27357:38;;27273:130;:::o;28417:366::-;2427:1;2410:18;;;;;;;;28493:10:::1;25680:16;:14;:16::i;:::-;25657:20;:39:::0;25724:26:::1;:24;:26::i;:::-;25707:14;:43:::0;-1:-1:-1;;;;;25765:21:0;::::1;::::0;25761:157:::1;;25822:15;25829:7;25822:6;:15::i;:::-;-1:-1:-1::0;;;;;25803:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:34;;;;25886:20:::1;::::0;25852:22:::1;:31:::0;;;;;;:54;25761:157:::1;28533:1:::2;28524:6;:10;28516:40;;;::::0;;-1:-1:-1;;;28516:40:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;28516:40:0;;;;;;;;;;;;;::::2;;28582:12;::::0;:24:::2;::::0;28599:6;28582:16:::2;:24::i;:::-;28567:12;:39:::0;28651:10:::2;28641:21;::::0;;;:9:::2;:21;::::0;;;;;:33:::2;::::0;28667:6;28641:25:::2;:33::i;:::-;28627:10;28617:21;::::0;;;:9:::2;:21;::::0;;;;:57;;;;28685:12:::2;::::0;:45:::2;::::0;-1:-1:-1;;;;;28685:12:0;;::::2;::::0;28723:6;28685:25:::2;:45::i;:::-;28746:29;::::0;;;;;;;28756:10:::2;::::0;28746:29:::2;::::0;;;;;::::2;::::0;;::::2;2486:1:::1;2522:13:::0;;2506:12;:29;2498:73;;;;;-1:-1:-1;;;2498:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2498:73:0;;;;;;;;;;;;;;;28417:366;;:::o;24970:39::-;;;;:::o;29285:1092::-;24517:19;;-1:-1:-1;;;;;24517:19:0;24503:10;:33;24495:88;;;;-1:-1:-1;;;24495:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29392:1:::1;25680:16;:14;:16::i;:::-;25657:20;:39:::0;25724:26:::1;:24;:26::i;:::-;25707:14;:43:::0;-1:-1:-1;;;;;25765:21:0;::::1;::::0;25761:157:::1;;25822:15;25829:7;25822:6;:15::i;:::-;-1:-1:-1::0;;;;;25803:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:34;;;;25886:20:::1;::::0;25852:22:::1;:31:::0;;;;;;:54;25761:157:::1;29430:12:::2;;29411:15;:31;29407:318;;29483:15;::::0;29472:27:::2;::::0;:6;;:10:::2;:27::i;:::-;29459:10;:40:::0;29407:318:::2;;;29552:12;::::0;29532:17:::2;::::0;29552:33:::2;::::0;29569:15:::2;29552:16;:33::i;:::-;29532:53;;29600:16;29619:25;29633:10;;29619:9;:13;;:25;;;;:::i;:::-;29697:15;::::0;29600:44;;-1:-1:-1;29672:41:0::2;::::0;:20:::2;:6:::0;29600:44;29672:10:::2;:20::i;:41::-;29659:10;:54:::0;-1:-1:-1;;29407:318:0::2;30100:12;::::0;:37:::2;::::0;;-1:-1:-1;;;30100:37:0;;30131:4:::2;30100:37;::::0;::::2;::::0;;;30085:12:::2;::::0;-1:-1:-1;;;;;30100:12:0::2;::::0;:22:::2;::::0;:37;;;;;::::2;::::0;;;;;;;;:12;:37;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;30100:37:0;30182:15:::2;::::0;30100:37;;-1:-1:-1;30170:28:0::2;::::0;30100:37;;30170:11:::2;:28::i;:::-;30156:10;;:42;;30148:79;;;::::0;;-1:-1:-1;;;30148:79:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;30257:15;30240:14;:32:::0;;;30318:15:::2;::::0;30298:36:::2;::::0;30257:15;30298:19:::2;:36::i;:::-;30283:12;:51:::0;30350:19:::2;::::0;;;;;;;::::2;::::0;;;;::::2;::::0;;::::2;25928:1;24594::::1;29285:1092:::0;:::o;28791:316::-;2427:1;2410:18;;;;;;;;28854:10:::1;25680:16;:14;:16::i;:::-;25657:20;:39:::0;25724:26:::1;:24;:26::i;:::-;25707:14;:43:::0;-1:-1:-1;;;;;25765:21:0;::::1;::::0;25761:157:::1;;25822:15;25829:7;25822:6;:15::i;:::-;-1:-1:-1::0;;;;;25803:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:34;;;;25886:20:::1;::::0;25852:22:::1;:31:::0;;;;;;:54;25761:157:::1;28902:10:::2;28877:14;28894:19:::0;;;:7:::2;:19;::::0;;;;;28928:10;;28924:176:::2;;28963:10;28977:1;28955:19:::0;;;:7:::2;:19;::::0;;;;:23;28993:12:::2;::::0;:45:::2;::::0;-1:-1:-1;;;;;28993:12:0;;::::2;::::0;29031:6;28993:25:::2;:45::i;:::-;29058:30;::::0;;;;;;;29069:10:::2;::::0;29058:30:::2;::::0;;;;;::::2;::::0;;::::2;28924:176;25928:1;2486::::1;2522:13:::0;;2506:12;:29;2498:73;;;;;-1:-1:-1;;;2498:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2498:73:0;;;;;;;;;;;;;;;28791:316;:::o;24337:34::-;;;-1:-1:-1;;;;;24337:34:0;;:::o;26446:121::-;-1:-1:-1;;;;;26541:18:0;26514:7;26541:18;;;:9;:18;;;;;;;26446:121::o;24863:26::-;;;-1:-1:-1;;;;;24863:26:0;;:::o;24934:29::-;;;;:::o;26575:140::-;26641:7;26668:39;26677:15;26694:12;;26668:8;:39::i;25096:57::-;;;;;;;;;;;;;:::o;28031:378::-;2427:1;2410:18;;;;;;;;28106:10:::1;25680:16;:14;:16::i;:::-;25657:20;:39:::0;25724:26:::1;:24;:26::i;:::-;25707:14;:43:::0;-1:-1:-1;;;;;25765:21:0;::::1;::::0;25761:157:::1;;25822:15;25829:7;25822:6;:15::i;:::-;-1:-1:-1::0;;;;;25803:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:34;;;;25886:20:::1;::::0;25852:22:::1;:31:::0;;;;;;:54;25761:157:::1;28146:1:::2;28137:6;:10;28129:37;;;::::0;;-1:-1:-1;;;28129:37:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;28129:37:0;;;;;;;;;;;;;::::2;;28192:12;::::0;:24:::2;::::0;28209:6;28192:16:::2;:24::i;:::-;28177:12;:39:::0;28261:10:::2;28251:21;::::0;;;:9:::2;:21;::::0;;;;;:33:::2;::::0;28277:6;28251:25:::2;:33::i;:::-;28237:10;28227:21;::::0;;;:9:::2;:21;::::0;;;;:57;;;;28295:12:::2;::::0;:64:::2;::::0;-1:-1:-1;;;;;28295:12:0;;::::2;::::0;28345:4:::2;28352:6:::0;28295:29:::2;:64::i;:::-;28375:26;::::0;;;;;;;28382:10:::2;::::0;28375:26:::2;::::0;;;;;::::2;::::0;;::::2;2486:1:::1;2522:13:::0;;2506:12;:29;2498:73;;;;;-1:-1:-1;;;2498:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2498:73:0;;;;;;;;;;;;;;25016:29;;;;:::o;26723:327::-;26779:7;26803:12;;26819:1;26803:17;26799:77;;;-1:-1:-1;26844:20:0;;26837:27;;26799:77;26902:140;26941:90;27018:12;;26941:72;27008:4;26941:62;26992:10;;26941:46;26972:14;;26941:26;:24;:26::i;:46::-;:50;;:62::i;:90::-;26902:20;;;:24;:140::i;24830:26::-;;;-1:-1:-1;;;;;24830:26:0;;:::o;25052:35::-;;;;:::o;29115:106::-;29179:10;29169:21;;;;:9;:21;;;;;;29160:31;;:8;:31::i;:::-;29202:11;:9;:11::i;:::-;29115:106::o;24896:31::-;;;;:::o;27465:558::-;2427:1;2410:18;;;;;;;;27587:10:::1;25680:16;:14;:16::i;:::-;25657:20;:39:::0;25724:26:::1;:24;:26::i;:::-;25707:14;:43:::0;-1:-1:-1;;;;;25765:21:0;::::1;::::0;25761:157:::1;;25822:15;25829:7;25822:6;:15::i;:::-;-1:-1:-1::0;;;;;25803:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:34;;;;25886:20:::1;::::0;25852:22:::1;:31:::0;;;;;;:54;25761:157:::1;27627:1:::2;27618:6;:10;27610:37;;;::::0;;-1:-1:-1;;;27610:37:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;27610:37:0;;;;;;;;;;;;;::::2;;27673:12;::::0;:24:::2;::::0;27690:6;27673:16:::2;:24::i;:::-;27658:12;:39:::0;27742:10:::2;27732:21;::::0;;;:9:::2;:21;::::0;;;;;:33:::2;::::0;27758:6;27732:25:::2;:33::i;:::-;27718:10;27708:21;::::0;;;:9:::2;:21;::::0;;;;;:57;;;;27821:12:::2;::::0;27797:99;;-1:-1:-1;;;27797:99:0;;::::2;::::0;::::2;::::0;;;;27863:4:::2;27797:99:::0;;;;;;;;;;;;;;;;::::2;::::0;::::2;::::0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27821:12:0;;::::2;::::0;27797:45:::2;::::0;:99;;;;;27708:21;27797:99;;;;;;27708:21;27821:12;27797:99;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;27909:12:0::2;::::0;:64:::2;::::0;-1:-1:-1;;;;;;27909:12:0::2;::::0;-1:-1:-1;27939:10:0::2;27959:4;27966:6:::0;27909:29:::2;:64::i;:::-;27989:26;::::0;;;;;;;27996:10:::2;::::0;27989:26:::2;::::0;;;;;::::2;::::0;;::::2;2486:1:::1;2522:13:::0;;2506:12;:29;2498:73;;;;;-1:-1:-1;;;2498:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2498:73:0;;;;;;;;;;;;;;;27465:558;;;;;;:::o;5752:158::-;5810:7;5843:1;5838;:6;;5830:49;;;;;-1:-1:-1;;;5830:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5897:5:0;;;5752:158::o;6169:220::-;6227:7;6251:6;6247:20;;-1:-1:-1;6266:1:0;6259:8;;6247:20;6290:5;;;6294:1;6290;:5;:1;6314:5;;;;;:10;6306:56;;;;-1:-1:-1;;;6306:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6380:1;6169:220;-1:-1:-1;;;6169:220:0:o;6867:153::-;6925:7;6957:1;6953;:5;6945:44;;;;;-1:-1:-1;;;6945:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7011:1;7007;:5;;;;;;;6867:153;-1:-1:-1;;;6867:153:0:o;5290:179::-;5348:7;5380:5;;;5404:6;;;;5396:46;;;;;-1:-1:-1;;;5396:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;21168:176;21277:58;;;-1:-1:-1;;;;;21277:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21277:58:0;-1:-1:-1;;;21277:58:0;;;21251:85;;21270:5;;21251:18;:85::i;:::-;21168:176;;;:::o;406:106::-;464:7;495:1;491;:5;:13;;503:1;491:13;;;-1:-1:-1;499:1:0;;484:20;-1:-1:-1;406:106:0:o;21352:204::-;21479:68;;;-1:-1:-1;;;;;21479:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21479:68:0;-1:-1:-1;;;21479:68:0;;;21453:95;;21472:5;;21453:18;:95::i;:::-;21352:204;;;;:::o;23162:1114::-;23766:27;23774:5;-1:-1:-1;;;;;23766:25:0;;:27::i;:::-;23758:71;;;;;-1:-1:-1;;;23758:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23903:12;23917:23;23952:5;-1:-1:-1;;;;;23944:19:0;23964:4;23944:25;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23944:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23902:67;;;;23988:7;23980:52;;;;;-1:-1:-1;;;23980:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24049:17;;:21;24045:224;;24191:10;24180:30;;;;;;;;;;;;;;;-1:-1:-1;24180:30:0;24172:85;;;;-1:-1:-1;;;24172:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10638:422;11005:20;11044:8;;;10638:422::o

Swarm Source

ipfs://413d64e8e50c87e4aa32bca32c4485333e942be6bfe4c043b97f0f055a9a78a4
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.