Normal behavior: once an NFT is listed for sale, the listing should remain executable until it is either canceled or purchased.
Issue: the protocol does not escrow NFTs when creating a listing. Instead, it only records seller and tokenId in storage.
Because the token remains transferable through inherited ERC721 functions, the seller can invalidate the listing by transferring the NFT to another address outside marketplace flow.
Later, buy() attempts to execute transfer using the recorded seller address:
If the recorded seller no longer owns the NFT, the transfer reverts while the listing remains marked as active.
Likelihood:
Sellers retain full ERC721 transfer rights after listing.
Marketplace state does not track ownership changes after listing creation.
Impact:
Buyers encounter active listings that cannot be executed, degrading trading reliability.
Sellers can grief marketplace flow by creating permanently unbuyable listings.
The PoC shows that a seller can list an NFT, transfer it away using the inherited ERC721 interface, and leave the listing active but unexecutable.
PoC rationale:
The test demonstrates that marketplace state assumes listing executability solely based on isActive, while actual token ownership has diverged.
Listings should either escrow NFTs or enforce ownership validation during lifecycle transitions.
Possible mitigation approaches:
Mitigation rationale:
Ensuring ownership consistency preserves listing executability and prevents marketplace griefing scenarios.
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.