Contract 0x939290ed45514e82900ba767bbcfa38ee1067039

 
 
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0xb37109b1f4bc72b27ceb36b7a48f5ff4ec4a0e058e00089c93ee728e59b6b575Exit423457942023-05-05 19:23:1335 days 12 hrs ago0x445ff26635919679bc7adb9866ef1791e2da74f0 IN  0x939290ed45514e82900ba767bbcfa38ee10670390 MATIC0.015947024094 217.386298624
0x28c4e23566758f1d551e89f0b9a2e6b67ebc5e88d2c96afbb9e58d659be2a73bExit410424672023-04-02 3:53:0069 days 4 hrs ago0xd53952189c6f18f1dafa617f11766c5150adc4a4 IN  0x939290ed45514e82900ba767bbcfa38ee10670390 MATIC0.00853369556665.313726522
0xf09af42aa7a6b464c9498ebb5240b3d3f32cdfe33ead79b57ff8e5774f167814Exit407835532023-03-26 8:25:5075 days 23 hrs ago0x2c4bc76245bc787aed5903ad355697dcd8f80d60 IN  0x939290ed45514e82900ba767bbcfa38ee10670390 MATIC0.007122136998 62.718608262
0x6b733b16ae93a70f38f4f4d5117df5743a5b8bd0dc1e71633ff6e0bc7dbf6f4fExit393265962023-02-15 16:28:04114 days 15 hrs ago0x04895114da673f16d83a75e4cd3c64a68e2428c8 IN  0x939290ed45514e82900ba767bbcfa38ee10670390 MATIC0.021026354984 232.443288427
0xff2389f1b77815cc1857e1e2cd8970447c859d4f38163a0c60a5ba8ba5c508b2Get Reward393253822023-02-15 15:43:38114 days 16 hrs ago0x04895114da673f16d83a75e4cd3c64a68e2428c8 IN  0x939290ed45514e82900ba767bbcfa38ee10670390 MATIC0.018726839027 260.322768914
0x862c3d0892f709d2d4c73a888b3fd9bfee16c835b3a9a824c3ba2af456ee40f0Exit389938952023-02-06 22:12:28123 days 9 hrs ago0x8243e5d422512c6fb9beaa7143ed2554d86c6e84 IN  0x939290ed45514e82900ba767bbcfa38ee10670390 MATIC0.011840454508 122.159735353
0xa5e2f756c9d0f4389a4e01e64f58f4b4ebb5bf31d768ceb604627197b3b3ec90Exit386426242023-01-28 23:04:11132 days 8 hrs ago0x371f1f2726ea74664adbbf1c03bd18a7bf2e86b1 IN  0x939290ed45514e82900ba767bbcfa38ee10670390 MATIC0.006076677396 46.508624849
0xf7dd450d3e453c12d70303c92fa562994dace816dd30c3620db9875163417dc2Exit385247752023-01-25 22:13:57135 days 9 hrs ago0x04f004eb2431e8f79fe0c671c807ecb2f5cc71ff IN  0x939290ed45514e82900ba767bbcfa38ee10670390 MATIC0.075260377764 576.014892154
0x59f3d483ed3f45d26674e8c753ea6fcd9620955acd6fa1fdaab2b8cb8dc9242bExit381431842023-01-16 8:02:30145 days ago0xb95f32afce24ae7ce1c9ed730bbafc76f46f902c IN  0x939290ed45514e82900ba767bbcfa38ee10670390 MATIC0.005263941844 46.355062606
0x5a20d611383af46e42f01a7d4ae9dcaae9ffc193228fe784a774c8a44697a79cExit378917872023-01-10 6:41:40151 days 1 hr ago0x30774f6f6c3b83c901afec47bb04c672692be252 IN  0x939290ed45514e82900ba767bbcfa38ee10670390 MATIC0.005614603098 49.443038281
0x58f37993a0ad8ef216a28c7a4d88c19d5cfb0aa82e89587e748f88acd2a834beExit378565502023-01-09 8:45:58151 days 23 hrs ago0x10af3540f463afc715a8c48100cd0eaca325a3b7 IN  0x939290ed45514e82900ba767bbcfa38ee10670390 MATIC0.00459558166550.803485214
0x45a0ef6f8b643059481bb81dc3b70daf2231a65706cc08b7280cced12a5e411cExit378327802023-01-08 18:39:50152 days 13 hrs ago0x2a2e7be6287efe27db0635f618f659fe3f46a515 IN  0x939290ed45514e82900ba767bbcfa38ee10670390 MATIC0.00539741122 41.951943702
0x6507c386f226220caf03fe2fc8e65f0d627ad3cdf97cb9dee7131d5a081b0386Exit376061522023-01-03 3:02:13158 days 5 hrs ago0x17322cb33f9a26b48aedf5d5b47f48d87a727341 IN  0x939290ed45514e82900ba767bbcfa38ee10670390 MATIC0.00410527621 36.151678987
0xe33db82aafa897fb2c5bb53736c35aa94e723dd16a2ba33cc61b862d69d0794fExit373130572022-12-26 20:54:46165 days 11 hrs ago0x6f3ee789bda5753202031cfbea689cc513483e11 IN  0x939290ed45514e82900ba767bbcfa38ee10670390 MATIC0.0042007071336.992058003
0x29ec7c922ebf6fbd0b3ebb122d605b3a9b73040f885c527957c0246324175f48Exit369736182022-12-18 9:24:32173 days 22 hrs ago0x400454326d1bfd73f97a93a63e5faaec0af284cc IN  0x939290ed45514e82900ba767bbcfa38ee10670390 MATIC0.012783890473 97.843134874
0x240a32edaf0916f3d2f039e393bcb4c895e1015212dec9d045e62236065f0262Exit358877942022-11-21 14:32:27200 days 17 hrs ago0xa98091baaf2c743fa92e4efa6f526489c49c8cc6 IN  0x939290ed45514e82900ba767bbcfa38ee10670390 MATIC0.007910528017 60.544234277
0x0b73ad0df773b3442ef7c427350708460725055255ae98c59b197c353f3826eeExit357626552022-11-18 13:39:06203 days 18 hrs ago0x7532165dd65151786f758cb35c64572d5a0e627b IN  0x939290ed45514e82900ba767bbcfa38ee10670390 MATIC0.004593674219 40.452585218
0xd5fe65a245bc29d1da1f8b5f6e125faec5b15befcf57d8440db1d1a4ff1739d9Exit356081542022-11-14 19:30:01207 days 12 hrs ago0xef04b05d68cc6852c09ac810b244925ea4961a05 IN  0x939290ed45514e82900ba767bbcfa38ee10670390 MATIC0.003437172647 30.268258646
0x42dcf6ff05e521d2f13679906470931cef1e75425d4f715fbf456d3e7b9d0b4aExit354759072022-11-11 11:22:09210 days 20 hrs ago0xc033302a732712361999a42cbd41d997845c29cd IN  0x939290ed45514e82900ba767bbcfa38ee10670390 MATIC0.005751457935 50.648202537
0x96d03efcd6d6125f9c9890a31f1f9749378801914cb00028a9d7b1dd6ece8271Exit352152452022-11-05 3:10:48217 days 4 hrs ago0xb63680891278b189f7e75c323a8b541855dc8fc5 IN  0x939290ed45514e82900ba767bbcfa38ee10670390 MATIC0.010171230701 89.569385432
0xe3e56ab1a7270a4c240e1cd41db63de49e33161e51ba48ad3c0c6bcce09fd21cExit350803682022-11-01 20:03:53220 days 11 hrs ago0x1ce56d90472429f7b2f4e09ed29a63eef1d60da2 IN  0x939290ed45514e82900ba767bbcfa38ee10670390 MATIC0.004413071645 33.776006225
0xc4363b99990ab1872206cbdc244b87f575e9caaea90e54f03ccb420f18e65a5bExit350607502022-11-01 8:45:37220 days 23 hrs ago0x52a17ce71256c515ebe6b5a68a2a1bc226e7350f IN  0x939290ed45514e82900ba767bbcfa38ee10670390 MATIC0.004830700557 53.402690283
0x0e282b9b2800a7a80eeb79c1559e5583a8ceb334e4254ec39bd7181c31335d62Get Reward350606982022-11-01 8:43:49220 days 23 hrs ago0x52a17ce71256c515ebe6b5a68a2a1bc226e7350f IN  0x939290ed45514e82900ba767bbcfa38ee10670390 MATIC0.004317285503 49.555049918
0x32bd7466414381611ea3b82384b12917de819f160f98f391104d118875469e7dGet Reward349862422022-10-30 12:22:38222 days 19 hrs ago0xc97422ad6e2007eb56b1342c2df6a6876b520ab8 IN  0x939290ed45514e82900ba767bbcfa38ee10670390 MATIC0.004417351248 61.405830771
0x1da6bbbaee0f93c6fd85ecc48c509661ab7ca49470838ce3d98e8d69770b0413Get Reward348978312022-10-28 8:57:25224 days 23 hrs ago0x7ed85bc62091029a99744448816b973e1e49064c IN  0x939290ed45514e82900ba767bbcfa38ee10670390 MATIC0.005104311785 58.58876488
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x07a4ea4912e4fbdfb426256c93185366cec0f54ffe6933630e6dd4ba807d327b199118452021-10-06 15:43:34611 days 16 hrs ago 0x8aaa5e259f74c8114e0a471d9f2adfc66bfe09ed  Contract Creation0 MATIC
[ Download CSV Export 
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xbB703E95348424FF9e94fbE4FB524f6d280331B8

Contract Name:
StakingRewards

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-10-07
*/

/**
 *Submitted for verification at polygonscan.com on 2021-10-06
*/

/**
 *Submitted for verification at polygonscan.com on 2021-06-30
*/

/**
 *Submitted for verification at Etherscan.io on 2020-09-16
*/

pragma solidity ^0.5.16;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see `ERC20Detailed`.
 */
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.
     *
     * > 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);
}

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

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

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

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

/**
 * @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, 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");
        uint256 c = a - b;

        return c;
    }

    /**
     * @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) {
        // 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-solidity/pull/522
        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. Reverts 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) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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 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);
    }
}

/**
 * @dev Optional functions from the ERC20 standard.
 */
contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of
     * these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol, uint8 decimals) public {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei.
     *
     * > Note that this information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * `IERC20.balanceOf` and `IERC20.transfer`.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }
}

/**
 * @dev Collection of functions related to the address type,
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * This test is non-exhaustive, and there may be false-negatives: during the
     * execution of a contract's constructor, its address will be reported as
     * not containing a contract.
     *
     * > It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in 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;
    }
}

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

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the `nonReentrant` modifier
 * available, which can be aplied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 */
contract ReentrancyGuard {
    /// @dev counter to allow mutex lock with only one SSTORE operation
    uint256 private _guardCounter;

    constructor () internal {
        // 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");
    }
}

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

    function rewardPerToken() external view returns (uint256);

    function earned(address account) 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;
}

contract RewardsDistributionRecipient {
    address public rewardsDistribution;

    function notifyRewardAmount(uint256 reward, uint256 duration) external;

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

contract StakingRewards 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 lastUpdateTime;
    uint256 public rewardPerTokenStored;

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

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

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

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

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

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

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

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

    function rewardPerToken() public view 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 returns (uint256) {
        return _balances[account].mul(rewardPerToken().sub(userRewardPerTokenPaid[account])).div(1e18).add(rewards[account]);
    }

    /* ========== 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 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 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 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 {
        withdraw(_balances[msg.sender]);
        getReward();
    }

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

    function notifyRewardAmount(uint256 reward, uint256 rewardsDuration) external onlyRewardsDistribution updateReward(address(0)) {
        require(block.timestamp.add(rewardsDuration) >= periodFinish, "Cannot reduce existing period");
        
        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, periodFinish);
    }

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

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

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

    event RewardAdded(uint256 reward, uint256 periodFinish);
    event Staked(address indexed user, uint256 amount);
    event Withdrawn(address indexed user, uint256 amount);
    event RewardPaid(address indexed user, uint256 reward);
}
interface IUniswapV2ERC20 {
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
}

contract StakingRewardsFactory is Ownable {
    // immutables
    address public rewardsToken;
    uint public stakingRewardsGenesis;

    // the staking tokens for which the rewards contract has been deployed
    address[] public stakingTokens;

    // info about rewards for a particular staking token
    struct StakingRewardsInfo {
        address stakingRewards;
        uint rewardAmount;
        uint duration;
    }

    // rewards info by staking token
    mapping(address => StakingRewardsInfo) public stakingRewardsInfoByStakingToken;

    constructor(
        address _rewardsToken,
        uint _stakingRewardsGenesis
    ) Ownable() public {
        require(_stakingRewardsGenesis >= block.timestamp, 'StakingRewardsFactory::constructor: genesis too soon');

        rewardsToken = _rewardsToken;
        stakingRewardsGenesis = _stakingRewardsGenesis;
    }

    ///// permissioned functions

    // deploy a staking reward contract for the staking token, and store the reward amount
    // the reward will be distributed to the staking reward contract no sooner than the genesis
    function deploy(address stakingToken, uint rewardAmount, uint256 rewardsDuration) public onlyOwner {
        StakingRewardsInfo storage info = stakingRewardsInfoByStakingToken[stakingToken];
        require(info.stakingRewards == address(0), 'StakingRewardsFactory::deploy: already deployed');

        info.stakingRewards = address(new StakingRewards(/*_rewardsDistribution=*/ address(this), rewardsToken, stakingToken));
        info.rewardAmount = rewardAmount;
        info.duration = rewardsDuration;
        stakingTokens.push(stakingToken);
    }

    function update(address stakingToken, uint rewardAmount, uint256 rewardsDuration) public onlyOwner {
        StakingRewardsInfo storage info = stakingRewardsInfoByStakingToken[stakingToken];
        require(info.stakingRewards != address(0), 'StakingRewardsFactory::update: not deployed');

        info.rewardAmount = rewardAmount;
        info.duration = rewardsDuration;
    }



    ///// permissionless functions

    // call notifyRewardAmount for all staking tokens.
    function notifyRewardAmounts() public {
        require(stakingTokens.length > 0, 'StakingRewardsFactory::notifyRewardAmounts: called before any deploys');
        for (uint i = 0; i < stakingTokens.length; i++) {
            notifyRewardAmount(stakingTokens[i]);
        }
    }

    // notify reward amount for an individual staking token.
    // this is a fallback in case the notifyRewardAmounts costs too much gas to call for all contracts
    function notifyRewardAmount(address stakingToken) public {
        require(block.timestamp >= stakingRewardsGenesis, 'StakingRewardsFactory::notifyRewardAmount: not ready');

        StakingRewardsInfo storage info = stakingRewardsInfoByStakingToken[stakingToken];
        require(info.stakingRewards != address(0), 'StakingRewardsFactory::notifyRewardAmount: not deployed');

        if (info.rewardAmount > 0 && info.duration > 0) {
            uint rewardAmount = info.rewardAmount;
            uint256 duration = info.duration;
            info.rewardAmount = 0;
            info.duration = 0;

            require(
                IERC20(rewardsToken).transfer(info.stakingRewards, rewardAmount),
                'StakingRewardsFactory::notifyRewardAmount: transfer failed'
            );
            StakingRewards(info.stakingRewards).notifyRewardAmount(rewardAmount, duration);
        }
    }

    function pullExtraTokens(address token, uint256 amount) external onlyOwner {
        IERC20(token).transfer(msg.sender, amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_rewardsDistribution","type":"address"},{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_stakingToken","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"periodFinish","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"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"exit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"getReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"rewardsDuration","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardsDistribution","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040526000600455600060055534801561001a57600080fd5b506040516113223803806113228339818101604052606081101561003d57600080fd5b508051602082015160409092015160018055600280546001600160a01b039485166001600160a01b0319918216179091556003805492851692821692909217909155600080549390921692169190911790556112848061009e6000396000f3fe608060405234801561001057600080fd5b506004361061012b5760003560e01c806380faa57d116100ad578063d1af0c7d11610071578063d1af0c7d14610295578063df136d651461029d578063e9fad8ee146102a5578063ebe2b12b146102ad578063ecd9ba82146102b55761012b565b806380faa57d1461023a5780638b87634714610242578063a694fc3a14610268578063c8f33c9114610285578063cd3daf9d1461028d5761012b565b80633d18b912116100f45780633d18b912146101d85780633fc6df6e146101e057806370a082311461020457806372f702f31461022a5780637b0a47ee146102325761012b565b80628cc262146101305780630700037d1461016857806318160ddd1461018e578063246132f9146101965780632e1a7d4d146101bb575b600080fd5b6101566004803603602081101561014657600080fd5b50356001600160a01b03166102ed565b60408051918252519081900360200190f35b6101566004803603602081101561017e57600080fd5b50356001600160a01b0316610383565b610156610395565b6101b9600480360360408110156101ac57600080fd5b508035906020013561039c565b005b6101b9600480360360208110156101d157600080fd5b503561064e565b6101b96107dd565b6101e8610901565b604080516001600160a01b039092168252519081900360200190f35b6101566004803603602081101561021a57600080fd5b50356001600160a01b0316610910565b6101e861092b565b61015661093a565b610156610940565b6101566004803603602081101561025857600080fd5b50356001600160a01b0316610953565b6101b96004803603602081101561027e57600080fd5b5035610965565b610156610aee565b610156610af4565b6101e8610b4e565b610156610b5d565b6101b9610b63565b610156610b86565b6101b9600480360360a08110156102cb57600080fd5b5080359060208101359060ff6040820135169060608101359060800135610b8c565b6001600160a01b038116600090815260096020908152604080832054600890925282205461037d919061037190670de0b6b3a7640000906103659061034090610334610af4565b9063ffffffff610dae16565b6001600160a01b0388166000908152600b60205260409020549063ffffffff610e0b16565b9063ffffffff610e6b16565b9063ffffffff610ed516565b92915050565b60096020526000908152604090205481565b600a545b90565b6000546001600160a01b031633146103e55760405162461bcd60e51b815260040180806020018281038252602a8152602001806111fc602a913960400191505060405180910390fd5b60006103ef610af4565b6007556103fa610940565b6006556001600160a01b0381161561044157610415816102ed565b6001600160a01b0382166000908152600960209081526040808320939093556007546008909152919020555b600454610454428463ffffffff610ed516565b10156104a7576040805162461bcd60e51b815260206004820152601d60248201527f43616e6e6f7420726564756365206578697374696e6720706572696f64000000604482015290519081900360640190fd5b60045442106104c8576104c0838363ffffffff610e6b16565b600555610513565b6004546000906104de904263ffffffff610dae16565b905060006104f760055483610e0b90919063ffffffff16565b905061050d84610365878463ffffffff610ed516565b60055550505b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561055e57600080fd5b505afa158015610572573d6000803e3d6000fd5b505050506040513d602081101561058857600080fd5b5051905061059c818463ffffffff610e6b16565b60055411156105f2576040805162461bcd60e51b815260206004820152601860248201527f50726f76696465642072657761726420746f6f20686967680000000000000000604482015290519081900360640190fd5b426006819055610608908463ffffffff610ed516565b600481905560408051868152602081019290925280517f6c07ee05dcf262f13abf9d87b846ee789d2f90fe991d495acd7d7fc109ee1f559281900390910190a150505050565b6001805481019081905533610661610af4565b60075561066c610940565b6006556001600160a01b038116156106b357610687816102ed565b6001600160a01b0382166000908152600960209081526040808320939093556007546008909152919020555b600083116106fc576040805162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015290519081900360640190fd5b600a5461070f908463ffffffff610dae16565b600a55336000908152600b6020526040902054610732908463ffffffff610dae16565b336000818152600b602052604090209190915560035461075e916001600160a01b039091169085610f2f565b60408051848152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a25060015481146107d9576040805162461bcd60e51b815260206004820152601f60248201526000805160206111bb833981519152604482015290519081900360640190fd5b5050565b60018054810190819055336107f0610af4565b6007556107fb610940565b6006556001600160a01b0381161561084257610816816102ed565b6001600160a01b0382166000908152600960209081526040808320939093556007546008909152919020555b3360009081526009602052604090205480156108b85733600081815260096020526040812055600254610881916001600160a01b039091169083610f2f565b60408051828152905133917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b505060015481146108fe576040805162461bcd60e51b815260206004820152601f60248201526000805160206111bb833981519152604482015290519081900360640190fd5b50565b6000546001600160a01b031681565b6001600160a01b03166000908152600b602052604090205490565b6003546001600160a01b031681565b60055481565b600061094e42600454610f86565b905090565b60086020526000908152604090205481565b6001805481019081905533610978610af4565b600755610983610940565b6006556001600160a01b038116156109ca5761099e816102ed565b6001600160a01b0382166000908152600960209081526040808320939093556007546008909152919020555b60008311610a10576040805162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015290519081900360640190fd5b600a54610a23908463ffffffff610ed516565b600a55336000908152600b6020526040902054610a46908463ffffffff610ed516565b336000818152600b6020526040902091909155600354610a73916001600160a01b03909116903086610f9c565b60408051848152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a25060015481146107d9576040805162461bcd60e51b815260206004820152601f60248201526000805160206111bb833981519152604482015290519081900360640190fd5b60065481565b6000600a5460001415610b0a5750600754610399565b61094e610b3f600a54610365670de0b6b3a7640000610b33600554610b33600654610334610940565b9063ffffffff610e0b16565b6007549063ffffffff610ed516565b6002546001600160a01b031681565b60075481565b336000908152600b6020526040902054610b7c9061064e565b610b846107dd565b565b60045481565b6001805481019081905533610b9f610af4565b600755610baa610940565b6006556001600160a01b03811615610bf157610bc5816102ed565b6001600160a01b0382166000908152600960209081526040808320939093556007546008909152919020555b60008711610c37576040805162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015290519081900360640190fd5b600a54610c4a908863ffffffff610ed516565b600a55336000908152600b6020526040902054610c6d908863ffffffff610ed516565b336000818152600b602052604080822093909355600354835163d505accf60e01b81526004810193909352306024840152604483018b9052606483018a905260ff8916608484015260a4830188905260c4830187905292516001600160a01b039093169263d505accf9260e480820193929182900301818387803b158015610cf457600080fd5b505af1158015610d08573d6000803e3d6000fd5b5050600354610d2b92506001600160a01b0316905033308a63ffffffff610f9c16565b60408051888152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a2506001548114610da6576040805162461bcd60e51b815260206004820152601f60248201526000805160206111bb833981519152604482015290519081900360640190fd5b505050505050565b600082821115610e05576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082610e1a5750600061037d565b82820282848281610e2757fe5b0414610e645760405162461bcd60e51b81526004018080602001828103825260218152602001806111db6021913960400191505060405180910390fd5b9392505050565b6000808211610ec1576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b6000828481610ecc57fe5b04949350505050565b600082820183811015610e64576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610f81908490610ffc565b505050565b6000818310610f955781610e64565b5090919050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610ff6908590610ffc565b50505050565b61100e826001600160a01b03166111b4565b61105f576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b6020831061109d5780518252601f19909201916020918201910161107e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146110ff576040519150601f19603f3d011682016040523d82523d6000602084013e611104565b606091505b50915091508161115b576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115610ff65780806020019051602081101561117757600080fd5b5051610ff65760405162461bcd60e51b815260040180806020018281038252602a815260200180611226602a913960400191505060405180910390fd5b3b15159056fe5265656e7472616e637947756172643a207265656e7472616e742063616c6c00536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7743616c6c6572206973206e6f742052657761726473446973747269627574696f6e20636f6e74726163745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a72315820897be89e7660172356b0488be48b5d67058a5380c1451f8e2232f67003536bf164736f6c634300051100320000000000000000000000008aaa5e259f74c8114e0a471d9f2adfc66bfe09ed000000000000000000000000f28164a485b0b2c90639e47b0f377b4a438a16b1000000000000000000000000853ee4b2a13f8a742d64c8f088be7ba2131f670d

Deployed ByteCode Sourcemap

18398:5669:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18398:5669:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20116:198;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20116:198:0;-1:-1:-1;;;;;20116:198:0;;:::i;:::-;;;;;;;;;;;;;;;;18898:42;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18898:42:0;-1:-1:-1;;;;;18898:42:0;;:::i;19418:93::-;;;:::i;22160:1237::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22160:1237:0;;;;;;;:::i;:::-;;21319:357;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21319:357:0;;:::i;21684:307::-;;;:::i;18115:34::-;;;:::i;:::-;;;;-1:-1:-1;;;;;18115:34:0;;;;;;;;;;;;;;19519:112;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19519:112:0;-1:-1:-1;;;;;19519:112:0;;:::i;18647:26::-;;;:::i;18718:29::-;;;:::i;19639:131::-;;;:::i;18834:57::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18834:57:0;-1:-1:-1;;;;;18834:57:0;;:::i;20942:369::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20942:369:0;;:::i;18754:29::-;;;:::i;19778:330::-;;;:::i;18614:26::-;;;:::i;18790:35::-;;;:::i;21999:97::-;;;:::i;18680:31::-;;;:::i;20376:558::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;20376:558:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;20116:198::-;-1:-1:-1;;;;;20289:16:0;;20170:7;20289:16;;;:7;:16;;;;;;;;;20241:22;:31;;;;;;20197:109;;20289:16;20197:87;;20279:4;;20197:77;;20220:53;;:16;:14;:16::i;:::-;:20;:53;:20;:53;:::i;:::-;-1:-1:-1;;;;;20197:18:0;;;;;;:9;:18;;;;;;;:22;:77::i;:::-;:81;:87;:81;:87;:::i;:::-;:91;:109;:91;:109;:::i;:::-;20190:116;20116:198;-1:-1:-1;;20116:198:0:o;18898:42::-;;;;;;;;;;;;;:::o;19418:93::-;19491:12;;19418:93;;:::o;22160:1237::-;18305:19;;-1:-1:-1;;;;;18305:19:0;18291:10;:33;18283:88;;;;-1:-1:-1;;;18283:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22283:1;23523:16;:14;:16::i;:::-;23500:20;:39;23567:26;:24;:26::i;:::-;23550:14;:43;-1:-1:-1;;;;;23608:21:0;;;23604:157;;23665:15;23672:7;23665:6;:15::i;:::-;-1:-1:-1;;;;;23646:16:0;;;;;;:7;:16;;;;;;;;:34;;;;23729:20;;23695:22;:31;;;;;;:54;23604:157;22346:12;;22306:36;:15;22326;22306:36;:19;:36;:::i;:::-;:52;;22298:94;;;;;-1:-1:-1;;;22298:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22436:12;;22417:15;:31;22413:318;;22478:27;:6;22489:15;22478:27;:10;:27;:::i;:::-;22465:10;:40;22413:318;;;22558:12;;22538:17;;22558:33;;22575:15;22558:33;:16;:33;:::i;:::-;22538:53;;22606:16;22625:25;22639:10;;22625:9;:13;;:25;;;;:::i;:::-;22606:44;-1:-1:-1;22678:41:0;22703:15;22678:20;:6;22606:44;22678:20;:10;:20;:::i;:41::-;22665:10;:54;-1:-1:-1;;22413:318:0;23106:12;;:37;;;-1:-1:-1;;;23106:37:0;;23137:4;23106:37;;;;;;-1:-1:-1;;;;;;;23106:12:0;;-1:-1:-1;;23106:37:0;;;;;;;;;;;;;;:12;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;23106:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23106:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23106:37:0;;-1:-1:-1;23176:28:0;23106:37;23188:15;23176:28;:11;:28;:::i;:::-;23162:10;;:42;;23154:79;;;;;-1:-1:-1;;;23154:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23263:15;23246:14;:32;;;23304:36;;23324:15;23304:36;:19;:36;:::i;:::-;23289:12;:51;;;23356:33;;;;;;;;;;;;;;;;;;;;;;;;;23771:1;18382;22160:1237;;:::o;21319:357::-;17306:1;17289:18;;;;;;;;21386:10;23523:16;:14;:16::i;:::-;23500:20;:39;23567:26;:24;:26::i;:::-;23550:14;:43;-1:-1:-1;;;;;23608:21:0;;;23604:157;;23665:15;23672:7;23665:6;:15::i;:::-;-1:-1:-1;;;;;23646:16:0;;;;;;:7;:16;;;;;;;;:34;;;;23729:20;;23695:22;:31;;;;;;:54;23604:157;21426:1;21417:6;:10;21409:40;;;;;-1:-1:-1;;;21409:40:0;;;;;;;;;;;;-1:-1:-1;;;21409:40:0;;;;;;;;;;;;;;;21475:12;;:24;;21492:6;21475:24;:16;:24;:::i;:::-;21460:12;:39;21544:10;21534:21;;;;:9;:21;;;;;;:33;;21560:6;21534:33;:25;:33;:::i;:::-;21520:10;21510:21;;;;:9;:21;;;;;:57;;;;21578:12;;:45;;-1:-1:-1;;;;;21578:12:0;;;;21616:6;21578:25;:45::i;:::-;21639:29;;;;;;;;21649:10;;21639:29;;;;;;;;;;17365:1;17401:13;;17385:12;:29;17377:73;;;;;-1:-1:-1;;;17377:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17377:73:0;;;;;;;;;;;;;;;21319:357;;:::o;21684:307::-;17306:1;17289:18;;;;;;;;21738:10;23523:16;:14;:16::i;:::-;23500:20;:39;23567:26;:24;:26::i;:::-;23550:14;:43;-1:-1:-1;;;;;23608:21:0;;;23604:157;;23665:15;23672:7;23665:6;:15::i;:::-;-1:-1:-1;;;;;23646:16:0;;;;;;:7;:16;;;;;;;;:34;;;;23729:20;;23695:22;:31;;;;;;:54;23604:157;21786:10;21761:14;21778:19;;;:7;:19;;;;;;21812:10;;21808:176;;21847:10;21861:1;21839:19;;;:7;:19;;;;;:23;21877:12;;:45;;-1:-1:-1;;;;;21877:12:0;;;;21915:6;21877:25;:45::i;:::-;21942:30;;;;;;;;21953:10;;21942:30;;;;;;;;;;21808:176;23771:1;17365;17401:13;;17385:12;:29;17377:73;;;;;-1:-1:-1;;;17377:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17377:73:0;;;;;;;;;;;;;;;21684:307;:::o;18115:34::-;;;-1:-1:-1;;;;;18115:34:0;;:::o;19519:112::-;-1:-1:-1;;;;;19605:18:0;19578:7;19605:18;;;:9;:18;;;;;;;19519:112::o;18647:26::-;;;-1:-1:-1;;;;;18647:26:0;;:::o;18718:29::-;;;;:::o;19639:131::-;19696:7;19723:39;19732:15;19749:12;;19723:8;:39::i;:::-;19716:46;;19639:131;:::o;18834:57::-;;;;;;;;;;;;;:::o;20942:369::-;17306:1;17289:18;;;;;;;;21008:10;23523:16;:14;:16::i;:::-;23500:20;:39;23567:26;:24;:26::i;:::-;23550:14;:43;-1:-1:-1;;;;;23608:21:0;;;23604:157;;23665:15;23672:7;23665:6;:15::i;:::-;-1:-1:-1;;;;;23646:16:0;;;;;;:7;:16;;;;;;;;:34;;;;23729:20;;23695:22;:31;;;;;;:54;23604:157;21048:1;21039:6;:10;21031:37;;;;;-1:-1:-1;;;21031:37:0;;;;;;;;;;;;-1:-1:-1;;;21031:37:0;;;;;;;;;;;;;;;21094:12;;:24;;21111:6;21094:24;:16;:24;:::i;:::-;21079:12;:39;21163:10;21153:21;;;;:9;:21;;;;;;:33;;21179:6;21153:33;:25;:33;:::i;:::-;21139:10;21129:21;;;;:9;:21;;;;;:57;;;;21197:12;;:64;;-1:-1:-1;;;;;21197:12:0;;;;21247:4;21254:6;21197:29;:64::i;:::-;21277:26;;;;;;;;21284:10;;21277:26;;;;;;;;;;17365:1;17401:13;;17385:12;:29;17377:73;;;;;-1:-1:-1;;;17377:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17377:73:0;;;;;;;;;;;;;;18754:29;;;;:::o;19778:330::-;19825:7;19849:12;;19865:1;19849:17;19845:77;;;-1:-1:-1;19890:20:0;;19883:27;;19845:77;19952:148;19995:90;20072:12;;19995:72;20062:4;19995:62;20046:10;;19995:46;20026:14;;19995:26;:24;:26::i;:46::-;:50;:62;:50;:62;:::i;:90::-;19952:20;;;:148;:24;:148;:::i;18614:26::-;;;-1:-1:-1;;;;;18614:26:0;;:::o;18790:35::-;;;;:::o;21999:97::-;22054:10;22044:21;;;;:9;:21;;;;;;22035:31;;:8;:31::i;:::-;22077:11;:9;:11::i;:::-;21999:97::o;18680:31::-;;;;:::o;20376:558::-;17306:1;17289:18;;;;;;;;20498:10;23523:16;:14;:16::i;:::-;23500:20;:39;23567:26;:24;:26::i;:::-;23550:14;:43;-1:-1:-1;;;;;23608:21:0;;;23604:157;;23665:15;23672:7;23665:6;:15::i;:::-;-1:-1:-1;;;;;23646:16:0;;;;;;:7;:16;;;;;;;;:34;;;;23729:20;;23695:22;:31;;;;;;:54;23604:157;20538:1;20529:6;:10;20521:37;;;;;-1:-1:-1;;;20521:37:0;;;;;;;;;;;;-1:-1:-1;;;20521:37:0;;;;;;;;;;;;;;;20584:12;;:24;;20601:6;20584:24;:16;:24;:::i;:::-;20569:12;:39;20653:10;20643:21;;;;:9;:21;;;;;;:33;;20669:6;20643:33;:25;:33;:::i;:::-;20629:10;20619:21;;;;:9;:21;;;;;;:57;;;;20732:12;;20708:99;;-1:-1:-1;;;20708:99:0;;;;;;;;;20774:4;20708:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20732:12:0;;;;-1:-1:-1;;20708:99:0;;;;;20619:21;20708:99;;;;;;20619:21;20732:12;20708:99;;;5:2:-1;;;;30:1;27;20:12;5:2;20708:99:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;20820:12:0;;:64;;-1:-1:-1;;;;;;20820:12:0;;-1:-1:-1;20850:10:0;20870:4;20877:6;20820:29;:64::i;:::-;20900:26;;;;;;;;20907:10;;20900:26;;;;;;;;;;17365:1;17401:13;;17385:12;:29;17377:73;;;;;-1:-1:-1;;;17377:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17377:73:0;;;;;;;;;;;;;;;20376:558;;;;;;:::o;6691:184::-;6749:7;6782:1;6777;:6;;6769:49;;;;;-1:-1:-1;;;6769:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6841:5:0;;;6691:184::o;7126:470::-;7184:7;7428:6;7424:47;;-1:-1:-1;7458:1:0;7451:8;;7424:47;7495:5;;;7499:1;7495;:5;:1;7519:5;;;;;:10;7511:56;;;;-1:-1:-1;;;7511:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7587:1;7126:470;-1:-1:-1;;;7126:470:0:o;8064:333::-;8122:7;8221:1;8217;:5;8209:44;;;;;-1:-1:-1;;;8209:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8264:9;8280:1;8276;:5;;;;;;;8064:333;-1:-1:-1;;;;8064:333:0:o;6235:181::-;6293:7;6325:5;;;6349:6;;;;6341:46;;;;;-1:-1:-1;;;6341:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;12868:176;12977:58;;;-1:-1:-1;;;;;12977:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;12977:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;12951:85:0;;12970:5;;12951:18;:85::i;:::-;12868:176;;;:::o;9360:106::-;9418:7;9449:1;9445;:5;:13;;9457:1;9445:13;;;-1:-1:-1;9453:1:0;;9438:20;-1:-1:-1;9360:106:0:o;13052:204::-;13179:68;;;-1:-1:-1;;;;;13179:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;13179:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;13153:95:0;;13172:5;;13153:18;:95::i;:::-;13052:204;;;;:::o;14862:1114::-;15466:27;-1:-1:-1;;;;;15466:25:0;;;:27::i;:::-;15458:71;;;;;-1:-1:-1;;;15458:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15603:12;15617:23;15652:5;-1:-1:-1;;;;;15644:19:0;15664:4;15644:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;15644:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;15602:67:0;;;;15688:7;15680:52;;;;;-1:-1:-1;;;15680:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15749:17;;:21;15745:224;;15891:10;15880:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15880:30:0;15872:85;;;;-1:-1:-1;;;15872:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11881:422;12248:20;12287:8;;;11881:422::o

Swarm Source

bzzr://897be89e7660172356b0488be48b5d67058a5380c1451f8e2232f67003536bf1
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
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.