The Buy-Now flow allows a bidder to purchase an NFT immediately by sending msg.value >= buyNowPrice.
In the current implementation, the _executeSale function is called before refunding any overpay.
This creates a situation where the sale is finalized (NFT transferred, seller paid, fee collected) before ensuring that the buyer’s overpayment is refunded. If the refund transaction fails (e.g., due to gas issues or malicious fallback), the NFT transfer remains valid, and the buyer may be left with unrecoverable overpayment.
Likelihood:
The issue occurs whenever a user sends msg.value > buyNowPrice.
This is a common scenario since bidders may overpay to guarantee Buy-Now execution.
Refund failures are plausible in case of malicious smart contract bidders or network quirks.
Impact:
The buyer could lose ETH permanently if the refund fails but the sale has already been finalized.
Creates inconsistency between buyer’s expected ETH balance and actual balance post-transaction.
Possible reputational/UX harm for the marketplace.
Buyer calls placeBid with msg.value = buyNowPrice + 1.
_executeSale finalizes the NFT transfer, deducting fee and paying seller.
_payout(buyer, 1) fails (e.g., buyer contract reverts on receiving ETH).
Buyer receives NFT but loses the 1 wei overpay permanently.
Refund overpayment before executing the sale. This ensures the buyer never risks permanent loss of funds:
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.