Skip to main content

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 vault and 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:

  1. GET /v1/data/vaults?chainId=…&providers=lst → each LST carries a providerMeta block:
    • isMintablefalse ⇒ no on-chain mint (e.g. cbETH); don't call this endpoint.
    • mintContract — the deposit target.
    • exchangeRate / convertToShares — to compute expected output and a minOut.
    • acceptedInputs[] — the machine-readable accept-set (see below).
  2. Pick the acceptedInputs entry whose asset matches what the user holds.
  3. Call this endpoint with action=deposit, payAsset=<that asset>, and the entry's needs[] supplied as query params.

acceptedInputs[] entry shape

fieldmeaning
asset"native" (pay with the chain coin → pass payAsset=0x000…000) or a lowercased ERC-20 address to pass as payAsset.
symboloptional UI hint (e.g. stETH).
modedirect (single call) · wrap (approve + wrap a base LST the user already holds) · submit-wrap (native → base → wrapped; needs the realised base amount).
needsoption 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-step receive()).
  • 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. amount required; payAsset (default native); path options per acceptedInputs[].needs.
  • request-withdraw — start an exit (queue/cooldown). amount required; 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).
Plain-text reference — GET /v1/actions/vaults/lst

Parameters

ParameterInTypeRequiredDescription
chainIdquerystringyesChain ID See the ChainId schema for the full set of supported chains.
actionquerydeposit, request-withdraw, claim, cancelnoOperation to build.
shareTokenquerystringyesLST share-token address (the token the user wants to mint / exit).
operatorquerystringyesUser wallet executing the action (payer). receiver defaults to it.
receiverquerystringnoRecipient of the minted shares / claimed assets. Defaults to operator.
amountquerystringnoRequired for deposit and request-withdraw. Wei, in the payAsset decimals.
payAssetquerystringnodeposit: what the user pays. Zero address (or 0xEEEE…) = native; otherwise an ERC-20 from the LST's acceptedInputs[].asset. Defaults to native.
kindquerystringnoProtocol override — required for Lagoon (lagoon) and any vault not in the static registry. Otherwise resolved from (chainId, shareToken).
modequerysync, asyncnoLagoon deposit mode.
minOutqueryintegernoGeneric slippage floor (wei) where the protocol path accepts one. For protocol-specific names see the LST acceptedInputs[].needs.
referralquerystringnoOptional referral address (protocols that support it).
stEthAmountqueryintegernowstETH submit-wrap path: the realised stETH amount (read stETH.balanceOf after the submit leg).
eEthAmountqueryintegernoweETH submit-wrap path: the realised eETH amount (read after the deposit leg).
vaultquerystringnoStakeWise per-vault target (and other per-vault protocols).
poolIdquerystringnoSolv pool selector.
validatorGroupquerystringnoStakedCelo (stCELO) deposit: validator group to vote for — a changeStrategy(group) step is prepended (account-wide). Auto-selected when omitted and the caller is on the (reverting) default strategy; zero address forces the default.
rewardVaultquerystringnoBeraPaw reward-vault target.
stakingTokenquerystringnoBearn staking-token target.
inputAssetquerystringnorequest-withdraw: asset being burned, when the protocol needs it disambiguated.
outputAssetquerystringnorequest-withdraw / claim: desired exit asset, when the protocol supports a choice.
ownerquerystringnorequest-withdraw: position owner, when not operator.
requestIdsquerystringnoclaim/cancel: CSV of withdrawal-request ids.
hintsquerystringnoclaim/cancel: CSV of finalization hints (Lido).
amountsquerystringnoclaim/cancel: CSV of per-request amounts.
tokenIdqueryintegernoclaim/cancel: NFT request id.
idqueryintegernoclaim/cancel: numeric request id.
sharesqueryintegernoclaim: share amount (7540/4626 savings).
assetsqueryintegernoclaim: asset amount.
controllerquerystringnoclaim: 7540 controller, when not receiver.
userquerystringnoclaim/cancel: position user, when not operator.
recipientquerystringnoclaim: payout recipient, when supported.

Response 200

FieldTypeDescription
successTrue
dataobjectInformational data (quotes, simulation results, etc.)
actionsobjectTransaction calldata and approvals. Null for quote-only responses (no account provided).
actions.transactionsobject[]Pre-trade setup transactions (e.g. e-mode switch, collateral enable). Execute these before the main swap. Empty when no setup is needed.
actions.transactions[].tostringTarget contract address
actions.transactions[].datastringEncoded calldata
actions.transactions[].valuestringETH value to send with the transaction
actions.transactions[].descriptionstringHuman-readable label. For alternatives, this is the aggregator name (e.g. "Paraswap"). For transactions, describes the setup action (e.g. "Switch e-mode to 1").
actions.alternativesobject[]DEX aggregator swap transactions sorted by best output (descending). Each entry's description is the aggregator name. The client should pick one to execute. Present on loop action endpoints.
actions.alternatives[].tostringTarget contract address
actions.alternatives[].datastringEncoded calldata
actions.alternatives[].valuestringETH value to send with the transaction
actions.alternatives[].descriptionstringHuman-readable label. For alternatives, this is the aggregator name (e.g. "Paraswap"). For transactions, describes the setup action (e.g. "Switch e-mode to 1").
actions.permissionsobject[]Approval/delegation transactions that must execute before both transactions and alternatives. Includes ERC20 allowances (targeting the composer contract) and lender borrow/withdrawal delegations (targeting the lending protocol contract directly). Filtered against on-chain state so only missing approvals are returned. Null when no approvals are needed.
actions.permissions[].tostringTarget contract address
actions.permissions[].datastringEncoded calldata
actions.permissions[].valuestringETH value
actions.permissions[].descriptionstringHuman-readable description of the approval (e.g. "Approve borrow for AAVE_V3", "Approve ERC20")
actions.permissions[].spenderstringERC-20 approve spender (x-chain permissions). Match it against the selected quote's approvalTarget — several bridges can share one spender, so do not match by description.

Example response

{
"success": true,
"data": {},
"actions": {
"transactions": [
{
"to": "0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2",
"data": "0x617ba037000000000000000000000000c02aaa39b2",
"value": "0",
"description": "string"
}
],
"alternatives": [
{
"to": "0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2",
"data": "0x617ba037000000000000000000000000c02aaa39b2",
"value": "0",
"description": "string"
}
],
"permissions": [
{
"to": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
"data": "0x617ba037000000000000000000000000c02aaa39b2",
"value": "0",
"description": "string",
"spender": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
}
]
}
}

Request

Responses

Ordered transactions[] (execute in sequence) + ERC-20 permissions[] (execute first). Single-step mints return one transaction.