The BoostController::userBoosts mapping dual-purpose usage of the same data structure for both pool-specific boosts and boost delegation tracking creates ambiguous state interpretations, risking miscalculations of user boosts.
The contract employs a nested mapping userBoosts[user][contextAddress] for two fundamentally different purposes without namespace separation:
Pool-Specific Boosts
Used in functions like updateUserBoost() where contextAddress represents a pool address:
Boost Delegations
Used in delegation functions like delegateBoost() where contextAddress represents a recipient address:
When any address serves both as:
A supported pool (via supportedPools mapping)
A boost delegation recipient
The mapping keys collide, causing:
Overwritten Data: Delegation records overwrite pool boost data (or vice versa)
State Corruption: Both systems share the same storage slots despite representing different concepts
Logical Contradictions: Functions expecting pool context receive delegation data and vice versa
Admin adds 0xAAA as supported pool via modifySupportedPool()
User delegates boost to 0xAAA using delegateBoost()
The system now contains:
When updateUserBoost(user, 0xAAA) is called:
Accesses delegation data instead of pool boost data
Corrupts pool boost calculations with delegation parameters
Incorrect boost multipliers lead to wrongful reward distributions
Manual Review
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.