All files / extension/src/app/common/hooks/balance use-balances.tsx

0% Statements 0/17
0% Branches 0/18
0% Functions 0/2
0% Lines 0/17

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118                                                                                                                                                                                                                                           
import { useMemo } from 'react';
 
import {
  useCryptoCurrencyMarketDataMeanAverage,
  useStxCryptoAssetBalance,
} from '@leather.io/query';
import { baseCurrencyAmountInQuote, createMoney, i18nFormatCurrency } from '@leather.io/utils';
 
import { useBtcCryptoAssetBalanceNativeSegwit } from '@app/query/bitcoin/balance/btc-balance-native-segwit.hooks';
 
import { useSip10ManagedTokensBalance } from './use-sip10-balance';
 
const highBalance = createMoney(100_000, 'USD');
 
interface UseBalanceArgs {
  btcAddress: string;
  stxAddress: string;
}
export function useBalances({ btcAddress, stxAddress }: UseBalanceArgs) {
  // get market data
  const btcMarketData = useCryptoCurrencyMarketDataMeanAverage('BTC');
  const stxMarketData = useCryptoCurrencyMarketDataMeanAverage('STX');
 
  // get stx balance
  const { filteredBalanceQuery, isLoadingAdditionalData: isLoadingAdditionalDataStxBalance } =
    useStxCryptoAssetBalance(stxAddress);
 
  const {
    data: balance,
    isFetching: isFetchingStxBalance,
    isLoading: isLoadingStxBalance,
    isPending: isPendingStxBalance,
  } = filteredBalanceQuery;
 
  const totalStxBalance = balance ? balance.totalBalance : createMoney(0, 'STX');
  const availableUnlockedStxBalance = balance
    ? balance.availableUnlockedBalance
    : createMoney(0, 'STX');
 
  // get btc balance
  const {
    balance: btcBalance,
    isLoading: isLoadingBtcBalance,
    filteredUtxosQuery: { isFetching: isFetchingBtcBalance, isPending: isPendingBtcBalance },
    isLoadingAdditionalData: isLoadingAdditionalDataBtcBalance,
  } = useBtcCryptoAssetBalanceNativeSegwit(btcAddress);
 
  // get sip10 balance
  const sip10BalanceUsd = useSip10ManagedTokensBalance({ stxAddress, assetFilter: 'enabled' });
 
  return useMemo(() => {
    // calculate total balance
    const totalStxUsdAmount = baseCurrencyAmountInQuote(totalStxBalance, stxMarketData);
    // calculate available unlocked balance
    const availableUnlockedStxUsdAmount = baseCurrencyAmountInQuote(
      availableUnlockedStxBalance,
      stxMarketData
    );
 
    const availableBtcUsdAmount = baseCurrencyAmountInQuote(
      btcBalance.availableBalance,
      btcMarketData
    );
 
    const totalBtcUsdAmount = baseCurrencyAmountInQuote(btcBalance.totalBalance, btcMarketData);
 
    const totalBalance = {
      ...totalStxUsdAmount,
      amount: totalStxUsdAmount.amount.plus(totalBtcUsdAmount.amount).plus(sip10BalanceUsd.amount),
    };
 
    const availableBalance = {
      ...availableUnlockedStxUsdAmount,
      amount: availableUnlockedStxUsdAmount.amount
        .plus(availableBtcUsdAmount.amount)
        .plus(sip10BalanceUsd.amount),
    };
 
    return {
      isFetching: isFetchingStxBalance || isFetchingBtcBalance,
      isLoading: isLoadingStxBalance || isLoadingBtcBalance,
      isPending:
        (isPendingStxBalance && Boolean(stxAddress)) ||
        (isPendingBtcBalance && Boolean(btcAddress)),
      totalBalance,
      availableBalance,
      availableUsdBalance: i18nFormatCurrency(
        availableBalance,
        availableBalance.amount.isGreaterThanOrEqualTo(highBalance.amount) ? 0 : 2
      ),
      totalUsdBalance: i18nFormatCurrency(
        totalBalance,
        totalBalance.amount.isGreaterThanOrEqualTo(highBalance.amount) ? 0 : 2
      ),
      isLoadingAdditionalData:
        isLoadingAdditionalDataStxBalance || isLoadingAdditionalDataBtcBalance,
    };
  }, [
    totalStxBalance,
    stxMarketData,
    availableUnlockedStxBalance,
    btcBalance.availableBalance,
    btcBalance.totalBalance,
    btcMarketData,
    sip10BalanceUsd.amount,
    isFetchingStxBalance,
    isFetchingBtcBalance,
    isLoadingStxBalance,
    isLoadingBtcBalance,
    isPendingStxBalance,
    stxAddress,
    isPendingBtcBalance,
    btcAddress,
    isLoadingAdditionalDataStxBalance,
    isLoadingAdditionalDataBtcBalance,
  ]);
}