The FeeCollector contract's fee tracking mechanism is completely bypassed due to RAACToken directly transferring fees to the FeeCollector address without invoking the collectFee()
function, resulting in a broken reward distribution system.
The core issue lies in the misalignment between how fees are sent to the FeeCollector and how they are tracked:
In RAACToken.sol, fees are directly transferred to the feeCollector address in the _update() function:
However, the FeeCollector contract expects fees to be tracked via its collectFee() function which updates internal accounting:
Because collectFee()
is never called, the internal fee tracking (CollectedFees struct) remains at zero:
This breaks the entire fee distribution mechanism since distributeCollectedFees() will always revert due to zero tracked fees, also making it impossible for users to claimRewards.
User makes a transfer incurring 1.5% tax (1% swap + 0.5% burn)
RAACToken sends tax directly to feeCollector address
FeeCollector's CollectedFees struct remains at 0 despite having tokens
distributeCollectedFees()
reverts due to totalFees == 0
Users cannot claim rewards as distribution never occurs
The core fee distribution mechanism of the protocol is completely non-functional, preventing users from receiving their entitled rewards.
Manual code review
Fix is not trivial but you can Try Modify RAACToken's _update()
to call FeeCollector's collectFee()
instead of direct transfer or try something else.
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.