Source Code
Latest 25 from a total of 575 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Get Reward | 20107804 | 620 days ago | IN | 0 ETH | 0.00036158 | ||||
| Withdraw | 18052124 | 908 days ago | IN | 0 ETH | 0.0005142 | ||||
| Withdraw | 18052123 | 908 days ago | IN | 0 ETH | 0.00101144 | ||||
| Withdraw | 15197436 | 1315 days ago | IN | 0 ETH | 0.00022651 | ||||
| Withdraw | 15197436 | 1315 days ago | IN | 0 ETH | 0.00022651 | ||||
| Withdraw | 15197436 | 1315 days ago | IN | 0 ETH | 0.00024161 | ||||
| Withdraw | 15197436 | 1315 days ago | IN | 0 ETH | 0.00041141 | ||||
| Get Reward | 15197436 | 1315 days ago | IN | 0 ETH | 0.00039282 | ||||
| Get Reward | 15197401 | 1315 days ago | IN | 0 ETH | 0.00040088 | ||||
| Get Reward | 15128614 | 1326 days ago | IN | 0 ETH | 0.00224719 | ||||
| Withdraw | 15128612 | 1326 days ago | IN | 0 ETH | 0.00279339 | ||||
| Withdraw | 14150832 | 1482 days ago | IN | 0 ETH | 0.00423111 | ||||
| Withdraw | 13964706 | 1511 days ago | IN | 0 ETH | 0.007521 | ||||
| Withdraw | 13774127 | 1540 days ago | IN | 0 ETH | 0.00777302 | ||||
| Get Reward | 13773480 | 1540 days ago | IN | 0 ETH | 0.00821361 | ||||
| Get Reward | 13767505 | 1541 days ago | IN | 0 ETH | 0.00627905 | ||||
| Withdraw | 13767462 | 1541 days ago | IN | 0 ETH | 0.0076085 | ||||
| Withdraw | 13663598 | 1558 days ago | IN | 0 ETH | 0.01052685 | ||||
| Withdraw | 13619883 | 1565 days ago | IN | 0 ETH | 0.00852753 | ||||
| Withdraw | 13574330 | 1572 days ago | IN | 0 ETH | 0.00945453 | ||||
| Get Reward | 13574326 | 1572 days ago | IN | 0 ETH | 0.00624492 | ||||
| Withdraw | 13429666 | 1595 days ago | IN | 0 ETH | 0.00919763 | ||||
| Get Reward | 13423056 | 1596 days ago | IN | 0 ETH | 0.01183156 | ||||
| Withdraw | 13419681 | 1596 days ago | IN | 0 ETH | 0.00900091 | ||||
| Get Reward | 13419667 | 1596 days ago | IN | 0 ETH | 0.00936988 |
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers.
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
|||
|---|---|---|---|---|---|---|---|---|
| Transfer | 20107804 | 620 days ago | 0 ETH | |||||
| Transfer | 18052123 | 908 days ago | 0 ETH | |||||
| Transfer | 15197436 | 1315 days ago | 0 ETH | |||||
| Transfer | 15197436 | 1315 days ago | 0 ETH | |||||
| Transfer | 15197401 | 1315 days ago | 0 ETH | |||||
| Transfer | 15128614 | 1326 days ago | 0 ETH | |||||
| Transfer | 15128612 | 1326 days ago | 0 ETH | |||||
| Transfer | 14150832 | 1482 days ago | 0 ETH | |||||
| Transfer | 13964706 | 1511 days ago | 0 ETH | |||||
| Transfer | 13774127 | 1540 days ago | 0 ETH | |||||
| Transfer | 13773480 | 1540 days ago | 0 ETH | |||||
| Transfer | 13767505 | 1541 days ago | 0 ETH | |||||
| Transfer | 13767462 | 1541 days ago | 0 ETH | |||||
| Transfer | 13663598 | 1558 days ago | 0 ETH | |||||
| Transfer | 13619883 | 1565 days ago | 0 ETH | |||||
| Transfer | 13574330 | 1572 days ago | 0 ETH | |||||
| Transfer | 13574326 | 1572 days ago | 0 ETH | |||||
| Transfer | 13429666 | 1595 days ago | 0 ETH | |||||
| Transfer | 13423056 | 1596 days ago | 0 ETH | |||||
| Transfer | 13419681 | 1596 days ago | 0 ETH | |||||
| Transfer | 13419667 | 1596 days ago | 0 ETH | |||||
| Transfer | 13413169 | 1597 days ago | 0 ETH | |||||
| Transfer | 13407981 | 1598 days ago | 0 ETH | |||||
| Transfer | 13407031 | 1598 days ago | 0 ETH | |||||
| Transfer | 13404620 | 1599 days ago | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
StakingRewards
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-04-18
*/
// Sources flattened with hardhat v2.0.7 https://hardhat.org
// File openzeppelin-solidity-2.3.0/contracts/math/Math.sol@v2.3.0
pragma solidity ^0.5.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a >= b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow, so we distribute
return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
}
}
// File openzeppelin-solidity-2.3.0/contracts/math/SafeMath.sol@v2.3.0
pragma solidity ^0.5.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
require(b > 0, "SafeMath: division by zero");
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b != 0, "SafeMath: modulo by zero");
return a % b;
}
}
// File openzeppelin-solidity-2.3.0/contracts/token/ERC20/IERC20.sol@v2.3.0
pragma solidity ^0.5.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP. Does not include
* the optional functions; to access them see `ERC20Detailed`.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a `Transfer` event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through `transferFrom`. This is
* zero by default.
*
* This value changes when `approve` or `transferFrom` are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* > Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an `Approval` event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a `Transfer` event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to `approve`. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File openzeppelin-solidity-2.3.0/contracts/token/ERC20/ERC20Detailed.sol@v2.3.0
pragma solidity ^0.5.0;
/**
* @dev Optional functions from the ERC20 standard.
*/
contract ERC20Detailed is IERC20 {
string private _name;
string private _symbol;
uint8 private _decimals;
/**
* @dev Sets the values for `name`, `symbol`, and `decimals`. All three of
* these values are immutable: they can only be set once during
* construction.
*/
constructor (string memory name, string memory symbol, uint8 decimals) public {
_name = name;
_symbol = symbol;
_decimals = decimals;
}
/**
* @dev Returns the name of the token.
*/
function name() public view returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei.
*
* > Note that this information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* `IERC20.balanceOf` and `IERC20.transfer`.
*/
function decimals() public view returns (uint8) {
return _decimals;
}
}
// File openzeppelin-solidity-2.3.0/contracts/utils/Address.sol@v2.3.0
pragma solidity ^0.5.0;
/**
* @dev Collection of functions related to the address type,
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* This test is non-exhaustive, and there may be false-negatives: during the
* execution of a contract's constructor, its address will be reported as
* not containing a contract.
*
* > It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*/
function isContract(address account) internal view returns (bool) {
// This method relies in extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
}
// File openzeppelin-solidity-2.3.0/contracts/token/ERC20/SafeERC20.sol@v2.3.0
pragma solidity ^0.5.0;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves.
// A Solidity high level call has three parts:
// 1. The target address is checked to verify it contains contract code
// 2. The call itself is made, and success asserted
// 3. The return value is decoded, which in turn checks the size of the returned data.
// solhint-disable-next-line max-line-length
require(address(token).isContract(), "SafeERC20: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = address(token).call(data);
require(success, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File openzeppelin-solidity-2.3.0/contracts/utils/ReentrancyGuard.sol@v2.3.0
pragma solidity ^0.5.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the `nonReentrant` modifier
* available, which can be aplied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*/
contract ReentrancyGuard {
/// @dev counter to allow mutex lock with only one SSTORE operation
uint256 private _guardCounter;
constructor () internal {
// The counter starts at one to prevent changing it from zero to a non-zero
// value, which is a more expensive operation.
_guardCounter = 1;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_guardCounter += 1;
uint256 localCounter = _guardCounter;
_;
require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call");
}
}
// File contracts/SyntStaking/IStakingRewards.sol
pragma solidity >=0.4.24;
// https://docs.synthetix.io/contracts/source/interfaces/istakingrewards
interface IStakingRewards {
// Views
function lastTimeRewardApplicable() external view returns (uint256);
function rewardPerToken() external view returns (uint256);
function earned(address account) external view returns (uint256);
function getRewardForDuration() external view returns (uint256);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
// Mutative
function stake(uint256 amount) external;
function withdraw(uint256 amount) external;
function getReward() external;
function exit() external;
}
// File contracts/SyntStaking/Owned.sol
pragma solidity ^0.5.16;
// https://docs.synthetix.io/contracts/source/contracts/owned
contract Owned {
address public owner;
address public nominatedOwner;
constructor(address _owner) public {
require(_owner != address(0), "Owner address cannot be 0");
owner = _owner;
emit OwnerChanged(address(0), _owner);
}
function nominateNewOwner(address _owner) external onlyOwner {
nominatedOwner = _owner;
emit OwnerNominated(_owner);
}
function acceptOwnership() external {
require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership");
emit OwnerChanged(owner, nominatedOwner);
owner = nominatedOwner;
nominatedOwner = address(0);
}
modifier onlyOwner {
_onlyOwner();
_;
}
function _onlyOwner() private view {
require(msg.sender == owner, "Only the contract owner may perform this action");
}
event OwnerNominated(address newOwner);
event OwnerChanged(address oldOwner, address newOwner);
}
// File contracts/SyntStaking/RewardsDistributionRecipient.sol
pragma solidity ^0.5.16;
// Inheritance
// https://docs.synthetix.io/contracts/RewardsDistributionRecipient
contract RewardsDistributionRecipient is Owned {
address public rewardsDistribution;
function notifyRewardAmount(uint256 reward) external;
modifier onlyRewardsDistribution() {
require(msg.sender == rewardsDistribution, "Caller is not RewardsDistribution contract");
_;
}
function setRewardsDistribution(address _rewardsDistribution) external onlyOwner {
rewardsDistribution = _rewardsDistribution;
}
}
// File contracts/SyntStaking/Pausable.sol
pragma solidity ^0.5.16;
// Inheritance
// https://docs.synthetix.io/contracts/source/contracts/pausable
contract Pausable is Owned {
uint public lastPauseTime;
bool public paused;
constructor() internal {
// This contract is abstract, and thus cannot be instantiated directly
require(owner != address(0), "Owner must be set");
// Paused will be false, and lastPauseTime will be 0 upon initialisation
}
/**
* @notice Change the paused state of the contract
* @dev Only the contract owner may call this.
*/
function setPaused(bool _paused) external onlyOwner {
// Ensure we're actually changing the state before we do anything
if (_paused == paused) {
return;
}
// Set our paused state.
paused = _paused;
// If applicable, set the last pause time.
if (paused) {
lastPauseTime = now;
}
// Let everyone know that our pause state has changed.
emit PauseChanged(paused);
}
event PauseChanged(bool isPaused);
modifier notPaused {
require(!paused, "This action cannot be performed while the contract is paused");
_;
}
}
// File contracts/SyntStaking/StakingRewards.sol
pragma solidity ^0.5.16;
// Inheritance
// https://docs.synthetix.io/contracts/source/contracts/stakingrewards
contract StakingRewards is IStakingRewards, RewardsDistributionRecipient, ReentrancyGuard, Pausable {
using SafeMath for uint256;
using SafeERC20 for IERC20;
/* ========== STATE VARIABLES ========== */
IERC20 public rewardsToken;
IERC20 public stakingToken;
uint256 public periodFinish = 0;
uint256 public rewardRate = 0;
uint256 public rewardsDuration = 6 * 4 weeks; // 6 month
uint256 public lastUpdateTime;
uint256 public rewardPerTokenStored;
mapping(address => uint256) public userRewardPerTokenPaid;
mapping(address => uint256) public rewards;
uint256 private _totalSupply;
mapping(address => uint256) private _balances;
/* ========== CONSTRUCTOR ========== */
constructor(
address _owner,
address _rewardsDistribution,
address _rewardsToken,
address _stakingToken
) public Owned(_owner) {
rewardsToken = IERC20(_rewardsToken);
stakingToken = IERC20(_stakingToken);
rewardsDistribution = _rewardsDistribution;
}
/* ========== VIEWS ========== */
function totalSupply() external view returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) external view returns (uint256) {
return _balances[account];
}
function lastTimeRewardApplicable() public view returns (uint256) {
return Math.min(block.timestamp, periodFinish);
}
function rewardPerToken() public view returns (uint256) {
if (_totalSupply == 0) {
return rewardPerTokenStored;
}
return
rewardPerTokenStored.add(
lastTimeRewardApplicable().sub(lastUpdateTime).mul(rewardRate).mul(1e18).div(_totalSupply)
);
}
function earned(address account) public view returns (uint256) {
return _balances[account].mul(rewardPerToken().sub(userRewardPerTokenPaid[account])).div(1e18).add(rewards[account]);
}
function getRewardForDuration() external view returns (uint256) {
return rewardRate.mul(rewardsDuration);
}
/* ========== MUTATIVE FUNCTIONS ========== */
function stake(uint256 amount) external nonReentrant notPaused updateReward(msg.sender) {
require(amount > 0, "Cannot stake 0");
_totalSupply = _totalSupply.add(amount);
_balances[msg.sender] = _balances[msg.sender].add(amount);
stakingToken.safeTransferFrom(msg.sender, address(this), amount);
emit Staked(msg.sender, amount);
}
function withdraw(uint256 amount) public nonReentrant updateReward(msg.sender) {
require(amount > 0, "Cannot withdraw 0");
_totalSupply = _totalSupply.sub(amount);
_balances[msg.sender] = _balances[msg.sender].sub(amount);
stakingToken.safeTransfer(msg.sender, amount);
emit Withdrawn(msg.sender, amount);
}
function getReward() public nonReentrant updateReward(msg.sender) {
uint256 reward = rewards[msg.sender];
if (reward > 0) {
rewards[msg.sender] = 0;
rewardsToken.safeTransfer(msg.sender, reward);
emit RewardPaid(msg.sender, reward);
}
}
function exit() external {
withdraw(_balances[msg.sender]);
getReward();
}
/* ========== RESTRICTED FUNCTIONS ========== */
function notifyRewardAmount(uint256 reward) external onlyRewardsDistribution updateReward(address(0)) {
if (block.timestamp >= periodFinish) {
rewardRate = reward.div(rewardsDuration);
} else {
uint256 remaining = periodFinish.sub(block.timestamp);
uint256 leftover = remaining.mul(rewardRate);
rewardRate = reward.add(leftover).div(rewardsDuration);
}
// Ensure the provided reward amount is not more than the balance in the contract.
// This keeps the reward rate in the right range, preventing overflows due to
// very high values of rewardRate in the earned and rewardsPerToken functions;
// Reward + leftover must be less than 2^256 / 10^18 to avoid overflow.
uint balance = rewardsToken.balanceOf(address(this));
require(rewardRate <= balance.div(rewardsDuration), "Provided reward too high");
lastUpdateTime = block.timestamp;
periodFinish = block.timestamp.add(rewardsDuration);
emit RewardAdded(reward);
}
// End rewards emission earlier
function updatePeriodFinish(uint timestamp) external onlyOwner updateReward(address(0)) {
periodFinish = timestamp;
}
// Added to support recovering LP Rewards from other systems such as BAL to be distributed to holders
function recoverERC20(address tokenAddress, uint256 tokenAmount) external onlyOwner {
require(tokenAddress != address(stakingToken), "Cannot withdraw the staking token");
IERC20(tokenAddress).safeTransfer(owner, tokenAmount);
emit Recovered(tokenAddress, tokenAmount);
}
function setRewardsDuration(uint256 _rewardsDuration) external onlyOwner {
require(
block.timestamp > periodFinish,
"Previous rewards period must be complete before changing the duration for the new period"
);
rewardsDuration = _rewardsDuration;
emit RewardsDurationUpdated(rewardsDuration);
}
/* ========== MODIFIERS ========== */
modifier updateReward(address account) {
rewardPerTokenStored = rewardPerToken();
lastUpdateTime = lastTimeRewardApplicable();
if (account != address(0)) {
rewards[account] = earned(account);
userRewardPerTokenPaid[account] = rewardPerTokenStored;
}
_;
}
/* ========== EVENTS ========== */
event RewardAdded(uint256 reward);
event Staked(address indexed user, uint256 amount);
event Withdrawn(address indexed user, uint256 amount);
event RewardPaid(address indexed user, uint256 reward);
event RewardsDurationUpdated(uint256 newDuration);
event Recovered(address token, uint256 amount);
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_rewardsDistribution","type":"address"},{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_stakingToken","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isPaused","type":"bool"}],"name":"PauseChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newDuration","type":"uint256"}],"name":"RewardsDurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"exit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"getReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastPauseTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"nominateNewOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardsDistribution","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardsDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rewardsDistribution","type":"address"}],"name":"setRewardsDistribution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_rewardsDuration","type":"uint256"}],"name":"setRewardsDuration","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"updatePeriodFinish","outputs":[],"payable":false,"stateMutability":"nonpayable","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
60806040526000600755600060085562dd7c0060095534801561002157600080fd5b506040516118e33803806118e38339818101604052608081101561004457600080fd5b5080516020820151604083015160609093015191929091836001600160a01b0381166100b7576040805162461bcd60e51b815260206004820152601960248201527f4f776e657220616464726573732063616e6e6f74206265203000000000000000604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b038316908117825560408051928352602083019190915280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a15060016003556000546001600160a01b0316610166576040805162461bcd60e51b815260206004820152601160248201527013dddb995c881b5d5cdd081899481cd95d607a1b604482015290519081900360640190fd5b600580546001600160a01b0393841661010002610100600160a81b0319909116179055600680549183166001600160a01b03199283161790556002805493909216921691909117905550611724806101bf6000396000f3fe608060405234801561001057600080fd5b50600436106101ef5760003560e01c806372f702f31161010f578063a694fc3a116100a2578063d1af0c7d11610071578063d1af0c7d14610470578063df136d6514610478578063e9fad8ee14610480578063ebe2b12b14610488576101ef565b8063a694fc3a14610426578063c8f33c9114610443578063cc1a378f1461044b578063cd3daf9d14610468576101ef565b80638980f11f116100de5780638980f11f146103c45780638b876347146103f05780638da5cb5b1461041657806391b4ded91461041e576101ef565b806372f702f3146103a457806379ba5097146103ac5780637b0a47ee146103b457806380faa57d146103bc576101ef565b8063386a95251161018757806353a47bb71161015657806353a47bb71461033d578063556f6e6b146103455780635c975abb1461036257806370a082311461037e576101ef565b8063386a9525146102ec5780633c6b16ab146102f45780633d18b912146103115780633fc6df6e14610319576101ef565b806318160ddd116101c357806318160ddd1461029957806319762143146102a15780631c1f78eb146102c75780632e1a7d4d146102cf576101ef565b80628cc262146101f45780630700037d1461022c5780631627540c1461025257806316c38b3c1461027a575b600080fd5b61021a6004803603602081101561020a57600080fd5b50356001600160a01b0316610490565b60408051918252519081900360200190f35b61021a6004803603602081101561024257600080fd5b50356001600160a01b0316610526565b6102786004803603602081101561026857600080fd5b50356001600160a01b0316610538565b005b6102786004803603602081101561029057600080fd5b50351515610594565b61021a61060e565b610278600480360360208110156102b757600080fd5b50356001600160a01b0316610615565b61021a61063f565b610278600480360360208110156102e557600080fd5b503561065d565b61021a6107ff565b6102786004803603602081101561030a57600080fd5b5035610805565b610278610a5b565b610321610b99565b604080516001600160a01b039092168252519081900360200190f35b610321610ba8565b6102786004803603602081101561035b57600080fd5b5035610bb7565b61036a610c21565b604080519115158252519081900360200190f35b61021a6004803603602081101561039457600080fd5b50356001600160a01b0316610c2a565b610321610c45565b610278610c54565b61021a610d10565b61021a610d16565b610278600480360360408110156103da57600080fd5b506001600160a01b038135169060200135610d24565b61021a6004803603602081101561040657600080fd5b50356001600160a01b0316610de1565b610321610df3565b61021a610e02565b6102786004803603602081101561043c57600080fd5b5035610e08565b61021a610fe6565b6102786004803603602081101561046157600080fd5b5035610fec565b61021a61106f565b6103216110c9565b61021a6110dd565b6102786110e3565b61021a611106565b6001600160a01b0381166000908152600d6020908152604080832054600c909252822054610520919061051490670de0b6b3a764000090610508906104e3906104d761106f565b9063ffffffff61110c16565b6001600160a01b0388166000908152600f60205260409020549063ffffffff61116916565b9063ffffffff6111c916565b9063ffffffff61123316565b92915050565b600d6020526000908152604090205481565b61054061128d565b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229181900360200190a150565b61059c61128d565b60055460ff16151581151514156105b25761060b565b6005805460ff1916821515179081905560ff16156105cf57426004555b6005546040805160ff90921615158252517f8fb6c181ee25a520cf3dd6565006ef91229fcfe5a989566c2a3b8c115570cec59181900360200190a15b50565b600e545b90565b61061d61128d565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600061065860095460085461116990919063ffffffff16565b905090565b60038054600101908190553361067161106f565b600b5561067c610d16565b600a556001600160a01b038116156106c35761069781610490565b6001600160a01b0382166000908152600d6020908152604080832093909355600b54600c909152919020555b6000831161070c576040805162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015290519081900360640190fd5b600e5461071f908463ffffffff61110c16565b600e55336000908152600f6020526040902054610742908463ffffffff61110c16565b336000818152600f602052604090209190915560065461076e916001600160a01b0390911690856112d6565b60408051848152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a25060035481146107fb576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b5050565b60095481565b6002546001600160a01b0316331461084e5760405162461bcd60e51b815260040180806020018281038252602a81526020018061167b602a913960400191505060405180910390fd5b600061085861106f565b600b55610863610d16565b600a556001600160a01b038116156108aa5761087e81610490565b6001600160a01b0382166000908152600d6020908152604080832093909355600b54600c909152919020555b60075442106108cf576009546108c790839063ffffffff6111c916565b60085561091e565b6007546000906108e5904263ffffffff61110c16565b905060006108fe6008548361116990919063ffffffff16565b60095490915061091890610508868463ffffffff61123316565b60085550505b600554604080516370a0823160e01b8152306004820152905160009261010090046001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561096e57600080fd5b505afa158015610982573d6000803e3d6000fd5b505050506040513d602081101561099857600080fd5b50516009549091506109b190829063ffffffff6111c916565b6008541115610a07576040805162461bcd60e51b815260206004820152601860248201527f50726f76696465642072657761726420746f6f20686967680000000000000000604482015290519081900360640190fd5b42600a819055600954610a20919063ffffffff61123316565b6007556040805184815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a1505050565b600380546001019081905533610a6f61106f565b600b55610a7a610d16565b600a556001600160a01b03811615610ac157610a9581610490565b6001600160a01b0382166000908152600d6020908152604080832093909355600b54600c909152919020555b336000908152600d60205260409020548015610b4157336000818152600d6020526040812055600554610b0a916101009091046001600160a01b0316908363ffffffff6112d616565b60408051828152905133917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b5050600354811461060b576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002546001600160a01b031681565b6001546001600160a01b031681565b610bbf61128d565b6000610bc961106f565b600b55610bd4610d16565b600a556001600160a01b03811615610c1b57610bef81610490565b6001600160a01b0382166000908152600d6020908152604080832093909355600b54600c909152919020555b50600755565b60055460ff1681565b6001600160a01b03166000908152600f602052604090205490565b6006546001600160a01b031681565b6001546001600160a01b03163314610c9d5760405162461bcd60e51b81526004018080602001828103825260358152602001806115ba6035913960400191505060405180910390fd5b600054600154604080516001600160a01b03938416815292909116602083015280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b60085481565b60006106584260075461132d565b610d2c61128d565b6006546001600160a01b0383811691161415610d795760405162461bcd60e51b81526004018080602001828103825260218152602001806116cf6021913960400191505060405180910390fd5b600054610d99906001600160a01b0384811691168363ffffffff6112d616565b604080516001600160a01b03841681526020810183905281517f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa28929181900390910190a15050565b600c6020526000908152604090205481565b6000546001600160a01b031681565b60045481565b600380546001019081905560055460ff1615610e555760405162461bcd60e51b815260040180806020018281038252603c81526020018061163f603c913960400191505060405180910390fd5b33610e5e61106f565b600b55610e69610d16565b600a556001600160a01b03811615610eb057610e8481610490565b6001600160a01b0382166000908152600d6020908152604080832093909355600b54600c909152919020555b60008311610ef6576040805162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015290519081900360640190fd5b600e54610f09908463ffffffff61123316565b600e55336000908152600f6020526040902054610f2c908463ffffffff61123316565b336000818152600f6020526040902091909155600654610f59916001600160a01b03909116903086611343565b60408051848152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a25060035481146107fb576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600a5481565b610ff461128d565b60075442116110345760405162461bcd60e51b81526004018080602001828103825260588152602001806115626058913960600191505060405180910390fd5b60098190556040805182815290517ffb46ca5a5e06d4540d6387b930a7c978bce0db5f449ec6b3f5d07c6e1d44f2d39181900360200190a150565b6000600e54600014156110855750600b54610612565b6106586110ba600e54610508670de0b6b3a76400006110ae6008546110ae600a546104d7610d16565b9063ffffffff61116916565b600b549063ffffffff61123316565b60055461010090046001600160a01b031681565b600b5481565b336000908152600f60205260409020546110fc9061065d565b611104610a5b565b565b60075481565b600082821115611163576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008261117857506000610520565b8282028284828161118557fe5b04146111c25760405162461bcd60e51b815260040180806020018281038252602181526020018061161e6021913960400191505060405180910390fd5b9392505050565b600080821161121f576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b600082848161122a57fe5b04949350505050565b6000828201838110156111c2576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000546001600160a01b031633146111045760405162461bcd60e51b815260040180806020018281038252602f8152602001806115ef602f913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526113289084906113a3565b505050565b600081831061133c57816111c2565b5090919050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261139d9085906113a3565b50505050565b6113b5826001600160a01b031661155b565b611406576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106114445780518252601f199092019160209182019101611425565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146114a6576040519150601f19603f3d011682016040523d82523d6000602084013e6114ab565b606091505b509150915081611502576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561139d5780806020019051602081101561151e57600080fd5b505161139d5760405162461bcd60e51b815260040180806020018281038252602a8152602001806116a5602a913960400191505060405180910390fd5b3b15159056fe50726576696f7573207265776172647320706572696f64206d75737420626520636f6d706c657465206265666f7265206368616e67696e6720746865206475726174696f6e20666f7220746865206e657720706572696f64596f75206d757374206265206e6f6d696e61746564206265666f726520796f752063616e20616363657074206f776e6572736869704f6e6c792074686520636f6e7472616374206f776e6572206d617920706572666f726d207468697320616374696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775468697320616374696f6e2063616e6e6f7420626520706572666f726d6564207768696c652074686520636f6e74726163742069732070617573656443616c6c6572206973206e6f742052657761726473446973747269627574696f6e20636f6e74726163745361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656443616e6e6f7420776974686472617720746865207374616b696e6720746f6b656ea265627a7a72315820d2d543ee660a7cb866b5d45a78281ccad414623ac5eef54b9433237fe16a46a864736f6c634300051000320000000000000000000000004d6b2becfb3570eea4ca2cfa38a1cd12483499210000000000000000000000004d6b2becfb3570eea4ca2cfa38a1cd12483499210000000000000000000000004abb9cc67bd3da9eb966d1159a71a0e68bd154320000000000000000000000000f2156fbe6142c72c150d30c2522a5988110b013
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101ef5760003560e01c806372f702f31161010f578063a694fc3a116100a2578063d1af0c7d11610071578063d1af0c7d14610470578063df136d6514610478578063e9fad8ee14610480578063ebe2b12b14610488576101ef565b8063a694fc3a14610426578063c8f33c9114610443578063cc1a378f1461044b578063cd3daf9d14610468576101ef565b80638980f11f116100de5780638980f11f146103c45780638b876347146103f05780638da5cb5b1461041657806391b4ded91461041e576101ef565b806372f702f3146103a457806379ba5097146103ac5780637b0a47ee146103b457806380faa57d146103bc576101ef565b8063386a95251161018757806353a47bb71161015657806353a47bb71461033d578063556f6e6b146103455780635c975abb1461036257806370a082311461037e576101ef565b8063386a9525146102ec5780633c6b16ab146102f45780633d18b912146103115780633fc6df6e14610319576101ef565b806318160ddd116101c357806318160ddd1461029957806319762143146102a15780631c1f78eb146102c75780632e1a7d4d146102cf576101ef565b80628cc262146101f45780630700037d1461022c5780631627540c1461025257806316c38b3c1461027a575b600080fd5b61021a6004803603602081101561020a57600080fd5b50356001600160a01b0316610490565b60408051918252519081900360200190f35b61021a6004803603602081101561024257600080fd5b50356001600160a01b0316610526565b6102786004803603602081101561026857600080fd5b50356001600160a01b0316610538565b005b6102786004803603602081101561029057600080fd5b50351515610594565b61021a61060e565b610278600480360360208110156102b757600080fd5b50356001600160a01b0316610615565b61021a61063f565b610278600480360360208110156102e557600080fd5b503561065d565b61021a6107ff565b6102786004803603602081101561030a57600080fd5b5035610805565b610278610a5b565b610321610b99565b604080516001600160a01b039092168252519081900360200190f35b610321610ba8565b6102786004803603602081101561035b57600080fd5b5035610bb7565b61036a610c21565b604080519115158252519081900360200190f35b61021a6004803603602081101561039457600080fd5b50356001600160a01b0316610c2a565b610321610c45565b610278610c54565b61021a610d10565b61021a610d16565b610278600480360360408110156103da57600080fd5b506001600160a01b038135169060200135610d24565b61021a6004803603602081101561040657600080fd5b50356001600160a01b0316610de1565b610321610df3565b61021a610e02565b6102786004803603602081101561043c57600080fd5b5035610e08565b61021a610fe6565b6102786004803603602081101561046157600080fd5b5035610fec565b61021a61106f565b6103216110c9565b61021a6110dd565b6102786110e3565b61021a611106565b6001600160a01b0381166000908152600d6020908152604080832054600c909252822054610520919061051490670de0b6b3a764000090610508906104e3906104d761106f565b9063ffffffff61110c16565b6001600160a01b0388166000908152600f60205260409020549063ffffffff61116916565b9063ffffffff6111c916565b9063ffffffff61123316565b92915050565b600d6020526000908152604090205481565b61054061128d565b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229181900360200190a150565b61059c61128d565b60055460ff16151581151514156105b25761060b565b6005805460ff1916821515179081905560ff16156105cf57426004555b6005546040805160ff90921615158252517f8fb6c181ee25a520cf3dd6565006ef91229fcfe5a989566c2a3b8c115570cec59181900360200190a15b50565b600e545b90565b61061d61128d565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600061065860095460085461116990919063ffffffff16565b905090565b60038054600101908190553361067161106f565b600b5561067c610d16565b600a556001600160a01b038116156106c35761069781610490565b6001600160a01b0382166000908152600d6020908152604080832093909355600b54600c909152919020555b6000831161070c576040805162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015290519081900360640190fd5b600e5461071f908463ffffffff61110c16565b600e55336000908152600f6020526040902054610742908463ffffffff61110c16565b336000818152600f602052604090209190915560065461076e916001600160a01b0390911690856112d6565b60408051848152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a25060035481146107fb576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b5050565b60095481565b6002546001600160a01b0316331461084e5760405162461bcd60e51b815260040180806020018281038252602a81526020018061167b602a913960400191505060405180910390fd5b600061085861106f565b600b55610863610d16565b600a556001600160a01b038116156108aa5761087e81610490565b6001600160a01b0382166000908152600d6020908152604080832093909355600b54600c909152919020555b60075442106108cf576009546108c790839063ffffffff6111c916565b60085561091e565b6007546000906108e5904263ffffffff61110c16565b905060006108fe6008548361116990919063ffffffff16565b60095490915061091890610508868463ffffffff61123316565b60085550505b600554604080516370a0823160e01b8152306004820152905160009261010090046001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561096e57600080fd5b505afa158015610982573d6000803e3d6000fd5b505050506040513d602081101561099857600080fd5b50516009549091506109b190829063ffffffff6111c916565b6008541115610a07576040805162461bcd60e51b815260206004820152601860248201527f50726f76696465642072657761726420746f6f20686967680000000000000000604482015290519081900360640190fd5b42600a819055600954610a20919063ffffffff61123316565b6007556040805184815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a1505050565b600380546001019081905533610a6f61106f565b600b55610a7a610d16565b600a556001600160a01b03811615610ac157610a9581610490565b6001600160a01b0382166000908152600d6020908152604080832093909355600b54600c909152919020555b336000908152600d60205260409020548015610b4157336000818152600d6020526040812055600554610b0a916101009091046001600160a01b0316908363ffffffff6112d616565b60408051828152905133917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b5050600354811461060b576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002546001600160a01b031681565b6001546001600160a01b031681565b610bbf61128d565b6000610bc961106f565b600b55610bd4610d16565b600a556001600160a01b03811615610c1b57610bef81610490565b6001600160a01b0382166000908152600d6020908152604080832093909355600b54600c909152919020555b50600755565b60055460ff1681565b6001600160a01b03166000908152600f602052604090205490565b6006546001600160a01b031681565b6001546001600160a01b03163314610c9d5760405162461bcd60e51b81526004018080602001828103825260358152602001806115ba6035913960400191505060405180910390fd5b600054600154604080516001600160a01b03938416815292909116602083015280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b60085481565b60006106584260075461132d565b610d2c61128d565b6006546001600160a01b0383811691161415610d795760405162461bcd60e51b81526004018080602001828103825260218152602001806116cf6021913960400191505060405180910390fd5b600054610d99906001600160a01b0384811691168363ffffffff6112d616565b604080516001600160a01b03841681526020810183905281517f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa28929181900390910190a15050565b600c6020526000908152604090205481565b6000546001600160a01b031681565b60045481565b600380546001019081905560055460ff1615610e555760405162461bcd60e51b815260040180806020018281038252603c81526020018061163f603c913960400191505060405180910390fd5b33610e5e61106f565b600b55610e69610d16565b600a556001600160a01b03811615610eb057610e8481610490565b6001600160a01b0382166000908152600d6020908152604080832093909355600b54600c909152919020555b60008311610ef6576040805162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015290519081900360640190fd5b600e54610f09908463ffffffff61123316565b600e55336000908152600f6020526040902054610f2c908463ffffffff61123316565b336000818152600f6020526040902091909155600654610f59916001600160a01b03909116903086611343565b60408051848152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a25060035481146107fb576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600a5481565b610ff461128d565b60075442116110345760405162461bcd60e51b81526004018080602001828103825260588152602001806115626058913960600191505060405180910390fd5b60098190556040805182815290517ffb46ca5a5e06d4540d6387b930a7c978bce0db5f449ec6b3f5d07c6e1d44f2d39181900360200190a150565b6000600e54600014156110855750600b54610612565b6106586110ba600e54610508670de0b6b3a76400006110ae6008546110ae600a546104d7610d16565b9063ffffffff61116916565b600b549063ffffffff61123316565b60055461010090046001600160a01b031681565b600b5481565b336000908152600f60205260409020546110fc9061065d565b611104610a5b565b565b60075481565b600082821115611163576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008261117857506000610520565b8282028284828161118557fe5b04146111c25760405162461bcd60e51b815260040180806020018281038252602181526020018061161e6021913960400191505060405180910390fd5b9392505050565b600080821161121f576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b600082848161122a57fe5b04949350505050565b6000828201838110156111c2576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000546001600160a01b031633146111045760405162461bcd60e51b815260040180806020018281038252602f8152602001806115ef602f913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526113289084906113a3565b505050565b600081831061133c57816111c2565b5090919050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261139d9085906113a3565b50505050565b6113b5826001600160a01b031661155b565b611406576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106114445780518252601f199092019160209182019101611425565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146114a6576040519150601f19603f3d011682016040523d82523d6000602084013e6114ab565b606091505b509150915081611502576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561139d5780806020019051602081101561151e57600080fd5b505161139d5760405162461bcd60e51b815260040180806020018281038252602a8152602001806116a5602a913960400191505060405180910390fd5b3b15159056fe50726576696f7573207265776172647320706572696f64206d75737420626520636f6d706c657465206265666f7265206368616e67696e6720746865206475726174696f6e20666f7220746865206e657720706572696f64596f75206d757374206265206e6f6d696e61746564206265666f726520796f752063616e20616363657074206f776e6572736869704f6e6c792074686520636f6e7472616374206f776e6572206d617920706572666f726d207468697320616374696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775468697320616374696f6e2063616e6e6f7420626520706572666f726d6564207768696c652074686520636f6e74726163742069732070617573656443616c6c6572206973206e6f742052657761726473446973747269627574696f6e20636f6e74726163745361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656443616e6e6f7420776974686472617720746865207374616b696e6720746f6b656ea265627a7a72315820d2d543ee660a7cb866b5d45a78281ccad414623ac5eef54b9433237fe16a46a864736f6c63430005100032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004d6b2becfb3570eea4ca2cfa38a1cd12483499210000000000000000000000004d6b2becfb3570eea4ca2cfa38a1cd12483499210000000000000000000000004abb9cc67bd3da9eb966d1159a71a0e68bd154320000000000000000000000000f2156fbe6142c72c150d30c2522a5988110b013
-----Decoded View---------------
Arg [0] : _owner (address): 0x4d6B2BEcfB3570Eea4CA2CFa38A1cD1248349921
Arg [1] : _rewardsDistribution (address): 0x4d6B2BEcfB3570Eea4CA2CFa38A1cD1248349921
Arg [2] : _rewardsToken (address): 0x4ABB9cC67BD3da9Eb966d1159A71a0e68BD15432
Arg [3] : _stakingToken (address): 0x0f2156FBe6142c72c150d30C2522a5988110B013
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000004d6b2becfb3570eea4ca2cfa38a1cd1248349921
Arg [1] : 0000000000000000000000004d6b2becfb3570eea4ca2cfa38a1cd1248349921
Arg [2] : 0000000000000000000000004abb9cc67bd3da9eb966d1159a71a0e68bd15432
Arg [3] : 0000000000000000000000000f2156fbe6142c72c150d30c2522a5988110b013
Deployed Bytecode Sourcemap
19799:6247:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19799:6247:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21628:198;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21628:198:0;-1:-1:-1;;;;;21628:198:0;;:::i;:::-;;;;;;;;;;;;;;;;20371:42;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20371:42:0;-1:-1:-1;;;;;20371:42:0;;:::i;16902:141::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16902:141:0;-1:-1:-1;;;;;16902:141:0;;:::i;:::-;;18940:488;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18940:488:0;;;;:::i;20930:93::-;;;:::i;18151:142::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18151:142:0;-1:-1:-1;;;;;18151:142:0;;:::i;21834:121::-;;;:::i;22404:357::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22404:357:0;;:::i;20165:44::-;;;:::i;23245:1083::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23245:1083:0;;:::i;22769:307::-;;;:::i;17885:34::-;;;:::i;:::-;;;;-1:-1:-1;;;;;17885:34:0;;;;;;;;;;;;;;16671:29;;;:::i;24373:131::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24373:131:0;;:::i;18526:18::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;21031:112;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21031:112:0;-1:-1:-1;;;;;21031:112:0;;:::i;20058:26::-;;;:::i;17051:271::-;;;:::i;20129:29::-;;;:::i;21151:131::-;;;:::i;24619:302::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24619:302:0;;;;;;;;:::i;20307:57::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20307:57:0;-1:-1:-1;;;;;20307:57:0;;:::i;16644:20::-;;;:::i;18494:25::-;;;:::i;22017:379::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22017:379:0;;:::i;20227:29::-;;;:::i;24929:360::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24929:360:0;;:::i;21290:330::-;;;:::i;20025:26::-;;;:::i;20263:35::-;;;:::i;23084:97::-;;;:::i;20091:31::-;;;:::i;21628:198::-;-1:-1:-1;;;;;21801:16:0;;21682:7;21801:16;;;:7;:16;;;;;;;;;21753:22;:31;;;;;;21709:109;;21801:16;21709:87;;21791:4;;21709:77;;21732:53;;:16;:14;:16::i;:::-;:20;:53;:20;:53;:::i;:::-;-1:-1:-1;;;;;21709:18:0;;;;;;:9;:18;;;;;;;:77;:22;:77;:::i;:::-;:81;:87;:81;:87;:::i;:::-;:91;:109;:91;:109;:::i;:::-;21702:116;21628:198;-1:-1:-1;;21628:198:0:o;20371:42::-;;;;;;;;;;;;;:::o;16902:141::-;17360:12;:10;:12::i;:::-;16974:14;:23;;-1:-1:-1;;;;;16974:23:0;;-1:-1:-1;;;;;;16974:23:0;;;;;;;;17013:22;;;;;;;;;;;;;;;;16902:141;:::o;18940:488::-;17360:12;:10;:12::i;:::-;19093:6;;;;19082:17;;;;;;19078:56;;;19116:7;;19078:56;19180:6;:16;;-1:-1:-1;;19180:16:0;;;;;;;;;;19265:6;19261:58;;;19304:3;19288:13;:19;19261:58;19413:6;;19400:20;;;19413:6;;;;19400:20;;;;;;;;;;;;;;17383:1;18940:488;:::o;20930:93::-;21003:12;;20930:93;;:::o;18151:142::-;17360:12;:10;:12::i;:::-;18243:19;:42;;-1:-1:-1;;;;;;18243:42:0;-1:-1:-1;;;;;18243:42:0;;;;;;;;;;18151:142::o;21834:121::-;21889:7;21916:31;21931:15;;21916:10;;:14;;:31;;;;:::i;:::-;21909:38;;21834:121;:::o;22404:357::-;15487:13;:18;;15504:1;15487:18;;;;;22471:10;25415:16;:14;:16::i;:::-;25392:20;:39;25459:26;:24;:26::i;:::-;25442:14;:43;-1:-1:-1;;;;;25500:21:0;;;25496:157;;25557:15;25564:7;25557:6;:15::i;:::-;-1:-1:-1;;;;;25538:16:0;;;;;;:7;:16;;;;;;;;:34;;;;25621:20;;25587:22;:31;;;;;;:54;25496:157;22511:1;22502:6;:10;22494:40;;;;;-1:-1:-1;;;22494:40:0;;;;;;;;;;;;-1:-1:-1;;;22494:40:0;;;;;;;;;;;;;;;22560:12;;:24;;22577:6;22560:24;:16;:24;:::i;:::-;22545:12;:39;22629:10;22619:21;;;;:9;:21;;;;;;:33;;22645:6;22619:33;:25;:33;:::i;:::-;22605:10;22595:21;;;;:9;:21;;;;;:57;;;;22663:12;;:45;;-1:-1:-1;;;;;22663:12:0;;;;22701:6;22663:25;:45::i;:::-;22724:29;;;;;;;;22734:10;;22724:29;;;;;;;;;;15563:1;15599:13;;15583:12;:29;15575:73;;;;;-1:-1:-1;;;15575:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22404:357;;:::o;20165:44::-;;;;:::o;23245:1083::-;18057:19;;-1:-1:-1;;;;;18057:19:0;18043:10;:33;18035:88;;;;-1:-1:-1;;;18035:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23343:1;25415:16;:14;:16::i;:::-;25392:20;:39;25459:26;:24;:26::i;:::-;25442:14;:43;-1:-1:-1;;;;;25500:21:0;;;25496:157;;25557:15;25564:7;25557:6;:15::i;:::-;-1:-1:-1;;;;;25538:16:0;;;;;;:7;:16;;;;;;;;:34;;;;25621:20;;25587:22;:31;;;;;;:54;25496:157;23381:12;;23362:15;:31;23358:318;;23434:15;;23423:27;;:6;;:27;:10;:27;:::i;:::-;23410:10;:40;23358:318;;;23503:12;;23483:17;;23503:33;;23520:15;23503:33;:16;:33;:::i;:::-;23483:53;;23551:16;23570:25;23584:10;;23570:9;:13;;:25;;;;:::i;:::-;23648:15;;23551:44;;-1:-1:-1;23623:41:0;;:20;:6;23551:44;23623:20;:10;:20;:::i;:41::-;23610:10;:54;-1:-1:-1;;23358:318:0;24051:12;;:37;;;-1:-1:-1;;;24051:37:0;;24082:4;24051:37;;;;;;-1:-1:-1;;24051:12:0;;;-1:-1:-1;;;;;24051:12:0;;:22;;:37;;;;;;;;;;;;;;:12;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;24051:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24051:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24051:37:0;24133:15;;24051:37;;-1:-1:-1;24121:28:0;;24051:37;;24121:28;:11;:28;:::i;:::-;24107:10;;:42;;24099:79;;;;;-1:-1:-1;;;24099:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24208:15;24191:14;:32;;;24269:15;;24249:36;;24208:15;24249:36;:19;:36;:::i;:::-;24234:12;:51;24301:19;;;;;;;;;;;;;;;;;25663:1;18134;23245:1083;:::o;22769:307::-;15487:13;:18;;15504:1;15487:18;;;;;22823:10;25415:16;:14;:16::i;:::-;25392:20;:39;25459:26;:24;:26::i;:::-;25442:14;:43;-1:-1:-1;;;;;25500:21:0;;;25496:157;;25557:15;25564:7;25557:6;:15::i;:::-;-1:-1:-1;;;;;25538:16:0;;;;;;:7;:16;;;;;;;;:34;;;;25621:20;;25587:22;:31;;;;;;:54;25496:157;22871:10;22846:14;22863:19;;;:7;:19;;;;;;22897:10;;22893:176;;22932:10;22946:1;22924:19;;;:7;:19;;;;;:23;22962:12;;:45;;:12;;;;-1:-1:-1;;;;;22962:12:0;;23000:6;22962:45;:25;:45;:::i;:::-;23027:30;;;;;;;;23038:10;;23027:30;;;;;;;;;;22893:176;25663:1;15563;15599:13;;15583:12;:29;15575:73;;;;;-1:-1:-1;;;15575:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;17885:34;;;-1:-1:-1;;;;;17885:34:0;;:::o;16671:29::-;;;-1:-1:-1;;;;;16671:29:0;;:::o;24373:131::-;17360:12;:10;:12::i;:::-;24457:1;25415:16;:14;:16::i;:::-;25392:20;:39;25459:26;:24;:26::i;:::-;25442:14;:43;-1:-1:-1;;;;;25500:21:0;;;25496:157;;25557:15;25564:7;25557:6;:15::i;:::-;-1:-1:-1;;;;;25538:16:0;;;;;;:7;:16;;;;;;;;:34;;;;25621:20;;25587:22;:31;;;;;;:54;25496:157;-1:-1:-1;24472:12:0;:24;24373:131::o;18526:18::-;;;;;;:::o;21031:112::-;-1:-1:-1;;;;;21117:18:0;21090:7;21117:18;;;:9;:18;;;;;;;21031:112::o;20058:26::-;;;-1:-1:-1;;;;;20058:26:0;;:::o;17051:271::-;17120:14;;-1:-1:-1;;;;;17120:14:0;17106:10;:28;17098:94;;;;-1:-1:-1;;;17098:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17221:5;;;17228:14;17208:35;;;-1:-1:-1;;;;;17221:5:0;;;17208:35;;17228:14;;;;17208:35;;;;;;;;;;;;;;;;17262:14;;;;17254:22;;-1:-1:-1;;;;;;17254:22:0;;;-1:-1:-1;;;;;17262:14:0;;17254:22;;;;17287:27;;;17051:271::o;20129:29::-;;;;:::o;21151:131::-;21208:7;21235:39;21244:15;21261:12;;21235:8;:39::i;24619:302::-;17360:12;:10;:12::i;:::-;24746;;-1:-1:-1;;;;;24722:37:0;;;24746:12;;24722:37;;24714:83;;;;-1:-1:-1;;;24714:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24842:5;;24808:53;;-1:-1:-1;;;;;24808:33:0;;;;24842:5;24849:11;24808:53;:33;:53;:::i;:::-;24877:36;;;-1:-1:-1;;;;;24877:36:0;;;;;;;;;;;;;;;;;;;;;;;24619:302;;:::o;20307:57::-;;;;;;;;;;;;;:::o;16644:20::-;;;-1:-1:-1;;;;;16644:20:0;;:::o;18494:25::-;;;;:::o;22017:379::-;15487:13;:18;;15504:1;15487:18;;;;;19517:6;;;;19516:7;19508:80;;;;-1:-1:-1;;;19508:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22093:10;25415:16;:14;:16::i;:::-;25392:20;:39;25459:26;:24;:26::i;:::-;25442:14;:43;-1:-1:-1;;;;;25500:21:0;;;25496:157;;25557:15;25564:7;25557:6;:15::i;:::-;-1:-1:-1;;;;;25538:16:0;;;;;;:7;:16;;;;;;;;:34;;;;25621:20;;25587:22;:31;;;;;;:54;25496:157;22133:1;22124:6;:10;22116:37;;;;;-1:-1:-1;;;22116:37:0;;;;;;;;;;;;-1:-1:-1;;;22116:37:0;;;;;;;;;;;;;;;22179:12;;:24;;22196:6;22179:24;:16;:24;:::i;:::-;22164:12;:39;22248:10;22238:21;;;;:9;:21;;;;;;:33;;22264:6;22238:33;:25;:33;:::i;:::-;22224:10;22214:21;;;;:9;:21;;;;;:57;;;;22282:12;;:64;;-1:-1:-1;;;;;22282:12:0;;;;22332:4;22339:6;22282:29;:64::i;:::-;22362:26;;;;;;;;22369:10;;22362:26;;;;;;;;;;19599:1;15599:13;;15583:12;:29;15575:73;;;;;-1:-1:-1;;;15575:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;20227:29;;;;:::o;24929:360::-;17360:12;:10;:12::i;:::-;25053;;25035:15;:30;25013:168;;;;-1:-1:-1;;;25013:168:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25192:15;:34;;;25242:39;;;;;;;;;;;;;;;;;24929:360;:::o;21290:330::-;21337:7;21361:12;;21377:1;21361:17;21357:77;;;-1:-1:-1;21402:20:0;;21395:27;;21357:77;21464:148;21507:90;21584:12;;21507:72;21574:4;21507:62;21558:10;;21507:46;21538:14;;21507:26;:24;:26::i;:46::-;:50;:62;:50;:62;:::i;:90::-;21464:20;;;:148;:24;:148;:::i;20025:26::-;;;;;;-1:-1:-1;;;;;20025:26:0;;:::o;20263:35::-;;;;:::o;23084:97::-;23139:10;23129:21;;;;:9;:21;;;;;;23120:31;;:8;:31::i;:::-;23162:11;:9;:11::i;:::-;23084:97::o;20091:31::-;;;;:::o;2324:184::-;2382:7;2415:1;2410;:6;;2402:49;;;;;-1:-1:-1;;;2402:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2474:5:0;;;2324:184::o;2759:470::-;2817:7;3061:6;3057:47;;-1:-1:-1;3091:1:0;3084:8;;3057:47;3128:5;;;3132:1;3128;:5;:1;3152:5;;;;;:10;3144:56;;;;-1:-1:-1;;;3144:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3220:1;2759:470;-1:-1:-1;;;2759:470:0:o;3697:333::-;3755:7;3854:1;3850;:5;3842:44;;;;;-1:-1:-1;;;3842:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3897:9;3913:1;3909;:5;;;;;;;3697:333;-1:-1:-1;;;;3697:333:0:o;1868:181::-;1926:7;1958:5;;;1982:6;;;;1974:46;;;;;-1:-1:-1;;;1974:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;17400:133;17468:5;;-1:-1:-1;;;;;17468:5:0;17454:10;:19;17446:79;;;;-1:-1:-1;;;17446:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10955:176;11064:58;;;-1:-1:-1;;;;;11064:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;11064:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;11038:85:0;;11057:5;;11038:18;:85::i;:::-;10955:176;;;:::o;508:106::-;566:7;597:1;593;:5;:13;;605:1;593:13;;;-1:-1:-1;601:1:0;;586:20;-1:-1:-1;508:106:0:o;11139:204::-;11266:68;;;-1:-1:-1;;;;;11266:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;11266:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;11240:95:0;;11259:5;;11240:18;:95::i;:::-;11139:204;;;;:::o;12949:1114::-;13553:27;13561:5;-1:-1:-1;;;;;13553:25:0;;:27::i;:::-;13545:71;;;;;-1:-1:-1;;;13545:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13690:12;13704:23;13739:5;-1:-1:-1;;;;;13731:19:0;13751:4;13731: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;;;13731: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;;13689:67:0;;;;13775:7;13767:52;;;;;-1:-1:-1;;;13767:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13836:17;;:21;13832:224;;13978:10;13967:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13967:30:0;13959:85;;;;-1:-1:-1;;;13959:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9853:422;10220:20;10259:8;;;9853:422::o
Swarm Source
bzzr://d2d543ee660a7cb866b5d45a78281ccad414623ac5eef54b9433237fe16a46a8
Loading...
Loading
Loading...
Loading
Net Worth in USD
$209.85
Net Worth in ETH
0.109417
Token Allocations
KEL
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $0.000694 | 302,255.752 | $209.85 |
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.