From abbe247972e98f7e0a47f9e6a8ef71782d65a8d0 Mon Sep 17 00:00:00 2001 From: Fara Woolf Date: Mon, 8 Apr 2024 13:49:54 -0500 Subject: [PATCH] feat: brc-20 token balances as fiat, #4408 --- .../hooks/balance/btc/use-btc-balance.ts | 4 +- .../hooks/balance/stx/use-stx-balance.ts | 4 +- .../hooks/balance/use-total-balance.tsx | 6 +-- src/app/common/hooks/use-alex-sdk.ts | 38 -------------- src/app/common/hooks/use-bitcoin-contracts.ts | 4 +- .../hooks/use-convert-to-fiat-amount.ts | 51 ++++++++++++++++--- .../hooks/use-bitcoin-custom-fee.tsx | 4 +- .../use-bitcoin-fees-list.ts | 4 +- .../brc20-token-asset-item.layout.tsx | 14 +++-- ...tacks-fungible-token-asset-item.layout.tsx | 4 +- src/app/components/fees-row/fees-row.tsx | 4 +- .../hooks/use-stacks-transaction-summary.ts | 4 +- .../bitcoin-contract-list-item-layout.tsx | 4 +- .../rpc-send-transfer-confirmation.tsx | 4 +- .../pages/rpc-sign-psbt/use-rpc-sign-psbt.tsx | 4 +- .../hooks/use-send-inscription-fees-list.ts | 4 +- .../form/btc/btc-send-form-confirmation.tsx | 4 +- .../form/btc/btc-send-form.tsx | 4 +- .../form/stx/stx-send-form.tsx | 4 +- .../components/swap-asset-item.tsx | 4 +- .../components/swap-selected-asset-from.tsx | 4 +- .../components/swap-selected-asset-to.tsx | 4 +- src/app/query/bitcoin/bitcoin-client.ts | 3 +- .../ordinals/brc20/brc20-tokens.query.ts | 10 ++-- .../common/market-data/market-data.hooks.ts | 4 +- 25 files changed, 102 insertions(+), 96 deletions(-) delete mode 100644 src/app/common/hooks/use-alex-sdk.ts diff --git a/src/app/common/hooks/balance/btc/use-btc-balance.ts b/src/app/common/hooks/balance/btc/use-btc-balance.ts index 688d39d5852..b6f5aed8c9d 100644 --- a/src/app/common/hooks/balance/btc/use-btc-balance.ts +++ b/src/app/common/hooks/balance/btc/use-btc-balance.ts @@ -4,10 +4,10 @@ import { baseCurrencyAmountInQuote } from '@app/common/money/calculate-money'; import { i18nFormatCurrency } from '@app/common/money/format-money'; import { createBitcoinCryptoCurrencyAssetTypeWrapper } from '@app/query/bitcoin/address/address.utils'; import { useNativeSegwitBalance } from '@app/query/bitcoin/balance/btc-native-segwit-balance.hooks'; -import { useCryptoCurrencyMarketData } from '@app/query/common/market-data/market-data.hooks'; +import { useCryptoCurrencyMarketDataMean } from '@app/query/common/market-data/market-data.hooks'; export function useBtcAssetBalance(btcAddress: string) { - const btcMarketData = useCryptoCurrencyMarketData('BTC'); + const btcMarketData = useCryptoCurrencyMarketDataMean('BTC'); const { btcBalance: btcAssetBalance, isLoading, diff --git a/src/app/common/hooks/balance/stx/use-stx-balance.ts b/src/app/common/hooks/balance/stx/use-stx-balance.ts index 5a7312902f7..0f27bc296ea 100644 --- a/src/app/common/hooks/balance/stx/use-stx-balance.ts +++ b/src/app/common/hooks/balance/stx/use-stx-balance.ts @@ -5,7 +5,7 @@ import { isDefined } from '@shared/utils'; import { baseCurrencyAmountInQuote, subtractMoney } from '@app/common/money/calculate-money'; import { i18nFormatCurrency } from '@app/common/money/format-money'; -import { useCryptoCurrencyMarketData } from '@app/query/common/market-data/market-data.hooks'; +import { useCryptoCurrencyMarketDataMean } from '@app/query/common/market-data/market-data.hooks'; import { createStacksCryptoCurrencyAssetTypeWrapper } from '@app/query/stacks/balance/stacks-ft-balances.utils'; import { useCurrentStacksAccountBalances } from '@app/query/stacks/balance/stx-balance.hooks'; import { useCurrentAccountMempoolTransactionsBalance } from '@app/query/stacks/mempool/mempool.hooks'; @@ -15,7 +15,7 @@ export function useStxBalance() { const totalBalance = stxBalanceQuery.data?.stx.balance; const unlockedStxBalance = stxBalanceQuery.data?.stx.unlockedStx; - const stxMarketData = useCryptoCurrencyMarketData('STX'); + const stxMarketData = useCryptoCurrencyMarketDataMean('STX'); const pendingTxsBalance = useCurrentAccountMempoolTransactionsBalance(); const stxEffectiveBalance = isDefined(totalBalance) diff --git a/src/app/common/hooks/balance/use-total-balance.tsx b/src/app/common/hooks/balance/use-total-balance.tsx index ac6c01904cc..d0c8fd990cd 100644 --- a/src/app/common/hooks/balance/use-total-balance.tsx +++ b/src/app/common/hooks/balance/use-total-balance.tsx @@ -4,7 +4,7 @@ import { createMoney } from '@shared/models/money.model'; import { baseCurrencyAmountInQuote } from '@app/common/money/calculate-money'; import { i18nFormatCurrency } from '@app/common/money/format-money'; -import { useCryptoCurrencyMarketData } from '@app/query/common/market-data/market-data.hooks'; +import { useCryptoCurrencyMarketDataMean } from '@app/query/common/market-data/market-data.hooks'; import { useStacksAccountBalances } from '@app/query/stacks/balance/stx-balance.hooks'; import { useBtcAssetBalance } from './btc/use-btc-balance'; @@ -16,8 +16,8 @@ interface UseTotalBalanceArgs { export function useTotalBalance({ btcAddress, stxAddress }: UseTotalBalanceArgs) { // get market data - const btcMarketData = useCryptoCurrencyMarketData('BTC'); - const stxMarketData = useCryptoCurrencyMarketData('STX'); + const btcMarketData = useCryptoCurrencyMarketDataMean('BTC'); + const stxMarketData = useCryptoCurrencyMarketDataMean('STX'); // get stx balance const { data: balances, isLoading, isInitialLoading } = useStacksAccountBalances(stxAddress); diff --git a/src/app/common/hooks/use-alex-sdk.ts b/src/app/common/hooks/use-alex-sdk.ts deleted file mode 100644 index bb69ed7386f..00000000000 --- a/src/app/common/hooks/use-alex-sdk.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { type Money, createMoney } from '@shared/models/money.model'; -import { isUndefined } from '@shared/utils'; - -import { useConvertAlexSdkCurrencyToFiatAmount } from '@app/common/hooks/use-convert-to-fiat-amount'; -import { i18nFormatCurrency } from '@app/common/money/format-money'; -import { unitToFractionalUnit } from '@app/common/money/unit-conversion'; - -export function useAlexSdkAmountAsFiat(balance?: Money, price?: Money, value?: string) { - const convertAlexSdkCurrencyToUsd = useConvertAlexSdkCurrencyToFiatAmount( - balance?.symbol ?? '', - price ?? createMoney(0, 'USD') - ); - - if (isUndefined(balance) || isUndefined(price) || isUndefined(value)) return; - - const convertedAmountAsMoney = convertAlexSdkCurrencyToUsd( - createMoney(unitToFractionalUnit(balance.decimals)(value), balance.symbol, balance.decimals) - ); - - if (convertedAmountAsMoney.amount.isNaN()) return; - return i18nFormatCurrency(convertedAmountAsMoney); -} - -export function useAlexSdkBalanceAsFiat(balance: Money, price?: Money | null) { - const convertAlexSdkCurrencyToUsd = useConvertAlexSdkCurrencyToFiatAmount( - balance.symbol, - price ?? createMoney(0, 'USD') - ); - - if (isUndefined(balance) || isUndefined(price)) return; - - const convertedBalanceAsMoney = convertAlexSdkCurrencyToUsd( - createMoney(balance.amount, balance.symbol, balance.decimals) - ); - - if (convertedBalanceAsMoney.amount.isNaN() || convertedBalanceAsMoney.amount.isEqualTo(0)) return; - return i18nFormatCurrency(convertedBalanceAsMoney); -} diff --git a/src/app/common/hooks/use-bitcoin-contracts.ts b/src/app/common/hooks/use-bitcoin-contracts.ts index 8bec3e13ca6..931627025af 100644 --- a/src/app/common/hooks/use-bitcoin-contracts.ts +++ b/src/app/common/hooks/use-bitcoin-contracts.ts @@ -16,7 +16,7 @@ import { makeRpcErrorResponse, makeRpcSuccessResponse } from '@shared/rpc/rpc-me import { sendAcceptedBitcoinContractOfferToProtocolWallet } from '@app/query/bitcoin/contract/send-accepted-bitcoin-contract-offer'; import { useCalculateBitcoinFiatValue, - useCryptoCurrencyMarketData, + useCryptoCurrencyMarketDataMean, } from '@app/query/common/market-data/market-data.hooks'; import { useCurrentAccountIndex } from '@app/store/accounts/account'; import { @@ -57,7 +57,7 @@ export interface BitcoinContractOfferDetails { export function useBitcoinContracts() { const navigate = useNavigate(); const defaultParams = useDefaultRequestParams(); - const bitcoinMarketData = useCryptoCurrencyMarketData('BTC'); + const bitcoinMarketData = useCryptoCurrencyMarketDataMean('BTC'); const calculateFiatValue = useCalculateBitcoinFiatValue(); const bitcoinAccountDetails = useCurrentAccountNativeSegwitIndexZeroSigner(); diff --git a/src/app/common/hooks/use-convert-to-fiat-amount.ts b/src/app/common/hooks/use-convert-to-fiat-amount.ts index f38c9dae623..2c77cd0df16 100644 --- a/src/app/common/hooks/use-convert-to-fiat-amount.ts +++ b/src/app/common/hooks/use-convert-to-fiat-amount.ts @@ -2,14 +2,17 @@ import { useCallback, useMemo } from 'react'; import { CryptoCurrencies } from '@shared/models/currencies.model'; import { createMarketData, createMarketPair } from '@shared/models/market.model'; -import type { Money } from '@shared/models/money.model'; +import { type Money, createMoney } from '@shared/models/money.model'; +import { isUndefined } from '@shared/utils'; -import { useCryptoCurrencyMarketData } from '@app/query/common/market-data/market-data.hooks'; +import { i18nFormatCurrency } from '@app/common/money/format-money'; +import { unitToFractionalUnit } from '@app/common/money/unit-conversion'; +import { useCryptoCurrencyMarketDataMean } from '@app/query/common/market-data/market-data.hooks'; import { baseCurrencyAmountInQuote } from '../money/calculate-money'; -export function useConvertCryptoCurrencyToFiatAmount(currency: CryptoCurrencies) { - const cryptoCurrencyMarketData = useCryptoCurrencyMarketData(currency); +export function useConvertCryptoCurrencyToFiatAmountMean(currency: CryptoCurrencies) { + const cryptoCurrencyMarketData = useCryptoCurrencyMarketDataMean(currency); return useCallback( (value: Money) => baseCurrencyAmountInQuote(value, cryptoCurrencyMarketData), @@ -17,14 +20,46 @@ export function useConvertCryptoCurrencyToFiatAmount(currency: CryptoCurrencies) ); } -export function useConvertAlexSdkCurrencyToFiatAmount(currency: CryptoCurrencies, price: Money) { - const alexCurrencyMarketData = useMemo( +function useConvertCryptoCurrencyToFiatAmount(currency: CryptoCurrencies, price: Money) { + const cryptoCurrencyMarketData = useMemo( () => createMarketData(createMarketPair(currency, 'USD'), price), [currency, price] ); return useCallback( - (value: Money) => baseCurrencyAmountInQuote(value, alexCurrencyMarketData), - [alexCurrencyMarketData] + (value: Money) => baseCurrencyAmountInQuote(value, cryptoCurrencyMarketData), + [cryptoCurrencyMarketData] + ); +} + +export function useFormattedFractionalUnitAsFiat(balance?: Money, price?: Money, value?: string) { + const convertAlexSdkCurrencyToUsd = useConvertCryptoCurrencyToFiatAmount( + balance?.symbol ?? '', + price ?? createMoney(0, 'USD') + ); + + if (isUndefined(balance) || isUndefined(price) || isUndefined(value)) return; + + const convertedAmountAsMoney = convertAlexSdkCurrencyToUsd( + createMoney(unitToFractionalUnit(balance.decimals)(value), balance.symbol, balance.decimals) ); + + if (convertedAmountAsMoney.amount.isNaN()) return; + return i18nFormatCurrency(convertedAmountAsMoney); +} + +export function useFormattedBaseUnitAsFiat(balance: Money, price?: Money | null) { + const convertAlexSdkCurrencyToUsd = useConvertCryptoCurrencyToFiatAmount( + balance.symbol, + price ?? createMoney(0, 'USD') + ); + + if (isUndefined(balance) || isUndefined(price)) return; + + const convertedBalanceAsMoney = convertAlexSdkCurrencyToUsd( + createMoney(balance.amount, balance.symbol, balance.decimals) + ); + + if (convertedBalanceAsMoney.amount.isNaN() || convertedBalanceAsMoney.amount.isEqualTo(0)) return; + return i18nFormatCurrency(convertedBalanceAsMoney); } diff --git a/src/app/components/bitcoin-custom-fee/hooks/use-bitcoin-custom-fee.tsx b/src/app/components/bitcoin-custom-fee/hooks/use-bitcoin-custom-fee.tsx index 29a9732b609..97a1aa0240c 100644 --- a/src/app/components/bitcoin-custom-fee/hooks/use-bitcoin-custom-fee.tsx +++ b/src/app/components/bitcoin-custom-fee/hooks/use-bitcoin-custom-fee.tsx @@ -10,7 +10,7 @@ import { } from '@app/common/transactions/bitcoin/coinselect/local-coin-selection'; import { useCurrentNativeSegwitUtxos } from '@app/query/bitcoin/address/utxos-by-address.hooks'; import { useCurrentNativeSegwitAddressBalance } from '@app/query/bitcoin/balance/btc-native-segwit-balance.hooks'; -import { useCryptoCurrencyMarketData } from '@app/query/common/market-data/market-data.hooks'; +import { useCryptoCurrencyMarketDataMean } from '@app/query/common/market-data/market-data.hooks'; export const MAX_FEE_RATE_MULTIPLIER = 50; @@ -22,7 +22,7 @@ interface UseBitcoinCustomFeeArgs { export function useBitcoinCustomFee({ amount, isSendingMax, recipient }: UseBitcoinCustomFeeArgs) { const { balance } = useCurrentNativeSegwitAddressBalance(); const { data: utxos = [] } = useCurrentNativeSegwitUtxos(); - const btcMarketData = useCryptoCurrencyMarketData('BTC'); + const btcMarketData = useCryptoCurrencyMarketDataMean('BTC'); return useCallback( (feeRate: number) => { diff --git a/src/app/components/bitcoin-fees-list/use-bitcoin-fees-list.ts b/src/app/components/bitcoin-fees-list/use-bitcoin-fees-list.ts index 14fe826a0c8..43c1220ffc6 100644 --- a/src/app/components/bitcoin-fees-list/use-bitcoin-fees-list.ts +++ b/src/app/components/bitcoin-fees-list/use-bitcoin-fees-list.ts @@ -13,7 +13,7 @@ import { import { useCurrentNativeSegwitAddressBalance } from '@app/query/bitcoin/balance/btc-native-segwit-balance.hooks'; import { UtxoResponseItem } from '@app/query/bitcoin/bitcoin-client'; import { useAverageBitcoinFeeRates } from '@app/query/bitcoin/fees/fee-estimates.hooks'; -import { useCryptoCurrencyMarketData } from '@app/query/common/market-data/market-data.hooks'; +import { useCryptoCurrencyMarketDataMean } from '@app/query/common/market-data/market-data.hooks'; import { FeesListItem } from './bitcoin-fees-list'; @@ -44,7 +44,7 @@ export function useBitcoinFeesList({ utxos, }: UseBitcoinFeesListArgs) { const { balance } = useCurrentNativeSegwitAddressBalance(); - const btcMarketData = useCryptoCurrencyMarketData('BTC'); + const btcMarketData = useCryptoCurrencyMarketDataMean('BTC'); const { data: feeRates, isLoading } = useAverageBitcoinFeeRates(); const feesList: FeesListItem[] = useMemo(() => { diff --git a/src/app/components/crypto-assets/bitcoin/brc20-token-asset-list/brc20-token-asset-item.layout.tsx b/src/app/components/crypto-assets/bitcoin/brc20-token-asset-list/brc20-token-asset-item.layout.tsx index 84924791aaa..90907b621b1 100644 --- a/src/app/components/crypto-assets/bitcoin/brc20-token-asset-list/brc20-token-asset-item.layout.tsx +++ b/src/app/components/crypto-assets/bitcoin/brc20-token-asset-list/brc20-token-asset-item.layout.tsx @@ -3,6 +3,7 @@ import { styled } from 'leather-styles/jsx'; import { createMoney } from '@shared/models/money.model'; import { formatBalance } from '@app/common/format-balance'; +import { useFormattedBaseUnitAsFiat } from '@app/common/hooks/use-convert-to-fiat-amount'; import { Brc20Token } from '@app/query/bitcoin/bitcoin-client'; import { Brc20AvatarIcon } from '@app/ui/components/avatar/brc20-avatar-icon'; import { ItemLayout } from '@app/ui/components/item-layout/item-layout'; @@ -14,8 +15,14 @@ interface Brc20TokenAssetItemLayoutProps { onClick?(): void; } export function Brc20TokenAssetItemLayout({ onClick, token }: Brc20TokenAssetItemLayoutProps) { - const balance = createMoney(Number(token.overall_balance), token.ticker, 0).amount.toString(); - const formattedBalance = formatBalance(balance); + const balanceAsMoney = createMoney(Number(token.overall_balance), token.ticker, token.decimals); + const balanceAsString = balanceAsMoney.amount.toString(); + const formattedBalance = formatBalance(balanceAsString); + const priceAsMoney = createMoney(token.min_listed_unit_price, 'USD'); + const balaceAsFiat = useFormattedBaseUnitAsFiat( + balanceAsMoney, + priceAsMoney ?? createMoney(0, 'USD') + ); return ( @@ -26,7 +33,7 @@ export function Brc20TokenAssetItemLayout({ onClick, token }: Brc20TokenAssetIte titleRight={ @@ -34,6 +41,7 @@ export function Brc20TokenAssetItemLayout({ onClick, token }: Brc20TokenAssetIte } + captionRight={balaceAsFiat} /> ); diff --git a/src/app/components/crypto-assets/stacks/fungible-token-asset/stacks-fungible-token-asset-item.layout.tsx b/src/app/components/crypto-assets/stacks/fungible-token-asset/stacks-fungible-token-asset-item.layout.tsx index 3106f3e1d68..0797a8375f3 100644 --- a/src/app/components/crypto-assets/stacks/fungible-token-asset/stacks-fungible-token-asset-item.layout.tsx +++ b/src/app/components/crypto-assets/stacks/fungible-token-asset/stacks-fungible-token-asset-item.layout.tsx @@ -2,7 +2,7 @@ import { styled } from 'leather-styles/jsx'; import { StacksFungibleTokenAssetBalance } from '@shared/models/crypto-asset-balance.model'; -import { useAlexSdkBalanceAsFiat } from '@app/common/hooks/use-alex-sdk'; +import { useFormattedBaseUnitAsFiat } from '@app/common/hooks/use-convert-to-fiat-amount'; import { StacksAssetAvatar } from '@app/components/crypto-assets/stacks/components/stacks-asset-avatar'; import { ItemLayout } from '@app/ui/components/item-layout/item-layout'; import { BasicTooltip } from '@app/ui/components/tooltip/basic-tooltip'; @@ -18,7 +18,7 @@ export function StacksFungibleTokenAssetItemLayout({ assetBalance, onClick, }: StacksFungibleTokenAssetItemLayoutProps) { - const balanceAsFiat = useAlexSdkBalanceAsFiat(assetBalance.balance, assetBalance.asset.price); + const balanceAsFiat = useFormattedBaseUnitAsFiat(assetBalance.balance, assetBalance.asset.price); const { amount, avatar, caption, dataTestId, formattedBalance, imageCanonicalUri, title } = parseStacksFungibleTokenAssetBalance(assetBalance); diff --git a/src/app/components/fees-row/fees-row.tsx b/src/app/components/fees-row/fees-row.tsx index 3f4d9f0b520..dac4dd3b010 100644 --- a/src/app/components/fees-row/fees-row.tsx +++ b/src/app/components/fees-row/fees-row.tsx @@ -10,7 +10,7 @@ import { FeeTypes, Fees } from '@shared/models/fees/fees.model'; import { createMoney } from '@shared/models/money.model'; import { isNumber, isString } from '@shared/utils'; -import { useConvertCryptoCurrencyToFiatAmount } from '@app/common/hooks/use-convert-to-fiat-amount'; +import { useConvertCryptoCurrencyToFiatAmountMean } from '@app/common/hooks/use-convert-to-fiat-amount'; import { convertAmountToBaseUnit } from '@app/common/money/calculate-money'; import { LoadingRectangle } from '@app/components/loading-rectangle'; @@ -45,7 +45,7 @@ export function FeesRow({ const hasFeeEstimates = fees?.estimates.length; const feeCurrencySymbol = feeCurrencyField.value; - const convertCryptoCurrencyToUsd = useConvertCryptoCurrencyToFiatAmount(feeCurrencySymbol); + const convertCryptoCurrencyToUsd = useConvertCryptoCurrencyToFiatAmountMean(feeCurrencySymbol); const feeInUsd = useMemo(() => { if ((!isNumber(feeField.value) && !isString(feeField.value)) || !feeCurrencySymbol) return null; diff --git a/src/app/features/stacks-transaction-request/hooks/use-stacks-transaction-summary.ts b/src/app/features/stacks-transaction-request/hooks/use-stacks-transaction-summary.ts index 309f3b9acca..aca5a725725 100644 --- a/src/app/features/stacks-transaction-request/hooks/use-stacks-transaction-summary.ts +++ b/src/app/features/stacks-transaction-request/hooks/use-stacks-transaction-summary.ts @@ -21,13 +21,13 @@ import { import { formatMoney, i18nFormatCurrency } from '@app/common/money/format-money'; import { getEstimatedConfirmationTime } from '@app/common/transactions/stacks/transaction.utils'; import { removeTrailingNullCharacters } from '@app/common/utils'; -import { useCryptoCurrencyMarketData } from '@app/query/common/market-data/market-data.hooks'; +import { useCryptoCurrencyMarketDataMean } from '@app/query/common/market-data/market-data.hooks'; import { useStacksBlockTime } from '@app/query/stacks/info/info.hooks'; import { useCurrentNetworkState } from '@app/store/networks/networks.hooks'; import { microStxToStx } from '@app/ui/utils/micro-stx-to-stx'; export function useStacksTransactionSummary(token: CryptoCurrencies) { - const tokenMarketData = useCryptoCurrencyMarketData(token); + const tokenMarketData = useCryptoCurrencyMarketDataMean(token); const { isTestnet } = useCurrentNetworkState(); const { data: blockTime } = useStacksBlockTime(); diff --git a/src/app/pages/bitcoin-contract-list/components/bitcoin-contract-list-item-layout.tsx b/src/app/pages/bitcoin-contract-list/components/bitcoin-contract-list-item-layout.tsx index 3d5d9161ed9..49dfdcfc909 100644 --- a/src/app/pages/bitcoin-contract-list/components/bitcoin-contract-list-item-layout.tsx +++ b/src/app/pages/bitcoin-contract-list/components/bitcoin-contract-list-item-layout.tsx @@ -8,7 +8,7 @@ import { useBitcoinExplorerLink } from '@app/common/hooks/use-bitcoin-explorer-l import { baseCurrencyAmountInQuote } from '@app/common/money/calculate-money'; import { i18nFormatCurrency } from '@app/common/money/format-money'; import { satToBtc } from '@app/common/money/unit-conversion'; -import { useCryptoCurrencyMarketData } from '@app/query/common/market-data/market-data.hooks'; +import { useCryptoCurrencyMarketDataMean } from '@app/query/common/market-data/market-data.hooks'; import { Flag } from '@app/ui/components/flag/flag'; import { Caption } from '@app/ui/components/typography/caption'; import { BitcoinContractIcon } from '@app/ui/icons/bitcoin-contract-icon'; @@ -26,7 +26,7 @@ export function BitcoinContractListItemLayout({ txid, }: BitcoinContractListItemLayoutProps) { const { handleOpenBitcoinTxLink: handleOpenTxLink } = useBitcoinExplorerLink(); - const bitcoinMarketData = useCryptoCurrencyMarketData('BTC'); + const bitcoinMarketData = useCryptoCurrencyMarketDataMean('BTC'); const getFiatValue = useCallback( (value: string) => diff --git a/src/app/pages/rpc-send-transfer/rpc-send-transfer-confirmation.tsx b/src/app/pages/rpc-send-transfer/rpc-send-transfer-confirmation.tsx index 21120194749..d1445e47d6c 100644 --- a/src/app/pages/rpc-send-transfer/rpc-send-transfer-confirmation.tsx +++ b/src/app/pages/rpc-send-transfer/rpc-send-transfer-confirmation.tsx @@ -16,7 +16,7 @@ import { satToBtc } from '@app/common/money/unit-conversion'; import { InfoCardFooter } from '@app/components/info-card/info-card'; import { useCurrentNativeSegwitUtxos } from '@app/query/bitcoin/address/utxos-by-address.hooks'; import { useBitcoinBroadcastTransaction } from '@app/query/bitcoin/transaction/use-bitcoin-broadcast-transaction'; -import { useCryptoCurrencyMarketData } from '@app/query/common/market-data/market-data.hooks'; +import { useCryptoCurrencyMarketDataMean } from '@app/query/common/market-data/market-data.hooks'; import { useCurrentAccountNativeSegwitAddressIndexZero } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; import { Button } from '@app/ui/components/button/button'; import { truncateMiddle } from '@app/ui/utils/truncate-middle'; @@ -45,7 +45,7 @@ export function RpcSendTransferConfirmation() { const bitcoinAddress = useCurrentAccountNativeSegwitAddressIndexZero(); const { broadcastTx, isBroadcasting } = useBitcoinBroadcastTransaction(); const { refetch } = useCurrentNativeSegwitUtxos(); - const btcMarketData = useCryptoCurrencyMarketData('BTC'); + const btcMarketData = useCryptoCurrencyMarketDataMean('BTC'); const psbt = decodeBitcoinTx(tx); const transferAmount = satToBtc(psbt.outputs[0].amount.toString()).toString(); diff --git a/src/app/pages/rpc-sign-psbt/use-rpc-sign-psbt.tsx b/src/app/pages/rpc-sign-psbt/use-rpc-sign-psbt.tsx index 0ed40f404d2..65f6c0dc6d3 100644 --- a/src/app/pages/rpc-sign-psbt/use-rpc-sign-psbt.tsx +++ b/src/app/pages/rpc-sign-psbt/use-rpc-sign-psbt.tsx @@ -19,7 +19,7 @@ import { useCurrentNativeSegwitUtxos } from '@app/query/bitcoin/address/utxos-by import { useBitcoinBroadcastTransaction } from '@app/query/bitcoin/transaction/use-bitcoin-broadcast-transaction'; import { useCalculateBitcoinFiatValue, - useCryptoCurrencyMarketData, + useCryptoCurrencyMarketDataMean, } from '@app/query/common/market-data/market-data.hooks'; import { useGetAssumedZeroIndexSigningConfig } from '@app/store/accounts/blockchain/bitcoin/bitcoin.hooks'; @@ -36,7 +36,7 @@ export function useRpcSignPsbt() { const { signPsbt, getPsbtAsTransaction } = usePsbtSigner(); const { broadcastTx, isBroadcasting } = useBitcoinBroadcastTransaction(); const { refetch } = useCurrentNativeSegwitUtxos(); - const btcMarketData = useCryptoCurrencyMarketData('BTC'); + const btcMarketData = useCryptoCurrencyMarketDataMean('BTC'); const calculateBitcoinFiatValue = useCalculateBitcoinFiatValue(); const getDefaultSigningConfig = useGetAssumedZeroIndexSigningConfig(); diff --git a/src/app/pages/send/ordinal-inscription/hooks/use-send-inscription-fees-list.ts b/src/app/pages/send/ordinal-inscription/hooks/use-send-inscription-fees-list.ts index 52435aa4d3f..169858218cc 100644 --- a/src/app/pages/send/ordinal-inscription/hooks/use-send-inscription-fees-list.ts +++ b/src/app/pages/send/ordinal-inscription/hooks/use-send-inscription-fees-list.ts @@ -10,7 +10,7 @@ import { FeesListItem } from '@app/components/bitcoin-fees-list/bitcoin-fees-lis import { useCurrentNativeSegwitUtxos } from '@app/query/bitcoin/address/utxos-by-address.hooks'; import { UtxoWithDerivationPath } from '@app/query/bitcoin/bitcoin-client'; import { useAverageBitcoinFeeRates } from '@app/query/bitcoin/fees/fee-estimates.hooks'; -import { useCryptoCurrencyMarketData } from '@app/query/common/market-data/market-data.hooks'; +import { useCryptoCurrencyMarketDataMean } from '@app/query/common/market-data/market-data.hooks'; import { useCurrentAccountNativeSegwitSigner } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; import { useGenerateUnsignedOrdinalTx } from './use-generate-ordinal-tx'; @@ -29,7 +29,7 @@ export function useSendInscriptionFeesList({ const createNativeSegwitSigner = useCurrentAccountNativeSegwitSigner(); const { data: nativeSegwitUtxos } = useCurrentNativeSegwitUtxos(); - const btcMarketData = useCryptoCurrencyMarketData('BTC'); + const btcMarketData = useCryptoCurrencyMarketDataMean('BTC'); const { data: feeRates, isLoading } = useAverageBitcoinFeeRates(); const { coverFeeFromAdditionalUtxos } = useGenerateUnsignedOrdinalTx(utxo); diff --git a/src/app/pages/send/send-crypto-asset-form/form/btc/btc-send-form-confirmation.tsx b/src/app/pages/send/send-crypto-asset-form/form/btc/btc-send-form-confirmation.tsx index d061ecf82b8..95715e67911 100644 --- a/src/app/pages/send/send-crypto-asset-form/form/btc/btc-send-form-confirmation.tsx +++ b/src/app/pages/send/send-crypto-asset-form/form/btc/btc-send-form-confirmation.tsx @@ -25,7 +25,7 @@ import { } from '@app/components/info-card/info-card'; import { useCurrentNativeSegwitUtxos } from '@app/query/bitcoin/address/utxos-by-address.hooks'; import { useBitcoinBroadcastTransaction } from '@app/query/bitcoin/transaction/use-bitcoin-broadcast-transaction'; -import { useCryptoCurrencyMarketData } from '@app/query/common/market-data/market-data.hooks'; +import { useCryptoCurrencyMarketDataMean } from '@app/query/common/market-data/market-data.hooks'; import { Button } from '@app/ui/components/button/button'; import { Footer } from '@app/ui/components/containers/footers/footer'; import { Card } from '@app/ui/layout/card/card'; @@ -53,7 +53,7 @@ export function BtcSendFormConfirmation() { const { refetch } = useCurrentNativeSegwitUtxos(); const analytics = useAnalytics(); - const btcMarketData = useCryptoCurrencyMarketData('BTC'); + const btcMarketData = useCryptoCurrencyMarketDataMean('BTC'); const { broadcastTx, isBroadcasting } = useBitcoinBroadcastTransaction(); const transaction = btc.Transaction.fromRaw(hexToBytes(tx)); diff --git a/src/app/pages/send/send-crypto-asset-form/form/btc/btc-send-form.tsx b/src/app/pages/send/send-crypto-asset-form/form/btc/btc-send-form.tsx index e7b99a86efc..ec9d508e7c3 100644 --- a/src/app/pages/send/send-crypto-asset-form/form/btc/btc-send-form.tsx +++ b/src/app/pages/send/send-crypto-asset-form/form/btc/btc-send-form.tsx @@ -10,7 +10,7 @@ import { CryptoCurrencies } from '@shared/models/currencies.model'; import { formatMoney } from '@app/common/money/format-money'; import { HighFeeDialog } from '@app/features/dialogs/high-fee-dialog/high-fee-dialog'; import { useNativeSegwitBalance } from '@app/query/bitcoin/balance/btc-native-segwit-balance.hooks'; -import { useCryptoCurrencyMarketData } from '@app/query/common/market-data/market-data.hooks'; +import { useCryptoCurrencyMarketDataMean } from '@app/query/common/market-data/market-data.hooks'; import { useCurrentAccountNativeSegwitIndexZeroSigner } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; import { BtcAvatarIcon } from '@app/ui/components/avatar/btc-avatar-icon'; import { Button } from '@app/ui/components/button/button'; @@ -34,7 +34,7 @@ const symbol: CryptoCurrencies = 'BTC'; export function BtcSendForm() { const routeState = useSendFormRouteState(); - const btcMarketData = useCryptoCurrencyMarketData(symbol); + const btcMarketData = useCryptoCurrencyMarketDataMean(symbol); const nativeSegwitSigner = useCurrentAccountNativeSegwitIndexZeroSigner(); const { btcBalance } = useNativeSegwitBalance(nativeSegwitSigner.address); diff --git a/src/app/pages/send/send-crypto-asset-form/form/stx/stx-send-form.tsx b/src/app/pages/send/send-crypto-asset-form/form/stx/stx-send-form.tsx index 0e95742f203..f448d081c7e 100644 --- a/src/app/pages/send/send-crypto-asset-form/form/stx/stx-send-form.tsx +++ b/src/app/pages/send/send-crypto-asset-form/form/stx/stx-send-form.tsx @@ -1,6 +1,6 @@ import { CryptoCurrencies } from '@shared/models/currencies.model'; -import { useCryptoCurrencyMarketData } from '@app/query/common/market-data/market-data.hooks'; +import { useCryptoCurrencyMarketDataMean } from '@app/query/common/market-data/market-data.hooks'; import { StxAvatarIcon } from '@app/ui/components/avatar/stx-avatar-icon'; import { AmountField } from '../../components/amount-field'; @@ -13,7 +13,7 @@ import { useStxSendForm } from './use-stx-send-form'; const symbol: CryptoCurrencies = 'STX'; export function StxSendForm() { - const stxMarketData = useCryptoCurrencyMarketData(symbol); + const stxMarketData = useCryptoCurrencyMarketDataMean(symbol); const { availableStxBalance, diff --git a/src/app/pages/swap/components/swap-choose-asset/components/swap-asset-item.tsx b/src/app/pages/swap/components/swap-choose-asset/components/swap-asset-item.tsx index 8e56372da2b..3a13017a301 100644 --- a/src/app/pages/swap/components/swap-choose-asset/components/swap-asset-item.tsx +++ b/src/app/pages/swap/components/swap-choose-asset/components/swap-asset-item.tsx @@ -1,6 +1,6 @@ import { SwapSelectors } from '@tests/selectors/swap.selectors'; -import { useAlexSdkBalanceAsFiat } from '@app/common/hooks/use-alex-sdk'; +import { useFormattedBaseUnitAsFiat } from '@app/common/hooks/use-convert-to-fiat-amount'; import { formatMoneyWithoutSymbol } from '@app/common/money/format-money'; import type { SwapAsset } from '@app/pages/swap/hooks/use-swap-form'; import { useGetFungibleTokenMetadataQuery } from '@app/query/stacks/tokens/fungible-tokens/fungible-token-metadata.query'; @@ -14,7 +14,7 @@ interface SwapAssetItemProps { onClick(): void; } export function SwapAssetItem({ asset, onClick }: SwapAssetItemProps) { - const balanceAsFiat = useAlexSdkBalanceAsFiat(asset.balance, asset.price); + const balanceAsFiat = useFormattedBaseUnitAsFiat(asset.balance, asset.price); const { data: ftMetadata } = useGetFungibleTokenMetadataQuery(asset.principal); const ftMetadataName = ftMetadata && isFtAsset(ftMetadata) ? ftMetadata.name : asset.name; diff --git a/src/app/pages/swap/components/swap-selected-asset-from.tsx b/src/app/pages/swap/components/swap-selected-asset-from.tsx index 7dac171bcff..13dd5170572 100644 --- a/src/app/pages/swap/components/swap-selected-asset-from.tsx +++ b/src/app/pages/swap/components/swap-selected-asset-from.tsx @@ -5,7 +5,7 @@ import { createMoney } from '@shared/models/money.model'; import { isUndefined } from '@shared/utils'; import { useShowFieldError } from '@app/common/form-utils'; -import { useAlexSdkAmountAsFiat } from '@app/common/hooks/use-alex-sdk'; +import { useFormattedFractionalUnitAsFiat } from '@app/common/hooks/use-convert-to-fiat-amount'; import { convertAmountToFractionalUnit } from '@app/common/money/calculate-money'; import { formatMoneyWithoutSymbol } from '@app/common/money/format-money'; @@ -30,7 +30,7 @@ export function SwapSelectedAssetFrom({ onChooseAsset, title }: SwapSelectedAsse const showError = useShowFieldError('swapAmountFrom'); const [assetField] = useField('swapAssetFrom'); - const amountAsFiat = useAlexSdkAmountAsFiat( + const amountAsFiat = useFormattedFractionalUnitAsFiat( assetField.value.balance, assetField.value.price, amountField.value diff --git a/src/app/pages/swap/components/swap-selected-asset-to.tsx b/src/app/pages/swap/components/swap-selected-asset-to.tsx index 284f9e0b823..3bffbb6311d 100644 --- a/src/app/pages/swap/components/swap-selected-asset-to.tsx +++ b/src/app/pages/swap/components/swap-selected-asset-to.tsx @@ -1,6 +1,6 @@ import { useField } from 'formik'; -import { useAlexSdkAmountAsFiat } from '@app/common/hooks/use-alex-sdk'; +import { useFormattedFractionalUnitAsFiat } from '@app/common/hooks/use-convert-to-fiat-amount'; import { formatMoneyWithoutSymbol } from '@app/common/money/format-money'; import { LoadingSpinner } from '@app/components/loading-spinner'; @@ -17,7 +17,7 @@ export function SwapSelectedAssetTo({ onChooseAsset, title }: SwapSelectedAssetT const [amountField] = useField('swapAmountTo'); const [assetField] = useField('swapAssetTo'); - const amountAsFiat = useAlexSdkAmountAsFiat( + const amountAsFiat = useFormattedFractionalUnitAsFiat( assetField.value?.balance, assetField.value?.price, amountField.value diff --git a/src/app/query/bitcoin/bitcoin-client.ts b/src/app/query/bitcoin/bitcoin-client.ts index 5ed7a546830..82fef48ceae 100644 --- a/src/app/query/bitcoin/bitcoin-client.ts +++ b/src/app/query/bitcoin/bitcoin-client.ts @@ -64,6 +64,7 @@ interface Brc20TokenResponse { available_balance: string; transferrable_balance: string; image_url: string | null; + min_listed_unit_price: number; } export interface Brc20Token extends Brc20TokenResponse { @@ -97,7 +98,7 @@ interface BestinslotBrc20AddressBalanceResponse { } class BestinslotApi { - url = 'https://api.bestinslot.xyz/v3'; + url = 'https://leatherapi.bestinslot.xyz/v3'; private defaultOptions = { headers: { 'x-api-key': `${process.env.BESTINSLOT_API_KEY}`, diff --git a/src/app/query/bitcoin/ordinals/brc20/brc20-tokens.query.ts b/src/app/query/bitcoin/ordinals/brc20/brc20-tokens.query.ts index bb01f0a222b..4df6782d3ca 100644 --- a/src/app/query/bitcoin/ordinals/brc20/brc20-tokens.query.ts +++ b/src/app/query/bitcoin/ordinals/brc20/brc20-tokens.query.ts @@ -51,18 +51,18 @@ export function useGetBrc20TokensQuery() { } const brc20TokensPromises = addressesData.map(async address => { - const brc20Tokens = await client.HiroApi.getBrc20Balance(address); + const brc20Tokens = await client.BestinslotApi.getBrc20Balance(address); const tickerPromises = await Promise.all( - brc20Tokens.results.map(token => { - return client.HiroApi.getBrc20TickerData(token.ticker); + brc20Tokens.data.map(token => { + return client.BestinslotApi.getBrc20TickerData(token.ticker); }) ); - return brc20Tokens.results.map((token, index) => { + return brc20Tokens.data.map((token, index) => { return { ...token, - decimals: tickerPromises[index].results[0].decimals, + decimals: tickerPromises[index].data.decimals, holderAddress: address, }; }); diff --git a/src/app/query/common/market-data/market-data.hooks.ts b/src/app/query/common/market-data/market-data.hooks.ts index 499fd612837..03170679791 100644 --- a/src/app/query/common/market-data/market-data.hooks.ts +++ b/src/app/query/common/market-data/market-data.hooks.ts @@ -37,7 +37,7 @@ function pullPriceDataFromAvailableResponses(responses: MarketDataVendorWithPric .map(val => convertAmountToFractionalUnit(val, currencyDecimalsMap.USD)); } -export function useCryptoCurrencyMarketData(currency: CryptoCurrencies): MarketData { +export function useCryptoCurrencyMarketDataMean(currency: CryptoCurrencies): MarketData { const { data: coingecko } = useCoinGeckoMarketDataQuery(currency); const { data: coincap } = useCoincapMarketDataQuery(currency); const { data: binance } = useBinanceMarketDataQuery(currency); @@ -55,7 +55,7 @@ export function useCryptoCurrencyMarketData(currency: CryptoCurrencies): MarketD } export function useCalculateBitcoinFiatValue() { - const btcMarketData = useCryptoCurrencyMarketData('BTC'); + const btcMarketData = useCryptoCurrencyMarketDataMean('BTC'); return useCallback( (value: Money) => baseCurrencyAmountInQuote(value, btcMarketData),