The BoostController contract allows users to delegate their Curve-style rewards boost to pools via the delegateBoost()
function. However, there is no restriction preventing a user from delegating their boost to multiple recipients simultaneously, effectively reusing the same boost multiple times.
The function delegateBoost() in BoostController assigns boost delegation to a recipient pool in the following line:
This creates a new delegation entry per recipient but does not track the total amount of boost a user has already assigned.
Because of this, any user can call delegateBoost()
multiple times with different to
addresses, overcommitting their boost beyond what they actually have. The system currently only checks delegation per recipient but does not sum all active delegations for a user.
Severity: High
Users can exploit this loophole to delegate their boost to multiple pools at the same time, resulting in inflated rewards across multiple pools.This breaks the intended boost mechanics, leading to unfair distribution of rewards.
Attackers can abuse this to their advantage, increasing their reward share without actually holding the necessary boost allocation.
Manual code review
Implement a total delegation tracking mechanism to ensure that a user cannot delegate more boost than they actually own.
Firstly, add a mapping from user to delegated boost in the contract's state:
Next, modify the delegateBoost
function as follows:
Finally, add the following line to the removeBoostDelegation
function:
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.