Latest 25 from a total of 626 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw All | 27831190 | 79 days ago | IN | 0 FRAX | 0.0000138 | ||||
| Deposit | 22512003 | 203 days ago | IN | 0 FRAX | 0.00002403 | ||||
| Deposit | 22378163 | 206 days ago | IN | 0 FRAX | 0.00008466 | ||||
| Deposit | 22152074 | 211 days ago | IN | 0 FRAX | 0.0000262 | ||||
| Deposit | 22026355 | 214 days ago | IN | 0 FRAX | 0.00054553 | ||||
| Deposit | 21924152 | 216 days ago | IN | 0 FRAX | 0.00005105 | ||||
| Deposit | 21774655 | 220 days ago | IN | 0 FRAX | 0.00008929 | ||||
| Deposit | 21763150 | 220 days ago | IN | 0 FRAX | 0.0001396 | ||||
| Deposit | 21464276 | 227 days ago | IN | 0 FRAX | 0.00036529 | ||||
| Deposit | 21461474 | 227 days ago | IN | 0 FRAX | 0.00132209 | ||||
| Deposit | 21430693 | 228 days ago | IN | 0 FRAX | 0.0001519 | ||||
| Deposit | 21429748 | 228 days ago | IN | 0 FRAX | 0.00020128 | ||||
| Deposit | 21316794 | 230 days ago | IN | 0 FRAX | 0.00004423 | ||||
| Deposit | 21287546 | 231 days ago | IN | 0 FRAX | 0.00004601 | ||||
| Deposit | 21285680 | 231 days ago | IN | 0 FRAX | 0.00004555 | ||||
| Deposit | 21207796 | 233 days ago | IN | 0 FRAX | 0.00025816 | ||||
| Deposit | 21207247 | 233 days ago | IN | 0 FRAX | 0.00022559 | ||||
| Deposit | 21159277 | 234 days ago | IN | 0 FRAX | 0.00022024 | ||||
| Deposit | 21149986 | 234 days ago | IN | 0 FRAX | 0.00027272 | ||||
| Deposit | 21107995 | 235 days ago | IN | 0 FRAX | 0.00000918 | ||||
| Deposit | 20947825 | 239 days ago | IN | 0 FRAX | 0.00000183 | ||||
| Deposit | 20936217 | 239 days ago | IN | 0 FRAX | 0.00000112 | ||||
| Deposit | 20930733 | 239 days ago | IN | 0 FRAX | 0.00000075 | ||||
| Deposit | 20898294 | 240 days ago | IN | 0 FRAX | 0.00000448 | ||||
| Deposit | 20896004 | 240 days ago | IN | 0 FRAX | 0.0000322 |
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers.
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | ||||
|---|---|---|---|---|---|---|---|
| 30445204 | 19 days ago | 0 FRAX | |||||
| 30445204 | 19 days ago | 0 FRAX | |||||
| 30445204 | 19 days ago | 0 FRAX | |||||
| 30445186 | 19 days ago | 0 FRAX | |||||
| 30445186 | 19 days ago | 0 FRAX | |||||
| 30097401 | 27 days ago | 0 FRAX | |||||
| 30097401 | 27 days ago | 0 FRAX | |||||
| 30097401 | 27 days ago | 0 FRAX | |||||
| 30097383 | 27 days ago | 0 FRAX | |||||
| 30097383 | 27 days ago | 0 FRAX | |||||
| 30097383 | 27 days ago | 0 FRAX | |||||
| 28729800 | 59 days ago | 0 FRAX | |||||
| 28729800 | 59 days ago | 0 FRAX | |||||
| 28729800 | 59 days ago | 0 FRAX | |||||
| 28729793 | 59 days ago | 0 FRAX | |||||
| 28729793 | 59 days ago | 0 FRAX | |||||
| 28729793 | 59 days ago | 0 FRAX | |||||
| 28729788 | 59 days ago | 0 FRAX | |||||
| 28729788 | 59 days ago | 0 FRAX | |||||
| 28729788 | 59 days ago | 0 FRAX | |||||
| 28729788 | 59 days ago | 0 FRAX | |||||
| 28729788 | 59 days ago | 0 FRAX | |||||
| 28517872 | 64 days ago | 0 FRAX | |||||
| 28517872 | 64 days ago | 0 FRAX | |||||
| 28517872 | 64 days ago | 0 FRAX |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
BoosterLite
Compiler Version
v0.6.12+commit.27d51765
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
import "./Interfaces.sol";
import "@openzeppelin/contracts-0.6/math/SafeMath.sol";
import "@openzeppelin/contracts-0.6/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts-0.6/utils/Address.sol";
import "@openzeppelin/contracts-0.6/token/ERC20/SafeERC20.sol";
import "@openzeppelin/contracts-0.6/utils/ReentrancyGuard.sol";
interface ICoordinator {
function queueNewRewards(
address,
uint256,
uint256,
address
) external payable;
}
/**
* @title BoosterLite
* @author ConvexFinance -> AuraFinance
* @dev A lite version of the original Booster for use on sidechains
*/
contract BoosterLite is ReentrancyGuard {
using SafeERC20 for IERC20;
using Address for address;
using SafeMath for uint256;
address public crv;
uint256 public lockIncentive = 825; //incentive to crv stakers
uint256 public stakerIncentive = 825; //incentive to native token stakers
uint256 public earmarkIncentive = 50; //incentive to users who spend gas to make calls
uint256 public platformFee = 0; //possible fee to build treasury
uint256 public constant MaxFees = 4000;
uint256 public constant FEE_DENOMINATOR = 10000;
address public owner;
address public feeManager;
address public poolManager;
address public immutable staker;
address public minter;
address public rewardFactory;
address public stashFactory;
address public tokenFactory;
address public treasury;
address public rewards; //cvxCrv rewards(crv)
bool public isShutdown;
struct PoolInfo {
address lptoken;
address token;
address gauge;
address crvRewards;
address stash;
bool shutdown;
}
//index(pid) -> pool
PoolInfo[] public poolInfo;
mapping(address => bool) public gaugeMap;
event Deposited(address indexed user, uint256 indexed poolid, uint256 amount);
event Withdrawn(address indexed user, uint256 indexed poolid, uint256 amount);
event PoolAdded(address lpToken, address gauge, address token, address rewardPool, address stash, uint256 pid);
event PoolShutdown(uint256 poolId);
event OwnerUpdated(address newOwner);
event FeeManagerUpdated(address newFeeManager);
event PoolManagerUpdated(address newPoolManager);
event FactoriesUpdated(address rewardFactory, address stashFactory, address tokenFactory);
event RewardContractsUpdated(address rewards);
event FeesUpdated(uint256 lockIncentive, uint256 stakerIncentive, uint256 earmarkIncentive, uint256 platformFee);
event TreasuryUpdated(address newTreasury);
/**
* @dev Constructor doing what constructors do. It is noteworthy that
* a lot of basic config is set to 0 - expecting subsequent calls setFeeManager etc.
* @param _staker VoterProxyLite (locks the crv and adds to all gauges)
*/
constructor(address _staker) public {
staker = _staker;
isShutdown = false;
owner = msg.sender;
treasury = address(0);
emit OwnerUpdated(msg.sender);
}
/**
* @notice Initialize the contract.
* @param _minter CVX token, or the thing that mints it
* @param _crv CRV Token address
* @param _owner Owner address
*/
function initialize(
address _minter,
address _crv,
address _owner
) external {
require(msg.sender == owner, "!auth");
require(crv == address(0), "Only once");
minter = _minter;
crv = _crv;
owner = _owner;
feeManager = _owner;
poolManager = _owner;
emit OwnerUpdated(msg.sender);
emit FeeManagerUpdated(msg.sender);
emit PoolManagerUpdated(msg.sender);
}
/// SETTER SECTION ///
/**
* @notice Owner is responsible for setting initial config, updating vote delegate and shutting system
*/
function setOwner(address _owner) external {
require(msg.sender == owner, "!auth");
owner = _owner;
emit OwnerUpdated(_owner);
}
/**
* @notice Fee Manager can update the fees (lockIncentive, stakeIncentive, earmarkIncentive, platformFee)
*/
function setFeeManager(address _feeM) external {
require(msg.sender == owner, "!auth");
feeManager = _feeM;
emit FeeManagerUpdated(_feeM);
}
/**
* @notice Pool manager is responsible for adding new pools
*/
function setPoolManager(address _poolM) external {
require(msg.sender == poolManager, "!auth");
poolManager = _poolM;
emit PoolManagerUpdated(_poolM);
}
/**
* @notice Factories are used when deploying new pools. Only the stash factory is mutable after init
*/
function setFactories(
address _rfactory,
address _sfactory,
address _tfactory
) external {
require(msg.sender == owner, "!auth");
//stash factory should be considered more safe to change
//updating may be required to handle new types of gauges
stashFactory = _sfactory;
//reward factory only allow this to be called once even if owner
//removes ability to inject malicious staking contracts
//token factory can also be immutable
if (rewardFactory == address(0)) {
rewardFactory = _rfactory;
tokenFactory = _tfactory;
emit FactoriesUpdated(_rfactory, _sfactory, _tfactory);
} else {
emit FactoriesUpdated(address(0), _sfactory, address(0));
}
}
/**
* @notice Only called once, to set the addresses of cvxCrv (rewards)
*/
function setRewardContracts(address _rewards) external {
require(msg.sender == owner, "!auth");
//reward contracts are immutable or else the owner
//has a means to redeploy and mint cvx via rewardClaimed()
if (rewards == address(0)) {
rewards = _rewards;
emit RewardContractsUpdated(_rewards);
}
}
/**
* @notice Fee manager can set all the relevant fees
* @param _lockFees % for cvxCrv stakers where 1% == 100
* @param _stakerFees % for CVX stakers where 1% == 100
* @param _callerFees % for whoever calls the claim where 1% == 100
* @param _platform % for "treasury" or vlCVX where 1% == 100
*/
function setFees(
uint256 _lockFees,
uint256 _stakerFees,
uint256 _callerFees,
uint256 _platform
) external nonReentrant {
require(msg.sender == feeManager, "!auth");
uint256 total = _lockFees.add(_stakerFees).add(_callerFees).add(_platform);
require(total <= MaxFees, ">MaxFees");
require(_lockFees >= 300 && _lockFees <= 3500, "!lockFees");
require(_stakerFees >= 300 && _stakerFees <= 1500, "!stakerFees");
require(_callerFees >= 10 && _callerFees <= 100, "!callerFees");
require(_platform <= 200, "!platform");
lockIncentive = _lockFees;
stakerIncentive = _stakerFees;
earmarkIncentive = _callerFees;
platformFee = _platform;
emit FeesUpdated(_lockFees, _stakerFees, _callerFees, _platform);
}
/**
* @notice Set the address of the treasury (i.e. vlCVX)
*/
function setTreasury(address _treasury) external {
require(msg.sender == feeManager, "!auth");
treasury = _treasury;
emit TreasuryUpdated(_treasury);
}
/// END SETTER SECTION ///
function poolLength() external view returns (uint256) {
return poolInfo.length;
}
/**
* @notice Called by the PoolManager (i.e. PoolManagerProxy) to add a new pool - creates all the required
* contracts (DepositToken, RewardPool, Stash) and then adds to the list!
*/
function addPool(
address _lptoken,
address _gauge,
uint256 _stashVersion
) external returns (bool) {
require(msg.sender == poolManager && !isShutdown, "!add");
require(_gauge != address(0) && _lptoken != address(0), "!param");
//the next pool's pid
uint256 pid = poolInfo.length;
//create a tokenized deposit
address token = ITokenFactory(tokenFactory).CreateDepositToken(_lptoken);
//create a reward contract for crv rewards
address newRewardPool = IRewardFactory(rewardFactory).CreateCrvRewards(pid, token, _lptoken);
//create a stash to handle extra incentives
address stash = IStashFactory(stashFactory).CreateStash(pid, _gauge, staker, _stashVersion);
//add the new pool
poolInfo.push(
PoolInfo({
lptoken: _lptoken,
token: token,
gauge: _gauge,
crvRewards: newRewardPool,
stash: stash,
shutdown: false
})
);
gaugeMap[_gauge] = true;
//give stashes access to rewardfactory and voteproxy
// voteproxy so it can grab the incentive tokens off the contract after claiming rewards
// reward factory so that stashes can make new extra reward contracts if a new incentive is added to the gauge
if (stash != address(0)) {
poolInfo[pid].stash = stash;
IStaker(staker).setStashAccess(stash, true);
IRewardFactory(rewardFactory).setAccess(stash, true);
}
emit PoolAdded(_lptoken, _gauge, token, newRewardPool, stash, pid);
return true;
}
/**
* @notice Shuts down the pool by withdrawing everything from the gauge to here (can later be
* claimed from depositors by using the withdraw fn) and marking it as shut down
*/
function shutdownPool(uint256 _pid) external nonReentrant returns (bool) {
require(msg.sender == poolManager, "!auth");
PoolInfo storage pool = poolInfo[_pid];
//withdraw from gauge
try IStaker(staker).withdrawAll(pool.lptoken, pool.gauge) {} catch {}
pool.shutdown = true;
gaugeMap[pool.gauge] = false;
emit PoolShutdown(_pid);
return true;
}
/**
* @notice Shuts down the WHOLE SYSTEM by withdrawing all the LP tokens to here and then allowing
* for subsequent withdrawal by any depositors.
*/
function shutdownSystem() external {
require(msg.sender == owner, "!auth");
isShutdown = true;
for (uint256 i = 0; i < poolInfo.length; i++) {
PoolInfo storage pool = poolInfo[i];
if (pool.shutdown) continue;
address token = pool.lptoken;
address gauge = pool.gauge;
//withdraw from gauge
try IStaker(staker).withdrawAll(token, gauge) {
pool.shutdown = true;
} catch {}
}
}
/**
* @notice Deposits an "_amount" to a given gauge (specified by _pid), mints a `DepositToken`
* and subsequently stakes that on Convex BaseRewardPool
*/
function deposit(
uint256 _pid,
uint256 _amount,
bool _stake
) public nonReentrant returns (bool) {
require(!isShutdown, "shutdown");
PoolInfo storage pool = poolInfo[_pid];
require(pool.shutdown == false, "pool is closed");
//send to proxy to stake
address lptoken = pool.lptoken;
IERC20(lptoken).safeTransferFrom(msg.sender, staker, _amount);
//stake
address gauge = pool.gauge;
require(gauge != address(0), "!gauge setting");
IStaker(staker).deposit(lptoken, gauge);
//some gauges claim rewards when depositing, stash them in a seperate contract until next claim
address stash = pool.stash;
if (stash != address(0)) {
IStash(stash).stashRewards();
}
address token = pool.token;
if (_stake) {
//mint here and send to rewards on user behalf
ITokenMinter(token).mint(address(this), _amount);
address rewardContract = pool.crvRewards;
IERC20(token).safeApprove(rewardContract, 0);
IERC20(token).safeApprove(rewardContract, _amount);
IRewards(rewardContract).stakeFor(msg.sender, _amount);
} else {
//add user balance directly
ITokenMinter(token).mint(msg.sender, _amount);
}
emit Deposited(msg.sender, _pid, _amount);
return true;
}
/**
* @notice Deposits all a senders balance to a given gauge (specified by _pid), mints a `DepositToken`
* and subsequently stakes that on Convex BaseRewardPool
*/
function depositAll(uint256 _pid, bool _stake) external returns (bool) {
address lptoken = poolInfo[_pid].lptoken;
uint256 balance = IERC20(lptoken).balanceOf(msg.sender);
deposit(_pid, balance, _stake);
return true;
}
/**
* @notice Withdraws LP tokens from a given PID (& user).
* 1. Burn the cvxLP balance from "_from" (implicit balance check)
* 2. If pool !shutdown.. withdraw from gauge
* 3. If stash, stash rewards
* 4. Transfer out the LP tokens
*/
function _withdraw(
uint256 _pid,
uint256 _amount,
address _from,
address _to
) internal nonReentrant {
PoolInfo storage pool = poolInfo[_pid];
address lptoken = pool.lptoken;
address gauge = pool.gauge;
//remove lp balance
address token = pool.token;
ITokenMinter(token).burn(_from, _amount);
//pull from gauge if not shutdown
// if shutdown tokens will be in this contract
if (!pool.shutdown) {
IStaker(staker).withdraw(lptoken, gauge, _amount);
}
//some gauges claim rewards when withdrawing, stash them in a seperate contract until next claim
//do not call if shutdown since stashes wont have access
address stash = pool.stash;
if (stash != address(0) && !isShutdown && !pool.shutdown) {
IStash(stash).stashRewards();
}
//return lp tokens
IERC20(lptoken).safeTransfer(_to, _amount);
emit Withdrawn(_to, _pid, _amount);
}
/**
* @notice Withdraw a given amount from a pool (must already been unstaked from the Convex Reward Pool -
* BaseRewardPool uses withdrawAndUnwrap to get around this)
*/
function withdraw(uint256 _pid, uint256 _amount) public returns (bool) {
_withdraw(_pid, _amount, msg.sender, msg.sender);
return true;
}
/**
* @notice Withdraw all the senders LP tokens from a given gauge
*/
function withdrawAll(uint256 _pid) public returns (bool) {
address token = poolInfo[_pid].token;
uint256 userBal = IERC20(token).balanceOf(msg.sender);
withdraw(_pid, userBal);
return true;
}
/**
* @notice Allows the actual BaseRewardPool to withdraw and send directly to the user
*/
function withdrawTo(
uint256 _pid,
uint256 _amount,
address _to
) external returns (bool) {
address rewardContract = poolInfo[_pid].crvRewards;
require(msg.sender == rewardContract, "!auth");
_withdraw(_pid, _amount, msg.sender, _to);
return true;
}
/**
* @notice Allows a stash to claim secondary rewards from a gauge
*/
function claimRewards(uint256 _pid, address _gauge) external returns (bool) {
address stash = poolInfo[_pid].stash;
require(msg.sender == stash, "!auth");
IStaker(staker).claimRewards(_gauge);
return true;
}
/**
* @notice Tells the Curve gauge to redirect any accrued rewards to the given stash via the VoterProxy
*/
function setGaugeRedirect(uint256 _pid) external returns (bool) {
address stash = poolInfo[_pid].stash;
require(msg.sender == stash, "!auth");
address gauge = poolInfo[_pid].gauge;
bytes memory data = abi.encodeWithSelector(bytes4(keccak256("set_rewards_receiver(address)")), stash);
IStaker(staker).execute(gauge, uint256(0), data);
return true;
}
/**
* @notice Basically a hugely pivotal function.
* Responsible for collecting the crv from gauge, and then redistributing to the correct place.
* Pays the caller a fee to process this.
*/
function _earmarkRewards(uint256 _pid, address _zroPaymentAddress) internal {
PoolInfo storage pool = poolInfo[_pid];
require(pool.shutdown == false, "pool is closed");
uint256 crvBal;
{
// If there is idle CRV in the Booster we need to transfer it out
// in order that our accounting doesn't get scewed.
uint256 crvBBalBefore = IERC20(crv).balanceOf(address(this));
uint256 crvVBalBefore = IERC20(crv).balanceOf(staker);
uint256 crvBalBefore = crvBBalBefore.add(crvVBalBefore);
//claim crv
IStaker(staker).claimCrv(pool.gauge);
//crv balance
uint256 crvBalAfter = IERC20(crv).balanceOf(address(this));
crvBal = crvBalAfter.sub(crvBalBefore);
if (crvBalBefore > 0 && treasury != address(0)) {
IERC20(crv).safeTransfer(treasury, crvBalBefore);
}
}
//check if there are extra rewards
address stash = pool.stash;
if (stash != address(0)) {
//claim extra rewards
IStash(stash).claimRewards();
//process extra rewards
IStash(stash).processStash();
}
if (crvBal > 0) {
// LockIncentive = cvxCrv stakers
uint256 _lockIncentive = crvBal.mul(lockIncentive).div(FEE_DENOMINATOR);
// StakerIncentive = cvx stakers
uint256 _stakerIncentive = crvBal.mul(stakerIncentive).div(FEE_DENOMINATOR);
// CallIncentive = caller of this contract
uint256 _callIncentive = crvBal.mul(earmarkIncentive).div(FEE_DENOMINATOR);
// Platform incentives
uint256 _platformIncentive = crvBal.mul(platformFee).div(FEE_DENOMINATOR);
uint256 _totalIncentive = _lockIncentive.add(_stakerIncentive).add(_platformIncentive);
//remove incentives from balance
crvBal = crvBal.sub(_totalIncentive).sub(_callIncentive);
//send incentives for calling
IERC20(crv).safeTransfer(msg.sender, _callIncentive);
//send crv to lp provider reward contract
address rewardContract = pool.crvRewards;
IERC20(crv).safeTransfer(rewardContract, crvBal);
IRewards(rewardContract).queueNewRewards(crvBal);
//send lockers' share of crv to reward contract
IERC20(crv).safeTransfer(rewards, _totalIncentive);
ICoordinator(rewards).queueNewRewards{ value: msg.value }(
msg.sender,
_totalIncentive,
crvBal,
_zroPaymentAddress
);
}
}
/**
* @notice Basically a hugely pivotal function.
* Responsible for collecting the crv from gauge, and then redistributing to the correct place.
* Pays the caller a fee to process this.
*/
function earmarkRewards(uint256 _pid, address _zroPaymentAddress) external payable nonReentrant returns (bool) {
require(!isShutdown, "shutdown");
_earmarkRewards(_pid, _zroPaymentAddress);
return true;
}
/**
* @notice Callback from reward contract when crv is received.
* @dev Goes off and mints a relative amount of `CVX` based on the distribution schedule.
*/
function rewardClaimed(
uint256 _pid,
address _address,
uint256 _amount
) external returns (bool) {
address rewardContract = poolInfo[_pid].crvRewards;
require(msg.sender == rewardContract, "!auth");
if (_amount > 0) {
//mint reward tokens
ITokenMinter(minter).mint(_address, _amount);
}
return true;
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
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) {
// 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) {
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) {
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) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
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) {
if (a == 0) return 0;
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: division by zero");
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) {
require(b > 0, "SafeMath: modulo by zero");
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) {
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.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryDiv}.
*
* 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) {
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) {
require(b > 0, errorMessage);
return a % b;
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "./IERC20.sol";
import "../../math/SafeMath.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 SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @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'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. 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");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
/**
* @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
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(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 functionCall(target, data, "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");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(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) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(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) {
require(isContract(target), "Address: delegate call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// 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
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor () internal {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface ICurveGauge {
function deposit(uint256) external;
function balanceOf(address) external view returns (uint256);
function withdraw(uint256) external;
function claim_rewards() external;
function reward_tokens(uint256) external view returns(address);//v2
function rewarded_token() external view returns(address);//v1
function lp_token() external view returns(address);
}
interface ICurveVoteEscrow {
function create_lock(uint256, uint256) external;
function increase_amount(uint256) external;
function increase_unlock_time(uint256) external;
function withdraw() external;
function smart_wallet_checker() external view returns (address);
function commit_smart_wallet_checker(address) external;
function apply_smart_wallet_checker() external;
}
interface IWalletChecker {
function check(address) external view returns (bool);
function approveWallet(address) external;
function dao() external view returns (address);
}
interface IVoting{
function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided
function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);
function vote_for_gauge_weights(address,uint256) external;
}
interface IMinter{
function mint(address) external;
}
interface IStaker{
function deposit(address, address) external returns (bool);
function withdraw(address) external returns (uint256);
function withdraw(address, address, uint256) external returns (bool);
function withdrawAll(address, address) external returns (bool);
function createLock(uint256, uint256) external returns(bool);
function increaseAmount(uint256) external returns(bool);
function increaseTime(uint256) external returns(bool);
function release() external returns(bool);
function claimCrv(address) external returns (uint256);
function claimRewards(address) external returns(bool);
function claimFees(address,address) external returns (uint256);
function setStashAccess(address, bool) external returns (bool);
function vote(uint256,address,bool) external returns(bool);
function voteGaugeWeight(address,uint256) external returns(bool);
function balanceOfPool(address) external view returns (uint256);
function operator() external view returns (address);
function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);
function setVote(bytes32 hash, bool valid) external;
function migrate(address to) external;
}
interface IRewards{
function stake(address, uint256) external;
function stakeFor(address, uint256) external;
function withdraw(address, uint256) external;
function exit(address) external;
function getReward(address) external;
function queueNewRewards(uint256) external;
function notifyRewardAmount(uint256) external;
function addExtraReward(address) external;
function extraRewardsLength() external view returns (uint256);
function stakingToken() external view returns (address);
function rewardToken() external view returns(address);
function earned(address account) external view returns (uint256);
}
interface IStash{
function stashRewards() external returns (bool);
function processStash() external returns (bool);
function claimRewards() external returns (bool);
function initialize(uint256 _pid, address _operator, address _staker, address _gauge, address _rewardFactory) external;
function setExtraReward(address) external;
}
interface IFeeDistributor {
function claimToken(address user, address token) external returns (uint256);
function claimTokens(address user, address[] calldata tokens) external returns (uint256[] memory);
function getTokenTimeCursor(address token) external view returns (uint256);
}
interface ITokenMinter{
function mint(address,uint256) external;
function burn(address,uint256) external;
}
interface IDeposit{
function isShutdown() external view returns(bool);
function balanceOf(address _account) external view returns(uint256);
function totalSupply() external view returns(uint256);
function poolInfo(uint256) external view returns(address,address,address,address,address, bool);
function rewardClaimed(uint256,address,uint256) external;
function withdrawTo(uint256,uint256,address) external;
function claimRewards(uint256,address) external returns(bool);
function rewardArbitrator() external returns(address);
function setGaugeRedirect(uint256 _pid) external returns(bool);
function owner() external returns(address);
function deposit(uint256 _pid, uint256 _amount, bool _stake) external returns(bool);
}
interface ICrvDeposit{
function deposit(uint256, bool) external;
function lockIncentive() external view returns(uint256);
}
interface IRewardFactory{
function setAccess(address,bool) external;
function CreateCrvRewards(uint256,address,address) external returns(address);
function CreateTokenRewards(address,address,address) external returns(address);
function activeRewardCount(address) external view returns(uint256);
function addActiveReward(address,uint256) external returns(bool);
function removeActiveReward(address,uint256) external returns(bool);
}
interface IStashFactory{
function CreateStash(uint256,address,address,uint256) external returns(address);
function setImplementation(address, address, address) external;
}
interface ITokenFactory{
function CreateDepositToken(address) external returns(address);
}
interface IPools{
function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);
function forceAddPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);
function shutdownPool(uint256 _pid) external returns(bool);
function poolInfo(uint256) external view returns(address,address,address,address,address,bool);
function poolLength() external view returns (uint256);
function gaugeMap(address) external view returns(bool);
function setPoolManager(address _poolM) external;
function shutdownSystem() external;
function setUsedAddress(address[] memory) external;
}
interface IVestedEscrow{
function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);
}
interface IRewardDeposit {
function addReward(address, uint256) external;
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"poolid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rewardFactory","type":"address"},{"indexed":false,"internalType":"address","name":"stashFactory","type":"address"},{"indexed":false,"internalType":"address","name":"tokenFactory","type":"address"}],"name":"FactoriesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newFeeManager","type":"address"}],"name":"FeeManagerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lockIncentive","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakerIncentive","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"earmarkIncentive","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"platformFee","type":"uint256"}],"name":"FeesUpdated","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":"lpToken","type":"address"},{"indexed":false,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"rewardPool","type":"address"},{"indexed":false,"internalType":"address","name":"stash","type":"address"},{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"}],"name":"PoolAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newPoolManager","type":"address"}],"name":"PoolManagerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"PoolShutdown","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rewards","type":"address"}],"name":"RewardContractsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newTreasury","type":"address"}],"name":"TreasuryUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"poolid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lptoken","type":"address"},{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"uint256","name":"_stashVersion","type":"uint256"}],"name":"addPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_gauge","type":"address"}],"name":"claimRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"crv","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_stake","type":"bool"}],"name":"deposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"bool","name":"_stake","type":"bool"}],"name":"depositAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"earmarkIncentive","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_zroPaymentAddress","type":"address"}],"name":"earmarkRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feeManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"gaugeMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"},{"internalType":"address","name":"_crv","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isShutdown","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockIncentive","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"address","name":"lptoken","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"gauge","type":"address"},{"internalType":"address","name":"crvRewards","type":"address"},{"internalType":"address","name":"stash","type":"address"},{"internalType":"bool","name":"shutdown","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rewardClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rfactory","type":"address"},{"internalType":"address","name":"_sfactory","type":"address"},{"internalType":"address","name":"_tfactory","type":"address"}],"name":"setFactories","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeM","type":"address"}],"name":"setFeeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockFees","type":"uint256"},{"internalType":"uint256","name":"_stakerFees","type":"uint256"},{"internalType":"uint256","name":"_callerFees","type":"uint256"},{"internalType":"uint256","name":"_platform","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"setGaugeRedirect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_poolM","type":"address"}],"name":"setPoolManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewards","type":"address"}],"name":"setRewardContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"shutdownPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shutdownSystem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakerIncentive","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stashFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"withdrawAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a06040526103396002556103396003556032600455600060055534801561002657600080fd5b506040516138273803806138278339818101604052602081101561004957600080fd5b505160016000556001600160601b0319606082901b16608052600e805460ff60a01b19169055600680546001600160a01b031990811633908117909255600d8054909116905560408051918252517f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b9181900360200190a15060805160601c61371161011660003980610c155280610dd45280610e4c52806111f952806113b052806115395280611db9528061203d52806122a1528061286f5280612d0a5280612dc652506137116000f3fe6080604052600436106102465760003560e01c80636a4874a1116101395780639123d404116100b6578063cb0d5b521161007a578063cb0d5b521461081d578063d0fb020314610850578063d73792a914610865578063dc4c90d31461087a578063e77772fe1461088f578063f0f44260146108a457610246565b80639123d4041461075a578063958e2d31146107845780639ec5a894146107ae578063bf86d690146107c3578063c0c53b8b146107d857610246565b80637979426b116100fd5780637979426b1461065e5780637aef67151461068a5780637bd3b995146106bd5780637e29d6c2146107025780638da5cb5b1461074557610246565b80636a4874a1146105805780636c7b69cb146105955780636fcba377146105ce57806371192b171461060a5780637303df9a1461064957610246565b80633a088cd2116101c75780635ebaf1db1161018b5780635ebaf1db146104e557806360759fce146104fa57806360cafe841461052c57806361d027b31461055657806362d28ac71461056b57610246565b80633a088cd21461042057806343a0d06614610435578063441a3e701461046d578063472d35b91461049d57806350940618146104d057610246565b80631526fe271161020e5780631526fe27146103405780631cc51d40146103ae578063245e4bf0146103e157806326232a2e146103f6578063354af9191461040b57610246565b8063068eb19e1461024b578063075461721461027c578063081e3eda1461029157806313af4035146102b857806314cd70e4146102ed575b600080fd5b34801561025757600080fd5b506102606108d7565b604080516001600160a01b039092168252519081900360200190f35b34801561028857600080fd5b506102606108e6565b34801561029d57600080fd5b506102a66108f5565b60408051918252519081900360200190f35b3480156102c457600080fd5b506102eb600480360360208110156102db57600080fd5b50356001600160a01b03166108fb565b005b3480156102f957600080fd5b5061032c6004803603606081101561031057600080fd5b50803590602081013590604001356001600160a01b0316610996565b604080519115158252519081900360200190f35b34801561034c57600080fd5b5061036a6004803603602081101561036357600080fd5b5035610a1a565b604080516001600160a01b0397881681529587166020870152938616858501529185166060850152909316608083015291151560a082015290519081900360c00190f35b3480156103ba57600080fd5b506102eb600480360360208110156103d157600080fd5b50356001600160a01b0316610a78565b3480156103ed57600080fd5b50610260610b24565b34801561040257600080fd5b506102a6610b33565b34801561041757600080fd5b506102eb610b39565b34801561042c57600080fd5b506102a6610cb1565b34801561044157600080fd5b5061032c6004803603606081101561045857600080fd5b50803590602081013590604001351515610cb7565b34801561047957600080fd5b5061032c6004803603604081101561049057600080fd5b508035906020013561113e565b3480156104a957600080fd5b506102eb600480360360208110156104c057600080fd5b50356001600160a01b0316611156565b3480156104dc57600080fd5b506102a66111f1565b3480156104f157600080fd5b506102606111f7565b34801561050657600080fd5b5061032c6004803603604081101561051d57600080fd5b5080359060200135151561121b565b34801561053857600080fd5b5061032c6004803603602081101561054f57600080fd5b50356112c8565b34801561056257600080fd5b506102606114a8565b34801561057757600080fd5b506102a66114b7565b34801561058c57600080fd5b506102606114bd565b3480156105a157600080fd5b5061032c600480360360408110156105b857600080fd5b50803590602001356001600160a01b03166114cc565b3480156105da57600080fd5b506102eb600480360360808110156105f157600080fd5b50803590602081013590604081013590606001356115d0565b34801561061657600080fd5b5061032c6004803603606081101561062d57600080fd5b508035906001600160a01b03602082013516906040013561185c565b34801561065557600080fd5b506102a6611945565b61032c6004803603604081101561067457600080fd5b50803590602001356001600160a01b031661194b565b34801561069657600080fd5b506102eb600480360360208110156106ad57600080fd5b50356001600160a01b03166119f9565b3480156106c957600080fd5b506102eb600480360360608110156106e057600080fd5b506001600160a01b038135811691602081013582169160409091013516611a94565b34801561070e57600080fd5b5061032c6004803603606081101561072557600080fd5b506001600160a01b03813581169160208101359091169060400135611bc4565b34801561075157600080fd5b5061026061218c565b34801561076657600080fd5b5061032c6004803603602081101561077d57600080fd5b503561219b565b34801561079057600080fd5b5061032c600480360360208110156107a757600080fd5b5035612444565b3480156107ba57600080fd5b506102606124f3565b3480156107cf57600080fd5b5061032c612502565b3480156107e457600080fd5b506102eb600480360360608110156107fb57600080fd5b506001600160a01b038135811691602081013582169160409091013516612512565b34801561082957600080fd5b5061032c6004803603602081101561084057600080fd5b50356001600160a01b0316612691565b34801561085c57600080fd5b506102606126a6565b34801561087157600080fd5b506102a66126b5565b34801561088657600080fd5b506102606126bb565b34801561089b57600080fd5b506102606126ca565b3480156108b057600080fd5b506102eb600480360360208110156108c757600080fd5b50356001600160a01b03166126d9565b600b546001600160a01b031681565b6009546001600160a01b031681565b600f5490565b6006546001600160a01b03163314610942576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600680546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b9181900360200190a150565b600080600f85815481106109a657fe5b60009182526020909120600360059092020101546001600160a01b03169050338114610a01576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610a0d85853386612774565b60019150505b9392505050565b600f8181548110610a2757fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b03938416955091831693908316929081169190811690600160a01b900460ff1686565b6006546001600160a01b03163314610abf576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600e546001600160a01b0316610b2157600e80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fdcf314452b77e67d7e1752b1e7b47ce7819785996d300352a78b81d1a7df53c39181900360200190a15b50565b600a546001600160a01b031681565b60055481565b6006546001600160a01b03163314610b80576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600e805460ff60a01b1916600160a01b17905560005b600f54811015610b21576000600f8281548110610baf57fe5b906000526020600020906005020190508060040160149054906101000a900460ff1615610bdc5750610ca9565b80546002820154604080516301395c5960e31b81526001600160a01b0393841660048201819052928416602482018190529151929391927f0000000000000000000000000000000000000000000000000000000000000000909216916309cae2c8916044808201926020929091908290030181600087803b158015610c6057600080fd5b505af1925050508015610c8557506040513d6020811015610c8057600080fd5b505160015b610c8e57610ca5565b5060048301805460ff60a01b1916600160a01b1790555b5050505b600101610b96565b60045481565b600060026000541415610cff576040805162461bcd60e51b815260206004820152601f6024820152600080516020613615833981519152604482015290519081900360640190fd5b6002600055600e54600160a01b900460ff1615610d4e576040805162461bcd60e51b815260206004820152600860248201526739b43aba3237bbb760c11b604482015290519081900360640190fd5b6000600f8581548110610d5d57fe5b600091825260209091206005909102016004810154909150600160a01b900460ff1615610dc2576040805162461bcd60e51b815260206004820152600e60248201526d1c1bdbdb081a5cc818db1bdcd95960921b604482015290519081900360640190fd5b80546001600160a01b0316610df981337f000000000000000000000000000000000000000000000000000000000000000088612a32565b60028201546001600160a01b031680610e4a576040805162461bcd60e51b815260206004820152600e60248201526d2167617567652073657474696e6760901b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f9609f0883836040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b158015610eca57600080fd5b505af1158015610ede573d6000803e3d6000fd5b505050506040513d6020811015610ef457600080fd5b505060048301546001600160a01b03168015610f7257806001600160a01b031663b87bd4816040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f4557600080fd5b505af1158015610f59573d6000803e3d6000fd5b505050506040513d6020811015610f6f57600080fd5b50505b60018401546001600160a01b0316861561108b57604080516340c10f1960e01b8152306004820152602481018a905290516001600160a01b038316916340c10f1991604480830192600092919082900301818387803b158015610fd457600080fd5b505af1158015610fe8573d6000803e3d6000fd5b50505060038601546001600160a01b03908116915061100b908316826000612a92565b61101f6001600160a01b038316828b612a92565b604080516305dc812160e31b8152336004820152602481018b905290516001600160a01b03831691632ee4090891604480830192600092919082900301818387803b15801561106d57600080fd5b505af1158015611081573d6000803e3d6000fd5b50505050506110f2565b604080516340c10f1960e01b8152336004820152602481018a905290516001600160a01b038316916340c10f1991604480830192600092919082900301818387803b1580156110d957600080fd5b505af11580156110ed573d6000803e3d6000fd5b505050505b6040805189815290518a9133917f73a19dd210f1a7f902193214c0ee91dd35ee5b4d920cba8d519eca65a7b488ca9181900360200190a360019550505050505060016000559392505050565b600061114c83833333612774565b5060015b92915050565b6006546001600160a01b0316331461119d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600780546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fe45f5e140399b0a7e12971ab020724b828fbed8ac408c420884dc7d1bbe506b49181900360200190a150565b60025481565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600f848154811061122b57fe5b60009182526020808320600590920290910154604080516370a0823160e01b815233600482015290516001600160a01b03909216945084926370a0823192602480840193829003018186803b15801561128357600080fd5b505afa158015611297573d6000803e3d6000fd5b505050506040513d60208110156112ad57600080fd5b505190506112bc858286610cb7565b50600195945050505050565b600060026000541415611310576040805162461bcd60e51b815260206004820152601f6024820152600080516020613615833981519152604482015290519081900360640190fd5b60026000556008546001600160a01b0316331461135c576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6000600f838154811061136b57fe5b60009182526020808320600590920290910180546002820154604080516301395c5960e31b81526001600160a01b0393841660048201529183166024830152519295507f000000000000000000000000000000000000000000000000000000000000000091909116936309cae2c89360448084019491939192918390030190829087803b1580156113fb57600080fd5b505af192505050801561142057506040513d602081101561141b57600080fd5b505160015b6114295761142b565b505b60048101805460ff60a01b1916600160a01b17905560028101546001600160a01b0316600090815260106020908152604091829020805460ff19169055815185815291517f2ccd633716c6ce12394d1c984ad04b6173d18aedc4f505d1537a94a98a07b6e79281900390910190a160019150506001600055919050565b600d546001600160a01b031681565b60035481565b6001546001600160a01b031681565b600080600f84815481106114dc57fe5b60009182526020909120600460059092020101546001600160a01b03169050338114611537576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ef5cfb8c846040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b1580156115a657600080fd5b505af11580156115ba573d6000803e3d6000fd5b505050506040513d60208110156112bc57600080fd5b60026000541415611616576040805162461bcd60e51b815260206004820152601f6024820152600080516020613615833981519152604482015290519081900360640190fd5b60026000556007546001600160a01b03163314611662576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600061167a8261167485818989612ba5565b90612ba5565b9050610fa08111156116be576040805162461bcd60e51b81526020600482015260086024820152673e4d61784665657360c01b604482015290519081900360640190fd5b61012c85101580156116d25750610dac8511155b61170f576040805162461bcd60e51b8152602060048201526009602482015268216c6f636b4665657360b81b604482015290519081900360640190fd5b61012c841015801561172357506105dc8411155b611762576040805162461bcd60e51b815260206004820152600b60248201526a217374616b65724665657360a81b604482015290519081900360640190fd5b600a8310158015611774575060648311155b6117b3576040805162461bcd60e51b815260206004820152600b60248201526a2163616c6c65724665657360a81b604482015290519081900360640190fd5b60c88211156117f5576040805162461bcd60e51b815260206004820152600960248201526821706c6174666f726d60b81b604482015290519081900360640190fd5b600285905560038490556004839055600582905560408051868152602081018690528082018590526060810184905290517f16e6f67290546b8dd0e587f4b7f67d4f61932ae17ffd8c60d3509dbc05c175fe9181900360800190a150506001600055505050565b600080600f858154811061186c57fe5b60009182526020909120600360059092020101546001600160a01b031690503381146118c7576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b8215610a0d57600954604080516340c10f1960e01b81526001600160a01b03878116600483015260248201879052915191909216916340c10f1991604480830192600092919082900301818387803b15801561192257600080fd5b505af1158015611936573d6000803e3d6000fd5b50600198975050505050505050565b610fa081565b600060026000541415611993576040805162461bcd60e51b815260206004820152601f6024820152600080516020613615833981519152604482015290519081900360640190fd5b6002600055600e54600160a01b900460ff16156119e2576040805162461bcd60e51b815260206004820152600860248201526739b43aba3237bbb760c11b604482015290519081900360640190fd5b6119ec8383612bff565b5060018060005592915050565b6008546001600160a01b03163314611a40576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600880546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f70a64736553c84939f57deec269299882abbbee8dc4f316eccbc6fce57e4d3cf9181900360200190a150565b6006546001600160a01b03163314611adb576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600b80546001600160a01b0319166001600160a01b0384811691909117909155600a5416611b7657600a80546001600160a01b038086166001600160a01b03199283168117909355600c805485831693168317905560408051938452908516602084015282810191909152517f013ea07699fbd5315b997a706906fb94a81c616771f1052b406707d7bfc6aa279181900360600190a1611bbf565b6040805160008082526001600160a01b03851660208301528183015290517f013ea07699fbd5315b997a706906fb94a81c616771f1052b406707d7bfc6aa279181900360600190a15b505050565b6008546000906001600160a01b031633148015611beb5750600e54600160a01b900460ff16155b611c25576040805162461bcd60e51b815260206004808301919091526024820152630858591960e21b604482015290519081900360640190fd5b6001600160a01b03831615801590611c4557506001600160a01b03841615155b611c7f576040805162461bcd60e51b815260206004820152600660248201526521706172616d60d01b604482015290519081900360640190fd5b600f54600c5460408051630452a26760e21b81526001600160a01b0388811660048301529151600093929092169163114a899c9160248082019260209290919082900301818787803b158015611cd457600080fd5b505af1158015611ce8573d6000803e3d6000fd5b505050506040513d6020811015611cfe57600080fd5b5051600a5460408051632f7260f160e01b8152600481018690526001600160a01b0380851660248301528a8116604483015291519394506000939190921691632f7260f191606480830192602092919082900301818787803b158015611d6357600080fd5b505af1158015611d77573d6000803e3d6000fd5b505050506040513d6020811015611d8d57600080fd5b5051600b5460408051634ce5896f60e11b8152600481018790526001600160a01b038a811660248301527f000000000000000000000000000000000000000000000000000000000000000081166044830152606482018a9052915193945060009391909216916399cb12de91608480830192602092919082900301818787803b158015611e1957600080fd5b505af1158015611e2d573d6000803e3d6000fd5b505050506040513d6020811015611e4357600080fd5b50516040805160c0810182526001600160a01b03808c16825286811660208381019182528c83168486018181528985166060870190815285891660808801818152600060a08a01818152600f8054600181810183559184529b516005909c027f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802810180549d8d166001600160a01b03199e8f1617905599517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8038b018054918d16918e1691909117905595517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8048a018054918c16918d1691909117905593517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80589018054918b16918c1691909117905590517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac806909701805493511515600160a01b0260ff60a01b199890991693909916929092179590951695909517909555835260109052929020805460ff191690911790559091501561211c5780600f8581548110611feb57fe5b600091825260208083206004600590930201820180546001600160a01b039586166001600160a01b031990911617905560408051637d1cb25960e11b81528686169381019390935260016024840152517f00000000000000000000000000000000000000000000000000000000000000009094169363fa3964b2936044808501948390030190829087803b15801561208257600080fd5b505af1158015612096573d6000803e3d6000fd5b505050506040513d60208110156120ac57600080fd5b5050600a546040805163b84614a560e01b81526001600160a01b038481166004830152600160248301529151919092169163b84614a591604480830192600092919082900301818387803b15801561210357600080fd5b505af1158015612117573d6000803e3d6000fd5b505050505b604080516001600160a01b03808b168252808a1660208301528086168284015280851660608301528316608082015260a0810186905290517fca1a6de26e4422518df9ab614eefa07fac43e4f4c7d704dbf82e903e582659ca9181900360c00190a1506001979650505050505050565b6006546001600160a01b031681565b600080600f83815481106121ab57fe5b60009182526020909120600460059092020101546001600160a01b03169050338114612206576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6000600f848154811061221557fe5b6000918252602080832060026005909302019190910154604080516001600160a01b038781166024808401919091528351808403820181526044938401855295860180516001600160e01b0316635efcc08b60e11b1781529351635b0e93fb60e11b815294821660048601818152918601889052606093860193845286516064870152865190985095967f00000000000000000000000000000000000000000000000000000000000000009092169563b61d27f6958995939489949092608490920191808383895b838110156122f55781810151838201526020016122dd565b50505050905090810190601f1680156123225780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561234357600080fd5b505af1158015612357573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561238057600080fd5b8151602083018051604051929492938301929190846401000000008211156123a757600080fd5b9083019060208201858111156123bc57600080fd5b82516401000000008111828201881017156123d657600080fd5b82525081516020918201929091019080838360005b838110156124035781810151838201526020016123eb565b50505050905090810190601f1680156124305780820380516001836020036101000a031916815260200191505b506040525060019998505050505050505050565b600080600f838154811061245457fe5b6000918252602080832060016005909302019190910154604080516370a0823160e01b815233600482015290516001600160a01b03909216945084926370a0823192602480840193829003018186803b1580156124b057600080fd5b505afa1580156124c4573d6000803e3d6000fd5b505050506040513d60208110156124da57600080fd5b505190506124e8848261113e565b506001949350505050565b600e546001600160a01b031681565b600e54600160a01b900460ff1681565b6006546001600160a01b03163314612559576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001546001600160a01b0316156125a3576040805162461bcd60e51b81526020600482015260096024820152684f6e6c79206f6e636560b81b604482015290519081900360640190fd5b600980546001600160a01b038086166001600160a01b031992831617909255600180548584169083161790556006805492841692821683179055600780548216831790556008805490911690911790556040805133815290517f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b9181900360200190a16040805133815290517fe45f5e140399b0a7e12971ab020724b828fbed8ac408c420884dc7d1bbe506b49181900360200190a16040805133815290517f70a64736553c84939f57deec269299882abbbee8dc4f316eccbc6fce57e4d3cf9181900360200190a1505050565b60106020526000908152604090205460ff1681565b6007546001600160a01b031681565b61271081565b6008546001600160a01b031681565b600c546001600160a01b031681565b6007546001600160a01b03163314612720576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600d80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f7dae230f18360d76a040c81f050aa14eb9d6dc7901b20fc5d855e2a20fe814d19181900360200190a150565b600260005414156127ba576040805162461bcd60e51b815260206004820152601f6024820152600080516020613615833981519152604482015290519081900360640190fd5b60026000908155600f8054869081106127cf57fe5b60009182526020822060059091020180546002820154600183015460408051632770a7eb60e21b81526001600160a01b038a81166004830152602482018c9052915195975093811695928116949116928392639dc29fac9260448084019382900301818387803b15801561284257600080fd5b505af1158015612856573d6000803e3d6000fd5b505050506004840154600160a01b900460ff16612922577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d9caed1284848a6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050602060405180830381600087803b1580156128f557600080fd5b505af1158015612909573d6000803e3d6000fd5b505050506040513d602081101561291f57600080fd5b50505b60048401546001600160a01b031680158015906129495750600e54600160a01b900460ff16155b801561296157506004850154600160a01b900460ff16155b156129ce57806001600160a01b031663b87bd4816040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156129a157600080fd5b505af11580156129b5573d6000803e3d6000fd5b505050506040513d60208110156129cb57600080fd5b50505b6129e26001600160a01b038516878a6131db565b6040805189815290518a916001600160a01b038916917f92ccf450a286a957af52509bc1c9939d1a6a481783e142e41e2499f0bb66ebc69181900360200190a35050600160005550505050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612a8c908590613229565b50505050565b801580612b18575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015612aea57600080fd5b505afa158015612afe573d6000803e3d6000fd5b505050506040513d6020811015612b1457600080fd5b5051155b612b535760405162461bcd60e51b81526004018080602001828103825260368152602001806136a66036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052611bbf908490613229565b600082820183811015610a13576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000600f8381548110612c0e57fe5b600091825260209091206005909102016004810154909150600160a01b900460ff1615612c73576040805162461bcd60e51b815260206004820152600e60248201526d1c1bdbdb081a5cc818db1bdcd95960921b604482015290519081900360640190fd5b600154604080516370a0823160e01b8152306004820152905160009283926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b158015612cc357600080fd5b505afa158015612cd7573d6000803e3d6000fd5b505050506040513d6020811015612ced57600080fd5b5051600154604080516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152915193945060009391909216916370a08231916024808301926020929190829003018186803b158015612d6257600080fd5b505afa158015612d76573d6000803e3d6000fd5b505050506040513d6020811015612d8c57600080fd5b505190506000612d9c8383612ba5565b600286015460408051631ff4de0360e11b81526001600160a01b03928316600482015290519293507f000000000000000000000000000000000000000000000000000000000000000090911691633fe9bc06916024808201926020929091908290030181600087803b158015612e1157600080fd5b505af1158015612e25573d6000803e3d6000fd5b505050506040513d6020811015612e3b57600080fd5b5050600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612e8857600080fd5b505afa158015612e9c573d6000803e3d6000fd5b505050506040513d6020811015612eb257600080fd5b50519050612ec081836132da565b9450600082118015612edc5750600d546001600160a01b031615155b15612efe57600d54600154612efe916001600160a01b039182169116846131db565b5050505060048201546001600160a01b03168015612fec57806001600160a01b031663372500ab6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612f5157600080fd5b505af1158015612f65573d6000803e3d6000fd5b505050506040513d6020811015612f7b57600080fd5b50506040805163654580bb60e11b815290516001600160a01b0383169163ca8b01769160048083019260209291908290030181600087803b158015612fbf57600080fd5b505af1158015612fd3573d6000803e3d6000fd5b505050506040513d6020811015612fe957600080fd5b50505b81156131d457600061301561271061300f6002548661333790919063ffffffff16565b90613390565b9050600061303461271061300f6003548761333790919063ffffffff16565b9050600061305361271061300f6004548861333790919063ffffffff16565b9050600061307261271061300f6005548961333790919063ffffffff16565b90506000613084826116748787612ba5565b905061309a8361309489846132da565b906132da565b6001549097506130b4906001600160a01b031633856131db565b60038801546001546001600160a01b03918216916130d49116828a6131db565b806001600160a01b031663590a41f5896040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561311a57600080fd5b505af115801561312e573d6000803e3d6000fd5b5050600e5460015461314f93506001600160a01b03908116925016846131db565b600e546040805163d288227360e01b815233600482015260248101859052604481018b90526001600160a01b038d811660648301529151919092169163d288227391349160848082019260009290919082900301818588803b1580156131b457600080fd5b505af11580156131c8573d6000803e3d6000fd5b50505050505050505050505b5050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611bbf9084905b606061327e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166133f79092919063ffffffff16565b805190915015611bbf5780806020019051602081101561329d57600080fd5b5051611bbf5760405162461bcd60e51b815260040180806020018281038252602a81526020018061367c602a913960400191505060405180910390fd5b600082821115613331576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008261334657506000611150565b8282028284828161335357fe5b0414610a135760405162461bcd60e51b815260040180806020018281038252602181526020018061365b6021913960400191505060405180910390fd5b60008082116133e6576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816133ef57fe5b049392505050565b6060613406848460008561340e565b949350505050565b60608247101561344f5760405162461bcd60e51b81526004018080602001828103825260268152602001806136356026913960400191505060405180910390fd5b6134588561356a565b6134a9576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106134e85780518252601f1990920191602091820191016134c9565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461354a576040519150601f19603f3d011682016040523d82523d6000602084013e61354f565b606091505b509150915061355f828286613570565b979650505050505050565b3b151590565b6060831561357f575081610a13565b82511561358f5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156135d95781810151838201526020016135c1565b50505050905090810190601f1680156136065780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe5265656e7472616e637947756172643a207265656e7472616e742063616c6c00416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a264697066735822122073195a7ec07ff9bb53a3f7360471631febb71777b1e718191199665b1b72081e64736f6c634300060c0033000000000000000000000000c181edc719480bd089b94647c2dc504e2700a2b0
Deployed Bytecode
0x6080604052600436106102465760003560e01c80636a4874a1116101395780639123d404116100b6578063cb0d5b521161007a578063cb0d5b521461081d578063d0fb020314610850578063d73792a914610865578063dc4c90d31461087a578063e77772fe1461088f578063f0f44260146108a457610246565b80639123d4041461075a578063958e2d31146107845780639ec5a894146107ae578063bf86d690146107c3578063c0c53b8b146107d857610246565b80637979426b116100fd5780637979426b1461065e5780637aef67151461068a5780637bd3b995146106bd5780637e29d6c2146107025780638da5cb5b1461074557610246565b80636a4874a1146105805780636c7b69cb146105955780636fcba377146105ce57806371192b171461060a5780637303df9a1461064957610246565b80633a088cd2116101c75780635ebaf1db1161018b5780635ebaf1db146104e557806360759fce146104fa57806360cafe841461052c57806361d027b31461055657806362d28ac71461056b57610246565b80633a088cd21461042057806343a0d06614610435578063441a3e701461046d578063472d35b91461049d57806350940618146104d057610246565b80631526fe271161020e5780631526fe27146103405780631cc51d40146103ae578063245e4bf0146103e157806326232a2e146103f6578063354af9191461040b57610246565b8063068eb19e1461024b578063075461721461027c578063081e3eda1461029157806313af4035146102b857806314cd70e4146102ed575b600080fd5b34801561025757600080fd5b506102606108d7565b604080516001600160a01b039092168252519081900360200190f35b34801561028857600080fd5b506102606108e6565b34801561029d57600080fd5b506102a66108f5565b60408051918252519081900360200190f35b3480156102c457600080fd5b506102eb600480360360208110156102db57600080fd5b50356001600160a01b03166108fb565b005b3480156102f957600080fd5b5061032c6004803603606081101561031057600080fd5b50803590602081013590604001356001600160a01b0316610996565b604080519115158252519081900360200190f35b34801561034c57600080fd5b5061036a6004803603602081101561036357600080fd5b5035610a1a565b604080516001600160a01b0397881681529587166020870152938616858501529185166060850152909316608083015291151560a082015290519081900360c00190f35b3480156103ba57600080fd5b506102eb600480360360208110156103d157600080fd5b50356001600160a01b0316610a78565b3480156103ed57600080fd5b50610260610b24565b34801561040257600080fd5b506102a6610b33565b34801561041757600080fd5b506102eb610b39565b34801561042c57600080fd5b506102a6610cb1565b34801561044157600080fd5b5061032c6004803603606081101561045857600080fd5b50803590602081013590604001351515610cb7565b34801561047957600080fd5b5061032c6004803603604081101561049057600080fd5b508035906020013561113e565b3480156104a957600080fd5b506102eb600480360360208110156104c057600080fd5b50356001600160a01b0316611156565b3480156104dc57600080fd5b506102a66111f1565b3480156104f157600080fd5b506102606111f7565b34801561050657600080fd5b5061032c6004803603604081101561051d57600080fd5b5080359060200135151561121b565b34801561053857600080fd5b5061032c6004803603602081101561054f57600080fd5b50356112c8565b34801561056257600080fd5b506102606114a8565b34801561057757600080fd5b506102a66114b7565b34801561058c57600080fd5b506102606114bd565b3480156105a157600080fd5b5061032c600480360360408110156105b857600080fd5b50803590602001356001600160a01b03166114cc565b3480156105da57600080fd5b506102eb600480360360808110156105f157600080fd5b50803590602081013590604081013590606001356115d0565b34801561061657600080fd5b5061032c6004803603606081101561062d57600080fd5b508035906001600160a01b03602082013516906040013561185c565b34801561065557600080fd5b506102a6611945565b61032c6004803603604081101561067457600080fd5b50803590602001356001600160a01b031661194b565b34801561069657600080fd5b506102eb600480360360208110156106ad57600080fd5b50356001600160a01b03166119f9565b3480156106c957600080fd5b506102eb600480360360608110156106e057600080fd5b506001600160a01b038135811691602081013582169160409091013516611a94565b34801561070e57600080fd5b5061032c6004803603606081101561072557600080fd5b506001600160a01b03813581169160208101359091169060400135611bc4565b34801561075157600080fd5b5061026061218c565b34801561076657600080fd5b5061032c6004803603602081101561077d57600080fd5b503561219b565b34801561079057600080fd5b5061032c600480360360208110156107a757600080fd5b5035612444565b3480156107ba57600080fd5b506102606124f3565b3480156107cf57600080fd5b5061032c612502565b3480156107e457600080fd5b506102eb600480360360608110156107fb57600080fd5b506001600160a01b038135811691602081013582169160409091013516612512565b34801561082957600080fd5b5061032c6004803603602081101561084057600080fd5b50356001600160a01b0316612691565b34801561085c57600080fd5b506102606126a6565b34801561087157600080fd5b506102a66126b5565b34801561088657600080fd5b506102606126bb565b34801561089b57600080fd5b506102606126ca565b3480156108b057600080fd5b506102eb600480360360208110156108c757600080fd5b50356001600160a01b03166126d9565b600b546001600160a01b031681565b6009546001600160a01b031681565b600f5490565b6006546001600160a01b03163314610942576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600680546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b9181900360200190a150565b600080600f85815481106109a657fe5b60009182526020909120600360059092020101546001600160a01b03169050338114610a01576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610a0d85853386612774565b60019150505b9392505050565b600f8181548110610a2757fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b03938416955091831693908316929081169190811690600160a01b900460ff1686565b6006546001600160a01b03163314610abf576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600e546001600160a01b0316610b2157600e80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fdcf314452b77e67d7e1752b1e7b47ce7819785996d300352a78b81d1a7df53c39181900360200190a15b50565b600a546001600160a01b031681565b60055481565b6006546001600160a01b03163314610b80576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600e805460ff60a01b1916600160a01b17905560005b600f54811015610b21576000600f8281548110610baf57fe5b906000526020600020906005020190508060040160149054906101000a900460ff1615610bdc5750610ca9565b80546002820154604080516301395c5960e31b81526001600160a01b0393841660048201819052928416602482018190529151929391927f000000000000000000000000c181edc719480bd089b94647c2dc504e2700a2b0909216916309cae2c8916044808201926020929091908290030181600087803b158015610c6057600080fd5b505af1925050508015610c8557506040513d6020811015610c8057600080fd5b505160015b610c8e57610ca5565b5060048301805460ff60a01b1916600160a01b1790555b5050505b600101610b96565b60045481565b600060026000541415610cff576040805162461bcd60e51b815260206004820152601f6024820152600080516020613615833981519152604482015290519081900360640190fd5b6002600055600e54600160a01b900460ff1615610d4e576040805162461bcd60e51b815260206004820152600860248201526739b43aba3237bbb760c11b604482015290519081900360640190fd5b6000600f8581548110610d5d57fe5b600091825260209091206005909102016004810154909150600160a01b900460ff1615610dc2576040805162461bcd60e51b815260206004820152600e60248201526d1c1bdbdb081a5cc818db1bdcd95960921b604482015290519081900360640190fd5b80546001600160a01b0316610df981337f000000000000000000000000c181edc719480bd089b94647c2dc504e2700a2b088612a32565b60028201546001600160a01b031680610e4a576040805162461bcd60e51b815260206004820152600e60248201526d2167617567652073657474696e6760901b604482015290519081900360640190fd5b7f000000000000000000000000c181edc719480bd089b94647c2dc504e2700a2b06001600160a01b031663f9609f0883836040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b158015610eca57600080fd5b505af1158015610ede573d6000803e3d6000fd5b505050506040513d6020811015610ef457600080fd5b505060048301546001600160a01b03168015610f7257806001600160a01b031663b87bd4816040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f4557600080fd5b505af1158015610f59573d6000803e3d6000fd5b505050506040513d6020811015610f6f57600080fd5b50505b60018401546001600160a01b0316861561108b57604080516340c10f1960e01b8152306004820152602481018a905290516001600160a01b038316916340c10f1991604480830192600092919082900301818387803b158015610fd457600080fd5b505af1158015610fe8573d6000803e3d6000fd5b50505060038601546001600160a01b03908116915061100b908316826000612a92565b61101f6001600160a01b038316828b612a92565b604080516305dc812160e31b8152336004820152602481018b905290516001600160a01b03831691632ee4090891604480830192600092919082900301818387803b15801561106d57600080fd5b505af1158015611081573d6000803e3d6000fd5b50505050506110f2565b604080516340c10f1960e01b8152336004820152602481018a905290516001600160a01b038316916340c10f1991604480830192600092919082900301818387803b1580156110d957600080fd5b505af11580156110ed573d6000803e3d6000fd5b505050505b6040805189815290518a9133917f73a19dd210f1a7f902193214c0ee91dd35ee5b4d920cba8d519eca65a7b488ca9181900360200190a360019550505050505060016000559392505050565b600061114c83833333612774565b5060015b92915050565b6006546001600160a01b0316331461119d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600780546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fe45f5e140399b0a7e12971ab020724b828fbed8ac408c420884dc7d1bbe506b49181900360200190a150565b60025481565b7f000000000000000000000000c181edc719480bd089b94647c2dc504e2700a2b081565b600080600f848154811061122b57fe5b60009182526020808320600590920290910154604080516370a0823160e01b815233600482015290516001600160a01b03909216945084926370a0823192602480840193829003018186803b15801561128357600080fd5b505afa158015611297573d6000803e3d6000fd5b505050506040513d60208110156112ad57600080fd5b505190506112bc858286610cb7565b50600195945050505050565b600060026000541415611310576040805162461bcd60e51b815260206004820152601f6024820152600080516020613615833981519152604482015290519081900360640190fd5b60026000556008546001600160a01b0316331461135c576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6000600f838154811061136b57fe5b60009182526020808320600590920290910180546002820154604080516301395c5960e31b81526001600160a01b0393841660048201529183166024830152519295507f000000000000000000000000c181edc719480bd089b94647c2dc504e2700a2b091909116936309cae2c89360448084019491939192918390030190829087803b1580156113fb57600080fd5b505af192505050801561142057506040513d602081101561141b57600080fd5b505160015b6114295761142b565b505b60048101805460ff60a01b1916600160a01b17905560028101546001600160a01b0316600090815260106020908152604091829020805460ff19169055815185815291517f2ccd633716c6ce12394d1c984ad04b6173d18aedc4f505d1537a94a98a07b6e79281900390910190a160019150506001600055919050565b600d546001600160a01b031681565b60035481565b6001546001600160a01b031681565b600080600f84815481106114dc57fe5b60009182526020909120600460059092020101546001600160a01b03169050338114611537576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b7f000000000000000000000000c181edc719480bd089b94647c2dc504e2700a2b06001600160a01b031663ef5cfb8c846040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b1580156115a657600080fd5b505af11580156115ba573d6000803e3d6000fd5b505050506040513d60208110156112bc57600080fd5b60026000541415611616576040805162461bcd60e51b815260206004820152601f6024820152600080516020613615833981519152604482015290519081900360640190fd5b60026000556007546001600160a01b03163314611662576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600061167a8261167485818989612ba5565b90612ba5565b9050610fa08111156116be576040805162461bcd60e51b81526020600482015260086024820152673e4d61784665657360c01b604482015290519081900360640190fd5b61012c85101580156116d25750610dac8511155b61170f576040805162461bcd60e51b8152602060048201526009602482015268216c6f636b4665657360b81b604482015290519081900360640190fd5b61012c841015801561172357506105dc8411155b611762576040805162461bcd60e51b815260206004820152600b60248201526a217374616b65724665657360a81b604482015290519081900360640190fd5b600a8310158015611774575060648311155b6117b3576040805162461bcd60e51b815260206004820152600b60248201526a2163616c6c65724665657360a81b604482015290519081900360640190fd5b60c88211156117f5576040805162461bcd60e51b815260206004820152600960248201526821706c6174666f726d60b81b604482015290519081900360640190fd5b600285905560038490556004839055600582905560408051868152602081018690528082018590526060810184905290517f16e6f67290546b8dd0e587f4b7f67d4f61932ae17ffd8c60d3509dbc05c175fe9181900360800190a150506001600055505050565b600080600f858154811061186c57fe5b60009182526020909120600360059092020101546001600160a01b031690503381146118c7576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b8215610a0d57600954604080516340c10f1960e01b81526001600160a01b03878116600483015260248201879052915191909216916340c10f1991604480830192600092919082900301818387803b15801561192257600080fd5b505af1158015611936573d6000803e3d6000fd5b50600198975050505050505050565b610fa081565b600060026000541415611993576040805162461bcd60e51b815260206004820152601f6024820152600080516020613615833981519152604482015290519081900360640190fd5b6002600055600e54600160a01b900460ff16156119e2576040805162461bcd60e51b815260206004820152600860248201526739b43aba3237bbb760c11b604482015290519081900360640190fd5b6119ec8383612bff565b5060018060005592915050565b6008546001600160a01b03163314611a40576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600880546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f70a64736553c84939f57deec269299882abbbee8dc4f316eccbc6fce57e4d3cf9181900360200190a150565b6006546001600160a01b03163314611adb576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600b80546001600160a01b0319166001600160a01b0384811691909117909155600a5416611b7657600a80546001600160a01b038086166001600160a01b03199283168117909355600c805485831693168317905560408051938452908516602084015282810191909152517f013ea07699fbd5315b997a706906fb94a81c616771f1052b406707d7bfc6aa279181900360600190a1611bbf565b6040805160008082526001600160a01b03851660208301528183015290517f013ea07699fbd5315b997a706906fb94a81c616771f1052b406707d7bfc6aa279181900360600190a15b505050565b6008546000906001600160a01b031633148015611beb5750600e54600160a01b900460ff16155b611c25576040805162461bcd60e51b815260206004808301919091526024820152630858591960e21b604482015290519081900360640190fd5b6001600160a01b03831615801590611c4557506001600160a01b03841615155b611c7f576040805162461bcd60e51b815260206004820152600660248201526521706172616d60d01b604482015290519081900360640190fd5b600f54600c5460408051630452a26760e21b81526001600160a01b0388811660048301529151600093929092169163114a899c9160248082019260209290919082900301818787803b158015611cd457600080fd5b505af1158015611ce8573d6000803e3d6000fd5b505050506040513d6020811015611cfe57600080fd5b5051600a5460408051632f7260f160e01b8152600481018690526001600160a01b0380851660248301528a8116604483015291519394506000939190921691632f7260f191606480830192602092919082900301818787803b158015611d6357600080fd5b505af1158015611d77573d6000803e3d6000fd5b505050506040513d6020811015611d8d57600080fd5b5051600b5460408051634ce5896f60e11b8152600481018790526001600160a01b038a811660248301527f000000000000000000000000c181edc719480bd089b94647c2dc504e2700a2b081166044830152606482018a9052915193945060009391909216916399cb12de91608480830192602092919082900301818787803b158015611e1957600080fd5b505af1158015611e2d573d6000803e3d6000fd5b505050506040513d6020811015611e4357600080fd5b50516040805160c0810182526001600160a01b03808c16825286811660208381019182528c83168486018181528985166060870190815285891660808801818152600060a08a01818152600f8054600181810183559184529b516005909c027f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802810180549d8d166001600160a01b03199e8f1617905599517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8038b018054918d16918e1691909117905595517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8048a018054918c16918d1691909117905593517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80589018054918b16918c1691909117905590517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac806909701805493511515600160a01b0260ff60a01b199890991693909916929092179590951695909517909555835260109052929020805460ff191690911790559091501561211c5780600f8581548110611feb57fe5b600091825260208083206004600590930201820180546001600160a01b039586166001600160a01b031990911617905560408051637d1cb25960e11b81528686169381019390935260016024840152517f000000000000000000000000c181edc719480bd089b94647c2dc504e2700a2b09094169363fa3964b2936044808501948390030190829087803b15801561208257600080fd5b505af1158015612096573d6000803e3d6000fd5b505050506040513d60208110156120ac57600080fd5b5050600a546040805163b84614a560e01b81526001600160a01b038481166004830152600160248301529151919092169163b84614a591604480830192600092919082900301818387803b15801561210357600080fd5b505af1158015612117573d6000803e3d6000fd5b505050505b604080516001600160a01b03808b168252808a1660208301528086168284015280851660608301528316608082015260a0810186905290517fca1a6de26e4422518df9ab614eefa07fac43e4f4c7d704dbf82e903e582659ca9181900360c00190a1506001979650505050505050565b6006546001600160a01b031681565b600080600f83815481106121ab57fe5b60009182526020909120600460059092020101546001600160a01b03169050338114612206576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6000600f848154811061221557fe5b6000918252602080832060026005909302019190910154604080516001600160a01b038781166024808401919091528351808403820181526044938401855295860180516001600160e01b0316635efcc08b60e11b1781529351635b0e93fb60e11b815294821660048601818152918601889052606093860193845286516064870152865190985095967f000000000000000000000000c181edc719480bd089b94647c2dc504e2700a2b09092169563b61d27f6958995939489949092608490920191808383895b838110156122f55781810151838201526020016122dd565b50505050905090810190601f1680156123225780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561234357600080fd5b505af1158015612357573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561238057600080fd5b8151602083018051604051929492938301929190846401000000008211156123a757600080fd5b9083019060208201858111156123bc57600080fd5b82516401000000008111828201881017156123d657600080fd5b82525081516020918201929091019080838360005b838110156124035781810151838201526020016123eb565b50505050905090810190601f1680156124305780820380516001836020036101000a031916815260200191505b506040525060019998505050505050505050565b600080600f838154811061245457fe5b6000918252602080832060016005909302019190910154604080516370a0823160e01b815233600482015290516001600160a01b03909216945084926370a0823192602480840193829003018186803b1580156124b057600080fd5b505afa1580156124c4573d6000803e3d6000fd5b505050506040513d60208110156124da57600080fd5b505190506124e8848261113e565b506001949350505050565b600e546001600160a01b031681565b600e54600160a01b900460ff1681565b6006546001600160a01b03163314612559576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001546001600160a01b0316156125a3576040805162461bcd60e51b81526020600482015260096024820152684f6e6c79206f6e636560b81b604482015290519081900360640190fd5b600980546001600160a01b038086166001600160a01b031992831617909255600180548584169083161790556006805492841692821683179055600780548216831790556008805490911690911790556040805133815290517f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b9181900360200190a16040805133815290517fe45f5e140399b0a7e12971ab020724b828fbed8ac408c420884dc7d1bbe506b49181900360200190a16040805133815290517f70a64736553c84939f57deec269299882abbbee8dc4f316eccbc6fce57e4d3cf9181900360200190a1505050565b60106020526000908152604090205460ff1681565b6007546001600160a01b031681565b61271081565b6008546001600160a01b031681565b600c546001600160a01b031681565b6007546001600160a01b03163314612720576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600d80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f7dae230f18360d76a040c81f050aa14eb9d6dc7901b20fc5d855e2a20fe814d19181900360200190a150565b600260005414156127ba576040805162461bcd60e51b815260206004820152601f6024820152600080516020613615833981519152604482015290519081900360640190fd5b60026000908155600f8054869081106127cf57fe5b60009182526020822060059091020180546002820154600183015460408051632770a7eb60e21b81526001600160a01b038a81166004830152602482018c9052915195975093811695928116949116928392639dc29fac9260448084019382900301818387803b15801561284257600080fd5b505af1158015612856573d6000803e3d6000fd5b505050506004840154600160a01b900460ff16612922577f000000000000000000000000c181edc719480bd089b94647c2dc504e2700a2b06001600160a01b031663d9caed1284848a6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050602060405180830381600087803b1580156128f557600080fd5b505af1158015612909573d6000803e3d6000fd5b505050506040513d602081101561291f57600080fd5b50505b60048401546001600160a01b031680158015906129495750600e54600160a01b900460ff16155b801561296157506004850154600160a01b900460ff16155b156129ce57806001600160a01b031663b87bd4816040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156129a157600080fd5b505af11580156129b5573d6000803e3d6000fd5b505050506040513d60208110156129cb57600080fd5b50505b6129e26001600160a01b038516878a6131db565b6040805189815290518a916001600160a01b038916917f92ccf450a286a957af52509bc1c9939d1a6a481783e142e41e2499f0bb66ebc69181900360200190a35050600160005550505050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612a8c908590613229565b50505050565b801580612b18575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015612aea57600080fd5b505afa158015612afe573d6000803e3d6000fd5b505050506040513d6020811015612b1457600080fd5b5051155b612b535760405162461bcd60e51b81526004018080602001828103825260368152602001806136a66036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052611bbf908490613229565b600082820183811015610a13576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000600f8381548110612c0e57fe5b600091825260209091206005909102016004810154909150600160a01b900460ff1615612c73576040805162461bcd60e51b815260206004820152600e60248201526d1c1bdbdb081a5cc818db1bdcd95960921b604482015290519081900360640190fd5b600154604080516370a0823160e01b8152306004820152905160009283926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b158015612cc357600080fd5b505afa158015612cd7573d6000803e3d6000fd5b505050506040513d6020811015612ced57600080fd5b5051600154604080516370a0823160e01b81526001600160a01b037f000000000000000000000000c181edc719480bd089b94647c2dc504e2700a2b081166004830152915193945060009391909216916370a08231916024808301926020929190829003018186803b158015612d6257600080fd5b505afa158015612d76573d6000803e3d6000fd5b505050506040513d6020811015612d8c57600080fd5b505190506000612d9c8383612ba5565b600286015460408051631ff4de0360e11b81526001600160a01b03928316600482015290519293507f000000000000000000000000c181edc719480bd089b94647c2dc504e2700a2b090911691633fe9bc06916024808201926020929091908290030181600087803b158015612e1157600080fd5b505af1158015612e25573d6000803e3d6000fd5b505050506040513d6020811015612e3b57600080fd5b5050600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612e8857600080fd5b505afa158015612e9c573d6000803e3d6000fd5b505050506040513d6020811015612eb257600080fd5b50519050612ec081836132da565b9450600082118015612edc5750600d546001600160a01b031615155b15612efe57600d54600154612efe916001600160a01b039182169116846131db565b5050505060048201546001600160a01b03168015612fec57806001600160a01b031663372500ab6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612f5157600080fd5b505af1158015612f65573d6000803e3d6000fd5b505050506040513d6020811015612f7b57600080fd5b50506040805163654580bb60e11b815290516001600160a01b0383169163ca8b01769160048083019260209291908290030181600087803b158015612fbf57600080fd5b505af1158015612fd3573d6000803e3d6000fd5b505050506040513d6020811015612fe957600080fd5b50505b81156131d457600061301561271061300f6002548661333790919063ffffffff16565b90613390565b9050600061303461271061300f6003548761333790919063ffffffff16565b9050600061305361271061300f6004548861333790919063ffffffff16565b9050600061307261271061300f6005548961333790919063ffffffff16565b90506000613084826116748787612ba5565b905061309a8361309489846132da565b906132da565b6001549097506130b4906001600160a01b031633856131db565b60038801546001546001600160a01b03918216916130d49116828a6131db565b806001600160a01b031663590a41f5896040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561311a57600080fd5b505af115801561312e573d6000803e3d6000fd5b5050600e5460015461314f93506001600160a01b03908116925016846131db565b600e546040805163d288227360e01b815233600482015260248101859052604481018b90526001600160a01b038d811660648301529151919092169163d288227391349160848082019260009290919082900301818588803b1580156131b457600080fd5b505af11580156131c8573d6000803e3d6000fd5b50505050505050505050505b5050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611bbf9084905b606061327e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166133f79092919063ffffffff16565b805190915015611bbf5780806020019051602081101561329d57600080fd5b5051611bbf5760405162461bcd60e51b815260040180806020018281038252602a81526020018061367c602a913960400191505060405180910390fd5b600082821115613331576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008261334657506000611150565b8282028284828161335357fe5b0414610a135760405162461bcd60e51b815260040180806020018281038252602181526020018061365b6021913960400191505060405180910390fd5b60008082116133e6576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816133ef57fe5b049392505050565b6060613406848460008561340e565b949350505050565b60608247101561344f5760405162461bcd60e51b81526004018080602001828103825260268152602001806136356026913960400191505060405180910390fd5b6134588561356a565b6134a9576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106134e85780518252601f1990920191602091820191016134c9565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461354a576040519150601f19603f3d011682016040523d82523d6000602084013e61354f565b606091505b509150915061355f828286613570565b979650505050505050565b3b151590565b6060831561357f575081610a13565b82511561358f5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156135d95781810151838201526020016135c1565b50505050905090810190601f1680156136065780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe5265656e7472616e637947756172643a207265656e7472616e742063616c6c00416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a264697066735822122073195a7ec07ff9bb53a3f7360471631febb71777b1e718191199665b1b72081e64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c181edc719480bd089b94647c2dc504e2700a2b0
-----Decoded View---------------
Arg [0] : _staker (address): 0xC181Edc719480bd089b94647c2Dc504e2700a2B0
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000c181edc719480bd089b94647c2dc504e2700a2b0
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$10,774.67
Net Worth in FRAX
13,336.482292
Token Allocations
ETH
99.69%
AVAX
0.31%
FRAX
0.00%
Others
0.00%
Multichain Portfolio | 35 Chains
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.