Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 24,414 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Exit | 20887258 | 81 days ago | IN | 0 ETH | 0.0051374 | ||||
Get Reward | 20588508 | 123 days ago | IN | 0 ETH | 0.0001491 | ||||
Get Reward | 20498895 | 135 days ago | IN | 0 ETH | 0.00020134 | ||||
Get Reward | 19002399 | 345 days ago | IN | 0 ETH | 0.00193472 | ||||
Get Reward | 18304499 | 442 days ago | IN | 0 ETH | 0.00077678 | ||||
Withdraw | 18242688 | 451 days ago | IN | 0 ETH | 0.00150901 | ||||
Exit | 16925890 | 636 days ago | IN | 0 ETH | 0.00446954 | ||||
Get Reward | 16548601 | 689 days ago | IN | 0 ETH | 0.00502639 | ||||
Withdraw | 16548594 | 689 days ago | IN | 0 ETH | 0.0023174 | ||||
Withdraw | 16548587 | 689 days ago | IN | 0 ETH | 0.0019058 | ||||
Withdraw | 16548581 | 689 days ago | IN | 0 ETH | 0.00200815 | ||||
Withdraw | 16548562 | 689 days ago | IN | 0 ETH | 0.00211084 | ||||
Withdraw | 16541419 | 690 days ago | IN | 0 ETH | 0.00289819 | ||||
Get Reward | 16465131 | 701 days ago | IN | 0 ETH | 0.00224365 | ||||
Withdraw | 16441013 | 704 days ago | IN | 0 ETH | 0.00363839 | ||||
Withdraw | 15983113 | 768 days ago | IN | 0 ETH | 0.00195088 | ||||
Withdraw | 15862061 | 785 days ago | IN | 0 ETH | 0.00093143 | ||||
Get Reward | 15614852 | 820 days ago | IN | 0 ETH | 0.00078196 | ||||
Withdraw | 15614746 | 820 days ago | IN | 0 ETH | 0.00077649 | ||||
Get Reward | 15519767 | 833 days ago | IN | 0 ETH | 0.00107549 | ||||
Exit | 15502703 | 836 days ago | IN | 0 ETH | 0.00394881 | ||||
Get Reward | 15445802 | 845 days ago | IN | 0 ETH | 0.00154827 | ||||
Withdraw | 15445801 | 845 days ago | IN | 0 ETH | 0.00122913 | ||||
Withdraw | 15336927 | 863 days ago | IN | 0 ETH | 0.00028899 | ||||
Withdraw | 15336817 | 863 days ago | IN | 0 ETH | 0.00050806 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
CurveRewards
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-04-22 */ /* ____ __ __ __ _ / __/__ __ ___ / /_ / / ___ / /_ (_)__ __ _\ \ / // // _ \/ __// _ \/ -_)/ __// / \ \ / /___/ \_, //_//_/\__//_//_/\__/ \__//_/ /_\_\ /___/ * Synthetix: CurveRewards.sol * * Docs: https://docs.synthetix.io/ * * * MIT License * =========== * * Copyright (c) 2020 Synthetix * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE */ // File: @openzeppelin/contracts/math/Math.sol pragma solidity ^0.5.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.5.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/ownership/Ownable.sol pragma solidity ^0.5.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { _owner = _msgSender(); emit OwnershipTransferred(address(0), _owner); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _owner; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.5.5; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * This test is non-exhaustive, and there may be false-negatives: during the * execution of a contract's constructor, its address will be reported as * not containing a contract. * * IMPORTANT: It is unsafe to assume that an address for which this * function returns false is an externally-owned account (EOA) and not a * contract. */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != 0x0 && codehash != accountHash); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.5.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/IRewardDistributionRecipient.sol pragma solidity ^0.5.0; contract IRewardDistributionRecipient is Ownable { address rewardDistribution; function notifyRewardAmount(uint256 reward) external; modifier onlyRewardDistribution() { require(_msgSender() == rewardDistribution, "Caller is not reward distribution"); _; } function setRewardDistribution(address _rewardDistribution) external onlyOwner { rewardDistribution = _rewardDistribution; } } // File: contracts/CurveRewards.sol pragma solidity ^0.5.0; contract LPTokenWrapper { using SafeMath for uint256; using SafeERC20 for IERC20; IERC20 public uni = IERC20(0xC25a3A3b969415c80451098fa907EC722572917F); uint256 private _totalSupply; mapping(address => uint256) private _balances; function totalSupply() public view returns (uint256) { return _totalSupply; } function balanceOf(address account) public view returns (uint256) { return _balances[account]; } function stake(uint256 amount) public { _totalSupply = _totalSupply.add(amount); _balances[msg.sender] = _balances[msg.sender].add(amount); uni.safeTransferFrom(msg.sender, address(this), amount); } function withdraw(uint256 amount) public { _totalSupply = _totalSupply.sub(amount); _balances[msg.sender] = _balances[msg.sender].sub(amount); uni.safeTransfer(msg.sender, amount); } } contract CurveRewards is LPTokenWrapper, IRewardDistributionRecipient { IERC20 public snx = IERC20(0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F); uint256 public constant DURATION = 7 days; uint256 public periodFinish = 0; uint256 public rewardRate = 0; uint256 public lastUpdateTime; uint256 public rewardPerTokenStored; mapping(address => uint256) public userRewardPerTokenPaid; mapping(address => uint256) public rewards; event RewardAdded(uint256 reward); event Staked(address indexed user, uint256 amount); event Withdrawn(address indexed user, uint256 amount); event RewardPaid(address indexed user, uint256 reward); modifier updateReward(address account) { rewardPerTokenStored = rewardPerToken(); lastUpdateTime = lastTimeRewardApplicable(); if (account != address(0)) { rewards[account] = earned(account); userRewardPerTokenPaid[account] = rewardPerTokenStored; } _; } function lastTimeRewardApplicable() public view returns (uint256) { return Math.min(block.timestamp, periodFinish); } function rewardPerToken() public view returns (uint256) { if (totalSupply() == 0) { return rewardPerTokenStored; } return rewardPerTokenStored.add( lastTimeRewardApplicable() .sub(lastUpdateTime) .mul(rewardRate) .mul(1e18) .div(totalSupply()) ); } function earned(address account) public view returns (uint256) { return balanceOf(account) .mul(rewardPerToken().sub(userRewardPerTokenPaid[account])) .div(1e18) .add(rewards[account]); } // stake visibility is public as overriding LPTokenWrapper's stake() function function stake(uint256 amount) public updateReward(msg.sender) { require(amount > 0, "Cannot stake 0"); super.stake(amount); emit Staked(msg.sender, amount); } function withdraw(uint256 amount) public updateReward(msg.sender) { require(amount > 0, "Cannot withdraw 0"); super.withdraw(amount); emit Withdrawn(msg.sender, amount); } function exit() external { withdraw(balanceOf(msg.sender)); getReward(); } function getReward() public updateReward(msg.sender) { uint256 reward = earned(msg.sender); if (reward > 0) { rewards[msg.sender] = 0; snx.safeTransfer(msg.sender, reward); emit RewardPaid(msg.sender, reward); } } function notifyRewardAmount(uint256 reward) external onlyRewardDistribution updateReward(address(0)) { if (block.timestamp >= periodFinish) { rewardRate = reward.div(DURATION); } else { uint256 remaining = periodFinish.sub(block.timestamp); uint256 leftover = remaining.mul(rewardRate); rewardRate = reward.add(leftover).div(DURATION); } lastUpdateTime = block.timestamp; periodFinish = block.timestamp.add(DURATION); emit RewardAdded(reward); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"constant":true,"inputs":[],"name":"DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"exit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"getReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rewardDistribution","type":"address"}],"name":"setRewardDistribution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"snx","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"uni","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600080546001600160a01b031990811673c25a3a3b969415c80451098fa907ec722572917f1782556005805490911673c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f17905560068190556007556100646001600160e01b036100b516565b600380546001600160a01b0319166001600160a01b0392831617908190556040519116906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36100b9565b3390565b6111d7806100c86000396000f3fe608060405234801561001057600080fd5b50600436106101575760003560e01c80638b876347116100c3578063df136d651161007c578063df136d6514610305578063e7d279981461030d578063e9fad8ee14610315578063ebe2b12b1461031d578063edc9af9514610325578063f2fde38b1461032d57610157565b80638b876347146102725780638da5cb5b146102985780638f32d59b146102bc578063a694fc3a146102d8578063c8f33c91146102f5578063cd3daf9d146102fd57610157565b80633c6b16ab116101155780633c6b16ab1461020f5780633d18b9121461022c57806370a0823114610234578063715018a61461025a5780637b0a47ee1461026257806380faa57d1461026a57610157565b80628cc2621461015c5780630700037d146101945780630d68b761146101ba57806318160ddd146101e25780631be05289146101ea5780632e1a7d4d146101f2575b600080fd5b6101826004803603602081101561017257600080fd5b50356001600160a01b0316610353565b60408051918252519081900360200190f35b610182600480360360208110156101aa57600080fd5b50356001600160a01b03166103d9565b6101e0600480360360208110156101d057600080fd5b50356001600160a01b03166103eb565b005b610182610466565b61018261046d565b6101e06004803603602081101561020857600080fd5b5035610474565b6101e06004803603602081101561022557600080fd5b503561055b565b6101e06106d5565b6101826004803603602081101561024a57600080fd5b50356001600160a01b03166107a7565b6101e06107c2565b610182610865565b61018261086b565b6101826004803603602081101561028857600080fd5b50356001600160a01b031661087e565b6102a0610890565b604080516001600160a01b039092168252519081900360200190f35b6102c461089f565b604080519115158252519081900360200190f35b6101e0600480360360208110156102ee57600080fd5b50356108c5565b6101826109a9565b6101826109af565b610182610a03565b6102a0610a09565b6101e0610a18565b610182610a33565b6102a0610a39565b6101e06004803603602081101561034357600080fd5b50356001600160a01b0316610a48565b6001600160a01b0381166000908152600b6020908152604080832054600a9092528220546103d391906103c790670de0b6b3a7640000906103bb906103a69061039a6109af565b9063ffffffff610aad16565b6103af886107a7565b9063ffffffff610af616565b9063ffffffff610b4f16565b9063ffffffff610b9116565b92915050565b600b6020526000908152604090205481565b6103f361089f565b610444576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6001545b90565b62093a8081565b3361047d6109af565b60095561048861086b565b6008556001600160a01b038116156104cf576104a381610353565b6001600160a01b0382166000908152600b6020908152604080832093909355600954600a909152919020555b60008211610518576040805162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015290519081900360640190fd5b61052182610beb565b60408051838152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a25050565b6004546001600160a01b031661056f610c4c565b6001600160a01b0316146105b45760405162461bcd60e51b81526004018080602001828103825260218152602001806111586021913960400191505060405180910390fd5b60006105be6109af565b6009556105c961086b565b6008556001600160a01b03811615610610576105e481610353565b6001600160a01b0382166000908152600b6020908152604080832093909355600954600a909152919020555b60065442106106345761062c8262093a8063ffffffff610b4f16565b600755610682565b60065460009061064a904263ffffffff610aad16565b9050600061066360075483610af690919063ffffffff16565b905061067c62093a806103bb868463ffffffff610b9116565b60075550505b42600881905561069b9062093a8063ffffffff610b9116565b6006556040805183815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a15050565b336106de6109af565b6009556106e961086b565b6008556001600160a01b038116156107305761070481610353565b6001600160a01b0382166000908152600b6020908152604080832093909355600954600a909152919020555b600061073b33610353565b905080156107a357336000818152600b602052604081205560055461076c916001600160a01b039091169083610c50565b60408051828152905133917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b5050565b6001600160a01b031660009081526002602052604090205490565b6107ca61089f565b61081b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6003546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600380546001600160a01b0319169055565b60075481565b600061087942600654610ca7565b905090565b600a6020526000908152604090205481565b6003546001600160a01b031690565b6003546000906001600160a01b03166108b6610c4c565b6001600160a01b031614905090565b336108ce6109af565b6009556108d961086b565b6008556001600160a01b03811615610920576108f481610353565b6001600160a01b0382166000908152600b6020908152604080832093909355600954600a909152919020555b60008211610966576040805162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015290519081900360640190fd5b61096f82610cbd565b60408051838152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a25050565b60085481565b60006109b9610466565b6109c6575060095461046a565b6108796109f46109d4610466565b6103bb670de0b6b3a76400006103af6007546103af60085461039a61086b565b6009549063ffffffff610b9116565b60095481565b6005546001600160a01b031681565b610a29610a24336107a7565b610474565b610a316106d5565b565b60065481565b6000546001600160a01b031681565b610a5061089f565b610aa1576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b610aaa81610d1f565b50565b6000610aef83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610dc0565b9392505050565b600082610b05575060006103d3565b82820282848281610b1257fe5b0414610aef5760405162461bcd60e51b81526004018080602001828103825260218152602001806111376021913960400191505060405180910390fd5b6000610aef83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610e57565b600082820183811015610aef576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600154610bfe908263ffffffff610aad16565b60015533600090815260026020526040902054610c21908263ffffffff610aad16565b336000818152600260205260408120929092559054610aaa916001600160a01b039091169083610c50565b3390565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ca2908490610ebc565b505050565b6000818310610cb65781610aef565b5090919050565b600154610cd0908263ffffffff610b9116565b60015533600090815260026020526040902054610cf3908263ffffffff610b9116565b336000818152600260205260408120929092559054610aaa916001600160a01b0390911690308461107a565b6001600160a01b038116610d645760405162461bcd60e51b81526004018080602001828103825260268152602001806111116026913960400191505060405180910390fd5b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b60008184841115610e4f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610e14578181015183820152602001610dfc565b50505050905090810190601f168015610e415780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183610ea65760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610e14578181015183820152602001610dfc565b506000838581610eb257fe5b0495945050505050565b610ece826001600160a01b03166110d4565b610f1f576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310610f5d5780518252601f199092019160209182019101610f3e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610fbf576040519150601f19603f3d011682016040523d82523d6000602084013e610fc4565b606091505b50915091508161101b576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156110745780806020019051602081101561103757600080fd5b50516110745760405162461bcd60e51b815260040180806020018281038252602a815260200180611179602a913960400191505060405180910390fd5b50505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611074908590610ebc565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906111085750808214155b94935050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7743616c6c6572206973206e6f742072657761726420646973747269627574696f6e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a72315820ac3d908b8371db272b8a856f99dd80208a2c371be945ec2abe26af8cb455e71064736f6c63430005100032
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101575760003560e01c80638b876347116100c3578063df136d651161007c578063df136d6514610305578063e7d279981461030d578063e9fad8ee14610315578063ebe2b12b1461031d578063edc9af9514610325578063f2fde38b1461032d57610157565b80638b876347146102725780638da5cb5b146102985780638f32d59b146102bc578063a694fc3a146102d8578063c8f33c91146102f5578063cd3daf9d146102fd57610157565b80633c6b16ab116101155780633c6b16ab1461020f5780633d18b9121461022c57806370a0823114610234578063715018a61461025a5780637b0a47ee1461026257806380faa57d1461026a57610157565b80628cc2621461015c5780630700037d146101945780630d68b761146101ba57806318160ddd146101e25780631be05289146101ea5780632e1a7d4d146101f2575b600080fd5b6101826004803603602081101561017257600080fd5b50356001600160a01b0316610353565b60408051918252519081900360200190f35b610182600480360360208110156101aa57600080fd5b50356001600160a01b03166103d9565b6101e0600480360360208110156101d057600080fd5b50356001600160a01b03166103eb565b005b610182610466565b61018261046d565b6101e06004803603602081101561020857600080fd5b5035610474565b6101e06004803603602081101561022557600080fd5b503561055b565b6101e06106d5565b6101826004803603602081101561024a57600080fd5b50356001600160a01b03166107a7565b6101e06107c2565b610182610865565b61018261086b565b6101826004803603602081101561028857600080fd5b50356001600160a01b031661087e565b6102a0610890565b604080516001600160a01b039092168252519081900360200190f35b6102c461089f565b604080519115158252519081900360200190f35b6101e0600480360360208110156102ee57600080fd5b50356108c5565b6101826109a9565b6101826109af565b610182610a03565b6102a0610a09565b6101e0610a18565b610182610a33565b6102a0610a39565b6101e06004803603602081101561034357600080fd5b50356001600160a01b0316610a48565b6001600160a01b0381166000908152600b6020908152604080832054600a9092528220546103d391906103c790670de0b6b3a7640000906103bb906103a69061039a6109af565b9063ffffffff610aad16565b6103af886107a7565b9063ffffffff610af616565b9063ffffffff610b4f16565b9063ffffffff610b9116565b92915050565b600b6020526000908152604090205481565b6103f361089f565b610444576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6001545b90565b62093a8081565b3361047d6109af565b60095561048861086b565b6008556001600160a01b038116156104cf576104a381610353565b6001600160a01b0382166000908152600b6020908152604080832093909355600954600a909152919020555b60008211610518576040805162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015290519081900360640190fd5b61052182610beb565b60408051838152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a25050565b6004546001600160a01b031661056f610c4c565b6001600160a01b0316146105b45760405162461bcd60e51b81526004018080602001828103825260218152602001806111586021913960400191505060405180910390fd5b60006105be6109af565b6009556105c961086b565b6008556001600160a01b03811615610610576105e481610353565b6001600160a01b0382166000908152600b6020908152604080832093909355600954600a909152919020555b60065442106106345761062c8262093a8063ffffffff610b4f16565b600755610682565b60065460009061064a904263ffffffff610aad16565b9050600061066360075483610af690919063ffffffff16565b905061067c62093a806103bb868463ffffffff610b9116565b60075550505b42600881905561069b9062093a8063ffffffff610b9116565b6006556040805183815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a15050565b336106de6109af565b6009556106e961086b565b6008556001600160a01b038116156107305761070481610353565b6001600160a01b0382166000908152600b6020908152604080832093909355600954600a909152919020555b600061073b33610353565b905080156107a357336000818152600b602052604081205560055461076c916001600160a01b039091169083610c50565b60408051828152905133917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b5050565b6001600160a01b031660009081526002602052604090205490565b6107ca61089f565b61081b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6003546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600380546001600160a01b0319169055565b60075481565b600061087942600654610ca7565b905090565b600a6020526000908152604090205481565b6003546001600160a01b031690565b6003546000906001600160a01b03166108b6610c4c565b6001600160a01b031614905090565b336108ce6109af565b6009556108d961086b565b6008556001600160a01b03811615610920576108f481610353565b6001600160a01b0382166000908152600b6020908152604080832093909355600954600a909152919020555b60008211610966576040805162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015290519081900360640190fd5b61096f82610cbd565b60408051838152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a25050565b60085481565b60006109b9610466565b6109c6575060095461046a565b6108796109f46109d4610466565b6103bb670de0b6b3a76400006103af6007546103af60085461039a61086b565b6009549063ffffffff610b9116565b60095481565b6005546001600160a01b031681565b610a29610a24336107a7565b610474565b610a316106d5565b565b60065481565b6000546001600160a01b031681565b610a5061089f565b610aa1576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b610aaa81610d1f565b50565b6000610aef83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610dc0565b9392505050565b600082610b05575060006103d3565b82820282848281610b1257fe5b0414610aef5760405162461bcd60e51b81526004018080602001828103825260218152602001806111376021913960400191505060405180910390fd5b6000610aef83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610e57565b600082820183811015610aef576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600154610bfe908263ffffffff610aad16565b60015533600090815260026020526040902054610c21908263ffffffff610aad16565b336000818152600260205260408120929092559054610aaa916001600160a01b039091169083610c50565b3390565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ca2908490610ebc565b505050565b6000818310610cb65781610aef565b5090919050565b600154610cd0908263ffffffff610b9116565b60015533600090815260026020526040902054610cf3908263ffffffff610b9116565b336000818152600260205260408120929092559054610aaa916001600160a01b0390911690308461107a565b6001600160a01b038116610d645760405162461bcd60e51b81526004018080602001828103825260268152602001806111116026913960400191505060405180910390fd5b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b60008184841115610e4f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610e14578181015183820152602001610dfc565b50505050905090810190601f168015610e415780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183610ea65760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610e14578181015183820152602001610dfc565b506000838581610eb257fe5b0495945050505050565b610ece826001600160a01b03166110d4565b610f1f576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310610f5d5780518252601f199092019160209182019101610f3e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610fbf576040519150601f19603f3d011682016040523d82523d6000602084013e610fc4565b606091505b50915091508161101b576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156110745780806020019051602081101561103757600080fd5b50516110745760405162461bcd60e51b815260040180806020018281038252602a815260200180611179602a913960400191505060405180910390fd5b50505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611074908590610ebc565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906111085750808214155b94935050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7743616c6c6572206973206e6f742072657761726420646973747269627574696f6e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a72315820ac3d908b8371db272b8a856f99dd80208a2c371be945ec2abe26af8cb455e71064736f6c63430005100032
Deployed Bytecode Sourcemap
22845:3350:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22845:3350:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24441:265;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24441:265:0;-1:-1:-1;;;;;24441:265:0;;:::i;:::-;;;;;;;;;;;;;;;;23265:42;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23265:42:0;-1:-1:-1;;;;;23265:42:0;;:::i;21658:161::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21658:161:0;-1:-1:-1;;;;;21658:161:0;;:::i;:::-;;22169:91;;;:::i;22999:41::-;;;:::i;24996:203::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24996:203:0;;:::i;25604:588::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25604:588:0;;:::i;25312:284::-;;;:::i;22268:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22268:110:0;-1:-1:-1;;;;;22268:110:0;;:::i;10691:140::-;;;:::i;23087:29::-;;;:::i;23874:131::-;;;:::i;23201:57::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23201:57:0;-1:-1:-1;;;;;23201:57:0;;:::i;9880:79::-;;;:::i;:::-;;;;-1:-1:-1;;;;;9880:79:0;;;;;;;;;;;;;;10246:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;24797:191;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24797:191:0;;:::i;23123:29::-;;;:::i;24013:420::-;;;:::i;23159:35::-;;;:::i;22922:70::-;;;:::i;25207:97::-;;;:::i;23049:31::-;;;:::i;22001:70::-;;;:::i;10986:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10986:109:0;-1:-1:-1;;;;;10986:109:0;;:::i;24441:265::-;-1:-1:-1;;;;;24681:16:0;;24495:7;24681:16;;;:7;:16;;;;;;;;;24597:22;:31;;;;;;24535:163;;24681:16;24535:123;;24653:4;;24535:95;;24576:53;;:16;:14;:16::i;:::-;:20;:53;:20;:53;:::i;:::-;24535:18;24545:7;24535:9;:18::i;:::-;:40;:95;:40;:95;:::i;:::-;:117;:123;:117;:123;:::i;:::-;:145;:163;:145;:163;:::i;:::-;24515:183;24441:265;-1:-1:-1;;24441:265:0:o;23265:42::-;;;;;;;;;;;;;:::o;21658:161::-;10092:9;:7;:9::i;:::-;10084:54;;;;;-1:-1:-1;;;10084:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21771:18;:40;;-1:-1:-1;;;;;;21771:40:0;-1:-1:-1;;;;;21771:40:0;;;;;;;;;;21658:161::o;22169:91::-;22240:12;;22169:91;;:::o;22999:41::-;23034:6;22999:41;:::o;24996:203::-;25050:10;23609:16;:14;:16::i;:::-;23586:20;:39;23653:26;:24;:26::i;:::-;23636:14;:43;-1:-1:-1;;;;;23694:21:0;;;23690:157;;23751:15;23758:7;23751:6;:15::i;:::-;-1:-1:-1;;;;;23732:16:0;;;;;;:7;:16;;;;;;;;:34;;;;23815:20;;23781:22;:31;;;;;;:54;23690:157;25090:1;25081:6;:10;25073:40;;;;;-1:-1:-1;;;25073:40:0;;;;;;;;;;;;-1:-1:-1;;;25073:40:0;;;;;;;;;;;;;;;25124:22;25139:6;25124:14;:22::i;:::-;25162:29;;;;;;;;25172:10;;25162:29;;;;;;;;;;24996:203;;:::o;25604:588::-;21574:18;;-1:-1:-1;;;;;21574:18:0;21558:12;:10;:12::i;:::-;-1:-1:-1;;;;;21558:34:0;;21550:80;;;;-1:-1:-1;;;21550:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25728:1;23609:16;:14;:16::i;:::-;23586:20;:39;23653:26;:24;:26::i;:::-;23636:14;:43;-1:-1:-1;;;;;23694:21:0;;;23690:157;;23751:15;23758:7;23751:6;:15::i;:::-;-1:-1:-1;;;;;23732:16:0;;;;;;:7;:16;;;;;;;;:34;;;;23815:20;;23781:22;:31;;;;;;:54;23690:157;25771:12;;25752:15;:31;25748:304;;25813:20;:6;23034;25813:20;:10;:20;:::i;:::-;25800:10;:33;25748:304;;;25886:12;;25866:17;;25886:33;;25903:15;25886:33;:16;:33;:::i;:::-;25866:53;;25934:16;25953:25;25967:10;;25953:9;:13;;:25;;;;:::i;:::-;25934:44;-1:-1:-1;26006:34:0;23034:6;26006:20;:6;25934:44;26006:20;:10;:20;:::i;:34::-;25993:10;:47;-1:-1:-1;;25748:304:0;26079:15;26062:14;:32;;;26120:29;;23034:6;26120:29;:19;:29;:::i;:::-;26105:12;:44;26165:19;;;;;;;;;;;;;;;;;21641:1;25604:588;:::o;25312:284::-;25353:10;23609:16;:14;:16::i;:::-;23586:20;:39;23653:26;:24;:26::i;:::-;23636:14;:43;-1:-1:-1;;;;;23694:21:0;;;23690:157;;23751:15;23758:7;23751:6;:15::i;:::-;-1:-1:-1;;;;;23732:16:0;;;;;;:7;:16;;;;;;;;:34;;;;23815:20;;23781:22;:31;;;;;;:54;23690:157;25376:14;25393:18;25400:10;25393:6;:18::i;:::-;25376:35;-1:-1:-1;25426:10:0;;25422:167;;25461:10;25475:1;25453:19;;;:7;:19;;;;;:23;25491:3;;:36;;-1:-1:-1;;;;;25491:3:0;;;;25520:6;25491:16;:36::i;:::-;25547:30;;;;;;;;25558:10;;25547:30;;;;;;;;;;25422:167;23857:1;25312:284;:::o;22268:110::-;-1:-1:-1;;;;;22352:18:0;22325:7;22352:18;;;:9;:18;;;;;;;22268:110::o;10691:140::-;10092:9;:7;:9::i;:::-;10084:54;;;;;-1:-1:-1;;;10084:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10774:6;;10753:40;;10790:1;;-1:-1:-1;;;;;10774:6:0;;10753:40;;10790:1;;10753:40;10804:6;:19;;-1:-1:-1;;;;;;10804:19:0;;;10691:140::o;23087:29::-;;;;:::o;23874:131::-;23931:7;23958:39;23967:15;23984:12;;23958:8;:39::i;:::-;23951:46;;23874:131;:::o;23201:57::-;;;;;;;;;;;;;:::o;9880:79::-;9945:6;;-1:-1:-1;;;;;9945:6:0;9880:79;:::o;10246:94::-;10326:6;;10286:4;;-1:-1:-1;;;;;10326:6:0;10310:12;:10;:12::i;:::-;-1:-1:-1;;;;;10310:22:0;;10303:29;;10246:94;:::o;24797:191::-;24848:10;23609:16;:14;:16::i;:::-;23586:20;:39;23653:26;:24;:26::i;:::-;23636:14;:43;-1:-1:-1;;;;;23694:21:0;;;23690:157;;23751:15;23758:7;23751:6;:15::i;:::-;-1:-1:-1;;;;;23732:16:0;;;;;;:7;:16;;;;;;;;:34;;;;23815:20;;23781:22;:31;;;;;;:54;23690:157;24888:1;24879:6;:10;24871:37;;;;;-1:-1:-1;;;24871:37:0;;;;;;;;;;;;-1:-1:-1;;;24871:37:0;;;;;;;;;;;;;;;24919:19;24931:6;24919:11;:19::i;:::-;24954:26;;;;;;;;24961:10;;24954:26;;;;;;;;;;24797:191;;:::o;23123:29::-;;;;:::o;24013:420::-;24060:7;24084:13;:11;:13::i;:::-;24080:78;;-1:-1:-1;24126:20:0;;24119:27;;24080:78;24188:237;24231:179;24396:13;:11;:13::i;:::-;24231:138;24364:4;24231:106;24326:10;;24231:68;24284:14;;24231:26;:24;:26::i;:179::-;24188:20;;;:237;:24;:237;:::i;23159:35::-;;;;:::o;22922:70::-;;;-1:-1:-1;;;;;22922:70:0;;:::o;25207:97::-;25243:31;25252:21;25262:10;25252:9;:21::i;:::-;25243:8;:31::i;:::-;25285:11;:9;:11::i;:::-;25207:97::o;23049:31::-;;;;:::o;22001:70::-;;;-1:-1:-1;;;;;22001:70:0;;:::o;10986:109::-;10092:9;:7;:9::i;:::-;10084:54;;;;;-1:-1:-1;;;10084:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11059:28;11078:8;11059:18;:28::i;:::-;10986:109;:::o;3630:136::-;3688:7;3715:43;3719:1;3722;3715:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;3708:50;3630:136;-1:-1:-1;;;3630:136:0:o;4546:471::-;4604:7;4849:6;4845:47;;-1:-1:-1;4879:1:0;4872:8;;4845:47;4916:5;;;4920:1;4916;:5;:1;4940:5;;;;;:10;4932:56;;;;-1:-1:-1;;;4932:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5485:132;5543:7;5570:39;5574:1;5577;5570:39;;;;;;;;;;;;;;;;;:3;:39::i;3174:181::-;3232:7;3264:5;;;3288:6;;;;3280:46;;;;;-1:-1:-1;;;3280:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;22624:214;22691:12;;:24;;22708:6;22691:24;:16;:24;:::i;:::-;22676:12;:39;22760:10;22750:21;;;;:9;:21;;;;;;:33;;22776:6;22750:33;:25;:33;:::i;:::-;22736:10;22726:21;;;;:9;:21;;;;;:57;;;;22794:3;;:36;;-1:-1:-1;;;;;22794:3:0;;;;22823:6;22794:16;:36::i;8629:98::-;8709:10;8629:98;:::o;18107:176::-;18216:58;;;-1:-1:-1;;;;;18216:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;18216:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;18190:85:0;;18209:5;;18190:18;:85::i;:::-;18107:176;;;:::o;1836:106::-;1894:7;1925:1;1921;:5;:13;;1933:1;1921:13;;;-1:-1:-1;1929:1:0;;1836:106;-1:-1:-1;1836:106:0:o;22386:230::-;22450:12;;:24;;22467:6;22450:24;:16;:24;:::i;:::-;22435:12;:39;22519:10;22509:21;;;;:9;:21;;;;;;:33;;22535:6;22509:33;:25;:33;:::i;:::-;22495:10;22485:21;;;;:9;:21;;;;;:57;;;;22553:3;;:55;;-1:-1:-1;;;;;22553:3:0;;;;22594:4;22601:6;22553:20;:55::i;11201:229::-;-1:-1:-1;;;;;11275:22:0;;11267:73;;;;-1:-1:-1;;;11267:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11377:6;;11356:38;;-1:-1:-1;;;;;11356:38:0;;;;11377:6;;11356:38;;11377:6;;11356:38;11405:6;:17;;-1:-1:-1;;;;;;11405:17:0;-1:-1:-1;;;;;11405:17:0;;;;;;;;;;11201:229::o;4103:192::-;4189:7;4225:12;4217:6;;;;4209:29;;;;-1:-1:-1;;;4209:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;4209:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4261:5:0;;;4103:192::o;6147:345::-;6233:7;6335:12;6328:5;6320:28;;;;-1:-1:-1;;;6320:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;6320:28:0;;6359:9;6375:1;6371;:5;;;;;;;6147:345;-1:-1:-1;;;;;6147:345:0:o;20146:1114::-;20750:27;20758:5;-1:-1:-1;;;;;20750:25:0;;:27::i;:::-;20742:71;;;;;-1:-1:-1;;;20742:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20887:12;20901:23;20936:5;-1:-1:-1;;;;;20928:19:0;20948:4;20928:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;20928: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;;20886:67:0;;;;20972:7;20964:52;;;;;-1:-1:-1;;;20964:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21033:17;;:21;21029:224;;21175:10;21164:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21164:30:0;21156:85;;;;-1:-1:-1;;;21156:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20146:1114;;;;:::o;18291:204::-;18418:68;;;-1:-1:-1;;;;;18418:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;18418:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;18392:95:0;;18411:5;;18392:18;:95::i;14945:810::-;15005:4;15664:20;;15507:66;15704:15;;;;;:42;;;15735:11;15723:8;:23;;15704:42;15696:51;14945:810;-1:-1:-1;;;;14945:810:0:o
Swarm Source
bzzr://ac3d908b8371db272b8a856f99dd80208a2c371be945ec2abe26af8cb455e710
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.