/ src / ui-config / networksConfig.ts
networksConfig.ts
  1  import { ChainId } from '@aave/contract-helpers';
  2  import {
  3    arbitrum,
  4    arbitrumSepolia,
  5    avalanche,
  6    avalancheFuji,
  7    base,
  8    baseSepolia,
  9    bsc,
 10    celo,
 11    Chain,
 12    gnosis,
 13    linea,
 14    mainnet,
 15    metis,
 16    optimism,
 17    optimismSepolia,
 18    polygon,
 19    scroll,
 20    scrollSepolia,
 21    sepolia,
 22    sonic,
 23    zksync,
 24  } from 'wagmi/chains';
 25  
 26  export type ExplorerLinkBuilderProps = {
 27    tx?: string;
 28    address?: string;
 29  };
 30  
 31  export type ExplorerLinkBuilderConfig = {
 32    baseUrl: string;
 33    addressPrefix?: string;
 34    txPrefix?: string;
 35  };
 36  
 37  export type NetworkConfig = {
 38    name: string;
 39    displayName?: string;
 40    publicJsonRPCUrl: readonly string[]; // public rpc used if not private found
 41    // https://github.com/aave/aave-api
 42    ratesHistoryApiUrl?: string;
 43    baseUniswapAdapter?: string;
 44    /**
 45     * When this is set withdrawals will automatically be unwrapped
 46     */
 47    wrappedBaseAssetSymbol: string;
 48    baseAssetSymbol: string;
 49    // needed for configuring the chain on metemask when it doesn't exist yet
 50    baseAssetDecimals: number;
 51    // usdMarket?: boolean;
 52    // function returning a link to etherscan et al
 53    explorerLink: string;
 54    explorerLinkBuilder: (props: ExplorerLinkBuilderProps) => string;
 55    // set this to show faucets and similar
 56    isTestnet?: boolean;
 57    // get's automatically populated on fork networks
 58    isFork?: boolean;
 59    networkLogoPath: string;
 60    // contains the forked off chainId
 61    underlyingChainId?: number;
 62    bridge?: {
 63      icon: string;
 64      name: string;
 65      url: string;
 66    };
 67    wagmiChain: Chain;
 68  };
 69  
 70  export type BaseNetworkConfig = Omit<NetworkConfig, 'explorerLinkBuilder'>;
 71  
 72  const ratesHistoryApiUrl = `${process.env.NEXT_PUBLIC_API_BASEURL}/data/rates-history`;
 73  
 74  export const testnetConfig: Record<string, BaseNetworkConfig> = {
 75    [ChainId.sepolia]: {
 76      name: 'Ethereum Sepolia',
 77      publicJsonRPCUrl: [
 78        'https://eth-sepolia.public.blastapi.io',
 79        'https://rpc.sepolia.org',
 80        'https://rpc2.sepolia.org',
 81        'https://rpc.sepolia.online',
 82        'https://www.sepoliarpc.space',
 83      ],
 84      baseUniswapAdapter: '0x0',
 85      baseAssetSymbol: 'ETH',
 86      wrappedBaseAssetSymbol: 'WETH',
 87      baseAssetDecimals: 18,
 88      explorerLink: 'https://sepolia.etherscan.io',
 89      isTestnet: true,
 90      networkLogoPath: '/icons/networks/ethereum.svg',
 91      wagmiChain: sepolia,
 92    },
 93    [ChainId.fuji]: {
 94      name: 'Avalanche Fuji',
 95      publicJsonRPCUrl: [
 96        'https://api.avax-test.network/ext/bc/C/rpc',
 97        'https://rpc.ankr.com/avalanche_fuji',
 98        'https://ava-testnet.public.blastapi.io/ext/bc/C/rpc',
 99      ],
100      baseUniswapAdapter: '0x0',
101      baseAssetSymbol: 'AVAX',
102      wrappedBaseAssetSymbol: 'WAVAX',
103      baseAssetDecimals: 18,
104      explorerLink: 'https://cchain.explorer.avax-test.network',
105      isTestnet: true,
106      networkLogoPath: '/icons/networks/avalanche.svg',
107      bridge: {
108        icon: '/icons/bridge/avalanche.svg',
109        name: 'Avalanche Bridge',
110        url: 'https://bridge.avax.network/',
111      },
112      wagmiChain: avalancheFuji,
113    },
114    [ChainId.arbitrum_sepolia]: {
115      name: 'Arbitrum Sepolia',
116      publicJsonRPCUrl: [
117        'https://sepolia-rollup.arbitrum.io/rpc',
118        'https://public.stackup.sh/api/v1/node/arbitrum-sepolia',
119      ],
120      baseUniswapAdapter: '0x0',
121      baseAssetSymbol: 'ETH',
122      wrappedBaseAssetSymbol: 'WETH',
123      baseAssetDecimals: 18,
124      explorerLink: 'https://sepolia.arbiscan.io',
125      isTestnet: true,
126      networkLogoPath: '/icons/networks/arbitrum.svg',
127      wagmiChain: arbitrumSepolia,
128    },
129    [ChainId.base_sepolia]: {
130      name: 'Base Sepolia',
131      publicJsonRPCUrl: [
132        'https://base-sepolia.blockpi.network/v1/rpc/public',
133        'https://sepolia.base.org',
134        'https://base-sepolia.gateway.tenderly.co',
135      ],
136      baseUniswapAdapter: '0x0',
137      baseAssetSymbol: 'ETH',
138      wrappedBaseAssetSymbol: 'WETH',
139      baseAssetDecimals: 18,
140      explorerLink: 'https://sepolia.basescan.org',
141      isTestnet: true,
142      networkLogoPath: '/icons/networks/base.svg',
143      wagmiChain: baseSepolia,
144    },
145    [ChainId.optimism_sepolia]: {
146      name: 'Optimism Sepolia',
147      publicJsonRPCUrl: ['https://sepolia.optimism.io'],
148      baseUniswapAdapter: '0x0',
149      baseAssetSymbol: 'ETH',
150      wrappedBaseAssetSymbol: 'WETH',
151      baseAssetDecimals: 18,
152      explorerLink: 'https://sepolia-optimistic.etherscan.io',
153      isTestnet: true,
154      networkLogoPath: '/icons/networks/optimism.svg',
155      wagmiChain: optimismSepolia,
156    },
157    [ChainId.scroll_sepolia]: {
158      name: 'Scroll Sepolia',
159      publicJsonRPCUrl: [
160        'https://sepolia-rpc.scroll.io',
161        'https://scroll-sepolia.blockpi.network/v1/rpc/public',
162      ],
163      baseUniswapAdapter: '0x0',
164      baseAssetSymbol: 'ETH',
165      wrappedBaseAssetSymbol: 'WETH',
166      baseAssetDecimals: 18,
167      explorerLink: 'https://sepolia.scrollscan.dev',
168      isTestnet: true,
169      networkLogoPath: '/icons/networks/scroll.svg',
170      wagmiChain: scrollSepolia,
171    },
172  };
173  
174  export const prodNetworkConfig: Record<string, BaseNetworkConfig> = {
175    [ChainId.mainnet]: {
176      name: 'Ethereum',
177      publicJsonRPCUrl: [
178        'https://mainnet.gateway.tenderly.co',
179        'https://rpc.flashbots.net',
180        'https://eth.llamarpc.com',
181        'https://eth-mainnet.public.blastapi.io',
182        'https://ethereum-rpc.publicnode.com',
183      ],
184      baseUniswapAdapter: '0xc3efa200a60883a96ffe3d5b492b121d6e9a1f3f',
185      baseAssetSymbol: 'ETH',
186      wrappedBaseAssetSymbol: 'WETH',
187      baseAssetDecimals: 18,
188      explorerLink: 'https://etherscan.io',
189      ratesHistoryApiUrl,
190      networkLogoPath: '/icons/networks/ethereum.svg',
191      wagmiChain: mainnet,
192    },
193    [ChainId.polygon]: {
194      name: 'Polygon POS',
195      displayName: 'Polygon',
196      publicJsonRPCUrl: [
197        'https://gateway.tenderly.co/public/polygon',
198        'https://polygon-pokt.nodies.app',
199        'https://polygon-bor-rpc.publicnode.com',
200        'https://polygon-rpc.com',
201        'https://polygon-mainnet.public.blastapi.io',
202        'https://rpc-mainnet.matic.quiknode.pro',
203      ],
204      baseAssetSymbol: 'POL',
205      wrappedBaseAssetSymbol: 'WPOL',
206      baseAssetDecimals: 18,
207      explorerLink: 'https://polygonscan.com',
208      networkLogoPath: '/icons/networks/polygon.svg',
209      bridge: {
210        icon: '/icons/bridge/polygon.svg',
211        name: 'Polygon PoS Bridge',
212        url: 'https://wallet.polygon.technology/polygon/bridge',
213      },
214      ratesHistoryApiUrl,
215      wagmiChain: polygon,
216    },
217    [ChainId.avalanche]: {
218      name: 'Avalanche',
219      publicJsonRPCUrl: [
220        'https://api.avax.network/ext/bc/C/rpc',
221        'https://ava-mainnet.public.blastapi.io/ext/bc/C/rpc',
222        'https://rpc.ankr.com/avalanche',
223      ],
224      baseUniswapAdapter: '0x0',
225      baseAssetSymbol: 'AVAX',
226      wrappedBaseAssetSymbol: 'WAVAX',
227      baseAssetDecimals: 18,
228      explorerLink: 'https://cchain.explorer.avax.network',
229      networkLogoPath: '/icons/networks/avalanche.svg',
230      bridge: {
231        icon: '/icons/bridge/avalanche.svg',
232        name: 'Avalanche Bridge',
233        url: 'https://bridge.avax.network/',
234      },
235      ratesHistoryApiUrl,
236      wagmiChain: avalanche,
237    },
238    [ChainId.arbitrum_one]: {
239      name: 'Arbitrum',
240      publicJsonRPCUrl: [
241        'https://arb1.arbitrum.io/rpc',
242        'https://rpc.ankr.com/arbitrum',
243        'https://1rpc.io/arb',
244      ],
245      baseUniswapAdapter: '0x0',
246      baseAssetSymbol: 'ETH',
247      wrappedBaseAssetSymbol: 'WETH',
248      baseAssetDecimals: 18,
249      explorerLink: 'https://arbiscan.io',
250      networkLogoPath: '/icons/networks/arbitrum.svg',
251      bridge: {
252        icon: '/icons/bridge/arbitrum.svg',
253        name: 'Arbitrum Bridge',
254        url: 'https://bridge.arbitrum.io',
255      },
256      ratesHistoryApiUrl,
257      wagmiChain: arbitrum,
258    },
259    [ChainId.base]: {
260      name: 'Base',
261      publicJsonRPCUrl: [
262        'https://mainnet.base.org',
263        'https://1rpc.io/base',
264        'https://base.publicnode.com',
265        'https://base-mainnet.public.blastapi.io',
266      ],
267      baseUniswapAdapter: '0x0',
268      baseAssetSymbol: 'ETH',
269      wrappedBaseAssetSymbol: 'WETH',
270      baseAssetDecimals: 18,
271      explorerLink: 'https://basescan.org',
272      networkLogoPath: '/icons/networks/base.svg',
273      bridge: {
274        icon: '/icons/networks/base.svg',
275        name: 'Base Bridge',
276        url: 'https://bridge.base.org/',
277      },
278      ratesHistoryApiUrl,
279      wagmiChain: base,
280    },
281    [ChainId.optimism]: {
282      name: 'OP',
283      publicJsonRPCUrl: ['https://optimism-mainnet.public.blastapi.io', 'https://1rpc.io/op'],
284      baseUniswapAdapter: '0x0',
285      baseAssetSymbol: 'ETH',
286      wrappedBaseAssetSymbol: 'WETH',
287      baseAssetDecimals: 18,
288      explorerLink: 'https://optimistic.etherscan.io',
289      networkLogoPath: '/icons/networks/optimism.svg',
290      bridge: {
291        icon: '/icons/bridge/optimism.svg',
292        name: 'OP Bridge',
293        url: 'https://app.optimism.io/bridge',
294      },
295      ratesHistoryApiUrl,
296      wagmiChain: optimism,
297    },
298    [ChainId.metis_andromeda]: {
299      name: 'Metis Andromeda',
300      publicJsonRPCUrl: ['https://andromeda.metis.io/?owner=1088'],
301      baseAssetSymbol: '', // N/A
302      wrappedBaseAssetSymbol: '', // N/A
303      baseAssetDecimals: 0, // N/A
304      explorerLink: 'https://andromeda-explorer.metis.io',
305      networkLogoPath: '/icons/networks/metis.svg',
306      ratesHistoryApiUrl,
307      wagmiChain: metis,
308    },
309    [ChainId.xdai]: {
310      name: 'Gnosis Chain',
311      publicJsonRPCUrl: ['https://rpc.ankr.com/gnosis', 'https://rpc.gnosischain.com'],
312      baseUniswapAdapter: '0x0',
313      baseAssetSymbol: 'xDAI',
314      wrappedBaseAssetSymbol: 'WXDAI',
315      baseAssetDecimals: 18,
316      explorerLink: 'https://gnosisscan.io',
317      isTestnet: false,
318      networkLogoPath: '/icons/networks/gnosis.svg',
319      bridge: {
320        icon: '/icons/networks/gnosis.svg',
321        name: 'xDai Bridge',
322        url: 'https://bridge.gnosischain.com/',
323      },
324      ratesHistoryApiUrl,
325      wagmiChain: gnosis,
326    },
327    [ChainId.bnb]: {
328      name: 'Binance Smart Chain',
329      publicJsonRPCUrl: ['https://bsc.publicnode.com	', 'wss://bsc.publicnode.com'],
330      baseAssetSymbol: 'BNB',
331      wrappedBaseAssetSymbol: 'WBNB',
332      baseAssetDecimals: 18,
333      explorerLink: 'https://bscscan.com',
334      networkLogoPath: '/icons/networks/binance.svg',
335      bridge: {
336        icon: '/icons/networks/binance.svg',
337        name: 'BNB Bridge',
338        url: 'https://www.bnbchain.org/en/bnb-chain-bridges',
339      },
340      ratesHistoryApiUrl,
341      wagmiChain: bsc,
342    },
343    [ChainId.scroll]: {
344      name: 'Scroll',
345      publicJsonRPCUrl: ['https://rpc.scroll.io', 'https://rpc.ankr.com/scroll'],
346      baseAssetSymbol: 'ETH',
347      wrappedBaseAssetSymbol: 'WETH',
348      baseAssetDecimals: 18,
349      explorerLink: 'https://scrollscan.com',
350      networkLogoPath: '/icons/networks/scroll.svg',
351      bridge: {
352        icon: '/icons/networks/scroll.svg',
353        name: 'Scroll Bridge',
354        url: 'https://scroll.io/bridge',
355      },
356      ratesHistoryApiUrl,
357      wagmiChain: scroll,
358    },
359    [ChainId.zksync]: {
360      name: 'ZKsync',
361      publicJsonRPCUrl: ['https://mainnet.era.zksync.io'],
362      baseAssetSymbol: 'ETH',
363      wrappedBaseAssetSymbol: 'WETH',
364      baseAssetDecimals: 18,
365      explorerLink: 'https://era.zksync.network',
366      networkLogoPath: '/icons/networks/zksync.svg',
367      bridge: {
368        icon: '/icons/networks/zksync.svg',
369        name: 'ZKsync Bridge',
370        url: 'https://portal.zksync.io/bridge/',
371      },
372      ratesHistoryApiUrl,
373      wagmiChain: zksync,
374    },
375    [ChainId.linea]: {
376      name: 'Linea',
377      publicJsonRPCUrl: [
378        'https://1rpc.io/linea',
379        'https://linea.drpc.org',
380        'https://linea-rpc.publicnode.com',
381      ],
382      baseAssetSymbol: 'ETH',
383      wrappedBaseAssetSymbol: 'WETH',
384      baseAssetDecimals: 18,
385      explorerLink: 'https://lineascan.build',
386      networkLogoPath: '/icons/networks/linea.svg',
387      bridge: {
388        icon: '/icons/networks/linea.svg',
389        name: 'Linea Bridge',
390        url: 'https://bridge.linea.build/',
391      },
392      ratesHistoryApiUrl,
393      wagmiChain: linea,
394    },
395    [ChainId.sonic]: {
396      name: 'Sonic',
397      publicJsonRPCUrl: [
398        'https://rpc.soniclabs.com',
399        'https://sonic.drpc.org',
400        'https://sonic-rpc.publicnode.com',
401      ],
402      baseAssetSymbol: 'S',
403      wrappedBaseAssetSymbol: 'wS',
404      baseAssetDecimals: 18,
405      explorerLink: 'https://sonicscan.org',
406      networkLogoPath: '/icons/networks/sonic.svg',
407      bridge: {
408        icon: '/icons/networks/sonic.svg',
409        name: 'Sonic Bridge',
410        url: 'https://gateway.soniclabs.com',
411      },
412      ratesHistoryApiUrl,
413      wagmiChain: sonic,
414    },
415    [ChainId.celo]: {
416      name: 'Celo',
417      publicJsonRPCUrl: ['https://rpc.ankr.com/celo', 'https://celo.drpc.org'],
418      baseAssetSymbol: '', // N/A
419      wrappedBaseAssetSymbol: '', // N/A
420      baseAssetDecimals: 0, // N/A
421      explorerLink: 'https://celoscan.io/',
422      networkLogoPath: '/icons/networks/celo.svg',
423      bridge: {
424        icon: '/icons/networks/celo.svg',
425        name: 'Celo Bridge',
426        url: 'https://docs.celo.org/protocol/bridge',
427      },
428      wagmiChain: celo,
429    },
430  };
431  
432  export const networkConfigs = {
433    ...testnetConfig,
434    ...prodNetworkConfig,
435  };