In the FeeCollector contract, fee types 6 (Swap Tax) and 7 (NFT Royalties) are initialized with shares that don't sum to 100% (10000 basis points), but the updateFeeType
function enforces a 100% total requirement. This creates a permanent lock where these fee types can never be updated.
The FeeCollector contract manages different types of fees (0-7) where each fee type has four share components:
veRAACShare
burnShare
repairShare
treasuryShare
In _initializeFeeTypes(), fee types 6 and 7 are initialized as:
However, the updateFeeType function has a strict requirement:
This creates a paradox:
The initial values sum to 2000 (20%)
Any attempt to update must sum to 10000 (100%)
There's no way to transition from 20% to 100% as any update attempt will revert
The inconsistency between initialization and update requirements effectively makes these fee types immutable.
Deploy FeeCollector contract
Check feeTypes[6] - will show shares totaling 2000
Try to update feeType 6 with any new values that sum to 10000
Transaction will revert with InvalidDistributionParams()
Same applies for feeType 7
Medium severity. Fee types 6 & 7 are permanently locked to their initial values, preventing any protocol adjustments to swap tax and NFT royalty distributions. This removes administrative flexibility for these important protocol parameters.
Manual review
Either modify initialization values to sum to 100% or adjust the validation check;
Option 1: Fix initialization values _initializeFeeTypes
Option 2: Remove strict equality check in updateFeeType
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.