@openocean.finance/widget
Version:
Openocean Widget for cross-chain bridging and swapping. It will drive your multi-chain strategy and attract new users from everywhere.
55 lines • 2.36 kB
JavaScript
import { useAccount } from '@openocean.finance/wallet-management';
import { useMemo } from 'react';
import { useToken } from './useToken.js';
import { useTokenBalance } from './useTokenBalance.js';
import { useTokenBalances } from './useTokenBalances.js';
import { isNativeToken } from './useTokens.js';
function isSameTokenAddress(addressA, addressB) {
if (!addressA || !addressB) {
return false;
}
if (addressA.toLowerCase() === addressB.toLowerCase()) {
return true;
}
return isNativeToken(addressA) && isNativeToken(addressB);
}
export const useTokenAddressBalance = (chainId, tokenAddress) => {
const { tokens, tokensWithBalance, chain, isBalanceLoading, refetch: refetchBulkBalances, } = useTokenBalances(chainId);
const { account } = useAccount({ chainType: chain?.chainType });
const { token: tokenMeta, isLoading: isTokenMetaLoading } = useToken(chainId, tokenAddress);
const bulkToken = useMemo(() => {
if (!tokenAddress || !chainId) {
return undefined;
}
return (tokensWithBalance ?? tokens)?.find((token) => token.chainId === chainId &&
isSameTokenAddress(token.address, tokenAddress));
}, [chainId, tokenAddress, tokens, tokensWithBalance]);
const needsIndividualBalance = Boolean(account?.address &&
tokenMeta &&
(!bulkToken || bulkToken.amount === undefined));
const { token: individualBalance, isLoading: isIndividualBalanceLoading, refetch: refetchIndividualBalance, } = useTokenBalance(needsIndividualBalance ? account?.address : undefined, needsIndividualBalance ? tokenMeta : undefined);
const token = useMemo(() => {
if (bulkToken?.amount !== undefined) {
return bulkToken;
}
if (individualBalance) {
return individualBalance;
}
return bulkToken ?? tokenMeta;
}, [bulkToken, individualBalance, tokenMeta]);
const refetch = async () => {
await refetchBulkBalances();
if (needsIndividualBalance) {
await refetchIndividualBalance();
}
};
return {
token,
chain,
isLoading: isBalanceLoading ||
isTokenMetaLoading ||
(needsIndividualBalance && isIndividualBalanceLoading),
refetch,
};
};
//# sourceMappingURL=useTokenAddressBalance.js.map