Attacker can down votes all gauges weights to 0 and prevents rewards distributions, i.e. breaks GaugeController
functionality
When user votes it's votingPower
equals to the balance of the veRAACToken
that can be freely transfered. Attacker can create multiple users, vote and transfer tokens to the next user and so on. As a result of such voting manipulation attacker can prevent rewards distribution using the following attack path:
vote with small amount of veRAACToken
and big weight
.
increase balance of veRAACToken
and vote with 0 weight
gauge weight will be decreased (link): uint256 newGaugeWeight = oldGaugeWeight - (oldWeight * votingPower / WEIGHT_PRECISION) + (newWeight * votingPower / WEIGHT_PRECISION)
transfer veRAACToken
to next user and repeat gauge downvoting until it's weight will be decreased to 0
gauge with 0 weight is excluded from rewards distribution (link)
Example:
some gauge has weight 1
first vote: attacker votes with veRAACToken
balance 1 and weight 10000, _updateGaugeWeight
(link) will be called with oldWeight = 0, newWeight = 10000, votingPower = 1
, new gauge weight will be
second vote: attacker increases it's veRAACToken
balance to 20000 and votes with weight 0, _updateGaugeWeight
will be called with oldWeight = 1, newWeight = 0, votingPower = 20000
, calculate new gauge weight
Attacker can manipulate rewards distributions to a gauges
Manual code review
Use veRAACToken::getVotingPower
(link) as votingPower
instead of user's veRAACToken
balance.
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.