Skip to main content
Withdrawals require two steps: first approve the withdrawal, then execute with prepareWithdrawTxData.

Withdrawal Flow

  1. Approve withdrawal using prepareApproveWithdrawTxData
  2. Execute withdrawal using prepareWithdrawTxData

prepareApproveWithdrawTxData()

Prepares the approval transaction required before withdrawing.
import { prepareApproveWithdrawTxData } from "@paxoslabs/amplify-sdk";

const approval = await prepareApproveWithdrawTxData({
  yieldType, // e.g. YieldType.PRIME
  wantAssetAddress, // token address users receive
  chainId,
});
Returns { abi, address, functionName, args, chainId }.

prepareWithdrawTxData()

Assembles calldata that burns shares and returns the want asset.
import { prepareWithdrawTxData } from "@paxoslabs/amplify-sdk";

const tx = await prepareWithdrawTxData({
  yieldType, // e.g. YieldType.PRIME
  offerAmount, // decimal string of shares to burn
  wantAssetAddress, // token address users receive
  chainId,
  slippage, // optional bps override (default: 50)
});
Returns { abi, address, functionName, args, chainId }.

React with Privy

import { encodeFunctionData } from "viem";
import { mainnet } from "viem/chains";
import {
  prepareApproveWithdrawTxData,
  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 wantAssetAddress = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" as `0x${string}`; // USDC
const chainId = mainnet.id;

// Step 1: Approve withdrawal
const approval = await prepareApproveWithdrawTxData({
  chainId,
  wantAssetAddress,
  yieldType: YieldType.PRIME,
});

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

// Step 2: Execute withdrawal
const tx = await prepareWithdrawTxData({
  yieldType: YieldType.PRIME,
  wantAssetAddress,
  offerAmount: "5.0",
  chainId,
});

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

React with wagmi

import {
  prepareApproveWithdrawTxData,
  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 wantAssetAddress = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" as `0x${string}`; // USDC

// Step 1: Approve withdrawal
const approval = await prepareApproveWithdrawTxData({
  chainId,
  wantAssetAddress,
  yieldType: YieldType.PRIME,
});

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

// Step 2: Execute withdrawal
const tx = await prepareWithdrawTxData({
  yieldType: YieldType.PRIME,
  wantAssetAddress,
  offerAmount: "5.0",
  chainId,
});

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

React with viem

import { createWalletClient, custom } from "viem";
import { mainnet } from "viem/chains";
import {
  prepareApproveWithdrawTxData,
  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 wantAssetAddress = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" as `0x${string}`; // USDC
const chainId = mainnet.id;

// Step 1: Approve withdrawal
const approval = await prepareApproveWithdrawTxData({
  chainId,
  wantAssetAddress,
  yieldType: YieldType.PRIME,
});

await client.writeContract({ ...approval, account });

// Step 2: Execute withdrawal
const tx = await prepareWithdrawTxData({
  yieldType: YieldType.PRIME,
  wantAssetAddress,
  offerAmount: "5.0",
  chainId,
});

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. For deposit operations, see Deposits.