Description:
collectUsdcFromSelling(uint256 _listingId) does not mark claims as consumed. The seller for a listing can call the function multiple times because onlySeller(_listingId) remains true and there is no claimed guard/state reset for payout logic.
Impact:
Critical. If the contract has USDC liquidity (from other users/protocol flows), a seller can repeatedly drain funds beyond their legitimate proceeds.
Proof of Concept:
Recommended Mitigation:
Add explicit settlement state and one-time claim enforcement (e.g., proceedsClaimed[listingId]). Mark as claimed before transfer. Separate accounting buckets for seller proceeds and protocol fees.
collateral is not reset to zero after collecting USDC from sold NFT. No accounting for collected USDC
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.