> ## 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.

# prepareApproveWithdrawOrderTxData

> Prepare an approval transaction for vault share withdrawals

Prepare transaction data to approve vault shares for withdrawal via the WithdrawQueue contract.

<Info>
  Before withdrawing, you must approve the WithdrawQueue contract to spend your vault shares. Consider using [prepareWithdrawalAuthorization](/v0.4.2/intro/products/earn/developers/api/prepareWithdrawalAuthorization) for a higher-level API that handles approval checking automatically.
</Info>

## Import

```typescript theme={null}
import { prepareApproveWithdrawOrderTxData } from "@paxoslabs/amplify-sdk";
```

## Usage

```typescript theme={null}
const txData = await prepareApproveWithdrawOrderTxData({
  yieldType: "CORE",
  wantAssetAddress: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
  withdrawAmount: "100.0",
  chainId: 1,
});

// Execute approval
const hash = await walletClient.writeContract(txData);
```

***

## Parameters

| Parameter          | Type        | Required | Description                                                  |
| ------------------ | ----------- | -------- | ------------------------------------------------------------ |
| `yieldType`        | `YieldType` | Yes      | Yield strategy (CORE, TREASURY, FRONTIER)                    |
| `wantAssetAddress` | `Address`   | Yes      | Token address you want to receive                            |
| `withdrawAmount`   | `string`    | No       | Amount to approve (defaults to max uint256)                  |
| `chainId`          | `ChainId`   | Yes      | Chain ID                                                     |
| `shareDecimals`    | `number`    | No       | Pre-fetched vault share decimals (avoids redundant RPC call) |

***

## Return Type

<Tabs>
  <Tab title="Type Definition">
    ```typescript theme={null}
    interface ApproveWithdrawOrderTxData {
      abi: typeof BoringVaultAbi;
      address: `0x${string}`;         // Vault shares (BoringVault) address
      functionName: "approve";
      args: [spender: `0x${string}`, amount: bigint];
    }
    ```
  </Tab>

  <Tab title="Example Response">
    ```typescript theme={null}
    {
      abi: [/* BoringVault ABI */],
      address: "0x1234567890abcdef...", // Vault shares address
      functionName: "approve",
      args: [
        "0xfedcba0987654321...", // WithdrawQueue address (spender)
        115792089237316195423570985008687907853269984665640564039457584007913129639935n, // Max approval
      ],
    }
    ```
  </Tab>
</Tabs>

***

## Examples

<Tabs>
  <Tab title="Viem">
    ```typescript theme={null}
    import { prepareApproveWithdrawOrderTxData } from "@paxoslabs/amplify-sdk";
    import { createWalletClient, createPublicClient, http } from "viem";
    import { mainnet } from "viem/chains";

    async function approveWithdraw(userAddress: `0x${string}`) {
      const walletClient = createWalletClient({
        account: userAddress,
        chain: mainnet,
        transport: http(),
      });
      const publicClient = createPublicClient({
        chain: mainnet,
        transport: http(),
      });

      const USDC = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48";

      // Approve specific amount
      const txData = await prepareApproveWithdrawOrderTxData({
        yieldType: "CORE",
        wantAssetAddress: USDC,
        withdrawAmount: "100.0",
        chainId: 1,
      });

      const hash = await walletClient.writeContract(txData);
      const receipt = await publicClient.waitForTransactionReceipt({ hash });

      console.log("Approval confirmed:", receipt.transactionHash);
      return hash;
    }
    ```
  </Tab>

  <Tab title="Wagmi">
    ```tsx theme={null}
    import { prepareApproveWithdrawOrderTxData } from "@paxoslabs/amplify-sdk";
    import { useAccount, useWriteContract, useWaitForTransactionReceipt } from "wagmi";
    import { useState } from "react";

    function ApproveWithdrawButton() {
      const { address } = useAccount();
      const { writeContractAsync, data: hash } = useWriteContract();
      const { isLoading: isConfirming } = useWaitForTransactionReceipt({ hash });
      const [status, setStatus] = useState("idle");

      async function handleApprove() {
        if (!address) return;

        const USDC = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48";

        try {
          setStatus("Preparing approval...");
          const txData = await prepareApproveWithdrawOrderTxData({
            yieldType: "CORE",
            wantAssetAddress: USDC,
            chainId: 1, // Max approval
          });

          setStatus("Confirm in wallet...");
          await writeContractAsync(txData);
          setStatus("Waiting for confirmation...");
        } catch (error) {
          setStatus(`Error: ${(error as Error).message}`);
        }
      }

      return (
        <div>
          <button onClick={handleApprove} disabled={isConfirming}>
            {isConfirming ? "Confirming..." : "Approve Withdrawal"}
          </button>
          <p>{status}</p>
        </div>
      );
    }
    ```
  </Tab>
</Tabs>

***

## Max vs Specific Approval

### Max Approval (Default)

When `withdrawAmount` is not provided, the SDK approves the maximum amount. This is a one-time approval that covers all future withdrawals:

```typescript theme={null}
// Max approval - no amount specified
const txData = await prepareApproveWithdrawOrderTxData({
  yieldType: "CORE",
  wantAssetAddress: USDC_ADDRESS,
  chainId: 1,
});
```

### Specific Amount Approval

For tighter security, approve only the amount you intend to withdraw:

```typescript theme={null}
// Approve exactly 100 shares
const txData = await prepareApproveWithdrawOrderTxData({
  yieldType: "CORE",
  wantAssetAddress: USDC_ADDRESS,
  withdrawAmount: "100.0",
  chainId: 1,
});
```

***

## Checking Existing Approval

Before approving, check if approval is already granted:

```typescript theme={null}
import {
  isWithdrawalSpendApproved,
  prepareApproveWithdrawOrderTxData,
} from "@paxoslabs/amplify-sdk";

async function ensureApproval(userAddress: `0x${string}`) {
  const USDC = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48";

  const approvalInfo = await isWithdrawalSpendApproved({
    yieldType: "CORE",
    wantAssetAddress: USDC,
    recipientAddress: userAddress,
    chainId: 1,
  });

  if (approvalInfo.isApproved) {
    console.log(`Already approved. Allowance: ${approvalInfo.allowance}`);
    return null;
  }

  // Need to approve first
  return prepareApproveWithdrawOrderTxData({
    yieldType: "CORE",
    wantAssetAddress: USDC,
    chainId: 1,
  });
}
```

<Callout type="tip">
  Consider using [prepareWithdrawalAuthorization](/v0.4.2/intro/products/earn/developers/api/prepareWithdrawalAuthorization) instead, which combines the approval check and approval preparation into a single call.
</Callout>

***

## Error Handling

| Error                                           | Description                  | Resolution                              |
| ----------------------------------------------- | ---------------------------- | --------------------------------------- |
| `Vault chain mismatch`                          | Vault not on requested chain | Verify chainId matches vault deployment |
| `BoringVault contract address not configured`   | Missing vault config         | Check vault exists for yieldType/chain  |
| `WithdrawQueue contract address not configured` | Missing queue config         | Check vault configuration               |

```typescript theme={null}
import { prepareApproveWithdrawOrderTxData, APIError } from "@paxoslabs/amplify-sdk";

try {
  const txData = await prepareApproveWithdrawOrderTxData({
    yieldType: "CORE",
    wantAssetAddress: USDC_ADDRESS,
    chainId: 1,
  });
} catch (error) {
  if (error instanceof APIError) {
    console.error("SDK Error:", error.message);
  }
}
```

***

## Related

* [prepareWithdrawalAuthorization](/v0.4.2/intro/products/earn/developers/api/prepareWithdrawalAuthorization) - Unified authorization (recommended)
* [prepareWithdrawOrderTxData](/v0.4.2/intro/products/earn/developers/api/prepareWithdrawOrderTxData) - Submit the withdrawal order
* [Withdrawals Guide](/v0.4.2/intro/products/earn/developers/guides/withdrawals) - Complete withdrawal flow
