The GaugeController contract defines a VOTE_DELAY
constant of 10 days but fails to implement any mechanism to enforce this delay between votes. This oversight allows users to vote multiple times in rapid succession, potentially manipulating gauge weights and reward distributions.
The contract tracks the last vote time for each user in the lastVoteTime
mapping but never enforces the intended delay between votes. While the contract defines constants:
The vote()
function does not check the time elapsed since the user's last vote:
User holds veRAACToken balance giving them voting power
User calls vote() for Gauge A with weight=5000
User immediately calls vote() again for Gauge A with weight=0
User can repeat this process unlimited times without waiting for any delay
This allows rapid manipulation of gauge weights affecting reward distribution
Users can manipulate gauge weights multiple times per block
No cooldown period between votes undermines voting stability
Reward distribution can be manipulated through rapid weight changes
Violates the intended voting delay mechanism stated in the docs
Manual review
Add vote delay enforcement in the vote() function:
Also add the required error:
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.