The fee structure defines three tiers based on price thresholds, with the highest tier activating above 10,000 USDC. The Listing struct stores price as uint32, and list() accepts uint32 _price.
uint32 has a maximum value of 4,294,967,295, which at USDC's 6-decimal precision equals ~4,294 USDC. Any NFT priced above this silently truncates when cast to uint32. Additionally, the MID and HIGH fee thresholds (10,000 USDC = 10,000,000,000 in base units) exceed uint32 max, making the 5% high fee tier permanently unreachable and the 3% mid fee tier partially unreachable.
Likelihood:
Any NFT priced above ~4,294 USDC triggers truncation silently. Solidity does not revert on uint narrowing in explicit casts.
The HIGH_FEE tier is never applied, regardless of price, permanently reducing protocol revenue.
Impact:
Sellers believe they listed at a high price; buyers pay the truncated (much lower) price, and the seller loses funds.
Protocol collects lower fees than designed, and the 5% tier is dead code.
A seller intends to list at 5,000 USDC (5_000_000_000 base units). Passing this as uint32 silently wraps it to ~705 USDC. The stored price is far below the intended amount.
Change the price field and all related function parameters to uint256 to match the full USDC amount space and make all fee tiers reachable.
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.