The GaugeController
bypasses the FeeCollector
contract when distributing revenue, directly sending funds to Gauges and completely losing the performance fees. This breaks the protocol's fee management system, which is designed to have the FeeCollector
as the central point for managing and distributing all protocol fees to various stakeholders.
The FeeCollector
is designed as the central contract for managing protocol fee collection and distribution to stakeholders including veRAAC holders, treasury, and repair fund. However, the GaugeController's
distributeRevenue
function:
As we can see in the code above:
Bypasses FeeCollector
by directly distributing 80% to Gauges.
Performance fees calculated but never used(should be sent to the FeeCollector
)
Performance fees are not tracked(performanceFees
is not used)
Notice that for the performance fees, there is no way to withdraw those funds, which will lead to permanently loss of funds.
This contradicts the FeeCollector's design which should:
Collect all protocol fees
Manage fee distributions through its configured fee types
Ensure proper splitting between stakeholders
Track all fee collections and distributions
The implementation meets the documentation, putting FeeCollector
in charge of distributing all the collected fees.
20% of all revenue (performance fees) are permanently lost.
Broken fee distribution system:
FeeCollector loses visibility of revenue flows
Fee distributions bypass intended controls and splits
No proper tracking of collected fees
Stakeholders don't receive their intended share of fees
Compromised protocol accounting:
Performance fees are not tracked in performanceFees
mapping
FeeCollector's accounting system becomes unreliable
Manual Review
Ensure all fees go through FeeCollector
.
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.