SdtRewardReceiver.claimMultipleStaking: rewards will be locked when called with zero sdtRewardCount
Summary
When SdtRewardReceiver.claimMultipleStaking is called with sdtRewardCount as zero, the rewards for the user will be locked in SdtRewardReceiver and cannot be recovered.
Vulnerability Detail
The SdtRewardReceiver.claimMultipleStaking collects rewards from the given staking contracts and transfers the rewards to the msg.sender.
One of the parameters for the function call is sdtRewardCount, which will be used to initiate an array for the _totalSdtClaimable. The array is used to track the reward tokens and their amount for the msg.sender.
For the claimMultipleStaking function to work, the parameter sdtRewardCount should be big enough, so that all the reward tokens for the msg.sender can fit into the _totalSdtClaimable array. For example, if the msg.sender's rewards would be USDC, USDT and DAI, then the sdtRewardCount should be bigger or equal to 3, otherwise the check on the line 180 will revert.
However, if the parameter sdtRewardCount is zero, the loop from line 158 to 185 will not happen at all, therefore the check for on the line 180 will not be triggered.
As the result, the _totalSdtClaimable is zero length array and no rewards will be transferred to the msg.sender, even though all the rewards will be marked as claimed by calling sdtStaking.claimCvgSdtMultiple in the line 144. The user cannot recover the locked rewards.
If a user calls SdtRewardReceiver.claimMultipleStaking with the call parameter sdtRewardCount as zero, the rewards for the call will be locked in the SdtRewardReceiver and cannot be recovered.
lemonmon
medium
SdtRewardReceiver.claimMultipleStaking
: rewards will be locked when called with zerosdtRewardCount
Summary
When
SdtRewardReceiver.claimMultipleStaking
is called withsdtRewardCount
as zero, the rewards for the user will be locked inSdtRewardReceiver
and cannot be recovered.Vulnerability Detail
The
SdtRewardReceiver.claimMultipleStaking
collects rewards from the given staking contracts and transfers the rewards to the msg.sender. One of the parameters for the function call issdtRewardCount
, which will be used to initiate an array for the_totalSdtClaimable
. The array is used to track the reward tokens and their amount for the msg.sender.For the
claimMultipleStaking
function to work, the parametersdtRewardCount
should be big enough, so that all the reward tokens for the msg.sender can fit into the_totalSdtClaimable
array. For example, if the msg.sender's rewards would be USDC, USDT and DAI, then thesdtRewardCount
should be bigger or equal to 3, otherwise the check on the line 180 will revert.However, if the parameter
sdtRewardCount
is zero, the loop from line 158 to 185 will not happen at all, therefore the check for on the line 180 will not be triggered.https://github.com/sherlock-audit/2023-11-convergence/blob/main/sherlock-cvg/contracts/Staking/StakeDAO/SdtRewardReceiver.sol#L158-L185
As the result, the
_totalSdtClaimable
is zero length array and no rewards will be transferred to the msg.sender, even though all the rewards will be marked as claimed by callingsdtStaking.claimCvgSdtMultiple
in the line 144. The user cannot recover the locked rewards.https://github.com/sherlock-audit/2023-11-convergence/blob/main/sherlock-cvg/contracts/Staking/StakeDAO/SdtRewardReceiver.sol#L144-L147
Impact
If a user calls
SdtRewardReceiver.claimMultipleStaking
with the call parametersdtRewardCount
as zero, the rewards for the call will be locked in theSdtRewardReceiver
and cannot be recovered.Code Snippet
https://github.com/sherlock-audit/2023-11-convergence/blob/main/sherlock-cvg/contracts/Staking/StakeDAO/SdtRewardReceiver.sol#L158-L185
https://github.com/sherlock-audit/2023-11-convergence/blob/main/sherlock-cvg/contracts/Staking/StakeDAO/SdtRewardReceiver.sol#L144-L147
Tool used
Manual Review
Recommendation
Check whether the call parameter
sdtRewardCount
for the functionSdtRewardReceiver.claimMultipleStaking
is zero. And if it is zero, revert.Duplicate of #152