Skip to content

Commit c9efb10

Browse files
authored
fix: forks and testnet with rpc proxy (#2459)
1 parent f77e673 commit c9efb10

File tree

5 files changed

+77
-101
lines changed

5 files changed

+77
-101
lines changed

.env.example

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,23 @@ NEXT_PUBLIC_MIXPANEL=
1717
NEXT_PUBLIC_FIAT_ON_RAMP=true
1818
NEXT_PUBLIC_SUBGRAPH_API_KEY=
1919
NEXT_PUBLIC_IS_CYPRESS_ENABLED=false
20+
NEXT_PUBLIC_PRIVATE_RPC_ENABLED=false
2021

2122
# Set to 'true' to allow all domains for CORS (use only in development)
2223
CORS_DOMAINS_ALLOWED=false
2324

24-
# Private RPC URLs (server-side only)
25-
PRIVATE_RPC_MAINNET=
26-
PRIVATE_RPC_POLYGON=
27-
PRIVATE_RPC_AVALANCHE=
28-
PRIVATE_RPC_ARBITRUM=
29-
PRIVATE_RPC_BASE=
30-
PRIVATE_RPC_OPTIMISM=
31-
PRIVATE_RPC_METIS=
32-
PRIVATE_RPC_GNOSIS=
33-
PRIVATE_RPC_BNB=
34-
PRIVATE_RPC_SCROLL=
35-
PRIVATE_RPC_ZKSYNC=
36-
PRIVATE_RPC_LINEA=
37-
PRIVATE_RPC_SONIC=
38-
PRIVATE_RPC_CELO=
25+
# Private RPC api keys (server-side only)
26+
MAINNET_RPC_API_KEY=
27+
POLYGON_RPC_API_KEY=
28+
AVALANCHE_RPC_API_KEY=
29+
ARBITRUM_RPC_API_KEY=
30+
BASE_RPC_API_KEY=
31+
OPTIMISM_RPC_API_KEY=
32+
METIS_RPC_API_KEY=
33+
GNOSIS_RPC_API_KEY=
34+
BNB_RPC_API_KEY=
35+
SCROLL_RPC_API_KEY=
36+
ZKSYNC_RPC_API_KEY=
37+
LINEA_RPC_API_KEY=
38+
SONIC_RPC_API_KEY=
39+
CELO_RPC_API_KEY=

pages/api/rpc-proxy.ts

Lines changed: 46 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,54 @@
11
import { ChainId } from '@aave/contract-helpers';
22
import { NextApiRequest, NextApiResponse } from 'next';
33

4-
import { networkConfigs } from '../../src/ui-config/networksConfig';
5-
64
// Documentation: ./server-side-rpc-proxy.md
7-
const PRIVATE_RPC_URLS: Record<string, string> = {
8-
[ChainId.mainnet]:
9-
process.env.PRIVATE_RPC_MAINNET || networkConfigs[ChainId.mainnet].privateJsonRPCUrl || '',
10-
[ChainId.polygon]:
11-
process.env.PRIVATE_RPC_POLYGON || networkConfigs[ChainId.polygon].privateJsonRPCUrl || '',
12-
[ChainId.avalanche]:
13-
process.env.PRIVATE_RPC_AVALANCHE || networkConfigs[ChainId.avalanche].privateJsonRPCUrl || '',
14-
[ChainId.arbitrum_one]:
15-
process.env.PRIVATE_RPC_ARBITRUM ||
16-
networkConfigs[ChainId.arbitrum_one].privateJsonRPCUrl ||
17-
'',
18-
[ChainId.base]:
19-
process.env.PRIVATE_RPC_BASE || networkConfigs[ChainId.base].privateJsonRPCUrl || '',
20-
[ChainId.optimism]:
21-
process.env.PRIVATE_RPC_OPTIMISM || networkConfigs[ChainId.optimism].privateJsonRPCUrl || '',
22-
[ChainId.metis_andromeda]:
23-
process.env.PRIVATE_RPC_METIS ||
24-
networkConfigs[ChainId.metis_andromeda].privateJsonRPCUrl ||
25-
'',
26-
[ChainId.xdai]:
27-
process.env.PRIVATE_RPC_GNOSIS || networkConfigs[ChainId.xdai].privateJsonRPCUrl || '',
28-
[ChainId.bnb]: process.env.PRIVATE_RPC_BNB || networkConfigs[ChainId.bnb].privateJsonRPCUrl || '',
29-
[ChainId.scroll]:
30-
process.env.PRIVATE_RPC_SCROLL || networkConfigs[ChainId.scroll].privateJsonRPCUrl || '',
31-
[ChainId.zksync]:
32-
process.env.PRIVATE_RPC_ZKSYNC || networkConfigs[ChainId.zksync].privateJsonRPCUrl || '',
33-
[ChainId.linea]:
34-
process.env.PRIVATE_RPC_LINEA || networkConfigs[ChainId.linea].privateJsonRPCUrl || '',
35-
[ChainId.sonic]:
36-
process.env.PRIVATE_RPC_SONIC || networkConfigs[ChainId.sonic].privateJsonRPCUrl || '',
37-
[ChainId.celo]:
38-
process.env.PRIVATE_RPC_CELO || networkConfigs[ChainId.celo].privateJsonRPCUrl || '',
5+
const NETWORK_CONFIG: Record<number, { network: string; apiKey: string }> = {
6+
// Mainnets
7+
[ChainId.mainnet]: { network: 'eth-mainnet', apiKey: process.env.MAINNET_RPC_API_KEY || '' },
8+
[ChainId.polygon]: { network: 'polygon-mainnet', apiKey: process.env.POLYGON_RPC_API_KEY || '' },
9+
[ChainId.avalanche]: { network: 'avax-mainnet', apiKey: process.env.AVALANCHE_RPC_API_KEY || '' },
10+
[ChainId.arbitrum_one]: {
11+
network: 'arb-mainnet',
12+
apiKey: process.env.ARBITRUM_RPC_API_KEY || '',
13+
},
14+
[ChainId.base]: { network: 'base-mainnet', apiKey: process.env.BASE_RPC_API_KEY || '' },
15+
[ChainId.optimism]: { network: 'opt-mainnet', apiKey: process.env.OPTIMISM_RPC_API_KEY || '' },
16+
[ChainId.metis_andromeda]: {
17+
network: 'metis-mainnet',
18+
apiKey: process.env.METIS_RPC_API_KEY || '',
19+
},
20+
[ChainId.xdai]: { network: 'gnosis-mainnet', apiKey: process.env.GNOSIS_RPC_API_KEY || '' },
21+
[ChainId.bnb]: { network: 'bnb-mainnet', apiKey: process.env.BNB_RPC_API_KEY || '' },
22+
[ChainId.scroll]: { network: 'scroll-mainnet', apiKey: process.env.SCROLL_RPC_API_KEY || '' },
23+
[ChainId.zksync]: { network: 'zksync-mainnet', apiKey: process.env.ZKSYNC_RPC_API_KEY || '' },
24+
[ChainId.linea]: { network: 'linea-mainnet', apiKey: process.env.LINEA_RPC_API_KEY || '' },
25+
[ChainId.sonic]: { network: 'sonic-mainnet', apiKey: process.env.SONIC_RPC_API_KEY || '' },
26+
[ChainId.celo]: { network: 'celo-mainnet', apiKey: process.env.CELO_RPC_API_KEY || '' },
27+
28+
// Testnets
29+
[ChainId.sepolia]: { network: 'eth-sepolia', apiKey: process.env.MAINNET_RPC_API_KEY || '' },
30+
[ChainId.fuji]: { network: 'avax-fuji', apiKey: process.env.AVALANCHE_RPC_API_KEY || '' },
31+
[ChainId.arbitrum_sepolia]: {
32+
network: 'arb-sepolia',
33+
apiKey: process.env.ARBITRUM_RPC_API_KEY || '',
34+
},
35+
[ChainId.base_sepolia]: { network: 'base-sepolia', apiKey: process.env.BASE_RPC_API_KEY || '' },
36+
[ChainId.optimism_sepolia]: {
37+
network: 'opt-sepolia',
38+
apiKey: process.env.OPTIMISM_RPC_API_KEY || '',
39+
},
40+
[ChainId.scroll_sepolia]: {
41+
network: 'scroll-sepolia',
42+
apiKey: process.env.SCROLL_RPC_API_KEY || '',
43+
},
3944
};
4045

46+
function getRpcUrl(chainId: number): string | null {
47+
const config = NETWORK_CONFIG[chainId];
48+
if (!config) return null;
49+
return `https://${config.network}.g.alchemy.com/v2/${config.apiKey}`;
50+
}
51+
4152
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
4253
const allowedOrigins = ['https://app.aave.com', 'https://aave.com'];
4354
const origin = req.headers.origin;
@@ -73,7 +84,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
7384
try {
7485
const { chainId, method, params } = req.body;
7586
const chainIdNumber = typeof chainId === 'string' ? parseInt(chainId) : chainId;
76-
const rpcUrl = PRIVATE_RPC_URLS[chainIdNumber];
87+
const rpcUrl = getRpcUrl(chainIdNumber);
7788

7889
if (!rpcUrl) {
7990
return res.status(400).json({ error: `Unsupported chain ID: ${chainIdNumber}` });

pages/api/server-side-rpc-proxy.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ The implementation consists of two main parts:
1818

1919
### Environment Variables
2020

21-
Add your private RPC URLs to your server's environment variables:
21+
Add your private alchemy RPC URLs to your server's environment variables:
2222

2323
```env
24-
PRIVATE_RPC_MAINNET=https://your-private-mainnet-rpc-url
25-
PRIVATE_RPC_POLYGON=https://your-private-polygon-rpc-url
26-
PRIVATE_RPC_AVALANCHE=https://your-private-avalanche-rpc-url
24+
MAINNET_RPC_API_KEY=<your-mainnet-rpc-api-key>
25+
POLYGON_RPC_API_KEY=<your-polygon-rpc-api-key>
26+
AVALANCHE_RPC_API_KEY=<your-avalanche-rpc-api-key>
2727
# Add more as needed
2828
```
2929

@@ -49,6 +49,6 @@ PRIVATE_RPC_AVALANCHE=https://your-private-avalanche-rpc-url
4949

5050
To add support for more chains:
5151

52-
1. Add the environment variable in your server environment (e.g., `PRIVATE_RPC_FANTOM`).
52+
1. Add the environment variable in your server environment (e.g., `ZKSYNC_RPC_API_KEY`).
5353

54-
2. Update the `PRIVATE_RPC_URLS` object in `pages/api/rpc-proxy.ts` to include the new chain.
54+
2. Update the `NETWORK_CONFIG` object in `pages/api/rpc-proxy.ts` to include the new chain and network name.

src/ui-config/networksConfig.ts

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,9 @@ export type ExplorerLinkBuilderConfig = {
3737
export type NetworkConfig = {
3838
name: string;
3939
displayName?: string;
40-
privateJsonRPCUrl?: string; // private rpc will be used for rpc queries inside the client. normally has private api key and better rate
41-
privateJsonRPCWSUrl?: string;
42-
publicJsonRPCUrl: readonly string[]; // public rpc used if not private found, and used to add specific network to wallets if user don't have them. Normally with slow rates
43-
publicJsonRPCWSUrl?: string;
40+
publicJsonRPCUrl: readonly string[]; // public rpc used if not private found
4441
// https://github.com/aave/aave-api
4542
ratesHistoryApiUrl?: string;
46-
// cachingServerUrl?: string;
47-
// cachingWSServerUrl?: string;
4843
baseUniswapAdapter?: string;
4944
/**
5045
* When this is set withdrawals will automatically be unwrapped
@@ -102,7 +97,6 @@ export const testnetConfig: Record<string, BaseNetworkConfig> = {
10297
'https://rpc.ankr.com/avalanche_fuji',
10398
'https://ava-testnet.public.blastapi.io/ext/bc/C/rpc',
10499
],
105-
publicJsonRPCWSUrl: 'wss://api.avax-test.network/ext/bc/C/rpc',
106100
baseUniswapAdapter: '0x0',
107101
baseAssetSymbol: 'AVAX',
108102
wrappedBaseAssetSymbol: 'WAVAX',
@@ -123,7 +117,6 @@ export const testnetConfig: Record<string, BaseNetworkConfig> = {
123117
'https://sepolia-rollup.arbitrum.io/rpc',
124118
'https://public.stackup.sh/api/v1/node/arbitrum-sepolia',
125119
],
126-
publicJsonRPCWSUrl: 'https://sepolia-rollup.arbitrum.io/rpc',
127120
baseUniswapAdapter: '0x0',
128121
baseAssetSymbol: 'ETH',
129122
wrappedBaseAssetSymbol: 'WETH',
@@ -135,13 +128,11 @@ export const testnetConfig: Record<string, BaseNetworkConfig> = {
135128
},
136129
[ChainId.base_sepolia]: {
137130
name: 'Base Sepolia',
138-
privateJsonRPCUrl: 'https://base-sepolia.g.alchemy.com/v2/IIdPEqieQtPDflf-075haltN8Jy4CYLp',
139131
publicJsonRPCUrl: [
140132
'https://base-sepolia.blockpi.network/v1/rpc/public',
141133
'https://sepolia.base.org',
142134
'https://base-sepolia.gateway.tenderly.co',
143135
],
144-
publicJsonRPCWSUrl: 'wss://base-sepolia-rpc.publicnode.com',
145136
baseUniswapAdapter: '0x0',
146137
baseAssetSymbol: 'ETH',
147138
wrappedBaseAssetSymbol: 'WETH',
@@ -169,7 +160,6 @@ export const testnetConfig: Record<string, BaseNetworkConfig> = {
169160
'https://sepolia-rpc.scroll.io',
170161
'https://scroll-sepolia.blockpi.network/v1/rpc/public',
171162
],
172-
publicJsonRPCWSUrl: 'wss://sepolia-rpc.scroll.io',
173163
baseUniswapAdapter: '0x0',
174164
baseAssetSymbol: 'ETH',
175165
wrappedBaseAssetSymbol: 'WETH',
@@ -184,15 +174,13 @@ export const testnetConfig: Record<string, BaseNetworkConfig> = {
184174
export const prodNetworkConfig: Record<string, BaseNetworkConfig> = {
185175
[ChainId.mainnet]: {
186176
name: 'Ethereum',
187-
privateJsonRPCUrl: 'https://eth-mainnet.g.alchemy.com/v2/ZiMMq2478EVIEJdsxC5dMal_ccQwtb31',
188177
publicJsonRPCUrl: [
189178
'https://mainnet.gateway.tenderly.co',
190179
'https://rpc.flashbots.net',
191180
'https://eth.llamarpc.com',
192181
'https://eth-mainnet.public.blastapi.io',
193182
'https://ethereum-rpc.publicnode.com',
194183
],
195-
publicJsonRPCWSUrl: 'wss://eth-mainnet.alchemyapi.io/v2/demo',
196184
baseUniswapAdapter: '0xc3efa200a60883a96ffe3d5b492b121d6e9a1f3f',
197185
baseAssetSymbol: 'ETH',
198186
wrappedBaseAssetSymbol: 'WETH',
@@ -205,7 +193,6 @@ export const prodNetworkConfig: Record<string, BaseNetworkConfig> = {
205193
[ChainId.polygon]: {
206194
name: 'Polygon POS',
207195
displayName: 'Polygon',
208-
privateJsonRPCUrl: 'https://polygon-mainnet.g.alchemy.com/v2/MbgjyHR1CQiU5Y8CUa2mqfRlYwltE5Zr',
209196
publicJsonRPCUrl: [
210197
'https://gateway.tenderly.co/public/polygon',
211198
'https://polygon-pokt.nodies.app',
@@ -214,7 +201,6 @@ export const prodNetworkConfig: Record<string, BaseNetworkConfig> = {
214201
'https://polygon-mainnet.public.blastapi.io',
215202
'https://rpc-mainnet.matic.quiknode.pro',
216203
],
217-
publicJsonRPCWSUrl: 'wss://polygon-rpc.com',
218204
baseAssetSymbol: 'POL',
219205
wrappedBaseAssetSymbol: 'WPOL',
220206
baseAssetDecimals: 18,
@@ -230,13 +216,11 @@ export const prodNetworkConfig: Record<string, BaseNetworkConfig> = {
230216
},
231217
[ChainId.avalanche]: {
232218
name: 'Avalanche',
233-
privateJsonRPCUrl: 'https://avax-mainnet.g.alchemy.com/v2/qBXCF7-6YfiiAdG0dvUyLpQuHt02DbXH', //'https://avax.rpc.grove.city/v1/62b3314e123e6f00397f19ca',
234219
publicJsonRPCUrl: [
235220
'https://api.avax.network/ext/bc/C/rpc',
236221
'https://ava-mainnet.public.blastapi.io/ext/bc/C/rpc',
237222
'https://rpc.ankr.com/avalanche',
238223
],
239-
publicJsonRPCWSUrl: 'wss://api.avax.network/ext/bc/C/rpc',
240224
baseUniswapAdapter: '0x0',
241225
baseAssetSymbol: 'AVAX',
242226
wrappedBaseAssetSymbol: 'WAVAX',
@@ -253,13 +237,11 @@ export const prodNetworkConfig: Record<string, BaseNetworkConfig> = {
253237
},
254238
[ChainId.arbitrum_one]: {
255239
name: 'Arbitrum',
256-
privateJsonRPCUrl: 'https://arb-mainnet.g.alchemy.com/v2/2oA-8BGeYqHHpd2uCU49IzeZDL9skdSm', //'https://arbitrum-one.rpc.grove.city/v1/62b3314e123e6f00397f19ca',
257240
publicJsonRPCUrl: [
258241
'https://arb1.arbitrum.io/rpc',
259242
'https://rpc.ankr.com/arbitrum',
260243
'https://1rpc.io/arb',
261244
],
262-
publicJsonRPCWSUrl: 'wss://arb1.arbitrum.io/rpc',
263245
baseUniswapAdapter: '0x0',
264246
baseAssetSymbol: 'ETH',
265247
wrappedBaseAssetSymbol: 'WETH',
@@ -276,7 +258,6 @@ export const prodNetworkConfig: Record<string, BaseNetworkConfig> = {
276258
},
277259
[ChainId.base]: {
278260
name: 'Base',
279-
privateJsonRPCUrl: 'https://base-mainnet.g.alchemy.com/v2/AFu9kulpkXzHO7kQQ9UQDXWRyEhJEXPk', //'https://base.rpc.grove.city/v1/62b3314e123e6f00397f19ca',
280261
publicJsonRPCUrl: [
281262
'https://mainnet.base.org',
282263
'https://1rpc.io/base',
@@ -299,9 +280,7 @@ export const prodNetworkConfig: Record<string, BaseNetworkConfig> = {
299280
},
300281
[ChainId.optimism]: {
301282
name: 'OP',
302-
privateJsonRPCUrl: 'https://opt-mainnet.g.alchemy.com/v2/H8ZBGuz1LZbRsYnCBQHY4YMv_AUAVGeM', //'https://optimism.rpc.grove.city/v1/62b3314e123e6f00397f19ca',
303283
publicJsonRPCUrl: ['https://optimism-mainnet.public.blastapi.io', 'https://1rpc.io/op'],
304-
publicJsonRPCWSUrl: 'wss://optimism-mainnet.public.blastapi.io',
305284
baseUniswapAdapter: '0x0',
306285
baseAssetSymbol: 'ETH',
307286
wrappedBaseAssetSymbol: 'WETH',
@@ -318,7 +297,6 @@ export const prodNetworkConfig: Record<string, BaseNetworkConfig> = {
318297
},
319298
[ChainId.metis_andromeda]: {
320299
name: 'Metis Andromeda',
321-
privateJsonRPCUrl: 'https://metis-mainnet.g.alchemy.com/v2/jUZTAx8v4k1AnKnB2Xa-CBxvU0GUSlzc', //'https://metis.rpc.grove.city/v1/62b3314e123e6f00397f19ca',
322300
publicJsonRPCUrl: ['https://andromeda.metis.io/?owner=1088'],
323301
baseAssetSymbol: '', // N/A
324302
wrappedBaseAssetSymbol: '', // N/A
@@ -330,9 +308,7 @@ export const prodNetworkConfig: Record<string, BaseNetworkConfig> = {
330308
},
331309
[ChainId.xdai]: {
332310
name: 'Gnosis Chain',
333-
privateJsonRPCUrl: 'https://gnosis-mainnet.g.alchemy.com/v2/Mzr_UR3Ixxiybvnie9sw9FUp4mVOoARS', //'https://gnosis.rpc.grove.city/v1/62b3314e123e6f00397f19ca',
334311
publicJsonRPCUrl: ['https://rpc.ankr.com/gnosis', 'https://rpc.gnosischain.com'],
335-
publicJsonRPCWSUrl: 'wss://rpc.gnosischain.com/wss',
336312
baseUniswapAdapter: '0x0',
337313
baseAssetSymbol: 'xDAI',
338314
wrappedBaseAssetSymbol: 'WXDAI',
@@ -350,9 +326,7 @@ export const prodNetworkConfig: Record<string, BaseNetworkConfig> = {
350326
},
351327
[ChainId.bnb]: {
352328
name: 'Binance Smart Chain',
353-
privateJsonRPCUrl: 'https://bnb-mainnet.g.alchemy.com/v2/nCU1F9Y1KDQFMs9OBtkGw0GLsIKiYBho', //'https://bsc.rpc.grove.city/v1/62b3314e123e6f00397f19ca',
354329
publicJsonRPCUrl: ['https://bsc.publicnode.com ', 'wss://bsc.publicnode.com'],
355-
publicJsonRPCWSUrl: 'wss://bsc.publicnode.com',
356330
baseAssetSymbol: 'BNB',
357331
wrappedBaseAssetSymbol: 'WBNB',
358332
baseAssetDecimals: 18,
@@ -368,9 +342,7 @@ export const prodNetworkConfig: Record<string, BaseNetworkConfig> = {
368342
},
369343
[ChainId.scroll]: {
370344
name: 'Scroll',
371-
privateJsonRPCUrl: 'https://scroll-mainnet.g.alchemy.com/v2/SqyEQeiBCyDsgvE6TYTdbrppjdyBsulM', //'https://scroll.rpc.grove.city/v1/62b3314e123e6f00397f19ca',
372345
publicJsonRPCUrl: ['https://rpc.scroll.io', 'https://rpc.ankr.com/scroll'],
373-
publicJsonRPCWSUrl: 'wss://bsc.publicnode.com',
374346
baseAssetSymbol: 'ETH',
375347
wrappedBaseAssetSymbol: 'WETH',
376348
baseAssetDecimals: 18,
@@ -386,7 +358,6 @@ export const prodNetworkConfig: Record<string, BaseNetworkConfig> = {
386358
},
387359
[ChainId.zksync]: {
388360
name: 'ZKsync',
389-
privateJsonRPCUrl: 'https://zksync-mainnet.g.alchemy.com/v2/GyNpZOF5T0issE8wYgXXR_KJjUp-yds0',
390361
publicJsonRPCUrl: ['https://mainnet.era.zksync.io'],
391362
baseAssetSymbol: 'ETH',
392363
wrappedBaseAssetSymbol: 'WETH',
@@ -403,7 +374,6 @@ export const prodNetworkConfig: Record<string, BaseNetworkConfig> = {
403374
},
404375
[ChainId.linea]: {
405376
name: 'Linea',
406-
privateJsonRPCUrl: 'https://linea-mainnet.g.alchemy.com/v2/6uk5qBl8QvjpEbgF3TgZBbxWkKlmWZR-',
407377
publicJsonRPCUrl: [
408378
'https://1rpc.io/linea',
409379
'https://linea.drpc.org',
@@ -424,7 +394,6 @@ export const prodNetworkConfig: Record<string, BaseNetworkConfig> = {
424394
},
425395
[ChainId.sonic]: {
426396
name: 'Sonic',
427-
privateJsonRPCUrl: 'https://sonic-mainnet.g.alchemy.com/v2/L7wpvN30xWzkijd2cRwD8n0VLFM9UTmv',
428397
publicJsonRPCUrl: [
429398
'https://rpc.soniclabs.com',
430399
'https://sonic.drpc.org',
@@ -445,7 +414,6 @@ export const prodNetworkConfig: Record<string, BaseNetworkConfig> = {
445414
},
446415
[ChainId.celo]: {
447416
name: 'Celo',
448-
privateJsonRPCUrl: 'https://celo-mainnet.g.alchemy.com/v2/QSIQ93fznmXwv9qEWBnKIOOsQGldk3wL',
449417
publicJsonRPCUrl: ['https://rpc.ankr.com/celo', 'https://celo.drpc.org'],
450418
baseAssetSymbol: '', // N/A
451419
wrappedBaseAssetSymbol: '', // N/A

0 commit comments

Comments
 (0)