uint32 price type in Listing struct truncates prices above ~4,294 USDC and makes the 5% fee tier permanently unreachableThe NFTDealers protocol implements a progressive fee system with three tiers: 1% for prices ≤ 1,000 USDC, 3% for prices ≤ 10,000 USDC, and 5% for prices above 10,000 USDC. Listing prices are expected to support the full USDC range to enable high-value NFT sales and collect appropriate fees at each tier.
The price field in the Listing struct is declared as uint32, which has a maximum value of 4,294,967,295. With USDC's 6 decimals, this caps any listing price at approximately 4,294 USDC. Since the MID_FEE_THRESHOLD is 10,000 USDC (10,000,000,000) — which exceeds uint32 max — the 5% HIGH_FEE_BPS tier is permanently unreachable. Additionally, any price value above ~4,294 USDC passed to list() or updatePrice() will silently truncate due to the uint32 cast, storing a drastically wrong price.
** Likelihood**:
Any seller listing an NFT priced above ~4,294 USDC will have their price silently truncated. A 5,000 USDC intended price becomes ~705 USDC after uint32 wrapping (5,000,000,000 mod 2^32 = 705,032,704), creating an immediate arbitrage opportunity for buyers.
The protocol's 5% fee tier is dead code from deployment — every single listing, regardless of price, will pay at most 3% fees, reducing protocol revenue on every high-value sale permanently.
Impact:
Sellers lose funds directly through silent price truncation — an NFT intended at 5,000 USDC gets listed at ~705 USDC, an 86% loss that a bot will snipe instantly.
The protocol permanently loses revenue from the 5% fee tier. All sales above 1,000 USDC pay 3% instead of the intended 5% for high-value transactions, compounding revenue loss over the protocol's lifetime.
Proof of Concept
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.