From de84604394733d6f6fb60bbc7ee56201f0659263 Mon Sep 17 00:00:00 2001 From: Matthew Pereira Date: Wed, 9 Oct 2024 13:47:02 -0700 Subject: [PATCH] add fallbacks for rpc url --- packages/nextjs/scaffold.config.ts | 3 +-- packages/nextjs/services/web3/wagmiConfig.tsx | 6 +++--- packages/nextjs/utils/scaffold-eth/networks.ts | 13 ++++++++++++- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/nextjs/scaffold.config.ts b/packages/nextjs/scaffold.config.ts index 8ad610f..c8e9322 100644 --- a/packages/nextjs/scaffold.config.ts +++ b/packages/nextjs/scaffold.config.ts @@ -20,11 +20,10 @@ const scaffoldConfig = { // it has no effect if you only target the local network (default is 4000) pollingInterval: 30000, - // This is ours Alchemy's default API key. // You can get your own at https://dashboard.alchemyapi.io // It's recommended to store it in an env variable: // .env.local for local testing, and in the Vercel/system env config for live apps. - alchemyApiKey: process.env.NEXT_PUBLIC_ALCHEMY_API_KEY || "oKxs-03sij-U_N0iOlrSsZFr29-IqbuF", + alchemyApiKey: process.env.NEXT_PUBLIC_ALCHEMY_API_KEY || "", // This is ours WalletConnect's default project ID. // You can get your own at https://cloud.walletconnect.com diff --git a/packages/nextjs/services/web3/wagmiConfig.tsx b/packages/nextjs/services/web3/wagmiConfig.tsx index e207843..c77b97e 100644 --- a/packages/nextjs/services/web3/wagmiConfig.tsx +++ b/packages/nextjs/services/web3/wagmiConfig.tsx @@ -1,9 +1,9 @@ import { wagmiConnectors } from "./wagmiConnectors"; -import { Chain, createClient, http } from "viem"; +import { Chain, createClient, fallback, http } from "viem"; import { hardhat, mainnet } from "viem/chains"; import { createConfig } from "wagmi"; import scaffoldConfig from "~~/scaffold.config"; -import { getAlchemyHttpUrl } from "~~/utils/scaffold-eth"; +import { getAlchemyHttpUrl, getRpcFallbackUrl } from "~~/utils/scaffold-eth"; const { targetNetworks } = scaffoldConfig; @@ -19,7 +19,7 @@ export const wagmiConfig = createConfig({ client({ chain }) { return createClient({ chain, - transport: http(getAlchemyHttpUrl(chain.id)), + transport: fallback([http(getAlchemyHttpUrl(chain.id)), http(), http(getRpcFallbackUrl(chain.id))]), ...(chain.id !== (hardhat as Chain).id ? { pollingInterval: scaffoldConfig.pollingInterval, diff --git a/packages/nextjs/utils/scaffold-eth/networks.ts b/packages/nextjs/utils/scaffold-eth/networks.ts index 6b8276f..8f525d0 100644 --- a/packages/nextjs/utils/scaffold-eth/networks.ts +++ b/packages/nextjs/utils/scaffold-eth/networks.ts @@ -34,11 +34,22 @@ export const RPC_CHAIN_NAMES: Record = { }; export const getAlchemyHttpUrl = (chainId: number) => { - return RPC_CHAIN_NAMES[chainId] + return scaffoldConfig.alchemyApiKey && RPC_CHAIN_NAMES[chainId] ? `https://${RPC_CHAIN_NAMES[chainId]}.g.alchemy.com/v2/${scaffoldConfig.alchemyApiKey}` : undefined; }; +export const RPC_FALLBACKS: Record = { + [chains.mainnet.id]: "https://eth.llamarpc.com", + [chains.arbitrum.id]: "https://arbitrum.llamarpc.com", + [chains.gnosis.id]: "https://gnosis.drpc.org", + [chains.sepolia.id]: "https://sepolia.gateway.tenderly.co", +}; + +export const getRpcFallbackUrl = (chainId: number) => { + return RPC_FALLBACKS[chainId]; +}; + export const NETWORKS_EXTRA_DATA: Record = { [chains.hardhat.id]: { color: "#b8af0c",