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.

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

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);
  }
}

Last updated