The protocol defines three fee tiers based on sale price: 1% below 1,000 USDC, 3% between 1,000 and 10,000 USDC, and 5% above 10,000 USDC. High-value sales should pay the highest fee rate to generate more revenue for the protocol.
Listing.price is declared as uint32, which has a maximum value of ~4294 USDC (4,294,967,295 with 6 decimals). The MID_FEE_THRESHOLD that triggers the 5% tier is 10,000 USDC. Since no uint32 value can reach 10,000 USDC, the HIGH_FEE_BPS tier is dead code and can never be applied.
Likelihood:
Every listing is constrained to uint32 max (~4294 USDC). No seller can set a price above this, regardless of the NFT's actual value. The 5% fee tier is unreachable on every sale.
The list() function accepts uint32 _price as a parameter, so the truncation happens at the contract interface level — there is no workaround.
Impact:
The protocol loses 2% in fees on every high-value sale. On a ~4294 USDC sale, the fee is 128 USDC (3%) instead of 214 USDC (5%) — a loss of ~85 USDC per sale.
NFTs worth more than ~4294 USDC cannot be listed at their actual value, forcing sellers to use external channels or accept underpriced listings.
The maximum possible listing price is type(uint32).max (~4294 USDC). Calling calculateFees with this value returns the 3% fee (MID_FEE_BPS), not 5% (HIGH_FEE_BPS). The 5% tier requires a price above 10,000 USDC, but no uint32 can represent that value. The HIGH_FEE_BPS branch is dead code that can never execute.
Change Listing.price from uint32 to uint256. This allows listings at any price and makes all fee tiers reachable. The list() parameter type must also be updated to match.
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.