UNPKG

@openocean.finance/widget-sdk

Version:

OpenOcean Any-to-Any Cross-Chain-Swap SDK

76 lines 3.5 kB
import { ChainType, } from '@openocean.finance/widget-types'; import { config } from '../config.js'; import { ValidationError } from '../errors/errors.js'; import { isToken } from '../typeguards.js'; /** * Returns the balances of a specific token a wallet holds across all aggregated chains. * @param walletAddress - A wallet address. * @param token - A Token object. * @returns An object containing the token and the amounts on different chains. * @throws {BaseError} Throws a ValidationError if parameters are invalid. */ export const getTokenBalance = async (walletAddress, token) => { const tokenAmounts = await getTokenBalances(walletAddress, [token]); return tokenAmounts.length ? tokenAmounts[0] : null; }; /** * Returns the balances for a list tokens a wallet holds across all aggregated chains. * @param walletAddress - A wallet address. * @param tokens - A list of Token objects. * @returns A list of objects containing the tokens and the amounts on different chains. * @throws {BaseError} Throws a ValidationError if parameters are invalid. */ export const getTokenBalances = async (walletAddress, tokens) => { // split by chain const tokensByChain = tokens.reduce((tokens, token) => { if (!tokens[token.chainId]) { tokens[token.chainId] = []; } tokens[token.chainId].push(token); return tokens; }, {}); const tokenAmountsByChain = await getTokenBalancesByChain(walletAddress, tokensByChain); return Object.values(tokenAmountsByChain).flat(); }; /** * This method queries the balances of tokens for a specific list of chains for a given wallet. * @param walletAddress - A wallet address. * @param tokensByChain - A list of token objects organized by chain ids. * @returns A list of objects containing the tokens and the amounts on different chains organized by the chosen chains. * @throws {BaseError} Throws a ValidationError if parameters are invalid. */ export const getTokenBalancesByChain = async (walletAddress, tokensByChain) => { if (!walletAddress) { throw new ValidationError('Missing walletAddress.'); } const tokenList = Object.values(tokensByChain).flat(); const invalidTokens = tokenList.filter((token) => !isToken(token)); if (invalidTokens.length) { throw new ValidationError('Invalid tokens passed.'); } const tokenAmountsByChain = {}; const tokenAmountsSettled = await Promise.allSettled(Object.keys(tokensByChain).map(async (chainIdStr) => { const chainId = Number.parseInt(chainIdStr); const chain = await config.getChainById(chainId); const tokenAddress = tokensByChain[chainId][0].address; const provider = config .get() .providers.find((provider) => chain.chainType === ChainType.UTXO ? provider.isAddress(walletAddress) : provider.isAddress(tokenAddress)); if (!provider) { throw new Error(`SDK Token Provider for ${chain.chainType} is not found.`); } const tokenAmounts = await provider.getBalance(walletAddress, tokensByChain[chainId]); tokenAmountsByChain[chainId] = tokenAmounts; })); if (config.get().debug) { for (const result of tokenAmountsSettled) { if (result.status === 'rejected') { console.warn("Couldn't fetch token balance.", result.reason); } } } return tokenAmountsByChain; }; //# sourceMappingURL=balance.js.map