Source Code
Latest 25 from a total of 2,179 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Get Reward | 143641934 | 2 hrs ago | IN | 0 ETH | 0.00000002625 | ||||
| Get Reward | 143629692 | 9 hrs ago | IN | 0 ETH | 0.000000001415 | ||||
| Withdraw | 143623174 | 12 hrs ago | IN | 0 ETH | 0.000000156312 | ||||
| Get Reward | 143622718 | 13 hrs ago | IN | 0 ETH | 0.000000143683 | ||||
| Get Reward | 143617516 | 16 hrs ago | IN | 0 ETH | 0.000000130339 | ||||
| Get Reward | 143601104 | 25 hrs ago | IN | 0 ETH | 0.000000187371 | ||||
| Withdraw | 143601085 | 25 hrs ago | IN | 0 ETH | 0.000000181859 | ||||
| Get Reward | 143586632 | 33 hrs ago | IN | 0 ETH | 0.00000000229 | ||||
| Stake | 143586580 | 33 hrs ago | IN | 0 ETH | 0.000000002451 | ||||
| Get Reward | 143574105 | 40 hrs ago | IN | 0 ETH | 0.000000013836 | ||||
| Stake | 143566164 | 44 hrs ago | IN | 0 ETH | 0.000000000828 | ||||
| Get Reward | 143556340 | 2 days ago | IN | 0 ETH | 0.000000002382 | ||||
| Stake | 143553318 | 2 days ago | IN | 0 ETH | 0.000000000778 | ||||
| Stake | 143545961 | 2 days ago | IN | 0 ETH | 0.000000001025 | ||||
| Get Reward | 143518485 | 2 days ago | IN | 0 ETH | 0.000000126644 | ||||
| Get Reward | 143513840 | 3 days ago | IN | 0 ETH | 0.000000012159 | ||||
| Withdraw | 143447429 | 4 days ago | IN | 0 ETH | 0.000000162158 | ||||
| Withdraw | 143431352 | 4 days ago | IN | 0 ETH | 0.000000017747 | ||||
| Get Reward | 143430687 | 4 days ago | IN | 0 ETH | 0.000000018059 | ||||
| Stake | 143401415 | 5 days ago | IN | 0 ETH | 0.000000119654 | ||||
| Stake | 143401414 | 5 days ago | IN | 0 ETH | 0.000000165768 | ||||
| Get Reward | 143389346 | 5 days ago | IN | 0 ETH | 0.000000014236 | ||||
| Withdraw | 143378137 | 6 days ago | IN | 0 ETH | 0.000000190382 | ||||
| Withdraw | 143340087 | 7 days ago | IN | 0 ETH | 0.000000063166 | ||||
| Get Reward | 143336896 | 7 days ago | IN | 0 ETH | 0.00000002856 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
MultiRewards
Compiler Version
v0.5.17+commit.d19bba13
Optimization Enabled:
Yes with 1 runs
Other Settings:
istanbul EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity 0.5.17;
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;
}
}
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
);
}
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);
}
}
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);
}
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"
);
_;
}
}
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"
);
}
}
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"
);
}
}
}
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;
}
}
contract MultiRewards is ReentrancyGuard, Pausable {
using SafeMath for uint256;
using SafeERC20 for IERC20;
/* ========== STATE VARIABLES ========== */
struct Reward {
address rewardsDistributor;
uint256 rewardsDuration;
uint256 periodFinish;
uint256 rewardRate;
uint256 lastUpdateTime;
uint256 rewardPerTokenStored;
}
IERC20 public stakingToken;
mapping(address => Reward) public rewardData;
address[] public rewardTokens;
// user -> reward token -> amount
mapping(address => mapping(address => uint256))
public userRewardPerTokenPaid;
mapping(address => mapping(address => uint256)) public rewards;
uint256 private _totalSupply;
mapping(address => uint256) private _balances;
/* ========== CONSTRUCTOR ========== */
constructor(address _owner, address _stakingToken) public Owned(_owner) {
stakingToken = IERC20(_stakingToken);
}
function addReward(
address _rewardsToken,
address _rewardsDistributor,
uint256 _rewardsDuration
) public onlyOwner {
require(rewardData[_rewardsToken].rewardsDuration == 0);
rewardTokens.push(_rewardsToken);
rewardData[_rewardsToken].rewardsDistributor = _rewardsDistributor;
rewardData[_rewardsToken].rewardsDuration = _rewardsDuration;
}
/* ========== VIEWS ========== */
function totalSupply() external view returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) external view returns (uint256) {
return _balances[account];
}
function lastTimeRewardApplicable(
address _rewardsToken
) public view returns (uint256) {
return
Math.min(block.timestamp, rewardData[_rewardsToken].periodFinish);
}
function rewardPerToken(
address _rewardsToken
) public view returns (uint256) {
if (_totalSupply == 0) {
return rewardData[_rewardsToken].rewardPerTokenStored;
}
return
rewardData[_rewardsToken].rewardPerTokenStored.add(
lastTimeRewardApplicable(_rewardsToken)
.sub(rewardData[_rewardsToken].lastUpdateTime)
.mul(rewardData[_rewardsToken].rewardRate)
.mul(1e18)
.div(_totalSupply)
);
}
function earned(
address account,
address _rewardsToken
) public view returns (uint256) {
return
_balances[account]
.mul(
rewardPerToken(_rewardsToken).sub(
userRewardPerTokenPaid[account][_rewardsToken]
)
)
.div(1e18)
.add(rewards[account][_rewardsToken]);
}
function getRewardForDuration(
address _rewardsToken
) external view returns (uint256) {
return
rewardData[_rewardsToken].rewardRate.mul(
rewardData[_rewardsToken].rewardsDuration
);
}
/* ========== MUTATIVE FUNCTIONS ========== */
function setRewardsDistributor(
address _rewardsToken,
address _rewardsDistributor
) external onlyOwner {
rewardData[_rewardsToken].rewardsDistributor = _rewardsDistributor;
}
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) {
for (uint i; i < rewardTokens.length; i++) {
address _rewardsToken = rewardTokens[i];
uint256 reward = rewards[msg.sender][_rewardsToken];
if (reward > 0) {
rewards[msg.sender][_rewardsToken] = 0;
IERC20(_rewardsToken).safeTransfer(msg.sender, reward);
emit RewardPaid(msg.sender, _rewardsToken, reward);
}
}
}
function exit() external {
withdraw(_balances[msg.sender]);
getReward();
}
/* ========== RESTRICTED FUNCTIONS ========== */
function notifyRewardAmount(
address _rewardsToken,
uint256 reward
) external updateReward(address(0)) {
require(rewardData[_rewardsToken].rewardsDistributor == msg.sender);
// handle the transfer of reward tokens via `transferFrom` to reduce the number
// of transactions required and ensure correctness of the reward amount
IERC20(_rewardsToken).safeTransferFrom(
msg.sender,
address(this),
reward
);
if (block.timestamp >= rewardData[_rewardsToken].periodFinish) {
rewardData[_rewardsToken].rewardRate = reward.div(
rewardData[_rewardsToken].rewardsDuration
);
} else {
uint256 remaining = rewardData[_rewardsToken].periodFinish.sub(
block.timestamp
);
uint256 leftover = remaining.mul(
rewardData[_rewardsToken].rewardRate
);
rewardData[_rewardsToken].rewardRate = reward.add(leftover).div(
rewardData[_rewardsToken].rewardsDuration
);
}
rewardData[_rewardsToken].lastUpdateTime = block.timestamp;
rewardData[_rewardsToken].periodFinish = block.timestamp.add(
rewardData[_rewardsToken].rewardsDuration
);
emit RewardAdded(reward);
}
// Added to support recovering LP Rewards from other systems such as BAL to be distributed to holders
function recoverERC20(
address tokenAddress,
uint256 tokenAmount
) external onlyOwner {
require(
tokenAddress != address(stakingToken),
"Cannot withdraw staking token"
);
// note: the admin (Temporal Governor) can withdraw reward tokens.
// the only time this should happen is for reward proposals that
// occur after Morpho rewards have been claimed by an autotask.
IERC20(tokenAddress).safeTransfer(owner, tokenAmount);
emit Recovered(tokenAddress, tokenAmount);
}
function setRewardsDuration(
address _rewardsToken,
uint256 _rewardsDuration
) external {
require(
block.timestamp > rewardData[_rewardsToken].periodFinish,
"Reward period still active"
);
require(rewardData[_rewardsToken].rewardsDistributor == msg.sender);
require(_rewardsDuration > 0, "Reward duration must be non-zero");
rewardData[_rewardsToken].rewardsDuration = _rewardsDuration;
emit RewardsDurationUpdated(
_rewardsToken,
rewardData[_rewardsToken].rewardsDuration
);
}
/* ========== MODIFIERS ========== */
modifier updateReward(address account) {
for (uint i; i < rewardTokens.length; i++) {
address token = rewardTokens[i];
rewardData[token].rewardPerTokenStored = rewardPerToken(token);
rewardData[token].lastUpdateTime = lastTimeRewardApplicable(token);
if (account != address(0)) {
rewards[account][token] = earned(account, token);
userRewardPerTokenPaid[account][token] = rewardData[token]
.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,
address indexed rewardsToken,
uint256 reward
);
event RewardsDurationUpdated(address token, uint256 newDuration);
event Recovered(address token, uint256 amount);
}{
"remappings": [
"@forge-std/=lib/forge-std/src/",
"@openzeppelin-contracts/=lib/openzeppelin-contracts/",
"@openzeppelin/=lib/openzeppelin-contracts/",
"@openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
"@wormhole/=lib/wormhole/ethereum/contracts/",
"@protocol/=src/",
"@test/=test/",
"@proposals/=proposals/",
"@utils/=src/utils/",
"@zelt/=lib/zelt/",
"@deprecated/=deprecated/",
"@script/=script/",
"@crv-rewards/=crv-rewards/",
"@zelt-src/=lib/zelt/src/",
"@zelt-test/=lib/zelt/test/",
"ds-test/=lib/solmate/lib/ds-test/src/",
"erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
"forge-std/=lib/forge-std/src/",
"openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/",
"openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/",
"solmate/=lib/solmate/src/",
"wormhole/=lib/wormhole/",
"zelt/=lib/zelt/src/"
],
"optimizer": {
"enabled": true,
"runs": 1,
"details": {}
},
"metadata": {
"useLiteralContent": false
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "istanbul",
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_owner","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":true,"internalType":"address","name":"rewardsToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"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":false,"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_rewardsDistributor","type":"address"},{"internalType":"uint256","name":"_rewardsDuration","type":"uint256"}],"name":"addReward","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"},{"internalType":"address","name":"_rewardsToken","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":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"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":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"lastTimeRewardApplicable","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":"address","name":"_rewardsToken","type":"address"},{"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":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":[{"internalType":"address","name":"","type":"address"}],"name":"rewardData","outputs":[{"internalType":"address","name":"rewardsDistributor","type":"address"},{"internalType":"uint256","name":"rewardsDuration","type":"uint256"},{"internalType":"uint256","name":"periodFinish","type":"uint256"},{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"uint256","name":"rewardPerTokenStored","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_rewardsToken","type":"address"},{"internalType":"address","name":"_rewardsDistributor","type":"address"}],"name":"setRewardsDistributor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"uint256","name":"_rewardsDuration","type":"uint256"}],"name":"setRewardsDuration","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"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
608060405234801561001057600080fd5b50604051611ccd380380611ccd8339818101604052604081101561003357600080fd5b5080516020909101516001600055816001600160a01b03811661009d576040805162461bcd60e51b815260206004820152601960248201527f4f776e657220616464726573732063616e6e6f74206265203000000000000000604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040805160008152602081019290925280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a1506001546001600160a01b0316610149576040805162461bcd60e51b815260206004820152601160248201527013dddb995c881b5d5cdd081899481cd95d607a1b604482015290519081900360640190fd5b600480546001600160a01b0390921661010002610100600160a81b031990921691909117905550611b4e8061017f6000396000f3fe608060405234801561001057600080fd5b50600436106101495760003560e01c80631627540c1461014e57806316c38b3c1461017657806318160ddd14610195578063211dc32d146101af5780632378bea6146101dd5780632e1a7d4d146102095780633d18b912146102265780633f695b451461022e57806348e5d9f81461025c57806353a47bb7146102bf5780635c975abb146102e3578063638634ee146102ff5780637035ab981461032557806370a082311461035357806372f702f31461037957806379ba5097146103815780637bb7bed1146103895780638980f11f146103a65780638da5cb5b146103d257806391b4ded9146103da578063a694fc3a146103e2578063b66503cf146103ff578063bcd110141461042b578063d0ed26ae14610451578063e70b9e2714610487578063e9fad8ee146104b5578063f1229777146104bd575b600080fd5b6101746004803603602081101561016457600080fd5b50356001600160a01b03166104e3565b005b6101746004803603602081101561018c57600080fd5b5035151561053f565b61019d6105b9565b60408051918252519081900360200190f35b61019d600480360360408110156101c557600080fd5b506001600160a01b03813581169160200135166105bf565b610174600480360360408110156101f357600080fd5b506001600160a01b038135169060200135610672565b6101746004803603602081101561021f57600080fd5b50356107b5565b6101746109dd565b6101746004803603604081101561024457600080fd5b506001600160a01b0381358116916020013516610bed565b6102826004803603602081101561027257600080fd5b50356001600160a01b0316610c23565b604080516001600160a01b0390971687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b6102c7610c62565b604080516001600160a01b039092168252519081900360200190f35b6102eb610c71565b604080519115158252519081900360200190f35b61019d6004803603602081101561031557600080fd5b50356001600160a01b0316610c7a565b61019d6004803603604081101561033b57600080fd5b506001600160a01b0381358116916020013516610ca9565b61019d6004803603602081101561036957600080fd5b50356001600160a01b0316610cc6565b6102c7610ce1565b610174610cf5565b6102c76004803603602081101561039f57600080fd5b5035610db1565b610174600480360360408110156103bc57600080fd5b506001600160a01b038135169060200135610dd8565b6102c7610eb0565b61019d610ebf565b610174600480360360208110156103f857600080fd5b5035610ec5565b6101746004803603604081101561041557600080fd5b506001600160a01b03813516906020013561112a565b61019d6004803603602081101561044157600080fd5b50356001600160a01b0316611404565b6101746004803603606081101561046757600080fd5b506001600160a01b03813581169160208101359091169060400135611436565b61019d6004803603604081101561049d57600080fd5b506001600160a01b03813581169160200135166114d2565b6101746114ef565b61019d600480360360208110156104d357600080fd5b50356001600160a01b0316611512565b6104eb6115c5565b600280546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229181900360200190a150565b6105476115c5565b60045460ff161515811515141561055d576105b6565b6004805460ff1916821515179081905560ff161561057a57426003555b6004546040805160ff90921615158252517f8fb6c181ee25a520cf3dd6565006ef91229fcfe5a989566c2a3b8c115570cec59181900360200190a15b50565b60095490565b6001600160a01b038083166000818152600860209081526040808320948616808452948252808320549383526007825280832094835293905291822054610669919061065d90670de0b6b3a7640000906106519061062c9061062089611512565b9063ffffffff61160e16565b6001600160a01b0389166000908152600a60205260409020549063ffffffff61166b16565b9063ffffffff6116c416565b9063ffffffff61172b16565b90505b92915050565b6001600160a01b03821660009081526005602052604090206002015442116106de576040805162461bcd60e51b815260206004820152601a60248201527952657761726420706572696f64207374696c6c2061637469766560301b604482015290519081900360640190fd5b6001600160a01b0382811660009081526005602052604090205416331461070457600080fd5b60008111610759576040805162461bcd60e51b815260206004820181905260248201527f526577617264206475726174696f6e206d757374206265206e6f6e2d7a65726f604482015290519081900360640190fd5b6001600160a01b0382166000818152600560209081526040918290206001018490558151928352820183905280517fad2f86b01ed93b4b3a150d448c61a4f5d8d38075d3c0c64cc0a26fd6e1f495459281900390910190a15050565b600080546001018082559033905b6006548110156108a8576000600682815481106107dc57fe5b6000918252602090912001546001600160a01b031690506107fc81611512565b6001600160a01b0382166000908152600560208190526040909120015561082281610c7a565b6001600160a01b0380831660009081526005602052604090206004019190915583161561089f5761085383826105bf565b6001600160a01b03808516600081815260086020908152604080832094871680845294825280832095909555600580825285832001549282526007815284822093825292909252919020555b506001016107c3565b50600083116108f2576040805162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015290519081900360640190fd5b600954610905908463ffffffff61160e16565b600955336000908152600a6020526040902054610928908463ffffffff61160e16565b336000818152600a602052604090209190915560045461095e916101009091046001600160a01b0316908563ffffffff61178316565b60408051848152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a25060005481146109d9576040805162461bcd60e51b815260206004820152601f6024820152600080516020611a0f833981519152604482015290519081900360640190fd5b5050565b600080546001018082559033905b600654811015610ad057600060068281548110610a0457fe5b6000918252602090912001546001600160a01b03169050610a2481611512565b6001600160a01b03821660009081526005602081905260409091200155610a4a81610c7a565b6001600160a01b03808316600090815260056020526040902060040191909155831615610ac757610a7b83826105bf565b6001600160a01b03808516600081815260086020908152604080832094871680845294825280832095909555600580825285832001549282526007815284822093825292909252919020555b506001016109eb565b5060005b600654811015610ba757600060068281548110610aed57fe5b60009182526020808320909101543383526008825260408084206001600160a01b03909216808552919092529120549091508015610b9d573360008181526008602090815260408083206001600160a01b0387168085529252822091909155610b5c918363ffffffff61178316565b6040805182815290516001600160a01b0384169133917f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e9181900360200190a35b5050600101610ad4565b505060005481146105b6576040805162461bcd60e51b815260206004820152601f6024820152600080516020611a0f833981519152604482015290519081900360640190fd5b610bf56115c5565b6001600160a01b03918216600090815260056020526040902080546001600160a01b03191691909216179055565b60056020819052600091825260409091208054600182015460028301546003840154600485015494909501546001600160a01b03909316949193909286565b6002546001600160a01b031681565b60045460ff1681565b6001600160a01b038116600090815260056020526040812060020154610ca19042906117da565b90505b919050565b600760209081526000928352604080842090915290825290205481565b6001600160a01b03166000908152600a602052604090205490565b60045461010090046001600160a01b031681565b6002546001600160a01b03163314610d3e5760405162461bcd60e51b8152600401808060200182810382526035815260200180611a2f6035913960400191505060405180910390fd5b600154600254604080516001600160a01b03938416815292909116602083015280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a160028054600180546001600160a01b03199081166001600160a01b03841617909155169055565b60068181548110610dbe57fe5b6000918252602090912001546001600160a01b0316905081565b610de06115c5565b6004546001600160a01b03838116610100909204161415610e48576040805162461bcd60e51b815260206004820152601d60248201527f43616e6e6f74207769746864726177207374616b696e6720746f6b656e000000604482015290519081900360640190fd5b600154610e68906001600160a01b0384811691168363ffffffff61178316565b604080516001600160a01b03841681526020810183905281517f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa28929181900390910190a15050565b6001546001600160a01b031681565b60035481565b600080546001019081905560045460ff1615610f125760405162461bcd60e51b815260040180806020018281038252603c815260200180611ab4603c913960400191505060405180910390fd5b3360005b600654811015610ffb57600060068281548110610f2f57fe5b6000918252602090912001546001600160a01b03169050610f4f81611512565b6001600160a01b03821660009081526005602081905260409091200155610f7581610c7a565b6001600160a01b03808316600090815260056020526040902060040191909155831615610ff257610fa683826105bf565b6001600160a01b03808516600081815260086020908152604080832094871680845294825280832095909555600580825285832001549282526007815284822093825292909252919020555b50600101610f16565b5060008311611042576040805162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015290519081900360640190fd5b600954611055908463ffffffff61172b16565b600955336000908152600a6020526040902054611078908463ffffffff61172b16565b336000818152600a60205260409020919091556004546110af916101009091046001600160a01b031690308663ffffffff6117f016565b60408051848152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a25060005481146109d9576040805162461bcd60e51b815260206004820152601f6024820152600080516020611a0f833981519152604482015290519081900360640190fd5b6000805b6006548110156112135760006006828154811061114757fe5b6000918252602090912001546001600160a01b0316905061116781611512565b6001600160a01b0382166000908152600560208190526040909120015561118d81610c7a565b6001600160a01b0380831660009081526005602052604090206004019190915583161561120a576111be83826105bf565b6001600160a01b03808516600081815260086020908152604080832094871680845294825280832095909555600580825285832001549282526007815284822093825292909252919020555b5060010161112e565b506001600160a01b0383811660009081526005602052604090205416331461123a57600080fd5b6112556001600160a01b03841633308563ffffffff6117f016565b6001600160a01b03831660009081526005602052604090206002015442106112c5576001600160a01b0383166000908152600560205260409020600101546112a490839063ffffffff6116c416565b6001600160a01b038416600090815260056020526040902060030155611374565b6001600160a01b0383166000908152600560205260408120600201546112f1904263ffffffff61160e16565b6001600160a01b0385166000908152600560205260408120600301549192509061132290839063ffffffff61166b16565b6001600160a01b03861660009081526005602052604090206001015490915061135590610651868463ffffffff61172b16565b6001600160a01b03861660009081526005602052604090206003015550505b6001600160a01b038316600090815260056020526040902042600482018190556001909101546113aa919063ffffffff61172b16565b6001600160a01b03841660009081526005602090815260409182902060020192909255805184815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d929181900390910190a1505050565b6001600160a01b03811660009081526005602052604081206001810154600390910154610ca19163ffffffff61166b16565b61143e6115c5565b6001600160a01b0383166000908152600560205260409020600101541561146457600080fd5b6006805460018181019092557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b039586166001600160a01b031991821681179092556000918252600560205260409091208054949095169316929092178355910155565b600860209081526000928352604080842090915290825290205481565b336000908152600a6020526040902054611508906107b5565b6115106109dd565b565b60006009546000141561154257506001600160a01b03811660009081526005602081905260409091200154610ca4565b6009546001600160a01b03831660009081526005602052604090206003810154600490910154610ca19261159c92909161065191670de0b6b3a764000091611590919082906106208b610c7a565b9063ffffffff61166b16565b6001600160a01b038416600090815260056020819052604090912001549063ffffffff61172b16565b6001546001600160a01b031633146115105760405162461bcd60e51b815260040180806020018281038252602f815260200180611a64602f913960400191505060405180910390fd5b600082821115611665576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008261167a5750600061066c565b8282028284828161168757fe5b04146106695760405162461bcd60e51b8152600401808060200182810382526021815260200180611a936021913960400191505060405180910390fd5b6000808211611717576040805162461bcd60e51b815260206004820152601a602482015279536166654d6174683a206469766973696f6e206279207a65726f60301b604482015290519081900360640190fd5b600082848161172257fe5b04949350505050565b600082820183811015610669576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526117d5908490611850565b505050565b60008183106117e95781610669565b5090919050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261184a908590611850565b50505050565b611862826001600160a01b0316611a08565b6118b3576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106118f15780518252601f1990920191602091820191016118d2565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611953576040519150601f19603f3d011682016040523d82523d6000602084013e611958565b606091505b5091509150816119af576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561184a578080602001905160208110156119cb57600080fd5b505161184a5760405162461bcd60e51b815260040180806020018281038252602a815260200180611af0602a913960400191505060405180910390fd5b3b15159056fe5265656e7472616e637947756172643a207265656e7472616e742063616c6c00596f75206d757374206265206e6f6d696e61746564206265666f726520796f752063616e20616363657074206f776e6572736869704f6e6c792074686520636f6e7472616374206f776e6572206d617920706572666f726d207468697320616374696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775468697320616374696f6e2063616e6e6f7420626520706572666f726d6564207768696c652074686520636f6e7472616374206973207061757365645361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a723158207532194569f821aeba5c5e876321de038fc2b462afde7930d46087db3c7d365b64736f6c6343000511003200000000000000000000000017c9ba3fda7ec71ccfd75f978ef31e21927aff3d0000000000000000000000003520e1a10038131a3c00bf2158835a75e929642d
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101495760003560e01c80631627540c1461014e57806316c38b3c1461017657806318160ddd14610195578063211dc32d146101af5780632378bea6146101dd5780632e1a7d4d146102095780633d18b912146102265780633f695b451461022e57806348e5d9f81461025c57806353a47bb7146102bf5780635c975abb146102e3578063638634ee146102ff5780637035ab981461032557806370a082311461035357806372f702f31461037957806379ba5097146103815780637bb7bed1146103895780638980f11f146103a65780638da5cb5b146103d257806391b4ded9146103da578063a694fc3a146103e2578063b66503cf146103ff578063bcd110141461042b578063d0ed26ae14610451578063e70b9e2714610487578063e9fad8ee146104b5578063f1229777146104bd575b600080fd5b6101746004803603602081101561016457600080fd5b50356001600160a01b03166104e3565b005b6101746004803603602081101561018c57600080fd5b5035151561053f565b61019d6105b9565b60408051918252519081900360200190f35b61019d600480360360408110156101c557600080fd5b506001600160a01b03813581169160200135166105bf565b610174600480360360408110156101f357600080fd5b506001600160a01b038135169060200135610672565b6101746004803603602081101561021f57600080fd5b50356107b5565b6101746109dd565b6101746004803603604081101561024457600080fd5b506001600160a01b0381358116916020013516610bed565b6102826004803603602081101561027257600080fd5b50356001600160a01b0316610c23565b604080516001600160a01b0390971687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b6102c7610c62565b604080516001600160a01b039092168252519081900360200190f35b6102eb610c71565b604080519115158252519081900360200190f35b61019d6004803603602081101561031557600080fd5b50356001600160a01b0316610c7a565b61019d6004803603604081101561033b57600080fd5b506001600160a01b0381358116916020013516610ca9565b61019d6004803603602081101561036957600080fd5b50356001600160a01b0316610cc6565b6102c7610ce1565b610174610cf5565b6102c76004803603602081101561039f57600080fd5b5035610db1565b610174600480360360408110156103bc57600080fd5b506001600160a01b038135169060200135610dd8565b6102c7610eb0565b61019d610ebf565b610174600480360360208110156103f857600080fd5b5035610ec5565b6101746004803603604081101561041557600080fd5b506001600160a01b03813516906020013561112a565b61019d6004803603602081101561044157600080fd5b50356001600160a01b0316611404565b6101746004803603606081101561046757600080fd5b506001600160a01b03813581169160208101359091169060400135611436565b61019d6004803603604081101561049d57600080fd5b506001600160a01b03813581169160200135166114d2565b6101746114ef565b61019d600480360360208110156104d357600080fd5b50356001600160a01b0316611512565b6104eb6115c5565b600280546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229181900360200190a150565b6105476115c5565b60045460ff161515811515141561055d576105b6565b6004805460ff1916821515179081905560ff161561057a57426003555b6004546040805160ff90921615158252517f8fb6c181ee25a520cf3dd6565006ef91229fcfe5a989566c2a3b8c115570cec59181900360200190a15b50565b60095490565b6001600160a01b038083166000818152600860209081526040808320948616808452948252808320549383526007825280832094835293905291822054610669919061065d90670de0b6b3a7640000906106519061062c9061062089611512565b9063ffffffff61160e16565b6001600160a01b0389166000908152600a60205260409020549063ffffffff61166b16565b9063ffffffff6116c416565b9063ffffffff61172b16565b90505b92915050565b6001600160a01b03821660009081526005602052604090206002015442116106de576040805162461bcd60e51b815260206004820152601a60248201527952657761726420706572696f64207374696c6c2061637469766560301b604482015290519081900360640190fd5b6001600160a01b0382811660009081526005602052604090205416331461070457600080fd5b60008111610759576040805162461bcd60e51b815260206004820181905260248201527f526577617264206475726174696f6e206d757374206265206e6f6e2d7a65726f604482015290519081900360640190fd5b6001600160a01b0382166000818152600560209081526040918290206001018490558151928352820183905280517fad2f86b01ed93b4b3a150d448c61a4f5d8d38075d3c0c64cc0a26fd6e1f495459281900390910190a15050565b600080546001018082559033905b6006548110156108a8576000600682815481106107dc57fe5b6000918252602090912001546001600160a01b031690506107fc81611512565b6001600160a01b0382166000908152600560208190526040909120015561082281610c7a565b6001600160a01b0380831660009081526005602052604090206004019190915583161561089f5761085383826105bf565b6001600160a01b03808516600081815260086020908152604080832094871680845294825280832095909555600580825285832001549282526007815284822093825292909252919020555b506001016107c3565b50600083116108f2576040805162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015290519081900360640190fd5b600954610905908463ffffffff61160e16565b600955336000908152600a6020526040902054610928908463ffffffff61160e16565b336000818152600a602052604090209190915560045461095e916101009091046001600160a01b0316908563ffffffff61178316565b60408051848152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a25060005481146109d9576040805162461bcd60e51b815260206004820152601f6024820152600080516020611a0f833981519152604482015290519081900360640190fd5b5050565b600080546001018082559033905b600654811015610ad057600060068281548110610a0457fe5b6000918252602090912001546001600160a01b03169050610a2481611512565b6001600160a01b03821660009081526005602081905260409091200155610a4a81610c7a565b6001600160a01b03808316600090815260056020526040902060040191909155831615610ac757610a7b83826105bf565b6001600160a01b03808516600081815260086020908152604080832094871680845294825280832095909555600580825285832001549282526007815284822093825292909252919020555b506001016109eb565b5060005b600654811015610ba757600060068281548110610aed57fe5b60009182526020808320909101543383526008825260408084206001600160a01b03909216808552919092529120549091508015610b9d573360008181526008602090815260408083206001600160a01b0387168085529252822091909155610b5c918363ffffffff61178316565b6040805182815290516001600160a01b0384169133917f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e9181900360200190a35b5050600101610ad4565b505060005481146105b6576040805162461bcd60e51b815260206004820152601f6024820152600080516020611a0f833981519152604482015290519081900360640190fd5b610bf56115c5565b6001600160a01b03918216600090815260056020526040902080546001600160a01b03191691909216179055565b60056020819052600091825260409091208054600182015460028301546003840154600485015494909501546001600160a01b03909316949193909286565b6002546001600160a01b031681565b60045460ff1681565b6001600160a01b038116600090815260056020526040812060020154610ca19042906117da565b90505b919050565b600760209081526000928352604080842090915290825290205481565b6001600160a01b03166000908152600a602052604090205490565b60045461010090046001600160a01b031681565b6002546001600160a01b03163314610d3e5760405162461bcd60e51b8152600401808060200182810382526035815260200180611a2f6035913960400191505060405180910390fd5b600154600254604080516001600160a01b03938416815292909116602083015280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a160028054600180546001600160a01b03199081166001600160a01b03841617909155169055565b60068181548110610dbe57fe5b6000918252602090912001546001600160a01b0316905081565b610de06115c5565b6004546001600160a01b03838116610100909204161415610e48576040805162461bcd60e51b815260206004820152601d60248201527f43616e6e6f74207769746864726177207374616b696e6720746f6b656e000000604482015290519081900360640190fd5b600154610e68906001600160a01b0384811691168363ffffffff61178316565b604080516001600160a01b03841681526020810183905281517f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa28929181900390910190a15050565b6001546001600160a01b031681565b60035481565b600080546001019081905560045460ff1615610f125760405162461bcd60e51b815260040180806020018281038252603c815260200180611ab4603c913960400191505060405180910390fd5b3360005b600654811015610ffb57600060068281548110610f2f57fe5b6000918252602090912001546001600160a01b03169050610f4f81611512565b6001600160a01b03821660009081526005602081905260409091200155610f7581610c7a565b6001600160a01b03808316600090815260056020526040902060040191909155831615610ff257610fa683826105bf565b6001600160a01b03808516600081815260086020908152604080832094871680845294825280832095909555600580825285832001549282526007815284822093825292909252919020555b50600101610f16565b5060008311611042576040805162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015290519081900360640190fd5b600954611055908463ffffffff61172b16565b600955336000908152600a6020526040902054611078908463ffffffff61172b16565b336000818152600a60205260409020919091556004546110af916101009091046001600160a01b031690308663ffffffff6117f016565b60408051848152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a25060005481146109d9576040805162461bcd60e51b815260206004820152601f6024820152600080516020611a0f833981519152604482015290519081900360640190fd5b6000805b6006548110156112135760006006828154811061114757fe5b6000918252602090912001546001600160a01b0316905061116781611512565b6001600160a01b0382166000908152600560208190526040909120015561118d81610c7a565b6001600160a01b0380831660009081526005602052604090206004019190915583161561120a576111be83826105bf565b6001600160a01b03808516600081815260086020908152604080832094871680845294825280832095909555600580825285832001549282526007815284822093825292909252919020555b5060010161112e565b506001600160a01b0383811660009081526005602052604090205416331461123a57600080fd5b6112556001600160a01b03841633308563ffffffff6117f016565b6001600160a01b03831660009081526005602052604090206002015442106112c5576001600160a01b0383166000908152600560205260409020600101546112a490839063ffffffff6116c416565b6001600160a01b038416600090815260056020526040902060030155611374565b6001600160a01b0383166000908152600560205260408120600201546112f1904263ffffffff61160e16565b6001600160a01b0385166000908152600560205260408120600301549192509061132290839063ffffffff61166b16565b6001600160a01b03861660009081526005602052604090206001015490915061135590610651868463ffffffff61172b16565b6001600160a01b03861660009081526005602052604090206003015550505b6001600160a01b038316600090815260056020526040902042600482018190556001909101546113aa919063ffffffff61172b16565b6001600160a01b03841660009081526005602090815260409182902060020192909255805184815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d929181900390910190a1505050565b6001600160a01b03811660009081526005602052604081206001810154600390910154610ca19163ffffffff61166b16565b61143e6115c5565b6001600160a01b0383166000908152600560205260409020600101541561146457600080fd5b6006805460018181019092557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b039586166001600160a01b031991821681179092556000918252600560205260409091208054949095169316929092178355910155565b600860209081526000928352604080842090915290825290205481565b336000908152600a6020526040902054611508906107b5565b6115106109dd565b565b60006009546000141561154257506001600160a01b03811660009081526005602081905260409091200154610ca4565b6009546001600160a01b03831660009081526005602052604090206003810154600490910154610ca19261159c92909161065191670de0b6b3a764000091611590919082906106208b610c7a565b9063ffffffff61166b16565b6001600160a01b038416600090815260056020819052604090912001549063ffffffff61172b16565b6001546001600160a01b031633146115105760405162461bcd60e51b815260040180806020018281038252602f815260200180611a64602f913960400191505060405180910390fd5b600082821115611665576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008261167a5750600061066c565b8282028284828161168757fe5b04146106695760405162461bcd60e51b8152600401808060200182810382526021815260200180611a936021913960400191505060405180910390fd5b6000808211611717576040805162461bcd60e51b815260206004820152601a602482015279536166654d6174683a206469766973696f6e206279207a65726f60301b604482015290519081900360640190fd5b600082848161172257fe5b04949350505050565b600082820183811015610669576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526117d5908490611850565b505050565b60008183106117e95781610669565b5090919050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261184a908590611850565b50505050565b611862826001600160a01b0316611a08565b6118b3576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106118f15780518252601f1990920191602091820191016118d2565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611953576040519150601f19603f3d011682016040523d82523d6000602084013e611958565b606091505b5091509150816119af576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561184a578080602001905160208110156119cb57600080fd5b505161184a5760405162461bcd60e51b815260040180806020018281038252602a815260200180611af0602a913960400191505060405180910390fd5b3b15159056fe5265656e7472616e637947756172643a207265656e7472616e742063616c6c00596f75206d757374206265206e6f6d696e61746564206265666f726520796f752063616e20616363657074206f776e6572736869704f6e6c792074686520636f6e7472616374206f776e6572206d617920706572666f726d207468697320616374696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775468697320616374696f6e2063616e6e6f7420626520706572666f726d6564207768696c652074686520636f6e7472616374206973207061757365645361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a723158207532194569f821aeba5c5e876321de038fc2b462afde7930d46087db3c7d365b64736f6c63430005110032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000017c9ba3fda7ec71ccfd75f978ef31e21927aff3d0000000000000000000000003520e1a10038131a3c00bf2158835a75e929642d
-----Decoded View---------------
Arg [0] : _owner (address): 0x17C9ba3fDa7EC71CcfD75f978Ef31E21927aFF3d
Arg [1] : _stakingToken (address): 0x3520E1a10038131A3C00Bf2158835A75e929642d
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000017c9ba3fda7ec71ccfd75f978ef31e21927aff3d
Arg [1] : 0000000000000000000000003520e1a10038131a3c00bf2158835a75e929642d
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.