When a user locks their RAAC tokens, they immediately receive voting power. This instant increase affects the total supply of voting tokens and skews the distribution of rewards in FeeCollector
. As a result, users can claim rewards that were originally intended for previous holders, effectively inflating their rewards unfairly.
The reward distribution inside FeeCollector
is calculated as follows:
Here, the share
of rewards is calculated based on the current voting power of a user and the total voting power at that moment. However, since totalVotingPower
is updated immediately when voting power is minted, users who lock tokens after rewards have already been distributed can still claim those rewards, even though they were not eligible at the time.
The totalVotingPower
is simply the total supply of voting tokens, which updates instantly when new tokens are locked:
This issue is demonstrated in the veRAACToken.test.js
proof of concept, where a user receives voting power immediately upon locking RAAC tokens:
Since the reward calculation in FeeCollector
uses the current totalVotingPower
and userVotingPower
, a user who locks tokens after a reward distribution can still claim a portion of the past rewards, which inflates their reward earnings unfairly.
Users can unfairly claim past rewards by locking tokens right before claiming.
Rewards become inflated, leading to incorrect accounting and dilution of rewards for legitimate holders.
totalVotingPower
is immediately inflated, which skews reward distribution calculations.
N/A
Implement checkpoint-based reward distribution where rewards are only claimable for users who had voting power before the reward distribution occurred.
Store a historical snapshot of totalVotingPower
at the time of each reward distribution instead of using the current value.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.