> For the complete documentation index, see [llms.txt](https://docs.river.inc/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.river.inc/satoshi-protocol-v1/sdk/nexus-yield-module/operation-withdraw.md).

# Operation - Withdraw

The **Withdraw Operation** in the Nexus Yield Module (NYM) of the Satoshi Protocol allows users to withdraw previously scheduled withdrawals of assets, such as USDT, USDC, or other supported tokens.&#x20;

### Key Steps:

1. **Fetch Pending Withdrawals**:
   * Retrieve the list of pending withdrawals using the `getNymPendingWithdrawInfos` method, which returns information on assets that are scheduled for withdrawal.
2. **Check Conditions**:
   * Iterate through each pending withdrawal to check if the scheduled amount is greater than zero and if the withdrawal time is set.
3. **Execute Withdrawal**:
   * Call the `doNymWithdraw` method to execute the withdrawal for the specified asset.

### Example

```typescript
import { walletClient, publicClient, protocolConfig } from 'satoshi-sdk';


// Example usage:
doNymWithdraw('USDT')
  .then(() => console.log('Withdraw process completed successfully'))
  .catch((error) => console.error('Error during withdrawal:', error));
  
async function doNymWithdraw(assetSymbol) {
  // Initialize the SatoshiClient with protocol and wallet configurations
  const satoshiClient = new SatoshiClient(protocolConfig, walletClient);

  // Retrieve asset details based on the asset symbol
  const asset = (await satoshiClient.NexusYieldModule.getAssetList()).find((t) => t.symbol === assetSymbol);
  if (!asset) {
    throw new Error(`Asset ${assetSymbol} not found.`);
  }

  // Fetch the list of pending withdrawal information for the specified asset
  const pendingInfos = await satoshiClient.NexusYieldModule.getNymPendingWithdrawInfos([asset]);
  if (!pendingInfos || pendingInfos.length === 0) {
    console.log('No pending withdrawals found.');
    return;
  }

  // Iterate through each pending withdrawal info
  for (const pendingInfo of pendingInfos) {
    const { scheduledWithdrawalAmount, withdrawalTime, asset } = pendingInfo;

    // Skip if there's no scheduled amount or withdrawal time
    if (!(scheduledWithdrawalAmount > 0n) || !withdrawalTime) continue;

    // Get the current time in seconds
    const currentTime = Math.floor(Date.now() / 1000);

    // Check if the current time is greater than the withdrawal time
    if (currentTime < withdrawalTime) {
      console.log(
        `Withdrawal for ${asset.symbol} is scheduled for a future time. Current time: ${currentTime}, Withdrawal time: ${withdrawalTime}. Skipping...`
      );
      continue;
    }

    // Fetch the asset balance before withdrawal
    const assetBalanceBefore = await getBalanceOf(asset);

    // Execute the withdrawal
    const receipt = await satoshiClient.NexusYieldModule.doNymWithdraw(asset);

    // Confirm that the withdrawal was successful
    if (receipt.status !== 'success') {
      throw new Error('Withdrawal transaction failed.');
    }

    // Fetch the asset balance after withdrawal to validate the change
    const assetBalanceAfter = await getBalanceOf(asset);

    // Validate that the asset balance increased by the scheduled withdrawal amount
    if (assetBalanceAfter - assetBalanceBefore !== scheduledWithdrawalAmount) {
      throw new Error(
        `Balance mismatch: expected an increase of ${scheduledWithdrawalAmount}, but got ${
          assetBalanceAfter - assetBalanceBefore
        }`
      );
    }

    console.log('Withdrawal was successful:', receipt);
  }
}


```
