From 10c25830fa9a98676f28d3241ad6ad90119f42cc Mon Sep 17 00:00:00 2001 From: sevenzing Date: Thu, 4 Jun 2026 12:30:34 +0300 Subject: [PATCH 1/3] add multicall batching --- apps/ensapi/src/di.ts | 13 ++++++------- apps/ensapi/src/lib/public-client.ts | 22 ++++++++++++++++++++++ 2 files changed, 28 insertions(+), 7 deletions(-) create mode 100644 apps/ensapi/src/lib/public-client.ts diff --git a/apps/ensapi/src/di.ts b/apps/ensapi/src/di.ts index 549af9500..10614dd2e 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 { buildPublicClient } 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 = buildPublicClient( + 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..4c8b8d133 --- /dev/null +++ b/apps/ensapi/src/lib/public-client.ts @@ -0,0 +1,22 @@ +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 buildPublicClient( + rootChainRpcConfig: RpcConfig, + namespace: ENSNamespaceId, +): PublicClient { + return createPublicClient({ + chain: getENSRootChain(namespace), + batch: { + multicall: { + batchSize: 2048, + }, + }, + transport: fallback(rootChainRpcConfig.httpRPCs.map((url) => http(url.toString()))), + }); +} From f0520eebbbce48cc6c1b58a64a592b33244acb73 Mon Sep 17 00:00:00 2001 From: sevenzing Date: Thu, 4 Jun 2026 12:40:15 +0300 Subject: [PATCH 2/3] add comment --- apps/ensapi/src/lib/public-client.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/ensapi/src/lib/public-client.ts b/apps/ensapi/src/lib/public-client.ts index 4c8b8d133..eb832691d 100644 --- a/apps/ensapi/src/lib/public-client.ts +++ b/apps/ensapi/src/lib/public-client.ts @@ -14,6 +14,7 @@ export function buildPublicClient( chain: getENSRootChain(namespace), batch: { multicall: { + // bytes per batch; default is 1024 batchSize: 2048, }, }, From eb822133b70a0cf6f8d10f2ac757aa9d1c7adb12 Mon Sep 17 00:00:00 2001 From: sevenzing Date: Fri, 5 Jun 2026 15:25:13 +0300 Subject: [PATCH 3/3] rename build function --- apps/ensapi/src/di.ts | 4 ++-- apps/ensapi/src/lib/public-client.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/ensapi/src/di.ts b/apps/ensapi/src/di.ts index 10614dd2e..b7e1fac60 100644 --- a/apps/ensapi/src/di.ts +++ b/apps/ensapi/src/di.ts @@ -18,7 +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 { buildPublicClient } from "@/lib/public-client"; +import { buildRootChainPublicClient } from "@/lib/public-client"; const logger = makeLogger("di"); @@ -153,7 +153,7 @@ export function buildEnsApiDiContext(ensApiEnvironment: EnsApiEnvironment): EnsA get rootChainPublicClient(): PublicClient { if (instances.rootChainPublicClient === undefined) { - instances.rootChainPublicClient = buildPublicClient( + instances.rootChainPublicClient = buildRootChainPublicClient( context.rootChainRpcConfig, context.namespace, ); diff --git a/apps/ensapi/src/lib/public-client.ts b/apps/ensapi/src/lib/public-client.ts index eb832691d..083068520 100644 --- a/apps/ensapi/src/lib/public-client.ts +++ b/apps/ensapi/src/lib/public-client.ts @@ -6,7 +6,7 @@ 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 buildPublicClient( +export function buildRootChainPublicClient( rootChainRpcConfig: RpcConfig, namespace: ENSNamespaceId, ): PublicClient {