@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.
- package/package.json +1 -1
- package/src/evm.ts +442 -419
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
|
+
}
|