More Info
Private Name Tags
ContractCreator
Multichain Info
No addresses found
Latest 25 from a total of 345 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 21404349 | 102 days ago | IN | 0 ETH | 0.00067723 | ||||
Convert | 21404343 | 102 days ago | IN | 0 ETH | 0.00470701 | ||||
Claim | 21382467 | 105 days ago | IN | 0 ETH | 0.00102393 | ||||
Claim | 20798364 | 186 days ago | IN | 0 ETH | 0.0004819 | ||||
Claim | 20657243 | 206 days ago | IN | 0 ETH | 0.00013103 | ||||
Claim | 20578945 | 217 days ago | IN | 0 ETH | 0.00011444 | ||||
Claim | 20568953 | 218 days ago | IN | 0 ETH | 0.00006723 | ||||
Claim | 20371469 | 246 days ago | IN | 0 ETH | 0.00025966 | ||||
Claim | 20371465 | 246 days ago | IN | 0 ETH | 0.00087037 | ||||
Convert | 20371463 | 246 days ago | IN | 0 ETH | 0.00444462 | ||||
Claim | 20216264 | 268 days ago | IN | 0 ETH | 0.00021716 | ||||
Claim | 19903341 | 311 days ago | IN | 0 ETH | 0.00025172 | ||||
Claim | 19875561 | 315 days ago | IN | 0 ETH | 0.00056447 | ||||
Claim | 19836473 | 321 days ago | IN | 0 ETH | 0.00031369 | ||||
Claim | 19828965 | 322 days ago | IN | 0 ETH | 0.00025729 | ||||
Claim | 19730472 | 335 days ago | IN | 0 ETH | 0.00044503 | ||||
Claim | 19715810 | 337 days ago | IN | 0 ETH | 0.00040263 | ||||
Claim | 19667966 | 344 days ago | IN | 0 ETH | 0.00065628 | ||||
Claim | 19623528 | 350 days ago | IN | 0 ETH | 0.00077118 | ||||
Claim | 19592502 | 355 days ago | IN | 0 ETH | 0.00072332 | ||||
Claim | 19589067 | 355 days ago | IN | 0 ETH | 0.00089102 | ||||
Claim | 19556154 | 360 days ago | IN | 0 ETH | 0.0009752 | ||||
Claim | 19497492 | 368 days ago | IN | 0 ETH | 0.00091794 | ||||
Claim | 19296020 | 396 days ago | IN | 0 ETH | 0.00225335 | ||||
Claim | 19272925 | 400 days ago | IN | 0 ETH | 0.00218242 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
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
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.