The protocol defines three fee tiers: 1% for sales up to 1,000 USDC, 3% for sales up to 10,000 USDC, and 5% for sales above 10,000 USDC.
The price field in the Listing struct is declared as uint32. The maximum value of a uint32 is 4,294,967,295, which at 6 decimal USDC precision corresponds to approximately 4,294 USDC. MID_FEE_THRESHOLD is 10,000e6 = 10,000,000,000, which exceeds the uint32 maximum by more than 2x. It is therefore impossible to set a listing price above ~4,294 USDC, so the HIGH fee tier (5%) is never applied.
Likelihood: High
This applies to every listing created through the protocol. No listing can ever trigger the HIGH fee tier because list() accepts a uint32 price.
Impact: Medium
No user funds are at risk, but the protocol systematically under-collects fees on every sale above 1,000 USDC: it receives 3% instead of the intended maximum of 5%.
The HIGH fee tier and the HIGH_FEE_BPS constant are permanently dead code, making the fee schedule specified in the protocol documentation impossible to achieve.
The test confirms that uint32 max is strictly less than MID_FEE_THRESHOLD, making the HIGH fee branch unreachable at the type level.
The fuzz test below confirms that the fee rate never exceeds 3% (MID tier) for any valid uint32 price by checking that fees are bounded by 3% of the price. If the HIGH tier were reachable, fees could reach 5%.
Change Listing.price from uint32 to uint256 in list() and updatePrice() so that the full fee tier range can be expressed.
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.
The contest is complete and the rewards are being distributed.