Normal Behavior:
After an NFT is sold, the seller should be able to collect their sale proceeds minus fees, and retrieve their locked collateral. The contract should correctly transfer USDC from its own balance to the seller and accumulate fees separately.
Issue:
In collectUsdcFromSelling(), the contract incorrectly attempts to transfer fees using safeTransfer(address(this), fees), which sends tokens from the contract to itself instead of deducting or accounting properly. This results in incorrect accounting and allows sellers to repeatedly claim funds, draining the contract.
Likelihood:High
The vulnerable function is part of the normal sale flow and is expected to be called by every seller after a sale.
No restrictions prevent repeated calls or misuse once a listing becomes inactive.
Impact: High
Sellers can receive more funds than intended due to incorrect fee handling.
Contract accounting becomes inconsistent, allowing gradual or full draining of USDC held in the contract.
Explanation
After a successful NFT sale, the seller calls collectUsdcFromSelling() to claim their funds.
However, the contract incorrectly transfers the fee to itself instead of properly deducting it from the payout.
Because of this:
The fee is not actually separated or deducted
The seller receives more funds than intended
The contract accounting becomes inconsistent
This allows sellers to repeatedly extract value from the contract.
Explanation
The contract should not transfer fees to itself, since the funds are already held within the contract.
Instead, it should:
Remove the redundant self-transfer
Only transfer the correct net amount to the seller
Ensure fees are properly accounted for
Prevent multiple claims by resetting state
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.