Contract 0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f 4

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xb829e7bc1cdf0400500765f0874d71411ff37447b2871e31ee90911e7bca0cccStake219102312021-11-28 19:33:3732 mins ago0xd1d725a35cf1a0267fab9ebdfc22bb18528f49c7 IN  0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f0 MATIC0.00276027
0x97c5088ca86dc1dbbef02c11273558068c9259d56163ea13e15be24b55934524Get Reward219092502021-11-28 18:59:351 hr 6 mins ago0x7eb9e3fe3c89b84feb29e836d58ac025ca08f1d5 IN  0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f0 MATIC0.002632224
0xfdc41e1223bf1a9888b60e317bbbf7bb4ba774c8caa1a7f3ba4c768b951673d4Exit219048882021-11-28 16:18:423 hrs 47 mins ago0x2aa2be586dea82f44a989c79cf78acbc8b2f4776 IN  0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f0 MATIC0.00348762
0x22b49500f2e962aac18756dbe76275b740fff0a1a7e44f4ea85ffc938a70ebdcGet Reward218994422021-11-28 12:54:237 hrs 11 mins ago0xd1d725a35cf1a0267fab9ebdfc22bb18528f49c7 IN  0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f0 MATIC0.00246771
0x3a7448c0f47d0b8700aef4335e9afac78873f76eb62e83176e71059a0c5153cbStake218894212021-11-28 6:38:1013 hrs 27 mins ago0x91416b67df74821fc06decf02aace7eb58e91293 IN  0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f0 MATIC0.00267522
0x026ec577940a5b8293183771d329f2f50ddb174d210198640d9215ac989081f1Get Reward218890772021-11-28 6:21:5813 hrs 43 mins ago0x1efa0d654d2ceaf84e14c60b3971f572ba169253 IN  0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f0 MATIC0.00246771
0x3bb7d9c0d93df359a544f7a44f468c2a3a87cddbd5d3c858dd97330e040f2892Get Reward218851132021-11-28 3:55:0016 hrs 10 mins ago0x4595d4191b53de788d7766f6f01eebe7525cb2f0 IN  0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f0 MATIC0.00246771
0x97eb567ce00b2852f6723a38a6d4d9a052311920a72cfec7b623fde3c247416fExit218819432021-11-28 1:57:3118 hrs 8 mins ago0xf37bd2d295a0fce14c3716bf0f02db7462d79f4b IN  0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f0 MATIC0.00312162
0x583687dfb927674e4d462b215b03dc654e235297e894a4b90a2d0aa359891191Get Reward218806532021-11-28 1:08:3618 hrs 57 mins ago0x43d527a9ab6beda2d0cd317efe4d64458a3a6ced IN  0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f0 MATIC0.00246771
0xa4792e350d4c29fe07a7895c260656b3dcfab8fdcededc36e839820bfec72bedGet Reward218802022021-11-28 0:50:5819 hrs 14 mins ago0x68c70695dfbe5e5038de2c3cef20fb207924c2b1 IN  0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f0 MATIC0.003612974211
0x749b1b73c1f329bf291e2036236a112e4a06b410f561cf1a0f3c292806151756Get Reward218777912021-11-27 23:15:0620 hrs 50 mins ago0x0986a526567d893dc07472e805ac4716e6ac54b3 IN  0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f0 MATIC0.00246771
0x6cdcba18cc6cddf2b8abe40aba2bf023d216077ca09e66c47108a717abe12ba5Get Reward218771662021-11-27 22:51:2821 hrs 14 mins ago0x77498e63de9800a109e8e69879a4983c17f808e1 IN  0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f0 MATIC0.0022212
0x7835141296e5efbc89e12f272573796cc3d8d348a8f386bb3897b98113a29096Get Reward218771632021-11-27 22:51:2221 hrs 14 mins ago0x77498e63de9800a109e8e69879a4983c17f808e1 IN  0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f0 MATIC0.00246771
0xd85805ff2948f5277feab3ab6aa9422606ad2de2d4ca8635ddfdd96f2306b805Get Reward218647092021-11-27 15:09:011 day 4 hrs ago0xeec343ae92ec115d195f9af602f01f9d6ac7142c IN  0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f0 MATIC0.00246771
0xfce125b39206457c60ae1545664454e364f89a03311a255b8f087e0f8ed73cf6Get Reward218611242021-11-27 12:54:391 day 7 hrs ago0xd1d725a35cf1a0267fab9ebdfc22bb18528f49c7 IN  0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f0 MATIC0.00210171
0xc0ee60009a2214ab471065738f8119d20abb2c03b7b4486474482d8205513702Get Reward218407222021-11-27 0:39:281 day 19 hrs ago0x43d527a9ab6beda2d0cd317efe4d64458a3a6ced IN  0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f0 MATIC0.00246771
0xe13451bf219877f9a16ebf61c541eb69c0ca6c54102847a231ccf5cd9427973bStake218367132021-11-26 22:18:501 day 21 hrs ago0x2aa2be586dea82f44a989c79cf78acbc8b2f4776 IN  0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f0 MATIC0.00267486
0x2749c4e0949dfb058d7b519773d02f97f27fef776d81062a6a7892f81a8449fcExit218364832021-11-26 22:10:581 day 21 hrs ago0x2aa2be586dea82f44a989c79cf78acbc8b2f4776 IN  0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f0 MATIC0.00260862
0xf85b69f28a8d05ec5630421c3874e0ee6ca118b50106522661fd4745d005f1e3Stake218343962021-11-26 20:51:211 day 23 hrs ago0xd1d725a35cf1a0267fab9ebdfc22bb18528f49c7 IN  0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f0 MATIC0.00276063
0x2b6b9ef15f5fc4d8b3d70984cd78c46971a9fc0e8807d7883e56bf975990f893Get Reward218332202021-11-26 20:03:352 days 2 mins ago0x910d80d9640a1aa458cd0e4d7eb295daa71072ca IN  0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f0 MATIC0.00210171
0x1e980546620768c2734d1e2174ac6941bc1f378486bf7cb06812de6e1703aa99Stake218265362021-11-26 15:33:512 days 4 hrs ago0x2aa2be586dea82f44a989c79cf78acbc8b2f4776 IN  0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f0 MATIC0.00321063
0x7fcf817b13f6e2ae47b13bc403437a976f04f5c6d7bb4fa456cb1597afa9cdf6Get Reward218263022021-11-26 15:23:392 days 4 hrs ago0x2aa2be586dea82f44a989c79cf78acbc8b2f4776 IN  0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f0 MATIC0.00246771
0x1a550b9c860be9eda8e75f27ebbcec317f3ecb7262c7a301633254e157197dadGet Reward218226912021-11-26 13:03:302 days 7 hrs ago0xd1d725a35cf1a0267fab9ebdfc22bb18528f49c7 IN  0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f0 MATIC0.00210171
0x971e98c48507bccfc1f235cdd6ac20cd657e7c3417b1e1cb39010a833dbd933cGet Reward218102802021-11-26 5:10:432 days 14 hrs ago0xb88d5496411b41e69ac7e49b013a5da6447acce6 IN  0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f0 MATIC0.00261471
0x273d53bfc60d6dafb309606758f9cccef9f97df83f0e9edf6325bf82c408115bGet Reward218065942021-11-26 2:44:162 days 17 hrs ago0xcac2edcd082628ba3ba31b3b74537792550319e6 IN  0xdef7f3f6a940a9d2a01814b74b3e545dd364a02f0 MATIC0.00246771
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

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

Contract Name:
StakingRewards

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

pragma solidity ^0.5.16;

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


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

    function rewardPerTokenA() external view returns (uint256);
    function rewardPerTokenB() external view returns (uint256);

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

    function earnedB(address account) external view returns (uint256);
    function getRewardAForDuration() external view returns (uint256);

    function getRewardBForDuration() 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;
}


// https://docs.synthetix.io/contracts/source/contracts/owned
contract Owned {
    address public owner;
    address public nominatedOwner;

    constructor(address _owner) public {
        require(_owner != address(0), "Owner address cannot be 0");
        owner = _owner;
        emit OwnerChanged(address(0), _owner);
    }

    function nominateNewOwner(address _owner) external onlyOwner {
        nominatedOwner = _owner;
        emit OwnerNominated(_owner);
    }

    function acceptOwnership() external {
        require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership");
        emit OwnerChanged(owner, nominatedOwner);
        owner = nominatedOwner;
        nominatedOwner = address(0);
    }

    modifier onlyOwner {
        _onlyOwner();
        _;
    }

    function _onlyOwner() private view {
        require(msg.sender == owner, "Only the contract owner may perform this action");
    }

    event OwnerNominated(address newOwner);
    event OwnerChanged(address oldOwner, address newOwner);
}


// Inheritance


contract DualRewardsDistributionRecipient is Owned {
    address public dualRewardsDistribution;

    function notifyRewardAmount(uint256 rewardA, uint256 rewardB) external;

    modifier onlyDualRewardsDistribution() {
        require(msg.sender == dualRewardsDistribution, "Caller is not DualRewardsDistribution contract");
        _;
    }

    function setDualRewardsDistribution(address _dualRewardsDistribution) external onlyOwner {
        dualRewardsDistribution = _dualRewardsDistribution;
    }
}


// Inheritance


// https://docs.synthetix.io/contracts/source/contracts/pausable
contract Pausable is Owned {
    uint public lastPauseTime;
    bool public paused;

    constructor() internal {
        // This contract is abstract, and thus cannot be instantiated directly
        require(owner != address(0), "Owner must be set");
        // Paused will be false, and lastPauseTime will be 0 upon initialisation
    }

    /**
     * @notice Change the paused state of the contract
     * @dev Only the contract owner may call this.
     */
    function setPaused(bool _paused) external onlyOwner {
        // Ensure we're actually changing the state before we do anything
        if (_paused == paused) {
            return;
        }

        // Set our paused state.
        paused = _paused;

        // If applicable, set the last pause time.
        if (paused) {
            lastPauseTime = now;
        }

        // Let everyone know that our pause state has changed.
        emit PauseChanged(paused);
    }

    event PauseChanged(bool isPaused);

    modifier notPaused {
        require(!paused, "This action cannot be performed while the contract is paused");
        _;
    }
}

/* import "openzeppelin-solidity-2.3.0/contracts/math/Math.sol";
import "openzeppelin-solidity-2.3.0/contracts/math/SafeMath.sol";
import "openzeppelin-solidity-2.3.0/contracts/token/ERC20/ERC20Detailed.sol";
import "openzeppelin-solidity-2.3.0/contracts/token/ERC20/SafeERC20.sol";
import "openzeppelin-solidity-2.3.0/contracts/utils/ReentrancyGuard.sol"; */

// Inheritance
/* import "./interfaces/IStakingRewards.sol";
import "./RewardsDistributionRecipient.sol";
import "./Pausable.sol"; */

// https://docs.synthetix.io/contracts/source/interfaces/istakingrewards
interface IStakingRewards {
    // Views
    function lastTimeRewardApplicable() external view returns (uint256);

    function rewardPerToken() external view returns (uint256);

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

    function getRewardForDuration() external view returns (uint256);

    function totalSupply() external view returns (uint256);

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

    // Mutative

    function stake(uint256 amount) external;

    function withdraw(uint256 amount) external;

    function getReward() external;

    function exit() external;
}

contract RewardsDistributionRecipient is Owned {
    address public rewardsDistribution;

    function notifyRewardAmount(uint256 reward) external;

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

    function setRewardsDistribution(address _rewardsDistribution) external onlyOwner {
        rewardsDistribution = _rewardsDistribution;
    }
}

// https://docs.synthetix.io/contracts/source/contracts/stakingrewards
contract StakingRewards is IStakingRewards, RewardsDistributionRecipient, ReentrancyGuard, Pausable {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

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

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

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

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

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

    constructor(
        address _owner,
        address _rewardsDistribution,
        address _rewardsToken,
        address _stakingToken
    ) public Owned(_owner) {
        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]);
    }

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

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

    function stake(uint256 amount) external nonReentrant notPaused 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) external onlyRewardsDistribution updateReward(address(0)) {
        if (block.timestamp >= periodFinish) {
            rewardRate = reward.div(rewardsDuration);
        } else {
            uint256 remaining = periodFinish.sub(block.timestamp);
            uint256 leftover = remaining.mul(rewardRate);
            rewardRate = reward.add(leftover).div(rewardsDuration);
        }

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

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

    // Added to support recovering LP Rewards from other systems such as BAL to be distributed to holders
    function recoverERC20(address tokenAddress, uint256 tokenAmount) external onlyOwner {
        require(tokenAddress != address(stakingToken), "Cannot withdraw the staking token");
        IERC20(tokenAddress).safeTransfer(owner, tokenAmount);
        emit Recovered(tokenAddress, tokenAmount);
    }

    function setRewardsDuration(uint256 _rewardsDuration) external onlyOwner {
        require(
            block.timestamp > periodFinish,
            "Previous rewards period must be complete before changing the duration for the new period"
        );
        rewardsDuration = _rewardsDuration;
        emit RewardsDurationUpdated(rewardsDuration);
    }

    /* ========== 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);
    event Staked(address indexed user, uint256 amount);
    event Withdrawn(address indexed user, uint256 amount);
    event RewardPaid(address indexed user, uint256 reward);
    event RewardsDurationUpdated(uint256 newDuration);
    event Recovered(address token, uint256 amount);
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"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":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isPaused","type":"bool"}],"name":"PauseChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Recovered","type":"event"},{"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":false,"internalType":"uint256","name":"newDuration","type":"uint256"}],"name":"RewardsDurationUpdated","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":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"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":"getRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastPauseTime","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":true,"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"nominateNewOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","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":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"rewardsDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rewardsDistribution","type":"address"}],"name":"setRewardsDistribution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_rewardsDuration","type":"uint256"}],"name":"setRewardsDuration","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","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"}]

60806040526000600755600060085562093a8060095534801561002157600080fd5b50604051612b36380380612b368339818101604052608081101561004457600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919050505083600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610117576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f776e657220616464726573732063616e6e6f7420626520300000000000000081525060200191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c600082604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1506001600381905550600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156102bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4f776e6572206d7573742062652073657400000000000000000000000000000081525060200191505060405180910390fd5b81600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050506127a4806103926000396000f3fe608060405234801561001057600080fd5b50600436106101e45760003560e01c806372f702f31161010f578063a694fc3a116100a2578063d1af0c7d11610071578063d1af0c7d14610755578063df136d651461079f578063e9fad8ee146107bd578063ebe2b12b146107c7576101e4565b8063a694fc3a146106bd578063c8f33c91146106eb578063cc1a378f14610709578063cd3daf9d14610737576101e4565b80638980f11f116100de5780638980f11f146105af5780638b876347146105fd5780638da5cb5b1461065557806391b4ded91461069f576101e4565b806372f702f31461051f57806379ba5097146105695780637b0a47ee1461057357806380faa57d14610591576101e4565b80632e1a7d4d116101875780633fc6df6e116101565780633fc6df6e1461041157806353a47bb71461045b5780635c975abb146104a557806370a08231146104c7576101e4565b80632e1a7d4d1461038d578063386a9525146103bb5780633c6b16ab146103d95780633d18b91214610407576101e4565b806316c38b3c116101c357806316c38b3c146102dd57806318160ddd1461030d578063197621431461032b5780631c1f78eb1461036f576101e4565b80628cc262146101e95780630700037d146102415780631627540c14610299575b600080fd5b61022b600480360360208110156101ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506107e5565b6040518082815260200191505060405180910390f35b6102836004803603602081101561025757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610903565b6040518082815260200191505060405180910390f35b6102db600480360360208110156102af57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061091b565b005b61030b600480360360208110156102f357600080fd5b810190808035151590602001909291905050506109ca565b005b610315610a77565b6040518082815260200191505060405180910390f35b61036d6004803603602081101561034157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a81565b005b610377610acd565b6040518082815260200191505060405180910390f35b6103b9600480360360208110156103a357600080fd5b8101908080359060200190929190505050610aeb565b005b6103c3610e24565b6040518082815260200191505060405180910390f35b610405600480360360208110156103ef57600080fd5b8101908080359060200190929190505050610e2a565b005b61040f611208565b005b6104196114ae565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104636114d4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104ad6114fa565b604051808215151515815260200191505060405180910390f35b610509600480360360208110156104dd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061150d565b6040518082815260200191505060405180910390f35b610527611556565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61057161157c565b005b61057b6117a2565b6040518082815260200191505060405180910390f35b6105996117a8565b6040518082815260200191505060405180910390f35b6105fb600480360360408110156105c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117bb565b005b61063f6004803603602081101561061357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611925565b6040518082815260200191505060405180910390f35b61065d61193d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106a7611962565b6040518082815260200191505060405180910390f35b6106e9600480360360208110156106d357600080fd5b8101908080359060200190929190505050611968565b005b6106f3611d09565b6040518082815260200191505060405180910390f35b6107356004803603602081101561071f57600080fd5b8101908080359060200190929190505050611d0f565b005b61073f611db4565b6040518082815260200191505060405180910390f35b61075d611e42565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107a7611e68565b6040518082815260200191505060405180910390f35b6107c5611e6e565b005b6107cf611ec0565b6040518082815260200191505060405180910390f35b60006108fc600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546108ee670de0b6b3a76400006108e0610892600c60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610884611db4565b611ec690919063ffffffff16565b600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f4f90919063ffffffff16565b611fd590919063ffffffff16565b61206490919063ffffffff16565b9050919050565b600d6020528060005260406000206000915090505481565b6109236120ec565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2281604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b6109d26120ec565b600560009054906101000a900460ff16151581151514156109f257610a74565b80600560006101000a81548160ff021916908315150217905550600560009054906101000a900460ff1615610a2957426004819055505b7f8fb6c181ee25a520cf3dd6565006ef91229fcfe5a989566c2a3b8c115570cec5600560009054906101000a900460ff16604051808215151515815260200191505060405180910390a15b50565b6000600e54905090565b610a896120ec565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610ae6600954600854611f4f90919063ffffffff16565b905090565b60016003600082825401925050819055506000600354905033610b0c611db4565b600b81905550610b1a6117a8565b600a81905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610be757610b5d816107e5565b600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600b54600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60008311610c5d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f43616e6e6f74207769746864726177203000000000000000000000000000000081525060200191505060405180910390fd5b610c7283600e54611ec690919063ffffffff16565b600e81905550610cca83600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ec690919063ffffffff16565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610d5a3384600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166121939092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5846040518082815260200191505060405180910390a2506003548114610e20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b60095481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ed0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806126fb602a913960400191505060405180910390fd5b6000610eda611db4565b600b81905550610ee86117a8565b600a81905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fb557610f2b816107e5565b600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600b54600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6007544210610fde57610fd360095483611fd590919063ffffffff16565b600881905550611040565b6000610ff542600754611ec690919063ffffffff16565b9050600061100e60085483611f4f90919063ffffffff16565b9050611037600954611029838761206490919063ffffffff16565b611fd590919063ffffffff16565b60088190555050505b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156110e157600080fd5b505afa1580156110f5573d6000803e3d6000fd5b505050506040513d602081101561110b57600080fd5b8101908080519060200190929190505050905061113360095482611fd590919063ffffffff16565b60085411156111aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f50726f76696465642072657761726420746f6f2068696768000000000000000081525060200191505060405180910390fd5b42600a819055506111c66009544261206490919063ffffffff16565b6007819055507fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d836040518082815260200191505060405180910390a1505050565b60016003600082825401925050819055506000600354905033611229611db4565b600b819055506112376117a8565b600a81905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146113045761127a816107e5565b600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600b54600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811115611432576000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113e33382600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166121939092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486826040518082815260200191505060405180910390a25b505060035481146114ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900460ff1681565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603581526020018061263a6035913960400191505060405180910390fd5b7fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60085481565b60006117b642600754612264565b905090565b6117c36120ec565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561186a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061274f6021913960400191505060405180910390fd5b6118b66000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff166121939092919063ffffffff16565b7f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa288282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b600c6020528060005260406000206000915090505481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60045481565b600160036000828254019250508190555060006003549050600560009054906101000a900460ff16156119e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806126bf603c913960400191505060405180910390fd5b336119ef611db4565b600b819055506119fd6117a8565b600a81905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611aca57611a40816107e5565b600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600b54600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60008311611b40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f43616e6e6f74207374616b65203000000000000000000000000000000000000081525060200191505060405180910390fd5b611b5583600e5461206490919063ffffffff16565b600e81905550611bad83600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461206490919063ffffffff16565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611c3f333085600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661227d909392919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d846040518082815260200191505060405180910390a2506003548114611d05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b600a5481565b611d176120ec565b6007544211611d71576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260588152602001806125e26058913960600191505060405180910390fd5b806009819055507ffb46ca5a5e06d4540d6387b930a7c978bce0db5f449ec6b3f5d07c6e1d44f2d36009546040518082815260200191505060405180910390a150565b600080600e541415611dca57600b549050611e3f565b611e3c611e2b600e54611e1d670de0b6b3a7640000611e0f600854611e01600a54611df36117a8565b611ec690919063ffffffff16565b611f4f90919063ffffffff16565b611f4f90919063ffffffff16565b611fd590919063ffffffff16565b600b5461206490919063ffffffff16565b90505b90565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b611eb6600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610aeb565b611ebe611208565b565b60075481565b600082821115611f3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b600082840390508091505092915050565b600080831415611f625760009050611fcf565b6000828402905082848281611f7357fe5b0414611fca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061269e6021913960400191505060405180910390fd5b809150505b92915050565b600080821161204c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b600082848161205757fe5b0490508091505092915050565b6000808284019050838110156120e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612191576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061266f602f913960400191505060405180910390fd5b565b61225f838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb905060e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612383565b505050565b60008183106122735781612275565b825b905092915050565b61237d848573ffffffffffffffffffffffffffffffffffffffff166323b872dd905060e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612383565b50505050565b6123a28273ffffffffffffffffffffffffffffffffffffffff166125ce565b612414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b602083106124635780518252602082019150602081019050602083039250612440565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146124c5576040519150601f19603f3d011682016040523d82523d6000602084013e6124ca565b606091505b509150915081612542576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b6000815111156125c85780806020019051602081101561256157600080fd5b81019080805190602001909291905050506125c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612725602a913960400191505060405180910390fd5b5b50505050565b600080823b90506000811191505091905056fe50726576696f7573207265776172647320706572696f64206d75737420626520636f6d706c657465206265666f7265206368616e67696e6720746865206475726174696f6e20666f7220746865206e657720706572696f64596f75206d757374206265206e6f6d696e61746564206265666f726520796f752063616e20616363657074206f776e6572736869704f6e6c792074686520636f6e7472616374206f776e6572206d617920706572666f726d207468697320616374696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775468697320616374696f6e2063616e6e6f7420626520706572666f726d6564207768696c652074686520636f6e74726163742069732070617573656443616c6c6572206973206e6f742052657761726473446973747269627574696f6e20636f6e74726163745361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656443616e6e6f7420776974686472617720746865207374616b696e6720746f6b656ea265627a7a72315820ecfa5dde9d04624140bfd03184997333f7a4ec77001560393cb3845903758e1264736f6c63430005100032000000000000000000000000f5b3944629f9303fa94670b2a6611ee1b11cd538000000000000000000000000f5b3944629f9303fa94670b2a6611ee1b11cd538000000000000000000000000df7837de1f2fa4631d716cf2502f8b230f1dcc32000000000000000000000000addc9c73f3cbad4e647eaff691715898825ac20c

Deployed ByteCode Sourcemap

20427:6055:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20427:6055:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22240:198;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22240:198:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20983:42;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20983:42:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16110:141;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16110:141:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;17969:488;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17969:488:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;21542:93;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20206:142;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20206:142:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;22446:121;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23016:357;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23016:357:0;;;;;;;;;;;;;;;;;:::i;:::-;;20793:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23857:1083;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23857:1083:0;;;;;;;;;;;;;;;;;:::i;:::-;;23381:307;;;:::i;:::-;;19940:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;15879:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17555:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;21643:112;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21643:112:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20686:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16259:271;;;:::i;:::-;;20757:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21763:131;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25055:302;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25055:302:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20919:57;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20919:57:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15852:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17523:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22629:379;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22629:379:0;;;;;;;;;;;;;;;;;:::i;:::-;;20839:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25365:360;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25365:360:0;;;;;;;;;;;;;;;;;:::i;:::-;;21902:330;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20653:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;20875:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23696:97;;;:::i;:::-;;20719:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22240:198;22294:7;22321:109;22413:7;:16;22421:7;22413:16;;;;;;;;;;;;;;;;22321:87;22403:4;22321:77;22344:53;22365:22;:31;22388:7;22365:31;;;;;;;;;;;;;;;;22344:16;:14;:16::i;:::-;:20;;:53;;;;:::i;:::-;22321:9;:18;22331:7;22321:18;;;;;;;;;;;;;;;;:22;;:77;;;;:::i;:::-;:81;;:87;;;;:::i;:::-;:91;;:109;;;;:::i;:::-;22314:116;;22240:198;;;:::o;20983:42::-;;;;;;;;;;;;;;;;;:::o;16110:141::-;16568:12;:10;:12::i;:::-;16199:6;16182:14;;:23;;;;;;;;;;;;;;;;;;16221:22;16236:6;16221:22;;;;;;;;;;;;;;;;;;;;;;16110:141;:::o;17969:488::-;16568:12;:10;:12::i;:::-;18122:6;;;;;;;;;;;18111:17;;:7;:17;;;18107:56;;;18145:7;;18107:56;18218:7;18209:6;;:16;;;;;;;;;;;;;;;;;;18294:6;;;;;;;;;;;18290:58;;;18333:3;18317:13;:19;;;;18290:58;18429:20;18442:6;;;;;;;;;;;18429:20;;;;;;;;;;;;;;;;;;;;;;16591:1;17969:488;:::o;21542:93::-;21588:7;21615:12;;21608:19;;21542:93;:::o;20206:142::-;16568:12;:10;:12::i;:::-;20320:20;20298:19;;:42;;;;;;;;;;;;;;;;;;20206:142;:::o;22446:121::-;22501:7;22528:31;22543:15;;22528:10;;:14;;:31;;;;:::i;:::-;22521:38;;22446:121;:::o;23016:357::-;14728:1;14711:13;;:18;;;;;;;;;;;14740:20;14763:13;;14740:36;;23083:10;25851:16;:14;:16::i;:::-;25828:20;:39;;;;25895:26;:24;:26::i;:::-;25878:14;:43;;;;25955:1;25936:21;;:7;:21;;;25932:157;;25993:15;26000:7;25993:6;:15::i;:::-;25974:7;:16;25982:7;25974:16;;;;;;;;;;;;;;;:34;;;;26057:20;;26023:22;:31;26046:7;26023:31;;;;;;;;;;;;;;;:54;;;;25932:157;23123:1;23114:6;:10;23106:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23172:24;23189:6;23172:12;;:16;;:24;;;;:::i;:::-;23157:12;:39;;;;23231:33;23257:6;23231:9;:21;23241:10;23231:21;;;;;;;;;;;;;;;;:25;;:33;;;;:::i;:::-;23207:9;:21;23217:10;23207:21;;;;;;;;;;;;;;;:57;;;;23275:45;23301:10;23313:6;23275:12;;;;;;;;;;;:25;;;;:45;;;;;:::i;:::-;23346:10;23336:29;;;23358:6;23336:29;;;;;;;;;;;;;;;;;;14787:1;14823:13;;14807:12;:29;14799:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23016:357;;:::o;20793:39::-;;;;:::o;23857:1083::-;20112:19;;;;;;;;;;;20098:33;;:10;:33;;;20090:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23955:1;25851:16;:14;:16::i;:::-;25828:20;:39;;;;25895:26;:24;:26::i;:::-;25878:14;:43;;;;25955:1;25936:21;;:7;:21;;;25932:157;;25993:15;26000:7;25993:6;:15::i;:::-;25974:7;:16;25982:7;25974:16;;;;;;;;;;;;;;;:34;;;;26057:20;;26023:22;:31;26046:7;26023:31;;;;;;;;;;;;;;;:54;;;;25932:157;23993:12;;23974:15;:31;23970:318;;24035:27;24046:15;;24035:6;:10;;:27;;;;:::i;:::-;24022:10;:40;;;;23970:318;;;24095:17;24115:33;24132:15;24115:12;;:16;;:33;;;;:::i;:::-;24095:53;;24163:16;24182:25;24196:10;;24182:9;:13;;:25;;;;:::i;:::-;24163:44;;24235:41;24260:15;;24235:20;24246:8;24235:6;:10;;:20;;;;:::i;:::-;:24;;:41;;;;:::i;:::-;24222:10;:54;;;;23970:318;;;24648:12;24663;;;;;;;;;;;:22;;;24694:4;24663:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24663:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24663:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24663:37:0;;;;;;;;;;;;;;;;24648:52;;24733:28;24745:15;;24733:7;:11;;:28;;;;:::i;:::-;24719:10;;:42;;24711:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24820:15;24803:14;:32;;;;24861:36;24881:15;;24861;:19;;:36;;;;:::i;:::-;24846:12;:51;;;;24913:19;24925:6;24913:19;;;;;;;;;;;;;;;;;;26099:1;20189;23857:1083;:::o;23381:307::-;14728:1;14711:13;;:18;;;;;;;;;;;14740:20;14763:13;;14740:36;;23435:10;25851:16;:14;:16::i;:::-;25828:20;:39;;;;25895:26;:24;:26::i;:::-;25878:14;:43;;;;25955:1;25936:21;;:7;:21;;;25932:157;;25993:15;26000:7;25993:6;:15::i;:::-;25974:7;:16;25982:7;25974:16;;;;;;;;;;;;;;;:34;;;;26057:20;;26023:22;:31;26046:7;26023:31;;;;;;;;;;;;;;;:54;;;;25932:157;23458:14;23475:7;:19;23483:10;23475:19;;;;;;;;;;;;;;;;23458:36;;23518:1;23509:6;:10;23505:176;;;23558:1;23536:7;:19;23544:10;23536:19;;;;;;;;;;;;;;;:23;;;;23574:45;23600:10;23612:6;23574:12;;;;;;;;;;;:25;;;;:45;;;;;:::i;:::-;23650:10;23639:30;;;23662:6;23639:30;;;;;;;;;;;;;;;;;;23505:176;26099:1;14787;14823:13;;14807:12;:29;14799:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23381:307;:::o;19940:34::-;;;;;;;;;;;;;:::o;15879:29::-;;;;;;;;;;;;;:::o;17555:18::-;;;;;;;;;;;;;:::o;21643:112::-;21702:7;21729:9;:18;21739:7;21729:18;;;;;;;;;;;;;;;;21722:25;;21643:112;;;:::o;20686:26::-;;;;;;;;;;;;;:::o;16259:271::-;16328:14;;;;;;;;;;;16314:28;;:10;:28;;;16306:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16416:35;16429:5;;;;;;;;;;;16436:14;;;;;;;;;;;16416:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16470:14;;;;;;;;;;;16462:5;;:22;;;;;;;;;;;;;;;;;;16520:1;16495:14;;:27;;;;;;;;;;;;;;;;;;16259:271::o;20757:29::-;;;;:::o;21763:131::-;21820:7;21847:39;21856:15;21873:12;;21847:8;:39::i;:::-;21840:46;;21763:131;:::o;25055:302::-;16568:12;:10;:12::i;:::-;25182;;;;;;;;;;;25158:37;;:12;:37;;;;25150:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25244:53;25278:5;;;;;;;;;;;25285:11;25251:12;25244:33;;;;:53;;;;;:::i;:::-;25313:36;25323:12;25337:11;25313:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;25055:302;;:::o;20919:57::-;;;;;;;;;;;;;;;;;:::o;15852:20::-;;;;;;;;;;;;;:::o;17523:25::-;;;;:::o;22629:379::-;14728:1;14711:13;;:18;;;;;;;;;;;14740:20;14763:13;;14740:36;;18546:6;;;;;;;;;;;18545:7;18537:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22705:10;25851:16;:14;:16::i;:::-;25828:20;:39;;;;25895:26;:24;:26::i;:::-;25878:14;:43;;;;25955:1;25936:21;;:7;:21;;;25932:157;;25993:15;26000:7;25993:6;:15::i;:::-;25974:7;:16;25982:7;25974:16;;;;;;;;;;;;;;;:34;;;;26057:20;;26023:22;:31;26046:7;26023:31;;;;;;;;;;;;;;;:54;;;;25932:157;22745:1;22736:6;:10;22728:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22791:24;22808:6;22791:12;;:16;;:24;;;;:::i;:::-;22776:12;:39;;;;22850:33;22876:6;22850:9;:21;22860:10;22850:21;;;;;;;;;;;;;;;;:25;;:33;;;;:::i;:::-;22826:9;:21;22836:10;22826:21;;;;;;;;;;;;;;;:57;;;;22894:64;22924:10;22944:4;22951:6;22894:12;;;;;;;;;;;:29;;;;:64;;;;;;:::i;:::-;22981:10;22974:26;;;22993:6;22974:26;;;;;;;;;;;;;;;;;;18628:1;14823:13;;14807:12;:29;14799:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22629:379;;:::o;20839:29::-;;;;:::o;25365:360::-;16568:12;:10;:12::i;:::-;25489;;25471:15;:30;25449:168;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25646:16;25628:15;:34;;;;25678:39;25701:15;;25678:39;;;;;;;;;;;;;;;;;;25365:360;:::o;21902:330::-;21949:7;21989:1;21973:12;;:17;21969:77;;;22014:20;;22007:27;;;;21969:77;22076:148;22119:90;22196:12;;22119:72;22186:4;22119:62;22170:10;;22119:46;22150:14;;22119:26;:24;:26::i;:::-;:30;;:46;;;;:::i;:::-;:50;;:62;;;;:::i;:::-;:66;;:72;;;;:::i;:::-;:76;;:90;;;;:::i;:::-;22076:20;;:24;;:148;;;;:::i;:::-;22056:168;;21902:330;;:::o;20653:26::-;;;;;;;;;;;;;:::o;20875:35::-;;;;:::o;23696:97::-;23732:31;23741:9;:21;23751:10;23741:21;;;;;;;;;;;;;;;;23732:8;:31::i;:::-;23774:11;:9;:11::i;:::-;23696:97::o;20719:31::-;;;;:::o;2090:184::-;2148:7;2181:1;2176;:6;;2168:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2228:9;2244:1;2240;:5;2228:17;;2265:1;2258:8;;;2090:184;;;;:::o;2525:470::-;2583:7;2832:1;2827;:6;2823:47;;;2857:1;2850:8;;;;2823:47;2882:9;2898:1;2894;:5;2882:17;;2927:1;2922;2918;:5;;;;;;:10;2910:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2986:1;2979:8;;;2525:470;;;;;:::o;3463:333::-;3521:7;3620:1;3616;:5;3608:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3663:9;3679:1;3675;:5;;;;;;3663:17;;3787:1;3780:8;;;3463:333;;;;:::o;1634:181::-;1692:7;1712:9;1728:1;1724;:5;1712:17;;1753:1;1748;:6;;1740:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1806:1;1799:8;;;1634:181;;;;:::o;16608:133::-;16676:5;;;;;;;;;;;16662:19;;:10;:19;;;16654:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16608:133::o;10288:176::-;10371:85;10390:5;10420;:14;;;:23;;;;10445:2;10449:5;10397:58;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;10397:58:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;10397:58:0;10371:18;:85::i;:::-;10288:176;;;:::o;375:106::-;433:7;464:1;460;:5;:13;;472:1;460:13;;;468:1;460:13;453:20;;375:106;;;;:::o;10472:204::-;10573:95;10592:5;10622;:18;;;:27;;;;10651:4;10657:2;10661:5;10599:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;10599:68:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;10599:68:0;10573:18;:95::i;:::-;10472:204;;;;:::o;12282:1114::-;12886:27;12894:5;12886:25;;;:27::i;:::-;12878:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13023:12;13037:23;13072:5;13064:19;;13084:4;13064:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;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;;;13064: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;;13022:67:0;;;;13108:7;13100:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13189:1;13169:10;:17;:21;13165:224;;;13311:10;13300:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13300:30:0;;;;;;;;;;;;;;;;13292:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13165:224;12282:1114;;;;:::o;9299:422::-;9359:4;9567:12;9678:7;9666:20;9658:28;;9712:1;9705:4;:8;9698:15;;;9299:422;;;:::o

Swarm Source

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