Skip to content
Open
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 11 additions & 5 deletions contracts/solidity/NFTXLPStaking.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -141,6 +144,8 @@ contract NFTXLPStaking is PausableUpgradeable {
// 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, timelockLength);
}

function timelockDepositFor(uint256 vaultId, address account, uint256 amount, uint256 timelockLength) external {
Expand All @@ -162,7 +167,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 {
Expand All @@ -171,14 +176,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 {
Expand Down Expand Up @@ -216,7 +221,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 {
Expand Down Expand Up @@ -310,10 +315,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) {
Expand Down