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 | import { useMemo } from 'react';
import { baseCurrencyAmountInQuote, createMoney, i18nFormatCurrency } from '@leather.io/utils';
import { useBtcCryptoAssetBalanceNativeSegwit } from '@app/query/bitcoin/balance/btc-balance-native-segwit.hooks';
import { useCryptoCurrencyMarketDataMeanAverage } from '@app/query/common/market-data/market-data.hooks';
import { useStxCryptoAssetBalance } from '@app/query/stacks/balance/account-balance.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,
]);
}
|