Streamflow Vesting: How to Claim Unlocked Tokens You Forgot About
Vesting on Streamflow unlocks tokens over time, but delivery isn't automatic. Team members, contributors, and DAO grantees frequently leave months of unlocks sitting in escrow.
Streamflow is the default token vesting protocol on Solana. If you've received a grant from a DAO, a token allocation as a contributor, or advisor tokens as part of a fundraise, the tokens are almost certainly locked in a Streamflow contract with a linear or cliff-based unlock schedule.
Vesting protocols exist because token grants have to survive both time and trust. A team can't hand a contributor a lump sum of tokens the day they join — the tokens have to unlock gradually to align incentives. Streamflow standardized that logic on Solana. The recipient's wallet is baked into the contract, the schedule is enforced on-chain, and neither side can rewrite the terms after deployment.
Unlocking is not withdrawing
Here's the trap: the schedule unlocks tokens continuously (or at cliff dates), but the tokens don't move. They sit in the escrow account until the recipient signs a withdraw instruction. Miss a month of maintenance and the unlocked tokens just accumulate.
For active traders and full-time DeFi users this rarely matters — they check weekly. For everyone else, we regularly see wallets with six or nine months of unclaimed unlocks. In one case we audited a grantee who had 41,000 USDC-equivalent of unlocked tokens sitting in escrow, six months untouched.
There is a specific pattern where this hits hardest: contributors who received grants from projects that later became inactive or rebranded. The team stops posting reminders. The Discord goes quiet. The recipient assumes the tokens are worthless (they often are), and stops checking. If the token later recovers value — even a fraction of its original price — the accumulated unlocks can be a meaningful sum. We've seen wallets recover four-figure USD amounts from grants that were considered dead a year prior.
Finding your streams
Streamflow contracts are indexed by recipient. Query the Streamflow program (strmRqUCoQUgGUan5YhzUZa6KqdzwX5L6FpUxfmKg5m) with a memcmp filter on the recipient pubkey and you get every stream you're on. Each account exposes the unlock schedule, amount withdrawn, and amount still claimable at the current timestamp.
const streams = await connection.getProgramAccounts(
STREAMFLOW_PROGRAM_ID,
{
filters: [
{ memcmp: { offset: RECIPIENT_OFFSET, bytes: walletAddress } }
]
}
);Streamflow's official dashboard does the same query with a nicer UI, and if the stream's sender registered a name for it, you'll see the human-readable label. For unnamed streams you get the raw pubkey and have to infer the source from the token mint. That's often enough — recognizing the mint tells you which project or DAO the grant came from.
The withdraw instruction
Withdrawing is a single instruction per stream. You can batch multiple withdraws into one transaction, which is useful if you're on several streams from the same protocol. The tokens land in your associated token account — which the withdraw instruction can create atomically if it doesn't exist.
Cliff vs linear unlocks
Streamflow supports both cliff (all tokens unlock at a single date) and linear (tokens unlock continuously over a period) schedules, plus combinations of the two — for example a three-month cliff followed by a two-year linear unlock. The withdraw math is identical: the contract computes how much has unlocked by the current timestamp, subtracts what you've already withdrawn, and sends the difference. Whether you claim daily or once a year, the recipient math is the same. What differs is exposure to clawback and to price movements between unlock and claim.
What about the escrow rent?
Streamflow escrow accounts also hold rent — usually 0.003 to 0.005 SOL each. When a stream is fully drained, the escrow can be closed and the rent refunded. Most recipients never do this. If you're on ten completed streams, that's up to 0.05 SOL sitting in dead escrow accounts.
The escrow-close instruction is separate from withdraw and has its own preconditions: the stream must be fully vested and fully withdrawn. If any tokens remain unclaimed, close fails. In practice we run both in the same transaction: withdraw everything, then close the escrow, and the rent lands in the same block as the final token withdrawal.
Other vesting protocols
Streamflow is the largest but not the only vesting protocol on Solana. Jupiter's Lock, Meteora Vault, and Bonfida's Token Locker all handle vesting for specific ecosystems. The mechanics are similar — an escrow account, a schedule, a withdraw instruction — but the program IDs and account layouts differ. A complete recovery scan has to know all of them.
WalletSweep checks both dimensions when it scans your wallet: unclaimed token unlocks (the big number) and closable escrow rent (the small one). Both go into a single recovery transaction, across every vesting protocol we support.
Run the scan on your own wallet
WalletSweep finds every category above in one pass and closes them in a single signed transaction.
Scan my wallet