@1delta/providers 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/evm.ts +442 -419
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@1delta/providers",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/evm.ts CHANGED
@@ -1,460 +1,483 @@
1
- import { Chain, CHAIN_INFO } from "@1delta/asset-registry"
1
+ import { Chain, CHAIN_INFO } from "@1delta/asset-registry";
2
2
  import { isArray, uniq } from "lodash";
3
- import { createPublicClient, defineChain, http, PublicClient } from "viem"
3
+ import { createPublicClient, defineChain, http, PublicClient } from "viem";
4
4
  import {
5
- mantle,
6
- mainnet,
7
- optimism,
8
- arbitrum,
9
- bsc,
10
- avalanche,
11
- taiko,
12
- metis,
13
- polygon,
14
- zksync,
15
- scroll,
16
- gnosis,
17
- base,
18
- blast,
19
- kaia,
20
- opBNB,
21
- fantom,
22
- sonic,
23
- linea,
24
- hemi,
25
- neonMainnet,
26
- degen,
27
- gravity,
28
- lightlinkPhoenix,
29
- plume,
30
- abstract,
31
- peaq,
32
- flowMainnet,
33
- soneium,
34
- goat,
35
- berachain,
36
- rootstock,
37
- ink,
38
- vanar,
39
- fuse,
40
- superposition,
41
- story,
42
- apeChain,
43
- telos,
44
- flare,
45
- aurora,
46
- kava,
47
- iota,
48
- coreDao,
49
- unichain,
50
- mode,
51
- xLayer,
52
- zircuit,
53
- corn,
54
- bob,
55
- manta,
56
- harmonyOne,
57
- celo,
58
- bitlayer,
59
- merlin,
60
- sei,
61
- iotex,
62
- bsquared,
63
- zetachain,
64
- ronin,
65
- inEVM,
66
- } from "viem/chains"
67
-
5
+ mantle,
6
+ mainnet,
7
+ optimism,
8
+ arbitrum,
9
+ bsc,
10
+ avalanche,
11
+ taiko,
12
+ metis,
13
+ polygon,
14
+ zksync,
15
+ scroll,
16
+ gnosis,
17
+ base,
18
+ blast,
19
+ kaia,
20
+ opBNB,
21
+ fantom,
22
+ sonic,
23
+ linea,
24
+ hemi,
25
+ neonMainnet,
26
+ degen,
27
+ gravity,
28
+ lightlinkPhoenix,
29
+ plume,
30
+ abstract,
31
+ peaq,
32
+ flowMainnet,
33
+ soneium,
34
+ goat,
35
+ berachain,
36
+ rootstock,
37
+ ink,
38
+ vanar,
39
+ fuse,
40
+ superposition,
41
+ story,
42
+ apeChain,
43
+ telos,
44
+ flare,
45
+ aurora,
46
+ kava,
47
+ iota,
48
+ coreDao,
49
+ unichain,
50
+ mode,
51
+ xLayer,
52
+ zircuit,
53
+ corn,
54
+ bob,
55
+ manta,
56
+ harmonyOne,
57
+ celo,
58
+ bitlayer,
59
+ merlin,
60
+ sei,
61
+ iotex,
62
+ bsquared,
63
+ zetachain,
64
+ ronin,
65
+ inEVM,
66
+ } from "viem/chains";
68
67
 
69
68
  export const crossfi = defineChain({
70
- id: 4158,
71
- name: 'CrossFi Mainet',
72
- nativeCurrency: {
73
- decimals: 18,
74
- name: 'XFI',
75
- symbol: 'XFI',
76
- },
77
- rpcUrls: {
78
- default: {
79
- http: ['https://rpc.mainnet.ms/'],
80
- },
81
- },
82
- blockExplorers: {
83
- default: { name: 'Explorer', url: 'https://xfiscan.com/' },
69
+ id: 4158,
70
+ name: "CrossFi Mainet",
71
+ nativeCurrency: {
72
+ decimals: 18,
73
+ name: "XFI",
74
+ symbol: "XFI",
75
+ },
76
+ rpcUrls: {
77
+ default: {
78
+ http: ["https://rpc.mainnet.ms/"],
84
79
  },
85
- // contracts: {
86
- // multicall3: {
87
- // address: "0xcA11bde05977b3631167028862bE2a173976CA11",
88
- // blockCreated: 1,
89
- // }
90
- // }
80
+ },
81
+ blockExplorers: {
82
+ default: { name: "Explorer", url: "https://xfiscan.com/" },
83
+ },
84
+ // contracts: {
85
+ // multicall3: {
86
+ // address: "0xcA11bde05977b3631167028862bE2a173976CA11",
87
+ // blockCreated: 1,
88
+ // }
89
+ // }
91
90
  });
92
91
 
93
92
  export const botanix = defineChain({
94
- id: 3637,
95
- name: 'Botanix',
96
- nativeCurrency: {
97
- decimals: 18,
98
- name: 'BTC',
99
- symbol: 'BTC',
93
+ id: 3637,
94
+ name: "Botanix",
95
+ nativeCurrency: {
96
+ decimals: 18,
97
+ name: "BTC",
98
+ symbol: "BTC",
99
+ },
100
+ rpcUrls: {
101
+ default: {
102
+ http: [
103
+ "https://rpc.ankr.com/botanix_mainnet",
104
+ "https://rpc.botanixlabs.com",
105
+ ],
100
106
  },
101
- rpcUrls: {
102
- default: {
103
- http: [
104
- "https://rpc.ankr.com/botanix_mainnet",
105
- "https://rpc.botanixlabs.com"],
106
- },
107
- },
108
- blockExplorers: {
109
- default: { name: 'Explorer', url: 'https://botanixscan.io/' },
107
+ },
108
+ blockExplorers: {
109
+ default: { name: "Explorer", url: "https://botanixscan.io/" },
110
+ },
111
+ contracts: {
112
+ multicall3: {
113
+ address: "0xcA11bde05977b3631167028862bE2a173976CA11",
114
+ blockCreated: 1,
110
115
  },
111
- contracts: {
112
- multicall3: {
113
- address: "0xcA11bde05977b3631167028862bE2a173976CA11",
114
- blockCreated: 1,
115
- }
116
- }
116
+ },
117
117
  });
118
118
 
119
-
120
119
  export const GraphLinq = defineChain({
121
- id: 614,
122
- name: 'GraphLinq Chain',
123
- nativeCurrency: {
124
- decimals: 18,
125
- name: 'GLQ',
126
- symbol: 'GLQ',
127
- },
128
- rpcUrls: {
129
- default: {
130
- http: ["https://glq-dataseed.graphlinq.io"],
131
- },
132
- },
133
- blockExplorers: {
134
- default: { name: 'Explorer', "url": "https://explorer.graphlinq.io", },
120
+ id: 614,
121
+ name: "GraphLinq Chain",
122
+ nativeCurrency: {
123
+ decimals: 18,
124
+ name: "GLQ",
125
+ symbol: "GLQ",
126
+ },
127
+ rpcUrls: {
128
+ default: {
129
+ http: ["https://glq-dataseed.graphlinq.io"],
135
130
  },
136
- // contracts: {
137
- // multicall3: {
138
- // address: "0xcA11bde05977b3631167028862bE2a173976CA11",
139
- // blockCreated: 1,
140
- // }
141
- // }
131
+ },
132
+ blockExplorers: {
133
+ default: { name: "Explorer", url: "https://explorer.graphlinq.io" },
134
+ },
135
+ // contracts: {
136
+ // multicall3: {
137
+ // address: "0xcA11bde05977b3631167028862bE2a173976CA11",
138
+ // blockCreated: 1,
139
+ // }
140
+ // }
142
141
  });
143
142
 
144
-
145
-
146
143
  function getEvmChain(chain: string) {
147
- switch (chain) {
148
- case Chain.ARBITRUM_ONE:
149
- return arbitrum
150
- case Chain.ETHEREUM_MAINNET:
151
- return mainnet
152
- case Chain.MANTLE:
153
- return mantle
154
- case Chain.BNB_SMART_CHAIN_MAINNET:
155
- return bsc
156
- case Chain.OPBNB_MAINNET:
157
- return opBNB
158
- case Chain.TAIKO_ALETHIA:
159
- return taiko
160
- case Chain.AVALANCHE_C_CHAIN:
161
- return avalanche
162
- case Chain.OP_MAINNET:
163
- return optimism
164
- case Chain.METIS_ANDROMEDA_MAINNET:
165
- return metis
166
- case Chain.POLYGON_MAINNET:
167
- return polygon
168
- case Chain.ZKSYNC_MAINNET:
169
- return zksync
170
- case Chain.SCROLL:
171
- return scroll
172
- case Chain.GNOSIS:
173
- return gnosis
174
- case Chain.BASE:
175
- return base
176
- case Chain.BLAST:
177
- return blast
178
- case Chain.KAIA_MAINNET:
179
- return kaia
180
- case Chain.FANTOM_OPERA:
181
- return fantom
182
- case Chain.SONIC_MAINNET:
183
- return sonic
184
- case Chain.LINEA:
185
- return linea
186
- case Chain.HEMI_NETWORK:
187
- return {
188
- ...hemi,
189
- contracts: {
190
- multicall3: {
191
- address: "0xcA11bde05977b3631167028862bE2a173976CA11",
192
- blockCreated: 1,
193
- }
194
- }
195
- }
196
- case Chain.NEON_EVM_MAINNET:
197
- return neonMainnet
198
- case Chain.DEGEN_CHAIN:
199
- return {
200
- ...degen,
201
- contracts: {
202
- multicall3: {
203
- address: "0xcA11bde05977b3631167028862bE2a173976CA11",
204
- blockCreated: 1,
205
- }
206
- }
207
- }
208
- case Chain.GRAVITY_ALPHA_MAINNET:
209
- return gravity
210
- case Chain.LIGHTLINK_PHOENIX_MAINNET:
211
- return lightlinkPhoenix
212
- case Chain.PLUME_MAINNET:
213
- return plume
214
- case Chain.ABSTRACT:
215
- return abstract
216
- case Chain.PEAQ:
217
- return peaq
218
- case Chain.EVM_ON_FLOW:
219
- return flowMainnet
220
- case Chain.SONEIUM:
221
- return soneium
222
- case Chain.GOAT_NETWORK:
223
- return goat
224
- case Chain.BERACHAIN:
225
- return berachain
226
- case Chain.ROOTSTOCK_MAINNET:
227
- return rootstock
228
- case Chain.VANAR_MAINNET:
229
- return vanar
230
- case Chain.INK:
231
- return {
232
- ...ink,
233
- contracts: {
234
- multicall3: {
235
- address: "0xcA11bde05977b3631167028862bE2a173976CA11",
236
- blockCreated: 1,
237
- }
238
- }
239
- }
240
- case Chain.FUSE_MAINNET:
241
- return fuse
242
- case Chain.SUPERPOSITION:
243
- return superposition
244
- case Chain.STORY:
245
- return {
246
- ...story,
247
- contracts: {
248
- multicall3: {
249
- address: "0xcA11bde05977b3631167028862bE2a173976CA11",
250
- blockCreated: 1,
251
- }
252
- }
253
- }
254
- case Chain.APECHAIN:
255
- return apeChain
256
- case Chain.IOTEX_NETWORK_MAINNET:
257
- return iotex
258
- case Chain.TELOS_EVM_MAINNET:
259
- return telos
260
- case Chain.FLARE_MAINNET:
261
- return flare
262
- case Chain.AURA_MAINNET:
263
- return aurora
264
- case Chain.KAVA:
265
- return kava
266
- case Chain.IOTA_EVM:
267
- return iota
268
- case Chain.AURORA_MAINNET:
269
- return aurora
270
- case Chain.UNICHAIN:
271
- return unichain
272
- case Chain.CORE_BLOCKCHAIN_MAINNET:
273
- return coreDao
274
- case Chain.MODE:
275
- return mode
276
- case Chain.CORN:
277
- return corn
278
- case Chain.BOB:
279
- return bob
280
- case Chain.RONIN_MAINNET:
281
- return ronin
282
- case Chain.MANTA_PACIFIC_MAINNET:
283
- return manta
284
- case Chain.ZIRCUIT_MAINNET:
285
- return zircuit
286
- case Chain.GRAPHLINQ_BLOCKCHAIN_MAINNET:
287
- return GraphLinq
288
- case Chain.ZETACHAIN_MAINNET:
289
- return zetachain
290
- case Chain.BITLAYER_MAINNET:
291
- return bitlayer
292
- case Chain.CROSSFI_MAINNET:
293
- return crossfi
294
- case Chain.INEVM_MAINNET:
295
- return inEVM
296
- case Chain.B2_MAINNET:
297
- return {
298
- ...bsquared,
299
- contracts: {
300
- multicall3: {
301
- address: "0xcA11bde05977b3631167028862bE2a173976CA11",
302
- blockCreated: 1,
303
- }
304
- }
305
- }
306
- case Chain.SEI_NETWORK:
307
- return sei
308
- case Chain.MERLIN_MAINNET:
309
- return {
310
- ...merlin,
311
- contracts: {
312
- multicall3: {
313
- address: "0x46063722c010AF39E465d286B84936A12aFb81F0",
314
- blockCreated: 1,
315
- }
316
- }
317
- }
318
- case Chain.X_LAYER_MAINNET:
319
- return xLayer
320
- case Chain.CELO_MAINNET:
321
- return celo
322
- case Chain.BOTANIX_MAINNET:
323
- return botanix
324
- case Chain.HARMONY_MAINNET_SHARD_0:
325
- return harmonyOne
326
- // case Chain.VANA:
327
- // return vana
328
- // case Chain.RARI_CHAIN_MAINNET:
329
- // return rariChain
330
- // case Chain.GLUE_MAINNET:
331
- // return glue
332
- default: throw new Error("Not in VIEM: " + chain)
333
- }
144
+ switch (chain) {
145
+ case Chain.ARBITRUM_ONE:
146
+ return arbitrum;
147
+ case Chain.ETHEREUM_MAINNET:
148
+ return mainnet;
149
+ case Chain.MANTLE:
150
+ return mantle;
151
+ case Chain.BNB_SMART_CHAIN_MAINNET:
152
+ return bsc;
153
+ case Chain.OPBNB_MAINNET:
154
+ return opBNB;
155
+ case Chain.TAIKO_ALETHIA:
156
+ return taiko;
157
+ case Chain.AVALANCHE_C_CHAIN:
158
+ return avalanche;
159
+ case Chain.OP_MAINNET:
160
+ return optimism;
161
+ case Chain.METIS_ANDROMEDA_MAINNET:
162
+ return metis;
163
+ case Chain.POLYGON_MAINNET:
164
+ return polygon;
165
+ case Chain.ZKSYNC_MAINNET:
166
+ return zksync;
167
+ case Chain.SCROLL:
168
+ return scroll;
169
+ case Chain.GNOSIS:
170
+ return gnosis;
171
+ case Chain.BASE:
172
+ return base;
173
+ case Chain.BLAST:
174
+ return blast;
175
+ case Chain.KAIA_MAINNET:
176
+ return kaia;
177
+ case Chain.FANTOM_OPERA:
178
+ return fantom;
179
+ case Chain.SONIC_MAINNET:
180
+ return sonic;
181
+ case Chain.LINEA:
182
+ return linea;
183
+ case Chain.HEMI_NETWORK:
184
+ return {
185
+ ...hemi,
186
+ contracts: {
187
+ multicall3: {
188
+ address: "0xcA11bde05977b3631167028862bE2a173976CA11",
189
+ blockCreated: 1,
190
+ },
191
+ },
192
+ };
193
+ case Chain.NEON_EVM_MAINNET:
194
+ return neonMainnet;
195
+ case Chain.DEGEN_CHAIN:
196
+ return {
197
+ ...degen,
198
+ contracts: {
199
+ multicall3: {
200
+ address: "0xcA11bde05977b3631167028862bE2a173976CA11",
201
+ blockCreated: 1,
202
+ },
203
+ },
204
+ };
205
+ case Chain.GRAVITY_ALPHA_MAINNET:
206
+ return gravity;
207
+ case Chain.LIGHTLINK_PHOENIX_MAINNET:
208
+ return lightlinkPhoenix;
209
+ case Chain.PLUME_MAINNET:
210
+ return plume;
211
+ case Chain.ABSTRACT:
212
+ return abstract;
213
+ case Chain.PEAQ:
214
+ return peaq;
215
+ case Chain.EVM_ON_FLOW:
216
+ return flowMainnet;
217
+ case Chain.SONEIUM:
218
+ return soneium;
219
+ case Chain.GOAT_NETWORK:
220
+ return goat;
221
+ case Chain.BERACHAIN:
222
+ return berachain;
223
+ case Chain.ROOTSTOCK_MAINNET:
224
+ return rootstock;
225
+ case Chain.VANAR_MAINNET:
226
+ return vanar;
227
+ case Chain.INK:
228
+ return {
229
+ ...ink,
230
+ contracts: {
231
+ multicall3: {
232
+ address: "0xcA11bde05977b3631167028862bE2a173976CA11",
233
+ blockCreated: 1,
234
+ },
235
+ },
236
+ };
237
+ case Chain.FUSE_MAINNET:
238
+ return fuse;
239
+ case Chain.SUPERPOSITION:
240
+ return superposition;
241
+ case Chain.STORY:
242
+ return {
243
+ ...story,
244
+ contracts: {
245
+ multicall3: {
246
+ address: "0xcA11bde05977b3631167028862bE2a173976CA11",
247
+ blockCreated: 1,
248
+ },
249
+ },
250
+ };
251
+ case Chain.APECHAIN:
252
+ return apeChain;
253
+ case Chain.IOTEX_NETWORK_MAINNET:
254
+ return iotex;
255
+ case Chain.TELOS_EVM_MAINNET:
256
+ return telos;
257
+ case Chain.FLARE_MAINNET:
258
+ return flare;
259
+ case Chain.AURA_MAINNET:
260
+ return aurora;
261
+ case Chain.KAVA:
262
+ return kava;
263
+ case Chain.IOTA_EVM:
264
+ return iota;
265
+ case Chain.AURORA_MAINNET:
266
+ return aurora;
267
+ case Chain.UNICHAIN:
268
+ return unichain;
269
+ case Chain.CORE_BLOCKCHAIN_MAINNET:
270
+ return coreDao;
271
+ case Chain.MODE:
272
+ return mode;
273
+ case Chain.CORN:
274
+ return corn;
275
+ case Chain.BOB:
276
+ return bob;
277
+ case Chain.RONIN_MAINNET:
278
+ return ronin;
279
+ case Chain.MANTA_PACIFIC_MAINNET:
280
+ return manta;
281
+ case Chain.ZIRCUIT_MAINNET:
282
+ return zircuit;
283
+ case Chain.GRAPHLINQ_BLOCKCHAIN_MAINNET:
284
+ return GraphLinq;
285
+ case Chain.ZETACHAIN_MAINNET:
286
+ return zetachain;
287
+ case Chain.BITLAYER_MAINNET:
288
+ return bitlayer;
289
+ case Chain.CROSSFI_MAINNET:
290
+ return crossfi;
291
+ case Chain.INEVM_MAINNET:
292
+ return inEVM;
293
+ case Chain.B2_MAINNET:
294
+ return {
295
+ ...bsquared,
296
+ contracts: {
297
+ multicall3: {
298
+ address: "0xcA11bde05977b3631167028862bE2a173976CA11",
299
+ blockCreated: 1,
300
+ },
301
+ },
302
+ };
303
+ case Chain.SEI_NETWORK:
304
+ return sei;
305
+ case Chain.MERLIN_MAINNET:
306
+ return {
307
+ ...merlin,
308
+ contracts: {
309
+ multicall3: {
310
+ address: "0x46063722c010AF39E465d286B84936A12aFb81F0",
311
+ blockCreated: 1,
312
+ },
313
+ },
314
+ };
315
+ case Chain.X_LAYER_MAINNET:
316
+ return xLayer;
317
+ case Chain.CELO_MAINNET:
318
+ return celo;
319
+ case Chain.BOTANIX_MAINNET:
320
+ return botanix;
321
+ case Chain.HARMONY_MAINNET_SHARD_0:
322
+ return harmonyOne;
323
+ // case Chain.VANA:
324
+ // return vana
325
+ // case Chain.RARI_CHAIN_MAINNET:
326
+ // return rariChain
327
+ // case Chain.GLUE_MAINNET:
328
+ // return glue
329
+ default:
330
+ throw new Error("Not in VIEM: " + chain);
331
+ }
334
332
  }
335
333
 
336
334
  const RPC_OVERRIDES: any = {
337
- [Chain.FANTOM_OPERA]: "https://rpc.fantom.network",
338
- [Chain.BNB_SMART_CHAIN_MAINNET]: "https://bsc-dataseed2.ninicoin.io",
339
- [Chain.METIS_ANDROMEDA_MAINNET]: "https://andromeda.metis.io/?owner=1088",
340
- [Chain.X_LAYER_MAINNET]: "https://xlayerrpc.okx.com",
341
- }
335
+ [Chain.FANTOM_OPERA]: "https://rpc.fantom.network",
336
+ [Chain.BNB_SMART_CHAIN_MAINNET]: "https://bsc-dataseed2.ninicoin.io",
337
+ [Chain.METIS_ANDROMEDA_MAINNET]: "https://andromeda.metis.io/?owner=1088",
338
+ [Chain.X_LAYER_MAINNET]: "https://xlayerrpc.okx.com",
339
+ };
342
340
 
343
341
  function trimTrailingSlash(url?: string) {
344
- if (!url) return undefined
345
- return url.endsWith('/') ? url.slice(0, -1) : url;
342
+ if (!url) return undefined;
343
+ return url.endsWith("/") ? url.slice(0, -1) : url;
346
344
  }
347
345
 
348
346
  export function getEvmClient(chain: string, rpcId = 0): PublicClient {
349
- const chainInfo = getEvmChain(chain)
350
- let rpc: string
351
- if (rpcId === 0) rpc = chainInfo.rpcUrls.default.http[0]
352
- else {
353
- const rpcsChain = CHAIN_INFO[chain].rpc?.filter(a => !a.includes("wss://"))
354
- const rpcs = chainInfo.rpcUrls.default.http.map(a => trimTrailingSlash(a))
355
- const rpcsAdded = rpcsChain.map(a => trimTrailingSlash(a))
356
- const allRpcs = uniq([...rpcs, ...rpcsAdded])
357
- rpc = allRpcs[rpcId] as any
358
- }
359
- return createPublicClient({
360
- chain: chainInfo as any,
361
- transport: http(
362
- RPC_OVERRIDES[chain] ??
363
- rpc
364
- )
365
- }) as any
366
-
347
+ const chainInfo = getEvmChain(chain);
348
+ let rpc: string;
349
+ if (rpcId === 0) rpc = chainInfo.rpcUrls.default.http[0];
350
+ else {
351
+ const rpcsChain = CHAIN_INFO[chain].rpc?.filter(
352
+ (a) => !a.includes("wss://")
353
+ );
354
+ const rpcs = chainInfo.rpcUrls.default.http.map((a) =>
355
+ trimTrailingSlash(a)
356
+ );
357
+ const rpcsAdded = rpcsChain.map((a) => trimTrailingSlash(a));
358
+ const allRpcs = uniq([...rpcs, ...rpcsAdded]);
359
+ rpc = allRpcs[rpcId] as any;
360
+ }
361
+ return createPublicClient({
362
+ chain: chainInfo as any,
363
+ transport: http(RPC_OVERRIDES[chain] ?? rpc),
364
+ }) as any;
367
365
  }
368
366
 
369
367
  const DEFAULT_BATCH_SIZE = 4096;
370
368
 
371
- export function createMulticallRetry(customRpcs?: { [chainId: string]: string[] }) {
372
- return async function multicallRetry(
373
- chain: string,
374
- calls: any[],
375
- abi: any,
376
- batchSize = DEFAULT_BATCH_SIZE,
377
- maxRetries = 3,
378
- providerId = 0,
379
- allowFailure = true,
380
- ) {
381
- try {
382
- const provider = getEvmClientWithCustomRpcs(chain, providerId, customRpcs)
383
- const abiIsArray = isArray(abi[0])
384
- const data = await provider.multicall({
385
- batchSize: DEFAULT_BATCH_SIZE,
386
- contracts: calls.map((call, i) => ({
387
- abi: abiIsArray ? abi?.[i] : abi,
388
- address: call.address as any,
389
- functionName: call.name,
390
- // @ts-ignore
391
- args: call.args ?? call.params ?? [],
392
- })),
393
- allowFailure,
394
- })
395
- if (allowFailure) {
396
- return (data as any[]).map(
397
- ({ result, status }: any) => status !== "success" ? '0x' : result
398
- );
399
- }
400
- return data
401
- } catch (e) {
402
- // error if max retries achieved
403
- if (maxRetries === 0) throw e
404
- console.log(e)
405
- return await multicallRetry(chain, calls, abi, batchSize, maxRetries - 1, providerId + 1)
406
- }
369
+ export function createMulticallRetry(customRpcs?: {
370
+ [chainId: string]: string[];
371
+ }) {
372
+ return async function multicallRetry(
373
+ chain: string,
374
+ calls: any[],
375
+ abi: any,
376
+ batchSize = DEFAULT_BATCH_SIZE,
377
+ maxRetries = 3,
378
+ providerId = 0,
379
+ allowFailure = true
380
+ ) {
381
+ try {
382
+ const provider = getEvmClientWithCustomRpcs(
383
+ chain,
384
+ providerId,
385
+ customRpcs
386
+ );
387
+ const abiIsArray = isArray(abi[0]);
388
+ const data = await provider.multicall({
389
+ batchSize: DEFAULT_BATCH_SIZE,
390
+ contracts: calls.map((call, i) => ({
391
+ abi: abiIsArray ? abi?.[i] : abi,
392
+ address: call.address as any,
393
+ functionName: call.name,
394
+ // @ts-ignore
395
+ args: call.args ?? call.params ?? [],
396
+ })),
397
+ allowFailure,
398
+ });
399
+ if (allowFailure) {
400
+ return (data as any[]).map(({ result, status }: any) =>
401
+ status !== "success" ? "0x" : result
402
+ );
403
+ }
404
+ return data;
405
+ } catch (e) {
406
+ // error if max retries achieved
407
+ if (maxRetries === 0) throw e;
408
+ console.log(e);
409
+ return await multicallRetry(
410
+ chain,
411
+ calls,
412
+ abi,
413
+ batchSize,
414
+ maxRetries - 1,
415
+ providerId + 1
416
+ );
407
417
  }
418
+ };
408
419
  }
409
420
 
410
- function getEvmClientWithCustomRpcs(chain: string, rpcId = 0, customRpcs?: { [chainId: string]: string[] }): PublicClient {
411
- const chainInfo = getEvmChain(chain)
412
- let rpc: string
421
+ export function getEvmClientWithCustomRpcs(
422
+ chain: string,
423
+ rpcId = 0,
424
+ customRpcs?: { [chainId: string]: string[] }
425
+ ): PublicClient {
426
+ const chainInfo = getEvmChain(chain);
427
+ let rpc: string;
413
428
 
414
- if (customRpcs && customRpcs[chain]) {
415
- // Use custom RPC list if any (make sure that they are unique and valid)
416
- const customRpcList = uniq(
417
- customRpcs[chain]
418
- .filter(Boolean) // Remove empty ones
419
- .filter(a => !a.includes("wss://")) // filter websocket ones (like the default impl)
420
- .map(url => trimTrailingSlash(url))
421
- .filter((url): url is string => Boolean(url)) // Type-safe filter for defined URLs
422
- )
429
+ if (customRpcs && customRpcs[chain]) {
430
+ // Use custom RPC list if any (make sure that they are unique and valid)
431
+ const customRpcList = uniq(
432
+ customRpcs[chain]
433
+ .filter(Boolean) // Remove empty ones
434
+ .filter((a) => !a.includes("wss://")) // filter websocket ones (like the default impl)
435
+ .map((url) => trimTrailingSlash(url))
436
+ .filter((url): url is string => Boolean(url)) // Type-safe filter for defined URLs
437
+ );
423
438
 
424
- if (customRpcList.length === 0) {
425
- throw new Error(`No valid custom RPCs provided for chain ${chain}`)
426
- }
439
+ if (customRpcList.length === 0) {
440
+ throw new Error(`No valid custom RPCs provided for chain ${chain}`);
441
+ }
427
442
 
428
- rpc = customRpcList[rpcId % customRpcList.length]
429
- } else {
430
- // Fallback to existing logic
431
- if (rpcId === 0) rpc = chainInfo.rpcUrls.default.http[0]
432
- else {
433
- const rpcsChain = CHAIN_INFO[chain].rpc?.filter(a => !a.includes("wss://"))
434
- const rpcs = chainInfo.rpcUrls.default.http.map(a => trimTrailingSlash(a))
435
- const rpcsAdded = rpcsChain.map(a => trimTrailingSlash(a))
436
- const allRpcs = uniq([...rpcs, ...rpcsAdded])
437
- rpc = allRpcs[rpcId] as any
438
- }
443
+ rpc = customRpcList[rpcId % customRpcList.length];
444
+ } else {
445
+ // Fallback to existing logic
446
+ if (rpcId === 0) rpc = chainInfo.rpcUrls.default.http[0];
447
+ else {
448
+ const rpcsChain = CHAIN_INFO[chain].rpc?.filter(
449
+ (a) => !a.includes("wss://")
450
+ );
451
+ const rpcs = chainInfo.rpcUrls.default.http.map((a) =>
452
+ trimTrailingSlash(a)
453
+ );
454
+ const rpcsAdded = rpcsChain.map((a) => trimTrailingSlash(a));
455
+ const allRpcs = uniq([...rpcs, ...rpcsAdded]);
456
+ rpc = allRpcs[rpcId] as any;
439
457
  }
458
+ }
440
459
 
441
- return createPublicClient({
442
- chain: chainInfo as any,
443
- transport: http(
444
- RPC_OVERRIDES[chain] ??
445
- rpc
446
- )
447
- }) as any
460
+ return createPublicClient({
461
+ chain: chainInfo as any,
462
+ transport: http(RPC_OVERRIDES[chain] ?? rpc),
463
+ }) as any;
448
464
  }
449
465
 
450
466
  export async function multicallRetry(
451
- chain: string,
452
- calls: any[],
453
- abi: any,
454
- batchSize = DEFAULT_BATCH_SIZE,
455
- maxRetries = 3,
456
- providerId = 0,
467
+ chain: string,
468
+ calls: any[],
469
+ abi: any,
470
+ batchSize = DEFAULT_BATCH_SIZE,
471
+ maxRetries = 3,
472
+ providerId = 0
457
473
  ) {
458
- const defaultMulticallRetry = createMulticallRetry()
459
- return defaultMulticallRetry(chain, calls, abi, batchSize, maxRetries, providerId)
460
- }
474
+ const defaultMulticallRetry = createMulticallRetry();
475
+ return defaultMulticallRetry(
476
+ chain,
477
+ calls,
478
+ abi,
479
+ batchSize,
480
+ maxRetries,
481
+ providerId
482
+ );
483
+ }