The distributeRevenue function in the GaugeController contract calculates a 20% performance fee but fails to store or distribute it. This oversight results in the loss of the performance fee portion, as it is neither allocated to gauges nor recorded for future use.
In the distributeRevenue function, the protocol intends to split revenue into two parts:
80% to veRAAC holders (distributed immediately to gauges)
20% as a performance fee (presumably for yield products)
However, the code only processes the 80% share (veRAACShare), while the 20% performanceShare is merely emitted in an event. The performanceFees mapping (declared as mapping(address => uint256) public performanceFees) is never updated, leaving the performance fee unaccounted for.
Proof of Concept (PoC):
Assume distributeRevenue is called with amount = 100 ETH.
veRAACShare = 80 ETH is distributed to gauges.
performanceShare = 20 ETH is emitted but not stored or sent anywhere.
The performanceFees mapping remains unchanged, and the 20 ETH is effectively lost.
The 20% performance fee is permanently lost from the protocol’s revenue stream. For example, in a $1M revenue distribution, $200,000 would vanish.
Manual Review
Update the distributeRevenue function to properly handle the performance fee.
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.