ETH Price: $2,332.54 (-0.50%)

Contract

0xF5d49387EcFA36bD2BF047d9E72344A2b3afBB72
 

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer204533702024-08-04 6:23:2338 days ago1722752603IN
0xF5d49387...2b3afBB72
0 ETH0.000061
Transfer178960392023-08-12 3:15:59396 days ago1691810159IN
0xF5d49387...2b3afBB72
0 ETH0.0002455111.69127444
Transfer155593412022-09-18 8:47:59723 days ago1663490879IN
0xF5d49387...2b3afBB72
0 ETH0.000199842
Transfer143462972022-03-08 12:48:41917 days ago1646743721IN
0xF5d49387...2b3afBB72
0 ETH0.0004476521.31688584
Transfer141528012022-02-06 13:30:07947 days ago1644154207IN
0xF5d49387...2b3afBB72
0 ETH0.0053449159.51292588
Transfer129264972021-07-30 10:41:141138 days ago1627641674IN
0xF5d49387...2b3afBB72
0 ETH0.002151325
Withdraw129201772021-07-29 10:21:191139 days ago1627554079IN
0xF5d49387...2b3afBB72
0 ETH0.0026508622
Transfer128727822021-07-21 23:33:521147 days ago1626910432IN
0xF5d49387...2b3afBB72
0 ETH0.0012025210
Transfer127147772021-06-27 7:28:231171 days ago1624778903IN
0xF5d49387...2b3afBB72
0 ETH0.000351753.74000014
Transfer126639112021-06-19 9:06:571179 days ago1624093617IN
0xF5d49387...2b3afBB72
0 ETH0.0008605210
Transfer126370422021-06-15 4:59:521184 days ago1623733192IN
0xF5d49387...2b3afBB72
0 ETH0.0003048311
Transfer126090832021-06-10 20:55:201188 days ago1623358520IN
0xF5d49387...2b3afBB72
0 ETH0.000688418
Transfer126045972021-06-10 4:26:551189 days ago1623299215IN
0xF5d49387...2b3afBB72
0 ETH0.000846469
Withdraw126033252021-06-09 23:39:111189 days ago1623281951IN
0xF5d49387...2b3afBB72
0 ETH0.0012407212
Whitelist126033062021-06-09 23:35:521189 days ago1623281752IN
0xF5d49387...2b3afBB72
0 ETH0.0003174613
Transfer125883542021-06-07 16:02:091191 days ago1623081729IN
0xF5d49387...2b3afBB72
0 ETH0.0003879614
Transfer125802302021-06-06 9:50:571192 days ago1622973057IN
0xF5d49387...2b3afBB72
0 ETH0.0010885910
Transfer125676382021-06-04 11:18:251194 days ago1622805505IN
0xF5d49387...2b3afBB72
0 ETH0.0015988515.5
Transfer125675602021-06-04 11:00:491194 days ago1622804449IN
0xF5d49387...2b3afBB72
0 ETH0.0018085718.1
Transfer125674112021-06-04 10:26:161194 days ago1622802376IN
0xF5d49387...2b3afBB72
0 ETH0.000317115.1
Transfer125670682021-06-04 9:05:331194 days ago1622797533IN
0xF5d49387...2b3afBB72
0 ETH0.00035717
Transfer125417612021-05-31 11:05:381198 days ago1622459138IN
0xF5d49387...2b3afBB72
0 ETH0.00031515
Transfer125377942021-05-30 20:17:581199 days ago1622405878IN
0xF5d49387...2b3afBB72
0 ETH0.0008025115
Transfer125280982021-05-29 8:13:291200 days ago1622276009IN
0xF5d49387...2b3afBB72
0 ETH0.0018759820
Transfer123938592021-05-08 13:10:471221 days ago1620479447IN
0xF5d49387...2b3afBB72
0 ETH0.00231110
View all transactions

Latest 4 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
104923632020-07-19 21:28:511514 days ago1595194131
0xF5d49387...2b3afBB72
0.00004839 ETH
94986742020-02-17 5:09:371668 days ago1581916177
0xF5d49387...2b3afBB72
0.0720536 ETH
81686512019-07-17 13:54:221882 days ago1563371662
0xF5d49387...2b3afBB72
0.00058696 ETH
80722662019-07-02 13:14:261897 days ago1562073266
0xF5d49387...2b3afBB72
0.00001 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Rewards

Compiler Version
v0.5.4+commit.9549d8ff

Optimization Enabled:
Yes with 200 runs

Other Settings:
byzantium EvmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-06-12
*/

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

pragma solidity ^0.5.2;

/**
 * @title SafeMath
 * @dev Unsigned math operations with safety checks that revert on error
 */
library SafeMath {
    /**
     * @dev Multiplies two unsigned integers, reverts on 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);

        return c;
    }

    /**
     * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Adds two unsigned integers, reverts on overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

    /**
     * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
     * reverts when dividing by zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}

// File: openzeppelin-solidity/contracts/access/Roles.sol

pragma solidity ^0.5.2;

/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    /**
     * @dev give an account access to this role
     */
    function add(Role storage role, address account) internal {
        require(account != address(0));
        require(!has(role, account));

        role.bearer[account] = true;
    }

    /**
     * @dev remove an account's access to this role
     */
    function remove(Role storage role, address account) internal {
        require(account != address(0));
        require(has(role, account));

        role.bearer[account] = false;
    }

    /**
     * @dev check if an account has this role
     * @return bool
     */
    function has(Role storage role, address account) internal view returns (bool) {
        require(account != address(0));
        return role.bearer[account];
    }
}

// File: openzeppelin-solidity/contracts/access/roles/PauserRole.sol

pragma solidity ^0.5.2;


contract PauserRole {
    using Roles for Roles.Role;

    event PauserAdded(address indexed account);
    event PauserRemoved(address indexed account);

    Roles.Role private _pausers;

    constructor () internal {
        _addPauser(msg.sender);
    }

    modifier onlyPauser() {
        require(isPauser(msg.sender));
        _;
    }

    function isPauser(address account) public view returns (bool) {
        return _pausers.has(account);
    }

    function addPauser(address account) public onlyPauser {
        _addPauser(account);
    }

    function renouncePauser() public {
        _removePauser(msg.sender);
    }

    function _addPauser(address account) internal {
        _pausers.add(account);
        emit PauserAdded(account);
    }

    function _removePauser(address account) internal {
        _pausers.remove(account);
        emit PauserRemoved(account);
    }
}

// File: openzeppelin-solidity/contracts/lifecycle/Pausable.sol

pragma solidity ^0.5.2;


/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is PauserRole {
    event Paused(address account);
    event Unpaused(address account);

    bool private _paused;

    constructor () internal {
        _paused = false;
    }

    /**
     * @return true if the contract is paused, false otherwise.
     */
    function paused() public view returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     */
    modifier whenNotPaused() {
        require(!_paused);
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     */
    modifier whenPaused() {
        require(_paused);
        _;
    }

    /**
     * @dev called by the owner to pause, triggers stopped state
     */
    function pause() public onlyPauser whenNotPaused {
        _paused = true;
        emit Paused(msg.sender);
    }

    /**
     * @dev called by the owner to unpause, returns to normal state
     */
    function unpause() public onlyPauser whenPaused {
        _paused = false;
        emit Unpaused(msg.sender);
    }
}

// File: openzeppelin-solidity/contracts/ownership/Ownable.sol

pragma solidity ^0.5.2;

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
    address private _owner;

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

    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner());
        _;
    }

    /**
     * @return true if `msg.sender` is the owner of the contract.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    /**
     * @dev Allows the current owner to relinquish control of the contract.
     * It will not be possible to call the functions with the `onlyOwner`
     * modifier anymore.
     * @notice Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0));
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

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

pragma solidity ^0.5.2;

/**
 * @title Helps contracts guard against reentrancy attacks.
 * @author Remco Bloemen <remco@2π.com>, Eenae <[email protected]>
 * @dev If you mark a function `nonReentrant`, you should also
 * mark it `external`.
 */
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);
    }
}

// File: openzeppelin-solidity/contracts/drafts/SignedSafeMath.sol

pragma solidity ^0.5.2;

/**
 * @title SignedSafeMath
 * @dev Signed math operations with safety checks that revert on error
 */
library SignedSafeMath {
    int256 constant private INT256_MIN = -2**255;

    /**
     * @dev Multiplies two signed integers, reverts on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        // 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;
        }

        require(!(a == -1 && b == INT256_MIN)); // This is the only case of overflow not detected by the check below

        int256 c = a * b;
        require(c / a == b);

        return c;
    }

    /**
     * @dev Integer division of two signed integers truncating the quotient, reverts on division by zero.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        require(b != 0); // Solidity only automatically asserts when dividing by 0
        require(!(b == -1 && a == INT256_MIN)); // This is the only case of overflow

        int256 c = a / b;

        return c;
    }

    /**
     * @dev Subtracts two signed integers, reverts on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));

        return c;
    }

    /**
     * @dev Adds two signed integers, reverts on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));

        return c;
    }
}

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

pragma solidity ^0.5.2;

/**
 * @title ERC20 interface
 * @dev see https://eips.ethereum.org/EIPS/eip-20
 */
interface IERC20 {
    function transfer(address to, uint256 value) external returns (bool);

    function approve(address spender, uint256 value) external returns (bool);

    function transferFrom(address from, address to, uint256 value) external returns (bool);

    function totalSupply() external view returns (uint256);

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

    function allowance(address owner, address spender) external view returns (uint256);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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

pragma solidity ^0.5.2;

/**
 * Utility library of inline functions on addresses
 */
library Address {
    /**
     * Returns whether the target address is a contract
     * @dev This function will return false if invoked during the constructor of a contract,
     * as the code is not actually created until after the constructor finishes.
     * @param account address of the account to check
     * @return whether the target address is a contract
     */
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        // XXX Currently there is no better way to check if there is a contract in an address
        // than to check the size of the code at that address.
        // See https://ethereum.stackexchange.com/a/14016/36603
        // for more details about how this works.
        // TODO Check this again before the Serenity release, because all addresses will be
        // contracts then.
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }
}

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

pragma solidity ^0.5.2;




/**
 * @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'
        require((value == 0) || (token.allowance(address(this), spender) == 0));
        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 equal true).
     * @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.

        require(address(token).isContract());

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

        if (returndata.length > 0) { // Return data is optional
            require(abi.decode(returndata, (bool)));
        }
    }
}

// File: contracts/interfaces/IERC1594Capped.sol

pragma solidity 0.5.4;


interface IERC1594Capped {
    function balanceOf(address who) external view returns (uint256);
    function cap() external view returns (uint256);
    function totalRedeemed() external view returns (uint256);
}

// File: contracts/interfaces/IRewards.sol

pragma solidity 0.5.4;


interface IRewards {
    event Deposited(address indexed from, uint amount);
    event Withdrawn(address indexed from, uint amount);
    event Reclaimed(uint amount);

    function deposit(uint amount) external;
    function withdraw() external;
    function reclaimRewards() external;
    function claimedRewards(address payee) external view returns (uint);
    function unclaimedRewards(address payee) external view returns (uint);
    function supply() external view returns (uint);
    function isRunning() external view returns (bool);
}

// File: contracts/interfaces/IRewardsUpdatable.sol

pragma solidity 0.5.4;


interface IRewardsUpdatable {
    event NotifierUpdated(address implementation);

    function updateOnTransfer(address from, address to, uint amount) external returns (bool);
    function updateOnBurn(address account, uint amount) external returns (bool);
    function setRewardsNotifier(address notifier) external;
}

// File: contracts/interfaces/IRewardable.sol

pragma solidity 0.5.4;



interface IRewardable {
    event RewardsUpdated(address implementation);

    function setRewards(IRewardsUpdatable rewards) external;
}

// File: contracts/roles/RewarderRole.sol

pragma solidity 0.5.4;



// @notice Rewarders are capable of managing the Rewards contract and depositing PAY rewards.
contract RewarderRole {
    using Roles for Roles.Role;

    event RewarderAdded(address indexed account);
    event RewarderRemoved(address indexed account);

    Roles.Role internal _rewarders;

    modifier onlyRewarder() {
        require(isRewarder(msg.sender), "Only Rewarders can execute this function.");
        _;
    }

    constructor() internal {
        _addRewarder(msg.sender);
    }    

    function isRewarder(address account) public view returns (bool) {
        return _rewarders.has(account);
    }

    function addRewarder(address account) public onlyRewarder {
        _addRewarder(account);
    }

    function renounceRewarder() public {
        _removeRewarder(msg.sender);
    }
  
    function _addRewarder(address account) internal {
        _rewarders.add(account);
        emit RewarderAdded(account);
    }

    function _removeRewarder(address account) internal {
        _rewarders.remove(account);
        emit RewarderRemoved(account);
    }
}

// File: contracts/roles/ModeratorRole.sol

pragma solidity 0.5.4;



// @notice Moderators are able to modify whitelists and transfer permissions in Moderator contracts.
contract ModeratorRole {
    using Roles for Roles.Role;

    event ModeratorAdded(address indexed account);
    event ModeratorRemoved(address indexed account);

    Roles.Role internal _moderators;

    modifier onlyModerator() {
        require(isModerator(msg.sender), "Only Moderators can execute this function.");
        _;
    }

    constructor() internal {
        _addModerator(msg.sender);
    }

    function isModerator(address account) public view returns (bool) {
        return _moderators.has(account);
    }

    function addModerator(address account) public onlyModerator {
        _addModerator(account);
    }

    function renounceModerator() public {
        _removeModerator(msg.sender);
    }    

    function _addModerator(address account) internal {
        _moderators.add(account);
        emit ModeratorAdded(account);
    }    

    function _removeModerator(address account) internal {
        _moderators.remove(account);
        emit ModeratorRemoved(account);
    }
}

// File: contracts/lib/Whitelistable.sol

pragma solidity 0.5.4;



contract Whitelistable is ModeratorRole {
    event Whitelisted(address account);
    event Unwhitelisted(address account);

    mapping (address => bool) public isWhitelisted;

    modifier onlyWhitelisted(address account) {
        require(isWhitelisted[account], "Account is not whitelisted.");
        _;
    }

    modifier onlyNotWhitelisted(address account) {
        require(!isWhitelisted[account], "Account is whitelisted.");
        _;
    }

    function whitelist(address account) external onlyModerator {
        require(account != address(0), "Cannot whitelist zero address.");
        require(account != msg.sender, "Cannot whitelist self.");
        require(!isWhitelisted[account], "Address already whitelisted.");
        isWhitelisted[account] = true;
        emit Whitelisted(account);
    }

    function unwhitelist(address account) external onlyModerator {
        require(account != address(0), "Cannot unwhitelist zero address.");
        require(account != msg.sender, "Cannot unwhitelist self.");
        require(isWhitelisted[account], "Address not whitelisted.");
        isWhitelisted[account] = false;
        emit Unwhitelisted(account);
    }
}

// File: contracts/rewards/Rewards.sol

pragma solidity 0.5.4;















/**
* @notice This contract determines the amount of rewards each user is entitled to and allows users to withdraw their rewards.
* @dev The rewards (in the form of a 'rewardsToken') are calculated based on a percentage ownership of a 'rewardableToken'.
* The rewards calculation takes into account token movements using a 'damping' factor.
* This contract makes use of pull payments over push payments to avoid DoS vulnerabilities.
*/
contract Rewards is IRewards, IRewardsUpdatable, RewarderRole, Pausable, Ownable, ReentrancyGuard, Whitelistable {
    using SafeERC20 for IERC20;
    using SafeMath for uint;
    using SignedSafeMath for int;

    IERC1594Capped private rewardableToken; // Rewardable tokens gives rewards when held.
    IERC20 private rewardsToken; // Rewards tokens are given out as rewards.
    address private rewardsNotifier; // Contract address where token movements are broadcast from.

    bool public isRunning = true;
    uint public maxShares; // Total TENX cap. Constant amount.
    uint public totalRewards; // The current size of the global pool of PAY rewards. Can decrease because of TENX burning.
    uint public totalDepositedRewards; // Total PAY rewards deposited for users so far. Monotonically increasing.
    uint public totalClaimedRewards; // Amount of rewards claimed by users so far. Monotonically increasing.
    mapping(address => int) private _dampings; // Balancing factor to account for rewardable token movements.
    mapping(address => uint) public claimedRewards; // Claimed PAY rewards per user.

    event Deposited(address indexed from, uint amount);
    event Withdrawn(address indexed from, uint amount);
    event Reclaimed(uint amount);
    event NotifierUpdated(address implementation);

    constructor(IERC1594Capped _rewardableToken, IERC20 _rewardsToken) public {
        uint _cap = _rewardableToken.cap();
        require(_cap != 0, "Shares token cap must be non-zero.");
        maxShares = _cap;
        rewardableToken = _rewardableToken;
        rewardsToken = _rewardsToken;
        rewardsNotifier = address(_rewardableToken);
    }

    /**
    * @notice Modifier to check that functions are only callable by a predefined address.
    */   
    modifier onlyRewardsNotifier() {
        require(msg.sender == rewardsNotifier, "Can only be called by the rewards notifier contract.");
        _;
    }

    /**
    * @notice Modifier to check that the Rewards contract is currently running.
    */
    modifier whenRunning() {
        require(isRunning, "Rewards contract has stopped running.");
        _;
    }

    function () external payable { // Ether fallback function
        require(msg.value == 0, "Received non-zero msg.value.");
        withdraw(); // solhint-disable-line
    }

    /**
    * Releases a specified amount of rewards to all shares token holders.
    * @dev The rewards each user is allocated to receive is calculated dynamically.
    * Note that the contract needs to hold sufficient rewards token balance to disburse rewards.
    * @param _amount Amount of reward tokens to allocate to token holders.
    */
    function deposit(uint _amount) external onlyRewarder whenRunning whenNotPaused {
        require(_amount != 0, "Deposit amount must non-zero.");
        totalDepositedRewards = totalDepositedRewards.add(_amount);
        totalRewards = totalRewards.add(_amount);
        address from = msg.sender;
        emit Deposited(from, _amount);

        rewardsToken.safeTransferFrom(msg.sender, address(this), _amount); // [External contract call to PAYToken]
    }

    /**
    * @notice Links a RewardsNotifier contract to update this contract on token movements.
    * @param _notifier Contract address.
    */
    function setRewardsNotifier(address _notifier) external onlyOwner {
        require(address(_notifier) != address(0), "Rewards address must not be a zero address.");
        require(Address.isContract(address(_notifier)), "Address must point to a contract.");
        rewardsNotifier = _notifier;
        emit NotifierUpdated(_notifier);
    }

    /**
    * @notice Updates a damping factor to account for token transfers in the dynamic rewards calculation.
    * @dev This function adds +X damping to senders and -X damping to recipients, where X is _dampingChange().
    * This function is called in TENXToken `transfer()` and `transferFrom()`.
    * @param _from Sender address
    * @param _to Recipient address
    * @param _value Token movement amount
    */
    function updateOnTransfer(address _from, address _to, uint _value) external onlyRewardsNotifier nonReentrant returns (bool) {
        int fromUserShareChange = int(_value); // <_from> sends their _value to <_to>, change is positive
        int fromDampingChange = _dampingChange(totalShares(), totalRewards, fromUserShareChange);

        int toUserShareChange = int(_value).mul(-1); // <_to> receives _value from <_from>, change is negative
        int toDampingChange = _dampingChange(totalShares(), totalRewards, toUserShareChange);

        assert((fromDampingChange.add(toDampingChange)) == 0);

        _dampings[_from] = damping(_from).add(fromDampingChange);
        _dampings[_to] = damping(_to).add(toDampingChange);
        return true;
    }

    /**
    * @notice Updates a damping factor to account for token butning in the dynamic rewards calculation.
    * @param _account address
    * @param _value Token burn amount
    */
    function updateOnBurn(address _account, uint _value) external onlyRewardsNotifier nonReentrant returns (bool) { 
        uint totalSharesBeforeBurn = totalShares().add(_value); // In Rewardable.sol, this is executed after the burn has deducted totalShares()
        uint redeemableRewards = _value.mul(totalRewards).div(totalSharesBeforeBurn); // Calculate amount of rewards the burned amount is entitled to
        totalRewards = totalRewards.sub(redeemableRewards); // Remove redeemable rewards from the global pool
        _dampings[_account] = damping(_account).add(int(redeemableRewards)); // Only _account is able to withdraw the unclaimed redeemed rewards
        return true;
    }

    /**
    * @notice Emergency fallback to drain the contract's balance of PAY tokens.
    */
    function reclaimRewards() external onlyOwner {
        uint256 balance = rewardsToken.balanceOf(address(this));
        isRunning = false;
        rewardsToken.safeTransfer(owner(), balance);
        emit Reclaimed(balance);
    }

   /**
    * @notice Withdraw your balance of PAY rewards.
    * @dev Only the unclaimed rewards amount can be withdrawn by a user.
    */
    function withdraw() public whenRunning whenNotPaused onlyWhitelisted(msg.sender) nonReentrant {
        address payee = msg.sender;
        uint unclaimedReward = unclaimedRewards(payee);
        require(unclaimedReward > 0, "Unclaimed reward must be non-zero to withdraw.");
        require(supply() >= unclaimedReward, "Rewards contract must have sufficient PAY to disburse.");

        claimedRewards[payee] = claimedRewards[payee].add(unclaimedReward); // Add amount to claimed rewards balance
        totalClaimedRewards = totalClaimedRewards.add(unclaimedReward);
        emit Withdrawn(payee, unclaimedReward);

        // Send PAY reward to payee
        rewardsToken.safeTransfer(payee, unclaimedReward); // [External contract call]
    }

    /**
    * @notice Returns this contract's current reward token supply.
    * @dev The contract must have sufficient PAY allowance to deposit() rewards.
    * @return Total PAY balance of this contract
    */
    function supply() public view returns (uint) {
        return rewardsToken.balanceOf(address(this));
    }

    /**
    * @notice Returns the reward model's denominator. Used to calculate user rewards.
    * @dev The denominator is = INITIAL TOKEN CAP - TOTAL REWARDABLE TOKENS REDEEMED.
    * @return denominator
    */
    function totalShares() public view returns (uint) {
        uint totalRedeemed = rewardableToken.totalRedeemed();
        return maxShares.sub(totalRedeemed);
    }

    /**
    * @notice Returns the amount of a user's unclaimed (= total allocated - claimed) rewards. 
    * @param _payee User address.
    * @return total unclaimed rewards for user
    */
    function unclaimedRewards(address _payee) public view returns(uint) {
        require(_payee != address(0), "Payee must not be a zero address.");
        uint totalUserReward = totalUserRewards(_payee);
        if (totalUserReward == uint(0)) {
            return 0;
        }

        uint unclaimedReward = totalUserReward.sub(claimedRewards[_payee]);
        return unclaimedReward;
    }

    /**
    * @notice Returns a user's total PAY rewards.
    * @param _payee User address.
    * @return total claimed + unclaimed rewards for user
    */
    function totalUserRewards(address _payee) internal view returns (uint) {
        require(_payee != address(0), "Payee must not be a zero address.");
        uint userShares = rewardableToken.balanceOf(_payee); // [External contract call]
        int userDamping = damping(_payee);
        uint result = _totalUserRewards(totalShares(), totalRewards, userShares, userDamping);
        return result;
    }    

    /**
    * @notice Calculate a user's damping factor change. 
    * @dev The damping factor is used to take into account token movements in the rewards calculation.
    * dampingChange = total PAY rewards * percentage change in a user's TENX shares
    * @param _totalShares Total TENX cap (constant ~200M.)
    * @param _totalRewards The current size of the global pool of PAY rewards.
    * @param _sharesChange The user's change in TENX balance. Can be positive or negative.
    * @return damping change for a given change in tokens
    */
    function _dampingChange(
        uint _totalShares,
        uint _totalRewards,
        int _sharesChange
    ) internal pure returns (int) {
        return int(_totalRewards).mul(_sharesChange).div(int(_totalShares));
    }

    /**
    * @notice Calculates a user's total allocated (claimed + unclaimed) rewards.    
    * @dev The user's total allocated rewards = (percentage of user's TENX shares * total PAY rewards) + user's damping factor
    * @param _totalShares Total TENX cap (constant.)
    * @param _totalRewards Total PAY rewards deposited so far.
    * @param _userShares The user's TENX balance.
    * @param _userDamping The user's damping factor.
    * @return total claimed + unclaimed rewards for user
    */
    function _totalUserRewards(
        uint _totalShares,
        uint _totalRewards,
        uint _userShares,
        int _userDamping
    ) internal pure returns (uint) {
        uint maxUserReward = _userShares.mul(_totalRewards).div(_totalShares);
        int userReward = int(maxUserReward).add(_userDamping);
        uint result = (userReward > 0 ? uint(userReward) : 0);
        return result;
    }

    function damping(address account) internal view returns (int) {
        return _dampings[account];
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[],"name":"renounceModerator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"supply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalRewards","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_notifier","type":"address"}],"name":"setRewardsNotifier","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isRunning","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalShares","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceRewarder","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"updateOnTransfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isPauser","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addRewarder","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalDepositedRewards","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renouncePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"reclaimRewards","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_account","type":"address"},{"name":"_value","type":"uint256"}],"name":"updateOnBurn","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isRewarder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_payee","type":"address"}],"name":"unclaimedRewards","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"unwhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"whitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addModerator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"claimedRewards","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxShares","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalClaimedRewards","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isModerator","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_rewardableToken","type":"address"},{"name":"_rewardsToken","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"Reclaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"implementation","type":"address"}],"name":"NotifierUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Whitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Unwhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"ModeratorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"ModeratorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"RewarderAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"RewarderRemoved","type":"event"}]

60806040526008805460a060020a60ff021916740100000000000000000000000000000000000000001790553480156200003857600080fd5b50604051604080620025d5833981018060405260408110156200005a57600080fd5b508051602090910151620000773364010000000062000222810204565b6200008b3364010000000062000274810204565b60028054600160a860020a0319166101003381029190911791829055604051600160a060020a039190920416906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600355620000f933640100000000620002c6810204565b600082600160a060020a031663355274ea6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156200015157600080fd5b505afa15801562000166573d6000803e3d6000fd5b505050506040513d60208110156200017d57600080fd5b50519050801515620001db576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180620025b36022913960400191505060405180910390fd5b60095560068054600160a060020a03938416600160a060020a03199182168117909255600780549390941692811692909217909255600880549091169091179055620003ab565b6200023d60008264010000000062001fb66200031882021704565b604051600160a060020a038216907f9dfd431959d2d3358e3eb909555ad574123ea5881ff0e05a80f66d4984710c1b90600090a250565b6200028f60018264010000000062001fb66200031882021704565b604051600160a060020a038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b620002e160048264010000000062001fb66200031882021704565b604051600160a060020a038216907fd378ad41c1a753fd1ba9ec0fcd7970526c175b68545b4a02d6d15e7606fe359690600090a250565b600160a060020a03811615156200032e57600080fd5b62000343828264010000000062000373810204565b156200034e57600080fd5b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b6000600160a060020a03821615156200038b57600080fd5b50600160a060020a03166000908152602091909152604090205460ff1690565b6121f880620003bb6000396000f3fe608060405260043610610216576000357c0100000000000000000000000000000000000000000000000000000000900480637bd2d7db1161012a5780639a590427116100bd578063bd8343451161008c578063bd834345146106ac578063c65b61ca146106df578063d578ceab146106f4578063f2fde38b14610709578063fa6f39361461073c57610216565b80639a590427146105e95780639b19251a1461061c578063b532e4cb1461064f578063b6b55f251461068257610216565b80638da5cb5b116100f95780638da5cb5b1461053d5780638e478cab1461056e5780638f32d59b146105a1578063949813b8146105b657610216565b80637bd2d7db146104a757806382dc1ec4146104bc5780638456cb59146104ef578063847331631461050457610216565b80633f4ba83a116101ad57806356d3590b1161017c57806356d3590b146104205780635c975abb146104535780636d27f317146104685780636ef8d66d1461047d578063715018a61461049257610216565b80633f4ba83a1461038057806340cc85181461039557806343f34f9c146103aa57806346fbf68e146103ed57610216565b80632014e5d1116101e95780632014e5d1146102fa5780633a98ef39146103235780633af32abf146103385780633ccfd60b1461036b57610216565b80630286562914610276578063047fc9aa1461028b5780630e15561a146102b257806316cb2b78146102c7575b341561026c576040805160e560020a62461bcd02815260206004820152601c60248201527f5265636569766564206e6f6e2d7a65726f206d73672e76616c75652e00000000604482015290519081900360640190fd5b61027461076f565b005b34801561028257600080fd5b506102746109b2565b34801561029757600080fd5b506102a06109bd565b60408051918252519081900360200190f35b3480156102be57600080fd5b506102a0610a52565b3480156102d357600080fd5b50610274600480360360208110156102ea57600080fd5b5035600160a060020a0316610a58565b34801561030657600080fd5b5061030f610b5f565b604080519115158252519081900360200190f35b34801561032f57600080fd5b506102a0610b80565b34801561034457600080fd5b5061030f6004803603602081101561035b57600080fd5b5035600160a060020a0316610c35565b34801561037757600080fd5b5061027461076f565b34801561038c57600080fd5b50610274610c4a565b3480156103a157600080fd5b50610274610cae565b3480156103b657600080fd5b5061030f600480360360608110156103cd57600080fd5b50600160a060020a03813581169160208101359091169060400135610cb7565b3480156103f957600080fd5b5061030f6004803603602081101561041057600080fd5b5035600160a060020a0316610ddc565b34801561042c57600080fd5b506102746004803603602081101561044357600080fd5b5035600160a060020a0316610df7565b34801561045f57600080fd5b5061030f610e4c565b34801561047457600080fd5b506102a0610e55565b34801561048957600080fd5b50610274610e5b565b34801561049e57600080fd5b50610274610e64565b3480156104b357600080fd5b50610274610ed4565b3480156104c857600080fd5b50610274600480360360208110156104df57600080fd5b5035600160a060020a0316610ff1565b3480156104fb57600080fd5b5061027461100e565b34801561051057600080fd5b5061030f6004803603604081101561052757600080fd5b50600160a060020a038135169060200135611074565b34801561054957600080fd5b5061055261116b565b60408051600160a060020a039092168252519081900360200190f35b34801561057a57600080fd5b5061030f6004803603602081101561059157600080fd5b5035600160a060020a031661117f565b3480156105ad57600080fd5b5061030f611191565b3480156105c257600080fd5b506102a0600480360360208110156105d957600080fd5b5035600160a060020a03166111a7565b3480156105f557600080fd5b506102746004803603602081101561060c57600080fd5b5035600160a060020a0316611243565b34801561062857600080fd5b506102746004803603602081101561063f57600080fd5b5035600160a060020a0316611417565b34801561065b57600080fd5b506102746004803603602081101561067257600080fd5b5035600160a060020a03166115ed565b34801561068e57600080fd5b50610274600480360360208110156106a557600080fd5b503561163f565b3480156106b857600080fd5b506102a0600480360360208110156106cf57600080fd5b5035600160a060020a03166117ce565b3480156106eb57600080fd5b506102a06117e0565b34801561070057600080fd5b506102a06117e6565b34801561071557600080fd5b506102746004803603602081101561072c57600080fd5b5035600160a060020a03166117ec565b34801561074857600080fd5b5061030f6004803603602081101561075f57600080fd5b5035600160a060020a0316611808565b60085474010000000000000000000000000000000000000000900460ff1615156107cd5760405160e560020a62461bcd02815260040180806020018281038252602581526020018061209a6025913960400191505060405180910390fd5b60025460ff16156107dd57600080fd5b3360008181526005602052604090205460ff161515610846576040805160e560020a62461bcd02815260206004820152601b60248201527f4163636f756e74206973206e6f742077686974656c69737465642e0000000000604482015290519081900360640190fd5b600380546001019081905533600061085d826111a7565b9050600081116108a15760405160e560020a62461bcd02815260040180806020018281038252602e815260200180612148602e913960400191505060405180910390fd5b806108aa6109bd565b10156108ea5760405160e560020a62461bcd0281526004018080602001828103825260368152602001806121976036913960400191505060405180910390fd5b600160a060020a0382166000908152600e6020526040902054610913908263ffffffff61181b16565b600160a060020a0383166000908152600e6020526040902055600c5461093f908263ffffffff61181b16565b600c55604080518281529051600160a060020a038416917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a260075461099e90600160a060020a0316838363ffffffff61183616565b505060035481146109ae57600080fd5b5050565b6109bb336118bb565b565b600754604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600092600160a060020a0316916370a08231916024808301926020929190829003018186803b158015610a2157600080fd5b505afa158015610a35573d6000803e3d6000fd5b505050506040513d6020811015610a4b57600080fd5b5051905090565b600a5481565b610a60611191565b1515610a6b57600080fd5b600160a060020a0381161515610ab55760405160e560020a62461bcd02815260040180806020018281038252602b81526020018061211d602b913960400191505060405180910390fd5b610abe81611903565b1515610afe5760405160e560020a62461bcd0281526004018080602001828103825260218152602001806120796021913960400191505060405180910390fd5b60088054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff19909116811790915560408051918252517f71f473a188f9a4846d73b01826c8491c58a771d3bdcb11fb9e95ff2b94b8190e9181900360200190a150565b60085474010000000000000000000000000000000000000000900460ff1681565b600080600660009054906101000a9004600160a060020a0316600160a060020a031663f35dad406040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610bed57600080fd5b505afa158015610c01573d6000803e3d6000fd5b505050506040513d6020811015610c1757600080fd5b5051600954909150610c2f908263ffffffff61190b16565b91505090565b60056020526000908152604090205460ff1681565b610c5333610ddc565b1515610c5e57600080fd5b60025460ff161515610c6f57600080fd5b6002805460ff191690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a1565b6109bb33611920565b600854600090600160a060020a03163314610d065760405160e560020a62461bcd0281526004018080602001828103825260348152602001806120e96034913960400191505060405180910390fd5b6003805460010190819055826000610d28610d1f610b80565b600a5484611968565b90506000610d3e8660001963ffffffff61198a16565b90506000610d4d610d1f610b80565b9050610d5f838263ffffffff6119ef16565b15610d6657fe5b610d7f83610d738b611a24565b9063ffffffff6119ef16565b600160a060020a038a166000908152600d6020526040902055610da581610d738a611a24565b600160a060020a0389166000908152600d602052604090205550600194505050506003548114610dd457600080fd5b509392505050565b6000610def60018363ffffffff611a3f16565b90505b919050565b610e003361117f565b1515610e405760405160e560020a62461bcd0281526004018080602001828103825260298152602001806120506029913960400191505060405180910390fd5b610e4981611a76565b50565b60025460ff1690565b600b5481565b6109bb33611abe565b610e6c611191565b1515610e7757600080fd5b6002546040516000916101009004600160a060020a0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36002805474ffffffffffffffffffffffffffffffffffffffff0019169055565b610edc611191565b1515610ee757600080fd5b600754604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600092600160a060020a0316916370a08231916024808301926020929190829003018186803b158015610f4b57600080fd5b505afa158015610f5f573d6000803e3d6000fd5b505050506040513d6020811015610f7557600080fd5b50516008805474ff0000000000000000000000000000000000000000191690559050610fbb610fa261116b565b600754600160a060020a0316908363ffffffff61183616565b6040805182815290517f8ead5713a73bdd75350d3a725de9c215bb2ebde2d01d107e2e7c34a58d6a19029181900360200190a150565b610ffa33610ddc565b151561100557600080fd5b610e4981611b06565b61101733610ddc565b151561102257600080fd5b60025460ff161561103257600080fd5b6002805460ff191660011790556040805133815290517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589181900360200190a1565b600854600090600160a060020a031633146110c35760405160e560020a62461bcd0281526004018080602001828103825260348152602001806120e96034913960400191505060405180910390fd5b600380546001019081905560006110e8846110dc610b80565b9063ffffffff61181b16565b9050600061111182611105600a5488611b4e90919063ffffffff16565b9063ffffffff611b7916565b600a54909150611127908263ffffffff61190b16565b600a5561113781610d7388611a24565b600160a060020a0387166000908152600d6020526040902055506001925050600354811461116457600080fd5b5092915050565b6002546101009004600160a060020a031690565b6000610def818363ffffffff611a3f16565b6002546101009004600160a060020a0316331490565b6000600160a060020a03821615156111f35760405160e560020a62461bcd0281526004018080602001828103825260218152602001806121766021913960400191505060405180910390fd5b60006111fe83611b9d565b9050801515611211576000915050610df2565b600160a060020a0383166000908152600e602052604081205461123b90839063ffffffff61190b16565b949350505050565b61124c33611808565b151561128c5760405160e560020a62461bcd02815260040180806020018281038252602a8152602001806120bf602a913960400191505060405180910390fd5b600160a060020a03811615156112ec576040805160e560020a62461bcd02815260206004820181905260248201527f43616e6e6f7420756e77686974656c697374207a65726f20616464726573732e604482015290519081900360640190fd5b600160a060020a03811633141561134d576040805160e560020a62461bcd02815260206004820152601860248201527f43616e6e6f7420756e77686974656c6973742073656c662e0000000000000000604482015290519081900360640190fd5b600160a060020a03811660009081526005602052604090205460ff1615156113bf576040805160e560020a62461bcd02815260206004820152601860248201527f41646472657373206e6f742077686974656c69737465642e0000000000000000604482015290519081900360640190fd5b600160a060020a038116600081815260056020908152604091829020805460ff19169055815192835290517f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919281900390910190a150565b61142033611808565b15156114605760405160e560020a62461bcd02815260040180806020018281038252602a8152602001806120bf602a913960400191505060405180910390fd5b600160a060020a03811615156114c0576040805160e560020a62461bcd02815260206004820152601e60248201527f43616e6e6f742077686974656c697374207a65726f20616464726573732e0000604482015290519081900360640190fd5b600160a060020a038116331415611521576040805160e560020a62461bcd02815260206004820152601660248201527f43616e6e6f742077686974656c6973742073656c662e00000000000000000000604482015290519081900360640190fd5b600160a060020a03811660009081526005602052604090205460ff1615611592576040805160e560020a62461bcd02815260206004820152601c60248201527f4164647265737320616c72656164792077686974656c69737465642e00000000604482015290519081900360640190fd5b600160a060020a038116600081815260056020908152604091829020805460ff19166001179055815192835290517faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549281900390910190a150565b6115f633611808565b15156116365760405160e560020a62461bcd02815260040180806020018281038252602a8152602001806120bf602a913960400191505060405180910390fd5b610e4981611cae565b6116483361117f565b15156116885760405160e560020a62461bcd0281526004018080602001828103825260298152602001806120506029913960400191505060405180910390fd5b60085474010000000000000000000000000000000000000000900460ff1615156116e65760405160e560020a62461bcd02815260040180806020018281038252602581526020018061209a6025913960400191505060405180910390fd5b60025460ff16156116f657600080fd5b80151561174d576040805160e560020a62461bcd02815260206004820152601d60248201527f4465706f73697420616d6f756e74206d757374206e6f6e2d7a65726f2e000000604482015290519081900360640190fd5b600b54611760908263ffffffff61181b16565b600b55600a54611776908263ffffffff61181b16565b600a55604080518281529051339182917f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c49181900360200190a26007546109ae90600160a060020a031633308563ffffffff611cf616565b600e6020526000908152604090205481565b60095481565b600c5481565b6117f4611191565b15156117ff57600080fd5b610e4981611d84565b6000610def60048363ffffffff611a3f16565b60008282018381101561182d57600080fd5b90505b92915050565b60408051600160a060020a038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526118b6908490611e0d565b505050565b6118cc60048263ffffffff611f0c16565b604051600160a060020a038216907f7a9f1e23d5426b34819d173153d59084cc3578d5a129b80bb27df683ac6b227890600090a250565b6000903b1190565b60008282111561191a57600080fd5b50900390565b61193160008263ffffffff611f0c16565b604051600160a060020a038216907fce699c579f0b70ea4ccd6a4b38be26726a2c248b89c7102ccbc5d0f3060ef6d090600090a250565b600061123b8461197e858563ffffffff61198a16565b9063ffffffff611f5816565b600082151561199b57506000611830565b826000191480156119cb57507f800000000000000000000000000000000000000000000000000000000000000082145b156119d557600080fd5b8282028284828115156119e457fe5b051461182d57600080fd5b6000828201818312801590611a045750838112155b80611a195750600083128015611a1957508381125b151561182d57600080fd5b600160a060020a03166000908152600d602052604090205490565b6000600160a060020a0382161515611a5657600080fd5b50600160a060020a03166000908152602091909152604090205460ff1690565b611a8760008263ffffffff611fb616565b604051600160a060020a038216907f9dfd431959d2d3358e3eb909555ad574123ea5881ff0e05a80f66d4984710c1b90600090a250565b611acf60018263ffffffff611f0c16565b604051600160a060020a038216907fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e90600090a250565b611b1760018263ffffffff611fb616565b604051600160a060020a038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b6000821515611b5f57506000611830565b828202828482811515611b6e57fe5b041461182d57600080fd5b6000808211611b8757600080fd5b60008284811515611b9457fe5b04949350505050565b6000600160a060020a0382161515611be95760405160e560020a62461bcd0281526004018080602001828103825260218152602001806121766021913960400191505060405180910390fd5b600654604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152915160009392909216916370a0823191602480820192602092909190829003018186803b158015611c5357600080fd5b505afa158015611c67573d6000803e3d6000fd5b505050506040513d6020811015611c7d57600080fd5b505190506000611c8c84611a24565b90506000611ca5611c9b610b80565b600a548585612004565b95945050505050565b611cbf60048263ffffffff611fb616565b604051600160a060020a038216907fd378ad41c1a753fd1ba9ec0fcd7970526c175b68545b4a02d6d15e7606fe359690600090a250565b60408051600160a060020a0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052611d7e908590611e0d565b50505050565b600160a060020a0381161515611d9957600080fd5b600254604051600160a060020a0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360028054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b611e1f82600160a060020a0316611903565b1515611e2a57600080fd5b6000606083600160a060020a0316836040518082805190602001908083835b60208310611e685780518252601f199092019160209182019101611e49565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611eca576040519150601f19603f3d011682016040523d82523d6000602084013e611ecf565b606091505b5091509150811515611ee057600080fd5b600081511115611d7e57808060200190516020811015611eff57600080fd5b50511515611d7e57600080fd5b600160a060020a0381161515611f2157600080fd5b611f2b8282611a3f565b1515611f3657600080fd5b600160a060020a0316600090815260209190915260409020805460ff19169055565b6000811515611f6657600080fd5b81600019148015611f9657507f800000000000000000000000000000000000000000000000000000000000000083145b15611fa057600080fd5b60008284811515611fad57fe5b05949350505050565b600160a060020a0381161515611fcb57600080fd5b611fd58282611a3f565b15611fdf57600080fd5b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b60008061201b86611105868863ffffffff611b4e16565b9050600061202f828563ffffffff6119ef16565b90506000808213612041576000612043565b815b9897505050505050505056fe4f6e6c79205265776172646572732063616e206578656375746520746869732066756e6374696f6e2e41646472657373206d75737420706f696e7420746f206120636f6e74726163742e5265776172647320636f6e7472616374206861732073746f707065642072756e6e696e672e4f6e6c79204d6f64657261746f72732063616e206578656375746520746869732066756e6374696f6e2e43616e206f6e6c792062652063616c6c6564206279207468652072657761726473206e6f74696669657220636f6e74726163742e526577617264732061646472657373206d757374206e6f742062652061207a65726f20616464726573732e556e636c61696d656420726577617264206d757374206265206e6f6e2d7a65726f20746f2077697468647261772e5061796565206d757374206e6f742062652061207a65726f20616464726573732e5265776172647320636f6e7472616374206d75737420686176652073756666696369656e742050415920746f2064697362757273652ea165627a7a72305820b84c6b13272b04c34d9f14becc1ad8a82f2d4e9dbcc397a414a853d738dda5ff002953686172657320746f6b656e20636170206d757374206265206e6f6e2d7a65726f2e000000000000000000000000515ba0a2e286af10115284f151cf398688a69170000000000000000000000000b97048628db6b661d4c2aa833e95dbe1a905b280

Deployed Bytecode

0x608060405260043610610216576000357c0100000000000000000000000000000000000000000000000000000000900480637bd2d7db1161012a5780639a590427116100bd578063bd8343451161008c578063bd834345146106ac578063c65b61ca146106df578063d578ceab146106f4578063f2fde38b14610709578063fa6f39361461073c57610216565b80639a590427146105e95780639b19251a1461061c578063b532e4cb1461064f578063b6b55f251461068257610216565b80638da5cb5b116100f95780638da5cb5b1461053d5780638e478cab1461056e5780638f32d59b146105a1578063949813b8146105b657610216565b80637bd2d7db146104a757806382dc1ec4146104bc5780638456cb59146104ef578063847331631461050457610216565b80633f4ba83a116101ad57806356d3590b1161017c57806356d3590b146104205780635c975abb146104535780636d27f317146104685780636ef8d66d1461047d578063715018a61461049257610216565b80633f4ba83a1461038057806340cc85181461039557806343f34f9c146103aa57806346fbf68e146103ed57610216565b80632014e5d1116101e95780632014e5d1146102fa5780633a98ef39146103235780633af32abf146103385780633ccfd60b1461036b57610216565b80630286562914610276578063047fc9aa1461028b5780630e15561a146102b257806316cb2b78146102c7575b341561026c576040805160e560020a62461bcd02815260206004820152601c60248201527f5265636569766564206e6f6e2d7a65726f206d73672e76616c75652e00000000604482015290519081900360640190fd5b61027461076f565b005b34801561028257600080fd5b506102746109b2565b34801561029757600080fd5b506102a06109bd565b60408051918252519081900360200190f35b3480156102be57600080fd5b506102a0610a52565b3480156102d357600080fd5b50610274600480360360208110156102ea57600080fd5b5035600160a060020a0316610a58565b34801561030657600080fd5b5061030f610b5f565b604080519115158252519081900360200190f35b34801561032f57600080fd5b506102a0610b80565b34801561034457600080fd5b5061030f6004803603602081101561035b57600080fd5b5035600160a060020a0316610c35565b34801561037757600080fd5b5061027461076f565b34801561038c57600080fd5b50610274610c4a565b3480156103a157600080fd5b50610274610cae565b3480156103b657600080fd5b5061030f600480360360608110156103cd57600080fd5b50600160a060020a03813581169160208101359091169060400135610cb7565b3480156103f957600080fd5b5061030f6004803603602081101561041057600080fd5b5035600160a060020a0316610ddc565b34801561042c57600080fd5b506102746004803603602081101561044357600080fd5b5035600160a060020a0316610df7565b34801561045f57600080fd5b5061030f610e4c565b34801561047457600080fd5b506102a0610e55565b34801561048957600080fd5b50610274610e5b565b34801561049e57600080fd5b50610274610e64565b3480156104b357600080fd5b50610274610ed4565b3480156104c857600080fd5b50610274600480360360208110156104df57600080fd5b5035600160a060020a0316610ff1565b3480156104fb57600080fd5b5061027461100e565b34801561051057600080fd5b5061030f6004803603604081101561052757600080fd5b50600160a060020a038135169060200135611074565b34801561054957600080fd5b5061055261116b565b60408051600160a060020a039092168252519081900360200190f35b34801561057a57600080fd5b5061030f6004803603602081101561059157600080fd5b5035600160a060020a031661117f565b3480156105ad57600080fd5b5061030f611191565b3480156105c257600080fd5b506102a0600480360360208110156105d957600080fd5b5035600160a060020a03166111a7565b3480156105f557600080fd5b506102746004803603602081101561060c57600080fd5b5035600160a060020a0316611243565b34801561062857600080fd5b506102746004803603602081101561063f57600080fd5b5035600160a060020a0316611417565b34801561065b57600080fd5b506102746004803603602081101561067257600080fd5b5035600160a060020a03166115ed565b34801561068e57600080fd5b50610274600480360360208110156106a557600080fd5b503561163f565b3480156106b857600080fd5b506102a0600480360360208110156106cf57600080fd5b5035600160a060020a03166117ce565b3480156106eb57600080fd5b506102a06117e0565b34801561070057600080fd5b506102a06117e6565b34801561071557600080fd5b506102746004803603602081101561072c57600080fd5b5035600160a060020a03166117ec565b34801561074857600080fd5b5061030f6004803603602081101561075f57600080fd5b5035600160a060020a0316611808565b60085474010000000000000000000000000000000000000000900460ff1615156107cd5760405160e560020a62461bcd02815260040180806020018281038252602581526020018061209a6025913960400191505060405180910390fd5b60025460ff16156107dd57600080fd5b3360008181526005602052604090205460ff161515610846576040805160e560020a62461bcd02815260206004820152601b60248201527f4163636f756e74206973206e6f742077686974656c69737465642e0000000000604482015290519081900360640190fd5b600380546001019081905533600061085d826111a7565b9050600081116108a15760405160e560020a62461bcd02815260040180806020018281038252602e815260200180612148602e913960400191505060405180910390fd5b806108aa6109bd565b10156108ea5760405160e560020a62461bcd0281526004018080602001828103825260368152602001806121976036913960400191505060405180910390fd5b600160a060020a0382166000908152600e6020526040902054610913908263ffffffff61181b16565b600160a060020a0383166000908152600e6020526040902055600c5461093f908263ffffffff61181b16565b600c55604080518281529051600160a060020a038416917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a260075461099e90600160a060020a0316838363ffffffff61183616565b505060035481146109ae57600080fd5b5050565b6109bb336118bb565b565b600754604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600092600160a060020a0316916370a08231916024808301926020929190829003018186803b158015610a2157600080fd5b505afa158015610a35573d6000803e3d6000fd5b505050506040513d6020811015610a4b57600080fd5b5051905090565b600a5481565b610a60611191565b1515610a6b57600080fd5b600160a060020a0381161515610ab55760405160e560020a62461bcd02815260040180806020018281038252602b81526020018061211d602b913960400191505060405180910390fd5b610abe81611903565b1515610afe5760405160e560020a62461bcd0281526004018080602001828103825260218152602001806120796021913960400191505060405180910390fd5b60088054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff19909116811790915560408051918252517f71f473a188f9a4846d73b01826c8491c58a771d3bdcb11fb9e95ff2b94b8190e9181900360200190a150565b60085474010000000000000000000000000000000000000000900460ff1681565b600080600660009054906101000a9004600160a060020a0316600160a060020a031663f35dad406040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610bed57600080fd5b505afa158015610c01573d6000803e3d6000fd5b505050506040513d6020811015610c1757600080fd5b5051600954909150610c2f908263ffffffff61190b16565b91505090565b60056020526000908152604090205460ff1681565b610c5333610ddc565b1515610c5e57600080fd5b60025460ff161515610c6f57600080fd5b6002805460ff191690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a1565b6109bb33611920565b600854600090600160a060020a03163314610d065760405160e560020a62461bcd0281526004018080602001828103825260348152602001806120e96034913960400191505060405180910390fd5b6003805460010190819055826000610d28610d1f610b80565b600a5484611968565b90506000610d3e8660001963ffffffff61198a16565b90506000610d4d610d1f610b80565b9050610d5f838263ffffffff6119ef16565b15610d6657fe5b610d7f83610d738b611a24565b9063ffffffff6119ef16565b600160a060020a038a166000908152600d6020526040902055610da581610d738a611a24565b600160a060020a0389166000908152600d602052604090205550600194505050506003548114610dd457600080fd5b509392505050565b6000610def60018363ffffffff611a3f16565b90505b919050565b610e003361117f565b1515610e405760405160e560020a62461bcd0281526004018080602001828103825260298152602001806120506029913960400191505060405180910390fd5b610e4981611a76565b50565b60025460ff1690565b600b5481565b6109bb33611abe565b610e6c611191565b1515610e7757600080fd5b6002546040516000916101009004600160a060020a0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36002805474ffffffffffffffffffffffffffffffffffffffff0019169055565b610edc611191565b1515610ee757600080fd5b600754604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600092600160a060020a0316916370a08231916024808301926020929190829003018186803b158015610f4b57600080fd5b505afa158015610f5f573d6000803e3d6000fd5b505050506040513d6020811015610f7557600080fd5b50516008805474ff0000000000000000000000000000000000000000191690559050610fbb610fa261116b565b600754600160a060020a0316908363ffffffff61183616565b6040805182815290517f8ead5713a73bdd75350d3a725de9c215bb2ebde2d01d107e2e7c34a58d6a19029181900360200190a150565b610ffa33610ddc565b151561100557600080fd5b610e4981611b06565b61101733610ddc565b151561102257600080fd5b60025460ff161561103257600080fd5b6002805460ff191660011790556040805133815290517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589181900360200190a1565b600854600090600160a060020a031633146110c35760405160e560020a62461bcd0281526004018080602001828103825260348152602001806120e96034913960400191505060405180910390fd5b600380546001019081905560006110e8846110dc610b80565b9063ffffffff61181b16565b9050600061111182611105600a5488611b4e90919063ffffffff16565b9063ffffffff611b7916565b600a54909150611127908263ffffffff61190b16565b600a5561113781610d7388611a24565b600160a060020a0387166000908152600d6020526040902055506001925050600354811461116457600080fd5b5092915050565b6002546101009004600160a060020a031690565b6000610def818363ffffffff611a3f16565b6002546101009004600160a060020a0316331490565b6000600160a060020a03821615156111f35760405160e560020a62461bcd0281526004018080602001828103825260218152602001806121766021913960400191505060405180910390fd5b60006111fe83611b9d565b9050801515611211576000915050610df2565b600160a060020a0383166000908152600e602052604081205461123b90839063ffffffff61190b16565b949350505050565b61124c33611808565b151561128c5760405160e560020a62461bcd02815260040180806020018281038252602a8152602001806120bf602a913960400191505060405180910390fd5b600160a060020a03811615156112ec576040805160e560020a62461bcd02815260206004820181905260248201527f43616e6e6f7420756e77686974656c697374207a65726f20616464726573732e604482015290519081900360640190fd5b600160a060020a03811633141561134d576040805160e560020a62461bcd02815260206004820152601860248201527f43616e6e6f7420756e77686974656c6973742073656c662e0000000000000000604482015290519081900360640190fd5b600160a060020a03811660009081526005602052604090205460ff1615156113bf576040805160e560020a62461bcd02815260206004820152601860248201527f41646472657373206e6f742077686974656c69737465642e0000000000000000604482015290519081900360640190fd5b600160a060020a038116600081815260056020908152604091829020805460ff19169055815192835290517f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919281900390910190a150565b61142033611808565b15156114605760405160e560020a62461bcd02815260040180806020018281038252602a8152602001806120bf602a913960400191505060405180910390fd5b600160a060020a03811615156114c0576040805160e560020a62461bcd02815260206004820152601e60248201527f43616e6e6f742077686974656c697374207a65726f20616464726573732e0000604482015290519081900360640190fd5b600160a060020a038116331415611521576040805160e560020a62461bcd02815260206004820152601660248201527f43616e6e6f742077686974656c6973742073656c662e00000000000000000000604482015290519081900360640190fd5b600160a060020a03811660009081526005602052604090205460ff1615611592576040805160e560020a62461bcd02815260206004820152601c60248201527f4164647265737320616c72656164792077686974656c69737465642e00000000604482015290519081900360640190fd5b600160a060020a038116600081815260056020908152604091829020805460ff19166001179055815192835290517faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549281900390910190a150565b6115f633611808565b15156116365760405160e560020a62461bcd02815260040180806020018281038252602a8152602001806120bf602a913960400191505060405180910390fd5b610e4981611cae565b6116483361117f565b15156116885760405160e560020a62461bcd0281526004018080602001828103825260298152602001806120506029913960400191505060405180910390fd5b60085474010000000000000000000000000000000000000000900460ff1615156116e65760405160e560020a62461bcd02815260040180806020018281038252602581526020018061209a6025913960400191505060405180910390fd5b60025460ff16156116f657600080fd5b80151561174d576040805160e560020a62461bcd02815260206004820152601d60248201527f4465706f73697420616d6f756e74206d757374206e6f6e2d7a65726f2e000000604482015290519081900360640190fd5b600b54611760908263ffffffff61181b16565b600b55600a54611776908263ffffffff61181b16565b600a55604080518281529051339182917f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c49181900360200190a26007546109ae90600160a060020a031633308563ffffffff611cf616565b600e6020526000908152604090205481565b60095481565b600c5481565b6117f4611191565b15156117ff57600080fd5b610e4981611d84565b6000610def60048363ffffffff611a3f16565b60008282018381101561182d57600080fd5b90505b92915050565b60408051600160a060020a038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526118b6908490611e0d565b505050565b6118cc60048263ffffffff611f0c16565b604051600160a060020a038216907f7a9f1e23d5426b34819d173153d59084cc3578d5a129b80bb27df683ac6b227890600090a250565b6000903b1190565b60008282111561191a57600080fd5b50900390565b61193160008263ffffffff611f0c16565b604051600160a060020a038216907fce699c579f0b70ea4ccd6a4b38be26726a2c248b89c7102ccbc5d0f3060ef6d090600090a250565b600061123b8461197e858563ffffffff61198a16565b9063ffffffff611f5816565b600082151561199b57506000611830565b826000191480156119cb57507f800000000000000000000000000000000000000000000000000000000000000082145b156119d557600080fd5b8282028284828115156119e457fe5b051461182d57600080fd5b6000828201818312801590611a045750838112155b80611a195750600083128015611a1957508381125b151561182d57600080fd5b600160a060020a03166000908152600d602052604090205490565b6000600160a060020a0382161515611a5657600080fd5b50600160a060020a03166000908152602091909152604090205460ff1690565b611a8760008263ffffffff611fb616565b604051600160a060020a038216907f9dfd431959d2d3358e3eb909555ad574123ea5881ff0e05a80f66d4984710c1b90600090a250565b611acf60018263ffffffff611f0c16565b604051600160a060020a038216907fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e90600090a250565b611b1760018263ffffffff611fb616565b604051600160a060020a038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b6000821515611b5f57506000611830565b828202828482811515611b6e57fe5b041461182d57600080fd5b6000808211611b8757600080fd5b60008284811515611b9457fe5b04949350505050565b6000600160a060020a0382161515611be95760405160e560020a62461bcd0281526004018080602001828103825260218152602001806121766021913960400191505060405180910390fd5b600654604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152915160009392909216916370a0823191602480820192602092909190829003018186803b158015611c5357600080fd5b505afa158015611c67573d6000803e3d6000fd5b505050506040513d6020811015611c7d57600080fd5b505190506000611c8c84611a24565b90506000611ca5611c9b610b80565b600a548585612004565b95945050505050565b611cbf60048263ffffffff611fb616565b604051600160a060020a038216907fd378ad41c1a753fd1ba9ec0fcd7970526c175b68545b4a02d6d15e7606fe359690600090a250565b60408051600160a060020a0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052611d7e908590611e0d565b50505050565b600160a060020a0381161515611d9957600080fd5b600254604051600160a060020a0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360028054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b611e1f82600160a060020a0316611903565b1515611e2a57600080fd5b6000606083600160a060020a0316836040518082805190602001908083835b60208310611e685780518252601f199092019160209182019101611e49565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611eca576040519150601f19603f3d011682016040523d82523d6000602084013e611ecf565b606091505b5091509150811515611ee057600080fd5b600081511115611d7e57808060200190516020811015611eff57600080fd5b50511515611d7e57600080fd5b600160a060020a0381161515611f2157600080fd5b611f2b8282611a3f565b1515611f3657600080fd5b600160a060020a0316600090815260209190915260409020805460ff19169055565b6000811515611f6657600080fd5b81600019148015611f9657507f800000000000000000000000000000000000000000000000000000000000000083145b15611fa057600080fd5b60008284811515611fad57fe5b05949350505050565b600160a060020a0381161515611fcb57600080fd5b611fd58282611a3f565b15611fdf57600080fd5b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b60008061201b86611105868863ffffffff611b4e16565b9050600061202f828563ffffffff6119ef16565b90506000808213612041576000612043565b815b9897505050505050505056fe4f6e6c79205265776172646572732063616e206578656375746520746869732066756e6374696f6e2e41646472657373206d75737420706f696e7420746f206120636f6e74726163742e5265776172647320636f6e7472616374206861732073746f707065642072756e6e696e672e4f6e6c79204d6f64657261746f72732063616e206578656375746520746869732066756e6374696f6e2e43616e206f6e6c792062652063616c6c6564206279207468652072657761726473206e6f74696669657220636f6e74726163742e526577617264732061646472657373206d757374206e6f742062652061207a65726f20616464726573732e556e636c61696d656420726577617264206d757374206265206e6f6e2d7a65726f20746f2077697468647261772e5061796565206d757374206e6f742062652061207a65726f20616464726573732e5265776172647320636f6e7472616374206d75737420686176652073756666696369656e742050415920746f2064697362757273652ea165627a7a72305820b84c6b13272b04c34d9f14becc1ad8a82f2d4e9dbcc397a414a853d738dda5ff0029

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

000000000000000000000000515ba0a2e286af10115284f151cf398688a69170000000000000000000000000b97048628db6b661d4c2aa833e95dbe1a905b280

-----Decoded View---------------
Arg [0] : _rewardableToken (address): 0x515bA0a2E286AF10115284F151cF398688A69170
Arg [1] : _rewardsToken (address): 0xB97048628DB6B661D4C2aA833e95Dbe1A905B280

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000515ba0a2e286af10115284f151cf398688a69170
Arg [1] : 000000000000000000000000b97048628db6b661d4c2aa833e95dbe1a905b280


Deployed Bytecode Sourcemap

22124:10814:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24401:9;:14;24393:55;;;;;-1:-1:-1;;;;;24393:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24459:10;:8;:10::i;:::-;22124:10814;19915:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19915:83:0;;;:::i;29406:108::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29406:108:0;;;:::i;:::-;;;;;;;;;;;;;;;;22714:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22714:24:0;;;:::i;25485:348::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25485:348:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25485:348:0;-1:-1:-1;;;;;25485:348:0;;:::i;22615:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22615:28:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;29740:167;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29740:167:0;;;:::i;20506:46::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20506:46:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20506:46:0;-1:-1:-1;;;;;20506:46:0;;:::i;28422:759::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28422:759:0;;;:::i;5332:118::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5332:118:0;;;:::i;18705:81::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18705:81:0;;;:::i;26270:765::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26270:765:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;26270:765:0;;;;;;;;;;;;;;;;;:::i;3510:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3510:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3510:109:0;-1:-1:-1;;;;;3510:109:0;;:::i;18599:98::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18599:98:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18599:98:0;-1:-1:-1;;;;;18599:98:0;;:::i;4585:78::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4585:78:0;;;:::i;22838:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22838:33:0;;;:::i;3727:77::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3727:77:0;;;:::i;6996:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6996:140:0;;;:::i;28036:235::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28036:235:0;;;:::i;3627:92::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3627:92:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3627:92:0;-1:-1:-1;;;;;3627:92:0;;:::i;5121:116::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5121:116:0;;;:::i;27235:695::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27235:695:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27235:695:0;;;;;;;;:::i;6206:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6206:79:0;;;:::i;:::-;;;;-1:-1:-1;;;;;6206:79:0;;;;;;;;;;;;;;18478:113;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18478:113:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18478:113:0;-1:-1:-1;;;;;18478:113:0;;:::i;6541:92::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6541:92:0;;;:::i;30111:400::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30111:400:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30111:400:0;-1:-1:-1;;;;;30111:400:0;;:::i;21215:364::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21215:364:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21215:364:0;-1:-1:-1;;;;;21215:364:0;;:::i;20847:360::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20847:360:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20847:360:0;-1:-1:-1;;;;;20847:360:0;;:::i;19806:101::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19806:101:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19806:101:0;-1:-1:-1;;;;;19806:101:0;;:::i;24860:466::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24860:466:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24860:466:0;;:::i;23174:46::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23174:46:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23174:46:0;-1:-1:-1;;;;;23174:46:0;;:::i;22650:21::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22650:21:0;;;:::i;22953:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22953:31:0;;;:::i;7313:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7313:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7313:109:0;-1:-1:-1;;;;;7313:109:0;;:::i;19683:115::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19683:115:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19683:115:0;-1:-1:-1;;;;;19683:115:0;;:::i;28422:759::-;24247:9;;;;;;;24239:59;;;;;;-1:-1:-1;;;;;24239:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4822:7;;;;4821:8;4813:17;;;;;;28491:10;20622:22;;;;:13;:22;;;;;;;;20614:62;;;;;;;-1:-1:-1;;;;;20614:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8855:13;:18;;8872:1;8855:18;;;;;28543:10;8855:13;28587:23;28543:10;28587:16;:23::i;:::-;28564:46;-1:-1:-1;28647:1:0;28629:19;;28621:78;;;;-1:-1:-1;;;;;28621:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28730:15;28718:8;:6;:8::i;:::-;:27;;28710:94;;;;-1:-1:-1;;;;;28710:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28841:21:0;;;;;;:14;:21;;;;;;:42;;28867:15;28841:42;:25;:42;:::i;:::-;-1:-1:-1;;;;;28817:21:0;;;;;;:14;:21;;;;;:66;28957:19;;:40;;28981:15;28957:40;:23;:40;:::i;:::-;28935:19;:62;29013:33;;;;;;;;-1:-1:-1;;;;;29013:33:0;;;;;;;;;;;;;29096:12;;:49;;-1:-1:-1;;;;;29096:12:0;29122:5;29129:15;29096:49;:25;:49;:::i;:::-;-1:-1:-1;;8967:13:0;;8951:29;;8943:38;;;;;;20687:1;4841;28422:759::o;19915:83::-;19962:28;19979:10;19962:16;:28::i;:::-;19915:83::o;29406:108::-;29469:12;;:37;;;;;;29500:4;29469:37;;;;;;29445:4;;-1:-1:-1;;;;;29469:12:0;;:22;;:37;;;;;;;;;;;;;;:12;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;29469:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29469:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29469:37:0;;-1:-1:-1;29406:108:0;:::o;22714:24::-;;;;:::o;25485:348::-;6418:9;:7;:9::i;:::-;6410:18;;;;;;;;-1:-1:-1;;;;;25570:32:0;;;;25562:88;;;;-1:-1:-1;;;;;25562:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25669:38;25696:9;25669:18;:38::i;:::-;25661:84;;;;;;-1:-1:-1;;;;;25661:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25756:15;:27;;-1:-1:-1;;;;;25756:27:0;;-1:-1:-1;;25756:27:0;;;;;;;;25799:26;;;;;;;;;;;;;;;;25485:348;:::o;22615:28::-;;;;;;;;;:::o;29740:167::-;29784:4;29801:18;29822:15;;;;;;;;;-1:-1:-1;;;;;29822:15:0;-1:-1:-1;;;;;29822:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29822:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29822:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29822:31:0;29871:9;;29822:31;;-1:-1:-1;29871:28:0;;29822:31;29871:28;:13;:28;:::i;:::-;29864:35;;;29740:167;:::o;20506:46::-;;;;;;;;;;;;;;;:::o;5332:118::-;3461:20;3470:10;3461:8;:20::i;:::-;3453:29;;;;;;;;5001:7;;;;4993:16;;;;;;;;5391:7;:15;;-1:-1:-1;;5391:15:0;;;5422:20;;;5431:10;5422:20;;;;;;;;;;;;;5332:118::o;18705:81::-;18751:27;18767:10;18751:15;:27::i;26270:765::-;24007:15;;26388:4;;-1:-1:-1;;;;;24007:15:0;23993:10;:29;23985:94;;;;-1:-1:-1;;;;;23985:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8855:13;:18;;8872:1;8855:18;;;;;26435:6;8855:13;26536:64;26551:13;:11;:13::i;:::-;26566:12;;26580:19;26536:14;:64::i;:::-;26512:88;-1:-1:-1;26613:21:0;26637:19;26641:6;-1:-1:-1;;26637:19:0;:15;:19;:::i;:::-;26613:43;;26725:19;26747:62;26762:13;:11;:13::i;26747:62::-;26725:84;-1:-1:-1;26830:38:0;:17;26725:84;26830:38;:21;:38;:::i;:::-;26829:45;26822:53;;;;26907:37;26926:17;26907:14;26915:5;26907:7;:14::i;:::-;:18;:37;:18;:37;:::i;:::-;-1:-1:-1;;;;;26888:16:0;;;;;;:9;:16;;;;;:56;26972:33;26989:15;26972:12;26980:3;26972:7;:12::i;:33::-;-1:-1:-1;;;;;26955:14:0;;;;;;:9;:14;;;;;:50;-1:-1:-1;27023:4:0;;-1:-1:-1;;;;8967:13:0;;8951:29;;8943:38;;;;;;24090:1;26270:765;;;;;:::o;3510:109::-;3566:4;3590:21;:8;3603:7;3590:21;:12;:21;:::i;:::-;3583:28;;3510:109;;;;:::o;18599:98::-;18304:22;18315:10;18304;:22::i;:::-;18296:76;;;;;;-1:-1:-1;;;;;18296:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18668:21;18681:7;18668:12;:21::i;:::-;18599:98;:::o;4585:78::-;4648:7;;;;4585:78;:::o;22838:33::-;;;;:::o;3727:77::-;3771:25;3785:10;3771:13;:25::i;6996:140::-;6418:9;:7;:9::i;:::-;6410:18;;;;;;;;7079:6;;7058:40;;7095:1;;7079:6;;;-1:-1:-1;;;;;7079:6:0;;7058:40;;7095:1;;7058:40;7109:6;:19;;-1:-1:-1;;7109:19:0;;;6996:140::o;28036:235::-;6418:9;:7;:9::i;:::-;6410:18;;;;;;;;28110:12;;:37;;;;;;28141:4;28110:37;;;;;;28092:15;;-1:-1:-1;;;;;28110:12:0;;:22;;:37;;;;;;;;;;;;;;:12;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;28110:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28110:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28110:37:0;28158:9;:17;;-1:-1:-1;;28158:17:0;;;28110:37;-1:-1:-1;28186:43:0;28212:7;:5;:7::i;:::-;28186:12;;-1:-1:-1;;;;;28186:12:0;;28221:7;28186:43;:25;:43;:::i;:::-;28245:18;;;;;;;;;;;;;;;;;6439:1;28036:235::o;3627:92::-;3461:20;3470:10;3461:8;:20::i;:::-;3453:29;;;;;;;;3692:19;3703:7;3692:10;:19::i;5121:116::-;3461:20;3470:10;3461:8;:20::i;:::-;3453:29;;;;;;;;4822:7;;;;4821:8;4813:17;;;;;;5181:7;:14;;-1:-1:-1;;5181:14:0;5191:4;5181:14;;;5211:18;;;5218:10;5211:18;;;;;;;;;;;;;5121:116::o;27235:695::-;24007:15;;27339:4;;-1:-1:-1;;;;;24007:15:0;23993:10;:29;23985:94;;;;-1:-1:-1;;;;;23985:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8855:13;:18;;8872:1;8855:18;;;;;:13;27386:25;27404:6;27386:13;:11;:13::i;:::-;:17;:25;:17;:25;:::i;:::-;27357:54;;27503:22;27528:51;27557:21;27528:24;27539:12;;27528:6;:10;;:24;;;;:::i;:::-;:28;:51;:28;:51;:::i;:::-;27669:12;;27503:76;;-1:-1:-1;27669:35:0;;27503:76;27669:35;:16;:35;:::i;:::-;27654:12;:50;27787:45;27813:17;27787;27795:8;27787:7;:17::i;:45::-;-1:-1:-1;;;;;27765:19:0;;;;;;:9;:19;;;;;:67;-1:-1:-1;27918:4:0;;-1:-1:-1;;8967:13:0;;8951:29;;8943:38;;;;;;24090:1;27235:695;;;;:::o;6206:79::-;6271:6;;;;;-1:-1:-1;;;;;6271:6:0;;6206:79::o;18478:113::-;18536:4;18560:23;18536:4;18575:7;18560:23;:14;:23;:::i;6541:92::-;6619:6;;;;;-1:-1:-1;;;;;6619:6:0;6605:10;:20;;6541:92::o;30111:400::-;30173:4;-1:-1:-1;;;;;30198:20:0;;;;30190:66;;;;-1:-1:-1;;;;;30190:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30267:20;30290:24;30307:6;30290:16;:24::i;:::-;30267:47;-1:-1:-1;30329:26:0;;30325:67;;;30379:1;30372:8;;;;;30325:67;-1:-1:-1;;;;;30447:22:0;;30404:20;30447:22;;;:14;:22;;;;;;30427:43;;:15;;:43;:19;:43;:::i;:::-;30404:66;30111:400;-1:-1:-1;;;;30111:400:0:o;21215:364::-;19510:23;19522:10;19510:11;:23::i;:::-;19502:78;;;;;;-1:-1:-1;;;;;19502:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21295:21:0;;;;21287:66;;;;;-1:-1:-1;;;;;21287:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21372:21:0;;21383:10;21372:21;;21364:58;;;;;-1:-1:-1;;;;;21364:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21441:22:0;;;;;;:13;:22;;;;;;;;21433:59;;;;;;;-1:-1:-1;;;;;21433:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21503:22:0;;21528:5;21503:22;;;:13;:22;;;;;;;;;:30;;-1:-1:-1;;21503:30:0;;;21549:22;;;;;;;;;;;;;;;;;21215:364;:::o;20847:360::-;19510:23;19522:10;19510:11;:23::i;:::-;19502:78;;;;;;-1:-1:-1;;;;;19502:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20925:21:0;;;;20917:64;;;;;-1:-1:-1;;;;;20917:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21000:21:0;;21011:10;21000:21;;20992:56;;;;;-1:-1:-1;;;;;20992:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21068:22:0;;;;;;:13;:22;;;;;;;;21067:23;21059:64;;;;;-1:-1:-1;;;;;21059:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21134:22:0;;;;;;:13;:22;;;;;;;;;:29;;-1:-1:-1;;21134:29:0;21159:4;21134:29;;;21179:20;;;;;;;;;;;;;;;;;20847:360;:::o;19806:101::-;19510:23;19522:10;19510:11;:23::i;:::-;19502:78;;;;;;-1:-1:-1;;;;;19502:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19877:22;19891:7;19877:13;:22::i;24860:466::-;18304:22;18315:10;18304;:22::i;:::-;18296:76;;;;;;-1:-1:-1;;;;;18296:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24247:9;;;;;;;24239:59;;;;;;-1:-1:-1;;;;;24239:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4822:7;;;;4821:8;4813:17;;;;;;24958:12;;;24950:54;;;;;-1:-1:-1;;;;;24950:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25039:21;;:34;;25065:7;25039:34;:25;:34;:::i;:::-;25015:21;:58;25099:12;;:25;;25116:7;25099:25;:16;:25;:::i;:::-;25084:12;:40;25176:24;;;;;;;;25150:10;;;;25176:24;;;;;;;;;25213:12;;:65;;-1:-1:-1;;;;;25213:12:0;25243:10;25263:4;25270:7;25213:65;:29;:65;:::i;23174:46::-;;;;;;;;;;;;;:::o;22650:21::-;;;;:::o;22953:31::-;;;;:::o;7313:109::-;6418:9;:7;:9::i;:::-;6410:18;;;;;;;;7386:28;7405:8;7386:18;:28::i;19683:115::-;19742:4;19766:24;:11;19782:7;19766:24;:15;:24;:::i;1550:150::-;1608:7;1640:5;;;1664:6;;;;1656:15;;;;;;1691:1;-1:-1:-1;1550:150:0;;;;;:::o;13565:176::-;13674:58;;;-1:-1:-1;;;;;13674:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;13674:58:0;;;;;;;;25:18:-1;;61:17;;13674:58:0;182:15:-1;13697:23:0;179:29:-1;160:49;;13648:85:0;;13667:5;;13648:18;:85::i;:::-;13565:176;;;:::o;20153:139::-;20216:27;:11;20235:7;20216:27;:18;:27;:::i;:::-;20259:25;;-1:-1:-1;;;;;20259:25:0;;;;;;;;20153:139;:::o;12270:627::-;12330:4;12842:20;;12881:8;;12270:627::o;1312:150::-;1370:7;1398:6;;;;1390:15;;;;;;-1:-1:-1;1428:5:0;;;1312:150::o;18932:136::-;18994:26;:10;19012:7;18994:26;:17;:26;:::i;:::-;19036:24;;-1:-1:-1;;;;;19036:24:0;;;;;;;;18932:136;:::o;31657:230::-;31796:3;31819:60;31865:12;31819:37;31823:13;31842;31819:37;:22;:37;:::i;:::-;:41;:60;:41;:60;:::i;9368:549::-;9424:6;9667;;9663:47;;;-1:-1:-1;9697:1:0;9690:8;;9663:47;9732:1;-1:-1:-1;;9732:7:0;:26;;;;;9268:7;9743:1;:15;9732:26;9730:29;9722:38;;;;;;9853:5;;;9857:1;9853;:5;9877;;;;;;;;:10;9869:19;;;;;10697:178;10753:6;10783:5;;;10808:6;;;;;;:16;;;10823:1;10818;:6;;10808:16;10807:38;;;;10834:1;10830;:5;:14;;;;;10843:1;10839;:5;10830:14;10799:47;;;;;;;32829:106;-1:-1:-1;;;;;32909:18:0;32886:3;32909:18;;;:9;:18;;;;;;;32829:106::o;2874:165::-;2946:4;-1:-1:-1;;;;;2971:21:0;;;;2963:30;;;;;;-1:-1:-1;;;;;;3011:20:0;:11;:20;;;;;;;;;;;;;;;2874:165::o;18796:128::-;18855:23;:10;18870:7;18855:23;:14;:23;:::i;:::-;18894:22;;-1:-1:-1;;;;;18894:22:0;;;;;;;;18796:128;:::o;3942:130::-;4002:24;:8;4018:7;4002:24;:15;:24;:::i;:::-;4042:22;;-1:-1:-1;;;;;4042:22:0;;;;;;;;3942:130;:::o;3812:122::-;3869:21;:8;3882:7;3869:21;:12;:21;:::i;:::-;3906:20;;-1:-1:-1;;;;;3906:20:0;;;;;;;;3812:122;:::o;303:433::-;361:7;605:6;;601:47;;;-1:-1:-1;635:1:0;628:8;;601:47;672:5;;;676:1;672;:5;696;;;;;;;;:10;688:19;;;;;871:303;929:7;1024:5;;;1016:14;;;;;;1041:9;1057:1;1053;:5;;;;;;;;;871:303;-1:-1:-1;;;;871:303:0:o;30680:410::-;30745:4;-1:-1:-1;;;;;30770:20:0;;;;30762:66;;;;-1:-1:-1;;;;;30762:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30857:15;;:33;;;;;;-1:-1:-1;;;;;30857:33:0;;;;;;;;;30839:15;;30857;;;;;:25;;:33;;;;;;;;;;;;;;;:15;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;30857:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30857:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30857:33:0;;-1:-1:-1;30929:15:0;30947;30955:6;30947:7;:15::i;:::-;30929:33;;30973:11;30987:71;31005:13;:11;:13::i;:::-;31020:12;;31034:10;31046:11;30987:17;:71::i;:::-;30973:85;30680:410;-1:-1:-1;;;;;30680:410:0:o;20010:131::-;20070:24;:11;20086:7;20070:24;:15;:24;:::i;:::-;20110:23;;-1:-1:-1;;;;;20110:23:0;;;;;;;;20010:131;:::o;13749:204::-;13876:68;;;-1:-1:-1;;;;;13876:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;13876:68:0;;;;;;;;25:18:-1;;61:17;;13876:68:0;182:15:-1;13899:27:0;179:29:-1;160:49;;13850:95:0;;13869:5;;13850:18;:95::i;:::-;13749:204;;;;:::o;7572:187::-;-1:-1:-1;;;;;7646:22:0;;;;7638:31;;;;;;7706:6;;7685:38;;-1:-1:-1;;;;;7685:38:0;;;;7706:6;;;;;7685:38;;;;;7734:6;:17;;-1:-1:-1;;;;;7734:17:0;;;;;-1:-1:-1;;7734:17:0;;;;;;;;;7572:187::o;15422:887::-;15974:27;15982:5;-1:-1:-1;;;;;15974:25:0;;:27::i;:::-;15966:36;;;;;;;;16076:12;16090:23;16125:5;-1:-1:-1;;;;;16117:19:0;16137:4;16117:25;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;16117: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;;16075:67:0;;;;16161:7;16153:16;;;;;;;;16206:1;16186:10;:17;:21;16182:120;;;16270:10;16259:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16259:30:0;16251:39;;;;;;;2591:189;-1:-1:-1;;;;;2671:21:0;;;;2663:30;;;;;;2712:18;2716:4;2722:7;2712:3;:18::i;:::-;2704:27;;;;;;;;-1:-1:-1;;;;;2744:20:0;2767:5;2744:20;;;;;;;;;;;:28;;-1:-1:-1;;2744:28:0;;;2591:189::o;10050:292::-;10106:6;10133;;;10125:15;;;;;;10219:1;-1:-1:-1;;10219:7:0;:26;;;;;9268:7;10230:1;:15;10219:26;10217:29;10209:38;;;;;;10297:8;10312:1;10308;:5;;;;;;;;;10050:292;-1:-1:-1;;;;10050:292:0:o;2326:186::-;-1:-1:-1;;;;;2403:21:0;;;;2395:30;;;;;;2445:18;2449:4;2455:7;2445:3;:18::i;:::-;2444:19;2436:28;;;;;;-1:-1:-1;;;;;2477:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;2477:27:0;2500:4;2477:27;;;2326:186::o;32407:414::-;32575:4;;32613:48;32648:12;32613:30;:11;32629:13;32613:30;:15;:30;:::i;:48::-;32592:69;-1:-1:-1;32672:14:0;32689:36;32592:69;32712:12;32689:36;:22;:36;:::i;:::-;32672:53;;32736:11;32764:1;32751:10;:14;:37;;32787:1;32751:37;;;32773:10;32751:37;32736:53;32407:414;-1:-1:-1;;;;;;;;32407:414:0:o

Swarm Source

bzzr://b84c6b13272b04c34d9f14becc1ad8a82f2d4e9dbcc397a414a853d738dda5ff

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.