Contract 0x7E53eCAaeeCb5d4c0A1F33884aeb6E1Bd25E6fdf

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x76c3c1eb1bb061c5fc2e95c36700e60255e02aba5b4c04e840d469dc7e61484dExit149613402021-05-26 18:56:23185 days 4 hrs ago0x0e9a4909cc68be49d7c3ec5cee60156725822d2a IN  0x7e53ecaaeecb5d4c0a1f33884aeb6e1bd25e6fdf0 MATIC0.00085951
0xa5d374db9f4b9bf6f46f0c2755838958cd9e055149de9a34da23c0c4aceedccdExit149613002021-05-26 18:55:03185 days 4 hrs ago0x49f7e0d0b57fa473a0b8f50ddeab03a103e6dbda IN  0x7e53ecaaeecb5d4c0a1f33884aeb6e1bd25e6fdf0 MATIC0.00084241
0xed1547f0ad8755ea2ee5d222b5e09ffa3fc9bb8d82ba5b25e77db71bbff87015Exit149613002021-05-26 18:55:03185 days 4 hrs ago0x110c64c7a91c90b28706625563aae66136336ea5 IN  0x7e53ecaaeecb5d4c0a1f33884aeb6e1bd25e6fdf0 MATIC0.00085951
0xae4d165759237895070dbe2d6dddc4e8a41405452e81f38fe4968709c3dbbc92Exit149612522021-05-26 18:53:23185 days 4 hrs ago0x308f09c7fadb9effe9ec9fe3dc970861f4bd1853 IN  0x7e53ecaaeecb5d4c0a1f33884aeb6e1bd25e6fdf0 MATIC0.000250535
0x6bd06873615b18d7e50f557109d47ef6facb29452cb8ff7f2643c4235f0e9449Exit149612512021-05-26 18:53:21185 days 4 hrs ago0x308f09c7fadb9effe9ec9fe3dc970861f4bd1853 IN  0x7e53ecaaeecb5d4c0a1f33884aeb6e1bd25e6fdf0 MATIC0.00085951
0x78f3fd1d39d434212563a204432b84484486386a1370d67b784cc7bc965eb854Exit149612372021-05-26 18:52:53185 days 4 hrs ago0x0aaefc027b1a1242d977e5a05d3837178f6f0b2c IN  0x7e53ecaaeecb5d4c0a1f33884aeb6e1bd25e6fdf0 MATIC0.00085951
0x26319c2b0e810fb8bace37100a4b280d15f10da7ffa38b01141e322dff931836Exit149612282021-05-26 18:52:35185 days 4 hrs ago0xd94410c1cb7cf919e748389de83e084c4f4da0a8 IN  0x7e53ecaaeecb5d4c0a1f33884aeb6e1bd25e6fdf0 MATIC0.00085951
0x2a1856da184230e9eebdcca3ceee908537e72915ad76b9a9d78b8671cce37cbcExit149612232021-05-26 18:52:25185 days 4 hrs ago0x43a9f886d5848352e3616fa6dc647f00b4bdcf54 IN  0x7e53ecaaeecb5d4c0a1f33884aeb6e1bd25e6fdf0 MATIC0.000250535
0x04f7236f32c93732f22356074ddfcfda8012fa06b6b2ffe774f3c55d889efde0Exit149612142021-05-26 18:52:03185 days 4 hrs ago0x43a9f886d5848352e3616fa6dc647f00b4bdcf54 IN  0x7e53ecaaeecb5d4c0a1f33884aeb6e1bd25e6fdf0 MATIC0.00085951
0x1d58cf858357982cc7a669bc16b0f8dfb2104a5bfbfdb61208e6ec63d6612365Exit149611692021-05-26 18:50:33185 days 4 hrs ago0xc6f14f33d407286b54a8ba02c5396af5bda31ee5 IN  0x7e53ecaaeecb5d4c0a1f33884aeb6e1bd25e6fdf0 MATIC0.00085951
0xa45ecdf393240a66f225a9efb25bf721a71de1e1572b2828fd0a2d295d6797b3Exit149611492021-05-26 18:49:49185 days 4 hrs ago0x3b509d86996df2484836827debed3680dda443c8 IN  0x7e53ecaaeecb5d4c0a1f33884aeb6e1bd25e6fdf0 MATIC0.00085951
0xdfa8fc435c00ede4cee6ec9218ca3243baf21fde1892f46b0413747ad2c5c437Exit149611402021-05-26 18:49:31185 days 4 hrs ago0xe7787ac2a9d7817cc60799c4d64f01bfd4edcaba IN  0x7e53ecaaeecb5d4c0a1f33884aeb6e1bd25e6fdf0 MATIC0.00085951
0x1a13bc8cfadc19bec18ce646adb429bfd4153ecebc7c86c7d7e32f4962086f48Exit149611172021-05-26 18:48:45185 days 4 hrs ago0xd8f316928e04d47674af9066c4b05fad33a74ad7 IN  0x7e53ecaaeecb5d4c0a1f33884aeb6e1bd25e6fdf0 MATIC0.00084241
0xfd11d0937568eec6b09fe767a449de0855c6ab3dcf6680516281cb32f50742f3Exit149610912021-05-26 18:47:53185 days 4 hrs ago0xcbe028322304544ed2a2e4f4667b680f28f46d62 IN  0x7e53ecaaeecb5d4c0a1f33884aeb6e1bd25e6fdf0 MATIC0.00085951
0xcc22daf771220159007fe7512d8ad176974b84561c8504a931b079ed30597618Exit149610872021-05-26 18:47:35185 days 4 hrs ago0xb30222f3be4b495ec4a503c8dca0892741f29da3 IN  0x7e53ecaaeecb5d4c0a1f33884aeb6e1bd25e6fdf0 MATIC0.00085951
0x8fc8b5d1ad1aa784215508e2725dd9d7acaec40281411406d786b5ca251e110bExit147557212021-05-21 10:04:24190 days 13 hrs ago0x1f65c21b735efd5a38720f5f0e11d65c1e704ce4 IN  0x7e53ecaaeecb5d4c0a1f33884aeb6e1bd25e6fdf0 MATIC0.00070561
0xc83f2aa3787fa6b975b7b8eccf5907300312e6bbd2deadd6d1789f6ce1f55a95Exit145618282021-05-16 11:08:33195 days 12 hrs ago0x302809f7d6cd34d737df352c798e24699d2048be IN  0x7e53ecaaeecb5d4c0a1f33884aeb6e1bd25e6fdf0 MATIC0.00129811
0x40a4e40f89c2b38db13b0d1b9a6ff9c70d1937f7fff9556d501c3959a8b0a622Exit145388412021-05-15 21:33:39196 days 2 hrs ago0x90ef65e04dfa51e14b16206d79782c978a2cc033 IN  0x7e53ecaaeecb5d4c0a1f33884aeb6e1bd25e6fdf0 MATIC0.000826025
0xead7cfd8c74cc016f13c9ec3444d9b99db79be2adcd229c9e9089d5316c8b873Get Reward145388362021-05-15 21:33:29196 days 2 hrs ago0x90ef65e04dfa51e14b16206d79782c978a2cc033 IN  0x7e53ecaaeecb5d4c0a1f33884aeb6e1bd25e6fdf0 MATIC0.000751995
0x50fecd41bd688f759276a3b3aea970be79ccdf2202747a180719e289b88939c9Exit145384492021-05-15 21:20:11196 days 2 hrs ago0xe8f298c8287f9786ba6f256ecf95d3fa02ef9f80 IN  0x7e53ecaaeecb5d4c0a1f33884aeb6e1bd25e6fdf0 MATIC0.00128311
0xe793d573ffc471120bb2e73dfc18d820b52f4578a27ae6d7ba13cc03fe300244Exit145382952021-05-15 21:14:51196 days 2 hrs ago0xa584f712ad5ca229f0a565d59f3eb652c3d753af IN  0x7e53ecaaeecb5d4c0a1f33884aeb6e1bd25e6fdf0 MATIC0.00129811
0x3a4f35fa6ffd1e6e62f387f7e8db82565ad58d96410f06179e359e875b382c07Get Reward145220522021-05-15 11:36:05196 days 12 hrs ago0xe8811c83c5c8949f7bee58d293f1434ea2a3e96d IN  0x7e53ecaaeecb5d4c0a1f33884aeb6e1bd25e6fdf0 MATIC0.000429363
0x1c6672bd894ef23e2c515216c9c94f5c8c46a7213516145c4d012d4063c3380aExit145219992021-05-15 11:34:15196 days 12 hrs ago0xe8811c83c5c8949f7bee58d293f1434ea2a3e96d IN  0x7e53ecaaeecb5d4c0a1f33884aeb6e1bd25e6fdf0 MATIC0.00128311
0x8f65c90e9241471480c4fa066a560fa570ab657e2ebd96f20ea3f340e4969708Exit145132182021-05-15 6:25:45196 days 17 hrs ago0xa5b55e9277f39ed77a09319a36acf4961a1a67e3 IN  0x7e53ecaaeecb5d4c0a1f33884aeb6e1bd25e6fdf0 MATIC0.000826025
0xb77a0249a93f03e8aeca489107594ab2a40ef7b512a3818add70a192ce9076c0Exit144447912021-05-13 14:01:49198 days 9 hrs ago0x54688a441c8e9f17253038ff8a4336b679c02a4b IN  0x7e53ecaaeecb5d4c0a1f33884aeb6e1bd25e6fdf0 MATIC0.00114811
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x0e51e9aa1caed7dfc43d2e6ba1688b4df5a67601710cf0907125b318136dc7a0129768712021-04-07 11:47:03234 days 11 hrs ago 0x3156a51d75c2d328ea35446969197ffc2b89771e  Contract Creation0 MATIC
[ Download CSV Export 
Loading

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

Contract Name:
StakingRewards

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// File: openzeppelin-solidity-2.3.0/contracts/math/Math.sol

pragma solidity ^0.5.0;

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

// File: openzeppelin-solidity-2.3.0/contracts/math/SafeMath.sol

pragma solidity ^0.5.0;

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

// File: openzeppelin-solidity-2.3.0/contracts/token/ERC20/IERC20.sol

pragma solidity ^0.5.0;

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

// File: openzeppelin-solidity-2.3.0/contracts/token/ERC20/ERC20Detailed.sol

pragma solidity ^0.5.0;


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

// File: openzeppelin-solidity-2.3.0/contracts/utils/Address.sol

pragma solidity ^0.5.0;

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

// File: openzeppelin-solidity-2.3.0/contracts/token/ERC20/SafeERC20.sol

pragma solidity ^0.5.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");
        }
    }
}

// File: openzeppelin-solidity-2.3.0/contracts/utils/ReentrancyGuard.sol

pragma solidity ^0.5.0;

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

// File: contracts/interfaces/IStakingRewards.sol

pragma solidity >=0.4.24;


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

    function rewardPerToken(address rewardToken) external view returns (uint256);

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

    function getRewardForDuration(address rewardToken) 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;
}

// File: contracts/RewardsDistributionRecipient.sol

pragma solidity >=0.5.16;

contract RewardsDistributionRecipient {
    address public rewardsDistribution;

    function notifyRewardAmount(address rewardToken, uint256 reward) external;

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

// File: contracts/StakingRewards.sol

pragma solidity >=0.5.16;






// Inheritance



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

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

    IERC20 public stakingToken;
    uint256 public periodFinish = 0;
    uint256 public rewardsDuration = 30 days;
    uint256 public rewardPerTokenStored;
    uint256 private _totalSupply;
    address[] private stakers;
    address[] public rewardTokens;

    mapping(address => uint256) public rewardsPerTokenMap;
    mapping(address => uint256) public tokenRewardRate;
    mapping(address => uint256) private _balances;
    mapping(address => uint256) public rewardLastUpdatedTime;
    mapping(address => mapping(address => uint256)) public userRewardPerTokenPaid;
    mapping(address => mapping(address => uint256)) public rewards;

    struct RewardView {
        uint256 rewardAmount;
        address rewardToken;
    }

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

    constructor(
        address _rewardsDistribution,
        address[] memory _rewardTokens,
        address _stakingToken
    ) public {
        rewardTokens = _rewardTokens;
        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 stakerBalances() external view returns (address[] memory, uint256[] memory){
        uint stakerCount = stakers.length;
        uint256[] memory balances = new uint256[](stakerCount);
        for (uint i=0;i<stakers.length;i++){
            balances[i] = _balances[stakers[i]];
        }
        return (stakers, balances);
    }

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

    function rewardPerToken(address rewardToken) public view returns (uint256) {
        if (_totalSupply == 0) {
            return rewardsPerTokenMap[rewardToken];
        }
        return
            rewardsPerTokenMap[rewardToken].add(
                lastTimeRewardApplicable().sub(rewardLastUpdatedTime[rewardToken]).mul(tokenRewardRate[rewardToken]).mul(1e18).div(_totalSupply)
            );
    }

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

    function getRewardForDuration(address rewardToken) external view returns (uint256) {
        return tokenRewardRate[rewardToken].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
        IEllipticRC20(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);
        if(_balances[msg.sender] == 0){
            stakers.push(msg.sender);
        }
        _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) {
        for (uint i=0; i<rewardTokens.length; i++){        
            uint256 reward = rewards[msg.sender][rewardTokens[i]];
            if (reward > 0) {
                rewards[msg.sender][rewardTokens[i]] = 0;
                IERC20(rewardTokens[i]).safeTransfer(msg.sender, reward);
                emit RewardPaid(msg.sender, reward);
            }
        }
    }

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

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

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

        // 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 = IERC20(rewardToken).balanceOf(address(this));
        require(rewardRate <= balance.div(periodFinish.sub(block.timestamp)), "Provided reward too high");

        rewardLastUpdatedTime[rewardToken] = block.timestamp;
        tokenRewardRate[rewardToken] = rewardRate;
        emit RewardAdded(reward);
    }

    function rescueFunds(address tokenAddress, address receiver) external onlyRewardsDistribution {
        require(tokenAddress != address(stakingToken), "StakingRewards: rescue of staking token not allowed");
        IERC20(tokenAddress).transfer(receiver, IERC20(tokenAddress).balanceOf(address(this)));
    }

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

    modifier updateReward(address account) {
        for (uint i=0; i<rewardTokens.length; i++){
            rewardsPerTokenMap[rewardTokens[i]] = rewardPerToken(rewardTokens[i]);
            rewardLastUpdatedTime[rewardTokens[i]] = lastTimeRewardApplicable();
            if (account != address(0)) {
                rewards[account][rewardTokens[i]] = earned(account, rewardTokens[i]);
                userRewardPerTokenPaid[account][rewardTokens[i]] = rewardsPerTokenMap[rewardTokens[i]];
            }
        }
        _;
    }

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_rewardsDistribution","type":"address"},{"internalType":"address[]","name":"_rewardTokens","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"}],"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"},{"internalType":"address","name":"rewardToken","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":[{"internalType":"address","name":"rewardToken","type":"address"}],"name":"getRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"rewardToken","type":"address"},{"internalType":"uint256","name":"reward","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":false,"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"receiver","type":"address"}],"name":"rescueFunds","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardLastUpdatedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"rewardToken","type":"address"}],"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"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":"rewardsDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardsPerTokenMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"stakerBalances","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenRewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"},{"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"}]

6080604052600060035562278d006004553480156200001d57600080fd5b506040516200282638038062002826833981810160405260608110156200004357600080fd5b8151602083018051604051929492938301929190846401000000008211156200006b57600080fd5b9083019060208201858111156200008157600080fd5b82518660208202830111640100000000821117156200009f57600080fd5b82525081516020918201928201910280838360005b83811015620000ce578181015183820152602001620000b4565b505050509190910160405250602090810151600180558451909350620000fb925060089185019062000133565b50600280546001600160a01b039283166001600160a01b031991821617909155600080549490921693169290921790915550620001c7565b8280548282559060005260206000209081019282156200018b579160200282015b828111156200018b57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000154565b50620001999291506200019d565b5090565b620001c491905b80821115620001995780546001600160a01b0319168155600101620001a4565b90565b61264f80620001d76000396000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c806380faa57d116100ee578063df136d6511610097578063e9ffcb1b11610071578063e9ffcb1b1461050e578063ebe2b12b14610541578063ecd9ba8214610549578063f122977714610581576101a3565b8063df136d65146104c3578063e70b9e27146104cb578063e9fad8ee14610506576101a3565b8063b66503cf116100c8578063b66503cf146103b6578063bcd11014146103ef578063c61c631014610422576101a3565b806380faa57d1461035e578063a4f880f214610366578063a694fc3a14610399576101a3565b80633d18b9121161015057806370a082311161012a57806370a082311461030657806372f702f3146103395780637bb7bed114610341576101a3565b80633d18b912146102925780633fc6df6e1461029a5780637035ab98146102cb576101a3565b8063292eee8411610181578063292eee841461023a5780632e1a7d4d1461026d578063386a95251461028a576101a3565b806318160ddd146101a85780631ff9b6f2146101c2578063211dc32d146101ff575b600080fd5b6101b06105b4565b60408051918252519081900360200190f35b6101fd600480360360408110156101d857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166105ba565b005b6101b06004803603604081101561021557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166107e5565b6101b06004803603602081101561025057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166108b2565b6101fd6004803603602081101561028357600080fd5b50356108c4565b6101b0610c7f565b6101fd610c85565b6102a261101d565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101b0600480360360408110156102e157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516611039565b6101b06004803603602081101561031c57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611056565b6102a2611082565b6102a26004803603602081101561035757600080fd5b503561109e565b6101b06110d2565b6101b06004803603602081101561037c57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166110e5565b6101fd600480360360208110156103af57600080fd5b50356110f7565b6101fd600480360360408110156103cc57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356114d0565b6101b06004803603602081101561040557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611960565b61042a61199b565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561046e578181015183820152602001610456565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156104ad578181015183820152602001610495565b5050505090500194505050505060405180910390f35b6101b0611ab9565b6101b0600480360360408110156104e157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516611abf565b6101fd611adc565b6101b06004803603602081101561052457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611aff565b6101b0611b11565b6101fd600480360360a081101561055f57600080fd5b5080359060208101359060ff6040820135169060608101359060800135611b17565b6101b06004803603602081101561059757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611f40565b60065490565b60005473ffffffffffffffffffffffffffffffffffffffff16331461062a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806125c7602a913960400191505060405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff8381169116141561069e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806125946033913960400191505060405180910390fd5b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff84169163a9059cbb91849184916370a0823191602480820192602092909190829003018186803b15801561071557600080fd5b505afa158015610729573d6000803e3d6000fd5b505050506040513d602081101561073f57600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff909316600484015260248301919091525160448083019260209291908290030181600087803b1580156107b557600080fd5b505af11580156107c9573d6000803e3d6000fd5b505050506040513d60208110156107df57600080fd5b50505050565b73ffffffffffffffffffffffffffffffffffffffff8083166000818152600e6020908152604080832094861680845294825280832054938352600d8252808320948352939052918220546108a9919061089d90670de0b6b3a7640000906108919061085f9061085389611f40565b9063ffffffff61201316565b73ffffffffffffffffffffffffffffffffffffffff89166000908152600b60205260409020549063ffffffff61208a16565b9063ffffffff6120fd16565b9063ffffffff61218116565b90505b92915050565b600a6020526000908152604090205481565b600180548101908190553360005b600854811015610af557610913600882815481106108ec57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16611f40565b600960006008848154811061092457fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205561095e6110d2565b600c60006008848154811061096f57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff9081168452908301939093526040909101902091909155821615610aed576109e882600883815481106109c157fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff166107e5565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600e602052604081206008805491929185908110610a1e57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400181209190915560088054600992919084908110610a6657fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff90811684528382019490945260409283018220549386168252600d90529081206008805491929185908110610aba57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020555b6001016108d2565b5060008311610b6557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f43616e6e6f742077697468647261772030000000000000000000000000000000604482015290519081900360640190fd5b600654610b78908463ffffffff61201316565b600655336000908152600b6020526040902054610b9b908463ffffffff61201316565b336000818152600b6020526040902091909155600254610bd49173ffffffffffffffffffffffffffffffffffffffff90911690856121f5565b60408051848152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a2506001548114610c7b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b5050565b60045481565b600180548101908190553360005b600854811015610e6857610cad600882815481106108ec57fe5b6009600060088481548110610cbe57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902055610cf86110d2565b600c600060088481548110610d0957fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff9081168452908301939093526040909101902091909155821615610e6057610d5b82600883815481106109c157fe5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600e602052604081206008805491929185908110610d9157fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400181209190915560088054600992919084908110610dd957fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff90811684528382019490945260409283018220549386168252600d90529081206008805491929185908110610e2d57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020555b600101610c93565b5060005b600854811015610fa857336000908152600e602052604081206008805483919085908110610e9657fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205490508015610f9f57336000908152600e602052604081206008805483919086908110610ef057fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205560088054610f6891339184919086908110610f3957fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16919063ffffffff6121f516565b60408051828152905133917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b50600101610e6c565b5050600154811461101a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b50565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600d60209081526000928352604080842090915290825290205481565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600b60205260409020545b919050565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b600881815481106110ab57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60006110e042600354612287565b905090565b60096020526000908152604090205481565b600180548101908190553360005b6008548110156112da5761111f600882815481106108ec57fe5b600960006008848154811061113057fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205561116a6110d2565b600c60006008848154811061117b57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff90811684529083019390935260409091019020919091558216156112d2576111cd82600883815481106109c157fe5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600e60205260408120600880549192918590811061120357fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040018120919091556008805460099291908490811061124b57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff90811684528382019490945260409283018220549386168252600d9052908120600880549192918590811061129f57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020555b600101611105565b506000831161134a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f43616e6e6f74207374616b652030000000000000000000000000000000000000604482015290519081900360640190fd5b60065461135d908463ffffffff61218116565b600655336000908152600b60205260409020546113cf57600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555b336000908152600b60205260409020546113ef908463ffffffff61218116565b336000818152600b60205260409020919091556002546114299173ffffffffffffffffffffffffffffffffffffffff90911690308661229d565b60408051848152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a2506001548114610c7b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314611540576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806125c7602a913960400191505060405180910390fd5b6000805b6008548110156117195761155e600882815481106108ec57fe5b600960006008848154811061156f57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020556115a96110d2565b600c6000600884815481106115ba57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff90811684529083019390935260409091019020919091558216156117115761160c82600883815481106109c157fe5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600e60205260408120600880549192918590811061164257fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040018120919091556008805460099291908490811061168a57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff90811684528382019490945260409283018220549386168252600d905290812060088054919291859081106116de57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020555b600101611544565b5073ffffffffffffffffffffffffffffffffffffffff83166000908152600a6020526040902054600354421061177c5760045461175d90849063ffffffff6120fd16565b90506117746004544261218190919063ffffffff16565b6003556117c1565b600354600090611792904263ffffffff61201316565b905060006117a6828463ffffffff61208a16565b90506117bc82610891878463ffffffff61218116565b925050505b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009173ffffffffffffffffffffffffffffffffffffffff8716916370a0823191602480820192602092909190829003018186803b15801561183157600080fd5b505afa158015611845573d6000803e3d6000fd5b505050506040513d602081101561185b57600080fd5b505160035490915061188490611877904263ffffffff61201316565b829063ffffffff6120fd16565b8211156118f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f50726f76696465642072657761726420746f6f20686967680000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff85166000908152600c60209081526040808320429055600a825291829020849055815186815291517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9281900390910190a15050505050565b60045473ffffffffffffffffffffffffffffffffffffffff82166000908152600a602052604081205490916108ac919063ffffffff61208a16565b600754604080518281526020808402820101909152606091829182908280156119ce578160200160208202803883390190505b50905060005b600754811015611a4257600b6000600783815481106119ef57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020548251839083908110611a2f57fe5b60209081029190910101526001016119d4565b5060078181805480602002602001604051908101604052809291908181526020018280548015611aa857602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611a7d575b505050505091509350935050509091565b60055481565b600e60209081526000928352604080842090915290825290205481565b336000908152600b6020526040902054611af5906108c4565b611afd610c85565b565b600c6020526000908152604090205481565b60035481565b600180548101908190553360005b600854811015611cfa57611b3f600882815481106108ec57fe5b6009600060088481548110611b5057fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902055611b8a6110d2565b600c600060088481548110611b9b57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff9081168452908301939093526040909101902091909155821615611cf257611bed82600883815481106109c157fe5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600e602052604081206008805491929185908110611c2357fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400181209190915560088054600992919084908110611c6b57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff90811684528382019490945260409283018220549386168252600d90529081206008805491929185908110611cbf57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020555b600101611b25565b5060008711611d6a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f43616e6e6f74207374616b652030000000000000000000000000000000000000604482015290519081900360640190fd5b600654611d7d908863ffffffff61218116565b600655336000908152600b6020526040902054611da0908863ffffffff61218116565b336000818152600b60205260408082209390935560025483517fd505accf0000000000000000000000000000000000000000000000000000000081526004810193909352306024840152604483018b9052606483018a905260ff8916608484015260a4830188905260c48301879052925173ffffffffffffffffffffffffffffffffffffffff9093169263d505accf9260e480820193929182900301818387803b158015611e4d57600080fd5b505af1158015611e61573d6000803e3d6000fd5b5050600254611e91925073ffffffffffffffffffffffffffffffffffffffff16905033308a63ffffffff61229d16565b60408051888152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a2506001548114611f3857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b505050505050565b600060065460001415611f79575073ffffffffffffffffffffffffffffffffffffffff811660009081526009602052604090205461107d565b60065473ffffffffffffffffffffffffffffffffffffffff83166000908152600a6020908152604080832054600c909252909120546108ac92611fe192909161089191670de0b6b3a764000091611fd5919082906108536110d2565b9063ffffffff61208a16565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600960205260409020549063ffffffff61218116565b60008282111561208457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082612099575060006108ac565b828202828482816120a657fe5b04146108a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806125736021913960400191505060405180910390fd5b600080821161216d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b600082848161217857fe5b04949350505050565b6000828201838110156108a957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261228290849061232e565b505050565b600081831061229657816108a9565b5090919050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790526107df9085905b61234d8273ffffffffffffffffffffffffffffffffffffffff1661256c565b6123b857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b6020831061242157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016123e4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612483576040519150601f19603f3d011682016040523d82523d6000602084013e612488565b606091505b5091509150816124f957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156107df5780806020019051602081101561251557600080fd5b50516107df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806125f1602a913960400191505060405180910390fd5b3b15159056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775374616b696e67526577617264733a20726573637565206f66207374616b696e6720746f6b656e206e6f7420616c6c6f77656443616c6c6572206973206e6f742052657761726473446973747269627574696f6e20636f6e74726163745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a723158207fe4516fc9e0744bd06e3a14eca664c354362d738da083d4e3170eefb43b4a8d64736f6c634300051100320000000000000000000000003156a51d75c2d328ea35446969197ffc2b89771e0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000ebc4f9b1ce66258ac3a48578ffeeba1330ddb68b000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000016eccfdbb4ee1a85a33f3a9b21175cd7ae753db40000000000000000000000004fdce518fe527439fe76883e6b51a1c522b61b7c000000000000000000000000a3ed22eee92a3872709823a6970069e12a4540eb000000000000000000000000be5cf150e1ff59ca7f2499eaa13bfc40aae70e78000000000000000000000000e6fc6c7cb6d2c31b359a49a33ef08ab87f4de7ce000000000000000000000000c3ec80343d2bae2f8e680fdadde7c17e71e114ea000000000000000000000000f6f85b3f9fd581c2ee717c404f7684486f057f9500000000000000000000000040ccd55b789fdee8d434915dc2aa6bd938506a92000000000000000000000000c91c06db0f7bffba61e2a5645cc15686f0a8c828000000000000000000000000a79e0bfc579c709819f4a0e95d4597f03093b01100000000000000000000000067480287cb3715d1d9429b38772c71d6e94c16da

Deployed ByteCode Sourcemap

16870:7406:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16870:7406:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18214:93;;;:::i;:::-;;;;;;;;;;;;;;;;23109:311;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23109:311:0;;;;;;;;;;;:::i;:::-;;19344:256;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19344:256:0;;;;;;;;;;;:::i;17411:50::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17411:50:0;;;;:::i;20860:357::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20860:357:0;;:::i;17157:40::-;;;:::i;21225:448::-;;;:::i;16482:34::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17583:77;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17583:77:0;;;;;;;;;;;:::i;18315:112::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18315:112:0;;;;:::i;17086:26::-;;;:::i;17313:29::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17313:29:0;;:::i;18788:131::-;;;:::i;17351:53::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17351:53:0;;;;:::i;20392:460::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20392:460:0;;:::i;21842:1259::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21842:1259:0;;;;;;;;;:::i;19608:158::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19608:158:0;;;;:::i;18435:345::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;18435:345:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;18435:345:0;;;;;;;;;;;;;;;;;;;17204:35;;;:::i;17667:62::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17667:62:0;;;;;;;;;;;:::i;21681:97::-;;;:::i;17520:56::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17520:56:0;;;;:::i;17119:31::-;;;:::i;19828:556::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;19828:556:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;18927:409::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18927:409:0;;;;:::i;18214:93::-;18287:12;;18214:93;:::o;23109:311::-;16675:19;;;;16661:10;:33;16653:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23246:12;;;23222:37;;;23246:12;;23222:37;;23214:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23366:45;;;;;;23405:4;23366:45;;;;;;23326:29;;;;;;23356:8;;23326:29;;23366:30;;:45;;;;;;;;;;;;;;;23326:29;23366:45;;;5:2:-1;;;;30:1;27;20:12;5:2;23366:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23366:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23366:45:0;23326:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23366:45;;23326:86;;;;;;;-1:-1:-1;23326:86:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;23326:86:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23326:86:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;23109:311:0:o;19344:256::-;19562:16;;;;19419:7;19562:16;;;:7;:16;;;;;;;;:29;;;;;;;;;;;;;19501:31;;;:22;:31;;;;;:44;;;;;;;;;;19446:146;;19562:29;19446:111;;19552:4;;19446:101;;19469:77;;:27;19579:11;19469:14;:27::i;:::-;:31;:77;:31;:77;:::i;:::-;19446:18;;;;;;;:9;:18;;;;;;;:101;:22;:101;:::i;:::-;:105;:111;:105;:111;:::i;:::-;:115;:146;:115;:146;:::i;:::-;19439:153;;19344:256;;;;;:::o;17411:50::-;;;;;;;;;;;;;:::o;20860:357::-;15390:1;15373:18;;;;;;;;20927:10;15373:13;23523:469;23540:12;:19;23538:21;;23523:469;;;23618:31;23633:12;23646:1;23633:15;;;;;;;;;;;;;;;;;;;;23618:14;:31::i;:::-;23580:18;:35;23599:12;23612:1;23599:15;;;;;;;;;;;;;;;;;;;;;;23580:35;;;;;;;;;;;;:69;23705:26;:24;:26::i;:::-;23664:21;:38;23686:12;23699:1;23686:15;;;;;;;;;;;;;;;;;;;;;;;;23664:38;;;;;;;;;;;;;;;:67;;;;23750:21;;;23746:235;;23828:32;23835:7;23844:12;23857:1;23844:15;;;;;;;;;;;;;;;;;;;;23828:6;:32::i;:::-;23792:16;;;;;;;:7;:16;;;;;23809:12;:15;;23792:16;;;23822:1;;23809:15;;;;;;;;;;;;;;;;;;;;23792:33;;;;;;;;;;;;:68;;;;23949:12;:15;;23930:18;;23809:15;23949:12;23962:1;;23949:15;;;;;;;;;;;;;;;;;;;;;;23930:35;;;;;;;;;;;;;;;;23879:31;;;;;:22;:31;;;;;23911:12;:15;;23879:31;;23949:15;23924:1;;23911:15;;;;;;;;;;;;;;;;;;;;23879:48;;;;;;;;;;;;:86;23746:235;23561:3;;23523:469;;;;20967:1;20958:6;:10;20950:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21016:12;;:24;;21033:6;21016:24;:16;:24;:::i;:::-;21001:12;:39;21085:10;21075:21;;;;:9;:21;;;;;;:33;;21101:6;21075:33;:25;:33;:::i;:::-;21061:10;21051:21;;;;:9;:21;;;;;:57;;;;21119:12;;:45;;21051:21;21119:12;;;;21157:6;21119:25;:45::i;:::-;21180:29;;;;;;;;21190:10;;21180:29;;;;;;;;;;15449:1;15485:13;;15469:12;:29;15461:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20860:357;;:::o;17157:40::-;;;;:::o;21225:448::-;15390:1;15373:18;;;;;;;;21279:10;15373:13;23523:469;23540:12;:19;23538:21;;23523:469;;;23618:31;23633:12;23646:1;23633:15;;;;;;;23618:31;23580:18;:35;23599:12;23612:1;23599:15;;;;;;;;;;;;;;;;;;;;;;23580:35;;;;;;;;;;;;:69;23705:26;:24;:26::i;:::-;23664:21;:38;23686:12;23699:1;23686:15;;;;;;;;;;;;;;;;;;;;;;;;23664:38;;;;;;;;;;;;;;;:67;;;;23750:21;;;23746:235;;23828:32;23835:7;23844:12;23857:1;23844:15;;;;;;;23828:32;23792:16;;;;;;;:7;:16;;;;;23809:12;:15;;23792:16;;;23822:1;;23809:15;;;;;;;;;;;;;;;;;;;;23792:33;;;;;;;;;;;;:68;;;;23949:12;:15;;23930:18;;23809:15;23949:12;23962:1;;23949:15;;;;;;;;;;;;;;;;;;;;;;23930:35;;;;;;;;;;;;;;;;23879:31;;;;;:22;:31;;;;;23911:12;:15;;23879:31;;23949:15;23924:1;;23911:15;;;;;;;;;;;;;;;;;;;;23879:48;;;;;;;;;;;;:86;23746:235;23561:3;;23523:469;;;-1:-1:-1;21307:6:0;21302:364;21319:12;:19;21317:21;;21302:364;;;21392:10;21367:14;21384:19;;;:7;:19;;;;;21404:12;:15;;21367:14;;21404:12;21417:1;;21404:15;;;;;;;;;;;;;;;;;;;;21384:36;;;;;;;;;;;;;;-1:-1:-1;21439:10:0;;21435:220;;21478:10;21509:1;21470:19;;;:7;:19;;;;;21490:12;:15;;21509:1;;21490:12;21503:1;;21490:15;;;;;;;;;;;;;;;;;;;;21470:36;;;;;;;;;;;;:40;21536:12;:15;;21529:56;;21566:10;;21578:6;;21536:12;21549:1;;21536:15;;;;;;;;;;;;;;;;;;;21529:56;;:36;:56;:::i;:::-;21609:30;;;;;;;;21620:10;;21609:30;;;;;;;;;;21435:220;-1:-1:-1;21340:3:0;;21302:364;;;;15449:1;15485:13;;15469:12;:29;15461:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21225:448;:::o;16482:34::-;;;;;;:::o;17583:77::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;18315:112::-;18401:18;;;18374:7;18401:18;;;:9;:18;;;;;;18315:112;;;;:::o;17086:26::-;;;;;;:::o;17313:29::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17313:29:0;:::o;18788:131::-;18845:7;18872:39;18881:15;18898:12;;18872:8;:39::i;:::-;18865:46;;18788:131;:::o;17351:53::-;;;;;;;;;;;;;:::o;20392:460::-;15390:1;15373:18;;;;;;;;20458:10;15373:13;23523:469;23540:12;:19;23538:21;;23523:469;;;23618:31;23633:12;23646:1;23633:15;;;;;;;23618:31;23580:18;:35;23599:12;23612:1;23599:15;;;;;;;;;;;;;;;;;;;;;;23580:35;;;;;;;;;;;;:69;23705:26;:24;:26::i;:::-;23664:21;:38;23686:12;23699:1;23686:15;;;;;;;;;;;;;;;;;;;;;;;;23664:38;;;;;;;;;;;;;;;:67;;;;23750:21;;;23746:235;;23828:32;23835:7;23844:12;23857:1;23844:15;;;;;;;23828:32;23792:16;;;;;;;:7;:16;;;;;23809:12;:15;;23792:16;;;23822:1;;23809:15;;;;;;;;;;;;;;;;;;;;23792:33;;;;;;;;;;;;:68;;;;23949:12;:15;;23930:18;;23809:15;23949:12;23962:1;;23949:15;;;;;;;;;;;;;;;;;;;;;;23930:35;;;;;;;;;;;;;;;;23879:31;;;;;:22;:31;;;;;23911:12;:15;;23879:31;;23949:15;23924:1;;23911:15;;;;;;;;;;;;;;;;;;;;23879:48;;;;;;;;;;;;:86;23746:235;23561:3;;23523:469;;;;20498:1;20489:6;:10;20481:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20544:12;;:24;;20561:6;20544:24;:16;:24;:::i;:::-;20529:12;:39;20592:10;20582:21;;;;:9;:21;;;;;;20579:81;;20624:7;27:10:-1;;39:1;23:18;;45:23;;-1:-1;20624:24:0;;;;;;;;;;20637:10;20624:24;;;20579:81;20704:10;20694:21;;;;:9;:21;;;;;;:33;;20720:6;20694:33;:25;:33;:::i;:::-;20680:10;20670:21;;;;:9;:21;;;;;:57;;;;20738:12;;:64;;20670:21;20738:12;;;;20788:4;20795:6;20738:29;:64::i;:::-;20818:26;;;;;;;;20825:10;;20818:26;;;;;;;;;;15449:1;15485:13;;15469:12;:29;15461:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21842:1259;16675:19;;;;16661:10;:33;16653:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21961:1;;23523:469;23540:12;:19;23538:21;;23523:469;;;23618:31;23633:12;23646:1;23633:15;;;;;;;23618:31;23580:18;:35;23599:12;23612:1;23599:15;;;;;;;;;;;;;;;;;;;;;;23580:35;;;;;;;;;;;;:69;23705:26;:24;:26::i;:::-;23664:21;:38;23686:12;23699:1;23686:15;;;;;;;;;;;;;;;;;;;;;;;;23664:38;;;;;;;;;;;;;;;:67;;;;23750:21;;;23746:235;;23828:32;23835:7;23844:12;23857:1;23844:15;;;;;;;23828:32;23792:16;;;;;;;:7;:16;;;;;23809:12;:15;;23792:16;;;23822:1;;23809:15;;;;;;;;;;;;;;;;;;;;23792:33;;;;;;;;;;;;:68;;;;23949:12;:15;;23930:18;;23809:15;23949:12;23962:1;;23949:15;;;;;;;;;;;;;;;;;;;;;;23930:35;;;;;;;;;;;;;;;;23879:31;;;;;:22;:31;;;;;23911:12;:15;;23879:31;;23949:15;23924:1;;23911:15;;;;;;;;;;;;;;;;;;;;23879:48;;;;;;;;;;;;:86;23746:235;23561:3;;23523:469;;;-1:-1:-1;21997:28:0;;;21976:18;21997:28;;;:15;:28;;;;;;22059:12;;22040:15;:31;22036:378;;22112:15;;22101:27;;:6;;:27;:10;:27;:::i;:::-;22088:40;;22158:36;22178:15;;22158;:19;;:36;;;;:::i;:::-;22143:12;:51;22036:378;;;22247:12;;22227:17;;22247:33;;22264:15;22247:33;:16;:33;:::i;:::-;22227:53;-1:-1:-1;22295:16:0;22314:25;22227:53;22328:10;22314:25;:13;:25;:::i;:::-;22295:44;-1:-1:-1;22367:35:0;22392:9;22367:20;:6;22295:44;22367:20;:10;:20;:::i;:35::-;22354:48;;22036:378;;;22789:44;;;;;;22827:4;22789:44;;;;;;22774:12;;22789:29;;;;;;:44;;;;;;;;;;;;;;;:29;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;22789:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22789:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22789:44:0;22878:12;;22789:44;;-1:-1:-1;22866:46:0;;22878:33;;22895:15;22878:33;:16;:33;:::i;:::-;22866:7;;:46;:11;:46;:::i;:::-;22852:10;:60;;22844:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22954:34;;;;;;;:21;:34;;;;;;;;22991:15;22954:52;;23017:15;:28;;;;;;:41;;;23074:19;;;;;;;;;;;;;;;;;24002:1;;16752;21842:1259;;:::o;19608:158::-;19742:15;;19709:28;;;19682:7;19709:28;;;:15;:28;;;;;;19682:7;;19709:49;;:28;:49;:32;:49;:::i;18435:345::-;18549:7;:14;18602:26;;;;;;;;;;;;;;;;18484:16;;;;;;18549:14;18602:26;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;18602:26:0;-1:-1:-1;18574:54:0;-1:-1:-1;18644:6:0;18639:97;18655:7;:14;18653:16;;18639:97;;;18703:9;:21;18713:7;18721:1;18713:10;;;;;;;;;;;;;;;;;;;;;;18703:21;;;;;;;;;;;;;18689:11;;:8;;18698:1;;18689:11;;;;;;;;;;;;;;;:35;18670:3;;18639:97;;;;18754:7;18763:8;18746:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18435:345;;:::o;17204:35::-;;;;:::o;17667:62::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;21681:97::-;21736:10;21726:21;;;;:9;:21;;;;;;21717:31;;:8;:31::i;:::-;21759:11;:9;:11::i;:::-;21681:97::o;17520:56::-;;;;;;;;;;;;;:::o;17119:31::-;;;;:::o;19828:556::-;15390:1;15373:18;;;;;;;;19950:10;15373:13;23523:469;23540:12;:19;23538:21;;23523:469;;;23618:31;23633:12;23646:1;23633:15;;;;;;;23618:31;23580:18;:35;23599:12;23612:1;23599:15;;;;;;;;;;;;;;;;;;;;;;23580:35;;;;;;;;;;;;:69;23705:26;:24;:26::i;:::-;23664:21;:38;23686:12;23699:1;23686:15;;;;;;;;;;;;;;;;;;;;;;;;23664:38;;;;;;;;;;;;;;;:67;;;;23750:21;;;23746:235;;23828:32;23835:7;23844:12;23857:1;23844:15;;;;;;;23828:32;23792:16;;;;;;;:7;:16;;;;;23809:12;:15;;23792:16;;;23822:1;;23809:15;;;;;;;;;;;;;;;;;;;;23792:33;;;;;;;;;;;;:68;;;;23949:12;:15;;23930:18;;23809:15;23949:12;23962:1;;23949:15;;;;;;;;;;;;;;;;;;;;;;23930:35;;;;;;;;;;;;;;;;23879:31;;;;;:22;:31;;;;;23911:12;:15;;23879:31;;23949:15;23924:1;;23911:15;;;;;;;;;;;;;;;;;;;;23879:48;;;;;;;;;;;;:86;23746:235;23561:3;;23523:469;;;;19990:1;19981:6;:10;19973:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20036:12;;:24;;20053:6;20036:24;:16;:24;:::i;:::-;20021:12;:39;20105:10;20095:21;;;;:9;:21;;;;;;:33;;20121:6;20095:33;:25;:33;:::i;:::-;20081:10;20071:21;;;;:9;:21;;;;;;:57;;;;20182:12;;20160:97;;;;;;;;;;;;20224:4;20160:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20071:21;20182:12;;;;20160:43;;:97;;;;;20071:21;20160:97;;;;;;20071:21;20182:12;20160:97;;;5:2:-1;;;;30:1;27;20:12;5:2;20160:97:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;20270:12:0;;:64;;-1:-1:-1;20270:12:0;;;-1:-1:-1;20300:10:0;20320:4;20327:6;20270:64;:29;:64;:::i;:::-;20350:26;;;;;;;;20357:10;;20350:26;;;;;;;;;;15449:1;15485:13;;15469:12;:29;15461:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19828:556;;;;;;:::o;18927:409::-;18993:7;19017:12;;19033:1;19017:17;19013:88;;;-1:-1:-1;19058:31:0;;;;;;;:18;:31;;;;;;19051:38;;19013:88;19300:12;;19256:28;;;;;;;:15;:28;;;;;;;;;19216:21;:34;;;;;;;19131:197;;19185:128;;19300:12;;19185:110;;19290:4;;19185:100;;19256:28;19185:100;;:26;:24;:26::i;:66::-;:70;:100;:70;:100;:::i;:128::-;19131:31;;;;;;;:18;:31;;;;;;;:197;:35;:197;:::i;2246:184::-;2304:7;2337:1;2332;:6;;2324:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2396:5:0;;;2246:184::o;2681:470::-;2739:7;2983:6;2979:47;;-1:-1:-1;3013:1:0;3006:8;;2979:47;3050:5;;;3054:1;3050;:5;:1;3074:5;;;;;:10;3066:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3619:333;3677:7;3776:1;3772;:5;3764:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3819:9;3835:1;3831;:5;;;;;;;3619:333;-1:-1:-1;;;;3619:333:0:o;1790:181::-;1848:7;1880:5;;;1904:6;;;;1896:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10849:176;10958:58;;;10981:14;10958:58;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;10958:58:0;;;;;;;;25:18:-1;;61:17;;10958:58:0;182:15:-1;10981:23:0;179:29:-1;160:49;;10932:85:0;;10951:5;;10932:18;:85::i;:::-;10849:176;;;:::o;438:106::-;496:7;527:1;523;:5;:13;;535:1;523:13;;;-1:-1:-1;531:1:0;;438:106;-1:-1:-1;438:106:0:o;11033:204::-;11160:68;;;11183:18;11160:68;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;11160:68:0;;;;;;;;25:18:-1;;61:17;;11160:68:0;182:15:-1;11183:27:0;179:29:-1;160:49;;11134:95:0;;11153:5;;12843:1114;13447:27;13455:5;13447:25;;;:27::i;:::-;13439:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13584:12;13598:23;13633:5;13625:19;;13645:4;13625:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;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;;;13625: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;;13583:67:0;;;;13669:7;13661:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13730:17;;:21;13726:224;;13872:10;13861:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13861:30:0;13853:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9753:422;10120:20;10159:8;;;9753:422::o

Swarm Source

bzzr://7fe4516fc9e0744bd06e3a14eca664c354362d738da083d4e3170eefb43b4a8d
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.