import { ECLIPSE_RPC_URL } from '../../utils/eclipse.js'; import type { Token, TokenAmount } from '../../types/token.js'; import axios from 'axios'; import { ECLIPSE_NATIVE_ADDRESS } from '../../utils/constants.js'; export const getEclipseBalance = async ( walletAddress: string, tokens: Token[], ): Promise => { if (tokens.length === 0) { return []; } const tokenBalances: TokenAmount[] = []; const [nativeBalance, listTokens, tokens2022] = await Promise.all([ axios .post( ECLIPSE_RPC_URL, { jsonrpc: '2.0', id: 1, method: 'getBalance', params: [walletAddress], }, { timeout: 15_000, // 15s }, ) .then((res) => res.data?.result?.value || 0), axios .post( ECLIPSE_RPC_URL, { method: 'getTokenAccountsByOwner', jsonrpc: '2.0', id: 1, params: [ walletAddress, { programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA', }, { encoding: 'jsonParsed', commitment: 'recent', }, ], }, { timeout: 15_000, // 15s }, ) .then((res) => res.data?.result?.value || []), axios .post( ECLIPSE_RPC_URL, { method: 'getTokenAccountsByOwner', jsonrpc: '2.0', id: 1, params: [ walletAddress, { programId: 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb', }, { encoding: 'jsonParsed', commitment: 'recent', }, ], }, { timeout: 15_000, // 15s }, ) .then((res) => res.data?.result?.value || []), ]); const allTokens = [...listTokens, ...tokens2022].filter((item: any) => { const token = item?.account?.data?.parsed?.info; return ( token?.mint && token?.tokenAmount?.amount && token.tokenAmount.amount !== '0' ); }); const holdings = [ (() => { if (Number(nativeBalance) === 0) { return null; } return { contract_address: ECLIPSE_NATIVE_ADDRESS, balance: nativeBalance, }; })(), ...allTokens.map((item: any) => { const token = item.account.data.parsed.info; return { contract_address: token.mint, balance: token.tokenAmount.amount, }; }), ].filter(Boolean); tokens.forEach((token) => { const balance = holdings.find( (item: any) => item.contract_address === token.address, )?.balance; if (balance) { tokenBalances.push({ ...token, amount: BigInt(balance || 0), }); } else { tokenBalances.push({ ...token, amount: BigInt(0), }); } }); return tokenBalances; };