Under normal protocol operation, the price a seller sets during list() is the exact amount a buyer pays, and the seller receives that amount minus fees. No precision loss should occur anywhere in this flow.
Both Listing.price and the list() parameter are declared as uint32, which has a maximum value of 4,294,967,295 — approximately 4,294 USDC at six decimal places. The protocol's own test suite already exercises prices of 5,500 USDC and 15,500 USDC, demonstrating that the intended price range far exceeds the uint32 ceiling. When list(tokenId, uint32(5000e6)) is called, Solidity silently discards the high-order bits of the explicit cast, storing a value of approximately 705 USDC instead of 5,000 USDC — with no error, no event, and no revert.
Likelihood:
Any NFT listed above 4,294 USDC will trigger truncation — this is a deterministic outcome, not a probabilistic one.
The protocol's own test cases target 5,500 USDC and 15,500 USDC, confirming high-value listings are intended and expected.
Impact:
A seller listing at 15,500 USDC receives approximately 2,615 USDC — a loss exceeding 83% of expected proceeds, with no indication that anything went wrong.
Protocol fee revenue is proportionally reduced, causing compounding long-term damage to protocol sustainability.
Add this to 2026-03-NFT-dealers/test/NFTDealersTest.t.sol,run forge test --match-test testPoC_H02_PriceOverflowUint32 -vvvv
Widen all price-related fields and parameters from uint32 to uint256 throughout the codebase. No overflow is possible within EVM arithmetic at that size.
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.