From 3e3bc488b233aa26b3150015b32659386d86d818 Mon Sep 17 00:00:00 2001 From: genaroibc Date: Thu, 26 Oct 2023 10:19:32 -0300 Subject: [PATCH] fix: use a different rpc url for each chain --- src/index.ts | 10 ++++++++- src/services/getEvmBalances.ts | 40 +++++++++++++++++++++++++++++----- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/index.ts b/src/index.ts index d3f368b..2462df0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -771,10 +771,18 @@ export class Squid { }): Promise { // remove invalid and duplicate chains and convert to number const filteredChains = new Set(chains.map(Number).filter(c => !isNaN(c))); + const chainRpcUrls = this.chains.reduce( + (acc, chain) => ({ + ...acc, + [chain.chainId]: chain.rpc + }), + {} + ); return getAllEvmTokensBalance( this.tokens.filter(t => filteredChains.has(Number(t.chainId))), - userAddress + userAddress, + chainRpcUrls ); } diff --git a/src/services/getEvmBalances.ts b/src/services/getEvmBalances.ts index 6d2532a..4ed36fa 100644 --- a/src/services/getEvmBalances.ts +++ b/src/services/getEvmBalances.ts @@ -17,12 +17,12 @@ const CHAINS_WITHOUT_MULTICALL_RPC_URLS: Record = { const getTokensBalanceSupportingMultiCall = async ( tokens: TokenData[], + chainRpcUrl: string, userAddress?: ContractAddress ): Promise => { if (!userAddress) return []; - const ETHEREUM_RPC_URL = "https://eth.meowrpc.com"; - const provider = new ethers.providers.JsonRpcProvider(ETHEREUM_RPC_URL); + const provider = new ethers.providers.JsonRpcProvider(chainRpcUrl); const contractCallContext: ContractCallContext[] = tokens.map(token => { const isNativeToken = @@ -116,7 +116,10 @@ const getTokensBalanceWithoutMultiCall = async ( export const getAllEvmTokensBalance = async ( evmTokens: TokenData[], - userAddress: string + userAddress: string, + chainRpcUrls: { + [chainId: string]: string; + } ): Promise => { try { // Some tokens don't support multicall, so we need to fetch them with Promise.all @@ -136,11 +139,36 @@ export const getAllEvmTokensBalance = async ( const tokensNotSupportingMulticall = splittedTokensByMultiCallSupport[0]; const tokensSupportingMulticall = splittedTokensByMultiCallSupport[1]; - const tokensMulticall = await getTokensBalanceSupportingMultiCall( - tokensSupportingMulticall, - userAddress as ContractAddress + const tokensByChainId = tokensSupportingMulticall.reduce( + (groupedTokens, token) => { + if (!groupedTokens[token.chainId]) { + groupedTokens[token.chainId] = []; + } + + groupedTokens[token.chainId].push(token); + + return groupedTokens; + }, + {} as Record ); + const tokensMulticall: TokenBalance[] = []; + + for (const chainId in tokensByChainId) { + const tokens = tokensByChainId[chainId]; + const rpcUrl = chainRpcUrls[chainId]; + + if (!rpcUrl) continue; + + const tokensBalances = await getTokensBalanceSupportingMultiCall( + tokens, + rpcUrl, + userAddress as ContractAddress + ); + + tokensMulticall.push(...tokensBalances); + } + const tokensNotMultiCall = await getTokensBalanceWithoutMultiCall( tokensNotSupportingMulticall, userAddress as ContractAddress