Source Code
Latest 25 from a total of 345 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Claim | 21404349 | 440 days ago | IN | 0 ETH | 0.00067723 | ||||
| Convert | 21404343 | 440 days ago | IN | 0 ETH | 0.00470701 | ||||
| Claim | 21382467 | 443 days ago | IN | 0 ETH | 0.00102393 | ||||
| Claim | 20798364 | 525 days ago | IN | 0 ETH | 0.0004819 | ||||
| Claim | 20657243 | 544 days ago | IN | 0 ETH | 0.00013103 | ||||
| Claim | 20578945 | 555 days ago | IN | 0 ETH | 0.00011444 | ||||
| Claim | 20568953 | 557 days ago | IN | 0 ETH | 0.00006723 | ||||
| Claim | 20371469 | 584 days ago | IN | 0 ETH | 0.00025966 | ||||
| Claim | 20371465 | 584 days ago | IN | 0 ETH | 0.00087037 | ||||
| Convert | 20371463 | 584 days ago | IN | 0 ETH | 0.00444462 | ||||
| Claim | 20216264 | 606 days ago | IN | 0 ETH | 0.00021716 | ||||
| Claim | 19903341 | 650 days ago | IN | 0 ETH | 0.00025172 | ||||
| Claim | 19875561 | 654 days ago | IN | 0 ETH | 0.00056447 | ||||
| Claim | 19836473 | 659 days ago | IN | 0 ETH | 0.00031369 | ||||
| Claim | 19828965 | 660 days ago | IN | 0 ETH | 0.00025729 | ||||
| Claim | 19730472 | 674 days ago | IN | 0 ETH | 0.00044503 | ||||
| Claim | 19715810 | 676 days ago | IN | 0 ETH | 0.00040263 | ||||
| Claim | 19667966 | 683 days ago | IN | 0 ETH | 0.00065628 | ||||
| Claim | 19623528 | 689 days ago | IN | 0 ETH | 0.00077118 | ||||
| Claim | 19592502 | 693 days ago | IN | 0 ETH | 0.00072332 | ||||
| Claim | 19589067 | 694 days ago | IN | 0 ETH | 0.00089102 | ||||
| Claim | 19556154 | 698 days ago | IN | 0 ETH | 0.0009752 | ||||
| Claim | 19497492 | 707 days ago | IN | 0 ETH | 0.00091794 | ||||
| Claim | 19296020 | 735 days ago | IN | 0 ETH | 0.00225335 | ||||
| Claim | 19272925 | 738 days ago | IN | 0 ETH | 0.00218242 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PrelaunchRewardsPool
Compiler Version
v0.8.11+commit.d7f03943
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.11;
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import { ICrvDepositor } from "../interfaces/ICrvDepositor.sol";
import { ILitDepositorHelper } from "../interfaces/ILitDepositorHelper.sol";
import { ICrvVoteEscrow } from "../interfaces/ICrvVoteEscrow.sol";
import { Math } from "../utils/Math.sol";
/**
* @title PrelaunchRewardsPool
* @author LiquisFinance
* @notice Staking rewards contract for the prelaunch of Liquis Protocol.
*/
contract PrelaunchRewardsPool {
using SafeMath for uint256;
using SafeERC20 for IERC20;
IERC20 public rewardToken;
IERC20 public immutable stakingToken;
IERC20 public immutable lit;
uint256 public constant duration = 7 days;
address public owner;
address public crvDepositor;
address public litConvertor;
address public voterProxy;
address public immutable escrow;
uint256 public periodFinish = 0;
uint256 public rewardRate = 0;
uint256 public lastUpdateTime;
uint256 public rewardPerTokenStored;
uint256 public currentRewards = 0;
uint256 public historicalRewards = 0;
uint256 public totalSupply;
uint256 public immutable START_WITHDRAWALS;
uint256 public immutable START_VESTING_DATE;
uint256 public immutable END_VESTING_DATE;
uint256 public totalRenounced;
mapping(address => uint256) public userRewardPerTokenPaid;
mapping(address => uint256) public rewards;
mapping(address => uint256) public balances;
mapping(address => uint256) public claimed;
mapping(address => bool) public isVestingUser;
event Staked(address indexed user, uint256 amount);
event Converted(address indexed user, uint256 amount);
event Withdrawn(address indexed user, uint256 amount);
event Claimed(address indexed user, uint256 reward);
event Recovered(address token, uint256 amount);
event RewardAdded(uint256 reward);
event OwnerUpdated(address newOwner);
event CrvDepositorUpdated(address indexed crvDepositor);
event VoterProxyUpdated(address indexed voterProxy);
event RewardTokenUpdated(address indexed rewardToken);
/**
* @dev Initializes variables, approves lit and sets target dates.
* @param _stakingToken BPT token BAL 20-80 WETH/LIT
* @param _rewardToken LIQ
* @param _litConvertor Contract that converts LIT to BPT
* @param _lit LIT
* @param _crvDepositor Contract that locks BPT for liqLIT
* @param _voterProxy Contract that holds veLIT voting power (is whitelisted on veLIT)
* @param _escrow veLIT
*/
constructor(
address _stakingToken,
address _rewardToken,
address _litConvertor,
address _lit,
address _crvDepositor,
address _voterProxy,
address _escrow
) {
owner = msg.sender;
stakingToken = IERC20(_stakingToken);
rewardToken = IERC20(_rewardToken);
litConvertor = _litConvertor;
crvDepositor = _crvDepositor;
voterProxy = _voterProxy;
escrow = _escrow;
lit = IERC20(_lit);
lit.safeApprove(litConvertor, type(uint256).max);
START_VESTING_DATE = block.timestamp + 28 days;
END_VESTING_DATE = START_VESTING_DATE + 180 days;
START_WITHDRAWALS = START_VESTING_DATE + 60 days;
}
// ----- Reward Functions ----- //
modifier updateReward(address account) {
rewardPerTokenStored = rewardPerToken();
lastUpdateTime = lastTimeRewardApplicable();
if (account != address(0)) {
rewards[account] = earned(account);
userRewardPerTokenPaid[account] = rewardPerTokenStored;
}
_;
}
/**
* @dev Returns how many rewards a given account has earned
* @param account Address for which the request is made
*/
function earned(address account) public view returns (uint256) {
return (balances[account] * (rewardPerToken() - userRewardPerTokenPaid[account])) / 1e18 + rewards[account];
}
function rewardPerToken() public view returns (uint256) {
if (totalSupply == 0) {
return rewardPerTokenStored;
}
return
rewardPerTokenStored + (((lastTimeRewardApplicable() - lastUpdateTime) * rewardRate * 1e18) / totalSupply);
}
function lastTimeRewardApplicable() public view returns (uint256) {
return Math.min(block.timestamp, periodFinish);
}
// ----- Stake Functions ----- //
function stake(uint256 _amount) public returns (bool) {
// pull tokens from msg.sender
stakingToken.safeTransferFrom(msg.sender, address(this), _amount);
_processStake(_amount, msg.sender);
return true;
}
function stakeAll() external returns (bool) {
uint256 balance = stakingToken.balanceOf(msg.sender);
stake(balance);
return true;
}
function stakeFor(address _for, uint256 _amount) external returns (bool) {
// pull tokens from msg.sender
stakingToken.safeTransferFrom(msg.sender, address(this), _amount);
_processStake(_amount, _for);
return true;
}
/**
* @dev Converts user LIT into BPT and stakes it, reward is updated in low level func _processStake
*/
function stakeLit(uint256 amount, uint256 minOut) external {
lit.safeTransferFrom(msg.sender, address(this), amount);
uint256 bptReceived = ILitDepositorHelper(litConvertor).convertLitToBpt(amount, minOut);
_processStake(bptReceived, msg.sender);
}
/**
* @dev Generic internal staking function that updates rewards based on previous balances, then update balances
* @param _amount Units to add to the users balance
* @param _receiver Address of user who will receive the stake
*/
function _processStake(uint256 _amount, address _receiver) internal updateReward(_receiver) {
require(_amount > 0, "Cannot stake 0");
// update storage variables
totalSupply = totalSupply + _amount;
balances[_receiver] = balances[_receiver] + _amount;
emit Staked(_receiver, _amount);
}
/**
* @dev Called by a staker to convert all their staked BPT balance to liqLIT (if target address set)
* Note crvDepositor address should be populated after rewards have ended
*/
function convert() external updateReward(msg.sender) onlyAfterDate(START_VESTING_DATE) {
require(ICrvVoteEscrow(escrow).balanceOf(voterProxy) > 0, "Not activated");
uint256 userStake = balances[msg.sender];
// update state variables
totalSupply = totalSupply - userStake;
balances[msg.sender] = 0;
// deposit to crvDepositor for the user, liqLit is sent directly to the user
ICrvDepositor(crvDepositor).depositFor(msg.sender, userStake, true, address(0));
// register the user as vesting user
isVestingUser[msg.sender] = true;
emit Converted(msg.sender, userStake);
}
// ----- Withdraw Functions ----- //
/**
* @dev Called by a staker to withdraw all their BPT stake
* Note Rewards accumulated are renounced, users that withdraw are not eligible for rewards vesting
*/
function withdraw() external updateReward(msg.sender) onlyAfterDate(START_WITHDRAWALS) {
require(ICrvVoteEscrow(escrow).balanceOf(voterProxy) == 0, "Activated");
uint256 userStake = balances[msg.sender];
require(userStake > 0, "Cannot withdraw 0");
totalSupply = totalSupply - userStake;
balances[msg.sender] = 0;
// track renounced reward balances from users that withdraw
uint256 rewardAccrued = rewards[msg.sender];
totalRenounced += rewardAccrued;
rewards[msg.sender] = 0;
stakingToken.safeTransfer(msg.sender, userStake);
emit Withdrawn(msg.sender, userStake);
}
// ----- Vesting Functions ----- //
/**
* @dev Called by a staker to get their vested LIQ rewards
* Note In convertStakeToLiqLit() we make sure that rewards[msg.sender] mapping reflects all rewards
*/
function claim() external onlyAfterDate(START_VESTING_DATE) {
require(isVestingUser[msg.sender], "Not vesting User");
uint256 unclaimedAmount = getClaimableLiqVesting(msg.sender);
if (unclaimedAmount == 0) return;
// update rewards claimed mapping
claimed[msg.sender] += unclaimedAmount;
rewardToken.safeTransfer(msg.sender, unclaimedAmount);
emit Claimed(msg.sender, unclaimedAmount);
}
function getClaimableLiqVesting(address _account) public view returns (uint256 claimable) {
if (block.timestamp < START_VESTING_DATE) return 0;
if (block.timestamp >= END_VESTING_DATE) {
claimable = rewards[_account] - claimed[_account];
} else {
claimable =
((rewards[_account] * (block.timestamp - START_VESTING_DATE)) /
(END_VESTING_DATE - START_VESTING_DATE)) -
claimed[_account];
}
}
// ----- Protected Functions ----- //
/**
* @dev Called by authorized addresses to allocate new LIQ rewards to this pool
* Rewards need to be first sent and subsequently call notifyRewardAmount
* There is no pull method in the function
* Can only be called before START_VESTING_DATE
*/
function notifyRewardAmount(uint256 reward)
external
updateReward(address(0))
onlyAuthorized
onlyBeforeDate(START_VESTING_DATE)
{
rewardToken.safeTransferFrom(msg.sender, address(this), reward);
historicalRewards = historicalRewards + reward;
if (block.timestamp >= periodFinish) {
rewardRate = reward / duration;
} else {
uint256 remaining = periodFinish - block.timestamp;
uint256 leftover = remaining * rewardRate;
reward = reward + leftover;
rewardRate = reward / duration;
}
// 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.
uint256 balance = rewardToken.balanceOf(address(this));
require(rewardRate <= balance.div(duration), "Provided reward too high");
currentRewards = reward;
lastUpdateTime = block.timestamp;
periodFinish = block.timestamp + duration;
emit RewardAdded(reward);
}
function setOwner(address _owner) external onlyAuthorized {
owner = _owner;
emit OwnerUpdated(_owner);
}
function setCrvDepositor(address _crvDepositor) external onlyAuthorized {
crvDepositor = _crvDepositor;
// approve crvDepositor to convert contract BPT to liqLIT
IERC20(stakingToken).safeApprove(crvDepositor, type(uint256).max);
emit CrvDepositorUpdated(_crvDepositor);
}
function setVoterProxy(address _voterProxy) external onlyAuthorized {
voterProxy = _voterProxy;
emit VoterProxyUpdated(_voterProxy);
}
function setRewardToken(address _rewardToken) external onlyAuthorized {
IERC20(_rewardToken).safeTransferFrom(owner, address(this), rewardToken.balanceOf(address(this)));
rewardToken = IERC20(_rewardToken);
emit RewardTokenUpdated(_rewardToken);
}
/**
* @dev Allows the owner to pull the renounced balances from people that withdrew
*/
function recoverRenouncedLiq() external onlyAuthorized {
uint256 _totalRenounced = totalRenounced;
totalRenounced = 0;
rewardToken.safeTransfer(msg.sender, _totalRenounced);
emit Recovered(address(rewardToken), _totalRenounced);
}
/**
* @dev Allows the owner to recover other ERC20s mistakingly sent to this contract
*/
function recoverERC20(address tokenAddress, uint256 tokenAmount) external onlyAuthorized {
require(tokenAddress != address(stakingToken) && tokenAddress != address(rewardToken), "Not valid token");
IERC20(tokenAddress).safeTransfer(owner, tokenAmount);
emit Recovered(tokenAddress, tokenAmount);
}
// ----- Modifiers ----- //
modifier onlyAuthorized() {
require(msg.sender == owner, "!auth");
_;
}
modifier onlyAfterDate(uint256 limitDate) {
require(block.timestamp > limitDate, "Currently not possible");
_;
}
modifier onlyBeforeDate(uint256 limitDate) {
require(block.timestamp < limitDate, "No longer possible");
_;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol)
pragma solidity ^0.8.0;
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @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) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @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) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* 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, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @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);
/**
* @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 `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` 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 from, address to, uint256 amount) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../extensions/IERC20Permit.sol";
import "../../../utils/Address.sol";
/**
* @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 IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
/**
* @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
/**
* @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
* calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
*/
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
/**
* @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
}
/**
* @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
}
}
/**
* @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to
* 0 before setting it to a non-zero value.
*/
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
_callOptionalReturn(token, approvalCall);
}
}
/**
* @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.
* Revert on invalid signature.
*/
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
/**
* @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. We use {Address-functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
/**
* @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).
*
* This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
*/
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false
// and not revert is the subcall reverts.
(bool success, bytes memory returndata) = address(token).call(data);
return
success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.11;
interface ICrvDepositor {
function depositFor(
address to,
uint256 _amount,
bool _lock,
address _stakeAddress
) external;
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.11;
interface ILitDepositorHelper {
function deposit(
uint256 _amount,
uint256 _minOut,
bool _lock,
address _stakeAddress
) external returns (uint256 bptOut);
function depositFor(
address _for,
uint256 _amount,
uint256 _minOut,
bool _lock,
address _stakeAddress
) external returns (uint256 bptOut);
function convertLitToBpt(uint256 _amount, uint256 _minOut) external returns (uint256 bptOut);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.11;
interface ICrvVoteEscrow {
function balanceOf(address) external view returns (uint256);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.11;
/// @notice A library for performing overflow-/underflow-safe math,
/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).
library Math {
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
c = a + b;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {
c = a - b;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
c = a * b;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return 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);
}
function to224(uint256 a) internal pure returns (uint224 c) {
require(a <= type(uint224).max, "Math: uint224 Overflow");
c = uint224(a);
}
function to128(uint256 a) internal pure returns (uint128 c) {
require(a <= type(uint128).max, "Math: uint128 Overflow");
c = uint128(a);
}
function to112(uint256 a) internal pure returns (uint112 c) {
require(a <= type(uint112).max, "Math: uint112 Overflow");
c = uint112(a);
}
function to96(uint256 a) internal pure returns (uint96 c) {
require(a <= type(uint96).max, "Math: uint96 Overflow");
c = uint96(a);
}
function to32(uint256 a) internal pure returns (uint32 c) {
require(a <= type(uint32).max, "Math: uint32 Overflow");
c = uint32(a);
}
}
/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.
library Math32 {
function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {
c = a - b;
}
}
/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint112.
library Math112 {
function add(uint112 a, uint112 b) internal pure returns (uint112 c) {
c = a + b;
}
function sub(uint112 a, uint112 b) internal pure returns (uint112 c) {
c = a - b;
}
}
/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint224.
library Math224 {
function add(uint224 a, uint224 b) internal pure returns (uint224 c) {
c = a + b;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}{
"optimizer": {
"enabled": true,
"runs": 1000
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_stakingToken","type":"address"},{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"address","name":"_litConvertor","type":"address"},{"internalType":"address","name":"_lit","type":"address"},{"internalType":"address","name":"_crvDepositor","type":"address"},{"internalType":"address","name":"_voterProxy","type":"address"},{"internalType":"address","name":"_escrow","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Converted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"crvDepositor","type":"address"}],"name":"CrvDepositorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","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":"rewardToken","type":"address"}],"name":"RewardTokenUpdated","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":"voterProxy","type":"address"}],"name":"VoterProxyUpdated","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"},{"inputs":[],"name":"END_VESTING_DATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"START_VESTING_DATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"START_WITHDRAWALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convert","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"crvDepositor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"duration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"escrow","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getClaimableLiqVesting","outputs":[{"internalType":"uint256","name":"claimable","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"historicalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isVestingUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lit","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"litConvertor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recoverRenouncedLiq","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_crvDepositor","type":"address"}],"name":"setCrvDepositor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"}],"name":"setRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_voterProxy","type":"address"}],"name":"setVoterProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stakeFor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minOut","type":"uint256"}],"name":"stakeLit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRenounced","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voterProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6101406040526000600555600060065560006009556000600a553480156200002657600080fd5b506040516200291538038062002915833981016040819052620000499162000506565b60018054336001600160a01b0319918216179091556001600160a01b03888116608052600080548316898316179055600380548316888316908117909155600280548416878416179055600480549093168583161790925582811660c052851660a0819052620000c89160001962000114602090811b6200197f17901c565b620000d7426224ea006200059b565b610100819052620000ec9062ed4e006200059b565b61012052610100516200010390624f1a006200059b565b60e052506200068d95505050505050565b801580620001925750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156200016a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001909190620005c2565b155b6200020a5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084015b60405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620002629185916200026716565b505050565b6000620002c3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200034860201b62001b2d179092919060201c565b9050805160001480620002e7575080806020019051810190620002e79190620005dc565b620002625760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000201565b606062000359848460008562000361565b949350505050565b606082471015620003c45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000201565b600080866001600160a01b03168587604051620003e291906200063a565b60006040518083038185875af1925050503d806000811462000421576040519150601f19603f3d011682016040523d82523d6000602084013e62000426565b606091505b5090925090506200043a8783838762000445565b979650505050505050565b60608315620004b6578251620004ae576001600160a01b0385163b620004ae5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000201565b508162000359565b620003598383815115620004cd5781518083602001fd5b8060405162461bcd60e51b815260040162000201919062000658565b80516001600160a01b03811681146200050157600080fd5b919050565b600080600080600080600060e0888a0312156200052257600080fd5b6200052d88620004e9565b96506200053d60208901620004e9565b95506200054d60408901620004e9565b94506200055d60608901620004e9565b93506200056d60808901620004e9565b92506200057d60a08901620004e9565b91506200058d60c08901620004e9565b905092959891949750929550565b60008219821115620005bd57634e487b7160e01b600052601160045260246000fd5b500190565b600060208284031215620005d557600080fd5b5051919050565b600060208284031215620005ef57600080fd5b815180151581146200060057600080fd5b9392505050565b60005b83811015620006245781810151838201526020016200060a565b8381111562000634576000848401525b50505050565b600082516200064e81846020870162000607565b9190910192915050565b60208152600082518060208401526200067981604085016020870162000607565b601f01601f19169190910160400192915050565b60805160a05160c05160e05161010051610120516121ba6200075b6000396000818161041201528181610a290152610abc0152600081816105ac015281816109f901528181610a9b01528181610ae501528181610be6015281816110cd015261166a0152600081816104db0152610e5d01526000818161063301528181610ef001526117000152600081816103eb0152610799015260008181610502015281816109ba01528181611061015281816112980152818161134f0152818161158e01526118e301526121ba6000f3fe608060405234801561001057600080fd5b50600436106102e85760003560e01c806368f3dd911161019157806391bbdcc7116100e3578063cd3daf9d11610097578063e2fdcc1711610071578063e2fdcc171461062e578063ebe2b12b14610655578063f7c618c11461065e57600080fd5b8063cd3daf9d1461060a578063cd9e7fa114610612578063df136d651461062557600080fd5b8063a694fc3a116100c8578063a694fc3a146105ce578063c884ef83146105e1578063c8f33c911461060157600080fd5b806391bbdcc71461059f578063a56016c3146105a757600080fd5b80638980f11f116101455780638da5cb5b1161011f5780638da5cb5b1461057b5780638dcb40611461058e578063901a7d531461059657600080fd5b80638980f11f146105355780638aee8127146105485780638b8763471461055b57600080fd5b806372f702f31161017657806372f702f3146104fd5780637b0a47ee1461052457806380faa57d1461052d57600080fd5b806368f3dd91146104b357806371800828146104d657600080fd5b8063262d3d6d1161024a5780633abe65c7116101fe5780634e71d92d116101d85780634e71d92d1461048557806355f4f1b91461048d5780636683e5de146104a057600080fd5b80633abe65c7146104575780633c6b16ab1461046a5780633ccfd60b1461047d57600080fd5b806329649a841161022f57806329649a84146103e65780632b1223ce1461040d5780632ee409081461043457600080fd5b8063262d3d6d146103bd57806327e235e3146103c657600080fd5b806313af4035116102a15780631ba980b3116102865780631ba980b3146103815780631da25616146103ac5780632400a1d2146103b557600080fd5b806313af40351461036557806318160ddd1461037857600080fd5b80630700037d116102d25780630700037d1461032857806309d3bda5146103485780630fb5a6b41461035b57600080fd5b80628cc262146102ed578063052cdc0c14610313575b600080fd5b6103006102fb366004611fc8565b610671565b6040519081526020015b60405180910390f35b610326610321366004611fc8565b6106ee565b005b610300610336366004611fc8565b600e6020526000908152604090205481565b610326610356366004611fe3565b61078c565b61030062093a8081565b610326610373366004611fc8565b610862565b610300600b5481565b600454610394906001600160a01b031681565b6040516001600160a01b03909116815260200161030a565b610300600c5481565b610326610906565b610300600a5481565b6103006103d4366004611fc8565b600f6020526000908152604090205481565b6103947f000000000000000000000000000000000000000000000000000000000000000081565b6103007f000000000000000000000000000000000000000000000000000000000000000081565b610447610442366004612005565b6109ab565b604051901515815260200161030a565b610300610465366004611fc8565b6109f5565b61032661047836600461202f565b610b46565b610326610e00565b6103266110cb565b600254610394906001600160a01b031681565b6103266104ae366004611fc8565b611224565b6104476104c1366004611fc8565b60116020526000908152604090205460ff1681565b6103007f000000000000000000000000000000000000000000000000000000000000000081565b6103947f000000000000000000000000000000000000000000000000000000000000000081565b61030060065481565b6103006112f8565b610326610543366004612005565b61130b565b610326610556366004611fc8565b611449565b610300610569366004611fc8565b600d6020526000908152604090205481565b600154610394906001600160a01b031681565b61044761156c565b61030060095481565b61032661160d565b6103007f000000000000000000000000000000000000000000000000000000000000000081565b6104476105dc36600461202f565b6118d4565b6103006105ef366004611fc8565b60106020526000908152604090205481565b61030060075481565b61030061191d565b600354610394906001600160a01b031681565b61030060085481565b6103947f000000000000000000000000000000000000000000000000000000000000000081565b61030060055481565b600054610394906001600160a01b031681565b6001600160a01b0381166000908152600e6020908152604080832054600d909252822054670de0b6b3a7640000906106a761191d565b6106b1919061205e565b6001600160a01b0385166000908152600f60205260409020546106d49190612075565b6106de9190612094565b6106e891906120b6565b92915050565b6001546001600160a01b031633146107355760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b60448201526064015b60405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f0605acbee76a8ae69babe871b46a4e0a0d62b0e79013b2d35cb45e31797a952090600090a250565b6107c16001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085611b44565b6003546040517f9759fdf300000000000000000000000000000000000000000000000000000000815260048101849052602481018390526000916001600160a01b031690639759fdf3906044016020604051808303816000875af115801561082d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085191906120ce565b905061085d8133611b9b565b505050565b6001546001600160a01b031633146108a45760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015260640161072c565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b906020015b60405180910390a150565b6001546001600160a01b031633146109485760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015260640161072c565b600c80546000918290559054610968906001600160a01b03163383611cca565b600054604080516001600160a01b039092168252602082018390527f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa2891016108fb565b60006109e26001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085611b44565b6109ec8284611b9b565b50600192915050565b60007f0000000000000000000000000000000000000000000000000000000000000000421015610a2757506000919050565b7f00000000000000000000000000000000000000000000000000000000000000004210610a7d576001600160a01b038216600090815260106020908152604080832054600e909252909120546106e8919061205e565b6001600160a01b038216600090815260106020526040902054610ae07f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061205e565b610b0a7f00000000000000000000000000000000000000000000000000000000000000004261205e565b6001600160a01b0385166000908152600e6020526040902054610b2d9190612075565b610b379190612094565b6106e8919061205e565b919050565b6000610b5061191d565b600855610b5b6112f8565b6007556001600160a01b03811615610ba257610b7681610671565b6001600160a01b0382166000908152600e6020908152604080832093909355600854600d909152919020555b6001546001600160a01b03163314610be45760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015260640161072c565b7f0000000000000000000000000000000000000000000000000000000000000000804210610c545760405162461bcd60e51b815260206004820152601260248201527f4e6f206c6f6e67657220706f737369626c650000000000000000000000000000604482015260640161072c565b600054610c6c906001600160a01b0316333086611b44565b82600a54610c7a91906120b6565b600a556005544210610c9b57610c9362093a8084612094565b600655610cde565b600042600554610cab919061205e565b9050600060065482610cbd9190612075565b9050610cc981866120b6565b9450610cd862093a8086612094565b60065550505b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610d27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4b91906120ce565b9050610d5a8162093a80611d13565b6006541115610dab5760405162461bcd60e51b815260206004820152601860248201527f50726f76696465642072657761726420746f6f20686967680000000000000000604482015260640161072c565b6009849055426007819055610dc49062093a80906120b6565b6005556040518481527fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9060200160405180910390a150505050565b33610e0961191d565b600855610e146112f8565b6007556001600160a01b03811615610e5b57610e2f81610671565b6001600160a01b0382166000908152600e6020908152604080832093909355600854600d909152919020555b7f0000000000000000000000000000000000000000000000000000000000000000804211610ecb5760405162461bcd60e51b815260206004820152601660248201527f43757272656e746c79206e6f7420706f737369626c6500000000000000000000604482015260640161072c565b600480546040516370a0823160e01b81526001600160a01b03918216928101929092527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610f37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5b91906120ce565b15610fa85760405162461bcd60e51b815260206004820152600960248201527f4163746976617465640000000000000000000000000000000000000000000000604482015260640161072c565b336000908152600f6020526040902054806110055760405162461bcd60e51b815260206004820152601160248201527f43616e6e6f742077697468647261772030000000000000000000000000000000604482015260640161072c565b80600b54611013919061205e565b600b55336000908152600f60209081526040808320839055600e909152812054600c8054919283926110469084906120b6565b9091555050336000818152600e6020526040812055611090907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169084611cca565b60405182815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59060200160405180910390a250505050565b7f000000000000000000000000000000000000000000000000000000000000000080421161113b5760405162461bcd60e51b815260206004820152601660248201527f43757272656e746c79206e6f7420706f737369626c6500000000000000000000604482015260640161072c565b3360009081526011602052604090205460ff1661119a5760405162461bcd60e51b815260206004820152601060248201527f4e6f742076657374696e67205573657200000000000000000000000000000000604482015260640161072c565b60006111a5336109f5565b9050806111b0575050565b33600090815260106020526040812080548392906111cf9084906120b6565b90915550506000546111eb906001600160a01b03163383611cca565b60405181815233907fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a9060200160405180910390a25050565b6001546001600160a01b031633146112665760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015260640161072c565b6002805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038381169182179092556112c1917f0000000000000000000000000000000000000000000000000000000000000000169060001961197f565b6040516001600160a01b038216907f0c84e6311504343eede7201c49eb28097aba01d60b30e33a73ecaff3c2ece2cf90600090a250565b600061130642600554611d26565b905090565b6001546001600160a01b0316331461134d5760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015260640161072c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415801561139d57506000546001600160a01b03838116911614155b6113e95760405162461bcd60e51b815260206004820152600f60248201527f4e6f742076616c696420746f6b656e0000000000000000000000000000000000604482015260640161072c565b600154611403906001600160a01b03848116911683611cca565b604080516001600160a01b0384168152602081018390527f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa28910160405180910390a15050565b6001546001600160a01b0316331461148b5760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015260640161072c565b6001546000546040516370a0823160e01b81523060048201819052611517936001600160a01b039081169391929116906370a0823190602401602060405180830381865afa1580156114e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150591906120ce565b6001600160a01b038516929190611b44565b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038316908117825560405190917fa5289ba11778999f4dfb9415023783188d42bbb5db0612cbfbe55999069612a091a250565b6040516370a0823160e01b815233600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156115d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f991906120ce565b9050611604816118d4565b50600191505090565b3361161661191d565b6008556116216112f8565b6007556001600160a01b038116156116685761163c81610671565b6001600160a01b0382166000908152600e6020908152604080832093909355600854600d909152919020555b7f00000000000000000000000000000000000000000000000000000000000000008042116116d85760405162461bcd60e51b815260206004820152601660248201527f43757272656e746c79206e6f7420706f737369626c6500000000000000000000604482015260640161072c565b600480546040516370a0823160e01b81526001600160a01b03918216928101929092526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015611749573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176d91906120ce565b116117ba5760405162461bcd60e51b815260206004820152600d60248201527f4e6f742061637469766174656400000000000000000000000000000000000000604482015260640161072c565b336000908152600f6020526040902054600b546117d890829061205e565b600b55336000818152600f602052604080822082905560025490517f1e97b6e90000000000000000000000000000000000000000000000000000000081526004810193909352602483018490526001604484015260648301919091526001600160a01b031690631e97b6e990608401600060405180830381600087803b15801561186157600080fd5b505af1158015611875573d6000803e3d6000fd5b50503360008181526011602052604090819020805460ff19166001179055519092507fa428517b481b65176e7c35a57b564d5cf943c8462468b8a0f025fa689173f90191506118c79084815260200190565b60405180910390a2505050565b600061190b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085611b44565b6119158233611b9b565b506001919050565b6000600b5460001415611931575060085490565b600b546006546007546119426112f8565b61194c919061205e565b6119569190612075565b61196890670de0b6b3a7640000612075565b6119729190612094565b60085461130691906120b6565b801580611a1257506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156119ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1091906120ce565b155b611a845760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840161072c565b6040516001600160a01b03831660248201526044810182905261085d9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611d3c565b6060611b3c8484600085611e24565b949350505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611b959085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611ac9565b50505050565b80611ba461191d565b600855611baf6112f8565b6007556001600160a01b03811615611bf657611bca81610671565b6001600160a01b0382166000908152600e6020908152604080832093909355600854600d909152919020555b60008311611c465760405162461bcd60e51b815260206004820152600e60248201527f43616e6e6f74207374616b652030000000000000000000000000000000000000604482015260640161072c565b82600b54611c5491906120b6565b600b556001600160a01b0382166000908152600f6020526040902054611c7b9084906120b6565b6001600160a01b0383166000818152600f6020526040908190209290925590517f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d906118c79086815260200190565b6040516001600160a01b03831660248201526044810182905261085d9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401611ac9565b6000611d1f8284612094565b9392505050565b6000818310611d355781611d1f565b5090919050565b6000611d91826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611b2d9092919063ffffffff16565b9050805160001480611db2575080806020019051810190611db291906120e7565b61085d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161072c565b606082471015611e9c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161072c565b600080866001600160a01b03168587604051611eb89190612135565b60006040518083038185875af1925050503d8060008114611ef5576040519150601f19603f3d011682016040523d82523d6000602084013e611efa565b606091505b5091509150611f0b87838387611f16565b979650505050505050565b60608315611f82578251611f7b576001600160a01b0385163b611f7b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161072c565b5081611b3c565b611b3c8383815115611f975781518083602001fd5b8060405162461bcd60e51b815260040161072c9190612151565b80356001600160a01b0381168114610b4157600080fd5b600060208284031215611fda57600080fd5b611d1f82611fb1565b60008060408385031215611ff657600080fd5b50508035926020909101359150565b6000806040838503121561201857600080fd5b61202183611fb1565b946020939093013593505050565b60006020828403121561204157600080fd5b5035919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561207057612070612048565b500390565b600081600019048311821515161561208f5761208f612048565b500290565b6000826120b157634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156120c9576120c9612048565b500190565b6000602082840312156120e057600080fd5b5051919050565b6000602082840312156120f957600080fd5b81518015158114611d1f57600080fd5b60005b8381101561212457818101518382015260200161210c565b83811115611b955750506000910152565b60008251612147818460208701612109565b9190910192915050565b6020815260008251806020840152612170816040850160208701612109565b601f01601f1916919091016040019291505056fea2646970667358221220d3dfaa1af1cfa430740409c83ec7457033d784eeaab8933029a60b4f125765f364736f6c634300080b00330000000000000000000000009232a548dd9e81bac65500b5e0d918f8ba93675c000000000000000000000000d82fd4d6d62f89a1e50b1db69ad19932314aa40800000000000000000000000097a2585ddb121db8e9a3b6575e302f9c610af08c000000000000000000000000fd0205066521550d7d7ab19da8f72bb004b4c341000000000000000000000000b96bce10480d2a8eb2995ee4f04a70d48997856a00000000000000000000000037aeb332d6e57112f1bfe36923a7ee670ee9278b000000000000000000000000f17d23136b4fead139f54fb766c8795faae09660
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102e85760003560e01c806368f3dd911161019157806391bbdcc7116100e3578063cd3daf9d11610097578063e2fdcc1711610071578063e2fdcc171461062e578063ebe2b12b14610655578063f7c618c11461065e57600080fd5b8063cd3daf9d1461060a578063cd9e7fa114610612578063df136d651461062557600080fd5b8063a694fc3a116100c8578063a694fc3a146105ce578063c884ef83146105e1578063c8f33c911461060157600080fd5b806391bbdcc71461059f578063a56016c3146105a757600080fd5b80638980f11f116101455780638da5cb5b1161011f5780638da5cb5b1461057b5780638dcb40611461058e578063901a7d531461059657600080fd5b80638980f11f146105355780638aee8127146105485780638b8763471461055b57600080fd5b806372f702f31161017657806372f702f3146104fd5780637b0a47ee1461052457806380faa57d1461052d57600080fd5b806368f3dd91146104b357806371800828146104d657600080fd5b8063262d3d6d1161024a5780633abe65c7116101fe5780634e71d92d116101d85780634e71d92d1461048557806355f4f1b91461048d5780636683e5de146104a057600080fd5b80633abe65c7146104575780633c6b16ab1461046a5780633ccfd60b1461047d57600080fd5b806329649a841161022f57806329649a84146103e65780632b1223ce1461040d5780632ee409081461043457600080fd5b8063262d3d6d146103bd57806327e235e3146103c657600080fd5b806313af4035116102a15780631ba980b3116102865780631ba980b3146103815780631da25616146103ac5780632400a1d2146103b557600080fd5b806313af40351461036557806318160ddd1461037857600080fd5b80630700037d116102d25780630700037d1461032857806309d3bda5146103485780630fb5a6b41461035b57600080fd5b80628cc262146102ed578063052cdc0c14610313575b600080fd5b6103006102fb366004611fc8565b610671565b6040519081526020015b60405180910390f35b610326610321366004611fc8565b6106ee565b005b610300610336366004611fc8565b600e6020526000908152604090205481565b610326610356366004611fe3565b61078c565b61030062093a8081565b610326610373366004611fc8565b610862565b610300600b5481565b600454610394906001600160a01b031681565b6040516001600160a01b03909116815260200161030a565b610300600c5481565b610326610906565b610300600a5481565b6103006103d4366004611fc8565b600f6020526000908152604090205481565b6103947f000000000000000000000000fd0205066521550d7d7ab19da8f72bb004b4c34181565b6103007f0000000000000000000000000000000000000000000000000000000065d38ccf81565b610447610442366004612005565b6109ab565b604051901515815260200161030a565b610300610465366004611fc8565b6109f5565b61032661047836600461202f565b610b46565b610326610e00565b6103266110cb565b600254610394906001600160a01b031681565b6103266104ae366004611fc8565b611224565b6104476104c1366004611fc8565b60116020526000908152604090205460ff1681565b6103007f00000000000000000000000000000000000000000000000000000000653558cf81565b6103947f0000000000000000000000009232a548dd9e81bac65500b5e0d918f8ba93675c81565b61030060065481565b6103006112f8565b610326610543366004612005565b61130b565b610326610556366004611fc8565b611449565b610300610569366004611fc8565b600d6020526000908152604090205481565b600154610394906001600160a01b031681565b61044761156c565b61030060095481565b61032661160d565b6103007f0000000000000000000000000000000000000000000000000000000064e63ecf81565b6104476105dc36600461202f565b6118d4565b6103006105ef366004611fc8565b60106020526000908152604090205481565b61030060075481565b61030061191d565b600354610394906001600160a01b031681565b61030060085481565b6103947f000000000000000000000000f17d23136b4fead139f54fb766c8795faae0966081565b61030060055481565b600054610394906001600160a01b031681565b6001600160a01b0381166000908152600e6020908152604080832054600d909252822054670de0b6b3a7640000906106a761191d565b6106b1919061205e565b6001600160a01b0385166000908152600f60205260409020546106d49190612075565b6106de9190612094565b6106e891906120b6565b92915050565b6001546001600160a01b031633146107355760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b60448201526064015b60405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f0605acbee76a8ae69babe871b46a4e0a0d62b0e79013b2d35cb45e31797a952090600090a250565b6107c16001600160a01b037f000000000000000000000000fd0205066521550d7d7ab19da8f72bb004b4c34116333085611b44565b6003546040517f9759fdf300000000000000000000000000000000000000000000000000000000815260048101849052602481018390526000916001600160a01b031690639759fdf3906044016020604051808303816000875af115801561082d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085191906120ce565b905061085d8133611b9b565b505050565b6001546001600160a01b031633146108a45760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015260640161072c565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b906020015b60405180910390a150565b6001546001600160a01b031633146109485760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015260640161072c565b600c80546000918290559054610968906001600160a01b03163383611cca565b600054604080516001600160a01b039092168252602082018390527f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa2891016108fb565b60006109e26001600160a01b037f0000000000000000000000009232a548dd9e81bac65500b5e0d918f8ba93675c16333085611b44565b6109ec8284611b9b565b50600192915050565b60007f0000000000000000000000000000000000000000000000000000000064e63ecf421015610a2757506000919050565b7f0000000000000000000000000000000000000000000000000000000065d38ccf4210610a7d576001600160a01b038216600090815260106020908152604080832054600e909252909120546106e8919061205e565b6001600160a01b038216600090815260106020526040902054610ae07f0000000000000000000000000000000000000000000000000000000064e63ecf7f0000000000000000000000000000000000000000000000000000000065d38ccf61205e565b610b0a7f0000000000000000000000000000000000000000000000000000000064e63ecf4261205e565b6001600160a01b0385166000908152600e6020526040902054610b2d9190612075565b610b379190612094565b6106e8919061205e565b919050565b6000610b5061191d565b600855610b5b6112f8565b6007556001600160a01b03811615610ba257610b7681610671565b6001600160a01b0382166000908152600e6020908152604080832093909355600854600d909152919020555b6001546001600160a01b03163314610be45760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015260640161072c565b7f0000000000000000000000000000000000000000000000000000000064e63ecf804210610c545760405162461bcd60e51b815260206004820152601260248201527f4e6f206c6f6e67657220706f737369626c650000000000000000000000000000604482015260640161072c565b600054610c6c906001600160a01b0316333086611b44565b82600a54610c7a91906120b6565b600a556005544210610c9b57610c9362093a8084612094565b600655610cde565b600042600554610cab919061205e565b9050600060065482610cbd9190612075565b9050610cc981866120b6565b9450610cd862093a8086612094565b60065550505b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610d27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4b91906120ce565b9050610d5a8162093a80611d13565b6006541115610dab5760405162461bcd60e51b815260206004820152601860248201527f50726f76696465642072657761726420746f6f20686967680000000000000000604482015260640161072c565b6009849055426007819055610dc49062093a80906120b6565b6005556040518481527fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9060200160405180910390a150505050565b33610e0961191d565b600855610e146112f8565b6007556001600160a01b03811615610e5b57610e2f81610671565b6001600160a01b0382166000908152600e6020908152604080832093909355600854600d909152919020555b7f00000000000000000000000000000000000000000000000000000000653558cf804211610ecb5760405162461bcd60e51b815260206004820152601660248201527f43757272656e746c79206e6f7420706f737369626c6500000000000000000000604482015260640161072c565b600480546040516370a0823160e01b81526001600160a01b03918216928101929092527f000000000000000000000000f17d23136b4fead139f54fb766c8795faae0966016906370a0823190602401602060405180830381865afa158015610f37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5b91906120ce565b15610fa85760405162461bcd60e51b815260206004820152600960248201527f4163746976617465640000000000000000000000000000000000000000000000604482015260640161072c565b336000908152600f6020526040902054806110055760405162461bcd60e51b815260206004820152601160248201527f43616e6e6f742077697468647261772030000000000000000000000000000000604482015260640161072c565b80600b54611013919061205e565b600b55336000908152600f60209081526040808320839055600e909152812054600c8054919283926110469084906120b6565b9091555050336000818152600e6020526040812055611090907f0000000000000000000000009232a548dd9e81bac65500b5e0d918f8ba93675c6001600160a01b03169084611cca565b60405182815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59060200160405180910390a250505050565b7f0000000000000000000000000000000000000000000000000000000064e63ecf80421161113b5760405162461bcd60e51b815260206004820152601660248201527f43757272656e746c79206e6f7420706f737369626c6500000000000000000000604482015260640161072c565b3360009081526011602052604090205460ff1661119a5760405162461bcd60e51b815260206004820152601060248201527f4e6f742076657374696e67205573657200000000000000000000000000000000604482015260640161072c565b60006111a5336109f5565b9050806111b0575050565b33600090815260106020526040812080548392906111cf9084906120b6565b90915550506000546111eb906001600160a01b03163383611cca565b60405181815233907fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a9060200160405180910390a25050565b6001546001600160a01b031633146112665760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015260640161072c565b6002805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038381169182179092556112c1917f0000000000000000000000009232a548dd9e81bac65500b5e0d918f8ba93675c169060001961197f565b6040516001600160a01b038216907f0c84e6311504343eede7201c49eb28097aba01d60b30e33a73ecaff3c2ece2cf90600090a250565b600061130642600554611d26565b905090565b6001546001600160a01b0316331461134d5760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015260640161072c565b7f0000000000000000000000009232a548dd9e81bac65500b5e0d918f8ba93675c6001600160a01b0316826001600160a01b03161415801561139d57506000546001600160a01b03838116911614155b6113e95760405162461bcd60e51b815260206004820152600f60248201527f4e6f742076616c696420746f6b656e0000000000000000000000000000000000604482015260640161072c565b600154611403906001600160a01b03848116911683611cca565b604080516001600160a01b0384168152602081018390527f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa28910160405180910390a15050565b6001546001600160a01b0316331461148b5760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015260640161072c565b6001546000546040516370a0823160e01b81523060048201819052611517936001600160a01b039081169391929116906370a0823190602401602060405180830381865afa1580156114e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150591906120ce565b6001600160a01b038516929190611b44565b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038316908117825560405190917fa5289ba11778999f4dfb9415023783188d42bbb5db0612cbfbe55999069612a091a250565b6040516370a0823160e01b815233600482015260009081906001600160a01b037f0000000000000000000000009232a548dd9e81bac65500b5e0d918f8ba93675c16906370a0823190602401602060405180830381865afa1580156115d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f991906120ce565b9050611604816118d4565b50600191505090565b3361161661191d565b6008556116216112f8565b6007556001600160a01b038116156116685761163c81610671565b6001600160a01b0382166000908152600e6020908152604080832093909355600854600d909152919020555b7f0000000000000000000000000000000000000000000000000000000064e63ecf8042116116d85760405162461bcd60e51b815260206004820152601660248201527f43757272656e746c79206e6f7420706f737369626c6500000000000000000000604482015260640161072c565b600480546040516370a0823160e01b81526001600160a01b03918216928101929092526000917f000000000000000000000000f17d23136b4fead139f54fb766c8795faae09660909116906370a0823190602401602060405180830381865afa158015611749573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176d91906120ce565b116117ba5760405162461bcd60e51b815260206004820152600d60248201527f4e6f742061637469766174656400000000000000000000000000000000000000604482015260640161072c565b336000908152600f6020526040902054600b546117d890829061205e565b600b55336000818152600f602052604080822082905560025490517f1e97b6e90000000000000000000000000000000000000000000000000000000081526004810193909352602483018490526001604484015260648301919091526001600160a01b031690631e97b6e990608401600060405180830381600087803b15801561186157600080fd5b505af1158015611875573d6000803e3d6000fd5b50503360008181526011602052604090819020805460ff19166001179055519092507fa428517b481b65176e7c35a57b564d5cf943c8462468b8a0f025fa689173f90191506118c79084815260200190565b60405180910390a2505050565b600061190b6001600160a01b037f0000000000000000000000009232a548dd9e81bac65500b5e0d918f8ba93675c16333085611b44565b6119158233611b9b565b506001919050565b6000600b5460001415611931575060085490565b600b546006546007546119426112f8565b61194c919061205e565b6119569190612075565b61196890670de0b6b3a7640000612075565b6119729190612094565b60085461130691906120b6565b801580611a1257506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156119ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1091906120ce565b155b611a845760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840161072c565b6040516001600160a01b03831660248201526044810182905261085d9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611d3c565b6060611b3c8484600085611e24565b949350505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611b959085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611ac9565b50505050565b80611ba461191d565b600855611baf6112f8565b6007556001600160a01b03811615611bf657611bca81610671565b6001600160a01b0382166000908152600e6020908152604080832093909355600854600d909152919020555b60008311611c465760405162461bcd60e51b815260206004820152600e60248201527f43616e6e6f74207374616b652030000000000000000000000000000000000000604482015260640161072c565b82600b54611c5491906120b6565b600b556001600160a01b0382166000908152600f6020526040902054611c7b9084906120b6565b6001600160a01b0383166000818152600f6020526040908190209290925590517f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d906118c79086815260200190565b6040516001600160a01b03831660248201526044810182905261085d9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401611ac9565b6000611d1f8284612094565b9392505050565b6000818310611d355781611d1f565b5090919050565b6000611d91826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611b2d9092919063ffffffff16565b9050805160001480611db2575080806020019051810190611db291906120e7565b61085d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161072c565b606082471015611e9c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161072c565b600080866001600160a01b03168587604051611eb89190612135565b60006040518083038185875af1925050503d8060008114611ef5576040519150601f19603f3d011682016040523d82523d6000602084013e611efa565b606091505b5091509150611f0b87838387611f16565b979650505050505050565b60608315611f82578251611f7b576001600160a01b0385163b611f7b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161072c565b5081611b3c565b611b3c8383815115611f975781518083602001fd5b8060405162461bcd60e51b815260040161072c9190612151565b80356001600160a01b0381168114610b4157600080fd5b600060208284031215611fda57600080fd5b611d1f82611fb1565b60008060408385031215611ff657600080fd5b50508035926020909101359150565b6000806040838503121561201857600080fd5b61202183611fb1565b946020939093013593505050565b60006020828403121561204157600080fd5b5035919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561207057612070612048565b500390565b600081600019048311821515161561208f5761208f612048565b500290565b6000826120b157634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156120c9576120c9612048565b500190565b6000602082840312156120e057600080fd5b5051919050565b6000602082840312156120f957600080fd5b81518015158114611d1f57600080fd5b60005b8381101561212457818101518382015260200161210c565b83811115611b955750506000910152565b60008251612147818460208701612109565b9190910192915050565b6020815260008251806020840152612170816040850160208701612109565b601f01601f1916919091016040019291505056fea2646970667358221220d3dfaa1af1cfa430740409c83ec7457033d784eeaab8933029a60b4f125765f364736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009232a548dd9e81bac65500b5e0d918f8ba93675c000000000000000000000000d82fd4d6d62f89a1e50b1db69ad19932314aa40800000000000000000000000097a2585ddb121db8e9a3b6575e302f9c610af08c000000000000000000000000fd0205066521550d7d7ab19da8f72bb004b4c341000000000000000000000000b96bce10480d2a8eb2995ee4f04a70d48997856a00000000000000000000000037aeb332d6e57112f1bfe36923a7ee670ee9278b000000000000000000000000f17d23136b4fead139f54fb766c8795faae09660
-----Decoded View---------------
Arg [0] : _stakingToken (address): 0x9232a548DD9E81BaC65500b5e0d918F8Ba93675C
Arg [1] : _rewardToken (address): 0xD82fd4D6D62f89A1E50b1db69AD19932314aa408
Arg [2] : _litConvertor (address): 0x97a2585Ddb121db8E9a3B6575E302F9c610AF08c
Arg [3] : _lit (address): 0xfd0205066521550D7d7AB19DA8F72bb004b4C341
Arg [4] : _crvDepositor (address): 0xB96Bce10480d2a8eb2995Ee4f04a70d48997856a
Arg [5] : _voterProxy (address): 0x37aeB332D6E57112f1BFE36923a7ee670Ee9278b
Arg [6] : _escrow (address): 0xf17d23136B4FeAd139f54fB766c8795faae09660
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000009232a548dd9e81bac65500b5e0d918f8ba93675c
Arg [1] : 000000000000000000000000d82fd4d6d62f89a1e50b1db69ad19932314aa408
Arg [2] : 00000000000000000000000097a2585ddb121db8e9a3b6575e302f9c610af08c
Arg [3] : 000000000000000000000000fd0205066521550d7d7ab19da8f72bb004b4c341
Arg [4] : 000000000000000000000000b96bce10480d2a8eb2995ee4f04a70d48997856a
Arg [5] : 00000000000000000000000037aeb332d6e57112f1bfe36923a7ee670ee9278b
Arg [6] : 000000000000000000000000f17d23136b4fead139f54fb766c8795faae09660
Loading...
Loading
Loading...
Loading
Net Worth in USD
$31.22
Net Worth in ETH
0.016431
Token Allocations
LIQ
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $0.000054 | 573,456.1773 | $31.22 |
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.