Skip to content

Commit a74cfc2

Browse files
committed
refactor(accelerating-distributor): Remove redundant _updateRewards from exit() (#44)
* refactor(accelerating-distributor): Remove redundant _updateRewards from exit() Refactors withdrawRewards() and unstake() to call internal methods _withdrawRewards() and _unstake() so that exit() only calls _updateRewards() once * Update AcceleratingDistributor.sol * Update AcceleratingDistributor.sol * Update AcceleratingDistributor.sol
1 parent 8efd049 commit a74cfc2

File tree

1 file changed

+46
-37
lines changed

1 file changed

+46
-37
lines changed

contracts/AcceleratingDistributor.sol

Lines changed: 46 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -261,25 +261,10 @@ contract AcceleratingDistributor is ReentrancyGuard, Ownable, Multicall {
261261
* @param stakedToken The address of the token to withdraw.
262262
* @param amount The amount of the token to withdraw.
263263
*/
264-
function unstake(address stakedToken, uint256 amount) public nonReentrant onlyInitialized(stakedToken) {
264+
function unstake(address stakedToken, uint256 amount) external nonReentrant onlyInitialized(stakedToken) {
265265
require(amount > 0, "Invalid amount");
266-
267266
_updateReward(stakedToken, msg.sender);
268-
UserDeposit storage userDeposit = stakingTokens[stakedToken].stakingBalances[msg.sender];
269-
270-
// Note: these will revert if underflow occurs, so you can't unstake more than your cumulativeBalance.
271-
userDeposit.cumulativeBalance -= amount;
272-
stakingTokens[stakedToken].cumulativeStaked -= amount;
273-
274-
IERC20(stakedToken).safeTransfer(msg.sender, amount);
275-
276-
emit Unstake(
277-
stakedToken,
278-
msg.sender,
279-
amount,
280-
userDeposit.cumulativeBalance,
281-
stakingTokens[stakedToken].cumulativeStaked
282-
);
267+
_unstake(stakedToken, amount);
283268
}
284269

285270
/**
@@ -288,25 +273,9 @@ contract AcceleratingDistributor is ReentrancyGuard, Ownable, Multicall {
288273
* @dev Calling this method will reset the caller's reward multiplier.
289274
* @param stakedToken The address of the token to get rewards for.
290275
*/
291-
function withdrawReward(address stakedToken) public nonReentrant onlyInitialized(stakedToken) {
276+
function withdrawReward(address stakedToken) external nonReentrant onlyInitialized(stakedToken) {
292277
_updateReward(stakedToken, msg.sender);
293-
UserDeposit storage userDeposit = stakingTokens[stakedToken].stakingBalances[msg.sender];
294-
295-
uint256 rewardsToSend = userDeposit.rewardsOutstanding;
296-
if (rewardsToSend > 0) {
297-
userDeposit.rewardsOutstanding = 0;
298-
userDeposit.averageDepositTime = getCurrentTime();
299-
rewardToken.safeTransfer(msg.sender, rewardsToSend);
300-
}
301-
302-
emit RewardsWithdrawn(
303-
stakedToken,
304-
msg.sender,
305-
rewardsToSend,
306-
stakingTokens[stakedToken].lastUpdateTime,
307-
stakingTokens[stakedToken].rewardPerTokenStored,
308-
userDeposit.rewardsAccumulatedPerToken
309-
);
278+
_withdrawReward(stakedToken);
310279
}
311280

312281
/**
@@ -316,9 +285,10 @@ contract AcceleratingDistributor is ReentrancyGuard, Ownable, Multicall {
316285
* @param stakedToken The address of the token to get rewards for.
317286
*/
318287
function exit(address stakedToken) external onlyInitialized(stakedToken) {
288+
require(stakingTokens[stakedToken].stakingBalances[msg.sender].cumulativeBalance > 0, "Invalid amount");
319289
_updateReward(stakedToken, msg.sender);
320-
unstake(stakedToken, stakingTokens[stakedToken].stakingBalances[msg.sender].cumulativeBalance);
321-
withdrawReward(stakedToken);
290+
_unstake(stakedToken, stakingTokens[stakedToken].stakingBalances[msg.sender].cumulativeBalance);
291+
_withdrawReward(stakedToken);
322292

323293
emit Exit(stakedToken, msg.sender, stakingTokens[stakedToken].cumulativeStaked);
324294
}
@@ -498,4 +468,43 @@ contract AcceleratingDistributor is ReentrancyGuard, Ownable, Multicall {
498468
stakingTokens[stakedToken].cumulativeStaked
499469
);
500470
}
471+
472+
// Decreases user's staked balance by `amount` and returns to user.
473+
function _unstake(address stakedToken, uint256 amount) internal {
474+
UserDeposit storage userDeposit = stakingTokens[stakedToken].stakingBalances[msg.sender];
475+
476+
// Note: these will revert if underflow so you cant unstake more than your cumulativeBalance.
477+
userDeposit.cumulativeBalance -= amount;
478+
stakingTokens[stakedToken].cumulativeStaked -= amount;
479+
480+
IERC20(stakedToken).safeTransfer(msg.sender, amount);
481+
482+
emit Unstake(
483+
stakedToken,
484+
msg.sender,
485+
amount,
486+
userDeposit.cumulativeBalance,
487+
stakingTokens[stakedToken].cumulativeStaked
488+
);
489+
}
490+
491+
function _withdrawReward(address stakedToken) internal {
492+
UserDeposit storage userDeposit = stakingTokens[stakedToken].stakingBalances[msg.sender];
493+
494+
uint256 rewardsToSend = userDeposit.rewardsOutstanding;
495+
if (rewardsToSend > 0) {
496+
userDeposit.rewardsOutstanding = 0;
497+
userDeposit.averageDepositTime = getCurrentTime();
498+
rewardToken.safeTransfer(msg.sender, rewardsToSend);
499+
}
500+
501+
emit RewardsWithdrawn(
502+
stakedToken,
503+
msg.sender,
504+
rewardsToSend,
505+
stakingTokens[stakedToken].lastUpdateTime,
506+
stakingTokens[stakedToken].rewardPerTokenStored,
507+
userDeposit.rewardsAccumulatedPerToken
508+
);
509+
}
501510
}

0 commit comments

Comments
 (0)