diff --git a/.env.local.example b/.env.local.example index fc851980..691db78d 100644 --- a/.env.local.example +++ b/.env.local.example @@ -2,9 +2,31 @@ NEXT_PUBLIC_GOOGLE_ANALYTICS_ID= NEXT_PUBLIC_REOWN_PROJECT_ID= ENVIRONMENT= -NEXT_PUBLIC_ALCHEMY_API_KEY= NEXT_PUBLIC_INFURA_API_KEY= +# ==================== RPC Settings ==================== + +# RPC Priority: Set to "ALCHEMY" to prioritize Alchemy API when both are available +# Default (or any other value): Prioritizes individual network RPCs first +NEXT_PUBLIC_RPC_PRIORITY=ALCHEMY + +# Must set either NEXT_PUBLIC_ALCHEMY_API_KEY or individual RPC URLS for all networks + +# Alchemy API Key for all networks enabled in Alchemy project settings +NEXT_PUBLIC_ALCHEMY_API_KEY= + +# Individual RPC URLs +NEXT_PUBLIC_ETHEREUM_RPC= +NEXT_PUBLIC_BASE_RPC= +NEXT_PUBLIC_POLYGON_RPC= +NEXT_PUBLIC_UNICHAIN_RPC= +NEXT_PUBLIC_ARBITRUM_RPC= +NEXT_PUBLIC_HYPEREVM_RPC= +NEXT_PUBLIC_MONAD_RPC= + + +# ==================== End of RPC Settings ==================== + NEXT_PUBLIC_THEGRAPH_API_KEY= # Used for balance API diff --git a/app/api/balances/route.ts b/app/api/balances/route.ts index 851aff40..8e2e2d19 100644 --- a/app/api/balances/route.ts +++ b/app/api/balances/route.ts @@ -1,13 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server'; -import { SupportedNetworks, getDefaultRPC } from '@/utils/networks'; +import type { SupportedNetworks } from '@/utils/networks'; import { supportedTokens } from '@/utils/tokens'; import { getKnownBalancesWithClient } from './evm-client'; -type TokenBalance = { - contractAddress: string; - tokenBalance: string; -}; - export async function GET(req: NextRequest) { const searchParams = req.nextUrl.searchParams; const address = searchParams.get('address'); @@ -19,65 +14,15 @@ export async function GET(req: NextRequest) { try { const chainIdNum = Number(chainId) as SupportedNetworks; - const alchemyUrl = getDefaultRPC(chainIdNum); - if (!alchemyUrl) { - throw new Error(`Chain ${chainId} not supported`); - } // Get supported token addresses for this chain const tokenAddresses = supportedTokens .filter((token) => token.networks.some((network) => network.chain.id === chainIdNum)) .flatMap((token) => token.networks.filter((network) => network.chain.id === chainIdNum).map((network) => network.address)); - // Special handling for hyper and monad: no alchemy support - if (chainIdNum === SupportedNetworks.HyperEVM || chainIdNum === SupportedNetworks.Monad) { - const tokens = await getKnownBalancesWithClient(address, tokenAddresses, chainIdNum); - return NextResponse.json({ tokens }); - } - - // Get token balances for specific tokens only - const balancesResponse = await fetch(alchemyUrl, { - method: 'POST', - headers: { - accept: 'application/json', - 'content-type': 'application/json', - }, - body: JSON.stringify({ - id: 1, - jsonrpc: '2.0', - method: 'alchemy_getTokenBalances', - params: [address, tokenAddresses], - }), - }); - - if (!balancesResponse.ok) { - console.error(`Failed to fetch balances: ${balancesResponse.status} ${balancesResponse.statusText}`); - throw new Error(`HTTP error! status: ${balancesResponse.status}`); - } - - const balancesData = (await balancesResponse.json()) as { - id: number; - jsonrpc: string; - result: { - tokenBalances: TokenBalance[]; - }; - }; - - const nonZeroBalances: TokenBalance[] = balancesData.result.tokenBalances.filter( - (token: TokenBalance) => token.tokenBalance !== '0x0000000000000000000000000000000000000000000000000000000000000000', - ); - - // Filter out failed metadata requests - const tokens = nonZeroBalances - .filter((token) => token !== null) - .map((token) => ({ - address: token.contractAddress.toLowerCase(), - balance: BigInt(token.tokenBalance).toString(10), - })); - - return NextResponse.json({ - tokens, - }); + // use multicall to query balances at once + const tokens = await getKnownBalancesWithClient(address, tokenAddresses, chainIdNum); + return NextResponse.json({ tokens }); } catch (error) { console.error('Failed to fetch balances:', error); return NextResponse.json({ error: 'Failed to fetch balances' }, { status: 500 }); diff --git a/app/market/[chainId]/[marketid]/RateChart.tsx b/app/market/[chainId]/[marketid]/RateChart.tsx index e94bc21f..9bcd2ec5 100644 --- a/app/market/[chainId]/[marketid]/RateChart.tsx +++ b/app/market/[chainId]/[marketid]/RateChart.tsx @@ -258,7 +258,7 @@ function RateChart({ historicalData, market, isLoading, selectedTimeframe, selec