Skip to main content
Blend’s current public cross-chain surface is quote-driven on deposits and payload-driven on withdrawals. Your application uses:
  • client.deposit.getChains() to discover supported chains
  • client.deposit.getTokens(chainId, eoa?) to discover supported assets and wallet holdings
  • client.deposit.getQuote() to request a deposit quote into the account type’s configured destination Safe
  • client.withdraw.getCalldata() when the user wants to exit funds back out of Blend

The current public model

Cross-chain deposits are exposed through account-scoped API methods, not public adapter classes and not a client-built deposit() action.
const account = await client.safe.account(userEoa);

const tokens = await client.deposit.getTokens(8453);
const walletTokens = await client.deposit.getTokens(8453, userEoa);

const quote = await client.deposit.getQuote({
  chainId: 8453,
  inputAssetAddress: usdcAddress,
  eoa: userEoa,
  accountId: account.accountId,
  amount: "1000000",
});

What the deposit quote does

The quote request tells Blend:
  • which chain the funds originate from
  • which token the user is depositing
  • which EOA is initiating the flow
  • which Blend account should receive the deposit
  • how much value is being moved
Blend then resolves the destination Safe from accountId and returns a provider-backed quote payload.

What withdrawal payloads do

Withdrawal payloads tell your integration how to exit funds from Blend:
const result = await client.withdraw.getCalldata({
  accountId: account.accountId,
  destinationChainId: 8453,
  amount: "1000000000000000000",
});
Each payload contains a steps array. Steps are ordered and each has a kind discriminator:
  • liquidityReset - flush vault positions to loan token (submit as delegatecall)
  • approve / withdraw / approveReset - vault exit transactions (submit as regular calls)
  • bridge - relay bridge when funds must move cross-chain (submit with ETH value)

Important constraints

  • accountId is required in client.deposit.getQuote(). See DepositQuoteParams for the full parameter shape
  • amount must be a non-negative integer string in smallest units
  • client.deposit.getTokens(chainId, eoa?) returns a flat DepositToken[] array. With eoa, tokens include balance and amountUsd fields
  • for client.withdraw.getCalldata(), the bridge step may be omitted on max withdrawals because the exact post-settlement amount is unknown ahead of time. See WithdrawChainPayload for the full payload shape

Best practices

Call client.safe.account(userEoa) before requesting a deposit quote so you have the correct accountId.
The deposit quote response is intentionally opaque. Do not hard-code against undocumented provider fields unless your application owns that compatibility layer.
If the selected source chain is not enabled for the account type, quote generation will fail. Surface that as a product restriction, not a generic network error.
Last modified on March 20, 2026