After a listing is sold, the seller calls collectUsdcFromSelling() to receive their sale proceeds.
collateralForMinting[listing.tokenId] — deposited by the original minter — is unconditionally bundled into the seller's payout. Since NFTs can change hands, the seller and original minter are not the same address, causing the minter to permanently lose their locked collateral. Additionally, fees are sent to address(this) instead of owner, leaving them stuck in the contract.
Likelihood:
Every secondary sale triggers this — the collateral theft occurs on every resell where the seller is not the original minter.
The original minter has no way to recover their collateral once paid out to the seller.
Impact:
Original minters permanently lose their locked collateral on every resell.
Protocol fees are stuck in the contract and unwithdrawable by the owner.
Bob, Charlie, and Alice each mint an NFT, locking 20 USDC collateral each. Contract holds 60 USDC.
Alice lists her NFT at 100 USDC. Bob buys it — contract now holds 160 USDC.
Alice calls collectUsdcFromSelling(3) and receives 119 USDC (99 sale proceeds + 20 collateral).
Contract is left with 41 USDC — Bob and Charlie's 40 USDC collateral is permanently stuck with no recovery path, and 1 USDC fee is stuck from the self-transfer.
Track the original minter address separately and allow them to claim their collateral independently after the NFT is sold.
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.