Skip to content
Merged
Show file tree
Hide file tree
Changes from 13 commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
1f1e3df
Update ENSApi Indexing Status API data model
tk-o Feb 24, 2026
e518a43
Update HTTP handlers for ENSApi
tk-o Feb 24, 2026
ac26750
Update Indexing Status cache for ENSApi
tk-o Feb 24, 2026
55414e5
Rename `ENSNodeProvider*` types
tk-o Feb 24, 2026
2557708
Rename `useENSNodeSDKConfig` to `useEnsApiProviderOptions`
tk-o Feb 24, 2026
da220f3
Remove `useENSNodeConfig` hook
tk-o Feb 24, 2026
098ff6e
Update `useResolvedIdentity` to require `namespace` param
tk-o Feb 24, 2026
f7603b8
Update ENSNode hooks to apply renamed functions and types
tk-o Feb 24, 2026
1d45940
Update `useIndexingStatusWithSwr` hook to also cache `config: EnsApiP…
tk-o Feb 24, 2026
ba81822
Create `useEnsApiConfig` for conveniet use of `EnsApiPublicConfig` value
tk-o Feb 24, 2026
72d7ae7
Replace applications of removed `useENSNodeConfig` hook with `useEnsA…
tk-o Feb 24, 2026
c3a1579
Reduce use of `useENSNodeConfig` (removed) and `useIndexingStatusWit…
tk-o Feb 24, 2026
352be15
Replace applications of removed `SelectedENSNodeProvider` with `Selec…
tk-o Feb 24, 2026
f88cc15
Merge remote-tracking branch 'origin/main' into ensapi-merge-config-w…
tk-o Mar 2, 2026
709443d
Fix references to updated ENSApi response data model
tk-o Mar 2, 2026
b768b3d
Fix references to updated ENSIndexer response data model
tk-o Mar 2, 2026
2a2b40f
Fix references to updated Indexing Status data model in ENSAdmin
tk-o Mar 2, 2026
5edb862
Remove config route definition from ENSApi routes
tk-o Mar 2, 2026
073f642
Apply AI PR feedback
tk-o Mar 2, 2026
078f7ef
Merge remote-tracking branch 'origin/main' into ensapi-merge-config-w…
tk-o Apr 13, 2026
e652446
Update OpenAPI Spec
tk-o Apr 13, 2026
02daa2e
Merge remote-tracking branch 'origin/main' into ensapi-merge-config-w…
tk-o Apr 17, 2026
c532285
Apply AI PR feedback
tk-o Apr 17, 2026
4d0703b
Fix conditional logic in react hooks usage
tk-o Apr 17, 2026
acf4e6b
Apply AI PR feedback
tk-o Apr 17, 2026
fa06ece
Rename `EnsApiContext` to `EnsNodeContext` and `*EnsApiProvider*` to …
tk-o Apr 17, 2026
f4e4d56
docs(changeset): Fixed ENS Namespace option for calling `useResolvedI…
tk-o Apr 17, 2026
15f314c
Rename `config` field to `ensApiPublicConfig`
tk-o Apr 17, 2026
a814284
Remove the `ConfigResponse` data model
tk-o Apr 17, 2026
839bb4c
Fix mocked data
tk-o Apr 17, 2026
26a2ff0
Update OpenAPI Spec
tk-o Apr 17, 2026
cdc1736
docs(changeset): Replaced the `EnsApiConfigResponse` data model by ad…
tk-o Apr 17, 2026
6f1d363
docs(changeset): **Breaking**: Replaced the `config()` method in the …
tk-o Apr 17, 2026
288af77
docs(changeset): **Breaking**: Replaced `useENSNodeSDKConfig` hook wi…
tk-o Apr 17, 2026
1ac516c
docs(changeset): **Breaking**: Removed `useENSNodeConfig` hook.
tk-o Apr 17, 2026
dc147d0
docs(changeset): **Breaking**: Removed Config API endpoint at `GET /a…
tk-o Apr 17, 2026
2ce61f8
docs(changeset): Replaced the `useENSNodeConfig` with `useEnsApiPubli…
tk-o Apr 17, 2026
0e7bd2a
Introduce `EnsNodeStackInfo` data model to ENSNode SDK
tk-o Apr 17, 2026
ccc497e
docs(changeset): Introduced `EnsNodeStackInfo` data model.
tk-o Apr 17, 2026
cc131f4
Extend `EnsDbReader` class with `buildEnsDbPublicConfig()` method
tk-o Apr 17, 2026
4658d53
Rename symbols exported from ENSNode React package
tk-o Apr 17, 2026
2eb9070
Return `stackInfo` field from Indexing Status API endpoint
tk-o Apr 17, 2026
774a105
Replace `useEnsApiPublicConfig` hook with `useEnsNodeStackInfo` hook
tk-o Apr 17, 2026
ac94d42
Rename `ensApiPublicConfig` field integrations with `stackInfo` field
tk-o Apr 17, 2026
8086ad9
Update mocks
tk-o Apr 17, 2026
3ca4b1a
Update changesets
tk-o Apr 17, 2026
94cde85
Merge remote-tracking branch 'origin/main' into ensapi-merge-config-w…
tk-o Apr 17, 2026
3aad5fd
Move `useEnsNodeStackInfo` hook into the hooks dir
tk-o Apr 17, 2026
8911aac
Rename `EnsApiClient*` symbols to `EnsNodeClient*`
tk-o Apr 17, 2026
2e8a476
Apply AI PR feedback
tk-o Apr 17, 2026
7132611
Update `SerializedEnsNodeStackInfo` data model
tk-o Apr 21, 2026
446be2e
Add `versionInfo` field to `EnsDbPublicConfig` data model
tk-o Apr 21, 2026
940b401
Apply JSDoc updates
tk-o Apr 21, 2026
74685bd
Fix OpenAPI Spec output for `highestLabelSetVersion` field
tk-o Apr 21, 2026
d15efea
Merge remote-tracking branch 'origin/main' into ensapi-merge-config-w…
tk-o Apr 21, 2026
ec4d4a5
Cleanup teminology around "ENSNode Client"
tk-o Apr 21, 2026
ac957d5
Add tests for parsing pg version info string
tk-o Apr 21, 2026
87523e1
Rename `useActiveENSNodeConfig` hook to `useActiveEnsNodeStackInfo`
tk-o Apr 21, 2026
1cde26a
Merge remote-tracking branch 'origin/main' into ensapi-merge-config-w…
tk-o Apr 21, 2026
23495d0
Apply AI PR feedback
tk-o Apr 21, 2026
b2f37cf
Apply PR feedback
tk-o Apr 21, 2026
5913d2d
Refine examples for `EnsNodeClient`
tk-o Apr 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .changeset/common-lines-smell.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
"@ensnode/ensnode-sdk": minor
---

**Breaking**: Replaced the `config()` method in the `EnsApiClient` class with the extended data model returned from the `indexingStatus()` method.
**Breaking**: Replaced the `config()` method in the `EnsNodeClient` class with the extended data model returned from the `indexingStatus()` method.
2 changes: 1 addition & 1 deletion .changeset/cool-hotels-dress.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
"@ensnode/ensnode-sdk": minor
---

Fully removed the deprecated `ENSNodeClient` (use `EnsApiClient` instead).
Fully removed the deprecated `ENSNodeClient` (use `EnsNodeClient` instead).
Comment thread
tk-o marked this conversation as resolved.
Outdated
5 changes: 5 additions & 0 deletions .changeset/cute-news-begin.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@ensnode/ensnode-sdk": minor
---

Introduced `EnsNodeStackInfo` data model.
2 changes: 1 addition & 1 deletion .changeset/fancy-mails-fall.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
"@ensnode/ensnode-sdk": minor
---

Replaced the `EnsApiConfigResponse` data model by adding `ensApiPublicConfig` field to the `EnsApiIndexingStatusResponseOk` data model.
Replaced the `EnsApiConfigResponse` data model by adding `stackInfo` field to the `EnsApiIndexingStatusResponseOk` data model.
4 changes: 3 additions & 1 deletion .changeset/rare-dogs-sin.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,6 @@
"@ensnode/ensnode-react": minor
---

**Breaking**: Replaced `useENSNodeSDKConfig` hook with `useEnsNodeProviderOptions` hook.
**Breaking**:
- Replaced `useENSNodeSDKConfig` hook with `useEnsNodeProviderOptions` hook.
- Renamed `createConfig` function to `createEnsNodeProviderOptions`.
2 changes: 1 addition & 1 deletion .changeset/silent-adults-rest.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
"ensadmin": minor
---

Replaced the `useENSNodeConfig` hook with `useEnsApiPublicConfig` hook. The `useEnsApiPublicConfig` hook leverages the updated data model returned from the `useIndexingStatusWithSwr` hook.
Replaced the `useENSNodeConfig` hook with `useEnsNodeStackInfo` hook. The `useEnsNodeStackInfo` hook leverages the updated data model returned from the `useIndexingStatusWithSwr` hook.
2 changes: 1 addition & 1 deletion .changeset/thick-horses-prove.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
"ensapi": minor
---

**Breaking**: Removed Config API endpoint at `GET /api/config`. To get the ENSApi Public Config, call the `GET /api/indexing-status` endpoint and reference the `ensApiPublicConfig` field in the OK response.
**Breaking**: Removed Config API endpoint at `GET /api/config`. To get the ENSApi Public Config, call the `GET /api/indexing-status` endpoint and reference the `stackInfo.ensApi` field in the OK response.
2 changes: 1 addition & 1 deletion .changeset/two-rice-flash.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
"@ensnode/ensnode-react": minor
---

Replaced references to the deprecated and removed `ENSNodeClient` with `EnsApiClient`.
Replaced references to the deprecated and removed `ENSNodeClient` with `EnsNodeClient`.
14 changes: 11 additions & 3 deletions apps/ensadmin/src/app/mock/config-info/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@

import { useMemo, useState } from "react";

import { deserializeENSApiPublicConfig, SerializedENSApiPublicConfig } from "@ensnode/ensnode-sdk";
import {
buildEnsNodeStackInfo,
deserializeENSApiPublicConfig,
SerializedENSApiPublicConfig,
} from "@ensnode/ensnode-sdk";

import {
ENSNodeConfigInfoView,
Expand Down Expand Up @@ -36,8 +40,12 @@ export default function MockConfigPage() {

default:
try {
const config = deserializeENSApiPublicConfig(mockConfigData[selectedConfig]);
return { ensApiPublicConfig: config };
const ensApiPublicConfig = deserializeENSApiPublicConfig(mockConfigData[selectedConfig]);
return {
ensNodeStackInfo: buildEnsNodeStackInfo(ensApiPublicConfig, {
postgreSqlVersion: "18.1",
}),
} satisfies ENSNodeConfigInfoViewProps;
} catch (error) {
const errorMessage =
error instanceof Error
Expand Down
8 changes: 4 additions & 4 deletions apps/ensadmin/src/app/mock/indexing-stats/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -76,14 +76,14 @@ export default function MockIndexingStatusPage() {
const mockedIndexingStatus = useQuery({
queryKey: ["mock", "useIndexingStatus", selectedVariant],
queryFn: () => fetchMockedIndexingStatus(selectedVariant),
select: (response) => {
select: ({ responseCode, realtimeProjection, stackInfo }) => {
return {
responseCode: IndexingStatusResponseCodes.Ok,
responseCode,
realtimeProjection: createRealtimeIndexingStatusProjection(
response.realtimeProjection.snapshot,
realtimeProjection.snapshot,
now,
),
ensApiPublicConfig: response.ensApiPublicConfig,
stackInfo,
} satisfies IndexingStatusResponseOk;
},
retry: false, // allows loading error to be observed immediately
Expand Down
23 changes: 16 additions & 7 deletions apps/ensadmin/src/app/mock/indexing-status-api.mock.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import {
ChainIndexingStatusIds,
CrossChainIndexingStrategyIds,
deserializeEnsApiIndexingStatusResponse,
deserializeIndexingStatusResponse,
EnsApiIndexingStatusResponseOk,
Comment thread
tk-o marked this conversation as resolved.
IndexingStatusResponseCodes,
type IndexingStatusResponseError,
Expand All @@ -13,8 +12,9 @@ import {
type SerializedChainIndexingStatusSnapshotCompleted,
type SerializedChainIndexingStatusSnapshotFollowing,
type SerializedChainIndexingStatusSnapshotQueued,
SerializedEnsApiPublicConfig,
SerializedEnsIndexerPublicConfig,
type SerializedEnsApiPublicConfig,
type SerializedEnsIndexerPublicConfig,
type SerializedEnsNodeStackInfo,
type SerializedOmnichainIndexingStatusSnapshotBackfill,
type SerializedOmnichainIndexingStatusSnapshotCompleted,
type SerializedOmnichainIndexingStatusSnapshotFollowing,
Expand Down Expand Up @@ -67,6 +67,15 @@ export const serializedEnsApiPublicConfig = {
},
} satisfies SerializedEnsApiPublicConfig;

const serializedStackInfo = {
ensApi: serializedEnsApiPublicConfig,
ensDb: {
postgreSqlVersion: "16",
Comment thread
tk-o marked this conversation as resolved.
Outdated
},
ensIndexer: serializedEnsIndexerPublicConfig,
ensRainbow: serializedEnsIndexerPublicConfig.ensRainbowPublicConfig,
} satisfies SerializedEnsNodeStackInfo;

export const indexingStatusResponseError: IndexingStatusResponseError = {
responseCode: IndexingStatusResponseCodes.Error,
};
Expand Down Expand Up @@ -134,7 +143,7 @@ export const indexingStatusResponseOkOmnichain: Record<
} satisfies SerializedOmnichainIndexingStatusSnapshotUnstarted,
},
},
ensApiPublicConfig: serializedEnsApiPublicConfig,
stackInfo: serializedStackInfo,
}),

[OmnichainIndexingStatusIds.Backfill]: deserializeEnsApiIndexingStatusResponse({
Expand Down Expand Up @@ -213,7 +222,7 @@ export const indexingStatusResponseOkOmnichain: Record<
} satisfies SerializedOmnichainIndexingStatusSnapshotBackfill,
},
},
ensApiPublicConfig: serializedEnsApiPublicConfig,
stackInfo: serializedStackInfo,
}),

[OmnichainIndexingStatusIds.Following]: deserializeEnsApiIndexingStatusResponse({
Expand Down Expand Up @@ -307,7 +316,7 @@ export const indexingStatusResponseOkOmnichain: Record<
} satisfies SerializedOmnichainIndexingStatusSnapshotFollowing,
},
},
ensApiPublicConfig: serializedEnsApiPublicConfig,
stackInfo: serializedStackInfo,
}),

[OmnichainIndexingStatusIds.Completed]: deserializeEnsApiIndexingStatusResponse({
Expand Down Expand Up @@ -345,6 +354,6 @@ export const indexingStatusResponseOkOmnichain: Record<
} satisfies SerializedOmnichainIndexingStatusSnapshotCompleted,
},
},
ensApiPublicConfig: serializedEnsApiPublicConfig,
stackInfo: serializedStackInfo,
}),
};
29 changes: 0 additions & 29 deletions apps/ensadmin/src/components/config/use-ens-api-public-config.ts

This file was deleted.

50 changes: 28 additions & 22 deletions apps/ensadmin/src/components/connection/cards/ensnode-info.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,8 @@ import { ChainIcon, getChainName } from "@namehash/namehash-ui";
import { History, Replace } from "lucide-react";
import { Fragment, ReactNode } from "react";

import { type EnsApiPublicConfig, getENSRootChainId } from "@ensnode/ensnode-sdk";
import { EnsNodeStackInfo, getENSRootChainId } from "@ensnode/ensnode-sdk";

import { useEnsApiPublicConfig } from "@/components/config/use-ens-api-public-config";
import { ErrorInfo, type ErrorInfoProps } from "@/components/error-info";
import { ENSApiIcon } from "@/components/icons/ensnode-apps/ensapi-icon";
import { ENSDbIcon } from "@/components/icons/ensnode-apps/ensdb-icon";
Expand All @@ -25,6 +24,7 @@ import { ExternalLinkWithIcon } from "@/components/link";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { Skeleton } from "@/components/ui/skeleton";
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
import { useEnsNodeStackInfo } from "@/hooks/use-ensnode-stack-info";
import { cn } from "@/lib/utils";

import {
Expand Down Expand Up @@ -96,16 +96,16 @@ function ENSNodeCardLoadingSkeleton() {
* Props for ENSNodeConfigCardDisplay - display component that accepts props for testing/mocking
*/
export interface ENSNodeConfigCardDisplayProps {
ensApiPublicConfig: EnsApiPublicConfig;
ensNodeStackInfo: EnsNodeStackInfo;
}

/**
* Display component that receives props - used for reusable/mockable presentation
*/
export function ENSNodeConfigCardDisplay({ ensApiPublicConfig }: ENSNodeConfigCardDisplayProps) {
export function ENSNodeConfigCardDisplay({ ensNodeStackInfo }: ENSNodeConfigCardDisplayProps) {
return (
<ENSNodeCard>
<ENSNodeConfigCardContent ensApiPublicConfig={ensApiPublicConfig} />
<ENSNodeConfigCardContent ensNodeStackInfo={ensNodeStackInfo} />
</ENSNodeCard>
);
}
Expand All @@ -114,7 +114,7 @@ export function ENSNodeConfigCardDisplay({ ensApiPublicConfig }: ENSNodeConfigCa
* Props for ENSNodeConfigInfoView - internal component that accepts props for testing/mocking
*/
export interface ENSNodeConfigInfoViewProps {
ensApiPublicConfig?: EnsApiPublicConfig;
ensNodeStackInfo?: EnsNodeStackInfo;
error?: ErrorInfoProps;
isLoading?: boolean;
}
Expand All @@ -123,7 +123,7 @@ export interface ENSNodeConfigInfoViewProps {
* Internal view component that accepts props - used by both the main component and mock pages
*/
export function ENSNodeConfigInfoView({
ensApiPublicConfig,
ensNodeStackInfo,
error,
isLoading = false,
}: ENSNodeConfigInfoViewProps) {
Expand All @@ -132,49 +132,50 @@ export function ENSNodeConfigInfoView({
}

// Show ENSNode card - shell with skeleton while loading, or content when ready
if (isLoading || !ensApiPublicConfig) {
if (isLoading || !ensNodeStackInfo) {
return (
<ENSNodeCard>
<ENSNodeCardLoadingSkeleton />
</ENSNodeCard>
);
}

return <ENSNodeConfigCardDisplay ensApiPublicConfig={ensApiPublicConfig} />;
return <ENSNodeConfigCardDisplay ensNodeStackInfo={ensNodeStackInfo} />;
}

/**
* ENSNodeConfigInfo component - fetches and displays ENSNode configuration data
*/
export function ENSNodeConfigInfo() {
const ensApiConfig = useEnsApiPublicConfig();
const ensNodeStackInfo = useEnsNodeStackInfo();

if (ensApiConfig.isError) {
if (ensNodeStackInfo.isError) {
return (
<ENSNodeConfigInfoView
error={{
title: "Error loading ENSNode Configuration",
description: ensApiConfig.error.message,
title: "Error loading ENSNode Stack Info",
description: ensNodeStackInfo.error.message,
}}
/>
);
}

if (ensApiConfig.isPending) {
if (ensNodeStackInfo.isPending) {
return <ENSNodeConfigInfoView isLoading={true} />;
}

return <ENSNodeConfigInfoView ensApiPublicConfig={ensApiConfig.data} />;
return <ENSNodeConfigInfoView ensNodeStackInfo={ensNodeStackInfo.data} />;
}

function ENSNodeConfigCardContent({
ensApiPublicConfig,
}: {
ensApiPublicConfig: EnsApiPublicConfig;
}) {
function ENSNodeConfigCardContent({ ensNodeStackInfo }: { ensNodeStackInfo: EnsNodeStackInfo }) {
const cardItemValueStyles = "text-sm leading-6 font-normal text-black";

const { ensIndexerPublicConfig } = ensApiPublicConfig;
const {
ensApi: ensApiPublicConfig,
ensIndexer: ensIndexerPublicConfig,
ensDb: ensDbPublicConfig,
ensRainbow: ensRainbowPublicConfig,
} = ensNodeStackInfo;

const healReverseAddressesActivated = !ensIndexerPublicConfig.isSubgraphCompatible;
const indexAdditionalRecordsActivated = !ensIndexerPublicConfig.isSubgraphCompatible;
Expand Down Expand Up @@ -401,7 +402,12 @@ function ENSNodeConfigCardContent({
docsLink={new URL("https://ensnode.io/ensdb")}
>
<InfoCardItems>
<InfoCardItem label="Database" value={<p className={cardItemValueStyles}>Postgres</p>} />
<InfoCardItem
label="Database server"
value={
<p className={cardItemValueStyles}>Postgres {ensDbPublicConfig.postgreSqlVersion}</p>
Comment thread
tk-o marked this conversation as resolved.
Outdated
}
/>
<InfoCardItem
label="ENSIndexer Schema"
value={
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,25 @@

import type { PropsWithChildren } from "react";

import { useEnsApiPublicConfig } from "@/components/config/use-ens-api-public-config";
import { ErrorInfo } from "@/components/error-info";
import { LoadingSpinner } from "@/components/loading-spinner";
import { useEnsNodeStackInfo } from "@/hooks/use-ensnode-stack-info";

/**
* Allows consumers to use `useActiveConnection` by blocking rendering until it is available.
*/
export function RequireActiveConnection({ children }: PropsWithChildren) {
const ensApiConfig = useEnsApiPublicConfig();
const ensNodeStackInfo = useEnsNodeStackInfo();

if (ensApiConfig.status === "pending") return <Loading />;
if (ensNodeStackInfo.status === "pending") return <Loading />;

if (ensApiConfig.status === "error") {
if (ensNodeStackInfo.status === "error") {
return (
<section className="p-6">
<ErrorInfo title="Failed to connect to ENSApi" description={ensApiConfig.error.message} />
<ErrorInfo
title="Failed to connect to ENSApi"
Comment thread
tk-o marked this conversation as resolved.
Outdated
description={ensNodeStackInfo.error.message}
/>
</section>
);
}
Expand Down
Loading
Loading