From b666576ff64a5cef221142c1612829bb07d4d1b3 Mon Sep 17 00:00:00 2001 From: Tom Wade Date: Fri, 18 Nov 2022 16:46:44 +0000 Subject: [PATCH 1/6] Add Deposit and Withdraw event --- contracts/solidity/NFTXLPStaking.sol | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/contracts/solidity/NFTXLPStaking.sol b/contracts/solidity/NFTXLPStaking.sol index 17bc2973..bbc8cd17 100644 --- a/contracts/solidity/NFTXLPStaking.sol +++ b/contracts/solidity/NFTXLPStaking.sol @@ -30,6 +30,9 @@ contract NFTXLPStaking is PausableUpgradeable { event PoolUpdated(uint256 vaultId, address pool); event FeesReceived(uint256 vaultId, uint256 amount); + event Deposit(uint256 vaultId, address stakingToken, uint256 amount, address account, uint256 timelockLength); + event Withdraw(uint256 vaultId, address stakingToken, uint256 amount, address account); + struct StakingPool { address stakingToken; address rewardToken; @@ -130,17 +133,20 @@ contract NFTXLPStaking is PausableUpgradeable { IERC20Upgradeable(pool.stakingToken).safeTransferFrom(msg.sender, address(this), amount); TimelockRewardDistributionTokenImpl xSLPToken = _rewardDistributionTokenAddr(pool); + // Timelock for 2 seconds if they don't already have a timelock to prevent flash loans. + uint256 timelockLength = 2; + // If the user has an existing timelock, check if it is in the future. uint256 currentTimelock = xSLPToken.timelockUntil(msg.sender); if (currentTimelock > block.timestamp) { // Maintain the same timelock if they already have one. // We do this instead of patching in the token because // the xSLP contracts as currently deployed are not upgradeable. - xSLPToken.timelockMint(msg.sender, amount, currentTimelock-block.timestamp); - } else { - // Timelock for 2 seconds if they don't already have a timelock to prevent flash loans. - xSLPToken.timelockMint(msg.sender, amount, 2); + timelockLength = currentTimelock - block.timestamp; } + + xSLPToken.timelockMint(msg.sender, amount, timelockLength); + emit Deposit(vaultId, pool.stakingToken, amount, msg.sender, timelockLength); } function timelockDepositFor(uint256 vaultId, address account, uint256 amount, uint256 timelockLength) external { @@ -162,7 +168,7 @@ contract NFTXLPStaking is PausableUpgradeable { StakingPool memory pool = vaultStakingInfo[vaultId]; _distributeFees(vaultId); _claimRewards(pool, msg.sender); - _withdraw(pool, balanceOf(vaultId, msg.sender), msg.sender); + _withdraw(vaultId, pool, balanceOf(vaultId, msg.sender), msg.sender); } function emergencyExitAndClaim(address _stakingToken, address _rewardToken) external { @@ -171,14 +177,14 @@ contract NFTXLPStaking is PausableUpgradeable { require(isContract(address(dist)), "Not a pool"); _distributeFees(INFTXVault(_rewardToken).vaultId()); _claimRewards(pool, msg.sender); - _withdraw(pool, dist.balanceOf(msg.sender), msg.sender); + _withdraw(vaultId, pool, dist.balanceOf(msg.sender), msg.sender); } function emergencyExit(address _stakingToken, address _rewardToken) external { StakingPool memory pool = StakingPool(_stakingToken, _rewardToken); TimelockRewardDistributionTokenImpl dist = _rewardDistributionTokenAddr(pool); require(isContract(address(dist)), "Not a pool"); - _withdraw(pool, dist.balanceOf(msg.sender), msg.sender); + _withdraw(vaultId, pool, dist.balanceOf(msg.sender), msg.sender); } // function emergencyMigrate(uint256 vaultId) external { @@ -216,7 +222,7 @@ contract NFTXLPStaking is PausableUpgradeable { StakingPool memory pool = vaultStakingInfo[vaultId]; _distributeFees(vaultId); _claimRewards(pool, msg.sender); - _withdraw(pool, amount, msg.sender); + _withdraw(vaultId, pool, amount, msg.sender); } function claimRewards(uint256 vaultId) public { @@ -310,10 +316,11 @@ contract NFTXLPStaking is PausableUpgradeable { _rewardDistributionTokenAddr(pool).withdrawReward(account); } - function _withdraw(StakingPool memory pool, uint256 amount, address account) internal { + function _withdraw(uint256 vaultId, StakingPool memory pool, uint256 amount, address account) internal { require(pool.stakingToken != address(0), "LPStaking: Nonexistent pool"); _rewardDistributionTokenAddr(pool).burnFrom(account, amount); IERC20Upgradeable(pool.stakingToken).safeTransfer(account, amount); + emit Withdraw(vaultId, pool.stakingToken, amount, account); } function _deployDividendToken(StakingPool memory pool) internal returns (address) { From 460048e59e06c4029044801e63683ed8dc23f6d6 Mon Sep 17 00:00:00 2001 From: Tom Wade Date: Tue, 22 Nov 2022 22:22:05 +0000 Subject: [PATCH 2/6] Remove updated code --- contracts/solidity/NFTXLPStaking.sol | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/contracts/solidity/NFTXLPStaking.sol b/contracts/solidity/NFTXLPStaking.sol index bbc8cd17..444e8b2b 100644 --- a/contracts/solidity/NFTXLPStaking.sol +++ b/contracts/solidity/NFTXLPStaking.sol @@ -142,10 +142,12 @@ contract NFTXLPStaking is PausableUpgradeable { // Maintain the same timelock if they already have one. // We do this instead of patching in the token because // the xSLP contracts as currently deployed are not upgradeable. - timelockLength = currentTimelock - block.timestamp; + xSLPToken.timelockMint(msg.sender, amount, currentTimelock-block.timestamp); + } else { + // Timelock for 2 seconds if they don't already have a timelock to prevent flash loans. + xSLPToken.timelockMint(msg.sender, amount, 2); } - xSLPToken.timelockMint(msg.sender, amount, timelockLength); emit Deposit(vaultId, pool.stakingToken, amount, msg.sender, timelockLength); } From 159243b3e6f6a31cc461947b46e25cb96b46ac1b Mon Sep 17 00:00:00 2001 From: Tom Wade Date: Tue, 22 Nov 2022 22:22:39 +0000 Subject: [PATCH 3/6] Remove some more code --- contracts/solidity/NFTXLPStaking.sol | 3 --- 1 file changed, 3 deletions(-) diff --git a/contracts/solidity/NFTXLPStaking.sol b/contracts/solidity/NFTXLPStaking.sol index 444e8b2b..32fcb3a4 100644 --- a/contracts/solidity/NFTXLPStaking.sol +++ b/contracts/solidity/NFTXLPStaking.sol @@ -133,9 +133,6 @@ contract NFTXLPStaking is PausableUpgradeable { IERC20Upgradeable(pool.stakingToken).safeTransferFrom(msg.sender, address(this), amount); TimelockRewardDistributionTokenImpl xSLPToken = _rewardDistributionTokenAddr(pool); - // Timelock for 2 seconds if they don't already have a timelock to prevent flash loans. - uint256 timelockLength = 2; - // If the user has an existing timelock, check if it is in the future. uint256 currentTimelock = xSLPToken.timelockUntil(msg.sender); if (currentTimelock > block.timestamp) { From d6a2883cfbac62ffdc6cad2bfd42fa4fa0c8bed3 Mon Sep 17 00:00:00 2001 From: Tom Wade Date: Thu, 24 Nov 2022 17:02:10 +0000 Subject: [PATCH 4/6] Fix compiler issues --- contracts/solidity/NFTXLPStaking.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/solidity/NFTXLPStaking.sol b/contracts/solidity/NFTXLPStaking.sol index 32fcb3a4..fd8a03ee 100644 --- a/contracts/solidity/NFTXLPStaking.sol +++ b/contracts/solidity/NFTXLPStaking.sol @@ -140,12 +140,12 @@ contract NFTXLPStaking is PausableUpgradeable { // We do this instead of patching in the token because // the xSLP contracts as currently deployed are not upgradeable. xSLPToken.timelockMint(msg.sender, amount, currentTimelock-block.timestamp); + emit Deposit(vaultId, pool.stakingToken, amount, msg.sender, currentTimelock-block.timestamp); } else { // Timelock for 2 seconds if they don't already have a timelock to prevent flash loans. xSLPToken.timelockMint(msg.sender, amount, 2); + emit Deposit(vaultId, pool.stakingToken, amount, msg.sender, 2); } - - emit Deposit(vaultId, pool.stakingToken, amount, msg.sender, timelockLength); } function timelockDepositFor(uint256 vaultId, address account, uint256 amount, uint256 timelockLength) external { @@ -176,14 +176,14 @@ contract NFTXLPStaking is PausableUpgradeable { require(isContract(address(dist)), "Not a pool"); _distributeFees(INFTXVault(_rewardToken).vaultId()); _claimRewards(pool, msg.sender); - _withdraw(vaultId, pool, dist.balanceOf(msg.sender), msg.sender); + _withdraw(INFTXVault(_rewardToken).vaultId(), pool, dist.balanceOf(msg.sender), msg.sender); } function emergencyExit(address _stakingToken, address _rewardToken) external { StakingPool memory pool = StakingPool(_stakingToken, _rewardToken); TimelockRewardDistributionTokenImpl dist = _rewardDistributionTokenAddr(pool); require(isContract(address(dist)), "Not a pool"); - _withdraw(vaultId, pool, dist.balanceOf(msg.sender), msg.sender); + _withdraw(INFTXVault(_rewardToken).vaultId(), pool, dist.balanceOf(msg.sender), msg.sender); } // function emergencyMigrate(uint256 vaultId) external { From 15dba4f6e4fb661a54709e86f4dea64ed5a5c291 Mon Sep 17 00:00:00 2001 From: apoorvlathey Date: Mon, 5 Dec 2022 18:31:51 +0530 Subject: [PATCH 5/6] cache timestamp --- contracts/solidity/NFTXLPStaking.sol | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/contracts/solidity/NFTXLPStaking.sol b/contracts/solidity/NFTXLPStaking.sol index fd8a03ee..e2222744 100644 --- a/contracts/solidity/NFTXLPStaking.sol +++ b/contracts/solidity/NFTXLPStaking.sol @@ -139,8 +139,9 @@ contract NFTXLPStaking is PausableUpgradeable { // Maintain the same timelock if they already have one. // We do this instead of patching in the token because // the xSLP contracts as currently deployed are not upgradeable. - xSLPToken.timelockMint(msg.sender, amount, currentTimelock-block.timestamp); - emit Deposit(vaultId, pool.stakingToken, amount, msg.sender, currentTimelock-block.timestamp); + uint256 timestamp = currentTimelock-block.timestamp; + xSLPToken.timelockMint(msg.sender, amount, timestamp); + emit Deposit(vaultId, pool.stakingToken, amount, msg.sender, timestamp); } else { // Timelock for 2 seconds if they don't already have a timelock to prevent flash loans. xSLPToken.timelockMint(msg.sender, amount, 2); From 602a6b50986c94a2218acac2a51cf620fb9c812d Mon Sep 17 00:00:00 2001 From: apoorvlathey Date: Mon, 5 Dec 2022 18:33:01 +0530 Subject: [PATCH 6/6] add Deposit event to timelockDepositFor --- contracts/solidity/NFTXLPStaking.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/solidity/NFTXLPStaking.sol b/contracts/solidity/NFTXLPStaking.sol index e2222744..d3844c40 100644 --- a/contracts/solidity/NFTXLPStaking.sol +++ b/contracts/solidity/NFTXLPStaking.sol @@ -162,6 +162,7 @@ contract NFTXLPStaking is PausableUpgradeable { require(pool.stakingToken != address(0), "LPStaking: Nonexistent pool"); IERC20Upgradeable(pool.stakingToken).safeTransferFrom(msg.sender, address(this), amount); _rewardDistributionTokenAddr(pool).timelockMint(account, amount, timelockLength); + emit Deposit(vaultId, pool.stakingToken, amount, account, timelockLength); } function exit(uint256 vaultId) external {