sablier-withdraw-vesting
Sablier Vesting Stream Withdrawal
Overview
Withdraw unlocked tokens from a single Sablier Lockup vesting stream on the user's behalf. The skill discovers the user's streams through the Sablier indexer and then executes withdraw(uint256,address,uint128) against the appropriate SablierLockup contract.
This skill supports the full range of Lockup releases (v1.0 → v4.0). The withdraw function signature is identical across every release — only the contract address, UI alias prefix, and access-control rules differ. Both the contract and alias come back from the indexer on a per-stream basis; the runbook branches on version to apply the correct access rules.
This skill is a coordinator for vesting withdrawal and execution routing.
Arguments
| Argument | Description |
|---|---|
chain_name |
EVM chain where the stream lives (e.g. "Ethereum", "Base", "Polygon"). |
wallet_address |
The user's wallet. Must be the stream's recipient (v1.2+ also allows a third party if to == recipient) or, for v1.0/v1.1 streams, the sender. |
token_symbol |
Token symbol to narrow the search (e.g. "USDC", "SABL"). If omitted, the skill queries the indexer and lists every token the wallet has an active stream in. |
withdraw_amount |
Either all (withdraw everything unlocked so far) or a human-readable amount (e.g. 250.5). |
Workflow
1. Confirm product fit
-
Verify the user wants to withdraw from an existing Sablier vesting stream.
-
If the user wants to create a vesting stream instead, route to
sablier-create-vesting. If that skill is unavailable, recommend installing it with:npx skills add sablier-labs/sablier-skills --skill sablier-create-vesting
2. Check requested features
Stop and call out unsupported requests before selecting an execution path.
- Batch withdrawal across multiple streams is not supported. This skill withdraws from exactly one stream per invocation. If the user asks to "withdraw from all my streams" or "claim everything", tell them you will withdraw one stream at a time and offer to repeat the flow afterwards.
- Access-control rules vary by Lockup version — the runbook enforces them after stream selection:
- v1.0 / v1.1 — only the stream's
sender,recipient, or an approved operator can callwithdraw. If the caller is thesender, the tokens must be sent to therecipient. - v1.2 onward — anyone can call
withdrawas long as the destination (to) is therecipient. Only therecipientor an approved operator can redirect tokens to a third party. - If the user's wallet does not satisfy the rule for the selected stream, stop and explain which address must sign.
- v1.0 / v1.1 — only the stream's
- Withdrawing native tokens (ETH, POL, etc.) is not supported. Sablier streams only hold ERC-20 tokens. If the user mentions "ETH from my stream", they most likely mean WETH — confirm the token symbol before proceeding.
3. Clarify the required inputs
Use the AskUserQuestion tool to fill any missing inputs. Ask only for what is missing — never re-ask for values the user already provided.
- Wallet address. A
0x-prefixed EVM address — case is not enforced; the runbook lowercases it before querying the indexer. This is the address that will sign the withdraw transaction. Ask for this first — both chain and token can be inferred from the indexer once the wallet is known. - Chain name. Optional. If the user does not know which chain, do not send them to an external UI — query the Sablier Streams indexer for every non-depleted stream (as recipient or sender) across all chains, collect the distinct
chainIdvalues, map them to chain names via the Supported Chains table, and offer them asAskUserQuestionoptions. If exactly one chain has streams, auto-select it and tell the user. See references/evm-cli.md § Chain discovery. - Token symbol. Optional. If the user does not know which token, query the indexer for every non-depleted stream on the resolved chain where the wallet is recipient or sender, and offer the distinct token symbols as
AskUserQuestionoptions (see references/evm-cli.md § Stream discovery). - Withdraw amount. Offer two options via
AskUserQuestion:- All unlocked (recommended default) — withdraw every token unlocked so far.
- Custom amount — the user specifies a smaller amount in human units.
Do not guess or silently apply defaults for these parameters. Only proceed once all inputs are confirmed.
4. Validate chain support
- Check whether the resolved chain is listed in the Supported Chains table in the execution runbook.
- If a chain surfaced by the indexer is not in the table, check Sablier Lockup deployments and ask the user for an RPC URL. If still unresolved, stop execution of this skill.
5. Route to execution
Hand off to references/evm-cli.md for stream discovery, selection, preview, confirmation, and broadcast.
Resources
- Sablier Documentation
- EVM Lockup Deployments
- Sablier Indexer API
- Sablier GraphQL Schema
- Sablier Indexers Repo
- Sablier EVM Monorepo
Support
If you encounter any issues or unexpected errors with this skill, please file an issue at sablier-labs/sablier-skills.