@1delta/providers 0.0.1 → 0.0.3
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.
- package/dist/evm.d.ts +3 -0
- package/dist/evm.d.ts.map +1 -1
- package/dist/evm.js +43 -44
- package/package.json +1 -1
- package/src/evm.ts +442 -419
package/dist/evm.d.ts
CHANGED
|
@@ -111,5 +111,8 @@ export declare function getEvmClient(chain: string, rpcId?: number): PublicClien
|
|
|
111
111
|
export declare function createMulticallRetry(customRpcs?: {
|
|
112
112
|
[chainId: string]: string[];
|
|
113
113
|
}): (chain: string, calls: any[], abi: any, batchSize?: number, maxRetries?: number, providerId?: number, allowFailure?: boolean) => Promise<any[]>;
|
|
114
|
+
export declare function getEvmClientWithCustomRpcs(chain: string, rpcId?: number, customRpcs?: {
|
|
115
|
+
[chainId: string]: string[];
|
|
116
|
+
}): PublicClient;
|
|
114
117
|
export declare function multicallRetry(chain: string, calls: any[], abi: any, batchSize?: number, maxRetries?: number, providerId?: number): Promise<any[]>;
|
|
115
118
|
//# sourceMappingURL=evm.d.ts.map
|
package/dist/evm.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evm.d.ts","sourceRoot":"","sources":["../src/evm.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyC,YAAY,EAAE,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"evm.d.ts","sourceRoot":"","sources":["../src/evm.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyC,YAAY,EAAE,MAAM,MAAM,CAAC;AAiE3E,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsBlB,CAAC;AAEH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyBlB,CAAC;AAEH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsBpB,CAAC;AA6MH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,YAAY,CAmBnE;AAID,wBAAgB,oBAAoB,CAAC,UAAU,CAAC,EAAE;IAChD,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC7B,IAEG,OAAO,MAAM,EACb,OAAO,GAAG,EAAE,EACZ,KAAK,GAAG,EACR,kBAA8B,EAC9B,mBAAc,EACd,mBAAc,EACd,sBAAmB,oBAwCtB;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,MAAM,EACb,KAAK,SAAI,EACT,UAAU,CAAC,EAAE;IAAE,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAAE,GAC3C,YAAY,CAuCd;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,GAAG,EAAE,EACZ,GAAG,EAAE,GAAG,EACR,SAAS,SAAqB,EAC9B,UAAU,SAAI,EACd,UAAU,SAAI,kBAWf"}
|
package/dist/evm.js
CHANGED
|
@@ -4,19 +4,19 @@ import { createPublicClient, defineChain, http } from "viem";
|
|
|
4
4
|
import { mantle, mainnet, optimism, arbitrum, bsc, avalanche, taiko, metis, polygon, zksync, scroll, gnosis, base, blast, kaia, opBNB, fantom, sonic, linea, hemi, neonMainnet, degen, gravity, lightlinkPhoenix, plume, abstract, peaq, flowMainnet, soneium, goat, berachain, rootstock, ink, vanar, fuse, superposition, story, apeChain, telos, flare, aurora, kava, iota, coreDao, unichain, mode, xLayer, zircuit, corn, bob, manta, harmonyOne, celo, bitlayer, merlin, sei, iotex, bsquared, zetachain, ronin, inEVM, } from "viem/chains";
|
|
5
5
|
export const crossfi = defineChain({
|
|
6
6
|
id: 4158,
|
|
7
|
-
name:
|
|
7
|
+
name: "CrossFi Mainet",
|
|
8
8
|
nativeCurrency: {
|
|
9
9
|
decimals: 18,
|
|
10
|
-
name:
|
|
11
|
-
symbol:
|
|
10
|
+
name: "XFI",
|
|
11
|
+
symbol: "XFI",
|
|
12
12
|
},
|
|
13
13
|
rpcUrls: {
|
|
14
14
|
default: {
|
|
15
|
-
http: [
|
|
15
|
+
http: ["https://rpc.mainnet.ms/"],
|
|
16
16
|
},
|
|
17
17
|
},
|
|
18
18
|
blockExplorers: {
|
|
19
|
-
default: { name:
|
|
19
|
+
default: { name: "Explorer", url: "https://xfiscan.com/" },
|
|
20
20
|
},
|
|
21
21
|
// contracts: {
|
|
22
22
|
// multicall3: {
|
|
@@ -27,37 +27,37 @@ export const crossfi = defineChain({
|
|
|
27
27
|
});
|
|
28
28
|
export const botanix = defineChain({
|
|
29
29
|
id: 3637,
|
|
30
|
-
name:
|
|
30
|
+
name: "Botanix",
|
|
31
31
|
nativeCurrency: {
|
|
32
32
|
decimals: 18,
|
|
33
|
-
name:
|
|
34
|
-
symbol:
|
|
33
|
+
name: "BTC",
|
|
34
|
+
symbol: "BTC",
|
|
35
35
|
},
|
|
36
36
|
rpcUrls: {
|
|
37
37
|
default: {
|
|
38
38
|
http: [
|
|
39
39
|
"https://rpc.ankr.com/botanix_mainnet",
|
|
40
|
-
"https://rpc.botanixlabs.com"
|
|
40
|
+
"https://rpc.botanixlabs.com",
|
|
41
41
|
],
|
|
42
42
|
},
|
|
43
43
|
},
|
|
44
44
|
blockExplorers: {
|
|
45
|
-
default: { name:
|
|
45
|
+
default: { name: "Explorer", url: "https://botanixscan.io/" },
|
|
46
46
|
},
|
|
47
47
|
contracts: {
|
|
48
48
|
multicall3: {
|
|
49
49
|
address: "0xcA11bde05977b3631167028862bE2a173976CA11",
|
|
50
50
|
blockCreated: 1,
|
|
51
|
-
}
|
|
52
|
-
}
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
53
|
});
|
|
54
54
|
export const GraphLinq = defineChain({
|
|
55
55
|
id: 614,
|
|
56
|
-
name:
|
|
56
|
+
name: "GraphLinq Chain",
|
|
57
57
|
nativeCurrency: {
|
|
58
58
|
decimals: 18,
|
|
59
|
-
name:
|
|
60
|
-
symbol:
|
|
59
|
+
name: "GLQ",
|
|
60
|
+
symbol: "GLQ",
|
|
61
61
|
},
|
|
62
62
|
rpcUrls: {
|
|
63
63
|
default: {
|
|
@@ -65,7 +65,7 @@ export const GraphLinq = defineChain({
|
|
|
65
65
|
},
|
|
66
66
|
},
|
|
67
67
|
blockExplorers: {
|
|
68
|
-
default: { name:
|
|
68
|
+
default: { name: "Explorer", url: "https://explorer.graphlinq.io" },
|
|
69
69
|
},
|
|
70
70
|
// contracts: {
|
|
71
71
|
// multicall3: {
|
|
@@ -121,8 +121,8 @@ function getEvmChain(chain) {
|
|
|
121
121
|
multicall3: {
|
|
122
122
|
address: "0xcA11bde05977b3631167028862bE2a173976CA11",
|
|
123
123
|
blockCreated: 1,
|
|
124
|
-
}
|
|
125
|
-
}
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
126
|
};
|
|
127
127
|
case Chain.NEON_EVM_MAINNET:
|
|
128
128
|
return neonMainnet;
|
|
@@ -133,8 +133,8 @@ function getEvmChain(chain) {
|
|
|
133
133
|
multicall3: {
|
|
134
134
|
address: "0xcA11bde05977b3631167028862bE2a173976CA11",
|
|
135
135
|
blockCreated: 1,
|
|
136
|
-
}
|
|
137
|
-
}
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
138
|
};
|
|
139
139
|
case Chain.GRAVITY_ALPHA_MAINNET:
|
|
140
140
|
return gravity;
|
|
@@ -165,8 +165,8 @@ function getEvmChain(chain) {
|
|
|
165
165
|
multicall3: {
|
|
166
166
|
address: "0xcA11bde05977b3631167028862bE2a173976CA11",
|
|
167
167
|
blockCreated: 1,
|
|
168
|
-
}
|
|
169
|
-
}
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
170
|
};
|
|
171
171
|
case Chain.FUSE_MAINNET:
|
|
172
172
|
return fuse;
|
|
@@ -179,8 +179,8 @@ function getEvmChain(chain) {
|
|
|
179
179
|
multicall3: {
|
|
180
180
|
address: "0xcA11bde05977b3631167028862bE2a173976CA11",
|
|
181
181
|
blockCreated: 1,
|
|
182
|
-
}
|
|
183
|
-
}
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
184
|
};
|
|
185
185
|
case Chain.APECHAIN:
|
|
186
186
|
return apeChain;
|
|
@@ -231,8 +231,8 @@ function getEvmChain(chain) {
|
|
|
231
231
|
multicall3: {
|
|
232
232
|
address: "0xcA11bde05977b3631167028862bE2a173976CA11",
|
|
233
233
|
blockCreated: 1,
|
|
234
|
-
}
|
|
235
|
-
}
|
|
234
|
+
},
|
|
235
|
+
},
|
|
236
236
|
};
|
|
237
237
|
case Chain.SEI_NETWORK:
|
|
238
238
|
return sei;
|
|
@@ -243,8 +243,8 @@ function getEvmChain(chain) {
|
|
|
243
243
|
multicall3: {
|
|
244
244
|
address: "0x46063722c010AF39E465d286B84936A12aFb81F0",
|
|
245
245
|
blockCreated: 1,
|
|
246
|
-
}
|
|
247
|
-
}
|
|
246
|
+
},
|
|
247
|
+
},
|
|
248
248
|
};
|
|
249
249
|
case Chain.X_LAYER_MAINNET:
|
|
250
250
|
return xLayer;
|
|
@@ -260,7 +260,8 @@ function getEvmChain(chain) {
|
|
|
260
260
|
// return rariChain
|
|
261
261
|
// case Chain.GLUE_MAINNET:
|
|
262
262
|
// return glue
|
|
263
|
-
default:
|
|
263
|
+
default:
|
|
264
|
+
throw new Error("Not in VIEM: " + chain);
|
|
264
265
|
}
|
|
265
266
|
}
|
|
266
267
|
const RPC_OVERRIDES = {
|
|
@@ -272,7 +273,7 @@ const RPC_OVERRIDES = {
|
|
|
272
273
|
function trimTrailingSlash(url) {
|
|
273
274
|
if (!url)
|
|
274
275
|
return undefined;
|
|
275
|
-
return url.endsWith(
|
|
276
|
+
return url.endsWith("/") ? url.slice(0, -1) : url;
|
|
276
277
|
}
|
|
277
278
|
export function getEvmClient(chain, rpcId = 0) {
|
|
278
279
|
const chainInfo = getEvmChain(chain);
|
|
@@ -280,16 +281,15 @@ export function getEvmClient(chain, rpcId = 0) {
|
|
|
280
281
|
if (rpcId === 0)
|
|
281
282
|
rpc = chainInfo.rpcUrls.default.http[0];
|
|
282
283
|
else {
|
|
283
|
-
const rpcsChain = CHAIN_INFO[chain].rpc?.filter(a => !a.includes("wss://"));
|
|
284
|
-
const rpcs = chainInfo.rpcUrls.default.http.map(a => trimTrailingSlash(a));
|
|
285
|
-
const rpcsAdded = rpcsChain.map(a => trimTrailingSlash(a));
|
|
284
|
+
const rpcsChain = CHAIN_INFO[chain].rpc?.filter((a) => !a.includes("wss://"));
|
|
285
|
+
const rpcs = chainInfo.rpcUrls.default.http.map((a) => trimTrailingSlash(a));
|
|
286
|
+
const rpcsAdded = rpcsChain.map((a) => trimTrailingSlash(a));
|
|
286
287
|
const allRpcs = uniq([...rpcs, ...rpcsAdded]);
|
|
287
288
|
rpc = allRpcs[rpcId];
|
|
288
289
|
}
|
|
289
290
|
return createPublicClient({
|
|
290
291
|
chain: chainInfo,
|
|
291
|
-
transport: http(RPC_OVERRIDES[chain] ??
|
|
292
|
-
rpc)
|
|
292
|
+
transport: http(RPC_OVERRIDES[chain] ?? rpc),
|
|
293
293
|
});
|
|
294
294
|
}
|
|
295
295
|
const DEFAULT_BATCH_SIZE = 4096;
|
|
@@ -310,7 +310,7 @@ export function createMulticallRetry(customRpcs) {
|
|
|
310
310
|
allowFailure,
|
|
311
311
|
});
|
|
312
312
|
if (allowFailure) {
|
|
313
|
-
return data.map(({ result, status }) => status !== "success" ?
|
|
313
|
+
return data.map(({ result, status }) => status !== "success" ? "0x" : result);
|
|
314
314
|
}
|
|
315
315
|
return data;
|
|
316
316
|
}
|
|
@@ -323,15 +323,15 @@ export function createMulticallRetry(customRpcs) {
|
|
|
323
323
|
}
|
|
324
324
|
};
|
|
325
325
|
}
|
|
326
|
-
function getEvmClientWithCustomRpcs(chain, rpcId = 0, customRpcs) {
|
|
326
|
+
export function getEvmClientWithCustomRpcs(chain, rpcId = 0, customRpcs) {
|
|
327
327
|
const chainInfo = getEvmChain(chain);
|
|
328
328
|
let rpc;
|
|
329
329
|
if (customRpcs && customRpcs[chain]) {
|
|
330
330
|
// Use custom RPC list if any (make sure that they are unique and valid)
|
|
331
331
|
const customRpcList = uniq(customRpcs[chain]
|
|
332
332
|
.filter(Boolean) // Remove empty ones
|
|
333
|
-
.filter(a => !a.includes("wss://")) // filter websocket ones (like the default impl)
|
|
334
|
-
.map(url => trimTrailingSlash(url))
|
|
333
|
+
.filter((a) => !a.includes("wss://")) // filter websocket ones (like the default impl)
|
|
334
|
+
.map((url) => trimTrailingSlash(url))
|
|
335
335
|
.filter((url) => Boolean(url)) // Type-safe filter for defined URLs
|
|
336
336
|
);
|
|
337
337
|
if (customRpcList.length === 0) {
|
|
@@ -344,17 +344,16 @@ function getEvmClientWithCustomRpcs(chain, rpcId = 0, customRpcs) {
|
|
|
344
344
|
if (rpcId === 0)
|
|
345
345
|
rpc = chainInfo.rpcUrls.default.http[0];
|
|
346
346
|
else {
|
|
347
|
-
const rpcsChain = CHAIN_INFO[chain].rpc?.filter(a => !a.includes("wss://"));
|
|
348
|
-
const rpcs = chainInfo.rpcUrls.default.http.map(a => trimTrailingSlash(a));
|
|
349
|
-
const rpcsAdded = rpcsChain.map(a => trimTrailingSlash(a));
|
|
347
|
+
const rpcsChain = CHAIN_INFO[chain].rpc?.filter((a) => !a.includes("wss://"));
|
|
348
|
+
const rpcs = chainInfo.rpcUrls.default.http.map((a) => trimTrailingSlash(a));
|
|
349
|
+
const rpcsAdded = rpcsChain.map((a) => trimTrailingSlash(a));
|
|
350
350
|
const allRpcs = uniq([...rpcs, ...rpcsAdded]);
|
|
351
351
|
rpc = allRpcs[rpcId];
|
|
352
352
|
}
|
|
353
353
|
}
|
|
354
354
|
return createPublicClient({
|
|
355
355
|
chain: chainInfo,
|
|
356
|
-
transport: http(RPC_OVERRIDES[chain] ??
|
|
357
|
-
rpc)
|
|
356
|
+
transport: http(RPC_OVERRIDES[chain] ?? rpc),
|
|
358
357
|
});
|
|
359
358
|
}
|
|
360
359
|
export async function multicallRetry(chain, calls, abi, batchSize = DEFAULT_BATCH_SIZE, maxRetries = 3, providerId = 0) {
|
package/package.json
CHANGED
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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
|
-
|
|
112
|
-
multicall3: {
|
|
113
|
-
address: "0xcA11bde05977b3631167028862bE2a173976CA11",
|
|
114
|
-
blockCreated: 1,
|
|
115
|
-
}
|
|
116
|
-
}
|
|
116
|
+
},
|
|
117
117
|
});
|
|
118
118
|
|
|
119
|
-
|
|
120
119
|
export const GraphLinq = defineChain({
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
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
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
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
|
-
|
|
345
|
-
|
|
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
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
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?: {
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
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(
|
|
411
|
-
|
|
412
|
-
|
|
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
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
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
|
-
|
|
425
|
-
|
|
426
|
-
|
|
439
|
+
if (customRpcList.length === 0) {
|
|
440
|
+
throw new Error(`No valid custom RPCs provided for chain ${chain}`);
|
|
441
|
+
}
|
|
427
442
|
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
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
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
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
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
467
|
+
chain: string,
|
|
468
|
+
calls: any[],
|
|
469
|
+
abi: any,
|
|
470
|
+
batchSize = DEFAULT_BATCH_SIZE,
|
|
471
|
+
maxRetries = 3,
|
|
472
|
+
providerId = 0
|
|
457
473
|
) {
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
474
|
+
const defaultMulticallRetry = createMulticallRetry();
|
|
475
|
+
return defaultMulticallRetry(
|
|
476
|
+
chain,
|
|
477
|
+
calls,
|
|
478
|
+
abi,
|
|
479
|
+
batchSize,
|
|
480
|
+
maxRetries,
|
|
481
|
+
providerId
|
|
482
|
+
);
|
|
483
|
+
}
|