UNPKG

@reservoir0x/relay-kit-ui

Version:

Relay is the Fastest and Cheapest Way to Bridge and Transact Across Chains.

98 lines 4.49 kB
import { formatUnits, isAddress, zeroAddress } from 'viem'; import { ProviderOptionsContext } from '../providers/RelayKitProvider.js'; import { useContext } from 'react'; import { useQuery } from '@tanstack/react-query'; import { eclipse, isSolanaAddress, solana } from '../utils/solana.js'; export default (address, evmChainIds = 'mainnet', queryOptions) => { const providerOptions = useContext(ProviderOptionsContext); const queryKey = ['useDuneBalances', address]; const isEvmAddress = isAddress(address ?? ''); const isSvmAddress = isSolanaAddress(address ?? ''); const response = useQuery({ queryKey: ['useDuneBalances', address], queryFn: () => { let url = `${providerOptions.duneConfig?.apiBaseUrl ?? 'https://api.sim.dune.com'}/v1/evm/balances/${address?.toLowerCase()}?chain_ids=${evmChainIds}&exclude_spam_tokens=true`; if (isSvmAddress) { url = `${providerOptions.duneConfig?.apiBaseUrl ?? 'https://api.sim.dune.com'}/beta/svm/balances/${address}?chain_ids=all&exclude_spam_tokens=true`; } if (!isSvmAddress && !isEvmAddress) { return null; } return fetch(url, { headers: providerOptions.duneConfig?.apiKey ? { 'X-Sim-Api-Key': providerOptions.duneConfig?.apiKey } : {} }) .then((response) => response.json()) .then((response) => { if (response.balances) { const balances = response.balances; if (balances) { balances .filter((balance) => { try { BigInt(balance.amount); return true; } catch (e) { return false; } }) .sort((a, b) => { // Check if value_usd exists and use it for comparison if available if (a.value_usd !== undefined && b.value_usd !== undefined) { return a.value_usd - b.value_usd; } else if (a.value_usd !== undefined) { return -1; // a should come before b as it has a value_usd } else if (b.value_usd !== undefined) { return 1; // b should come before a as it has a value_usd } else { const amountA = parseFloat(formatUnits(BigInt(a.amount), a.decimals)); const amountB = parseFloat(formatUnits(BigInt(b.amount), b.decimals)); return amountA - amountB; } }); } } return response; }); }, ...queryOptions, enabled: address !== undefined && providerOptions.duneConfig?.apiKey !== undefined && queryOptions?.enabled && (isSvmAddress || isEvmAddress) }); response?.data?.balances?.forEach((balance) => { if (!balance.chain_id && balance.chain === 'solana') { balance.chain_id = solana.id; } if (!balance.chain_id && balance.chain === 'eclipse') { balance.chain_id = eclipse.id; } }); const balanceMap = response?.data?.balances?.reduce((balanceMap, balance) => { if (balance.address === 'native') { balance.address = balance.chain === 'solana' || balance.chain === 'eclipse' ? '11111111111111111111111111111111' : zeroAddress; } let chainId = balance.chain_id; if (!chainId && balance.chain === 'solana') { chainId = solana.id; } if (!chainId && balance.chain === 'eclipse') { chainId = eclipse.id; } balanceMap[`${chainId}:${balance.address}`] = balance; return balanceMap; }, {}); return { ...response, balanceMap, queryKey }; }; //# sourceMappingURL=useDuneBalances.js.map