The protocol implements a progressive fee system with three tiers: 1% (≤1,000 USDC), 3% (≤10,000 USDC), and 5% (>10,000 USDC). Sellers set listing prices via list() and updatePrice().
The price field in the Listing struct is typed as uint32, capping the maximum possible price at 4,294,967,295 (~4,294 USDC with 6 decimals). HIGH_FEE_THRESHOLD requires a price above 10,000 USDC — which exceeds uint32 max — making the 5% fee tier permanently unreachable by any listing in the protocol.
Likelihood:
Every listing in the protocol is subject to this constraint — there is no code path that allows price to exceed uint32 max, so the 5% tier is unreachable for all users at all times.
The list() and updatePrice() functions both accept uint32 _price, so the truncation occurs at the point of input.
Impact:
The HIGH fee tier (5%) is permanently disabled — the protocol never collects fees at the intended maximum rate.
Sellers can list high-value NFTs at prices up to ~4,294 USDC only, undermining the protocol's stated purpose of supporting a progressive fee structure.
type(uint32).max = 4,294,967,295 — with USDC's 6 decimals, this equals ~4,294 USDC.
MID_FEE_THRESHOLD = 10_000e6 = 10,000,000,000 — this exceeds uint32 max by ~2.3x.
Any listing at the maximum possible price (~4,294 USDC) falls in the MID fee tier (3%), never HIGH (5%).
Change price to uint256 across the struct and all functions that accept it. Since _calculateFees() already operates on uint256, no changes to fee logic are needed — only the input type needs to be widened.
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.