31449 - [SC - Low] BribegetRewardForOwner should not revert if the...
Submitted on May 19th 2024 at 13:39:38 UTC by @OxAnmol for Boost | Alchemix
Report ID: #31449
Report type: Smart Contract
Report severity: Low
Target: https://github.com/alchemix-finance/alchemix-v2-dao/blob/main/src/Voter.sol
Impacts:
Contract fails to deliver promised returns, but doesn't lose value
Description
Brief/Intro
Bribe:getRewardForOwner should not revert if there are no bribe rewards. But it should continue looping.
Vulnerability Details
A bribe contract permits a maximum of 16 reward tokens, and anyone wishing to give a bribe can offer any of these tokens as a reward using the notifyRewardAmount function.
Given these 16 tokens, it's unpredictable how many reward tokens get deposited in one epoch. At times, the bribe contract may involve all 16 tokens as rewards, while other times, only a few may be present.
Users who participate in gauge voting can claim their bribe rewards using the Voter::claimBribes function.
The address[][] memory tokens will typically contain 16 whitelisted tokens due to the confusion discussed previously.
In the getRewardForOwner function, it iterates through all the provided tokens. If it doesn't find a reward, it simply reverts without checking all tokens. Consequently, any remaining token that might have a reward for the user is not accounted for.
For reference please have a look at how Velodrome have done it
https://github.com/velodrome-finance/contracts/blob/888617832644f073f331d6576da3f4bd987be982/contracts/rewards/Reward.sol#L230
https://github.com/velodrome-finance/contracts/blob/888617832644f073f331d6576da3f4bd987be982/contracts/rewards/VotingReward.sol#L23C4-L29C6
Recommendation
The loop should continue if there is no reward earned and distribute all other remaining rewards.
Impact Details
The function will assuredly revert without yielding any bribe reward for the user.
References
https://github.com/alchemix-finance/alchemix-v2-dao/blob/f1007439ad3a32e412468c4c42f62f676822dc1f/src/Bribe.sol#L290
Proof of Concept
paste this test in Voting.t.sol
Last updated
Was this helpful?