In the GaugeController.sol
, user can move their weights between gauges as often as they like, with no vote delay at all, allowing them to manipulate reward distribution.
The GaugeController
implements a Curve-style gauge voting and reward distribution system, where users vote with their veRAACToken to allocate weights to gauges. These weights determine the emission rates for each gauge. The functionality is implemented in the vote
function of the GaugeController.sol
contract as follows:
As we can see, users can assign a certain weight to a specific gauge. Currently, there is no delay in how often users can reassign their votes. This oversight allows them to manipulate the reward distribution by assigning their weights to a specific pool right before the distribution, gaining a larger share of rewards. After the rewards are distributed, they can switch the votes back to another pool and repeat the process.
In Curve there is a delay of 10 days where user can change their voting weight. By looking at the contract GaugeController.sol
, among others, there are following constants and variable defined:
However, they are never used to check whether the period since the last vote has passed.
Medium – Although the likelihood is high, the impact is medium since it involves leveraging the ability to switch weights to gain more rewards (i.e., manipulating the reward distribution mechanism to one's advantage)
Manual review
Utilize the lastVoteTime
mapping to store the time of the vote and check it against the VOTE_DELAY
when calling the vote
function
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.