> ## Documentation Index
> Fetch the complete documentation index at: https://developers.paxoslabs.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Withdraw

> Redeem vault shares for desired asset through atomic queue

`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

```ts theme={null}
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

```tsx theme={null}
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

```tsx theme={null}
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

```tsx theme={null}
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.\*\*\*
