web3-mev-error-decoder 0.0.0-stage → 0.1.0

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 (72) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +167 -2
  3. package/dist/error-decoder/constants.d.ts +5 -0
  4. package/dist/error-decoder/constants.js +19 -0
  5. package/dist/error-decoder/constants.js.map +1 -0
  6. package/dist/error-decoder/decoder.d.ts +43 -0
  7. package/dist/error-decoder/decoder.js +98 -0
  8. package/dist/error-decoder/decoder.js.map +1 -0
  9. package/dist/error-decoder/enums.d.ts +9 -0
  10. package/dist/error-decoder/enums.js +11 -0
  11. package/dist/error-decoder/enums.js.map +1 -0
  12. package/dist/error-decoder/handlers.d.ts +32 -0
  13. package/dist/error-decoder/handlers.js +131 -0
  14. package/dist/error-decoder/handlers.js.map +1 -0
  15. package/dist/error-decoder/index.d.ts +7 -0
  16. package/dist/error-decoder/index.js +7 -0
  17. package/dist/error-decoder/index.js.map +1 -0
  18. package/dist/error-decoder/results.d.ts +19 -0
  19. package/dist/error-decoder/results.js +53 -0
  20. package/dist/error-decoder/results.js.map +1 -0
  21. package/dist/error-decoder/types.d.ts +31 -0
  22. package/dist/error-decoder/types.js +2 -0
  23. package/dist/error-decoder/types.js.map +1 -0
  24. package/dist/error-decoder/viem.d.ts +19 -0
  25. package/dist/error-decoder/viem.js +47 -0
  26. package/dist/error-decoder/viem.js.map +1 -0
  27. package/dist/index.d.ts +5 -0
  28. package/dist/index.js +6 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/multicall/abi.d.ts +7 -0
  31. package/dist/multicall/abi.js +27 -0
  32. package/dist/multicall/abi.js.map +1 -0
  33. package/dist/multicall/ethers.d.ts +50 -0
  34. package/dist/multicall/ethers.js +78 -0
  35. package/dist/multicall/ethers.js.map +1 -0
  36. package/dist/multicall/index.d.ts +21 -0
  37. package/dist/multicall/index.js +33 -0
  38. package/dist/multicall/index.js.map +1 -0
  39. package/dist/multicall/viem.d.ts +14 -0
  40. package/dist/multicall/viem.js +32 -0
  41. package/dist/multicall/viem.js.map +1 -0
  42. package/dist/provider/fallback-full.d.ts +124 -0
  43. package/dist/provider/fallback-full.js +629 -0
  44. package/dist/provider/fallback-full.js.map +1 -0
  45. package/dist/provider/fallback.d.ts +37 -0
  46. package/dist/provider/fallback.js +120 -0
  47. package/dist/provider/fallback.js.map +1 -0
  48. package/dist/provider/index.d.ts +7 -0
  49. package/dist/provider/index.js +5 -0
  50. package/dist/provider/index.js.map +1 -0
  51. package/dist/provider/viem-fallback.d.ts +47 -0
  52. package/dist/provider/viem-fallback.js +69 -0
  53. package/dist/provider/viem-fallback.js.map +1 -0
  54. package/dist/transaction/ethers.d.ts +27 -0
  55. package/dist/transaction/ethers.js +97 -0
  56. package/dist/transaction/ethers.js.map +1 -0
  57. package/dist/transaction/index.d.ts +21 -0
  58. package/dist/transaction/index.js +31 -0
  59. package/dist/transaction/index.js.map +1 -0
  60. package/dist/transaction/types.d.ts +46 -0
  61. package/dist/transaction/types.js +21 -0
  62. package/dist/transaction/types.js.map +1 -0
  63. package/dist/transaction/viem.d.ts +29 -0
  64. package/dist/transaction/viem.js +86 -0
  65. package/dist/transaction/viem.js.map +1 -0
  66. package/dist/types.d.ts +18 -0
  67. package/dist/types.js +2 -0
  68. package/dist/types.js.map +1 -0
  69. package/dist/utils.d.ts +59 -0
  70. package/dist/utils.js +140 -0
  71. package/dist/utils.js.map +1 -0
  72. package/package.json +106 -4
@@ -0,0 +1,629 @@
1
+ import { isError, keccak256, JsonRpcApiProvider, } from 'ethers';
2
+ import { checkAllRejected, checkAnyResolved, wait, withTimeout } from '../utils.js';
3
+ export var FallbackProviderError;
4
+ (function (FallbackProviderError) {
5
+ FallbackProviderError["NO_PROVIDER"] = "At least one provider must be provided";
6
+ FallbackProviderError["CANNOT_DETECT_NETWORKS"] = "Could not detect providers networks";
7
+ FallbackProviderError["INCONSISTENT_NETWORKS"] = "All providers must be connected to the same network";
8
+ FallbackProviderError["DESTROYED"] = "Provider has been destroyed";
9
+ FallbackProviderError["ALL_PROVIDERS_UNAVAILABLE"] = "All providers are unavailable";
10
+ FallbackProviderError["HALTED"] = "Chain has halted";
11
+ FallbackProviderError["INVALID_FALLBACK_OPTIONS"] = "Invalid fallback options";
12
+ FallbackProviderError["BLOCK_NUMBER_STORAGE_CONFIG_ERROR"] = "Both getStoredBlockNumber and setStoredBlockNumber must be provided or neither";
13
+ FallbackProviderError["FAILED_TO_GET_BLOCKNUMBER"] = "Failed to get block number";
14
+ })(FallbackProviderError || (FallbackProviderError = {}));
15
+ export const DEFAULT_RETRIES = 0;
16
+ export const DEFAULT_TIMEOUT = 3_000;
17
+ export const RETRY_DELAY = 100;
18
+ const DEFAULT_FALLBACK_BROADCAST_CONFIG = { delay: 0, delayJitter: 0 };
19
+ // Network detection and liveliness checks depend on these, so every provider is assumed to serve them.
20
+ export const ALWAYS_SUPPORTED_METHODS = ['eth_chainId', 'eth_blockNumber'];
21
+ export const DEFAULT_FALLBACK_OPTIONS = {
22
+ allowableBlockLag: 2,
23
+ haltDetectionTime: 5 * 60, // 5 minutes
24
+ livelinessPollingInterval: 0, // Disabled
25
+ broadcastToAll: false,
26
+ broadcastOnlyToMevProtected: false,
27
+ throwOnFirstBlockchainError: true,
28
+ };
29
+ export function isBlockchainError(e) {
30
+ const isCallException = isError(e, 'CALL_EXCEPTION');
31
+ if (isCallException) {
32
+ // Some nodes surface infrastructure failures as CALL_EXCEPTION; these are not blockchain errors.
33
+ if (e?.info?.error?.message?.includes('intrinsic gas too low') ||
34
+ e?.info?.error?.message?.includes('evm module does not exist on height') ||
35
+ e?.info?.error?.message === 'header not found' ||
36
+ e?.info?.error?.message === 'Unable to perform request' ||
37
+ e?.info?.error?.message?.includes('height must be greater than zero') ||
38
+ e?.info?.error?.message?.includes('missing trie node')) {
39
+ return false;
40
+ }
41
+ // Catch-all, as catching the errors in the style above is not exhaustive.
42
+ if (e.shortMessage === 'missing revert data') {
43
+ return false;
44
+ }
45
+ }
46
+ return (isCallException ||
47
+ isError(e, 'INSUFFICIENT_FUNDS') ||
48
+ isError(e, 'NONCE_EXPIRED') ||
49
+ isError(e, 'REPLACEMENT_UNDERPRICED') ||
50
+ isError(e, 'TRANSACTION_REPLACED') ||
51
+ isError(e, 'UNCONFIGURED_NAME'));
52
+ }
53
+ export function isAlreadyKnownError(e) {
54
+ const msg = (typeof e?.message === 'string' && e.message.toLowerCase()) ||
55
+ (typeof e?.error?.message === 'string' && e.error.message.toLowerCase()) ||
56
+ (typeof e?.shortMessage === 'string' && e.shortMessage.toLowerCase()) ||
57
+ (typeof e?.info?.error?.message === 'string' && e.info.error.message.toLowerCase()) ||
58
+ '';
59
+ return msg.toLowerCase().includes('already known');
60
+ }
61
+ export const providerSupportsMethod = (config, method) => {
62
+ if (ALWAYS_SUPPORTED_METHODS.includes(method))
63
+ return true;
64
+ if (config.unsupportedMethods?.includes(method))
65
+ return false;
66
+ if (config.supportedMethods !== undefined && !config.supportedMethods.includes(method))
67
+ return false;
68
+ return true;
69
+ };
70
+ export const filterProvidersByMethod = (providers, method) => {
71
+ if (ALWAYS_SUPPORTED_METHODS.includes(method))
72
+ return providers;
73
+ return providers.filter((provider) => providerSupportsMethod(provider, method));
74
+ };
75
+ export const filterValidProviders = async (providers) => {
76
+ if (providers.length === 0)
77
+ throw new Error(FallbackProviderError.NO_PROVIDER);
78
+ const networks = await Promise.all(providers.map(({ provider }) => provider.getNetwork().catch(() => null)));
79
+ const availableNetworks = [];
80
+ const availableProviders = [];
81
+ networks.forEach((network, i) => {
82
+ if (!network)
83
+ return;
84
+ availableNetworks.push(network);
85
+ availableProviders.push(providers[i]);
86
+ });
87
+ if (availableNetworks.length === 0)
88
+ throw new Error(FallbackProviderError.CANNOT_DETECT_NETWORKS);
89
+ const defaultNetwork = availableNetworks[0];
90
+ if (availableNetworks.find((n) => n.chainId !== defaultNetwork.chainId))
91
+ throw new Error(FallbackProviderError.INCONSISTENT_NETWORKS);
92
+ return { network: defaultNetwork, providers: availableProviders };
93
+ };
94
+ export async function getBlockNumberWithTimeout(provider, timeout = 5000) {
95
+ return new Promise((resolve, reject) => {
96
+ const timer = setTimeout(() => {
97
+ reject(new Error('Timeout'));
98
+ }, timeout);
99
+ provider
100
+ .getBlockNumber()
101
+ .then((blockNumber) => {
102
+ clearTimeout(timer);
103
+ resolve(blockNumber);
104
+ })
105
+ .catch((error) => {
106
+ clearTimeout(timer);
107
+ reject(error);
108
+ });
109
+ }).catch((error) => {
110
+ throw error;
111
+ });
112
+ }
113
+ export async function getBlockNumber(providerConfig) {
114
+ let attempts = 0;
115
+ const retries = providerConfig.retries ?? DEFAULT_RETRIES;
116
+ const retryDelay = providerConfig.retryDelay ?? RETRY_DELAY;
117
+ const timeout = providerConfig.timeout ?? DEFAULT_TIMEOUT;
118
+ while (attempts <= retries) {
119
+ try {
120
+ const blockNumber = await getBlockNumberWithTimeout(providerConfig.provider, timeout);
121
+ return blockNumber;
122
+ }
123
+ catch (e) {
124
+ if (++attempts > retries) {
125
+ throw e;
126
+ }
127
+ }
128
+ const delay = Math.ceil(Math.random() * (retryDelay ?? RETRY_DELAY));
129
+ await wait(delay);
130
+ }
131
+ throw new Error(FallbackProviderError.FAILED_TO_GET_BLOCKNUMBER);
132
+ }
133
+ export const getBlockNumbersAndMedian = async (providers, logging) => {
134
+ const blockNumbers = await Promise.all(providers.map((provider) => {
135
+ const getProviderPromise = () => getBlockNumber(provider)
136
+ .then((blockNumber) => {
137
+ return { blockNumber: blockNumber, fromCache: false };
138
+ })
139
+ .catch(() => null);
140
+ if (provider.getStoredBlockNumber) {
141
+ return provider
142
+ .getStoredBlockNumber()
143
+ .then((blockNumber) => {
144
+ if (blockNumber === null) {
145
+ return getProviderPromise();
146
+ }
147
+ return { blockNumber, fromCache: true };
148
+ })
149
+ .catch((e) => {
150
+ logging?.warn?.(`[FallbackProvider] Error getting stored block number: ${e.message}`, {
151
+ error: e,
152
+ });
153
+ return getProviderPromise();
154
+ });
155
+ }
156
+ return getProviderPromise();
157
+ }));
158
+ // Filter out the undefined block numbers.
159
+ const filteredBlockNumbers = blockNumbers
160
+ .filter((blockNumberCall) => blockNumberCall != null)
161
+ .map((blockNumberCall) => blockNumberCall.blockNumber);
162
+ if (filteredBlockNumbers.length === 0) {
163
+ throw new Error(FallbackProviderError.ALL_PROVIDERS_UNAVAILABLE);
164
+ }
165
+ // Sort the valid block numbers.
166
+ const sortedBlockNumbers = filteredBlockNumbers.sort((a, b) => a - b);
167
+ // Calculate the median, computing the middle value if the length is odd.
168
+ let median;
169
+ if (sortedBlockNumbers.length % 2 === 0) {
170
+ const middle = sortedBlockNumbers.length / 2;
171
+ median = (sortedBlockNumbers[middle - 1] + sortedBlockNumbers[middle]) / 2;
172
+ }
173
+ else {
174
+ median = sortedBlockNumbers[Math.floor(sortedBlockNumbers.length / 2)];
175
+ }
176
+ // Median should be an integer. Round down if it's not.
177
+ median = Math.floor(median);
178
+ return { blockNumbers: blockNumbers, median: median };
179
+ };
180
+ /**
181
+ * Full-featured RPC fallback provider for ethers v6, ported from
182
+ * `ethers-v6-fallback-provider`.
183
+ *
184
+ * Features: per-provider retries/timeouts, provider failover, liveliness
185
+ * polling with median block-number lag filtering, chain halt detection,
186
+ * JSON-RPC method capability filtering, transaction broadcast to all /
187
+ * MEV-protected-only providers, and blockchain-vs-transport error
188
+ * classification (blockchain errors are never retried on another RPC).
189
+ */
190
+ export class FallbackProvider extends JsonRpcApiProvider {
191
+ #providers;
192
+ #logging;
193
+ #fallbackOptions;
194
+ #active = false;
195
+ #destroyed = false;
196
+ #halted = false;
197
+ #activeProviders = [];
198
+ #hasCapabilityConfig;
199
+ #latestBlockDiscovery = {
200
+ blockNumber: null,
201
+ time: 0,
202
+ };
203
+ constructor(providers, network, options, loggingOptions, fallbackOptions) {
204
+ super(network, options);
205
+ this._validateFallbackOptions(fallbackOptions);
206
+ this.#activeProviders = this.#providers = providers;
207
+ this.#logging = loggingOptions ?? {};
208
+ this.#fallbackOptions = fallbackOptions ?? {};
209
+ // Add IDs to the providers if they don't have them.
210
+ this.#providers.forEach((provider, i) => {
211
+ if (!provider.id) {
212
+ provider.id = `${i}`;
213
+ }
214
+ });
215
+ this.#hasCapabilityConfig = this.#providers.some((provider) => provider.supportedMethods !== undefined || provider.unsupportedMethods !== undefined);
216
+ this._start();
217
+ }
218
+ activeProvidersCount() {
219
+ return this.#activeProviders.length;
220
+ }
221
+ activeProviderIds() {
222
+ return this.#activeProviders.map((p) => p.id);
223
+ }
224
+ isHalted() {
225
+ return this.#halted;
226
+ }
227
+ /** Runs the liveliness check on demand (also runs automatically when polling is enabled). */
228
+ async refreshLiveliness() {
229
+ await this._livelinessCheck();
230
+ }
231
+ _validateFallbackOptions(options) {
232
+ if (!options) {
233
+ // No options provided. Using the default options.
234
+ return;
235
+ }
236
+ if (options.allowableBlockLag !== undefined && options.allowableBlockLag < 0) {
237
+ throw new Error(FallbackProviderError.INVALID_FALLBACK_OPTIONS);
238
+ }
239
+ if (options.haltDetectionTime !== undefined && options.haltDetectionTime < 0) {
240
+ throw new Error(FallbackProviderError.INVALID_FALLBACK_OPTIONS);
241
+ }
242
+ if (options.livelinessPollingInterval !== undefined && options.livelinessPollingInterval < 0) {
243
+ throw new Error(FallbackProviderError.INVALID_FALLBACK_OPTIONS);
244
+ }
245
+ if (options.getBlockDiscoveryTime && !options.setBlockDiscoveryTime) {
246
+ throw new Error(FallbackProviderError.BLOCK_NUMBER_STORAGE_CONFIG_ERROR);
247
+ }
248
+ if (!options.getBlockDiscoveryTime && options.setBlockDiscoveryTime) {
249
+ throw new Error(FallbackProviderError.BLOCK_NUMBER_STORAGE_CONFIG_ERROR);
250
+ }
251
+ }
252
+ async sendWithProvider(providers, providerIndex, method, params, promises = new Array(), retries = 0, useFallback = true) {
253
+ if (promises.length > 0) {
254
+ // Check if any of the past promises have successfully resolved. If so, return the first one.
255
+ const resolvedValue = await checkAnyResolved(promises);
256
+ if (resolvedValue != null) {
257
+ return resolvedValue;
258
+ }
259
+ }
260
+ const { provider, retries: maxRetries, timeout, retryDelay, id } = providers[providerIndex];
261
+ const nextProviderId = providerIndex < providers.length - 1 ? providers[providerIndex + 1].id : null;
262
+ try {
263
+ if (isWebSocketProvider(provider)) {
264
+ // Provider is a WebSocketProvider. Let's perform some additional checks.
265
+ const readyState = provider.websocket.readyState;
266
+ if (readyState >= 2) {
267
+ // Closing or closed. Immediately fallback if possible.
268
+ this.#logging?.warn?.(`[FallbackProvider] Provider ${id} websocket closed`);
269
+ if (providerIndex >= providers.length - 1) {
270
+ throw new Error(`[FallbackProvider] Provider ${id} websocket closed with no fallback available`);
271
+ }
272
+ // We have another provider to fallback to.
273
+ return this.sendWithProvider(providers, providerIndex + 1, method, params, promises);
274
+ }
275
+ if (readyState !== 1) {
276
+ // Websocket still connecting. Fallback if possible.
277
+ if (providerIndex < providers.length - 1) {
278
+ this.#logging?.warn?.(`[FallbackProvider] Provider ${id} websocket not ready. Fallbacking to provider ${nextProviderId}`);
279
+ try {
280
+ return await this.sendWithProvider(providers, providerIndex + 1, method, params, promises);
281
+ }
282
+ catch (e2) {
283
+ this.#logging?.warn?.(`[FallbackProvider] Fallback failed: ${e2.message}`, {
284
+ error: e2,
285
+ });
286
+ }
287
+ }
288
+ // If we're here, we failed to fallback and we know the websocket is not closed. Let's try sending the request
289
+ // to it below.
290
+ // We already tried to fallback, let's not do it again.
291
+ useFallback = false;
292
+ }
293
+ }
294
+ const providerPromise = provider.send(method, params).catch((e) => {
295
+ if (isAlreadyKnownError(e)) {
296
+ let txHash;
297
+ if (method === 'eth_sendRawTransaction' && Array.isArray(params) && typeof params[0] === 'string') {
298
+ try {
299
+ txHash = keccak256(params[0]); // raw tx hash
300
+ }
301
+ catch (hashErr) {
302
+ this.#logging?.warn?.('[FallbackProvider] Failed to compute tx hash from raw tx', {
303
+ rawTx: params[0],
304
+ error: hashErr,
305
+ });
306
+ }
307
+ }
308
+ if (txHash) {
309
+ const broadcastToAll = this.#fallbackOptions.broadcastToAll ?? DEFAULT_FALLBACK_OPTIONS.broadcastToAll;
310
+ if (!broadcastToAll)
311
+ // Only log if we're not broadcasting to all providers. If we are, we expect this to happen commonly.
312
+ this.#logging?.warn?.(`[FallbackProvider] Transaction already known, returning tx hash: ${txHash}`, {
313
+ transactionHash: txHash,
314
+ });
315
+ // Simulate successful eth_sendRawTransaction call
316
+ return txHash;
317
+ }
318
+ }
319
+ throw e;
320
+ });
321
+ // Add the promise to the list of promises.
322
+ promises.push(providerPromise);
323
+ return await withTimeout(providerPromise, timeout ?? DEFAULT_TIMEOUT);
324
+ }
325
+ catch (e) {
326
+ // Check if any of the past promises have successfully resolved. If so, return the first one.
327
+ // It can be the case that a prior promise resolved after the current promise failed, such as when a transaction
328
+ // is mined, then this call fails to send a transaction because the nonce has already been used.
329
+ // This check reduces the likeliness of that happening.
330
+ const resolvedValue = await checkAnyResolved(promises);
331
+ if (resolvedValue != null) {
332
+ return resolvedValue;
333
+ }
334
+ if (this.#fallbackOptions.throwOnFirstBlockchainError ?? DEFAULT_FALLBACK_OPTIONS.throwOnFirstBlockchainError) {
335
+ if (promises.length === 1) {
336
+ // If we only have one promise, we can check and throw the error immediately.
337
+ if (isBlockchainError(e)) {
338
+ throw e;
339
+ }
340
+ }
341
+ else {
342
+ const allRejected = await checkAllRejected(promises);
343
+ if (allRejected) {
344
+ for (const rejected of allRejected) {
345
+ if (isBlockchainError(rejected)) {
346
+ throw rejected;
347
+ }
348
+ }
349
+ }
350
+ }
351
+ }
352
+ if (retries < (maxRetries ?? DEFAULT_RETRIES)) {
353
+ // Wait for a random time before retrying.
354
+ const delay = Math.ceil(Math.random() * (retryDelay ?? RETRY_DELAY));
355
+ if (delay > 0) {
356
+ this.#logging?.debug?.(`[FallbackProvider] Call to \`${method}\` failing with provider ${id}, retrying in ${delay}ms (${retries + 1}/${maxRetries}): ${e.message}`, {
357
+ error: e,
358
+ });
359
+ await wait(delay);
360
+ }
361
+ return this.sendWithProvider(providers, providerIndex, method, params, promises, retries + 1, useFallback);
362
+ }
363
+ if (providerIndex >= providers.length - 1 || !useFallback) {
364
+ // No more retries or provides left to try. We've already checked pending promises so we can throw the error.
365
+ throw e;
366
+ }
367
+ this.#logging?.warn?.(`[FallbackProvider] Call to \`${method}\` failing with provider ${id}, retrying with provider ${nextProviderId}: ${e.message}`, {
368
+ error: e,
369
+ });
370
+ return this.sendWithProvider(providers, providerIndex + 1, method, params, promises);
371
+ }
372
+ }
373
+ async send(method, params) {
374
+ if (this.#destroyed) {
375
+ throw new Error(FallbackProviderError.DESTROYED);
376
+ }
377
+ if (this.#halted) {
378
+ throw new Error(FallbackProviderError.HALTED);
379
+ }
380
+ let providersToUse = this.#activeProviders;
381
+ if (providersToUse.length === 0) {
382
+ throw new Error(FallbackProviderError.ALL_PROVIDERS_UNAVAILABLE);
383
+ }
384
+ if (this.#hasCapabilityConfig) {
385
+ const capableProviders = filterProvidersByMethod(providersToUse, method);
386
+ if (capableProviders.length === 0) {
387
+ this.#logging?.warn?.(`[FallbackProvider] No provider supports the \`${method}\` method: ${providersToUse
388
+ .map((p) => p.id)
389
+ .join(', ')}`);
390
+ const error = new Error(FallbackProviderError.ALL_PROVIDERS_UNAVAILABLE);
391
+ error.providerIds = providersToUse.map((p) => p.id);
392
+ error.unsupportedMethod = method;
393
+ throw error;
394
+ }
395
+ else if (capableProviders.length !== providersToUse.length) {
396
+ this.#logging?.debug?.(`[FallbackProvider] Skipping providers that do not support the \`${method}\` method: ${providersToUse
397
+ .filter((p) => !capableProviders.includes(p))
398
+ .map((p) => p.id)
399
+ .join(', ')}`);
400
+ }
401
+ providersToUse = capableProviders;
402
+ }
403
+ if (method === 'eth_chainId') {
404
+ return (await filterValidProviders(providersToUse)).network.chainId;
405
+ }
406
+ else if (method === 'eth_sendRawTransaction') {
407
+ // Check if we should only broadcast to MEV-protected providers.
408
+ const broadcastOnlyToMevProtected = this.#fallbackOptions.broadcastOnlyToMevProtected ?? DEFAULT_FALLBACK_OPTIONS.broadcastOnlyToMevProtected;
409
+ if (broadcastOnlyToMevProtected) {
410
+ // Filter out the MEV-protected providers.
411
+ providersToUse = providersToUse.filter((provider) => provider.isMevProtected);
412
+ if (providersToUse.length === 0) {
413
+ throw new Error(FallbackProviderError.ALL_PROVIDERS_UNAVAILABLE);
414
+ }
415
+ }
416
+ // Check if we should broadcast to all providers.
417
+ const broadcastToAll = this.#fallbackOptions.broadcastToAll ?? DEFAULT_FALLBACK_OPTIONS.broadcastToAll;
418
+ if (broadcastToAll) {
419
+ // Broadcast to all providers.
420
+ const providerPromises = new Array();
421
+ const delay = this.#fallbackOptions.broadcastToAllConfig?.delay ??
422
+ DEFAULT_FALLBACK_BROADCAST_CONFIG.delay;
423
+ const delayJitter = this.#fallbackOptions.broadcastToAllConfig?.delayJitter ??
424
+ DEFAULT_FALLBACK_BROADCAST_CONFIG.delayJitter;
425
+ const promises = providersToUse.map((provider, index) => (index > 0 && delay > 0
426
+ ? wait(delay + Math.round(Math.random() * delayJitter))
427
+ : Promise.resolve()).then(() => this.sendWithProvider([provider], 0, method, params, providerPromises).catch((e) => {
428
+ // Attach the list of provider IDs to the error.
429
+ e.providerIds = providersToUse.map((p) => p.id);
430
+ throw e;
431
+ })));
432
+ try {
433
+ // Wait for the first result.
434
+ const result = await Promise.any(promises);
435
+ return result;
436
+ }
437
+ catch (error) {
438
+ // If all promises throw errors, it should throw the first error.
439
+ throw error.errors[0];
440
+ }
441
+ }
442
+ }
443
+ return this.sendWithProvider(providersToUse, 0, method, params).catch((e) => {
444
+ // Attach the list of provider IDs to the error.
445
+ e.providerIds = providersToUse.map((p) => p.id);
446
+ throw e;
447
+ });
448
+ }
449
+ async _send(payload) {
450
+ throw new Error('Method not implemented.');
451
+ }
452
+ async _detectNetwork() {
453
+ for (const { provider } of this.#providers) {
454
+ try {
455
+ return await provider.getNetwork();
456
+ }
457
+ catch {
458
+ // try the next provider
459
+ }
460
+ }
461
+ throw new Error(FallbackProviderError.CANNOT_DETECT_NETWORKS);
462
+ }
463
+ /**
464
+ * Gets the time at which a block was first discovered.
465
+ */
466
+ async _getBlockDiscoveryTime(blockNumber) {
467
+ if (this.#fallbackOptions.getBlockDiscoveryTime) {
468
+ return this.#fallbackOptions.getBlockDiscoveryTime(blockNumber);
469
+ }
470
+ const latest = this.#latestBlockDiscovery;
471
+ if (latest.blockNumber === null) {
472
+ return null;
473
+ }
474
+ if (blockNumber <= latest.blockNumber) {
475
+ return latest.time;
476
+ }
477
+ return null;
478
+ }
479
+ /**
480
+ * Sets the time at which a block was first discovered.
481
+ */
482
+ async _setBlockDiscoveryTime(blockNumber, currentTime) {
483
+ if (this.#fallbackOptions.setBlockDiscoveryTime) {
484
+ return this.#fallbackOptions.setBlockDiscoveryTime(blockNumber, currentTime);
485
+ }
486
+ const latest = this.#latestBlockDiscovery;
487
+ if (currentTime === null) {
488
+ this.#latestBlockDiscovery = {
489
+ blockNumber: null,
490
+ time: 0,
491
+ };
492
+ return;
493
+ }
494
+ if (latest.blockNumber !== null) {
495
+ // We have a latest block to check against.
496
+ if (blockNumber <= latest.blockNumber) {
497
+ // We don't update the discovery time if the block is not new.
498
+ return;
499
+ }
500
+ }
501
+ this.#latestBlockDiscovery = {
502
+ blockNumber: blockNumber,
503
+ time: currentTime,
504
+ };
505
+ }
506
+ async _livelinessCheck() {
507
+ const providersToCheck = this.#providers;
508
+ const lastActiveProviders = this.#activeProviders;
509
+ const activeProviderIds = lastActiveProviders.map((p) => p.id);
510
+ let goodProviders = [];
511
+ try {
512
+ // Get the block numbers and the median.
513
+ const { blockNumbers, median } = await getBlockNumbersAndMedian(providersToCheck, this.#logging);
514
+ // Get the current time, in UNIX epoch time.
515
+ const currentTime = Math.floor(Date.now() / 1000);
516
+ // Filter the providers that are not too far behind the median.
517
+ const allowableBlockLag = this.#fallbackOptions.allowableBlockLag ?? DEFAULT_FALLBACK_OPTIONS.allowableBlockLag;
518
+ const minBlockNumber = median - allowableBlockLag;
519
+ for (let i = 0; i < blockNumbers.length; i++) {
520
+ const blockNumberCall = blockNumbers[i];
521
+ if (blockNumberCall === null) {
522
+ continue;
523
+ }
524
+ if (!blockNumberCall.fromCache) {
525
+ try {
526
+ await providersToCheck[i].setStoredBlockNumber?.(blockNumberCall.blockNumber);
527
+ }
528
+ catch (e) {
529
+ this.#logging?.warn?.(`[FallbackProvider] Error setting stored block number: ${e.message}`, {
530
+ error: e,
531
+ });
532
+ }
533
+ }
534
+ if (blockNumberCall.blockNumber >= minBlockNumber) {
535
+ goodProviders.push(providersToCheck[i]);
536
+ }
537
+ }
538
+ let providerListChanged = false;
539
+ // Log added providers
540
+ const addedProviders = goodProviders.filter((p) => !activeProviderIds.includes(p.id));
541
+ addedProviders.forEach((p) => {
542
+ providerListChanged = true;
543
+ this.#logging?.info?.(`[FallbackProvider] Provider ${p.id} is now active`);
544
+ });
545
+ // Log removed providers
546
+ const removedProviders = lastActiveProviders.filter((p) => !goodProviders.includes(p));
547
+ removedProviders.forEach((p) => {
548
+ providerListChanged = true;
549
+ this.#logging?.info?.(`[FallbackProvider] Provider ${p.id} is now inactive`);
550
+ });
551
+ if (providerListChanged) {
552
+ this.#logging?.notice?.(`[FallbackProvider] Active providers is now: ${goodProviders.map((p) => p.id).join(', ')}`);
553
+ }
554
+ this.#activeProviders = goodProviders;
555
+ // We've filtered the providers by allowable block lag. Now let's check if the chain has halted.
556
+ const blockDiscoveryTime = await this._getBlockDiscoveryTime(median);
557
+ if (blockDiscoveryTime === null) {
558
+ // The block is new. We'll set the block discovery time.
559
+ await this._setBlockDiscoveryTime(median, currentTime);
560
+ this.#halted = false;
561
+ }
562
+ else {
563
+ // The block is not new. Let's check if the chain has halted.
564
+ const haltDetectionTime = this.#fallbackOptions.haltDetectionTime ?? DEFAULT_FALLBACK_OPTIONS.haltDetectionTime;
565
+ if (haltDetectionTime > 0) {
566
+ if (currentTime - blockDiscoveryTime > haltDetectionTime) {
567
+ // The chain has halted.
568
+ this.#halted = true;
569
+ }
570
+ else {
571
+ this.#halted = false;
572
+ }
573
+ }
574
+ else {
575
+ // Halt detection is disabled.
576
+ this.#halted = false;
577
+ }
578
+ }
579
+ }
580
+ catch (e) {
581
+ this.#logging?.error?.(`[FallbackProvider] Liveliness check failed: ${e.message}`, {
582
+ error: e,
583
+ });
584
+ if (e.message === FallbackProviderError.ALL_PROVIDERS_UNAVAILABLE) {
585
+ this.#activeProviders = [];
586
+ }
587
+ }
588
+ }
589
+ _start() {
590
+ if (this.#destroyed) {
591
+ throw new Error(FallbackProviderError.DESTROYED);
592
+ }
593
+ if (!this.#active) {
594
+ this.#active = true;
595
+ const pollingInterval = this.#fallbackOptions.livelinessPollingInterval ?? DEFAULT_FALLBACK_OPTIONS.livelinessPollingInterval;
596
+ if (pollingInterval > 0) {
597
+ // Liveliness checks are enabled. Start the interval.
598
+ const intervalId = setInterval(async () => {
599
+ if (!this.#active) {
600
+ clearInterval(intervalId); // Stop the interval if #active is false
601
+ return;
602
+ }
603
+ await this._livelinessCheck(); // Call the async function
604
+ }, pollingInterval);
605
+ }
606
+ }
607
+ super._start();
608
+ }
609
+ destroy() {
610
+ this.#destroyed = true;
611
+ this.#active = false;
612
+ super.destroy();
613
+ // Try and destroy all providers.
614
+ this.#providers.forEach(({ provider }) => {
615
+ try {
616
+ provider.destroy();
617
+ }
618
+ catch (e) {
619
+ this.#logging?.error?.(`[FallbackProvider] Error destroying provider: ${e.message}`, {
620
+ error: e,
621
+ });
622
+ }
623
+ });
624
+ }
625
+ }
626
+ function isWebSocketProvider(provider) {
627
+ return !!provider.websocket;
628
+ }
629
+ //# sourceMappingURL=fallback-full.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback-full.js","sourceRoot":"","sources":["../../src/provider/fallback-full.ts"],"names":[],"mappings":"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"}