@@ -261,25 +261,10 @@ contract AcceleratingDistributor is ReentrancyGuard, Ownable, Multicall {
261
261
* @param stakedToken The address of the token to withdraw.
262
262
* @param amount The amount of the token to withdraw.
263
263
*/
264
- function unstake (address stakedToken , uint256 amount ) public nonReentrant onlyInitialized (stakedToken) {
264
+ function unstake (address stakedToken , uint256 amount ) external nonReentrant onlyInitialized (stakedToken) {
265
265
require (amount > 0 , "Invalid amount " );
266
-
267
266
_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);
283
268
}
284
269
285
270
/**
@@ -288,25 +273,9 @@ contract AcceleratingDistributor is ReentrancyGuard, Ownable, Multicall {
288
273
* @dev Calling this method will reset the caller's reward multiplier.
289
274
* @param stakedToken The address of the token to get rewards for.
290
275
*/
291
- function withdrawReward (address stakedToken ) public nonReentrant onlyInitialized (stakedToken) {
276
+ function withdrawReward (address stakedToken ) external nonReentrant onlyInitialized (stakedToken) {
292
277
_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);
310
279
}
311
280
312
281
/**
@@ -316,9 +285,10 @@ contract AcceleratingDistributor is ReentrancyGuard, Ownable, Multicall {
316
285
* @param stakedToken The address of the token to get rewards for.
317
286
*/
318
287
function exit (address stakedToken ) external onlyInitialized (stakedToken) {
288
+ require (stakingTokens[stakedToken].stakingBalances[msg .sender ].cumulativeBalance > 0 , "Invalid amount " );
319
289
_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);
322
292
323
293
emit Exit (stakedToken, msg .sender , stakingTokens[stakedToken].cumulativeStaked);
324
294
}
@@ -498,4 +468,43 @@ contract AcceleratingDistributor is ReentrancyGuard, Ownable, Multicall {
498
468
stakingTokens[stakedToken].cumulativeStaked
499
469
);
500
470
}
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
+ }
501
510
}
0 commit comments