When a seller cancels a listing via cancelListing, the function returns the minting collateral and sets isActive = false, but leaves s_listings[_listingId].price intact.
Since collectUsdcFromSelling only checks !listing.isActive and the price is still stored, a seller can cancel their listing and then call collectUsdcFromSelling to extract price - fees from the contract — funds that no buyer ever deposited.
Likelihood:
This occurs every time a seller cancels a listing and then calls collectUsdcFromSelling — both are normal user-facing functions with no special permissions
Any whitelisted user can exploit this with a single mint + list + cancel + collect sequence
Impact:
Seller steals price - fees USDC per listing with zero net cost (collateral is returned on cancel, then price extracted on collect)
With price = 100 USDC and 1% fee: 99 USDC stolen per cycle, repeatable with each new NFT
Stolen USDC comes from other users' collateral deposits and uncollected sale proceeds
cancelListing must zero the listing price to prevent collectUsdcFromSelling from computing a payout:
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.