Description:
The Sablier Flow protocol mints NFTs representing streams which can be made transferable. Currently, although the NFT has not been implemented yet, IFlowNFTDescriptor.sol::tokenURI()
suggests only the streamId
and the sablierFlow
contract address will be used in the metadata; critical underlying information such as stream status, rate or balance will not be updated. Additionally, the NFT remains transferrable in non-flowing states. This could lead to users purchasing NFTs representing depleted, void or paused streams on NFT marketplaces without understanding the true state of the stream.
Impact:
NFT marketplaces typically display only NFT metadata, making due diligence harder:
NFT buyers may purchase stream NFTs without understanding the actual value/status of the underlying stream.
Financial loss possible if NFTs are sold at prices not reflecting actual stream status
Trust issues for the protocol if stream NFTs are misused:
It would become social norm to avoid interacting with Flow NFTs, thus rendering the whole NFT functionality useless.
Proof of Concept:
This PoC will be using a voided stream example as this scenario is the most impactful one and can be easily manipulated.
Bad actor creates a new stream through a stream providing service.
Bad actor receives NFT for stream.
Bad actor has voided the stream intentionally immediately.
Bad actor sells NFT to buyer who was unaware of void function for streams.
As the access controls for voiding a stream can be done by the Sender/Recipient/Administrator, multiple different combinations of manipulation attacks could occur e.g the bad actor can create a stream themselves(sender) to themselves(recipient), void and list NFTs repeatedly.
Proof of Code
Create the following test contract in the repo tests/integration folder:
Recommended Mitigation:
Include critical stream information in dynamic NFT metadata format.
Consider making NFTs non-transferable when a stream is paused / depleted / void.
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.