UNPKG

@lifi/widget

Version:

LI.FI Widget for cross-chain bridging and swapping. It will drive your multi-chain strategy and attract new users from everywhere.

108 lines 4.61 kB
import { formatUnits } from 'viem'; const sortByBalances = (a, b) => Number.parseFloat(formatUnits(b.amount ?? 0n, b.decimals)) * Number.parseFloat(b.priceUSD ?? '0') - Number.parseFloat(formatUnits(a.amount ?? 0n, a.decimals)) * Number.parseFloat(a.priceUSD ?? '0'); const sortByVolume = (a, b) => (b.volumeUSD24H ?? 0) - (a.volumeUSD24H ?? 0); export const processTokenBalances = (isBalanceLoading, noCategories, configTokens, selectedChainId, tokens, tokensWithBalances) => { if (isBalanceLoading) { if (noCategories) { const sortedTokens = [...(tokens ?? [])].sort(sortByVolume); return { processedTokens: sortedTokens, withCategories: false, }; } else { return processedTypedTokens(tokens ?? [], [], selectedChainId, configTokens); } } const sortedTokensWithBalances = [...(tokensWithBalances ?? [])].sort(sortByBalances); const tokensWithBalancesSet = new Set(sortedTokensWithBalances.map((token) => `${token.chainId}-${token.address.toLowerCase()}`)); const tokensWithoutBalances = tokens ?.filter((token) => { const tokenKey = `${token.chainId}-${token.address.toLowerCase()}`; return !tokensWithBalancesSet.has(tokenKey); }) .sort(sortByVolume) ?? []; if (noCategories) { return { processedTokens: [...sortedTokensWithBalances, ...tokensWithoutBalances], withCategories: false, }; } else { return processedTypedTokens(tokensWithoutBalances, sortedTokensWithBalances, selectedChainId, configTokens); } }; // NB: only for non-all-networks const processedTypedTokens = (tokens, tokensWithBalances, selectedChainId, configTokens) => { const filteredTokensMap = new Map(tokens.map((token) => [token.address, token])); const featuredTokensFromConfig = []; const popularTokensFromConfig = []; ['popular', 'featured'].forEach((tokenType) => { const typedTokens = configTokens?.[tokenType]?.filter((token) => token.chainId === selectedChainId); typedTokens?.forEach((token) => { const tokenAmount = { ...token }; tokenAmount[tokenType] = true; // Config tokens are explicitly set by integrator, mark as verified tokenAmount.verified = true; const match = filteredTokensMap.get(token.address); if (match?.priceUSD) { tokenAmount.priceUSD = match.priceUSD; } if (!token.logoURI && match?.logoURI) { tokenAmount.logoURI = match.logoURI; } if (tokenType === 'popular') { popularTokensFromConfig.push(tokenAmount); } else { featuredTokensFromConfig.push(tokenAmount); } }); }); // Filter out config-added tokens from main list const configTokenAddresses = new Set([...popularTokensFromConfig, ...featuredTokensFromConfig].map((t) => t.address.toLowerCase())); const remainingTokens = tokens.filter((token) => !configTokenAddresses.has(token.address.toLowerCase())); const otherTokens = []; for (const token of remainingTokens) { if (token.featured) { featuredTokensFromConfig.push(token); } else if (token.popular) { popularTokensFromConfig.push(token); } else { otherTokens.push(token); } } const sortedFeaturedTokens = [...featuredTokensFromConfig].sort(sortByVolume); const sortedPopularTokens = [...popularTokensFromConfig].sort(sortByVolume); const sortedOtherTokens = [...otherTokens].sort(sortByVolume); return { processedTokens: [ ...sortedFeaturedTokens, ...tokensWithBalances, ...sortedPopularTokens, ...sortedOtherTokens, ], withCategories: Boolean(featuredTokensFromConfig?.length || popularTokensFromConfig?.length), }; }; export const isSearchMatch = (token, search) => { if (!search) { return true; } const searchLowerCase = search.toLowerCase(); return (token.name?.toLowerCase().includes(searchLowerCase) || token.symbol ?.replaceAll('₮', 'T') .toLowerCase() .includes(searchLowerCase) || token.address?.toLowerCase().includes(searchLowerCase)); }; export const isSupportedToken = (token) => { return token.name && token.symbol && token.priceUSD && token.chainId; }; //# sourceMappingURL=tokenList.js.map