From 11ab19ad02eeb4667e048579708de351f2fbaae6 Mon Sep 17 00:00:00 2001 From: jrmeurer Date: Mon, 19 Jun 2023 13:10:51 -0600 Subject: [PATCH] Remove polling rpcs from default fallback config --- src/utils/__tests__/available-rpc.test.ts | 59 +++++++++++++++++++ src/utils/available-rpc.ts | 1 + ...der.ts => configured-json-rpc-provider.ts} | 8 +-- src/utils/fallback-provider.ts | 13 +++- 4 files changed, 71 insertions(+), 10 deletions(-) create mode 100644 src/utils/__tests__/available-rpc.test.ts rename src/utils/{polling-json-rpc-provider.ts => configured-json-rpc-provider.ts} (58%) diff --git a/src/utils/__tests__/available-rpc.test.ts b/src/utils/__tests__/available-rpc.test.ts new file mode 100644 index 0000000..ecaa7b5 --- /dev/null +++ b/src/utils/__tests__/available-rpc.test.ts @@ -0,0 +1,59 @@ +import chai from 'chai'; +import chaiAsPromised from 'chai-as-promised'; +import { + FallbackProviderJsonConfig, + createFallbackProviderFromJsonConfig, +} from '../fallback-provider'; + +chai.use(chaiAsPromised); +const { expect } = chai; + +describe('available-rpc', () => { + it('Should check fallback provider cascade', async () => { + const config: FallbackProviderJsonConfig = { + chainId: 1, + providers: [ + { + provider: + 'https://eth-mainnet.gateway.pokt.network/v1/lb/627a4b6e18e53a003a6b6c26', + priority: 1, + weight: 2, + stallTimeout: 2500, + }, + { + provider: 'https://railwayapi.xyz/rpc/alchemy/eth-mainnet', + priority: 2, + weight: 1, + }, + { provider: 'https://cloudflare-eth.com/', priority: 3, weight: 1 }, + { provider: 'https://rpc.ankr.com/eth', priority: 3, weight: 1 }, + ], + }; + + const fallbackProvider = createFallbackProviderFromJsonConfig(config); + + await fallbackProvider.getBlockNumber(); + }); + + it('Should sort ascending and descending', () => { + const allConfigs = [ + { + priority: 3, + }, + { + priority: 1, + }, + { + priority: 2, + }, + ]; + + // Ascending + allConfigs.sort((a, b) => a.priority - b.priority); + expect(allConfigs.map(c => c.priority)).to.deep.equal([1, 2, 3]); + + // Descending + allConfigs.sort((a, b) => b.priority - a.priority); + expect(allConfigs.map(c => c.priority)).to.deep.equal([3, 2, 1]); + }); +}); diff --git a/src/utils/available-rpc.ts b/src/utils/available-rpc.ts index bc84858..9365b31 100644 --- a/src/utils/available-rpc.ts +++ b/src/utils/available-rpc.ts @@ -1,3 +1,4 @@ +/// import { JsonRpcProvider, Network } from 'ethers'; import { ProviderJson } from './fallback-provider'; import { getUpperBoundMedian } from './median'; diff --git a/src/utils/polling-json-rpc-provider.ts b/src/utils/configured-json-rpc-provider.ts similarity index 58% rename from src/utils/polling-json-rpc-provider.ts rename to src/utils/configured-json-rpc-provider.ts index 6ef593f..2791184 100644 --- a/src/utils/polling-json-rpc-provider.ts +++ b/src/utils/configured-json-rpc-provider.ts @@ -1,19 +1,13 @@ import { JsonRpcProvider, JsonRpcApiProviderOptions, Network } from 'ethers'; -/** - * Uses a setting in JsonRpcProvider to poll for events, - * rather than using sparsely-implemented eth_filter events. - */ -export class PollingJsonRpcProvider extends JsonRpcProvider { +export class ConfiguredJsonRpcProvider extends JsonRpcProvider { constructor(url: string, network: Network, disableBatching = false) { const options: JsonRpcApiProviderOptions = { - polling: true, staticNetwork: network, }; if (disableBatching) { options.batchMaxCount = 1; } super(url, network, options); - this.pollingInterval = 30000; } } diff --git a/src/utils/fallback-provider.ts b/src/utils/fallback-provider.ts index f5e767b..1c725f0 100644 --- a/src/utils/fallback-provider.ts +++ b/src/utils/fallback-provider.ts @@ -1,6 +1,9 @@ import { FallbackProvider, Network, WebSocketProvider } from 'ethers'; -import { PollingJsonRpcProvider } from './polling-json-rpc-provider'; -import { FallbackProviderConfig } from 'ethers/lib.commonjs/providers/provider-fallback'; +import { ConfiguredJsonRpcProvider } from './configured-json-rpc-provider'; +import { + FallbackProviderConfig, + FallbackProviderOptions, +} from 'ethers/lib.commonjs/providers/provider-fallback'; export type FallbackProviderJsonConfig = { chainId: number; @@ -42,7 +45,11 @@ export const createFallbackProviderFromJsonConfig = ( const isWebsocket = providerURL.startsWith('wss'); const provider = isWebsocket ? new WebSocketProvider(providerURL, network) - : new PollingJsonRpcProvider(providerURL, network, disableBatching); + : new ConfiguredJsonRpcProvider( + providerURL, + network, + disableBatching, + ); const fallbackProviderConfig: FallbackProviderConfig = { provider,