Summary
FeeCollector::#L115
mapping(address => uint256) private lastClaimTime;
FeeCollector::#L555-L557
function _updateLastClaimTime(address user) internal {
lastClaimTime[user] = block.timestamp;
}
Neither the storage nor the internal function is used.
Vulnerability Details
Given the storage’s name, it should be updated when a user calls claimRewards
, but it is never updated in claimRewards
.
FeeCollector::L199-213
function claimRewards(address user) external override nonReentrant whenNotPaused returns (uint256) {
if (user == address(0)) revert InvalidAddress();
uint256 pendingReward = _calculatePendingRewards(user);
if (pendingReward == 0) revert InsufficientBalance();
userRewards[user] = totalDistributed;
raacToken.safeTransfer(user, pendingReward);
emit RewardClaimed(user, pendingReward);
return pendingReward;
}
Impact
Missing tracking of the user's last claim time.
Tools Used
Manual Review
Recommendations
function claimRewards(address user) external override nonReentrant whenNotPaused returns (uint256) {
if (user == address(0)) revert InvalidAddress();
uint256 pendingReward = _calculatePendingRewards(user);
if (pendingReward == 0) revert InsufficientBalance();
// Reset user rewards before transfer
userRewards[user] = totalDistributed;
+ _updateLastClaimTime(user);
// Transfer rewards
raacToken.safeTransfer(user, pendingReward);
emit RewardClaimed(user, pendingReward);
return pendingReward;
}