Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 55 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Get Reward | 13196043 | 1241 days ago | IN | 0 ETH | 0.00983715 | ||||
Withdraw | 13156766 | 1247 days ago | IN | 0 ETH | 0.01944055 | ||||
Exit | 12920099 | 1284 days ago | IN | 0 ETH | 0.00313062 | ||||
Withdraw | 12919566 | 1284 days ago | IN | 0 ETH | 0.00399609 | ||||
Get Reward | 12919522 | 1284 days ago | IN | 0 ETH | 0.00372058 | ||||
Get Reward | 12918995 | 1284 days ago | IN | 0 ETH | 0.00306633 | ||||
Get Reward | 12916362 | 1285 days ago | IN | 0 ETH | 0.0044226 | ||||
Withdraw | 12914429 | 1285 days ago | IN | 0 ETH | 0.00389527 | ||||
Get Reward | 12913252 | 1285 days ago | IN | 0 ETH | 0.00283046 | ||||
Withdraw | 12913179 | 1285 days ago | IN | 0 ETH | 0.00367903 | ||||
Withdraw | 12912893 | 1285 days ago | IN | 0 ETH | 0.00455039 | ||||
Get Reward | 12912633 | 1285 days ago | IN | 0 ETH | 0.00218771 | ||||
Withdraw | 12906026 | 1286 days ago | IN | 0 ETH | 0.00239919 | ||||
Withdraw | 12905810 | 1286 days ago | IN | 0 ETH | 0.00283605 | ||||
Get Reward | 12905796 | 1286 days ago | IN | 0 ETH | 0.00234244 | ||||
Get Reward | 12887735 | 1289 days ago | IN | 0 ETH | 0.00130136 | ||||
Get Reward | 12885855 | 1290 days ago | IN | 0 ETH | 0.00331281 | ||||
Get Reward | 12823070 | 1299 days ago | IN | 0 ETH | 0.00601473 | ||||
Get Reward | 12803873 | 1302 days ago | IN | 0 ETH | 0.00065068 | ||||
Get Reward | 12796462 | 1304 days ago | IN | 0 ETH | 0.00286299 | ||||
Get Reward | 12752441 | 1310 days ago | IN | 0 ETH | 0.00047174 | ||||
Get Reward | 12698945 | 1319 days ago | IN | 0 ETH | 0.00241272 | ||||
Get Reward | 12695104 | 1319 days ago | IN | 0 ETH | 0.00070761 | ||||
Withdraw | 12694996 | 1319 days ago | IN | 0 ETH | 0.00141646 | ||||
Get Reward | 12689034 | 1320 days ago | IN | 0 ETH | 0.00208217 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
CoFiXV2StakingRewards
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-05-17 */ // File: contracts/interface/ICoFiXV2Factory.sol // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.6.12; interface ICoFiXV2Factory { // All pairs: {ETH <-> ERC20 Token} event PairCreated(address indexed token, address pair, uint256); event NewGovernance(address _new); event NewController(address _new); event NewFeeReceiver(address _new); event NewFeeVaultForLP(address token, address feeVault); event NewVaultForLP(address _new); event NewVaultForTrader(address _new); event NewVaultForCNode(address _new); event NewDAO(address _new); /// @dev Create a new token pair for trading /// @param token the address of token to trade /// @param initToken0Amount the initial asset ratio (initToken0Amount:initToken1Amount) /// @param initToken1Amount the initial asset ratio (initToken0Amount:initToken1Amount) /// @return pair the address of new token pair function createPair( address token, uint256 initToken0Amount, uint256 initToken1Amount ) external returns (address pair); function getPair(address token) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function getTradeMiningStatus(address token) external view returns (bool status); function setTradeMiningStatus(address token, bool status) external; function getFeeVaultForLP(address token) external view returns (address feeVault); // for LPs function setFeeVaultForLP(address token, address feeVault) external; function setGovernance(address _new) external; function setController(address _new) external; function setFeeReceiver(address _new) external; function setVaultForLP(address _new) external; function setVaultForTrader(address _new) external; function setVaultForCNode(address _new) external; function setDAO(address _new) external; function getController() external view returns (address controller); function getFeeReceiver() external view returns (address feeReceiver); // For CoFi Holders function getVaultForLP() external view returns (address vaultForLP); function getVaultForTrader() external view returns (address vaultForTrader); function getVaultForCNode() external view returns (address vaultForCNode); function getDAO() external view returns (address dao); } // File: contracts/interface/ICoFiStakingRewards.sol pragma solidity 0.6.12; interface ICoFiStakingRewards { // Views /// @dev Reward amount represents by per staking token function rewardPerToken() external view returns (uint256); /// @dev How many reward tokens a user has earned but not claimed at present /// @param account The target account /// @return The amount of reward tokens a user earned function earned(address account) external view returns (uint256); /// @dev How many reward tokens accrued recently /// @return The amount of reward tokens accrued recently function accrued() external view returns (uint256); /// @dev How many stakingToken (XToken) deposited into to this reward pool (staking pool) /// @return The total amount of XTokens deposited in this staking pool function totalSupply() external view returns (uint256); /// @dev How many stakingToken (XToken) deposited by the target account /// @param account The target account /// @return The total amount of XToken deposited in this staking pool function balanceOf(address account) external view returns (uint256); /// @dev Get the address of token for staking in this staking pool /// @return The staking token address function stakingToken() external view returns (address); /// @dev Get the address of token for rewards in this staking pool /// @return The rewards token address function rewardsToken() external view returns (address); // Mutative /// @dev Stake/Deposit into the reward pool (staking pool) /// @param amount The target amount function stake(uint256 amount) external; /// @dev Stake/Deposit into the reward pool (staking pool) for other account /// @param other The target account /// @param amount The target amount function stakeForOther(address other, uint256 amount) external; /// @dev Withdraw from the reward pool (staking pool), get the original tokens back /// @param amount The target amount function withdraw(uint256 amount) external; /// @dev Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw() external; /// @dev Claim the reward the user earned function getReward() external; /// @dev Add ETH reward to the staking pool function addETHReward() external payable; /// @dev User exit the reward pool, it's actually withdraw and getReward function exit() external; // Events event Staked(address indexed user, uint256 amount); event StakedForOther(address indexed user, address indexed other, uint256 amount); event Withdrawn(address indexed user, uint256 amount); event SavingWithdrawn(address indexed to, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 amount); event RewardPaid(address indexed user, uint256 reward); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol 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); } // File: contracts/interface/ICoFiXVaultForLP.sol pragma solidity 0.6.12; interface ICoFiXVaultForLP { enum POOL_STATE {INVALID, ENABLED, DISABLED} event NewPoolAdded(address pool, uint256 index); event PoolEnabled(address pool); event PoolDisabled(address pool); function setGovernance(address _new) external; function setInitCoFiRate(uint256 _new) external; function setDecayPeriod(uint256 _new) external; function setDecayRate(uint256 _new) external; function addPool(address pool) external; function enablePool(address pool) external; function disablePool(address pool) external; function setPoolWeight(address pool, uint256 weight) external; function batchSetPoolWeight(address[] memory pools, uint256[] memory weights) external; function distributeReward(address to, uint256 amount) external; function getPendingRewardOfLP(address pair) external view returns (uint256); function currentPeriod() external view returns (uint256); function currentCoFiRate() external view returns (uint256); function currentPoolRate(address pool) external view returns (uint256 poolRate); function currentPoolRateByPair(address pair) external view returns (uint256 poolRate); /// @dev Get the award staking pool address of pair (XToken) /// @param pair The address of XToken(pair) contract /// @return pool The pool address function stakingPoolForPair(address pair) external view returns (address pool); function getPoolInfo(address pool) external view returns (POOL_STATE state, uint256 weight); function getPoolInfoByPair(address pair) external view returns (POOL_STATE state, uint256 weight); function getEnabledPoolCnt() external view returns (uint256); function getCoFiStakingPool() external view returns (address pool); } // File: contracts/interface/ICoFiXStakingRewards.sol pragma solidity 0.6.12; interface ICoFiXStakingRewards { // Views /// @dev The rewards vault contract address set in factory contract /// @return Returns the vault address function rewardsVault() external view returns (address); /// @dev The lastBlock reward applicable /// @return Returns the latest block.number on-chain function lastBlockRewardApplicable() external view returns (uint256); /// @dev Reward amount represents by per staking token function rewardPerToken() external view returns (uint256); /// @dev How many reward tokens a user has earned but not claimed at present /// @param account The target account /// @return The amount of reward tokens a user earned function earned(address account) external view returns (uint256); /// @dev How many reward tokens accrued recently /// @return The amount of reward tokens accrued recently function accrued() external view returns (uint256); /// @dev Get the latest reward rate of this mining pool (tokens amount per block) /// @return The latest reward rate function rewardRate() external view returns (uint256); /// @dev How many stakingToken (XToken) deposited into to this reward pool (mining pool) /// @return The total amount of XTokens deposited in this mining pool function totalSupply() external view returns (uint256); /// @dev How many stakingToken (XToken) deposited by the target account /// @param account The target account /// @return The total amount of XToken deposited in this mining pool function balanceOf(address account) external view returns (uint256); /// @dev Get the address of token for staking in this mining pool /// @return The staking token address function stakingToken() external view returns (address); /// @dev Get the address of token for rewards in this mining pool /// @return The rewards token address function rewardsToken() external view returns (address); // Mutative /// @dev Stake/Deposit into the reward pool (mining pool) /// @param amount The target amount function stake(uint256 amount) external; /// @dev Stake/Deposit into the reward pool (mining pool) for other account /// @param other The target account /// @param amount The target amount function stakeForOther(address other, uint256 amount) external; /// @dev Withdraw from the reward pool (mining pool), get the original tokens back /// @param amount The target amount function withdraw(uint256 amount) external; /// @dev Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw() external; /// @dev Claim the reward the user earned function getReward() external; function getRewardAndStake() external; /// @dev User exit the reward pool, it's actually withdraw and getReward function exit() external; /// @dev Add reward to the mining pool function addReward(uint256 amount) external; // Events event RewardAdded(address sender, uint256 reward); event Staked(address indexed user, uint256 amount); event StakedForOther(address indexed user, address indexed other, uint256 amount); event Withdrawn(address indexed user, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 amount); event RewardPaid(address indexed user, uint256 reward); } // File: @openzeppelin/contracts/utils/ReentrancyGuard.sol 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; } } // File: @openzeppelin/contracts/math/Math.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // File: contracts/lib/TransferHelper.sol pragma solidity 0.6.12; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove(address token, address to, uint value) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED'); } function safeTransfer(address token, address to, uint value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED'); } function safeTransferFrom(address token, address from, address to, uint value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED'); } function safeTransferETH(address to, uint value) internal { (bool success,) = to.call{value:value}(new bytes(0)); require(success, 'TransferHelper: ETH_TRANSFER_FAILED'); } } // File: @openzeppelin/contracts/math/SafeMath.sol 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; } } // File: contracts/CoFiXV2StakingRewards.sol pragma solidity 0.6.12; // Stake XToken to earn CoFi Token contract CoFiXV2StakingRewards is ICoFiXStakingRewards, ReentrancyGuard { using SafeMath for uint256; /* ========== STATE VARIABLES ========== */ address public override immutable rewardsToken; // CoFi address public override immutable stakingToken; // XToken or CNode address public immutable factory; uint256 public lastUpdateBlock; uint256 public rewardPerTokenStored; mapping(address => uint256) public userRewardPerTokenPaid; mapping(address => uint256) public rewards; uint256 private _totalSupply; mapping(address => uint256) private _balances; /* ========== CONSTRUCTOR ========== */ constructor( address _rewardsToken, address _stakingToken, address _factory ) public { rewardsToken = _rewardsToken; stakingToken = _stakingToken; require(ICoFiXV2Factory(_factory).getVaultForLP() != address(0), "VaultForLP not set yet"); // check factory = _factory; lastUpdateBlock = block.number; } /* ========== VIEWS ========== */ // replace cofixVault with rewardsVault, this could introduce more calls, but clear is more important function rewardsVault() public virtual override view returns (address) { return ICoFiXV2Factory(factory).getVaultForLP(); } function totalSupply() external override view returns (uint256) { return _totalSupply; } function balanceOf(address account) external override view returns (uint256) { return _balances[account]; } function lastBlockRewardApplicable() public override view returns (uint256) { return block.number; } function rewardPerToken() public override view returns (uint256) { if (_totalSupply == 0) { return rewardPerTokenStored; } return rewardPerTokenStored.add( accrued().mul(1e18).div(_totalSupply) ); } function _rewardPerTokenAndAccrued() internal view returns (uint256, uint256) { if (_totalSupply == 0) { // use the old rewardPerTokenStored, and accrued should be zero here // if not the new accrued amount will never be distributed to anyone return (rewardPerTokenStored, 0); } uint256 _accrued = accrued(); uint256 _rewardPerToken = rewardPerTokenStored.add( _accrued.mul(1e18).div(_totalSupply) ); return (_rewardPerToken, _accrued); } function rewardRate() public virtual override view returns (uint256) { return ICoFiXVaultForLP(rewardsVault()).currentPoolRate(address(this)); } function accrued() public virtual override view returns (uint256) { // calc block rewards uint256 blockReward = lastBlockRewardApplicable().sub(lastUpdateBlock).mul(rewardRate()); // query pair trading rewards uint256 tradingReward = ICoFiXVaultForLP(rewardsVault()).getPendingRewardOfLP(stakingToken); return blockReward.add(tradingReward); } function earned(address account) public override view returns (uint256) { return _balances[account].mul(rewardPerToken().sub(userRewardPerTokenPaid[account])).div(1e18).add(rewards[account]); } /* ========== MUTATIVE FUNCTIONS ========== */ function stake(uint256 amount) external override nonReentrant updateReward(msg.sender) { require(amount > 0, "Cannot stake 0"); _totalSupply = _totalSupply.add(amount); _balances[msg.sender] = _balances[msg.sender].add(amount); TransferHelper.safeTransferFrom(stakingToken, msg.sender, address(this), amount); emit Staked(msg.sender, amount); } function stakeForOther(address other, uint256 amount) external override nonReentrant updateReward(other) { require(amount > 0, "Cannot stake 0"); _totalSupply = _totalSupply.add(amount); _balances[other] = _balances[other].add(amount); TransferHelper.safeTransferFrom(stakingToken, msg.sender, address(this), amount); emit StakedForOther(msg.sender, other, amount); } function withdraw(uint256 amount) public override nonReentrant updateReward(msg.sender) { require(amount > 0, "Cannot withdraw 0"); _totalSupply = _totalSupply.sub(amount); _balances[msg.sender] = _balances[msg.sender].sub(amount); TransferHelper.safeTransfer(stakingToken, msg.sender, amount); emit Withdrawn(msg.sender, amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw() external override nonReentrant { uint256 amount = _balances[msg.sender]; require(amount > 0, "Cannot withdraw 0"); _totalSupply = _totalSupply.sub(amount); _balances[msg.sender] = 0; rewards[msg.sender] = 0; TransferHelper.safeTransfer(stakingToken, msg.sender, amount); emit EmergencyWithdraw(msg.sender, amount); } function getReward() public override nonReentrant updateReward(msg.sender) { uint256 reward = rewards[msg.sender]; if (reward > 0) { rewards[msg.sender] = 0; // TransferHelper.safeTransfer(rewardsToken, msg.sender, reward); uint256 transferred = _safeCoFiTransfer(msg.sender, reward); emit RewardPaid(msg.sender, transferred); } } // get CoFi rewards and staking into CoFiStakingRewards pool function getRewardAndStake() external override nonReentrant updateReward(msg.sender) { uint256 reward = rewards[msg.sender]; if (reward > 0) { rewards[msg.sender] = 0; address cofiStakingPool = ICoFiXVaultForLP(rewardsVault()).getCoFiStakingPool(); // also work for VaultForCNode require(cofiStakingPool != address(0), "cofiStakingPool not set"); // approve to staking pool address _rewardsToken = rewardsToken; IERC20(_rewardsToken).approve(cofiStakingPool, reward); ICoFiStakingRewards(cofiStakingPool).stakeForOther(msg.sender, reward); IERC20(_rewardsToken).approve(cofiStakingPool, 0); // ensure emit RewardPaid(msg.sender, reward); } } function exit() external override { withdraw(_balances[msg.sender]); getReward(); } // add reward from trading pool or anyone else function addReward(uint256 amount) public override nonReentrant updateReward(address(0)) { // transfer from caller (router contract) TransferHelper.safeTransferFrom(rewardsToken, msg.sender, address(this), amount); // update rewardPerTokenStored rewardPerTokenStored = rewardPerTokenStored.add(amount.mul(1e18).div(_totalSupply)); emit RewardAdded(msg.sender, amount); } // Safe CoFi transfer function, just in case if rounding error or ending of mining causes pool to not have enough CoFis. function _safeCoFiTransfer(address _to, uint256 _amount) internal returns (uint256) { uint256 cofiBal = IERC20(rewardsToken).balanceOf(address(this)); if (_amount > cofiBal) { _amount = cofiBal; } TransferHelper.safeTransfer(rewardsToken, _to, _amount); // allow zero amount return _amount; } /* ========== MODIFIERS ========== */ modifier updateReward(address account) virtual { // rewardPerTokenStored = rewardPerToken(); // uint256 newAccrued = accrued(); (uint256 newRewardPerToken, uint256 newAccrued) = _rewardPerTokenAndAccrued(); rewardPerTokenStored = newRewardPerToken; if (newAccrued > 0) { // distributeReward could fail if CoFiXVaultForLP is not minter of CoFi anymore // Should set reward rate to zero first, and then do a settlement of pool reward by call getReward ICoFiXVaultForLP(rewardsVault()).distributeReward(address(this), newAccrued); } lastUpdateBlock = lastBlockRewardApplicable(); if (account != address(0)) { rewards[account] = earned(account); userRewardPerTokenPaid[account] = rewardPerTokenStored; } _; } /* ========== EVENTS ========== */ event RewardAdded(address sender, uint256 reward); event Staked(address indexed user, uint256 amount); event StakedForOther(address indexed user, address indexed other, uint256 amount); event Withdrawn(address indexed user, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 amount); event RewardPaid(address indexed user, uint256 reward); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_stakingToken","type":"address"},{"internalType":"address","name":"_factory","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"other","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakedForOther","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"accrued","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRewardAndStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastBlockRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdateBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"other","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stakeForOther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60e060405234801561001057600080fd5b50604051611ed3380380611ed38339818101604052606081101561003357600080fd5b508051602080830151604093840151600160009081556001600160601b0319606086811b821660805284901b1660a052855163696bfc0b60e11b8152955194959294919390926001600160a01b0385169263d2d7f81692600480840193919291829003018186803b1580156100a757600080fd5b505afa1580156100bb573d6000803e3d6000fd5b505050506040513d60208110156100d157600080fd5b50516001600160a01b0316141561012f576040805162461bcd60e51b815260206004820152601660248201527f5661756c74466f724c50206e6f74207365742079657400000000000000000000604482015290519081900360640190fd5b6001600160601b031960609190911b1660c05250504360015560805160601c60a05160601c60c05160601c611d246101af60003980610c1552806112435250806109f35280610cba5280610f5c52806111d552806113b2528061162552508061065e5280610e20528061129f5280611a285280611ad25250611d246000f3fe608060405234801561001057600080fd5b506004361061018c5760003560e01c80638b876347116100e3578063cd3daf9d1161008c578063df136d6511610066578063df136d6514610318578063e9fad8ee14610320578063fe72bd01146103285761018c565b8063cd3daf9d14610300578063d1af0c7d14610308578063db2e21bc146103105761018c565b8063a694fc3a116100bd578063a694fc3a146102d3578063abe0429c146102f0578063c45a0155146102f85761018c565b80638b8763471461029d578063a07e52a2146102c3578063a218141b146102cb5761018c565b80633d18b9121161014557806372f702f31161011f57806372f702f31461027057806374de4ec4146102785780637b0a47ee146102955761018c565b80633d18b9121461021e5780635579ed011461022657806370a082311461024a5761018c565b806318160ddd1161017657806318160ddd146101ef57806327e63443146101f75780632e1a7d4d146102015761018c565b80628cc262146101915780630700037d146101c9575b600080fd5b6101b7600480360360208110156101a757600080fd5b50356001600160a01b0316610354565b60408051918252519081900360200190f35b6101b7600480360360208110156101df57600080fd5b50356001600160a01b03166103d2565b6101b76103e4565b6101ff6103eb565b005b6101ff6004803603602081101561021757600080fd5b503561081b565b6101ff610a5a565b61022e610c11565b604080516001600160a01b039092168252519081900360200190f35b6101b76004803603602081101561026057600080fd5b50356001600160a01b0316610c9d565b61022e610cb8565b6101ff6004803603602081101561028e57600080fd5b5035610cdc565b6101b7610eb6565b6101b7600480360360208110156102b357600080fd5b50356001600160a01b0316610f0c565b6101b7610f1e565b6101b7610ff7565b6101ff600480360360208110156102e957600080fd5b5035610ffd565b6101b761123d565b61022e611241565b6101b7611265565b61022e61129d565b6101ff6112c1565b6101b7611416565b6101ff61141c565b6101ff6004803603604081101561033e57600080fd5b506001600160a01b03813516906020013561143f565b6001600160a01b03811660009081526004602090815260408083205460039092528220546103cc91906103c690670de0b6b3a7640000906103c0906103a19061039b611265565b90611698565b6001600160a01b038816600090815260066020526040902054906116f5565b90611755565b906117bc565b92915050565b60046020526000908152604090205481565b6005545b90565b60026000541415610443576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026000908155339080610455611816565b6002829055909250905080156104dc5761046d610c11565b6001600160a01b0316631ec8bb8c30836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156104c357600080fd5b505af11580156104d7573d6000803e3d6000fd5b505050505b6104e461123d565b6001556001600160a01b0383161561052b576104ff83610354565b6001600160a01b0384166000908152600460209081526040808320939093556002546003909152919020555b3360009081526004602052604090205480156108105733600090815260046020526040812081905561055b610c11565b6001600160a01b031663af1734ac6040518163ffffffff1660e01b815260040160206040518083038186803b15801561059357600080fd5b505afa1580156105a7573d6000803e3d6000fd5b505050506040513d60208110156105bd57600080fd5b505190506001600160a01b03811661061c576040805162461bcd60e51b815260206004820152601760248201527f636f66695374616b696e67506f6f6c206e6f7420736574000000000000000000604482015290519081900360640190fd5b604080517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526024820185905291517f00000000000000000000000000000000000000000000000000000000000000009283169163095ea7b39160448083019260209291908290030181600087803b1580156106a857600080fd5b505af11580156106bc573d6000803e3d6000fd5b505050506040513d60208110156106d257600080fd5b5050604080517ffe72bd010000000000000000000000000000000000000000000000000000000081523360048201526024810185905290516001600160a01b0384169163fe72bd0191604480830192600092919082900301818387803b15801561073b57600080fd5b505af115801561074f573d6000803e3d6000fd5b50505050806001600160a01b031663095ea7b38360006040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156107ab57600080fd5b505af11580156107bf573d6000803e3d6000fd5b505050506040513d60208110156107d557600080fd5b505060408051848152905133917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a250505b505060016000555050565b60026000541415610873576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026000908155339080610885611816565b60028290559092509050801561090c5761089d610c11565b6001600160a01b0316631ec8bb8c30836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156108f357600080fd5b505af1158015610907573d6000803e3d6000fd5b505050505b61091461123d565b6001556001600160a01b0383161561095b5761092f83610354565b6001600160a01b0384166000908152600460209081526040808320939093556002546003909152919020555b600084116109b0576040805162461bcd60e51b815260206004820152601160248201527f43616e6e6f742077697468647261772030000000000000000000000000000000604482015290519081900360640190fd5b6005546109bd9085611698565b600555336000908152600660205260409020546109da9085611698565b33600081815260066020526040902091909155610a19907f0000000000000000000000000000000000000000000000000000000000000000908661186d565b60408051858152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a2505060016000555050565b60026000541415610ab2576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026000908155339080610ac4611816565b600282905590925090508015610b4b57610adc610c11565b6001600160a01b0316631ec8bb8c30836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610b3257600080fd5b505af1158015610b46573d6000803e3d6000fd5b505050505b610b5361123d565b6001556001600160a01b03831615610b9a57610b6e83610354565b6001600160a01b0384166000908152600460209081526040808320939093556002546003909152919020555b3360009081526004602052604090205480156108105733600081815260046020526040812081905590610bcd9083611a23565b60408051828152905191925033917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e04869181900360200190a250505060016000555050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d2d7f8166040518163ffffffff1660e01b815260040160206040518083038186803b158015610c6c57600080fd5b505afa158015610c80573d6000803e3d6000fd5b505050506040513d6020811015610c9657600080fd5b5051905090565b6001600160a01b031660009081526006602052604090205490565b7f000000000000000000000000000000000000000000000000000000000000000081565b60026000541415610d34576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260009081558080610d45611816565b600282905590925090508015610dcc57610d5d610c11565b6001600160a01b0316631ec8bb8c30836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610db357600080fd5b505af1158015610dc7573d6000803e3d6000fd5b505050505b610dd461123d565b6001556001600160a01b03831615610e1b57610def83610354565b6001600160a01b0384166000908152600460209081526040808320939093556002546003909152919020555b610e477f0000000000000000000000000000000000000000000000000000000000000000333087611b00565b600554610e6d90610e64906103c087670de0b6b3a76400006116f5565b600254906117bc565b600255604080513381526020810186905281517fac24935fd910bc682b5ccb1a07b718cadf8cf2f6d1404c4f3ddc3662dae40e29929181900390910190a1505060016000555050565b6000610ec0610c11565b6001600160a01b031663643a8b24306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610c6c57600080fd5b60036020526000908152604090205481565b600080610f40610f2c610eb6565b610f3a60015461039b61123d565b906116f5565b90506000610f4c610c11565b6001600160a01b031663a66771db7f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610fb857600080fd5b505afa158015610fcc573d6000803e3d6000fd5b505050506040513d6020811015610fe257600080fd5b50519050610ff082826117bc565b9250505090565b60015481565b60026000541415611055576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026000908155339080611067611816565b6002829055909250905080156110ee5761107f610c11565b6001600160a01b0316631ec8bb8c30836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156110d557600080fd5b505af11580156110e9573d6000803e3d6000fd5b505050505b6110f661123d565b6001556001600160a01b0383161561113d5761111183610354565b6001600160a01b0384166000908152600460209081526040808320939093556002546003909152919020555b60008411611192576040805162461bcd60e51b815260206004820152600e60248201527f43616e6e6f74207374616b652030000000000000000000000000000000000000604482015290519081900360640190fd5b60055461119f90856117bc565b600555336000908152600660205260409020546111bc90856117bc565b336000818152600660205260409020919091556111fc907f0000000000000000000000000000000000000000000000000000000000000000903087611b00565b60408051858152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a2505060016000555050565b4390565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006005546000141561127b57506002546103e8565b611298610e646005546103c0670de0b6b3a7640000610f3a610f1e565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b60026000541415611319576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026000908155338152600660205260409020548061137f576040805162461bcd60e51b815260206004820152601160248201527f43616e6e6f742077697468647261772030000000000000000000000000000000604482015290519081900360640190fd5b60055461138c9082611698565b60055533600081815260066020908152604080832083905560049091528120556113d8907f0000000000000000000000000000000000000000000000000000000000000000908361186d565b60408051828152905133917f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd9695919081900360200190a2506001600055565b60025481565b336000908152600660205260409020546114359061081b565b61143d610a5a565b565b60026000541415611497576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260009081558290806114a9611816565b600282905590925090508015611530576114c1610c11565b6001600160a01b0316631ec8bb8c30836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561151757600080fd5b505af115801561152b573d6000803e3d6000fd5b505050505b61153861123d565b6001556001600160a01b0383161561157f5761155383610354565b6001600160a01b0384166000908152600460209081526040808320939093556002546003909152919020555b600084116115d4576040805162461bcd60e51b815260206004820152600e60248201527f43616e6e6f74207374616b652030000000000000000000000000000000000000604482015290519081900360640190fd5b6005546115e190856117bc565b6005556001600160a01b03851660009081526006602052604090205461160790856117bc565b6001600160a01b03861660009081526006602052604090205561164c7f0000000000000000000000000000000000000000000000000000000000000000333087611b00565b6040805185815290516001600160a01b0387169133917ff6709c821eb43e8e9953ad8ac910b4591a380ae9f014d75ce7d7a2a34299e0ef9181900360200190a350506001600055505050565b6000828211156116ef576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082611704575060006103cc565b8282028284828161171157fe5b041461174e5760405162461bcd60e51b8152600401808060200182810382526021815260200180611caa6021913960400191505060405180910390fd5b9392505050565b60008082116117ab576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816117b457fe5b049392505050565b60008282018381101561174e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080600554600014156118305750506002546000611869565b600061183a610f1e565b90506000611862610e646005546103c0670de0b6b3a7640000866116f590919063ffffffff16565b9350909150505b9091565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b6020831061193657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016118f9565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611998576040519150601f19603f3d011682016040523d82523d6000602084013e61199d565b606091505b50915091508180156119cb5750805115806119cb57508080602001905160208110156119c857600080fd5b50515b611a1c576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a9357600080fd5b505afa158015611aa7573d6000803e3d6000fd5b505050506040513d6020811015611abd57600080fd5b5051905080831115611acd578092505b611af87f0000000000000000000000000000000000000000000000000000000000000000858561186d565b509092915050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b60208310611bd157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611b94565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611c33576040519150601f19603f3d011682016040523d82523d6000602084013e611c38565b606091505b5091509150818015611c66575080511580611c665750808060200190516020811015611c6357600080fd5b50515b611ca15760405162461bcd60e51b8152600401808060200182810382526024815260200180611ccb6024913960400191505060405180910390fd5b50505050505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a26469706673582212204b3349e3c77c35ff05f741b909d7bdb1341430b1264c4231674cf734ce18f84464736f6c634300060c00330000000000000000000000001a23a6bfbadb59fa563008c0fb7cf96dfcf34ea1000000000000000000000000b8f9218536870eec443aebf7c15de59e535d0e0a00000000000000000000000039816b841436a57729723d9da127805755d2cb51
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018c5760003560e01c80638b876347116100e3578063cd3daf9d1161008c578063df136d6511610066578063df136d6514610318578063e9fad8ee14610320578063fe72bd01146103285761018c565b8063cd3daf9d14610300578063d1af0c7d14610308578063db2e21bc146103105761018c565b8063a694fc3a116100bd578063a694fc3a146102d3578063abe0429c146102f0578063c45a0155146102f85761018c565b80638b8763471461029d578063a07e52a2146102c3578063a218141b146102cb5761018c565b80633d18b9121161014557806372f702f31161011f57806372f702f31461027057806374de4ec4146102785780637b0a47ee146102955761018c565b80633d18b9121461021e5780635579ed011461022657806370a082311461024a5761018c565b806318160ddd1161017657806318160ddd146101ef57806327e63443146101f75780632e1a7d4d146102015761018c565b80628cc262146101915780630700037d146101c9575b600080fd5b6101b7600480360360208110156101a757600080fd5b50356001600160a01b0316610354565b60408051918252519081900360200190f35b6101b7600480360360208110156101df57600080fd5b50356001600160a01b03166103d2565b6101b76103e4565b6101ff6103eb565b005b6101ff6004803603602081101561021757600080fd5b503561081b565b6101ff610a5a565b61022e610c11565b604080516001600160a01b039092168252519081900360200190f35b6101b76004803603602081101561026057600080fd5b50356001600160a01b0316610c9d565b61022e610cb8565b6101ff6004803603602081101561028e57600080fd5b5035610cdc565b6101b7610eb6565b6101b7600480360360208110156102b357600080fd5b50356001600160a01b0316610f0c565b6101b7610f1e565b6101b7610ff7565b6101ff600480360360208110156102e957600080fd5b5035610ffd565b6101b761123d565b61022e611241565b6101b7611265565b61022e61129d565b6101ff6112c1565b6101b7611416565b6101ff61141c565b6101ff6004803603604081101561033e57600080fd5b506001600160a01b03813516906020013561143f565b6001600160a01b03811660009081526004602090815260408083205460039092528220546103cc91906103c690670de0b6b3a7640000906103c0906103a19061039b611265565b90611698565b6001600160a01b038816600090815260066020526040902054906116f5565b90611755565b906117bc565b92915050565b60046020526000908152604090205481565b6005545b90565b60026000541415610443576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026000908155339080610455611816565b6002829055909250905080156104dc5761046d610c11565b6001600160a01b0316631ec8bb8c30836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156104c357600080fd5b505af11580156104d7573d6000803e3d6000fd5b505050505b6104e461123d565b6001556001600160a01b0383161561052b576104ff83610354565b6001600160a01b0384166000908152600460209081526040808320939093556002546003909152919020555b3360009081526004602052604090205480156108105733600090815260046020526040812081905561055b610c11565b6001600160a01b031663af1734ac6040518163ffffffff1660e01b815260040160206040518083038186803b15801561059357600080fd5b505afa1580156105a7573d6000803e3d6000fd5b505050506040513d60208110156105bd57600080fd5b505190506001600160a01b03811661061c576040805162461bcd60e51b815260206004820152601760248201527f636f66695374616b696e67506f6f6c206e6f7420736574000000000000000000604482015290519081900360640190fd5b604080517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526024820185905291517f0000000000000000000000001a23a6bfbadb59fa563008c0fb7cf96dfcf34ea19283169163095ea7b39160448083019260209291908290030181600087803b1580156106a857600080fd5b505af11580156106bc573d6000803e3d6000fd5b505050506040513d60208110156106d257600080fd5b5050604080517ffe72bd010000000000000000000000000000000000000000000000000000000081523360048201526024810185905290516001600160a01b0384169163fe72bd0191604480830192600092919082900301818387803b15801561073b57600080fd5b505af115801561074f573d6000803e3d6000fd5b50505050806001600160a01b031663095ea7b38360006040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156107ab57600080fd5b505af11580156107bf573d6000803e3d6000fd5b505050506040513d60208110156107d557600080fd5b505060408051848152905133917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a250505b505060016000555050565b60026000541415610873576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026000908155339080610885611816565b60028290559092509050801561090c5761089d610c11565b6001600160a01b0316631ec8bb8c30836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156108f357600080fd5b505af1158015610907573d6000803e3d6000fd5b505050505b61091461123d565b6001556001600160a01b0383161561095b5761092f83610354565b6001600160a01b0384166000908152600460209081526040808320939093556002546003909152919020555b600084116109b0576040805162461bcd60e51b815260206004820152601160248201527f43616e6e6f742077697468647261772030000000000000000000000000000000604482015290519081900360640190fd5b6005546109bd9085611698565b600555336000908152600660205260409020546109da9085611698565b33600081815260066020526040902091909155610a19907f000000000000000000000000b8f9218536870eec443aebf7c15de59e535d0e0a908661186d565b60408051858152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a2505060016000555050565b60026000541415610ab2576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026000908155339080610ac4611816565b600282905590925090508015610b4b57610adc610c11565b6001600160a01b0316631ec8bb8c30836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610b3257600080fd5b505af1158015610b46573d6000803e3d6000fd5b505050505b610b5361123d565b6001556001600160a01b03831615610b9a57610b6e83610354565b6001600160a01b0384166000908152600460209081526040808320939093556002546003909152919020555b3360009081526004602052604090205480156108105733600081815260046020526040812081905590610bcd9083611a23565b60408051828152905191925033917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e04869181900360200190a250505060016000555050565b60007f00000000000000000000000039816b841436a57729723d9da127805755d2cb516001600160a01b031663d2d7f8166040518163ffffffff1660e01b815260040160206040518083038186803b158015610c6c57600080fd5b505afa158015610c80573d6000803e3d6000fd5b505050506040513d6020811015610c9657600080fd5b5051905090565b6001600160a01b031660009081526006602052604090205490565b7f000000000000000000000000b8f9218536870eec443aebf7c15de59e535d0e0a81565b60026000541415610d34576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260009081558080610d45611816565b600282905590925090508015610dcc57610d5d610c11565b6001600160a01b0316631ec8bb8c30836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610db357600080fd5b505af1158015610dc7573d6000803e3d6000fd5b505050505b610dd461123d565b6001556001600160a01b03831615610e1b57610def83610354565b6001600160a01b0384166000908152600460209081526040808320939093556002546003909152919020555b610e477f0000000000000000000000001a23a6bfbadb59fa563008c0fb7cf96dfcf34ea1333087611b00565b600554610e6d90610e64906103c087670de0b6b3a76400006116f5565b600254906117bc565b600255604080513381526020810186905281517fac24935fd910bc682b5ccb1a07b718cadf8cf2f6d1404c4f3ddc3662dae40e29929181900390910190a1505060016000555050565b6000610ec0610c11565b6001600160a01b031663643a8b24306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610c6c57600080fd5b60036020526000908152604090205481565b600080610f40610f2c610eb6565b610f3a60015461039b61123d565b906116f5565b90506000610f4c610c11565b6001600160a01b031663a66771db7f000000000000000000000000b8f9218536870eec443aebf7c15de59e535d0e0a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610fb857600080fd5b505afa158015610fcc573d6000803e3d6000fd5b505050506040513d6020811015610fe257600080fd5b50519050610ff082826117bc565b9250505090565b60015481565b60026000541415611055576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026000908155339080611067611816565b6002829055909250905080156110ee5761107f610c11565b6001600160a01b0316631ec8bb8c30836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156110d557600080fd5b505af11580156110e9573d6000803e3d6000fd5b505050505b6110f661123d565b6001556001600160a01b0383161561113d5761111183610354565b6001600160a01b0384166000908152600460209081526040808320939093556002546003909152919020555b60008411611192576040805162461bcd60e51b815260206004820152600e60248201527f43616e6e6f74207374616b652030000000000000000000000000000000000000604482015290519081900360640190fd5b60055461119f90856117bc565b600555336000908152600660205260409020546111bc90856117bc565b336000818152600660205260409020919091556111fc907f000000000000000000000000b8f9218536870eec443aebf7c15de59e535d0e0a903087611b00565b60408051858152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a2505060016000555050565b4390565b7f00000000000000000000000039816b841436a57729723d9da127805755d2cb5181565b60006005546000141561127b57506002546103e8565b611298610e646005546103c0670de0b6b3a7640000610f3a610f1e565b905090565b7f0000000000000000000000001a23a6bfbadb59fa563008c0fb7cf96dfcf34ea181565b60026000541415611319576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026000908155338152600660205260409020548061137f576040805162461bcd60e51b815260206004820152601160248201527f43616e6e6f742077697468647261772030000000000000000000000000000000604482015290519081900360640190fd5b60055461138c9082611698565b60055533600081815260066020908152604080832083905560049091528120556113d8907f000000000000000000000000b8f9218536870eec443aebf7c15de59e535d0e0a908361186d565b60408051828152905133917f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd9695919081900360200190a2506001600055565b60025481565b336000908152600660205260409020546114359061081b565b61143d610a5a565b565b60026000541415611497576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260009081558290806114a9611816565b600282905590925090508015611530576114c1610c11565b6001600160a01b0316631ec8bb8c30836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561151757600080fd5b505af115801561152b573d6000803e3d6000fd5b505050505b61153861123d565b6001556001600160a01b0383161561157f5761155383610354565b6001600160a01b0384166000908152600460209081526040808320939093556002546003909152919020555b600084116115d4576040805162461bcd60e51b815260206004820152600e60248201527f43616e6e6f74207374616b652030000000000000000000000000000000000000604482015290519081900360640190fd5b6005546115e190856117bc565b6005556001600160a01b03851660009081526006602052604090205461160790856117bc565b6001600160a01b03861660009081526006602052604090205561164c7f000000000000000000000000b8f9218536870eec443aebf7c15de59e535d0e0a333087611b00565b6040805185815290516001600160a01b0387169133917ff6709c821eb43e8e9953ad8ac910b4591a380ae9f014d75ce7d7a2a34299e0ef9181900360200190a350506001600055505050565b6000828211156116ef576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082611704575060006103cc565b8282028284828161171157fe5b041461174e5760405162461bcd60e51b8152600401808060200182810382526021815260200180611caa6021913960400191505060405180910390fd5b9392505050565b60008082116117ab576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816117b457fe5b049392505050565b60008282018381101561174e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080600554600014156118305750506002546000611869565b600061183a610f1e565b90506000611862610e646005546103c0670de0b6b3a7640000866116f590919063ffffffff16565b9350909150505b9091565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b6020831061193657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016118f9565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611998576040519150601f19603f3d011682016040523d82523d6000602084013e61199d565b606091505b50915091508180156119cb5750805115806119cb57508080602001905160208110156119c857600080fd5b50515b611a1c576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b6000807f0000000000000000000000001a23a6bfbadb59fa563008c0fb7cf96dfcf34ea16001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a9357600080fd5b505afa158015611aa7573d6000803e3d6000fd5b505050506040513d6020811015611abd57600080fd5b5051905080831115611acd578092505b611af87f0000000000000000000000001a23a6bfbadb59fa563008c0fb7cf96dfcf34ea1858561186d565b509092915050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b60208310611bd157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611b94565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611c33576040519150601f19603f3d011682016040523d82523d6000602084013e611c38565b606091505b5091509150818015611c66575080511580611c665750808060200190516020811015611c6357600080fd5b50515b611ca15760405162461bcd60e51b8152600401808060200182810382526024815260200180611ccb6024913960400191505060405180910390fd5b50505050505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a26469706673582212204b3349e3c77c35ff05f741b909d7bdb1341430b1264c4231674cf734ce18f84464736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001a23a6bfbadb59fa563008c0fb7cf96dfcf34ea1000000000000000000000000b8f9218536870eec443aebf7c15de59e535d0e0a00000000000000000000000039816b841436a57729723d9da127805755d2cb51
-----Decoded View---------------
Arg [0] : _rewardsToken (address): 0x1a23a6BfBAdB59fa563008c0fB7cf96dfCF34Ea1
Arg [1] : _stakingToken (address): 0xB8F9218536870eeC443aEBF7C15dE59E535d0e0a
Arg [2] : _factory (address): 0x39816B841436a57729723d9DA127805755d2CB51
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000001a23a6bfbadb59fa563008c0fb7cf96dfcf34ea1
Arg [1] : 000000000000000000000000b8f9218536870eec443aebf7c15de59e535d0e0a
Arg [2] : 00000000000000000000000039816b841436a57729723d9da127805755d2cb51
Deployed Bytecode Sourcemap
26430:8839:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29583:207;;;;;;;;;;;;;;;;-1:-1:-1;29583:207:0;-1:-1:-1;;;;;29583:207:0;;:::i;:::-;;;;;;;;;;;;;;;;26916:42;;;;;;;;;;;;;;;;-1:-1:-1;26916:42:0;-1:-1:-1;;;;;26916:42:0;;:::i;27796:102::-;;;:::i;32041:790::-;;;:::i;:::-;;30679:382;;;;;;;;;;;;;;;;-1:-1:-1;30679:382:0;;:::i;31553:414::-;;;:::i;27651:137::-;;;:::i;:::-;;;;-1:-1:-1;;;;;27651:137:0;;;;;;;;;;;;;;27906:121;;;;;;;;;;;;;;;;-1:-1:-1;27906:121:0;-1:-1:-1;;;;;27906:121:0;;:::i;26656:46::-;;;:::i;33005:420::-;;;;;;;;;;;;;;;;-1:-1:-1;33005:420:0;;:::i;29016:158::-;;;:::i;26852:57::-;;;;;;;;;;;;;;;;-1:-1:-1;26852:57:0;-1:-1:-1;;;;;26852:57:0;;:::i;29182:393::-;;;:::i;26771:30::-;;;:::i;29852:394::-;;;;;;;;;;;;;;;;-1:-1:-1;29852:394:0;;:::i;28035:114::-;;;:::i;26730:32::-;;;:::i;28157:286::-;;;:::i;26595:46::-;;;:::i;31132:413::-;;;:::i;26808:35::-;;;:::i;32839:106::-;;;:::i;30254:417::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30254:417:0;;;;;;;;:::i;29583:207::-;-1:-1:-1;;;;;29765:16:0;;29646:7;29765:16;;;:7;:16;;;;;;;;;29717:22;:31;;;;;;29673:109;;29765:16;29673:87;;29755:4;;29673:77;;29696:53;;:16;:14;:16::i;:::-;:20;;:53::i;:::-;-1:-1:-1;;;;;29673:18:0;;;;;;:9;:18;;;;;;;:22;:77::i;:::-;:81;;:87::i;:::-;:91;;:109::i;:::-;29666:116;29583:207;-1:-1:-1;;29583:207:0:o;26916:42::-;;;;;;;;;;;;;:::o;27796:102::-;27878:12;;27796:102;;:::o;32041:790::-;15486:1;16092:7;;:19;;16084:63;;;;;-1:-1:-1;;;16084:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15486:1;16225:7;:18;;;32114:10:::1;::::0;16225:7;34172:27:::1;:25;:27::i;:::-;34210:20;:40:::0;;;34122:77;;-1:-1:-1;34122:77:0;-1:-1:-1;34265:14:0;;34261:328:::1;;34518:14;:12;:14::i;:::-;-1:-1:-1::0;;;;;34501:49:0::1;;34559:4;34566:10;34501:76;;;;;;;;;;;;;-1:-1:-1::0;;;;;34501:76:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;34261:328;34618:27;:25;:27::i;:::-;34600:15;:45:::0;-1:-1:-1;;;;;34660:21:0;::::1;::::0;34656:157:::1;;34717:15;34724:7;34717:6;:15::i;:::-;-1:-1:-1::0;;;;;34698:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:34;;;;34781:20:::1;::::0;34747:22:::1;:31:::0;;;;;;:54;34656:157:::1;32162:10:::2;32137:14;32154:19:::0;;;:7:::2;:19;::::0;;;;;32188:10;;32184:640:::2;;32223:10;32237:1;32215:19:::0;;;:7:::2;:19;::::0;;;;:23;;;32296:14:::2;:12;:14::i;:::-;-1:-1:-1::0;;;;;32279:51:0::2;;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;32279:53:0;;-1:-1:-1;;;;;;32386:29:0;::::2;32378:65;;;::::0;;-1:-1:-1;;;32378:65:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;32549:54;::::0;;;;;-1:-1:-1;;;;;32549:54:0;;::::2;;::::0;::::2;::::0;;;;;;;;;32522:12:::2;::::0;32549:29;::::2;::::0;::::2;::::0;:54;;;;;::::2;::::0;;;;;;;;32498:21:::2;32549:29:::0;:54;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;;32618:70:0::2;::::0;;;;;32669:10:::2;32618:70;::::0;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;32618:50:0;::::2;::::0;::::2;::::0;:70;;;;;-1:-1:-1;;32618:70:0;;;;;;;-1:-1:-1;32618:50:0;:70;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;32710:13;-1:-1:-1::0;;;;;32703:29:0::2;;32733:15;32750:1;32703:49;;;;;;;;;;;;;-1:-1:-1::0;;;;;32703:49:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;;32782:30:0::2;::::0;;;;;;;32793:10:::2;::::0;32782:30:::2;::::0;;;;;32703:49:::2;32782:30:::0;;::::2;32184:640;;;-1:-1:-1::0;;15442:1:0;16404:7;:22;-1:-1:-1;;32041:790:0:o;30679:382::-;15486:1;16092:7;;:19;;16084:63;;;;;-1:-1:-1;;;16084:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15486:1;16225:7;:18;;;30755:10:::1;::::0;16225:7;34172:27:::1;:25;:27::i;:::-;34210:20;:40:::0;;;34122:77;;-1:-1:-1;34122:77:0;-1:-1:-1;34265:14:0;;34261:328:::1;;34518:14;:12;:14::i;:::-;-1:-1:-1::0;;;;;34501:49:0::1;;34559:4;34566:10;34501:76;;;;;;;;;;;;;-1:-1:-1::0;;;;;34501:76:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;34261:328;34618:27;:25;:27::i;:::-;34600:15;:45:::0;-1:-1:-1;;;;;34660:21:0;::::1;::::0;34656:157:::1;;34717:15;34724:7;34717:6;:15::i;:::-;-1:-1:-1::0;;;;;34698:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:34;;;;34781:20:::1;::::0;34747:22:::1;:31:::0;;;;;;:54;34656:157:::1;30795:1:::2;30786:6;:10;30778:40;;;::::0;;-1:-1:-1;;;30778:40:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;30844:12;::::0;:24:::2;::::0;30861:6;30844:16:::2;:24::i;:::-;30829:12;:39:::0;30913:10:::2;30903:21;::::0;;;:9:::2;:21;::::0;;;;;:33:::2;::::0;30929:6;30903:25:::2;:33::i;:::-;30889:10;30879:21;::::0;;;:9:::2;:21;::::0;;;;:57;;;;30947:61:::2;::::0;30975:12:::2;::::0;31001:6;30947:27:::2;:61::i;:::-;31024:29;::::0;;;;;;;31034:10:::2;::::0;31024:29:::2;::::0;;;;;::::2;::::0;;::::2;-1:-1:-1::0;;15442:1:0;16404:7;:22;-1:-1:-1;;30679:382:0:o;31553:414::-;15486:1;16092:7;;:19;;16084:63;;;;;-1:-1:-1;;;16084:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15486:1;16225:7;:18;;;31616:10:::1;::::0;16225:7;34172:27:::1;:25;:27::i;:::-;34210:20;:40:::0;;;34122:77;;-1:-1:-1;34122:77:0;-1:-1:-1;34265:14:0;;34261:328:::1;;34518:14;:12;:14::i;:::-;-1:-1:-1::0;;;;;34501:49:0::1;;34559:4;34566:10;34501:76;;;;;;;;;;;;;-1:-1:-1::0;;;;;34501:76:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;34261:328;34618:27;:25;:27::i;:::-;34600:15;:45:::0;-1:-1:-1;;;;;34660:21:0;::::1;::::0;34656:157:::1;;34717:15;34724:7;34717:6;:15::i;:::-;-1:-1:-1::0;;;;;34698:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:34;;;;34781:20:::1;::::0;34747:22:::1;:31:::0;;;;;;:54;34656:157:::1;31664:10:::2;31639:14;31656:19:::0;;;:7:::2;:19;::::0;;;;;31690:10;;31686:274:::2;;31725:10;31739:1;31717:19:::0;;;:7:::2;:19;::::0;;;;:23;;;31739:1;31856:37:::2;::::0;31886:6;31856:17:::2;:37::i;:::-;31913:35;::::0;;;;;;;31834:59;;-1:-1:-1;31924:10:0::2;::::0;31913:35:::2;::::0;;;;::::2;::::0;;::::2;31686:274;-1:-1:-1::0;;15442:1:0;16404:7;:22;-1:-1:-1;;31553:414:0:o;27651:137::-;27713:7;27756;-1:-1:-1;;;;;27740:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27740:40:0;;-1:-1:-1;27651:137:0;:::o;27906:121::-;-1:-1:-1;;;;;28001:18:0;27974:7;28001:18;;;:9;:18;;;;;;;27906:121::o;26656:46::-;;;:::o;33005:420::-;15486:1;16092:7;;:19;;16084:63;;;;;-1:-1:-1;;;16084:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15486:1;16225:7;:18;;;:7;;34172:27:::1;:25;:27::i;:::-;34210:20;:40:::0;;;34122:77;;-1:-1:-1;34122:77:0;-1:-1:-1;34265:14:0;;34261:328:::1;;34518:14;:12;:14::i;:::-;-1:-1:-1::0;;;;;34501:49:0::1;;34559:4;34566:10;34501:76;;;;;;;;;;;;;-1:-1:-1::0;;;;;34501:76:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;34261:328;34618:27;:25;:27::i;:::-;34600:15;:45:::0;-1:-1:-1;;;;;34660:21:0;::::1;::::0;34656:157:::1;;34717:15;34724:7;34717:6;:15::i;:::-;-1:-1:-1::0;;;;;34698:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:34;;;;34781:20:::1;::::0;34747:22:::1;:31:::0;;;;;;:54;34656:157:::1;33156:80:::2;33188:12;33202:10;33222:4;33229:6;33156:31;:80::i;:::-;33356:12;::::0;33310:60:::2;::::0;33335:34:::2;::::0;:16:::2;:6:::0;33346:4:::2;33335:10;:16::i;:34::-;33310:20;::::0;;:24:::2;:60::i;:::-;33287:20;:83:::0;33386:31:::2;::::0;;33398:10:::2;33386:31:::0;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;;;;;;;;;::::2;-1:-1:-1::0;;15442:1:0;16404:7;:22;-1:-1:-1;;33005:420:0:o;29016:158::-;29076:7;29120:14;:12;:14::i;:::-;-1:-1:-1;;;;;29103:48:0;;29160:4;29103:63;;;;;;;;;;;;;-1:-1:-1;;;;;29103:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;26852:57;;;;;;;;;;;;;:::o;29182:393::-;29239:7;29290:19;29312:66;29365:12;:10;:12::i;:::-;29312:48;29344:15;;29312:27;:25;:27::i;:48::-;:52;;:66::i;:::-;29290:88;;29428:21;29469:14;:12;:14::i;:::-;-1:-1:-1;;;;;29452:53:0;;29506:12;29452:67;;;;;;;;;;;;;-1:-1:-1;;;;;29452:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29452:67:0;;-1:-1:-1;29537:30:0;:11;29452:67;29537:15;:30::i;:::-;29530:37;;;;29182:393;:::o;26771:30::-;;;;:::o;29852:394::-;15486:1;16092:7;;:19;;16084:63;;;;;-1:-1:-1;;;16084:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15486:1;16225:7;:18;;;29927:10:::1;::::0;16225:7;34172:27:::1;:25;:27::i;:::-;34210:20;:40:::0;;;34122:77;;-1:-1:-1;34122:77:0;-1:-1:-1;34265:14:0;;34261:328:::1;;34518:14;:12;:14::i;:::-;-1:-1:-1::0;;;;;34501:49:0::1;;34559:4;34566:10;34501:76;;;;;;;;;;;;;-1:-1:-1::0;;;;;34501:76:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;34261:328;34618:27;:25;:27::i;:::-;34600:15;:45:::0;-1:-1:-1;;;;;34660:21:0;::::1;::::0;34656:157:::1;;34717:15;34724:7;34717:6;:15::i;:::-;-1:-1:-1::0;;;;;34698:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:34;;;;34781:20:::1;::::0;34747:22:::1;:31:::0;;;;;;:54;34656:157:::1;29967:1:::2;29958:6;:10;29950:37;;;::::0;;-1:-1:-1;;;29950:37:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;30013:12;::::0;:24:::2;::::0;30030:6;30013:16:::2;:24::i;:::-;29998:12;:39:::0;30082:10:::2;30072:21;::::0;;;:9:::2;:21;::::0;;;;;:33:::2;::::0;30098:6;30072:25:::2;:33::i;:::-;30058:10;30048:21;::::0;;;:9:::2;:21;::::0;;;;:57;;;;30116:80:::2;::::0;30148:12:::2;::::0;30182:4:::2;30189:6:::0;30116:31:::2;:80::i;:::-;30212:26;::::0;;;;;;;30219:10:::2;::::0;30212:26:::2;::::0;;;;;::::2;::::0;;::::2;-1:-1:-1::0;;15442:1:0;16404:7;:22;-1:-1:-1;;29852:394:0:o;28035:114::-;28129:12;28035:114;:::o;26730:32::-;;;:::o;28157:286::-;28213:7;28237:12;;28253:1;28237:17;28233:77;;;-1:-1:-1;28278:20:0;;28271:27;;28233:77;28340:95;28383:37;28407:12;;28383:19;28397:4;28383:9;:7;:9::i;28340:95::-;28320:115;;28157:286;:::o;26595:46::-;;;:::o;31132:413::-;15486:1;16092:7;;:19;;16084:63;;;;;-1:-1:-1;;;16084:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15486:1;16225:7;:18;;;31230:10:::1;31220:21:::0;;:9:::1;:21;::::0;;;;;31260:10;31252:40:::1;;;::::0;;-1:-1:-1;;;31252:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31318:12;::::0;:24:::1;::::0;31335:6;31318:16:::1;:24::i;:::-;31303:12;:39:::0;31363:10:::1;31377:1;31353:21:::0;;;:9:::1;:21;::::0;;;;;;;:25;;;31389:7:::1;:19:::0;;;;;:23;31423:61:::1;::::0;31451:12:::1;::::0;31477:6;31423:27:::1;:61::i;:::-;31500:37;::::0;;;;;;;31518:10:::1;::::0;31500:37:::1;::::0;;;;;::::1;::::0;;::::1;-1:-1:-1::0;15442:1:0;16404:7;:22;31132:413::o;26808:35::-;;;;:::o;32839:106::-;32903:10;32893:21;;;;:9;:21;;;;;;32884:31;;:8;:31::i;:::-;32926:11;:9;:11::i;:::-;32839:106::o;30254:417::-;15486:1;16092:7;;:19;;16084:63;;;;;-1:-1:-1;;;16084:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15486:1;16225:7;:18;;;30352:5;;16225:7;34172:27:::1;:25;:27::i;:::-;34210:20;:40:::0;;;34122:77;;-1:-1:-1;34122:77:0;-1:-1:-1;34265:14:0;;34261:328:::1;;34518:14;:12;:14::i;:::-;-1:-1:-1::0;;;;;34501:49:0::1;;34559:4;34566:10;34501:76;;;;;;;;;;;;;-1:-1:-1::0;;;;;34501:76:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;34261:328;34618:27;:25;:27::i;:::-;34600:15;:45:::0;-1:-1:-1;;;;;34660:21:0;::::1;::::0;34656:157:::1;;34717:15;34724:7;34717:6;:15::i;:::-;-1:-1:-1::0;;;;;34698:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:34;;;;34781:20:::1;::::0;34747:22:::1;:31:::0;;;;;;:54;34656:157:::1;30387:1:::2;30378:6;:10;30370:37;;;::::0;;-1:-1:-1;;;30370:37:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;30433:12;::::0;:24:::2;::::0;30450:6;30433:16:::2;:24::i;:::-;30418:12;:39:::0;-1:-1:-1;;;;;30487:16:0;::::2;;::::0;;;:9:::2;:16;::::0;;;;;:28:::2;::::0;30508:6;30487:20:::2;:28::i;:::-;-1:-1:-1::0;;;;;30468:16:0;::::2;;::::0;;;:9:::2;:16;::::0;;;;:47;30526:80:::2;30558:12;30572:10;30592:4;30599:6:::0;30526:31:::2;:80::i;:::-;30622:41;::::0;;;;;;;-1:-1:-1;;;;;30622:41:0;::::2;::::0;30637:10:::2;::::0;30622:41:::2;::::0;;;;::::2;::::0;;::::2;-1:-1:-1::0;;15442:1:0;16404:7;:22;-1:-1:-1;;;30254:417:0:o;22114:158::-;22172:7;22205:1;22200;:6;;22192:49;;;;;-1:-1:-1;;;22192:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22259:5:0;;;22114:158::o;22531:220::-;22589:7;22613:6;22609:20;;-1:-1:-1;22628:1:0;22621:8;;22609:20;22652:5;;;22656:1;22652;:5;:1;22676:5;;;;;:10;22668:56;;;;-1:-1:-1;;;22668:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22742:1;22531:220;-1:-1:-1;;;22531:220:0:o;23229:153::-;23287:7;23319:1;23315;:5;23307:44;;;;;-1:-1:-1;;;23307:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23373:1;23369;:5;;;;;;;23229:153;-1:-1:-1;;;23229:153:0:o;21652:179::-;21710:7;21742:5;;;21766:6;;;;21758:46;;;;;-1:-1:-1;;;21758:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;28451:557;28511:7;28520;28544:12;;28560:1;28544:17;28540:246;;;-1:-1:-1;;28750:20:0;;28772:1;28742:32;;28540:246;28796:16;28815:9;:7;:9::i;:::-;28796:28;;28835:23;28861:94;28904:36;28927:12;;28904:18;28917:4;28904:8;:12;;:18;;;;:::i;28861:94::-;28835:120;-1:-1:-1;28991:8:0;;-1:-1:-1;;28451:557:0;;;:::o;17878:361::-;18073:45;;;-1:-1:-1;;;;;18073:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18062:57;;;;18027:12;;18041:17;;18062:10;;;;18073:45;18062:57;;;18073:45;18062:57;;18073:45;18062:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18026:93;;;;18138:7;:57;;;;-1:-1:-1;18150:11:0;;:16;;:44;;;18181:4;18170:24;;;;;;;;;;;;;;;-1:-1:-1;18170:24:0;18150:44;18130:101;;;;;-1:-1:-1;;;18130:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17878:361;;;;;:::o;33559:355::-;33634:7;33654:15;33679:12;-1:-1:-1;;;;;33672:30:0;;33711:4;33672:45;;;;;;;;;;;;;-1:-1:-1;;;;;33672:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33672:45:0;;-1:-1:-1;33732:17:0;;;33728:67;;;33776:7;33766:17;;33728:67;33805:55;33833:12;33847:3;33852:7;33805:27;:55::i;:::-;-1:-1:-1;33899:7:0;;33559:355;-1:-1:-1;;33559:355:0:o;18247:402::-;18472:51;;;-1:-1:-1;;;;;18472:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18461:63;;;;18426:12;;18440:17;;18461:10;;;;18472:51;18461:63;;;18472:51;18461:63;;18472:51;18461:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18425:99;;;;18543:7;:57;;;;-1:-1:-1;18555:11:0;;:16;;:44;;;18586:4;18575:24;;;;;;;;;;;;;;;-1:-1:-1;18575:24:0;18555:44;18535:106;;;;-1:-1:-1;;;18535:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18247:402;;;;;;:::o
Swarm Source
ipfs://4b3349e3c77c35ff05f741b909d7bdb1341430b1264c4231674cf734ce18f844
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.00391 | 311.6625 | $1.22 |
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.