More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 4,214 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer | 20453370 | 38 days ago | IN | 0 ETH | 0.00006 | ||||
Transfer | 17896039 | 396 days ago | IN | 0 ETH | 0.00024551 | ||||
Transfer | 15559341 | 723 days ago | IN | 0 ETH | 0.00019984 | ||||
Transfer | 14346297 | 917 days ago | IN | 0 ETH | 0.00044765 | ||||
Transfer | 14152801 | 947 days ago | IN | 0 ETH | 0.00534491 | ||||
Transfer | 12926497 | 1138 days ago | IN | 0 ETH | 0.0021513 | ||||
Withdraw | 12920177 | 1139 days ago | IN | 0 ETH | 0.00265086 | ||||
Transfer | 12872782 | 1147 days ago | IN | 0 ETH | 0.00120252 | ||||
Transfer | 12714777 | 1171 days ago | IN | 0 ETH | 0.00035175 | ||||
Transfer | 12663911 | 1179 days ago | IN | 0 ETH | 0.00086052 | ||||
Transfer | 12637042 | 1184 days ago | IN | 0 ETH | 0.00030483 | ||||
Transfer | 12609083 | 1188 days ago | IN | 0 ETH | 0.00068841 | ||||
Transfer | 12604597 | 1189 days ago | IN | 0 ETH | 0.00084646 | ||||
Withdraw | 12603325 | 1189 days ago | IN | 0 ETH | 0.00124072 | ||||
Whitelist | 12603306 | 1189 days ago | IN | 0 ETH | 0.00031746 | ||||
Transfer | 12588354 | 1191 days ago | IN | 0 ETH | 0.00038796 | ||||
Transfer | 12580230 | 1192 days ago | IN | 0 ETH | 0.00108859 | ||||
Transfer | 12567638 | 1194 days ago | IN | 0 ETH | 0.00159885 | ||||
Transfer | 12567560 | 1194 days ago | IN | 0 ETH | 0.00180857 | ||||
Transfer | 12567411 | 1194 days ago | IN | 0 ETH | 0.0003171 | ||||
Transfer | 12567068 | 1194 days ago | IN | 0 ETH | 0.000357 | ||||
Transfer | 12541761 | 1198 days ago | IN | 0 ETH | 0.000315 | ||||
Transfer | 12537794 | 1199 days ago | IN | 0 ETH | 0.00080251 | ||||
Transfer | 12528098 | 1200 days ago | IN | 0 ETH | 0.00187598 | ||||
Transfer | 12393859 | 1221 days ago | IN | 0 ETH | 0.00231 |
Loading...
Loading
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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
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
Loading...
Loading
Loading...
Loading
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.