diff --git a/apps/ensapi/src/di.ts b/apps/ensapi/src/di.ts index 549af9500..b7e1fac60 100644 --- a/apps/ensapi/src/di.ts +++ b/apps/ensapi/src/di.ts @@ -1,5 +1,5 @@ import type { ChainId } from "enssdk"; -import { createPublicClient, fallback, http, type PublicClient } from "viem"; +import type { PublicClient } from "viem"; import { type ENSNamespaceId, getENSRootChainId } from "@ensnode/datasources"; import { type EnsDbConfig, EnsDbReader } from "@ensnode/ensdb-sdk"; @@ -18,6 +18,7 @@ import { buildConfigFromEnvironment, buildRootChainRpcConfig } from "@/config/co import { buildEnsDbConfigFromEnvironment } from "@/config/ensdb-config"; import type { EnsApiEnvironment } from "@/config/environment"; import { makeLogger } from "@/lib/logger"; +import { buildRootChainPublicClient } from "@/lib/public-client"; const logger = makeLogger("di"); @@ -152,12 +153,10 @@ export function buildEnsApiDiContext(ensApiEnvironment: EnsApiEnvironment): EnsA get rootChainPublicClient(): PublicClient { if (instances.rootChainPublicClient === undefined) { - // Create an viem#PublicClient that uses a fallback() transport with all specified HTTP RPCs - instances.rootChainPublicClient = createPublicClient({ - transport: fallback( - context.rootChainRpcConfig.httpRPCs.map((url) => http(url.toString())), - ), - }); + instances.rootChainPublicClient = buildRootChainPublicClient( + context.rootChainRpcConfig, + context.namespace, + ); } return instances.rootChainPublicClient; diff --git a/apps/ensapi/src/lib/public-client.ts b/apps/ensapi/src/lib/public-client.ts new file mode 100644 index 000000000..083068520 --- /dev/null +++ b/apps/ensapi/src/lib/public-client.ts @@ -0,0 +1,23 @@ +import { createPublicClient, fallback, http, type PublicClient } from "viem"; + +import { type ENSNamespaceId, getENSRootChain } from "@ensnode/datasources"; +import type { RpcConfig } from "@ensnode/ensnode-sdk/internal"; + +/** + * Builds a viem {@link PublicClient} for the ENS root chain with a fallback transport over all HTTP RPCs. + */ +export function buildRootChainPublicClient( + rootChainRpcConfig: RpcConfig, + namespace: ENSNamespaceId, +): PublicClient { + return createPublicClient({ + chain: getENSRootChain(namespace), + batch: { + multicall: { + // bytes per batch; default is 1024 + batchSize: 2048, + }, + }, + transport: fallback(rootChainRpcConfig.httpRPCs.map((url) => http(url.toString()))), + }); +}