The protocol uses a version of Sablier that has a vulnerability with cancellable streams, what this means is that streams can be canceled without calling the onStreamCanceled
hook.
You can see more on this issue here https://codehawks.cyfrin.io/c/2024-05-Sablier/s/181
When users staked their Sablier they called the stakeVested
function, this function stakes the NFT and transfers it to the staking contract. This function accepts Sablier streams that are cancellable this means the sender can decide to cancel the stream if they feel the recipient is breaking their agreement. When streams are canceled on Sablier, it calls the onStreamCanceled
function on the current NFT owner address, which is the staking contract for staked Sablier streams. The onStreamCanceled
function unstakes the NFT.
The issue with this is that the stream sender can cancel the stream with just the right amount of gas that is needed to cancel the stream but not enough to run the code in the onStreamCanceled
hook. This means that streams can be canceled, remain staked in the protocol, and still earn rewards.
Canceled Stream will remain staked in the protocol.
Manual Analysis
Don't accept cancellable Sablier streams
Use the latest version of Sablier that mitigate this bug
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.