UNPKG

@lifi/sdk

Version:

LI.FI Any-to-Any Cross-Chain-Swap SDK

46 lines (41 loc) 1.64 kB
import type { LiFiStep } from '@lifi/types' import { formatUnits } from 'viem' import { BalanceError } from '../errors/errors.js' import { getTokenBalance } from '../services/balance.js' import { sleep } from '../utils/sleep.js' export const checkBalance = async ( walletAddress: string, step: LiFiStep, depth = 0 ): Promise<void> => { const token = await getTokenBalance(walletAddress, step.action.fromToken) if (token) { const currentBalance = token.amount ?? 0n const neededBalance = BigInt(step.action.fromAmount) if (currentBalance < neededBalance) { if (depth <= 3) { await sleep(200) await checkBalance(walletAddress, step, depth + 1) } else if ( (neededBalance * BigInt((1 - (step.action.slippage ?? 0)) * 1_000_000_000)) / 1_000_000_000n <= currentBalance ) { // adjust amount in slippage limits step.action.fromAmount = currentBalance.toString() } else { const needed = formatUnits(neededBalance, token.decimals) const current = formatUnits(currentBalance, token.decimals) let errorMessage = `Your ${token.symbol} balance is too low, you try to transfer ${needed} ${token.symbol}, but your wallet only holds ${current} ${token.symbol}. No funds have been sent.` if (currentBalance !== 0n) { errorMessage += `If the problem consists, please delete this transfer and start a new one with a maximum of ${current} ${token.symbol}.` } throw new BalanceError( 'The balance is too low.', new Error(errorMessage) ) } } } }