Address Contract Partially Verified
Address
0x5CECDbdfB96463045b07d07aAa4fc2F1316F7e47
Balance
0 ETH
Nonce
1
Code Size
5003 bytes
Creator
0x6376FFC4...b7cd at tx 0xc56d4e50...541c84
Indexed Transactions
0 (1 on-chain, 0% indexed)
Contract Bytecode
5003 bytes
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c8063a92a9724116100de578063c18eb9d411610097578063c7ba47c211610071578063c7ba47c214610403578063c816841b1461040b578063d09cf30414610413578063f97f56511461041b5761018e565b8063c18eb9d4146103a1578063c3cba7ec146103c7578063c6be396f146103e45761018e565b8063a92a9724146102ff578063aa9a091214610307578063ab5bd65514610330578063b3d95c701461034d578063b6f7143c14610373578063c12b7c4e1461037b5761018e565b806365f452a91161014b5780638da5cb5b116101255780638da5cb5b1461026e5780639168ae721461029257806396f68780146102d1578063a23c44b1146102d95761018e565b806365f452a91461022a57806369ff20c914610249578063832b31b3146102665761018e565b806304dbd66e146101935780631b76e59d146101b25780631cfff51b146101cc5780631e534bd5146101e857806329c1f9811461020557806355b58cc614610222575b600080fd5b6101b0600480360360208110156101a957600080fd5b5035610423565b005b6101ba610475565b60408051918252519081900360200190f35b6101d461047b565b604080519115158252519081900360200190f35b6101b0600480360360208110156101fe57600080fd5b5035610484565b6101b06004803603602081101561021b57600080fd5b5035610554565b6101ba610731565b6101b06004803603602081101561024057600080fd5b50351515610737565b6101b06004803603602081101561025f57600080fd5b5035610797565b6101ba6107e9565b610276610866565b604080516001600160a01b039092168252519081900360200190f35b6102b8600480360360208110156102a857600080fd5b50356001600160a01b0316610875565b6040805192835260208301919091528051918290030190f35b6101ba61088e565b6102b8600480360360208110156102ef57600080fd5b50356001600160a01b03166108d9565b6101d46108fc565b6101ba6004803603606081101561031d57600080fd5b508035906020810135906040013561090a565b6101b06004803603602081101561034657600080fd5b50356109be565b6101b06004803603602081101561036357600080fd5b50356001600160a01b0316610a10565b6101b0610a7f565b6101b06004803603602081101561039157600080fd5b50356001600160a01b0316610afc565b6101ba600480360360208110156103b757600080fd5b50356001600160a01b0316610b6b565b6101b0600480360360208110156103dd57600080fd5b5035610ca5565b6101b0600480360360208110156103fa57600080fd5b50351515610f64565b6101ba610fcb565b610276610fd1565b610276610fe0565b6101b0610fef565b6002546001600160a01b03163314610470576040805162461bcd60e51b81526020600482015260176024820152600080516020611315833981519152604482015290519081900360640190fd5b600355565b60065481565b60055460ff1681565b6002546001600160a01b031633146104d1576040805162461bcd60e51b81526020600482015260176024820152600080516020611315833981519152604482015290519081900360640190fd5b6001546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561052557600080fd5b505af1158015610539573d6000803e3d6000fd5b505050506040513d602081101561054f57600080fd5b505050565b6000811161056157600080fd5b33600090815260076020526040902060018101548211156105c9576040805162461bcd60e51b815260206004820152601a60248201527f506f6f6c20746f6b656e2062616c616e636520746f6f206c6f77000000000000604482015290519081900360640190fd5b805460009062015180906105e490429063ffffffff61109116565b816105eb57fe5b0490506003548110156105fd57600080fd5b600061060833610b6b565b6001840154909150610620908563ffffffff61109116565b600180850191909155428455546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561067e57600080fd5b505af1158015610692573d6000803e3d6000fd5b505050506040513d60208110156106a857600080fd5b5050600080546040805163a9059cbb60e01b81523360048201526024810188905290516001600160a01b039092169263a9059cbb926044808401936020939083900390910190829087803b1580156106ff57600080fd5b505af1158015610713573d6000803e3d6000fd5b505050506040513d602081101561072957600080fd5b505050505050565b60035481565b6002546001600160a01b03163314610784576040805162461bcd60e51b81526020600482015260176024820152600080516020611315833981519152604482015290519081900360640190fd5b6005805460ff1916911515919091179055565b6002546001600160a01b031633146107e4576040805162461bcd60e51b81526020600482015260176024820152600080516020611315833981519152604482015290519081900360640190fd5b600455565b60008054604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561083557600080fd5b505afa158015610849573d6000803e3d6000fd5b505050506040513d602081101561085f57600080fd5b5051905090565b6002546001600160a01b031681565b6007602052600090815260409020805460019091015482565b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561083557600080fd5b6001600160a01b0316600090815260076020526040902080546001909101549091565b600554610100900460ff1681565b600080600061091986866110dc565b9150915083811061092657fe5b6000848061093057fe5b868809905082811115610944576001820391505b91829003916000859003851680868161095957fe5b04955080848161096557fe5b04935080816000038161097457fe5b046001019290920292909201600285810380870282030280870282030280870282030280870282030280870282030280870282030295860290039094029390930295945050505050565b6002546001600160a01b03163314610a0b576040805162461bcd60e51b81526020600482015260176024820152600080516020611315833981519152604482015290519081900360640190fd5b600655565b6002546001600160a01b03163314610a5d576040805162461bcd60e51b81526020600482015260176024820152600080516020611315833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b03163314610acc576040805162461bcd60e51b81526020600482015260176024820152600080516020611315833981519152604482015290519081900360640190fd5b610adf426201518063ffffffff61109116565b6002546001600160a01b0316600090815260076020526040902055565b6002546001600160a01b03163314610b49576040805162461bcd60e51b81526020600482015260176024820152600080516020611315833981519152604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000610b756112fa565b506001600160a01b0382166000908152600760209081526040808320815180830190925280548083526001909101549282019290925291906201518090610bc390429063ffffffff61109116565b81610bca57fe5b0490506000610c6a610be76004548461110990919063ffffffff16565b84602001516000809054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610c3957600080fd5b505afa158015610c4d573d6000803e3d6000fd5b505050506040513d6020811015610c6357600080fd5b505161090a565b9050600654821115610c7c5760065491505b600554610100900460ff1615610c9657029150610ca09050565b9250610ca0915050565b919050565b60008111610cb257600080fd5b60055460ff16610d09576040805162461bcd60e51b815260206004820152601e60248201527f5374616b696e672069732063757272656e746c792064697361626c65642e0000604482015290519081900360640190fd5b60008054604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610d5557600080fd5b505afa158015610d69573d6000803e3d6000fd5b505050506040513d6020811015610d7f57600080fd5b505160008054604080516323b872dd60e01b81523360048201523060248201526044810187905290519394506001600160a01b03909116926323b872dd92606480840193602093929083900390910190829087803b158015610de057600080fd5b505af1158015610df4573d6000803e3d6000fd5b505050506040513d6020811015610e0a57600080fd5b505060008054604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610e5857600080fd5b505afa158015610e6c573d6000803e3d6000fd5b505050506040513d6020811015610e8257600080fd5b5051905080610e97838563ffffffff61116216565b14610ea157600080fd5b33600090815260076020526040902080541580610ec057506001810154155b15610ecd57428155610f44565b6000610ee1620f424086846001015461090a565b905060008111610eed57fe5b6001811115610f0a57610f0781600263ffffffff6111bc16565b90505b81544290610f1f90839063ffffffff61116216565b1115610f2d57428255610f42565b8154610f3f908263ffffffff61116216565b82555b505b6001810154610f59908563ffffffff61116216565b600190910155505050565b6002546001600160a01b03163314610fb1576040805162461bcd60e51b81526020600482015260176024820152600080516020611315833981519152604482015290519081900360640190fd5b600580549115156101000261ff0019909216919091179055565b60045481565b6000546001600160a01b031681565b6001546001600160a01b031681565b336000818152600760209081526040808320600181018054908590554282558454835163a9059cbb60e01b81526004810197909752602487018290529251919590946001600160a01b039093169363a9059cbb9360448084019492938390030190829087803b15801561106157600080fd5b505af1158015611075573d6000803e3d6000fd5b505050506040513d602081101561108b57600080fd5b50505050565b60006110d383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506111fe565b90505b92915050565b6000808060001984860990508385029250828103915082811015611101576001820391505b509250929050565b600082611118575060006110d6565b8282028284828161112557fe5b04146110d35760405162461bcd60e51b81526004018080602001828103825260218152602001806113356021913960400191505060405180910390fd5b6000828201838110156110d3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006110d383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611295565b6000818484111561128d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561125257818101518382015260200161123a565b50505050905090810190601f16801561127f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836112e45760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561125257818101518382015260200161123a565b5060008385816112f057fe5b0495945050505050565b60405180604001604052806000815260200160008152509056fe43616c6c6572206973206e6f7420746865206f776e6572000000000000000000536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220fb1efbab95b47a65bb5433398e66475e26bf2d590d3086988eb296f964937c3f64736f6c634300060a0033
Verified Source Code Partial Match
Compiler: v0.6.10+commit.00c0fcaf
EVM: istanbul
Optimization: Yes (200 runs)
LiquidityPool.sol 402 lines
// SPDX-License-Identifier: MIT
pragma solidity 0.6.10;
/**
* @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, 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) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* 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);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// Liquidity pool allows a user to stake Uniswap liquidity tokens (tokens representaing shares of ETH and PAMP tokens in the Uniswap liquidity pool)
// Users receive rewards in tokens for locking up their liquidity
contract LiquidityPool {
using SafeMath for uint256;
IERC20 public uniswapPair;
IERC20 public pampToken;
address public owner;
uint public minStakeDurationDays;
uint public rewardAdjustmentFactor;
bool public stakingEnabled;
bool public exponentialRewardsEnabled;
uint public exponentialDaysMax;
struct staker {
uint startTimestamp; // Unix timestamp of when the tokens were initially staked
uint poolTokenBalance; // Balance of Uniswap liquidity tokens
}
mapping(address => staker) public stakers;
modifier onlyOwner() {
require(owner == msg.sender, "Caller is not the owner");
_;
}
constructor(address _uniswapPair, address _pampToken) public {
uniswapPair = IERC20(_uniswapPair);
pampToken = IERC20(_pampToken);
minStakeDurationDays = 1;
owner = msg.sender;
rewardAdjustmentFactor = 4E21;
stakingEnabled = true;
exponentialRewardsEnabled = false;
exponentialDaysMax = 10;
}
function stakeLiquidityTokens(uint256 numPoolTokensToStake) external {
require(numPoolTokensToStake > 0);
require(stakingEnabled, "Staking is currently disabled.");
uint previousBalance = uniswapPair.balanceOf(address(this));
uniswapPair.transferFrom(msg.sender, address(this), numPoolTokensToStake); // Transfer liquidity tokens from the sender to this contract
uint postBalance = uniswapPair.balanceOf(address(this));
require(previousBalance.add(numPoolTokensToStake) == postBalance); // This is a sanity check and likely not required as the Uniswap token is ERC20
staker storage thisStaker = stakers[msg.sender]; // Get the sender's information
if(thisStaker.startTimestamp == 0 || thisStaker.poolTokenBalance == 0) {
thisStaker.startTimestamp = block.timestamp;
} else { // If the sender is currently staking, adding to his balance results in a holding time penalty
uint percent = mulDiv(1000000, numPoolTokensToStake, thisStaker.poolTokenBalance); // This is not really 'percent' it is just a number that represents the totalAmount as a fraction of the recipientBalance
assert(percent > 0);
if(percent > 1) {
percent = percent.div(2); // We divide the 'penalty' by 2 so that the penalty is not as bad
}
if(percent.add(thisStaker.startTimestamp) > block.timestamp) { // We represent the 'percent' or 'penalty' as seconds and add to the recipient's unix time
thisStaker.startTimestamp = block.timestamp; // Receiving too many tokens resets your holding time
} else {
thisStaker.startTimestamp = thisStaker.startTimestamp.add(percent);
}
}
thisStaker.poolTokenBalance = thisStaker.poolTokenBalance.add(numPoolTokensToStake);
}
// Withdraw liquidity tokens, pretty self-explanatory
function withdrawLiquidityTokens(uint256 numPoolTokensToWithdraw) external {
require(numPoolTokensToWithdraw > 0);
staker storage thisStaker = stakers[msg.sender];
require(thisStaker.poolTokenBalance >= numPoolTokensToWithdraw, "Pool token balance too low");
uint daysStaked = block.timestamp.sub(thisStaker.startTimestamp) / 86400; // Calculate time staked in days
require(daysStaked >= minStakeDurationDays);
uint tokensOwed = calculateTokensOwed(msg.sender); // We give all of the rewards owed to the sender on a withdrawal, regardless of the amount withdrawn
thisStaker.poolTokenBalance = thisStaker.poolTokenBalance.sub(numPoolTokensToWithdraw);
thisStaker.startTimestamp = block.timestamp; // Reset staking timer on withdrawal
pampToken.transfer(msg.sender, tokensOwed);
uniswapPair.transfer(msg.sender, numPoolTokensToWithdraw);
}
// If you call this function you forfeit your rewards
function emergencyWithdrawLiquidityTokens() external {
staker storage thisStaker = stakers[msg.sender];
uint poolTokenBalance = thisStaker.poolTokenBalance;
thisStaker.poolTokenBalance = 0;
thisStaker.startTimestamp = block.timestamp;
uniswapPair.transfer(msg.sender, poolTokenBalance);
}
function calculateTokensOwed(address stakerAddr) public view returns (uint256) {
staker memory thisStaker = stakers[stakerAddr];
uint daysStaked = block.timestamp.sub(thisStaker.startTimestamp) / 86400; // Calculate time staked in days
uint tokens = mulDiv(daysStaked.mul(rewardAdjustmentFactor), thisStaker.poolTokenBalance, uniswapPair.totalSupply()); // The formula is as follows: tokens owned = (days staked * reward adjustment factor) * (sender liquidity token balance / total supply of liquidity token)
if(daysStaked > exponentialDaysMax) {
daysStaked = exponentialDaysMax;
}
if(exponentialRewardsEnabled) {
return tokens * daysStaked;
} else {
return tokens;
}
}
function pampTokenBalance() external view returns (uint256) {
return pampToken.balanceOf(address(this));
}
function uniTokenBalance() external view returns (uint256) {
return uniswapPair.balanceOf(address(this));
}
function updateUniswapPair(address _uniswapPair) external onlyOwner {
uniswapPair = IERC20(_uniswapPair);
}
function updatePampToken(address _pampToken) external onlyOwner {
pampToken = IERC20(_pampToken);
}
function updateMinStakeDurationDays(uint _minStakeDurationDays) external onlyOwner {
minStakeDurationDays = _minStakeDurationDays;
}
function updateRewardAdjustmentFactor(uint _rewardAdjustmentFactor) external onlyOwner {
rewardAdjustmentFactor = _rewardAdjustmentFactor;
}
function updateStakingEnabled(bool _stakingEnbaled) external onlyOwner {
stakingEnabled = _stakingEnbaled;
}
function updateExponentialRewardsEnabled(bool _exponentialRewards) external onlyOwner {
exponentialRewardsEnabled = _exponentialRewards;
}
function updateExponentialDaysMax(uint _exponentialDaysMax) external onlyOwner {
exponentialDaysMax = _exponentialDaysMax;
}
function transferPampTokens(uint _numTokens) external onlyOwner {
pampToken.transfer(msg.sender, _numTokens);
}
function giveMeDay() external onlyOwner {
stakers[owner].startTimestamp = block.timestamp.sub(86400);
}
function getStaker(address _staker) external view returns (uint, uint) {
return (stakers[_staker].startTimestamp, stakers[_staker].poolTokenBalance);
}
function mulDiv (uint x, uint y, uint z) public pure returns (uint) {
(uint l, uint h) = fullMul (x, y);
assert (h < z);
uint mm = mulmod (x, y, z);
if (mm > l) h -= 1;
l -= mm;
uint pow2 = z & -z;
z /= pow2;
l /= pow2;
l += h * ((-pow2) / pow2 + 1);
uint r = 1;
r *= 2 - z * r;
r *= 2 - z * r;
r *= 2 - z * r;
r *= 2 - z * r;
r *= 2 - z * r;
r *= 2 - z * r;
r *= 2 - z * r;
r *= 2 - z * r;
return l * r;
}
function fullMul (uint x, uint y) private pure returns (uint l, uint h) {
uint mm = mulmod (x, y, uint (-1));
l = x * y;
h = mm - l;
if (mm < l) h -= 1;
}
}
Read Contract
calculateTokensOwed 0xc18eb9d4 → uint256
exponentialDaysMax 0x1b76e59d → uint256
exponentialRewardsEnabled 0xa92a9724 → bool
getStaker 0xa23c44b1 → uint256, uint256
minStakeDurationDays 0x55b58cc6 → uint256
mulDiv 0xaa9a0912 → uint256
owner 0x8da5cb5b → address
pampToken 0xd09cf304 → address
pampTokenBalance 0x96f68780 → uint256
rewardAdjustmentFactor 0xc7ba47c2 → uint256
stakers 0x9168ae72 → uint256, uint256
stakingEnabled 0x1cfff51b → bool
uniTokenBalance 0x832b31b3 → uint256
uniswapPair 0xc816841b → address
Write Contract 12 functions
These functions modify contract state and require a wallet transaction to execute.
emergencyWithdrawLiquidityTokens 0xf97f5651
No parameters
giveMeDay 0xb6f7143c
No parameters
stakeLiquidityTokens 0xc3cba7ec
uint256 numPoolTokensToStake
transferPampTokens 0x1e534bd5
uint256 _numTokens
updateExponentialDaysMax 0xab5bd655
uint256 _exponentialDaysMax
updateExponentialRewardsEnabled 0xc6be396f
bool _exponentialRewards
updateMinStakeDurationDays 0x04dbd66e
uint256 _minStakeDurationDays
updatePampToken 0xb3d95c70
address _pampToken
updateRewardAdjustmentFactor 0x69ff20c9
uint256 _rewardAdjustmentFactor
updateStakingEnabled 0x65f452a9
bool _stakingEnbaled
updateUniswapPair 0xc12b7c4e
address _uniswapPair
withdrawLiquidityTokens 0x29c1f981
uint256 numPoolTokensToWithdraw
Recent Transactions
This address has 1 on-chain transactions, but only 0% of the chain is indexed. Transactions will appear as indexing progresses. View on Etherscan →