diff --git a/.changeset/weak-waves-matter.md b/.changeset/weak-waves-matter.md new file mode 100644 index 0000000000..d231ea20f4 --- /dev/null +++ b/.changeset/weak-waves-matter.md @@ -0,0 +1,5 @@ +--- +"viem": patch +--- + +Disabled `fallback` transport ranking by default. diff --git a/site/docs/clients/transports/fallback.md b/site/docs/clients/transports/fallback.md index bc22edfe28..302a5765c2 100644 --- a/site/docs/clients/transports/fallback.md +++ b/site/docs/clients/transports/fallback.md @@ -43,13 +43,25 @@ const client = createPublicClient({ ### Transport Ranking -By default, each of the Transports passed to the `fallback` Transport are automatically ranked based on their **latency** & **stability** via a weighted moving score algorithm. +Transport Ranking enables each of the Transports passed to the `fallback` Transport are automatically ranked based on their **latency** & **stability** via a weighted moving score algorithm. Every 10 seconds (`interval`), the `fallback` Transport will ping each transport in the list. For the past 10 pings (`sampleCount`), they will be ranked based on if they responded (stability) and how fast they responded (latency). The algorithm applies a weight of `0.7` to the stability score, and a weight of `0.3` to the latency score to derive the final score which it is ranked on. The Transport that has the best latency & stability score over the sample period is prioritized first. -You can modify the default rank config using the `rank` parameter: +You can turn on automated ranking with the `rank` option: + +```ts +const client = createPublicClient({ + chain: mainnet, + transport: fallback( + [alchemy, infura], + { rank: true } // [!code focus] + ), +}) +``` + +You can also modify the default rank config: ```ts const client = createPublicClient({ @@ -71,18 +83,6 @@ const client = createPublicClient({ }) ``` -Or you can turn it off automated ranking by passing `false` to `rank`: - -```ts -const client = createPublicClient({ - chain: mainnet, - transport: fallback( - [alchemy, infura], - { rank: false } // [!code focus] - ), -}) -``` - ## Parameters ### rank (optional) diff --git a/src/actions/public/createBlockFilter.test.ts b/src/actions/public/createBlockFilter.test.ts index 15c56864f9..c9497cbd7f 100644 --- a/src/actions/public/createBlockFilter.test.ts +++ b/src/actions/public/createBlockFilter.test.ts @@ -33,9 +33,7 @@ test('fallback client: scopes request', async () => { }) const fallbackClient = createPublicClient({ - transport: fallback([http(server1.url), http(server2.url)], { - rank: false, - }), + transport: fallback([http(server1.url), http(server2.url)]), }) const filter = await createBlockFilter(fallbackClient) expect(filter).toBeDefined() diff --git a/src/actions/public/createContractEventFilter.test.ts b/src/actions/public/createContractEventFilter.test.ts index a2903e652b..2580d83075 100644 --- a/src/actions/public/createContractEventFilter.test.ts +++ b/src/actions/public/createContractEventFilter.test.ts @@ -156,9 +156,7 @@ test('fallback client: scopes request', async () => { }) const fallbackClient = createPublicClient({ - transport: fallback([http(server1.url), http(server2.url)], { - rank: false, - }), + transport: fallback([http(server1.url), http(server2.url)]), }) const filter = await createContractEventFilter(fallbackClient, { abi: usdcContractConfig.abi, diff --git a/src/actions/public/createEventFilter.test.ts b/src/actions/public/createEventFilter.test.ts index cfa59d344e..3d317f6df6 100644 --- a/src/actions/public/createEventFilter.test.ts +++ b/src/actions/public/createEventFilter.test.ts @@ -259,9 +259,7 @@ test('fallback client: scopes request', async () => { }) const fallbackClient = createPublicClient({ - transport: fallback([http(server1.url), http(server2.url)], { - rank: false, - }), + transport: fallback([http(server1.url), http(server2.url)]), }) const filter = await createEventFilter(fallbackClient) expect(filter).toBeDefined() diff --git a/src/actions/public/createPendingTransactionFilter.test.ts b/src/actions/public/createPendingTransactionFilter.test.ts index 9d547cab8f..3b791d8e7b 100644 --- a/src/actions/public/createPendingTransactionFilter.test.ts +++ b/src/actions/public/createPendingTransactionFilter.test.ts @@ -33,9 +33,7 @@ test('fallback client: scopes request', async () => { }) const fallbackClient = createPublicClient({ - transport: fallback([http(server1.url), http(server2.url)], { - rank: false, - }), + transport: fallback([http(server1.url), http(server2.url)]), }) const filter = await createPendingTransactionFilter(fallbackClient) expect(filter).toBeDefined() diff --git a/src/clients/transports/fallback.test.ts b/src/clients/transports/fallback.test.ts index ce2845d4a0..741c5bbb43 100644 --- a/src/clients/transports/fallback.test.ts +++ b/src/clients/transports/fallback.test.ts @@ -105,9 +105,7 @@ describe('request', () => { res.end(JSON.stringify({ result: '0x1' })) }) - let transport = fallback([http(server1.url), http(server3.url)], { - rank: false, - })({ + let transport = fallback([http(server1.url), http(server3.url)])({ chain: localhost, }) expect(await transport.request({ method: 'eth_blockNumber' })).toBe('0x1') @@ -116,12 +114,11 @@ describe('request', () => { expect(count).toBe(2) count = 0 - transport = fallback( - [http(server1.url), http(server2.url), http(server3.url)], - { - rank: false, - }, - )({ + transport = fallback([ + http(server1.url), + http(server2.url), + http(server3.url), + ])({ chain: localhost, }) expect(await transport.request({ method: 'eth_blockNumber' })).toBe('0x1') @@ -130,9 +127,7 @@ describe('request', () => { expect(count).toBe(3) count = 0 - transport = fallback([http(server1.url), http(server2.url)], { - rank: false, - })({ + transport = fallback([http(server1.url), http(server2.url)])({ chain: localhost, }) await expect(() => @@ -159,12 +154,11 @@ describe('request', () => { res.end(JSON.stringify({ result: '0x1' })) }) - const transport = fallback( - [http(server1.url), http(server2.url), http(server3.url)], - { - rank: false, - }, - )({ + const transport = fallback([ + http(server1.url), + http(server2.url), + http(server3.url), + ])({ chain: localhost, }) @@ -234,12 +228,11 @@ describe('request', () => { res.end(JSON.stringify({ result: '0x1' })) }) - const transport = fallback( - [http(server1.url), http(server2.url), http(server3.url)], - { - rank: false, - }, - )({ + const transport = fallback([ + http(server1.url), + http(server2.url), + http(server3.url), + ])({ chain: localhost, }) await expect(() => @@ -266,9 +259,7 @@ describe('request', () => { res.end(JSON.stringify({ result: '0x1' })) }) - const transport = fallback([http(server1.url), http(server2.url)], { - rank: false, - })({ + const transport = fallback([http(server1.url), http(server2.url)])({ chain: localhost, }) expect( @@ -291,9 +282,7 @@ describe('request', () => { res.end() }) - const transport = fallback([http(server1.url), http(server2.url)], { - rank: false, - })({ + const transport = fallback([http(server1.url), http(server2.url)])({ chain: localhost, }) await expect(() => @@ -321,9 +310,7 @@ describe('request', () => { res.end(JSON.stringify({ error: { code: -32603, message: 'sad times' } })) }) - const transport = fallback([http(server1.url), http(server2.url)], { - rank: false, - })({ + const transport = fallback([http(server1.url), http(server2.url)])({ chain: localhost, }) await expect(() => @@ -348,7 +335,6 @@ describe('request', () => { const transport = fallback([http(server1.url), http(server2.url)], { retryCount: 1, - rank: false, })({ chain: localhost, }) @@ -380,7 +366,6 @@ describe('request', () => { http(server2.url, { retryCount: 2 }), ], { - rank: false, retryCount: 0, }, )({ @@ -534,9 +519,7 @@ describe('client', () => { res.end(JSON.stringify({ result: '0x1' })) }) - const transport = fallback([http(server1.url), http(server2.url)], { - rank: false, - }) + const transport = fallback([http(server1.url), http(server2.url)]) const client = createPublicClient({ chain: localhost, transport }) expect(await getBlockNumber(client)).toBe(1n) @@ -560,9 +543,7 @@ describe('client', () => { res.end(JSON.stringify({ error: { code: -32603, message: 'sad times' } })) }) - const transport = fallback([http(server1.url), http(server2.url)], { - rank: false, - }) + const transport = fallback([http(server1.url), http(server2.url)]) const client = createPublicClient({ chain: localhost, transport }) await expect( diff --git a/src/clients/transports/fallback.ts b/src/clients/transports/fallback.ts index b5b8808a50..3e16f6da8c 100644 --- a/src/clients/transports/fallback.ts +++ b/src/clients/transports/fallback.ts @@ -85,7 +85,7 @@ export function fallback( const { key = 'fallback', name = 'Fallback', - rank = true, + rank = false, retryCount, retryDelay, } = config