The collectUsdcFromSelling function is intended to allow a seller to claim their USDC after a successful sale. However, the function does not update the state of the collateral or the listing price once the funds are transferred.
Normal Behavior: After a sale, the seller should be able to call a function once to claim the sale price (minus fees) plus their initial minting collateral.
Specific Issue: The function checks if a listing isActive is false, but it never marks the listing as "claimed" or "settled." Furthermore, it does not zero out the collateralForMinting for that tokenId. Consequently, a seller can call this function repeatedly in a loop to drain the contract's USDC holdings.
Likelihood: High
Any user who successfully sells an NFT or has a listing canceled (which sets isActive to false) can trigger this.
No special conditions are required other than owning a listing that is no longer active.
Impact: High
Total loss of protocol funds (USDC).
The contract can be completely drained by a single malicious seller.
Paste this test function in NFTDealersTest.t.sol
Introduce a claimed status to the Listing struct or delete the listing entirely after withdrawal. Also, ensure the collateral mapping is zeroed out.
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.