In the GaugeController
contract's gauge weight update mechanism, allowing users to disproportionately
influence gauge weights beyond their actual voting power. This flaw stems from the lack of validation on cumulative user votes across multiple gauges, enabling a single voter to artificially inflate the total system weight and manipulate reward distribution.
The _updateGaugeWeight
function calculates gauge weights using the following logic:
Key Issue:
Users can allocate maximum weight (10000 basis points) to multiple gauges without constraints. Each full-weight vote contributes votingPower
(user's veRAAC balance) to the gauge's weight. When spread across N gauges, this results in total weight contributions of N * votingPower
, despite the voter only possessing votingPower
tokens.
Attack Scenario:
Attacker holds 100 veRAAC tokens
Votes 100% weight on 10 different gauges
Each gauge receives 100 * 10000/10000 = 100
weight
Total system weight increases by 10 * 100 = 1000
(10x amplification of actual voting power)
This breaks the fundamental 1:1 relationship between veToken holdings and voting influence, violating the system's design assumptions.
Reward Distribution Manipulation: Attackers can skew emissions toward specific gauges
System Weight Inflation: Artificial inflation of total weights disrupts reward calculations
Manual Review
Implement vote weight validation:
This ensures the sum of a user's votes across all gauges never exceeds 100% (10000 basis points), preserving the 1:1 voting power relationship.
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.