The veRAACToken's voting power calculation exhibits truncation issues that break the expected linear relationship between lock duration and voting power. This violates invariant where voting power should scale proportionally with lock duration. The impact undermines the entire governance weight system.
RAAC's governance system relies on vote-escrowed tokens (veRAACToken) to align long-term incentives. The core principle is simple, the longer you lock your RAAC tokens, the more voting power you receive. This relationship should be perfectly linear, like a straight line on a graph.
The problem appears in how voting power is calculated. On how the veRAACToken contract performs this critical calculation: calculateVeAmount() function
This division operation hides a significant flaw. Like say when Alice locks 1000 RAAC for 400 days, the contract calculates her voting power as (1000 * 400) / 1460. The division truncates any remainder, effectively reducing her actual governance weight.
Means that users systematically receive less voting power than the protocol design intended. The impact is particularly pronounced for:
Community members with smaller holdings
Medium-term locks that should provide proportional voting rights
Strategic voters trying to maximize their governance influence
Think of it like a voting machine that always rounds down your vote weight, it technically works, but subtly undermines the democratic process we're trying to build.
When a real estate fund locks 1000 RAAC for 400 days, their actual governance weight gets truncated through integer division. The impact ripples through the entire dual-gauge system. RWA yields and RAAC emissions both depend on precise voting power calculations.
Looking at the GaugeController.sol integration, we see how this affects real-world protocol governance: vote() function
The vulnerability flow connects through these contracts
The truncation cascades from veRAACToken's calculation through the interface and into the gauge voting system, affecting the entire governance weight mechanism.
The fix needs to be applied in the veRAACToken.sol contract, specifically in the calculateVeAmount function. Is where the root of the truncation issue originates.
We automatically resolve the truncation issues that propagate through IveRAACToken interface and into the GaugeController's voting mechanism. The PRECISION scaling factor ensures accurate voting power representation throughout the entire governance system.
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.