Open code423n4 opened 1 year ago
thereksfour marked the issue as primary issue
tbrent marked the issue as sponsor confirmed
Mitigation option #2 seems quite good
thereksfour marked the issue as satisfactory
thereksfour marked the issue as selected for report
Lines of code
https://github.com/reserve-protocol/protocol/blob/9ee60f142f9f5c1fe8bc50eef915cf33124a534f/contracts/plugins/assets/erc20/RewardableERC20.sol#L86
Vulnerability details
Impact
Some rewards might be locked inside the contract due to the rounding loss.
Proof of Concept
_claimAndSyncRewards()
claimed the rewards from the staking contract and tracksrewardsPerShare
with the current supply.It uses one as a multiplier and from this setting we know it has the same decimals as
underlying
(thustotalSupply
).My concern is
_claimAndSyncRewards()
is called for each deposit/transfer/withdraw in _beforeTokenTransfer() and it will make the rounding problem more serious.totalSupply = 10**6 with 18 decimals
,rewardToken
has 6 decimals. And total rewards for 1 year are1M rewardToken
for1M totalSupply
._claimAndSyncRewards()
might be called every 1 min due to the frequent user actions.1000000 / 365 / 24 / 60 = 1.9 rewardToken = 1900000 wei
.1900000 * 10**18 / (1000000 * 10**18) = 1
. So users would lose almost 50% of rewards due to the rounding loss and these rewards will be locked inside the contract.Tools Used
Manual Review
Recommended Mitigation Steps
I think there would be 2 mitigation.
_claimAndSyncRewards()
like this.Assessed type
Math