LST / LRT mint · withdraw-request · claim · cancel
GET/v1/actions/vaults/lst
Build calldata for LST / LRT (and Lagoon) actions — mint, withdraw-request, claim, and cancel — via the unified LST dispatchers. The protocol is resolved from the calldata-sdk registry by (chainId, shareToken), or forced with kind= (required for Lagoon — kind=lagoon&mode=sync|async — and any unregistered vault).
Deposits also work through the unified /v1/actions/vaults/deposit — pass the LST share token as
vaultand it routes here automatically (no need to know it's an LST). This endpoint stays as the explicit LST route and is the home for the exit-side actions (request-withdraw/claim/cancel), which the generic deposit endpoint does not cover.
How an integrator knows what to pay with (acceptedInputs)
LSTs are not uniform ERC-4626 vaults — each protocol accepts a different set of pay assets (native ETH, an unwrapped sibling like stETH/eETH, or specific ERC-20s) and some paths require extra slippage/intermediate options. Rather than hard-coding this, fetch the vault data first and let it drive the request:
GET /v1/data/vaults?chainId=…&providers=lst→ each LST carries aproviderMetablock:isMintable—false⇒ no on-chain mint (e.g. cbETH); don't call this endpoint.mintContract— the deposit target.exchangeRate/convertToShares— to compute expected output and aminOut.acceptedInputs[]— the machine-readable accept-set (see below).
- Pick the
acceptedInputsentry whoseassetmatches what the user holds. - Call this endpoint with
action=deposit,payAsset=<that asset>, and the entry'sneeds[]supplied as query params.
acceptedInputs[] entry shape
| field | meaning |
|---|---|
asset | "native" (pay with the chain coin → pass payAsset=0x000…000) or a lowercased ERC-20 address to pass as payAsset. |
symbol | optional UI hint (e.g. stETH). |
mode | direct (single call) · wrap (approve + wrap a base LST the user already holds) · submit-wrap (native → base → wrapped; needs the realised base amount). |
needs | option keys the caller must pass for this path (e.g. ["minMETHAmount"], ["eEthAmount"], ["stEthAmount"]). Absent ⇒ none. |
Example — wstETH advertises three paths:
"acceptedInputs": [
{ "asset": "native", "mode": "direct" },
{ "asset": "0xae7ab9…", "symbol": "stETH", "mode": "wrap" },
{ "asset": "native", "mode": "submit-wrap", "needs": ["stEthAmount"] }
]
- Pay with ETH →
payAsset=0x000…000(one-stepreceive()). - Pay with stETH you already hold →
payAsset=0xae7ab9…(approve + wrap).
Multi-step results
wrap / submit-wrap paths produce multiple ordered transactions. The response's actions.transactions[] is the sequence to execute in order, and actions.permissions[] carries any ERC-20 approvals to run first. Single-step mints return one transaction and (for native) no permissions. Always iterate transactions[]; never assume a single tx.
Slippage / required options
Paths whose needs includes a min-out (minMETHAmount, minRSETHAmountExpected, …) require the caller to compute the floor from the data's exchangeRate and pass it. Native one-step mints (stETH, ETHx, ezETH, ynETH, pufETH, wstETH-receive) need nothing beyond amount.
Actions
deposit— mint.amountrequired;payAsset(default native); path options peracceptedInputs[].needs.request-withdraw— start an exit (queue/cooldown).amountrequired;inputAsset?,outputAsset?,owner?.claim— settle a matured exit. Identifier params:requestIds/hints/amounts(CSV),tokenId,id,shares,assets,controller,user,recipient.cancel— cancel a pending request (same identifier params).
Request
Responses
- 200
- 400
Ordered transactions[] (execute in sequence) + ERC-20 permissions[] (execute first). Single-step mints return one transaction.
Validation error