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