Contract 0x536B4D88fdE42c6f6b14A7756355Aad6Ef39bCd6 1

 
Ad
Ad
Txn Hash Method
Block
From
To
Value
0x58f6a27dcd0e612f8ec1490b527b74cfd52d13128af21bff754b916a6286b609Get Reward132417072021-09-17 6:52:531 min ago0x78bf86fa943de7407021d2f7778a546eda88c5de IN  0x536b4d88fde42c6f6b14a7756355aad6ef39bcd60 Ether0.004556660076 61.838884948
0x0d1d26e77b1c6051d190fd3d475ff9b8dfeaa1e5650b055ba3faf25612f47420Stake132413782021-09-17 5:31:321 hr 22 mins ago0x623ef0b83cb9a8319a2c4c1c06ab87248e03921e IN  0x536b4d88fde42c6f6b14a7756355aad6ef39bcd60 Ether0.006185734962 64.235341982
0x6c3175b406810a37a9d2635aa06feed868837f1f047be9a0afd90888b7d9c28bGet Reward132413402021-09-17 5:22:401 hr 31 mins ago0x9a0455f39bb8c5f31a3b813d4d8934ca64a7a4e9 IN  0x536b4d88fde42c6f6b14a7756355aad6ef39bcd60 Ether0.006070937875 65.429459997
0xe6a87d0f099aecc865ffcf97dea1e413b84d61e59a0dd759887a8a37c1f53b21Stake132412842021-09-17 5:09:341 hr 44 mins ago0x18229b32986611e21a12488be2a3d9f8e5a5d903 IN  0x536b4d88fde42c6f6b14a7756355aad6ef39bcd60 Ether0.005951018368 60.024594462
0xebd0f37c9b433a6dc3b79b09e326bd9499c25bd1e882732f7c4b04b76de17abfGet Reward132411892021-09-17 4:48:042 hrs 5 mins ago0xf17d14aa320480d9927947a69bfcc18122763ef3 IN  0x536b4d88fde42c6f6b14a7756355aad6ef39bcd60 Ether0.003747234134 43.024181759
0x180569ead639bebf687edf629b8ffb8ef59719932379f5cb216d8e61b418a626Get Reward132411892021-09-17 4:48:042 hrs 5 mins ago0x18229b32986611e21a12488be2a3d9f8e5a5d903 IN  0x536b4d88fde42c6f6b14a7756355aad6ef39bcd60 Ether0.003908152812 43.047967891
0xa3089194564c07fbc66f757b0c742a3edafef17b7c76ee9d8d9fa2dc67c5e439Stake132410952021-09-17 4:29:052 hrs 24 mins ago0xbc8e7e4e46615a6ec06c16f5805700f77ca43552 IN  0x536b4d88fde42c6f6b14a7756355aad6ef39bcd60 Ether0.008980140384 97.286637751
0xaee49e469f9cad0e0634063cc466c4023ba73b699470ef4cfb311a1d3496fab0Stake132410952021-09-17 4:29:052 hrs 24 mins ago0xbc8e7e4e46615a6ec06c16f5805700f77ca43552 IN  0x536b4d88fde42c6f6b14a7756355aad6ef39bcd60 Ether0.0073455379 79.578119522
0x5b147984d527646a2adc34fbf9747257b56a88b3d4b9f79b1bb8ecfd53f59b00Get Reward132403812021-09-17 1:46:365 hrs 7 mins ago0x2d0ef86c1572962710f594deaa607417bed460bc IN  0x536b4d88fde42c6f6b14a7756355aad6ef39bcd60 Ether0.004551320402 49.051800941
0x220e5e48a6ec406cb237eb4ed190a3b6095d0327e7283dd8016762dba001ce51Get Reward132403802021-09-17 1:46:345 hrs 7 mins ago0x677cccde51d33dd66150a31ff88ad14ad7ff4fa9 IN  0x536b4d88fde42c6f6b14a7756355aad6ef39bcd60 Ether0.005076446152 54.711337402
0x9e2c738aacab1064380774aff8368409d19434b28bd8628c1b3412dd5fd6173fGet Reward132400742021-09-17 0:40:066 hrs 13 mins ago0x42a244f404a3902bc4d425cc7ef9e3ba2ada9fed IN  0x536b4d88fde42c6f6b14a7756355aad6ef39bcd60 Ether0.006309895147 68.004819128
0x65ec483a7026e161cb9ea5683621c5d32841dfe9e9e8219541d38ecd86d32a0bGet Reward132398602021-09-16 23:50:027 hrs 3 mins ago0xff0b81cec90b20c12b0d842298ece70445e75a6f IN  0x536b4d88fde42c6f6b14a7756355aad6ef39bcd60 Ether0.004266294525 45.979937983
0xc88114c21d0547189d50b10b59be7f3a4cd0a39bc25e2a361afd5b1ac5f1c055Get Reward132398572021-09-16 23:49:537 hrs 4 mins ago0x418336de174ab370e900b71aa13ac374aff42909 IN  0x536b4d88fde42c6f6b14a7756355aad6ef39bcd60 Ether0.004353855812 46.923628701
0xe4acbb91d83bd381b502e22e784c254f94efce7b044668fd2e5cef46ca4ba30bGet Reward132396232021-09-16 23:03:567 hrs 50 mins ago0x42a244f404a3902bc4d425cc7ef9e3ba2ada9fed IN  0x536b4d88fde42c6f6b14a7756355aad6ef39bcd60 Ether0.005439060974 71.127659245
0xc4342128de34e6123c1e151b561b89be80f11d56550b142d414ea7026a4946e9Stake132393472021-09-16 22:03:478 hrs 50 mins ago0x8d3c9054d3b3a19c5eff03dad4863568a749df80 IN  0x536b4d88fde42c6f6b14a7756355aad6ef39bcd60 Ether0.008912369853 89.883211676
0xc1daab0b0939642d0ede1d37b76320fe306c9b00e851698d03c9e08622447d06Get Reward132392452021-09-16 21:38:369 hrs 15 mins ago0x8d3c9054d3b3a19c5eff03dad4863568a749df80 IN  0x536b4d88fde42c6f6b14a7756355aad6ef39bcd60 Ether0.006422097297 87.154918136
0x9cd3ea1cd3a2d8ea03362c8fe1a6e2ff73dca7fe91c13b23ba108f7f3e8e08d4Stake132391762021-09-16 21:22:579 hrs 31 mins ago0x6e8850b078f9e00c402ad33ee7feeed898abbe9c IN  0x536b4d88fde42c6f6b14a7756355aad6ef39bcd60 Ether0.011794348709118.963
0xb9a0a46e38a821d2c52a3c36c85a27857efe76d875a386a95c2ed7e26fbbf4f1Get Reward132388992021-09-16 20:22:5810 hrs 31 mins ago0x6e8850b078f9e00c402ad33ee7feeed898abbe9c IN  0x536b4d88fde42c6f6b14a7756355aad6ef39bcd60 Ether0.01332693087146.795
0x4ddca6f192a446e95551771da59fed8b69e7f1b28619f7403297274b75fce609Get Reward132388612021-09-16 20:12:5410 hrs 41 mins ago0x42a244f404a3902bc4d425cc7ef9e3ba2ada9fed IN  0x536b4d88fde42c6f6b14a7756355aad6ef39bcd60 Ether0.008913523929 96.065397041
0x16460b72679f3b764f0ba02d327304ba8db2a43a9447896102ef97fa3e14db51Get Reward132386712021-09-16 19:30:2211 hrs 23 mins ago0x0101ddaa303c108b577b8fe28c60802504a141f0 IN  0x536b4d88fde42c6f6b14a7756355aad6ef39bcd60 Ether0.015491059691 166.954709666
0x5cb1757fd931dd3ffd9237ac29ea906cde244d42240819df65c8db484a483ee7Stake132381022021-09-16 17:19:5413 hrs 34 mins ago0x385c2181db8b90a88f8090bfc2bd99a9a0e645bc IN  0x536b4d88fde42c6f6b14a7756355aad6ef39bcd60 Ether0.006814995661 68.739050274
0xc2024a05bedf80e2dd3128e642c4b271d3a25ee373ae53f497abef88d194c413Stake132380982021-09-16 17:19:2913 hrs 34 mins ago0xe4b06fb693d2e36844fd583feed3cbca9bdf1812 IN  0x536b4d88fde42c6f6b14a7756355aad6ef39bcd60 Ether0.00729668865273.597618116
0x7854810d77b587dde8cfec3719005c0cb5bb7a3d91a3641e04957713490d875fGet Reward132380392021-09-16 17:06:1513 hrs 47 mins ago0x385c2181db8b90a88f8090bfc2bd99a9a0e645bc IN  0x536b4d88fde42c6f6b14a7756355aad6ef39bcd60 Ether0.007663583184 82.594175683
0x990deda01ed535b16dda0c14ac38360a9ce04ed238122dbf85af6715210252b1Get Reward132380382021-09-16 17:05:5013 hrs 48 mins ago0xc59abb4449e262080d8bb361afaec4d20bf420b1 IN  0x536b4d88fde42c6f6b14a7756355aad6ef39bcd60 Ether0.007498394833 82.594175683
0x9e72669e692465664ee90cc6447acbe9582837c1aeaa17c075289d78c7e8055fStake132378562021-09-16 16:25:3314 hrs 28 mins ago0x407d2a4bf2523c07a91df17eec6decbbe2bde188 IN  0x536b4d88fde42c6f6b14a7756355aad6ef39bcd60 Ether0.006880438467 69.399135265
[ Download CSV Export 
View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Similar Match)
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x4fc8cef7fa9f330a29332bdc773ae45eafbbb815

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

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.