diff --git a/.changeset/good-melons-attack.md b/.changeset/good-melons-attack.md new file mode 100644 index 0000000000..7081b907de --- /dev/null +++ b/.changeset/good-melons-attack.md @@ -0,0 +1,5 @@ +--- +"viem": minor +--- + +Added `blockTime` to OP Stack (2s) & ZKsync (1s) chains. diff --git a/.changeset/wild-flowers-rush.md b/.changeset/wild-flowers-rush.md new file mode 100644 index 0000000000..0b1d4e8b98 --- /dev/null +++ b/.changeset/wild-flowers-rush.md @@ -0,0 +1,5 @@ +--- +"viem": minor +--- + +Added `blockTime` to the `Chain` type. Polling intervals are now influenced from this property (if set). diff --git a/src/celo/chainConfig.ts b/src/celo/chainConfig.ts index 7ab857367a..1ffb46d758 100644 --- a/src/celo/chainConfig.ts +++ b/src/celo/chainConfig.ts @@ -4,6 +4,7 @@ import { formatters } from './formatters.js' import { serializers } from './serializers.js' export const chainConfig = { + blockTime: 2_000, contracts, formatters, serializers, diff --git a/src/clients/createClient.test.ts b/src/clients/createClient.test.ts index 36ce354ab9..b5487f34d7 100644 --- a/src/clients/createClient.test.ts +++ b/src/clients/createClient.test.ts @@ -1,7 +1,7 @@ import { assertType, describe, expect, test, vi } from 'vitest' import { anvilMainnet } from '../../test/src/anvil.js' -import { localhost, mainnet } from '../chains/index.js' +import { base, localhost, mainnet } from '../chains/index.js' import type { EIP1193RequestFn, EIP1474Methods } from '../types/eip1193.js' import { getAction } from '../utils/getAction.js' import { type Client, createClient } from './createClient.js' @@ -455,6 +455,16 @@ describe('config', () => { }) }) +test('behavior: cacheTime, pollingInterval based on chain.blockTime', () => { + const client = createClient({ + chain: base, + transport: http(), + }) + + expect(client.cacheTime).toEqual(Math.floor(base.blockTime / 3)) + expect(client.pollingInterval).toEqual(Math.floor(base.blockTime / 3)) +}) + describe('extends', () => { test('default', async () => { const client = createClient({ diff --git a/src/clients/createClient.ts b/src/clients/createClient.ts index cff5be076a..e0280a3f8c 100644 --- a/src/clients/createClient.ts +++ b/src/clients/createClient.ts @@ -43,7 +43,7 @@ export type ClientConfig< | undefined /** * Time (in ms) that cached data will remain in memory. - * @default 4_000 + * @default chain.blockTime / 3 */ cacheTime?: number | undefined /** @@ -70,7 +70,7 @@ export type ClientConfig< name?: string | undefined /** * Frequency (in ms) for polling enabled actions & events. - * @default 4_000 + * @default chain.blockTime / 3 */ pollingInterval?: number | undefined /** @@ -216,15 +216,18 @@ export function createClient< export function createClient(parameters: ClientConfig): Client { const { batch, - cacheTime = parameters.pollingInterval ?? 4_000, + chain, ccipRead, key = 'base', name = 'Base Client', - pollingInterval = 4_000, type = 'base', } = parameters - const chain = parameters.chain + const blockTime = chain?.blockTime ?? 12_000 + const pollingInterval = + parameters.pollingInterval ?? Math.floor(blockTime / 3) + const cacheTime = parameters.cacheTime ?? pollingInterval + const account = parameters.account ? parseAccount(parameters.account) : undefined diff --git a/src/op-stack/chainConfig.ts b/src/op-stack/chainConfig.ts index 44e19e46d4..1a45a826f7 100644 --- a/src/op-stack/chainConfig.ts +++ b/src/op-stack/chainConfig.ts @@ -3,6 +3,7 @@ import { formatters } from './formatters.js' import { serializers } from './serializers.js' export const chainConfig = { + blockTime: 2_000, contracts, formatters, serializers, diff --git a/src/types/chain.ts b/src/types/chain.ts index f3b57daaec..4cd9bf72f9 100644 --- a/src/types/chain.ts +++ b/src/types/chain.ts @@ -28,6 +28,8 @@ export type Chain< default: ChainBlockExplorer } | undefined + /** Block time in milliseconds. */ + blockTime?: number | undefined /** Collection of contracts */ contracts?: | Prettify< diff --git a/src/utils/chain/extractChain.test.ts b/src/utils/chain/extractChain.test.ts index e69b5a8232..8cf208efb2 100644 --- a/src/utils/chain/extractChain.test.ts +++ b/src/utils/chain/extractChain.test.ts @@ -65,6 +65,7 @@ test('default', async () => { "url": "https://optimistic.etherscan.io", }, }, + "blockTime": 2000, "contracts": { "disputeGameFactory": { "1": { diff --git a/src/zksync/chainConfig.ts b/src/zksync/chainConfig.ts index 1e46b0163a..089013988f 100644 --- a/src/zksync/chainConfig.ts +++ b/src/zksync/chainConfig.ts @@ -3,6 +3,7 @@ import { serializers } from './serializers.js' import { getEip712Domain } from './utils/getEip712Domain.js' export const chainConfig = { + blockTime: 1_000, formatters, serializers, custom: {