From 66618f39e5616d2c09f4dacf4ccbf2eaedfcc5e7 Mon Sep 17 00:00:00 2001 From: Tomasz Kopacki Date: Mon, 11 May 2026 19:23:47 +0200 Subject: [PATCH 1/8] Create indexing status based functions for checking feature availability --- .../src/omnigraph-api/prerequisites.ts | 24 ++++++++++++++++++- .../src/subgraph-api/prerequisites.ts | 22 +++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/packages/ensnode-sdk/src/omnigraph-api/prerequisites.ts b/packages/ensnode-sdk/src/omnigraph-api/prerequisites.ts index 10f466601e..725ef718ff 100644 --- a/packages/ensnode-sdk/src/omnigraph-api/prerequisites.ts +++ b/packages/ensnode-sdk/src/omnigraph-api/prerequisites.ts @@ -1,8 +1,12 @@ import { type EnsIndexerPublicConfig, PluginName } from "../ensindexer/config/types"; +import { + OmnichainIndexingStatusIds, + type OmnichainIndexingStatusSnapshot, +} from "../indexing-status"; import type { PrerequisiteResult } from "../shared/prerequisites"; /** - * Check if provided EnsIndexerPublicConfig supports the ENSNode Omnigraph API. + * Check if provided EnsIndexerPublicConfig supports the Omnigraph API. */ export function hasOmnigraphApiConfigSupport(config: EnsIndexerPublicConfig): PrerequisiteResult { const supported = config.plugins.includes(PluginName.ENSv2); @@ -13,3 +17,21 @@ export function hasOmnigraphApiConfigSupport(config: EnsIndexerPublicConfig): Pr reason: `The connected ENSNode's Config must have the '${PluginName.ENSv2}' plugin enabled.`, }; } + +/** + * Check if provided OmnichainIndexingStatusSnapshot supports the Omnigraph API. + */ +export function hasOmnigraphApiIndexingStatusSupport( + config: OmnichainIndexingStatusSnapshot, +): PrerequisiteResult { + const supported = + config.omnichainStatus === OmnichainIndexingStatusIds.Completed || + config.omnichainStatus === OmnichainIndexingStatusIds.Following; + + if (supported) return { supported }; + + return { + supported: false, + reason: `The connected ENSNode's Omnichain Indexing Status must be "${OmnichainIndexingStatusIds.Completed}" or "${OmnichainIndexingStatusIds.Following}" for the Omnigraph API to be available. Current omnichain indexing status is "${config.omnichainStatus}".`, + }; +} diff --git a/packages/ensnode-sdk/src/subgraph-api/prerequisites.ts b/packages/ensnode-sdk/src/subgraph-api/prerequisites.ts index 63aa22b9c2..23f29acb79 100644 --- a/packages/ensnode-sdk/src/subgraph-api/prerequisites.ts +++ b/packages/ensnode-sdk/src/subgraph-api/prerequisites.ts @@ -1,4 +1,8 @@ import { type EnsIndexerPublicConfig, PluginName } from "../ensindexer/config/types"; +import { + OmnichainIndexingStatusIds, + type OmnichainIndexingStatusSnapshot, +} from "../indexing-status"; import type { PrerequisiteResult } from "../shared/prerequisites"; /** @@ -13,3 +17,21 @@ export function hasSubgraphApiConfigSupport(config: EnsIndexerPublicConfig): Pre reason: `The connected ENSNode's Config must have the '${PluginName.Subgraph}' plugin enabled.`, }; } + +/** + * Check if provided OmnichainIndexingStatusSnapshot supports the Subgraph API. + */ +export function hasSubgraphApiIndexingStatusSupport( + config: OmnichainIndexingStatusSnapshot, +): PrerequisiteResult { + const supported = + config.omnichainStatus === OmnichainIndexingStatusIds.Completed || + config.omnichainStatus === OmnichainIndexingStatusIds.Following; + + if (supported) return { supported }; + + return { + supported: false, + reason: `The connected ENSNode's Omnichain Indexing Status must be "${OmnichainIndexingStatusIds.Completed}" or "${OmnichainIndexingStatusIds.Following}" for the Subgraph API to be available. Current omnichain indexing status is "${config.omnichainStatus}".`, + }; +} From 166c95d6489a2b0cc19a0782a4cc2a2bd4a2602e Mon Sep 17 00:00:00 2001 From: Tomasz Kopacki Date: Mon, 11 May 2026 19:24:16 +0200 Subject: [PATCH 2/8] Implement backend guards for Omnigraph API and Subgraph API --- .../handlers/api/omnigraph/omnigraph-api.ts | 30 +++++++++++++---- .../src/handlers/subgraph/subgraph-api.ts | 32 +++++++++++++------ 2 files changed, 47 insertions(+), 15 deletions(-) diff --git a/apps/ensapi/src/handlers/api/omnigraph/omnigraph-api.ts b/apps/ensapi/src/handlers/api/omnigraph/omnigraph-api.ts index 31fbf3d292..d4f79a3813 100644 --- a/apps/ensapi/src/handlers/api/omnigraph/omnigraph-api.ts +++ b/apps/ensapi/src/handlers/api/omnigraph/omnigraph-api.ts @@ -1,16 +1,34 @@ import config from "@/config"; -import { hasOmnigraphApiConfigSupport } from "@ensnode/ensnode-sdk"; +import { + hasOmnigraphApiConfigSupport, + hasOmnigraphApiIndexingStatusSupport, +} from "@ensnode/ensnode-sdk"; import { createApp } from "@/lib/hono-factory"; +import { indexingStatusMiddleware } from "@/middleware/indexing-status.middleware"; -const app = createApp(); +const app = createApp({ middlewares: [indexingStatusMiddleware] }); -// 503 if prerequisites not met app.use(async (c, next) => { - const prerequisite = hasOmnigraphApiConfigSupport(config.ensIndexerPublicConfig); - if (!prerequisite.supported) { - return c.text(`Service Unavailable: ${prerequisite.reason}`, 503); + const configPrerequisite = hasOmnigraphApiConfigSupport(config.ensIndexerPublicConfig); + // 503 if Omnigraph API is not available due to config prerequisites not met + if (!configPrerequisite.supported) { + return c.text(`Service Unavailable: ${configPrerequisite.reason}`, 503); + } + + // 503 if indexing status snapshot is not available yet + if (c.var.indexingStatus instanceof Error) { + return c.text(`Service Unavailable: Indexing Status Snapshot is not available yet`, 503); + } + + // 503 if omnigraph API not available due to indexing status prerequisites not met + const indexingStatusPrerequisite = hasOmnigraphApiIndexingStatusSupport( + c.var.indexingStatus.snapshot.omnichainSnapshot, + ); + + if (!indexingStatusPrerequisite.supported) { + return c.text(`Service Unavailable: ${indexingStatusPrerequisite.reason}`, 503); } await next(); diff --git a/apps/ensapi/src/handlers/subgraph/subgraph-api.ts b/apps/ensapi/src/handlers/subgraph/subgraph-api.ts index b0b01929c1..262be034d7 100644 --- a/apps/ensapi/src/handlers/subgraph/subgraph-api.ts +++ b/apps/ensapi/src/handlers/subgraph/subgraph-api.ts @@ -8,7 +8,10 @@ import { createDocumentationMiddleware } from "ponder-enrich-gql-docs-middleware // Once the lazy proxy implemented for `ensIndexerSchema` export is improved // to support Drizzle ORM in `ponder-subgraph` package. import * as ensIndexerSchema from "@ensnode/ensdb-sdk/ensindexer-abstract"; -import { hasSubgraphApiConfigSupport } from "@ensnode/ensnode-sdk"; +import { + hasSubgraphApiConfigSupport, + hasSubgraphApiIndexingStatusSupport, +} from "@ensnode/ensnode-sdk"; import { subgraphGraphQLMiddleware } from "@ensnode/ponder-subgraph"; import { createApp } from "@/lib/hono-factory"; @@ -26,21 +29,32 @@ const MAX_REALTIME_DISTANCE_TO_RESOLVE: Duration = 10 * 60; // 10 minutes in sec // generate a subgraph-specific subset of the schema const subgraphSchema = filterSchemaByPrefix("subgraph_", ensIndexerSchema); -const app = createApp(); +const app = createApp({ middlewares: [indexingStatusMiddleware] }); -// 503 if subgraph plugin not available app.use(async (c, next) => { - const prerequisite = hasSubgraphApiConfigSupport(config.ensIndexerPublicConfig); - if (!prerequisite.supported) { - return c.text(`Service Unavailable: ${prerequisite.reason}`, 503); + const configPrerequisite = hasSubgraphApiConfigSupport(config.ensIndexerPublicConfig); + // 503 if Subgraph API is not available due to config prerequisites not met + if (!configPrerequisite.supported) { + return c.text(`Service Unavailable: ${configPrerequisite.reason}`, 503); + } + + // 503 if indexing status snapshot is not available yet + if (c.var.indexingStatus instanceof Error) { + return c.text(`Service Unavailable: Indexing Status Snapshot is not available yet`, 503); + } + + // 503 if Subgraph API is not available due to indexing status prerequisites not met + const indexingStatusPrerequisite = hasSubgraphApiIndexingStatusSupport( + c.var.indexingStatus.snapshot.omnichainSnapshot, + ); + + if (!indexingStatusPrerequisite.supported) { + return c.text(`Service Unavailable: ${indexingStatusPrerequisite.reason}`, 503); } await next(); }); -// inject c.var.indexingStatus -app.use(indexingStatusMiddleware); - // inject c.var.isRealtime derived from MAX_REALTIME_DISTANCE_TO_RESOLVE app.use(makeIsRealtimeMiddleware("subgraph-api", MAX_REALTIME_DISTANCE_TO_RESOLVE)); From c035500c6abcf59287fdf8577cbd2fa601ed6e2b Mon Sep 17 00:00:00 2001 From: Tomasz Kopacki Date: Mon, 11 May 2026 19:24:35 +0200 Subject: [PATCH 3/8] Implement frontend guards for Omnigraph API and Subgraph API --- .../hooks/active/use-ensadmin-features.tsx | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/apps/ensadmin/src/hooks/active/use-ensadmin-features.tsx b/apps/ensadmin/src/hooks/active/use-ensadmin-features.tsx index c56dff7be5..5cdf97b5a8 100644 --- a/apps/ensadmin/src/hooks/active/use-ensadmin-features.tsx +++ b/apps/ensadmin/src/hooks/active/use-ensadmin-features.tsx @@ -2,9 +2,11 @@ import { useMemo } from "react"; import { hasOmnigraphApiConfigSupport, + hasOmnigraphApiIndexingStatusSupport, hasRegistrarActionsConfigSupport, hasRegistrarActionsIndexingStatusSupport, hasSubgraphApiConfigSupport, + hasSubgraphApiIndexingStatusSupport, PrerequisiteResult, } from "@ensnode/ensnode-sdk"; @@ -86,7 +88,17 @@ export function useENSAdminFeatures(): ENSAdminFeatures { if (indexingStatusQuery.status === "pending") return CONNECTING_STATUS; const { ensIndexer: ensIndexerPublicConfig } = indexingStatusQuery.data.stackInfo; - return prerequisiteResultToFeatureStatus(hasSubgraphApiConfigSupport(ensIndexerPublicConfig)); + const configSupportResult = hasSubgraphApiConfigSupport(ensIndexerPublicConfig); + if (!configSupportResult.supported) + return prerequisiteResultToFeatureStatus(configSupportResult); + + const { realtimeProjection } = indexingStatusQuery.data; + const { omnichainSnapshot } = realtimeProjection.snapshot; + + const indexingStatusSupportResult = hasSubgraphApiIndexingStatusSupport(omnichainSnapshot); + if (!indexingStatusSupportResult.supported) + return { type: "not-ready", reason: indexingStatusSupportResult.reason }; + return { type: "supported" }; }, [indexingStatusQuery]); const omnigraph: FeatureStatus = useMemo(() => { @@ -94,7 +106,17 @@ export function useENSAdminFeatures(): ENSAdminFeatures { if (indexingStatusQuery.status === "pending") return CONNECTING_STATUS; const { ensIndexer: ensIndexerPublicConfig } = indexingStatusQuery.data.stackInfo; - return prerequisiteResultToFeatureStatus(hasOmnigraphApiConfigSupport(ensIndexerPublicConfig)); + const configSupportResult = hasOmnigraphApiConfigSupport(ensIndexerPublicConfig); + if (!configSupportResult.supported) + return prerequisiteResultToFeatureStatus(configSupportResult); + + const { realtimeProjection } = indexingStatusQuery.data; + const { omnichainSnapshot } = realtimeProjection.snapshot; + + const indexingStatusSupportResult = hasOmnigraphApiIndexingStatusSupport(omnichainSnapshot); + if (!indexingStatusSupportResult.supported) + return { type: "not-ready", reason: indexingStatusSupportResult.reason }; + return { type: "supported" }; }, [indexingStatusQuery]); const restApi: FeatureStatus = useMemo(() => { From 0d9c06087e8232efb6898039b0aff10708baa730 Mon Sep 17 00:00:00 2001 From: Tomasz Kopacki Date: Mon, 11 May 2026 19:25:33 +0200 Subject: [PATCH 4/8] docs(changeset): Added indexing status based functions for checking Omnigraph API and Subgraph API availability. --- .changeset/calm-jobs-lay.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/calm-jobs-lay.md diff --git a/.changeset/calm-jobs-lay.md b/.changeset/calm-jobs-lay.md new file mode 100644 index 0000000000..d4394a3dc4 --- /dev/null +++ b/.changeset/calm-jobs-lay.md @@ -0,0 +1,5 @@ +--- +"@ensnode/ensnode-sdk": minor +--- + +Added indexing status based functions for checking Omnigraph API and Subgraph API availability. From d660758b88e1c277a6b3c0e87903f94ef2572267 Mon Sep 17 00:00:00 2001 From: Tomasz Kopacki Date: Mon, 11 May 2026 19:26:29 +0200 Subject: [PATCH 5/8] docs(changeset): Added indexing status based guard for Omnigraph API and Subgraph API routes. --- .changeset/loose-pets-vanish.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/loose-pets-vanish.md diff --git a/.changeset/loose-pets-vanish.md b/.changeset/loose-pets-vanish.md new file mode 100644 index 0000000000..8d9923c75b --- /dev/null +++ b/.changeset/loose-pets-vanish.md @@ -0,0 +1,5 @@ +--- +"ensapi": minor +--- + +Added indexing status based guard for Omnigraph API and Subgraph API routes. From 9b21b64aca759d048fe354df844c16d5b77fb856 Mon Sep 17 00:00:00 2001 From: Tomasz Kopacki Date: Mon, 11 May 2026 19:26:55 +0200 Subject: [PATCH 6/8] docs(changeset): Added indexing status based guard for Omnigraph API and Subgraph API views. --- .changeset/four-cats-sink.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/four-cats-sink.md diff --git a/.changeset/four-cats-sink.md b/.changeset/four-cats-sink.md new file mode 100644 index 0000000000..29ecd891de --- /dev/null +++ b/.changeset/four-cats-sink.md @@ -0,0 +1,5 @@ +--- +"ensadmin": minor +--- + +Added indexing status based guard for Omnigraph API and Subgraph API views. From 6ca670414570f9a21c72c7473e6c573fee1fa99c Mon Sep 17 00:00:00 2001 From: Tomasz Kopacki Date: Mon, 11 May 2026 19:45:47 +0200 Subject: [PATCH 7/8] Apply AI PR feedback --- .../src/hooks/active/use-ensadmin-features.tsx | 8 ++++++-- .../src/handlers/api/omnigraph/omnigraph-api.ts | 2 +- apps/ensapi/src/handlers/subgraph/subgraph-api.ts | 2 +- .../src/omnigraph-api/prerequisites.ts | 15 ++++++--------- .../ensnode-sdk/src/subgraph-api/prerequisites.ts | 15 ++++++--------- 5 files changed, 20 insertions(+), 22 deletions(-) diff --git a/apps/ensadmin/src/hooks/active/use-ensadmin-features.tsx b/apps/ensadmin/src/hooks/active/use-ensadmin-features.tsx index 5cdf97b5a8..248f4237ea 100644 --- a/apps/ensadmin/src/hooks/active/use-ensadmin-features.tsx +++ b/apps/ensadmin/src/hooks/active/use-ensadmin-features.tsx @@ -95,7 +95,9 @@ export function useENSAdminFeatures(): ENSAdminFeatures { const { realtimeProjection } = indexingStatusQuery.data; const { omnichainSnapshot } = realtimeProjection.snapshot; - const indexingStatusSupportResult = hasSubgraphApiIndexingStatusSupport(omnichainSnapshot); + const indexingStatusSupportResult = hasSubgraphApiIndexingStatusSupport( + omnichainSnapshot.omnichainStatus, + ); if (!indexingStatusSupportResult.supported) return { type: "not-ready", reason: indexingStatusSupportResult.reason }; return { type: "supported" }; @@ -113,7 +115,9 @@ export function useENSAdminFeatures(): ENSAdminFeatures { const { realtimeProjection } = indexingStatusQuery.data; const { omnichainSnapshot } = realtimeProjection.snapshot; - const indexingStatusSupportResult = hasOmnigraphApiIndexingStatusSupport(omnichainSnapshot); + const indexingStatusSupportResult = hasOmnigraphApiIndexingStatusSupport( + omnichainSnapshot.omnichainStatus, + ); if (!indexingStatusSupportResult.supported) return { type: "not-ready", reason: indexingStatusSupportResult.reason }; return { type: "supported" }; diff --git a/apps/ensapi/src/handlers/api/omnigraph/omnigraph-api.ts b/apps/ensapi/src/handlers/api/omnigraph/omnigraph-api.ts index d4f79a3813..ec2d40362c 100644 --- a/apps/ensapi/src/handlers/api/omnigraph/omnigraph-api.ts +++ b/apps/ensapi/src/handlers/api/omnigraph/omnigraph-api.ts @@ -24,7 +24,7 @@ app.use(async (c, next) => { // 503 if omnigraph API not available due to indexing status prerequisites not met const indexingStatusPrerequisite = hasOmnigraphApiIndexingStatusSupport( - c.var.indexingStatus.snapshot.omnichainSnapshot, + c.var.indexingStatus.snapshot.omnichainSnapshot.omnichainStatus, ); if (!indexingStatusPrerequisite.supported) { diff --git a/apps/ensapi/src/handlers/subgraph/subgraph-api.ts b/apps/ensapi/src/handlers/subgraph/subgraph-api.ts index 262be034d7..97fa5ed225 100644 --- a/apps/ensapi/src/handlers/subgraph/subgraph-api.ts +++ b/apps/ensapi/src/handlers/subgraph/subgraph-api.ts @@ -45,7 +45,7 @@ app.use(async (c, next) => { // 503 if Subgraph API is not available due to indexing status prerequisites not met const indexingStatusPrerequisite = hasSubgraphApiIndexingStatusSupport( - c.var.indexingStatus.snapshot.omnichainSnapshot, + c.var.indexingStatus.snapshot.omnichainSnapshot.omnichainStatus, ); if (!indexingStatusPrerequisite.supported) { diff --git a/packages/ensnode-sdk/src/omnigraph-api/prerequisites.ts b/packages/ensnode-sdk/src/omnigraph-api/prerequisites.ts index 725ef718ff..bddcbd8b8c 100644 --- a/packages/ensnode-sdk/src/omnigraph-api/prerequisites.ts +++ b/packages/ensnode-sdk/src/omnigraph-api/prerequisites.ts @@ -1,8 +1,5 @@ import { type EnsIndexerPublicConfig, PluginName } from "../ensindexer/config/types"; -import { - OmnichainIndexingStatusIds, - type OmnichainIndexingStatusSnapshot, -} from "../indexing-status"; +import { type OmnichainIndexingStatusId, OmnichainIndexingStatusIds } from "../indexing-status"; import type { PrerequisiteResult } from "../shared/prerequisites"; /** @@ -19,19 +16,19 @@ export function hasOmnigraphApiConfigSupport(config: EnsIndexerPublicConfig): Pr } /** - * Check if provided OmnichainIndexingStatusSnapshot supports the Omnigraph API. + * Check if provided OmnichainIndexingStatusId supports the Omnigraph API. */ export function hasOmnigraphApiIndexingStatusSupport( - config: OmnichainIndexingStatusSnapshot, + indexingStatus: OmnichainIndexingStatusId, ): PrerequisiteResult { const supported = - config.omnichainStatus === OmnichainIndexingStatusIds.Completed || - config.omnichainStatus === OmnichainIndexingStatusIds.Following; + indexingStatus === OmnichainIndexingStatusIds.Completed || + indexingStatus === OmnichainIndexingStatusIds.Following; if (supported) return { supported }; return { supported: false, - reason: `The connected ENSNode's Omnichain Indexing Status must be "${OmnichainIndexingStatusIds.Completed}" or "${OmnichainIndexingStatusIds.Following}" for the Omnigraph API to be available. Current omnichain indexing status is "${config.omnichainStatus}".`, + reason: `The connected ENSNode's Omnichain Indexing Status must be "${OmnichainIndexingStatusIds.Completed}" or "${OmnichainIndexingStatusIds.Following}" for the Omnigraph API to be available. Current omnichain indexing status is "${indexingStatus}".`, }; } diff --git a/packages/ensnode-sdk/src/subgraph-api/prerequisites.ts b/packages/ensnode-sdk/src/subgraph-api/prerequisites.ts index 23f29acb79..8c27ee5d5d 100644 --- a/packages/ensnode-sdk/src/subgraph-api/prerequisites.ts +++ b/packages/ensnode-sdk/src/subgraph-api/prerequisites.ts @@ -1,8 +1,5 @@ import { type EnsIndexerPublicConfig, PluginName } from "../ensindexer/config/types"; -import { - OmnichainIndexingStatusIds, - type OmnichainIndexingStatusSnapshot, -} from "../indexing-status"; +import { type OmnichainIndexingStatusId, OmnichainIndexingStatusIds } from "../indexing-status"; import type { PrerequisiteResult } from "../shared/prerequisites"; /** @@ -19,19 +16,19 @@ export function hasSubgraphApiConfigSupport(config: EnsIndexerPublicConfig): Pre } /** - * Check if provided OmnichainIndexingStatusSnapshot supports the Subgraph API. + * Check if provided OmnichainIndexingStatusId supports the Subgraph API. */ export function hasSubgraphApiIndexingStatusSupport( - config: OmnichainIndexingStatusSnapshot, + indexingStatus: OmnichainIndexingStatusId, ): PrerequisiteResult { const supported = - config.omnichainStatus === OmnichainIndexingStatusIds.Completed || - config.omnichainStatus === OmnichainIndexingStatusIds.Following; + indexingStatus === OmnichainIndexingStatusIds.Completed || + indexingStatus === OmnichainIndexingStatusIds.Following; if (supported) return { supported }; return { supported: false, - reason: `The connected ENSNode's Omnichain Indexing Status must be "${OmnichainIndexingStatusIds.Completed}" or "${OmnichainIndexingStatusIds.Following}" for the Subgraph API to be available. Current omnichain indexing status is "${config.omnichainStatus}".`, + reason: `The connected ENSNode's Omnichain Indexing Status must be "${OmnichainIndexingStatusIds.Completed}" or "${OmnichainIndexingStatusIds.Following}" for the Subgraph API to be available. Current omnichain indexing status is "${indexingStatus}".`, }; } From cc89001373b396d84033b1d240b21634f3432f08 Mon Sep 17 00:00:00 2001 From: Tomasz Kopacki Date: Tue, 12 May 2026 10:23:41 +0200 Subject: [PATCH 8/8] Apply PR feedback --- .../src/ensnode/api/prerequisites.ts | 24 +++++++++++++++++++ .../src/omnigraph-api/prerequisites.ts | 14 +++-------- .../src/subgraph-api/prerequisites.ts | 14 +++-------- 3 files changed, 30 insertions(+), 22 deletions(-) create mode 100644 packages/ensnode-sdk/src/ensnode/api/prerequisites.ts diff --git a/packages/ensnode-sdk/src/ensnode/api/prerequisites.ts b/packages/ensnode-sdk/src/ensnode/api/prerequisites.ts new file mode 100644 index 0000000000..b4f71793a2 --- /dev/null +++ b/packages/ensnode-sdk/src/ensnode/api/prerequisites.ts @@ -0,0 +1,24 @@ +import { type OmnichainIndexingStatusId, OmnichainIndexingStatusIds } from "../../indexing-status"; +import type { PrerequisiteResult } from "../../shared/prerequisites"; + +/** + * Check if provided OmnichainIndexingStatusId indicates that the backfill is complete. + * + * This is a prerequisite for all APIs that rely on indexed data. We need to ensure that + * the backfill is complete to guarantee that the necessary data is completely indexed + * and available for queries. + */ +export function hasBackfillCompleted( + indexingStatus: OmnichainIndexingStatusId, +): PrerequisiteResult { + const supported = + indexingStatus === OmnichainIndexingStatusIds.Completed || + indexingStatus === OmnichainIndexingStatusIds.Following; + + if (supported) return { supported }; + + return { + supported: false, + reason: `The connected ENSNode's Indexing Status must be "${OmnichainIndexingStatusIds.Completed}" or "${OmnichainIndexingStatusIds.Following}". Currently, it is "${indexingStatus}".`, + }; +} diff --git a/packages/ensnode-sdk/src/omnigraph-api/prerequisites.ts b/packages/ensnode-sdk/src/omnigraph-api/prerequisites.ts index bddcbd8b8c..d3b3c3dd14 100644 --- a/packages/ensnode-sdk/src/omnigraph-api/prerequisites.ts +++ b/packages/ensnode-sdk/src/omnigraph-api/prerequisites.ts @@ -1,5 +1,6 @@ import { type EnsIndexerPublicConfig, PluginName } from "../ensindexer/config/types"; -import { type OmnichainIndexingStatusId, OmnichainIndexingStatusIds } from "../indexing-status"; +import { hasBackfillCompleted } from "../ensnode/api/prerequisites"; +import type { OmnichainIndexingStatusId } from "../indexing-status"; import type { PrerequisiteResult } from "../shared/prerequisites"; /** @@ -21,14 +22,5 @@ export function hasOmnigraphApiConfigSupport(config: EnsIndexerPublicConfig): Pr export function hasOmnigraphApiIndexingStatusSupport( indexingStatus: OmnichainIndexingStatusId, ): PrerequisiteResult { - const supported = - indexingStatus === OmnichainIndexingStatusIds.Completed || - indexingStatus === OmnichainIndexingStatusIds.Following; - - if (supported) return { supported }; - - return { - supported: false, - reason: `The connected ENSNode's Omnichain Indexing Status must be "${OmnichainIndexingStatusIds.Completed}" or "${OmnichainIndexingStatusIds.Following}" for the Omnigraph API to be available. Current omnichain indexing status is "${indexingStatus}".`, - }; + return hasBackfillCompleted(indexingStatus); } diff --git a/packages/ensnode-sdk/src/subgraph-api/prerequisites.ts b/packages/ensnode-sdk/src/subgraph-api/prerequisites.ts index 8c27ee5d5d..70107f2a97 100644 --- a/packages/ensnode-sdk/src/subgraph-api/prerequisites.ts +++ b/packages/ensnode-sdk/src/subgraph-api/prerequisites.ts @@ -1,5 +1,6 @@ import { type EnsIndexerPublicConfig, PluginName } from "../ensindexer/config/types"; -import { type OmnichainIndexingStatusId, OmnichainIndexingStatusIds } from "../indexing-status"; +import { hasBackfillCompleted } from "../ensnode/api/prerequisites"; +import type { OmnichainIndexingStatusId } from "../indexing-status"; import type { PrerequisiteResult } from "../shared/prerequisites"; /** @@ -21,14 +22,5 @@ export function hasSubgraphApiConfigSupport(config: EnsIndexerPublicConfig): Pre export function hasSubgraphApiIndexingStatusSupport( indexingStatus: OmnichainIndexingStatusId, ): PrerequisiteResult { - const supported = - indexingStatus === OmnichainIndexingStatusIds.Completed || - indexingStatus === OmnichainIndexingStatusIds.Following; - - if (supported) return { supported }; - - return { - supported: false, - reason: `The connected ENSNode's Omnichain Indexing Status must be "${OmnichainIndexingStatusIds.Completed}" or "${OmnichainIndexingStatusIds.Following}" for the Subgraph API to be available. Current omnichain indexing status is "${indexingStatus}".`, - }; + return hasBackfillCompleted(indexingStatus); }