Stream NFT holders are vulnerable to front-running attacks where stream senders can withdraw all funds just before an NFT purchase transaction, leaving buyers with empty streams.
The _withdraw
function allows stream senders to withdraw any available balance without restrictions, even when the stream NFT is listed for sale. There's no mechanism to lock funds or prevent withdrawals during NFT transfers.
Key code:
Streams can be created with a transferable
option, allowing the sender to list them on NFT marketplaces. However, this setup introduces a risk: before a buyer completes the purchase, the stream’s owner could front-run the transaction by withdrawing all deposited funds, leaving the buyer with an empty stream\
HIGH. Buyers can lose significant funds by purchasing seemingly funded stream NFTs that get drained before transfer completes.
HIGH. The attack requires minimal setup and standard MEV tools can easily monitor and front-run NFT purchase transactions.
Let's do a pseudo code PoC
Add a "locked" state when NFT is listed:
Implement atomic NFT+funds transfers where marketplace handles both NFT and stream balance transfer in single transaction.
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.