Skip to main content
prepareWithdrawTxData assembles calldata that burns shares and returns the want asset in one transaction. Use it when the vault advertises enough on-chain liquidity for immediate redemptions.

Helper Signature

import { prepareWithdrawTxData } from "@paxoslabs/amplify-sdk";

const tx = await prepareWithdrawTxData({
  yieldType, // e.g. YieldType.CORE
  shareAmount, // decimal string of shares to burn
  wantAssetAddress, // token address users receive
  chainId,
  recipientAddress, // recipient wallet
  slippage, // optional bps override (default: 100)
});
  • Returns { abi, address, functionName: 'bulkWithdraw', args, chainId }.
  • args order: [wantAssetAddress, shareAmountInBaseUnits, minimumAssetsOut, userAddress].
  • No ERC-20 approvals are required; the vault burns shares directly.

React with Privy

import { encodeFunctionData } from "viem";
import { mainnet } from "viem/chains";
import { prepareWithdrawTxData, YieldType } from "@paxoslabs/amplify-sdk";
import { usePrivy, useWallets } from "@privy-io/react-auth";

const { sendTransaction } = usePrivy();
const { wallets } = useWallets();
const wallet = wallets[0];
if (!wallet) {
  throw new Error("Connect a wallet before preparing transactions.");
}

const owner = wallet.address as `0x${string}`;

const tx = await prepareWithdrawTxData({
  yieldType: YieldType.CORE,
  shareAmount: "5.0",
  wantAssetAddress: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", // USDC
  chainId: mainnet.id,
  userAddress: owner,
  slippage: 75,
});

await sendTransaction({
  chainId: tx.chainId,
  to: tx.address,
  data: encodeFunctionData({
    abi: tx.abi,
    functionName: tx.functionName,
    args: tx.args,
  }),
});

React with wagmi

import { prepareWithdrawTxData, YieldType } from "@paxoslabs/amplify-sdk";
import { useAccount, useWriteContract } from "wagmi";

const { address: account, chainId } = useAccount();
const { writeContractAsync } = useWriteContract();
if (!account || !chainId) {
  throw new Error("Connect a wallet before preparing transactions.");
}

const tx = await prepareWithdrawTxData({
  yieldType: YieldType.CORE,
  shareAmount: "5.0",
  wantAssetAddress: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", // USDC
  chainId,
  userAddress: account,
  slippage: 75,
});

await writeContractAsync({ ...tx, account });

React with viem

import { createWalletClient, custom } from "viem";
import { mainnet } from "viem/chains";
import { prepareWithdrawTxData, YieldType } from "@paxoslabs/amplify-sdk";

// ethereum is window.ethereum from an injected wallet.
const [account] = (await ethereum.request({
  method: "eth_requestAccounts",
})) as `0x${string}`[];

const client = createWalletClient({
  account,
  chain: mainnet,
  transport: custom(ethereum),
});

const tx = await prepareWithdrawTxData({
  yieldType: YieldType.CORE,
  shareAmount: "5.0",
  wantAssetAddress: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", // USDC
  chainId: mainnet.id,
  userAddress: account,
  slippage: 75,
});

await client.writeContract({ ...tx, account });
Handle errors by catching APIError; the endpoint field lets you surface actionable error messaging when vaults, chains, or solver slippage lookups are unavailable.***