@ensnode/ensnode-sdk 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -45,6 +45,7 @@ __export(index_exports, {
45
45
  DEFAULT_EVM_COIN_TYPE: () => DEFAULT_EVM_COIN_TYPE,
46
46
  ENSNamespaceIds: () => import_datasources.ENSNamespaceIds,
47
47
  ENSNodeClient: () => ENSNodeClient,
48
+ ENS_ROOT: () => ENS_ROOT,
48
49
  ETH_COIN_TYPE: () => ETH_COIN_TYPE,
49
50
  ETH_NODE: () => ETH_NODE,
50
51
  ForwardResolutionProtocolStep: () => ForwardResolutionProtocolStep,
@@ -53,6 +54,9 @@ __export(index_exports, {
53
54
  LruCache: () => LruCache,
54
55
  NFTMintStatuses: () => NFTMintStatuses,
55
56
  NFTTransferTypes: () => NFTTransferTypes,
57
+ NameTokenOwnershipTypes: () => NameTokenOwnershipTypes,
58
+ NameTokensResponseCodes: () => NameTokensResponseCodes,
59
+ NameTokensResponseErrorCodes: () => NameTokensResponseErrorCodes,
56
60
  OmnichainIndexingStatusIds: () => OmnichainIndexingStatusIds,
57
61
  PROTOCOL_ATTRIBUTE_PREFIX: () => PROTOCOL_ATTRIBUTE_PREFIX,
58
62
  PluginName: () => PluginName,
@@ -85,6 +89,7 @@ __export(index_exports, {
85
89
  buildEnsRainbowClientLabelSet: () => buildEnsRainbowClientLabelSet,
86
90
  buildLabelSetId: () => buildLabelSetId,
87
91
  buildLabelSetVersion: () => buildLabelSetVersion,
92
+ buildPageContext: () => buildPageContext,
88
93
  buildUnresolvedIdentity: () => buildUnresolvedIdentity,
89
94
  checkChainIndexingStatusSnapshotsForOmnichainStatusSnapshotBackfill: () => checkChainIndexingStatusSnapshotsForOmnichainStatusSnapshotBackfill,
90
95
  checkChainIndexingStatusSnapshotsForOmnichainStatusSnapshotCompleted: () => checkChainIndexingStatusSnapshotsForOmnichainStatusSnapshotCompleted,
@@ -97,7 +102,7 @@ __export(index_exports, {
97
102
  decodeDNSEncodedLiteralName: () => decodeDNSEncodedLiteralName,
98
103
  decodeDNSEncodedName: () => decodeDNSEncodedName,
99
104
  decodeEncodedReferrer: () => decodeEncodedReferrer,
100
- deserializeAccountId: () => deserializeAccountId,
105
+ deserializeAssetId: () => deserializeAssetId,
101
106
  deserializeBlockNumber: () => deserializeBlockNumber,
102
107
  deserializeBlockRef: () => deserializeBlockRef,
103
108
  deserializeBlockrange: () => deserializeBlockrange,
@@ -118,18 +123,30 @@ __export(index_exports, {
118
123
  deserializeRegistrarActionsResponse: () => deserializeRegistrarActionsResponse,
119
124
  deserializeUnixTimestamp: () => deserializeUnixTimestamp,
120
125
  deserializeUrl: () => deserializeUrl,
126
+ deserializedNameTokensResponse: () => deserializedNameTokensResponse,
121
127
  durationBetween: () => durationBetween,
122
128
  encodeLabelHash: () => encodeLabelHash,
123
129
  evmChainIdToCoinType: () => evmChainIdToCoinType,
130
+ formatAccountId: () => formatAccountId,
131
+ formatAssetId: () => formatAssetId,
124
132
  formatNFTTransferEventMetadata: () => formatNFTTransferEventMetadata,
133
+ getBasenamesSubregistryId: () => getBasenamesSubregistryId,
134
+ getBasenamesSubregistryManagedName: () => getBasenamesSubregistryManagedName,
125
135
  getCurrencyInfo: () => getCurrencyInfo,
136
+ getDatasourceContract: () => getDatasourceContract,
126
137
  getENSRootChainId: () => import_datasources2.getENSRootChainId,
127
138
  getEthnamesSubregistryId: () => getEthnamesSubregistryId,
139
+ getEthnamesSubregistryManagedName: () => getEthnamesSubregistryManagedName,
128
140
  getLatestIndexedBlockRef: () => getLatestIndexedBlockRef,
141
+ getLineanamesSubregistryId: () => getLineanamesSubregistryId,
142
+ getLineanamesSubregistryManagedName: () => getLineanamesSubregistryManagedName,
129
143
  getNFTTransferType: () => getNFTTransferType,
130
144
  getNameHierarchy: () => getNameHierarchy,
145
+ getNameTokenOwnership: () => getNameTokenOwnership,
146
+ getNameWrapperAccounts: () => getNameWrapperAccounts,
131
147
  getOmnichainIndexingCursor: () => getOmnichainIndexingCursor,
132
148
  getOmnichainIndexingStatus: () => getOmnichainIndexingStatus,
149
+ getParentNameFQDN: () => getParentNameFQDN,
133
150
  getResolvePrimaryNameChainIdParam: () => getResolvePrimaryNameChainIdParam,
134
151
  getTimestampForHighestOmnichainKnownBlock: () => getTimestampForHighestOmnichainKnownBlock,
135
152
  getTimestampForLowestOmnichainStartBlock: () => getTimestampForLowestOmnichainStartBlock,
@@ -155,6 +172,10 @@ __export(index_exports, {
155
172
  literalLabelsToLiteralName: () => literalLabelsToLiteralName,
156
173
  makeENSApiPublicConfigSchema: () => makeENSApiPublicConfigSchema,
157
174
  makeSubdomainNode: () => makeSubdomainNode,
175
+ maybeGetDatasourceContract: () => maybeGetDatasourceContract,
176
+ nameTokensPrerequisites: () => nameTokensPrerequisites,
177
+ parseAccountId: () => parseAccountId,
178
+ parseAssetId: () => parseAssetId,
158
179
  parseNonNegativeInteger: () => parseNonNegativeInteger,
159
180
  parseReverseName: () => parseReverseName,
160
181
  priceDai: () => priceDai,
@@ -163,17 +184,19 @@ __export(index_exports, {
163
184
  registrarActionsFilter: () => registrarActionsFilter,
164
185
  registrarActionsPrerequisites: () => registrarActionsPrerequisites,
165
186
  reverseName: () => reverseName,
166
- serializeAccountId: () => serializeAccountId,
167
187
  serializeAssetId: () => serializeAssetId,
168
188
  serializeChainId: () => serializeChainId,
169
189
  serializeChainIndexingSnapshots: () => serializeChainIndexingSnapshots,
170
190
  serializeConfigResponse: () => serializeConfigResponse,
171
191
  serializeCrossChainIndexingStatusSnapshotOmnichain: () => serializeCrossChainIndexingStatusSnapshotOmnichain,
172
192
  serializeDatetime: () => serializeDatetime,
193
+ serializeDomainAssetId: () => serializeDomainAssetId,
173
194
  serializeENSApiPublicConfig: () => serializeENSApiPublicConfig,
174
195
  serializeENSIndexerPublicConfig: () => serializeENSIndexerPublicConfig,
175
196
  serializeIndexedChainIds: () => serializeIndexedChainIds,
176
197
  serializeIndexingStatusResponse: () => serializeIndexingStatusResponse,
198
+ serializeNameToken: () => serializeNameToken,
199
+ serializeNameTokensResponse: () => serializeNameTokensResponse,
177
200
  serializeNamedRegistrarAction: () => serializeNamedRegistrarAction,
178
201
  serializeOmnichainIndexingStatusSnapshot: () => serializeOmnichainIndexingStatusSnapshot,
179
202
  serializePrice: () => serializePrice,
@@ -181,11 +204,10 @@ __export(index_exports, {
181
204
  serializeRealtimeIndexingStatusProjection: () => serializeRealtimeIndexingStatusProjection,
182
205
  serializeReferrerDetailResponse: () => serializeReferrerDetailResponse,
183
206
  serializeReferrerLeaderboardPageResponse: () => serializeReferrerLeaderboardPageResponse,
207
+ serializeRegisteredNameTokens: () => serializeRegisteredNameTokens,
184
208
  serializeRegistrarAction: () => serializeRegistrarAction,
185
209
  serializeRegistrarActionPricing: () => serializeRegistrarActionPricing,
186
210
  serializeRegistrarActionsResponse: () => serializeRegistrarActionsResponse,
187
- serializeRegistrationLifecycle: () => serializeRegistrationLifecycle,
188
- serializeSubregistry: () => serializeSubregistry,
189
211
  serializeUrl: () => serializeUrl,
190
212
  sortChainStatusesByStartBlockAsc: () => sortChainStatusesByStartBlockAsc,
191
213
  stripNullBytes: () => stripNullBytes,
@@ -205,25 +227,6 @@ var import_v44 = require("zod/v4");
205
227
  // src/ensindexer/config/zod-schemas.ts
206
228
  var import_v43 = __toESM(require("zod/v4"), 1);
207
229
 
208
- // src/ens/is-normalized.ts
209
- var import_ens = require("viem/ens");
210
- function isNormalizedName(name) {
211
- try {
212
- return name === (0, import_ens.normalize)(name);
213
- } catch {
214
- return false;
215
- }
216
- }
217
- function isNormalizedLabel(label) {
218
- if (label === "") return false;
219
- if (label.includes(".")) return false;
220
- try {
221
- return label === (0, import_ens.normalize)(label);
222
- } catch {
223
- return false;
224
- }
225
- }
226
-
227
230
  // src/shared/account-id.ts
228
231
  var import_viem = require("viem");
229
232
  var accountIdEqual = (a, b) => {
@@ -374,9 +377,39 @@ function isEncodedLabelHash(maybeEncodedLabelHash) {
374
377
  return expectedFormatting && includesLabelHash;
375
378
  }
376
379
 
380
+ // src/ens/is-normalized.ts
381
+ var import_ens = require("viem/ens");
382
+ function isNormalizedName(name) {
383
+ try {
384
+ return name === (0, import_ens.normalize)(name);
385
+ } catch {
386
+ return false;
387
+ }
388
+ }
389
+ function isNormalizedLabel(label) {
390
+ if (label === "") return false;
391
+ if (label.includes(".")) return false;
392
+ try {
393
+ return label === (0, import_ens.normalize)(label);
394
+ } catch {
395
+ return false;
396
+ }
397
+ }
398
+
377
399
  // src/ens/names.ts
378
400
  var import_ens_normalize = require("@adraffy/ens-normalize");
401
+ var ENS_ROOT = "";
379
402
  var getNameHierarchy = (name) => name.split(".").map((_, i, labels) => labels.slice(i).join("."));
403
+ var getParentNameFQDN = (name) => {
404
+ if (name === ENS_ROOT) {
405
+ throw new Error("There is no parent name for ENS Root.");
406
+ }
407
+ const labels = name.split(".");
408
+ if (labels.length === 1) {
409
+ return ENS_ROOT;
410
+ }
411
+ return labels.slice(1).join(".");
412
+ };
380
413
  var beautifyName = (name) => {
381
414
  const beautifiedLabels = name.split(".").map((label) => {
382
415
  if (isNormalizedLabel(label)) {
@@ -619,7 +652,7 @@ var makeAccountIdSchema = (valueLabel = "AccountId") => import_v4.default.strict
619
652
  chainId: makeChainIdSchema(`${valueLabel} chain ID`),
620
653
  address: makeLowercaseAddressSchema(`${valueLabel} address`)
621
654
  });
622
- var makeSerializedAccountIdSchema = (valueLabel = "Account ID") => import_v4.default.coerce.string().transform((v) => {
655
+ var makeAccountIdStringSchema = (valueLabel = "Account ID String") => import_v4.default.coerce.string().transform((v) => {
623
656
  const result = new import_caip.AccountId(v);
624
657
  return {
625
658
  chainId: Number(result.chainId.reference),
@@ -631,7 +664,7 @@ var makeHexStringSchema = (options, valueLabel = "String representation of bytes
631
664
  ctx.issues.push({
632
665
  code: "custom",
633
666
  input: ctx.value,
634
- message: `${valueLabel} must start with '0x'.`
667
+ message: `${valueLabel} must be a hexadecimal value which starts with '0x'.`
635
668
  });
636
669
  }
637
670
  }).transform((v) => v).check(function invariant_encodesRequiredBytesCount(ctx) {
@@ -741,8 +774,8 @@ ${(0, import_v42.prettifyError)(parsed.error)}
741
774
  }
742
775
  return parsed.data;
743
776
  }
744
- function deserializeAccountId(maybeAccountId, valueLabel) {
745
- const schema = makeSerializedAccountIdSchema(valueLabel);
777
+ function parseAccountId(maybeAccountId, valueLabel) {
778
+ const schema = makeAccountIdStringSchema(valueLabel);
746
779
  const parsed = schema.safeParse(maybeAccountId);
747
780
  if (parsed.error) {
748
781
  throw new RangeError(`Cannot deserialize AccountId:
@@ -1005,6 +1038,28 @@ var TtlCache = class {
1005
1038
  // src/shared/collections.ts
1006
1039
  var uniq = (arr) => [...new Set(arr)];
1007
1040
 
1041
+ // src/shared/datasource-contract.ts
1042
+ var import_datasources3 = require("@ensnode/datasources");
1043
+ var maybeGetDatasourceContract = (namespaceId, datasourceName, contractName) => {
1044
+ const datasource = (0, import_datasources3.maybeGetDatasource)(namespaceId, datasourceName);
1045
+ if (!datasource) return void 0;
1046
+ const address = datasource.contracts[contractName]?.address;
1047
+ if (address === void 0 || Array.isArray(address)) return void 0;
1048
+ return {
1049
+ chainId: datasource.chain.id,
1050
+ address
1051
+ };
1052
+ };
1053
+ var getDatasourceContract = (namespaceId, datasourceName, contractName) => {
1054
+ const contract = maybeGetDatasourceContract(namespaceId, datasourceName, contractName);
1055
+ if (!contract) {
1056
+ throw new Error(
1057
+ `Expected contract not found for ${namespaceId} ${datasourceName} ${contractName}`
1058
+ );
1059
+ }
1060
+ return contract;
1061
+ };
1062
+
1008
1063
  // src/shared/labelhash.ts
1009
1064
  var import_viem9 = require("viem");
1010
1065
  var labelhashLiteralLabel = (label) => (0, import_viem9.keccak256)((0, import_viem9.stringToBytes)(label));
@@ -1063,7 +1118,7 @@ function serializePrice(price) {
1063
1118
  function serializePriceEth(price) {
1064
1119
  return serializePrice(price);
1065
1120
  }
1066
- function serializeAccountId(accountId) {
1121
+ function formatAccountId(accountId) {
1067
1122
  return import_caip2.AccountId.format({
1068
1123
  chainId: { namespace: "eip155", reference: accountId.chainId.toString() },
1069
1124
  address: accountId.address
@@ -1079,7 +1134,7 @@ function isWebSocketProtocol(url) {
1079
1134
  }
1080
1135
 
1081
1136
  // src/ensindexer/config/is-subgraph-compatible.ts
1082
- var import_datasources3 = require("@ensnode/datasources");
1137
+ var import_datasources4 = require("@ensnode/datasources");
1083
1138
 
1084
1139
  // src/ensindexer/config/types.ts
1085
1140
  var PluginName = /* @__PURE__ */ ((PluginName2) => {
@@ -1098,7 +1153,7 @@ function isSubgraphCompatible(config) {
1098
1153
  const onlySubgraphPluginActivated = config.plugins.length === 1 && config.plugins[0] === "subgraph" /* Subgraph */;
1099
1154
  const isSubgraphLabelSet = config.labelSet.labelSetId === "subgraph" && config.labelSet.labelSetVersion === 0;
1100
1155
  const isEnsTestEnvLabelSet = config.labelSet.labelSetId === "ens-test-env" && config.labelSet.labelSetVersion === 0;
1101
- const labelSetIsSubgraphCompatible = isSubgraphLabelSet || config.namespace === import_datasources3.ENSNamespaceIds.EnsTestEnv && isEnsTestEnvLabelSet;
1156
+ const labelSetIsSubgraphCompatible = isSubgraphLabelSet || config.namespace === import_datasources4.ENSNamespaceIds.EnsTestEnv && isEnsTestEnvLabelSet;
1102
1157
  return onlySubgraphPluginActivated && labelSetIsSubgraphCompatible;
1103
1158
  }
1104
1159
 
@@ -2036,263 +2091,859 @@ function serializeConfigResponse(response) {
2036
2091
  }
2037
2092
 
2038
2093
  // src/api/indexing-status/deserialize.ts
2039
- var import_v416 = require("zod/v4");
2094
+ var import_v410 = require("zod/v4");
2040
2095
 
2041
2096
  // src/api/indexing-status/zod-schemas.ts
2042
- var import_v415 = __toESM(require("zod/v4"), 1);
2043
-
2044
- // src/api/registrar-actions/zod-schemas.ts
2045
- var import_ens5 = require("viem/ens");
2046
- var import_v410 = __toESM(require("zod/v4"), 1);
2047
-
2048
- // src/api/shared/errors/zod-schemas.ts
2049
2097
  var import_v49 = __toESM(require("zod/v4"), 1);
2050
- var ErrorResponseSchema = import_v49.default.object({
2051
- message: import_v49.default.string(),
2052
- details: import_v49.default.optional(import_v49.default.unknown())
2053
- });
2054
2098
 
2055
- // src/api/registrar-actions/response.ts
2056
- var RegistrarActionsResponseCodes = {
2099
+ // src/api/indexing-status/response.ts
2100
+ var IndexingStatusResponseCodes = {
2057
2101
  /**
2058
- * Represents that Registrar Actions are available.
2102
+ * Represents that the indexing status is available.
2059
2103
  */
2060
2104
  Ok: "ok",
2061
2105
  /**
2062
- * Represents that Registrar Actions are unavailable.
2106
+ * Represents that the indexing status is unavailable.
2063
2107
  */
2064
2108
  Error: "error"
2065
2109
  };
2066
2110
 
2067
- // src/api/registrar-actions/zod-schemas.ts
2068
- function invariant_registrationLifecycleNodeMatchesName(ctx) {
2069
- const { name, action } = ctx.value;
2070
- const expectedNode = action.registrationLifecycle.node;
2071
- const actualNode = (0, import_ens5.namehash)(name);
2072
- if (actualNode !== expectedNode) {
2073
- ctx.issues.push({
2074
- code: "custom",
2075
- input: ctx.value,
2076
- message: `The 'action.registrationLifecycle.node' must match namehash of 'name'`
2077
- });
2078
- }
2079
- }
2080
- var makeNamedRegistrarActionSchema = (valueLabel = "Named Registrar Action") => import_v410.default.object({
2081
- action: makeRegistrarActionSchema(valueLabel),
2082
- name: makeReinterpretedNameSchema(valueLabel)
2083
- }).check(invariant_registrationLifecycleNodeMatchesName);
2084
- var makeRegistrarActionsResponseOkSchema = (valueLabel = "Registrar Actions Response OK") => import_v410.default.strictObject({
2085
- responseCode: import_v410.default.literal(RegistrarActionsResponseCodes.Ok),
2086
- registrarActions: import_v410.default.array(makeNamedRegistrarActionSchema(valueLabel))
2111
+ // src/api/indexing-status/zod-schemas.ts
2112
+ var makeIndexingStatusResponseOkSchema = (valueLabel = "Indexing Status Response OK") => import_v49.default.strictObject({
2113
+ responseCode: import_v49.default.literal(IndexingStatusResponseCodes.Ok),
2114
+ realtimeProjection: makeRealtimeIndexingStatusProjectionSchema(valueLabel)
2087
2115
  });
2088
- var makeRegistrarActionsResponseErrorSchema = (_valueLabel = "Registrar Actions Response Error") => import_v410.default.strictObject({
2089
- responseCode: import_v410.default.literal(RegistrarActionsResponseCodes.Error),
2090
- error: ErrorResponseSchema
2116
+ var makeIndexingStatusResponseErrorSchema = (_valueLabel = "Indexing Status Response Error") => import_v49.default.strictObject({
2117
+ responseCode: import_v49.default.literal(IndexingStatusResponseCodes.Error)
2091
2118
  });
2092
- var makeRegistrarActionsResponseSchema = (valueLabel = "Registrar Actions Response") => import_v410.default.discriminatedUnion("responseCode", [
2093
- makeRegistrarActionsResponseOkSchema(valueLabel),
2094
- makeRegistrarActionsResponseErrorSchema(valueLabel)
2119
+ var makeIndexingStatusResponseSchema = (valueLabel = "Indexing Status Response") => import_v49.default.discriminatedUnion("responseCode", [
2120
+ makeIndexingStatusResponseOkSchema(valueLabel),
2121
+ makeIndexingStatusResponseErrorSchema(valueLabel)
2095
2122
  ]);
2096
2123
 
2097
- // src/api/shared/pagination/zod-schemas.ts
2098
- var import_v411 = __toESM(require("zod/v4"), 1);
2099
-
2100
- // src/api/shared/pagination/request.ts
2101
- var RECORDS_PER_PAGE_DEFAULT = 10;
2102
- var RECORDS_PER_PAGE_MAX = 100;
2103
-
2104
- // ../ens-referrals/src/address.ts
2105
- var import_viem11 = require("viem");
2106
-
2107
- // ../ens-referrals/src/encoding.ts
2108
- var import_viem12 = require("viem");
2109
- var ENCODED_REFERRER_BYTE_OFFSET = 12;
2110
- var ENCODED_REFERRER_BYTE_LENGTH = 32;
2111
- var EXPECTED_ENCODED_REFERRER_PADDING = (0, import_viem12.pad)("0x", {
2112
- size: ENCODED_REFERRER_BYTE_OFFSET,
2113
- dir: "left"
2114
- });
2115
- var ZERO_ENCODED_REFERRER = (0, import_viem12.pad)("0x", {
2116
- size: ENCODED_REFERRER_BYTE_LENGTH,
2117
- dir: "left"
2118
- });
2119
- function decodeEncodedReferrer(encodedReferrer) {
2120
- if ((0, import_viem12.size)(encodedReferrer) !== ENCODED_REFERRER_BYTE_LENGTH) {
2121
- throw new Error(
2122
- `Encoded referrer value must be represented by ${ENCODED_REFERRER_BYTE_LENGTH} bytes.`
2123
- );
2124
- }
2125
- const padding = (0, import_viem12.slice)(encodedReferrer, 0, ENCODED_REFERRER_BYTE_OFFSET);
2126
- if (padding !== EXPECTED_ENCODED_REFERRER_PADDING) {
2127
- return import_viem12.zeroAddress;
2124
+ // src/api/indexing-status/deserialize.ts
2125
+ function deserializeIndexingStatusResponse(maybeResponse) {
2126
+ const parsed = makeIndexingStatusResponseSchema().safeParse(maybeResponse);
2127
+ if (parsed.error) {
2128
+ throw new Error(`Cannot deserialize IndexingStatusResponse:
2129
+ ${(0, import_v410.prettifyError)(parsed.error)}
2130
+ `);
2128
2131
  }
2129
- const decodedReferrer = (0, import_viem12.slice)(encodedReferrer, ENCODED_REFERRER_BYTE_OFFSET);
2130
- try {
2131
- return (0, import_viem12.getAddress)(decodedReferrer);
2132
- } catch {
2133
- throw new Error(`Decoded referrer value must be a valid EVM address.`);
2132
+ return parsed.data;
2133
+ }
2134
+
2135
+ // src/api/indexing-status/serialize.ts
2136
+ function serializeIndexingStatusResponse(response) {
2137
+ switch (response.responseCode) {
2138
+ case IndexingStatusResponseCodes.Ok:
2139
+ return {
2140
+ responseCode: response.responseCode,
2141
+ realtimeProjection: serializeRealtimeIndexingStatusProjection(response.realtimeProjection)
2142
+ };
2143
+ case IndexingStatusResponseCodes.Error:
2144
+ return response;
2134
2145
  }
2135
2146
  }
2136
2147
 
2137
- // ../ens-referrals/src/leaderboard-page.ts
2138
- var REFERRERS_PER_LEADERBOARD_PAGE_MAX = 100;
2148
+ // src/api/name-tokens/deserialize.ts
2149
+ var import_v415 = require("zod/v4");
2139
2150
 
2140
- // ../ens-referrals/src/link.ts
2151
+ // src/api/name-tokens/zod-schemas.ts
2152
+ var import_viem14 = require("viem");
2153
+ var import_v414 = __toESM(require("zod/v4"), 1);
2154
+
2155
+ // src/tokenscope/assets.ts
2156
+ var import_caip4 = require("caip");
2141
2157
  var import_viem13 = require("viem");
2158
+ var import_v412 = require("zod/v4");
2142
2159
 
2143
- // ../ens-referrals/src/referrer-detail.ts
2144
- var ReferrerDetailTypeIds = {
2160
+ // src/tokenscope/zod-schemas.ts
2161
+ var import_caip3 = require("caip");
2162
+ var import_viem12 = require("viem");
2163
+ var import_v411 = __toESM(require("zod/v4"), 1);
2164
+
2165
+ // src/tokenscope/name-token.ts
2166
+ var import_viem11 = require("viem");
2167
+ var import_datasources5 = require("@ensnode/datasources");
2168
+ var NameTokenOwnershipTypes = {
2145
2169
  /**
2146
- * Represents a referrer who is ranked on the leaderboard.
2170
+ * Name Token is owned by NameWrapper account.
2147
2171
  */
2148
- Ranked: "ranked",
2172
+ NameWrapper: "namewrapper",
2149
2173
  /**
2150
- * Represents a referrer who is not ranked on the leaderboard.
2174
+ * Name Token is owned fully onchain.
2175
+ *
2176
+ * This ownership type can only apply to direct subnames of `.eth`
2151
2177
  */
2152
- Unranked: "unranked"
2178
+ FullyOnchain: "fully-onchain",
2179
+ /**
2180
+ * Name Token ownership has been transferred to the null address.
2181
+ */
2182
+ Burned: "burned",
2183
+ /**
2184
+ * Name Token ownership is unknown.
2185
+ */
2186
+ Unknown: "unknown"
2153
2187
  };
2154
-
2155
- // src/registrars/zod-schemas.ts
2156
- var import_v412 = __toESM(require("zod/v4"), 1);
2157
-
2158
- // src/registrars/subregistry.ts
2159
- function serializeSubregistry(subregistry) {
2160
- return {
2161
- subregistryId: serializeAccountId(subregistry.subregistryId),
2162
- node: subregistry.node
2163
- };
2164
- }
2165
-
2166
- // src/registrars/registration-lifecycle.ts
2167
- function serializeRegistrationLifecycle(registrationLifecycle) {
2188
+ function serializeNameToken(nameToken) {
2168
2189
  return {
2169
- subregistry: serializeSubregistry(registrationLifecycle.subregistry),
2170
- node: registrationLifecycle.node,
2171
- expiresAt: registrationLifecycle.expiresAt
2190
+ token: serializeAssetId(nameToken.token),
2191
+ ownership: nameToken.ownership,
2192
+ mintStatus: nameToken.mintStatus
2172
2193
  };
2173
2194
  }
2174
-
2175
- // src/registrars/registrar-action.ts
2176
- var RegistrarActionTypes = {
2177
- Registration: "registration",
2178
- Renewal: "renewal"
2179
- };
2180
- function isRegistrarActionPricingAvailable(registrarActionPricing) {
2181
- const { baseCost, premium, total } = registrarActionPricing;
2182
- return baseCost !== null && premium !== null && total !== null;
2183
- }
2184
- function isRegistrarActionReferralAvailable(registrarActionReferral) {
2185
- const { encodedReferrer, decodedReferrer } = registrarActionReferral;
2186
- return encodedReferrer !== null && decodedReferrer !== null;
2195
+ function getNameWrapperAccounts(namespaceId) {
2196
+ const ethnamesNameWrapperAccount = getDatasourceContract(
2197
+ namespaceId,
2198
+ import_datasources5.DatasourceNames.ENSRoot,
2199
+ "NameWrapper"
2200
+ );
2201
+ const lineanamesNameWrapperAccount = maybeGetDatasourceContract(
2202
+ namespaceId,
2203
+ import_datasources5.DatasourceNames.Lineanames,
2204
+ "NameWrapper"
2205
+ );
2206
+ const nameWrapperAccounts = [
2207
+ // NameWrapper for direct subnames of .eth is defined for all ENS namespaces
2208
+ ethnamesNameWrapperAccount
2209
+ ];
2210
+ if (lineanamesNameWrapperAccount) {
2211
+ nameWrapperAccounts.push(lineanamesNameWrapperAccount);
2212
+ }
2213
+ return nameWrapperAccounts;
2187
2214
  }
2188
- function serializeRegistrarActionPricing(pricing) {
2189
- if (isRegistrarActionPricingAvailable(pricing)) {
2215
+ function getNameTokenOwnership(namespaceId, name, owner) {
2216
+ const nameWrapperAccounts = getNameWrapperAccounts(namespaceId);
2217
+ const hasNameWrapperOwnership = nameWrapperAccounts.some(
2218
+ (nameWrapperAccount) => accountIdEqual(owner, nameWrapperAccount)
2219
+ );
2220
+ if (hasNameWrapperOwnership) {
2190
2221
  return {
2191
- baseCost: serializePriceEth(pricing.baseCost),
2192
- premium: serializePriceEth(pricing.premium),
2193
- total: serializePriceEth(pricing.total)
2222
+ ownershipType: NameTokenOwnershipTypes.NameWrapper,
2223
+ owner
2224
+ };
2225
+ }
2226
+ if ((0, import_viem11.isAddressEqual)(owner.address, import_viem11.zeroAddress)) {
2227
+ return {
2228
+ ownershipType: NameTokenOwnershipTypes.Burned,
2229
+ owner
2230
+ };
2231
+ }
2232
+ const parentName = getParentNameFQDN(name);
2233
+ if (parentName === "eth") {
2234
+ return {
2235
+ ownershipType: NameTokenOwnershipTypes.FullyOnchain,
2236
+ owner
2194
2237
  };
2195
2238
  }
2196
- return pricing;
2197
- }
2198
- function serializeRegistrarAction(registrarAction) {
2199
2239
  return {
2200
- id: registrarAction.id,
2201
- type: registrarAction.type,
2202
- incrementalDuration: registrarAction.incrementalDuration,
2203
- registrant: registrarAction.registrant,
2204
- registrationLifecycle: serializeRegistrationLifecycle(registrarAction.registrationLifecycle),
2205
- pricing: serializeRegistrarActionPricing(registrarAction.pricing),
2206
- referral: registrarAction.referral,
2207
- block: registrarAction.block,
2208
- transactionHash: registrarAction.transactionHash,
2209
- eventIds: registrarAction.eventIds
2240
+ ownershipType: NameTokenOwnershipTypes.Unknown,
2241
+ owner
2210
2242
  };
2211
2243
  }
2212
2244
 
2213
- // src/registrars/zod-schemas.ts
2214
- var makeSubregistrySchema = (valueLabel = "Subregistry") => import_v412.default.object({
2215
- subregistryId: makeSerializedAccountIdSchema(`${valueLabel} Subregistry ID`),
2216
- node: makeNodeSchema(`${valueLabel} Node`)
2217
- });
2218
- var makeRegistrationLifecycleSchema = (valueLabel = "Registration Lifecycle") => import_v412.default.object({
2219
- subregistry: makeSubregistrySchema(`${valueLabel} Subregistry`),
2220
- node: makeNodeSchema(`${valueLabel} Node`),
2221
- expiresAt: makeUnixTimestampSchema(`${valueLabel} Expires at`)
2245
+ // src/tokenscope/zod-schemas.ts
2246
+ var makeAssetIdSchema = (valueLabel = "Asset ID Schema") => import_v411.default.object({
2247
+ assetNamespace: import_v411.default.enum(AssetNamespaces),
2248
+ contract: makeAccountIdSchema(valueLabel),
2249
+ tokenId: import_v411.default.preprocess((v) => typeof v === "string" ? BigInt(v) : v, import_v411.default.bigint().positive())
2222
2250
  });
2223
- function invariant_registrarActionPricingTotalIsSumOfBaseCostAndPremium(ctx) {
2224
- const { baseCost, premium, total } = ctx.value;
2225
- const actualTotal = addPrices(baseCost, premium);
2226
- if (!isPriceEqual(actualTotal, total)) {
2251
+ var makeAssetIdStringSchema = (valueLabel = "Asset ID String Schema") => import_v411.default.preprocess((v) => {
2252
+ if (typeof v === "string") {
2253
+ const result = new import_caip3.AssetId(v);
2254
+ return {
2255
+ assetNamespace: result.assetName.namespace,
2256
+ contract: {
2257
+ chainId: Number(result.chainId.reference),
2258
+ address: result.assetName.reference
2259
+ },
2260
+ tokenId: result.tokenId
2261
+ };
2262
+ }
2263
+ return v;
2264
+ }, makeAssetIdSchema(valueLabel));
2265
+ function invariant_nameTokenOwnershipHasNonZeroAddressOwner(ctx) {
2266
+ const ownership = ctx.value;
2267
+ if (ctx.value.owner.address === import_viem12.zeroAddress) {
2227
2268
  ctx.issues.push({
2228
2269
  code: "custom",
2229
2270
  input: ctx.value,
2230
- message: `'total' must be equal to the sum of 'baseCost' and 'premium'`
2271
+ message: `Name Token Ownership with '${ownership.ownershipType}' must have 'address' other than the zero address.`
2231
2272
  });
2232
2273
  }
2233
2274
  }
2234
- var makeRegistrarActionPricingSchema = (valueLabel = "Registrar Action Pricing") => import_v412.default.union([
2235
- // pricing available
2236
- import_v412.default.object({
2237
- baseCost: makePriceEthSchema(`${valueLabel} Base Cost`),
2238
- premium: makePriceEthSchema(`${valueLabel} Premium`),
2239
- total: makePriceEthSchema(`${valueLabel} Total`)
2240
- }).check(invariant_registrarActionPricingTotalIsSumOfBaseCostAndPremium).transform((v) => v),
2241
- // pricing unknown
2242
- import_v412.default.object({
2243
- baseCost: import_v412.default.null(),
2244
- premium: import_v412.default.null(),
2245
- total: import_v412.default.null()
2246
- }).transform((v) => v)
2247
- ]);
2248
- function invariant_registrarActionDecodedReferrerBasedOnRawReferrer(ctx) {
2249
- const { encodedReferrer, decodedReferrer } = ctx.value;
2250
- try {
2251
- const expectedDecodedReferrer = decodeEncodedReferrer(encodedReferrer).toLowerCase();
2252
- if (decodedReferrer !== expectedDecodedReferrer) {
2253
- ctx.issues.push({
2254
- code: "custom",
2255
- input: ctx.value,
2256
- message: `'decodedReferrer' must be based on 'encodedReferrer'`
2257
- });
2258
- }
2259
- } catch (error) {
2260
- const errorMessage = error instanceof Error ? error.message : "Unknown error";
2275
+ var makeNameTokenOwnershipNameWrapperSchema = (valueLabel = "Name Token Ownership NameWrapper") => import_v411.default.object({
2276
+ ownershipType: import_v411.default.literal(NameTokenOwnershipTypes.NameWrapper),
2277
+ owner: makeAccountIdSchema(`${valueLabel}.owner`)
2278
+ }).check(invariant_nameTokenOwnershipHasNonZeroAddressOwner);
2279
+ var makeNameTokenOwnershipFullyOnchainSchema = (valueLabel = "Name Token Ownership Fully Onchain") => import_v411.default.object({
2280
+ ownershipType: import_v411.default.literal(NameTokenOwnershipTypes.FullyOnchain),
2281
+ owner: makeAccountIdSchema(`${valueLabel}.owner`)
2282
+ }).check(invariant_nameTokenOwnershipHasNonZeroAddressOwner);
2283
+ var makeNameTokenOwnershipBurnedSchema = (valueLabel = "Name Token Ownership Burned") => import_v411.default.object({
2284
+ ownershipType: import_v411.default.literal(NameTokenOwnershipTypes.Burned),
2285
+ owner: makeAccountIdSchema(`${valueLabel}.owner`)
2286
+ }).check(invariant_nameTokenOwnershipHasZeroAddressOwner);
2287
+ var makeNameTokenOwnershipUnknownSchema = (valueLabel = "Name Token Ownership Unknown") => import_v411.default.object({
2288
+ ownershipType: import_v411.default.literal(NameTokenOwnershipTypes.Unknown),
2289
+ owner: makeAccountIdSchema(`${valueLabel}.owner`)
2290
+ }).check(invariant_nameTokenOwnershipHasNonZeroAddressOwner);
2291
+ function invariant_nameTokenOwnershipHasZeroAddressOwner(ctx) {
2292
+ const ownership = ctx.value;
2293
+ if (ctx.value.owner.address !== import_viem12.zeroAddress) {
2261
2294
  ctx.issues.push({
2262
2295
  code: "custom",
2263
2296
  input: ctx.value,
2264
- message: errorMessage
2297
+ message: `Name Token Ownership with '${ownership.ownershipType}' must have 'address' set to the zero address.`
2265
2298
  });
2266
2299
  }
2267
2300
  }
2268
- var makeRegistrarActionReferralSchema = (valueLabel = "Registrar Action Referral") => import_v412.default.union([
2269
- // referral available
2270
- import_v412.default.object({
2271
- encodedReferrer: makeHexStringSchema(
2272
- { bytesCount: ENCODED_REFERRER_BYTE_LENGTH },
2273
- `${valueLabel} Encoded Referrer`
2274
- ),
2275
- decodedReferrer: makeLowercaseAddressSchema(`${valueLabel} Decoded Referrer`)
2276
- }).check(invariant_registrarActionDecodedReferrerBasedOnRawReferrer),
2277
- // referral not applicable
2278
- import_v412.default.object({
2279
- encodedReferrer: import_v412.default.null(),
2280
- decodedReferrer: import_v412.default.null()
2281
- })
2301
+ var makeNameTokenOwnershipSchema = (valueLabel = "Name Token Ownership") => import_v411.default.discriminatedUnion("ownershipType", [
2302
+ makeNameTokenOwnershipNameWrapperSchema(valueLabel),
2303
+ makeNameTokenOwnershipFullyOnchainSchema(valueLabel),
2304
+ makeNameTokenOwnershipBurnedSchema(valueLabel),
2305
+ makeNameTokenOwnershipUnknownSchema(valueLabel)
2282
2306
  ]);
2283
- function invariant_eventIdsInitialElementIsTheActionId(ctx) {
2284
- const { id, eventIds } = ctx.value;
2285
- if (eventIds[0] !== id) {
2286
- ctx.issues.push({
2307
+ var makeNameTokenSchema = (valueLabel = "Name Token Schema") => import_v411.default.object({
2308
+ token: makeAssetIdSchema(`${valueLabel}.token`),
2309
+ ownership: makeNameTokenOwnershipSchema(`${valueLabel}.ownership`),
2310
+ mintStatus: import_v411.default.enum(NFTMintStatuses)
2311
+ });
2312
+
2313
+ // src/tokenscope/assets.ts
2314
+ var AssetNamespaces = {
2315
+ ERC721: "erc721",
2316
+ ERC1155: "erc1155"
2317
+ };
2318
+ function serializeAssetId(assetId) {
2319
+ return {
2320
+ assetNamespace: assetId.assetNamespace,
2321
+ contract: assetId.contract,
2322
+ tokenId: uint256ToHex32(assetId.tokenId)
2323
+ };
2324
+ }
2325
+ function deserializeAssetId(maybeAssetId, valueLabel) {
2326
+ const schema = makeAssetIdSchema(valueLabel);
2327
+ const parsed = schema.safeParse(maybeAssetId);
2328
+ if (parsed.error) {
2329
+ throw new RangeError(`Cannot deserialize AssetId:
2330
+ ${(0, import_v412.prettifyError)(parsed.error)}
2331
+ `);
2332
+ }
2333
+ return parsed.data;
2334
+ }
2335
+ function formatAssetId(assetId) {
2336
+ const { assetNamespace, contract, tokenId } = serializeAssetId(assetId);
2337
+ return import_caip4.AssetId.format({
2338
+ chainId: { namespace: "eip155", reference: contract.chainId.toString() },
2339
+ assetName: { namespace: assetNamespace, reference: contract.address },
2340
+ tokenId
2341
+ }).toLowerCase();
2342
+ }
2343
+ function parseAssetId(maybeAssetId, valueLabel) {
2344
+ const schema = makeAssetIdStringSchema(valueLabel);
2345
+ const parsed = schema.safeParse(maybeAssetId);
2346
+ if (parsed.error) {
2347
+ throw new RangeError(`Cannot parse AssetId:
2348
+ ${(0, import_v412.prettifyError)(parsed.error)}
2349
+ `);
2350
+ }
2351
+ return parsed.data;
2352
+ }
2353
+ var buildAssetId = (contract, tokenId, assetNamespace) => {
2354
+ return {
2355
+ assetNamespace,
2356
+ contract,
2357
+ tokenId
2358
+ };
2359
+ };
2360
+ function serializeDomainAssetId(domainAsset) {
2361
+ return {
2362
+ ...serializeAssetId(domainAsset),
2363
+ domainId: domainAsset.domainId
2364
+ };
2365
+ }
2366
+ var NFTMintStatuses = {
2367
+ Minted: "minted",
2368
+ Burned: "burned"
2369
+ };
2370
+ var formatNFTTransferEventMetadata = (metadata) => {
2371
+ const serializedAssetId = serializeAssetId(metadata.nft);
2372
+ return [
2373
+ `Event: ${metadata.eventHandlerName}`,
2374
+ `Chain ID: ${metadata.chainId}`,
2375
+ `Block Number: ${metadata.blockNumber}`,
2376
+ `Transaction Hash: ${metadata.transactionHash}`,
2377
+ `NFT: ${serializedAssetId}`
2378
+ ].map((line) => ` - ${line}`).join("\n");
2379
+ };
2380
+ var NFTTransferTypes = {
2381
+ /**
2382
+ * Initial transfer from zeroAddress to a non-zeroAddress
2383
+ * Can happen at most once to a NFT AssetId
2384
+ *
2385
+ * Invariants:
2386
+ * - NFT is not indexed and therefore has no previous mint status or owner
2387
+ * - new NFT mint status is `minted`
2388
+ * - new NFT owner is a non-zeroAddress
2389
+ */
2390
+ Mint: "mint",
2391
+ /**
2392
+ * Subsequent transfer from zeroAddress to a non-zeroAddress
2393
+ * Can happen any number of times to a NFT AssetId as it passes in a cycle from
2394
+ * mint -> burn -> remint -> burn -> remint -> ...
2395
+ *
2396
+ * Invariants:
2397
+ * - NFT is indexed
2398
+ * - previous NFT mint status was `burned`
2399
+ * - previous NFT owner is the zeroAddress
2400
+ * - new NFT mint status is `minted`
2401
+ * - new NFT owner is a non-zeroAddress
2402
+ */
2403
+ Remint: "remint",
2404
+ /**
2405
+ * Special transfer type for improperly implemented NFT contracts that allow a NFT
2406
+ * that is currently minted to be reminted before an intermediate burn.
2407
+ *
2408
+ * Transfer from zeroAddress to non-zeroAddress for an indexed NFT where the
2409
+ * previously indexed nft had status `minted` with a non-zeroAddress owner.
2410
+ *
2411
+ * Invariants:
2412
+ * - NFT is indexed
2413
+ * - previous NFT mint status was `minted`
2414
+ * - previous NFT owner was a non-zeroAddress
2415
+ * - new NFT mint status is `minted`
2416
+ * - new NFT owner is a non-zeroAddress
2417
+ */
2418
+ MintedRemint: "minted-remint",
2419
+ /**
2420
+ * Transfer from a non-zeroAddress to zeroAddress
2421
+ *
2422
+ * Invariants:
2423
+ * - NFT is indexed
2424
+ * - previous NFT mint status was `minted`
2425
+ * - previous NFT owner is a non-zeroAddress
2426
+ * - new NFT mint status is `burned`
2427
+ * - new NFT owner is the zeroAddress
2428
+ */
2429
+ Burn: "burn",
2430
+ /**
2431
+ * Transfer from a non-zeroAddress to a distinct non-zeroAddress
2432
+ *
2433
+ * Invariants:
2434
+ * - NFT is indexed
2435
+ * - previous and new NFT mint status is `minted`
2436
+ * - previous and new NFT owner are distinct non-zeroAddress
2437
+ */
2438
+ Transfer: "transfer",
2439
+ /**
2440
+ * Transfer from a non-zeroAddress to the same non-zeroAddress
2441
+ *
2442
+ * Invariants:
2443
+ * - NFT is indexed
2444
+ * - previous and new NFT mint status is `minted`
2445
+ * - previous and new NFT owner are equivalent non-zeroAddress
2446
+ */
2447
+ SelfTransfer: "self-transfer",
2448
+ /**
2449
+ * Transfer from zeroAddress to zeroAddress for an indexed NFT
2450
+ *
2451
+ * Invariants:
2452
+ * - NFT is indexed
2453
+ * - previous and new NFT mint status is `burned`
2454
+ * - previous and new NFT owner are zeroAddress
2455
+ */
2456
+ RemintBurn: "remint-burn",
2457
+ /**
2458
+ * Special transfer type for improperly implemented NFT contracts that allow a NFT
2459
+ * that is currently minted to be reminted again before an intermediate burn.
2460
+ *
2461
+ * Transfer from zeroAddress to zeroAddress for an indexed NFT where the
2462
+ * previously indexed nft had status `minted` with a non-zeroAddress owner.
2463
+ *
2464
+ * Invariants:
2465
+ * - NFT is indexed
2466
+ * - previous NFT mint status was `minted`
2467
+ * - previous NFT owner was a non-zeroAddress
2468
+ * - new NFT mint status is `burned`
2469
+ * - new NFT owner is the zeroAddress
2470
+ */
2471
+ MintedRemintBurn: "minted-remint-burn",
2472
+ /**
2473
+ * Transfer from zeroAddress to zeroAddress for an unindexed NFT
2474
+ *
2475
+ * Invariants:
2476
+ * - NFT is not indexed and therefore has no previous mint status or owner
2477
+ * - NFT should remain unindexed and without any mint status or owner
2478
+ */
2479
+ MintBurn: "mint-burn"
2480
+ };
2481
+ var getNFTTransferType = (from, to, allowMintedRemint, metadata, currentlyIndexedOwner) => {
2482
+ const isIndexed = currentlyIndexedOwner !== void 0;
2483
+ const isIndexedAsMinted = isIndexed && !(0, import_viem13.isAddressEqual)(currentlyIndexedOwner, import_viem13.zeroAddress);
2484
+ const isMint = (0, import_viem13.isAddressEqual)(from, import_viem13.zeroAddress);
2485
+ const isBurn = (0, import_viem13.isAddressEqual)(to, import_viem13.zeroAddress);
2486
+ const isSelfTransfer = (0, import_viem13.isAddressEqual)(from, to);
2487
+ if (isIndexed && !(0, import_viem13.isAddressEqual)(currentlyIndexedOwner, from)) {
2488
+ if (isMint && allowMintedRemint) {
2489
+ } else {
2490
+ throw new Error(
2491
+ `Error: Sending from ${from} conflicts with currently indexed owner ${currentlyIndexedOwner}.
2492
+ ${formatNFTTransferEventMetadata(metadata)}`
2493
+ );
2494
+ }
2495
+ }
2496
+ if (isSelfTransfer) {
2497
+ if (isMint) {
2498
+ if (!isIndexed) {
2499
+ return NFTTransferTypes.MintBurn;
2500
+ } else if (!isIndexedAsMinted) {
2501
+ return NFTTransferTypes.RemintBurn;
2502
+ } else if (allowMintedRemint) {
2503
+ return NFTTransferTypes.MintedRemintBurn;
2504
+ } else {
2505
+ throw new Error(
2506
+ `Error: Invalid state transition from minted -> remint-burn
2507
+ ${formatNFTTransferEventMetadata(metadata)}`
2508
+ );
2509
+ }
2510
+ } else {
2511
+ if (!isIndexed) {
2512
+ throw new Error(
2513
+ `Error: Invalid state transition from unindexed -> self-transfer
2514
+ ${formatNFTTransferEventMetadata(metadata)}`
2515
+ );
2516
+ } else if (!isIndexedAsMinted) {
2517
+ throw new Error(
2518
+ `Error: invalid state transition from burned -> self-transfer
2519
+ ${formatNFTTransferEventMetadata(metadata)}`
2520
+ );
2521
+ } else {
2522
+ return NFTTransferTypes.SelfTransfer;
2523
+ }
2524
+ }
2525
+ } else if (isMint) {
2526
+ if (!isIndexed) {
2527
+ return NFTTransferTypes.Mint;
2528
+ } else if (!isIndexedAsMinted) {
2529
+ return NFTTransferTypes.Remint;
2530
+ } else if (allowMintedRemint) {
2531
+ return NFTTransferTypes.MintedRemint;
2532
+ } else {
2533
+ throw new Error(
2534
+ `Error: Invalid state transition from minted -> mint
2535
+ ${formatNFTTransferEventMetadata(metadata)}`
2536
+ );
2537
+ }
2538
+ } else if (isBurn) {
2539
+ if (!isIndexed) {
2540
+ throw new Error(
2541
+ `Error: Invalid state transition from unindexed -> burn
2542
+ ${formatNFTTransferEventMetadata(metadata)}`
2543
+ );
2544
+ } else if (!isIndexedAsMinted) {
2545
+ throw new Error(
2546
+ `Error: Invalid state transition from burned -> burn
2547
+ ${formatNFTTransferEventMetadata(metadata)}`
2548
+ );
2549
+ } else {
2550
+ return NFTTransferTypes.Burn;
2551
+ }
2552
+ } else {
2553
+ if (!isIndexed) {
2554
+ throw new Error(
2555
+ `Error: Invalid state transition from unindexed -> transfer
2556
+ ${formatNFTTransferEventMetadata(metadata)}`
2557
+ );
2558
+ } else if (!isIndexedAsMinted) {
2559
+ throw new Error(
2560
+ `Error: Invalid state transition from burned -> transfer
2561
+ ${formatNFTTransferEventMetadata(metadata)}`
2562
+ );
2563
+ } else {
2564
+ return NFTTransferTypes.Transfer;
2565
+ }
2566
+ }
2567
+ };
2568
+
2569
+ // src/api/shared/errors/zod-schemas.ts
2570
+ var import_v413 = __toESM(require("zod/v4"), 1);
2571
+ var ErrorResponseSchema = import_v413.default.object({
2572
+ message: import_v413.default.string(),
2573
+ details: import_v413.default.optional(import_v413.default.unknown())
2574
+ });
2575
+
2576
+ // src/api/name-tokens/response.ts
2577
+ var NameTokensResponseCodes = {
2578
+ /**
2579
+ * Represents a response when Name Tokens API can respond with requested data.
2580
+ */
2581
+ Ok: "ok",
2582
+ /**
2583
+ * Represents a response when Name Tokens API could not respond with requested data.
2584
+ */
2585
+ Error: "error"
2586
+ };
2587
+ var NameTokensResponseErrorCodes = {
2588
+ /**
2589
+ * Name tokens not indexed
2590
+ *
2591
+ * Represents an error when tokens for the requested name are not indexed by
2592
+ * the ENSNode instance's configuration.
2593
+ */
2594
+ NameTokensNotIndexed: "name-tokens-not-indexed",
2595
+ /**
2596
+ * Unsupported ENSIndexer Config
2597
+ *
2598
+ * Represents a prerequisites error when connected ENSIndexer config lacks
2599
+ * params required to enable Name Tokens API.
2600
+ */
2601
+ EnsIndexerConfigUnsupported: "unsupported-ensindexer-config",
2602
+ /**
2603
+ * Unsupported Indexing Status
2604
+ *
2605
+ * Represents a prerequisites error when Indexing Status has not yet reached
2606
+ * status required to enable Name Tokens API.
2607
+ */
2608
+ IndexingStatusUnsupported: "unsupported-indexing-status"
2609
+ };
2610
+
2611
+ // src/api/name-tokens/zod-schemas.ts
2612
+ function invariant_nameIsAssociatedWithDomainId(ctx) {
2613
+ const { name, domainId } = ctx.value;
2614
+ if ((0, import_viem14.namehash)(name) !== domainId) {
2615
+ ctx.issues.push({
2616
+ code: "custom",
2617
+ input: ctx.value,
2618
+ message: `'name' must be associated with 'domainId': ${domainId}`
2619
+ });
2620
+ }
2621
+ }
2622
+ function invariant_nameTokensOwnershipTypeNameWrapperRequiresOwnershipTypeFullyOnchainOrUnknown(ctx) {
2623
+ const { tokens } = ctx.value;
2624
+ const containsOwnershipNameWrapper = tokens.some(
2625
+ (t) => t.ownership.ownershipType === NameTokenOwnershipTypes.NameWrapper
2626
+ );
2627
+ const containsOwnershipFullyOnchainOrUnknown = tokens.some(
2628
+ (t) => t.ownership.ownershipType === NameTokenOwnershipTypes.FullyOnchain || t.ownership.ownershipType === NameTokenOwnershipTypes.Unknown
2629
+ );
2630
+ if (containsOwnershipNameWrapper && !containsOwnershipFullyOnchainOrUnknown) {
2631
+ ctx.issues.push({
2632
+ code: "custom",
2633
+ input: ctx.value,
2634
+ message: `'tokens' must contain name token with ownership type 'fully-onchain' or 'unknown' when name token with ownership type 'namewrapper' in listed`
2635
+ });
2636
+ }
2637
+ }
2638
+ function invariant_nameTokensContainAtMostOneWithOwnershipTypeEffective(ctx) {
2639
+ const { tokens } = ctx.value;
2640
+ const tokensCountWithOwnershipFullyOnchain = tokens.filter(
2641
+ (t) => t.ownership.ownershipType === NameTokenOwnershipTypes.FullyOnchain
2642
+ ).length;
2643
+ if (tokensCountWithOwnershipFullyOnchain > 1) {
2644
+ ctx.issues.push({
2645
+ code: "custom",
2646
+ input: ctx.value,
2647
+ message: `'tokens' must contain at most one name token with ownership type 'fully-onchain', current count: ${tokensCountWithOwnershipFullyOnchain}`
2648
+ });
2649
+ }
2650
+ }
2651
+ var makeRegisteredNameTokenSchema = (valueLabel = "Registered Name Token") => import_v414.default.object({
2652
+ domainId: makeNodeSchema(`${valueLabel}.domainId`),
2653
+ name: makeReinterpretedNameSchema(valueLabel),
2654
+ tokens: import_v414.default.array(makeNameTokenSchema(`${valueLabel}.tokens`)).nonempty(),
2655
+ expiresAt: makeUnixTimestampSchema(`${valueLabel}.expiresAt`),
2656
+ accurateAsOf: makeUnixTimestampSchema(`${valueLabel}.accurateAsOf`)
2657
+ }).check(invariant_nameIsAssociatedWithDomainId).check(invariant_nameTokensContainAtMostOneWithOwnershipTypeEffective).check(invariant_nameTokensOwnershipTypeNameWrapperRequiresOwnershipTypeFullyOnchainOrUnknown);
2658
+ var makeNameTokensResponseOkSchema = (valueLabel = "Name Tokens Response OK") => import_v414.default.strictObject({
2659
+ responseCode: import_v414.default.literal(NameTokensResponseCodes.Ok),
2660
+ registeredNameTokens: makeRegisteredNameTokenSchema(`${valueLabel}.nameTokens`)
2661
+ });
2662
+ var makeNameTokensResponseErrorNameTokensNotIndexedSchema = (_valueLabel = "Name Tokens Response Error Name Not Indexed") => import_v414.default.strictObject({
2663
+ responseCode: import_v414.default.literal(NameTokensResponseCodes.Error),
2664
+ errorCode: import_v414.default.literal(NameTokensResponseErrorCodes.NameTokensNotIndexed),
2665
+ error: ErrorResponseSchema
2666
+ });
2667
+ var makeNameTokensResponseErrorEnsIndexerConfigUnsupported = (_valueLabel = "Name Tokens Response Error ENSIndexer Config Unsupported") => import_v414.default.strictObject({
2668
+ responseCode: import_v414.default.literal(NameTokensResponseCodes.Error),
2669
+ errorCode: import_v414.default.literal(NameTokensResponseErrorCodes.EnsIndexerConfigUnsupported),
2670
+ error: ErrorResponseSchema
2671
+ });
2672
+ var makeNameTokensResponseErrorNameIndexingStatusUnsupported = (_valueLabel = "Name Tokens Response Error Indexing Status Unsupported") => import_v414.default.strictObject({
2673
+ responseCode: import_v414.default.literal(NameTokensResponseCodes.Error),
2674
+ errorCode: import_v414.default.literal(NameTokensResponseErrorCodes.IndexingStatusUnsupported),
2675
+ error: ErrorResponseSchema
2676
+ });
2677
+ var makeNameTokensResponseErrorSchema = (valueLabel = "Name Tokens Response Error") => import_v414.default.discriminatedUnion("errorCode", [
2678
+ makeNameTokensResponseErrorNameTokensNotIndexedSchema(valueLabel),
2679
+ makeNameTokensResponseErrorEnsIndexerConfigUnsupported(valueLabel),
2680
+ makeNameTokensResponseErrorNameIndexingStatusUnsupported(valueLabel)
2681
+ ]);
2682
+ var makeNameTokensResponseSchema = (valueLabel = "Name Tokens Response") => import_v414.default.discriminatedUnion("responseCode", [
2683
+ makeNameTokensResponseOkSchema(valueLabel),
2684
+ makeNameTokensResponseErrorSchema(valueLabel)
2685
+ ]);
2686
+
2687
+ // src/api/name-tokens/deserialize.ts
2688
+ function deserializedNameTokensResponse(maybeResponse) {
2689
+ const parsed = makeNameTokensResponseSchema().safeParse(maybeResponse);
2690
+ if (parsed.error) {
2691
+ throw new Error(`Cannot deserialize NameTokensResponse:
2692
+ ${(0, import_v415.prettifyError)(parsed.error)}
2693
+ `);
2694
+ }
2695
+ return parsed.data;
2696
+ }
2697
+
2698
+ // src/api/name-tokens/prerequisites.ts
2699
+ var nameTokensPrerequisites = Object.freeze({
2700
+ /**
2701
+ * Required plugins to enable Name Tokens API routes.
2702
+ *
2703
+ * 1. `registrars` plugin is required so that data in the `registrationLifecycles`
2704
+ * table is populated.
2705
+ * 2. `tokenscope` plugin is required so that data in the `nameTokens`
2706
+ * table is populated.
2707
+ */
2708
+ requiredPlugins: ["registrars" /* Registrars */, "tokenscope" /* TokenScope */],
2709
+ /**
2710
+ * Check if provided ENSApiPublicConfig supports the Name Tokens API.
2711
+ */
2712
+ hasEnsIndexerConfigSupport(config) {
2713
+ return nameTokensPrerequisites.requiredPlugins.every(
2714
+ (plugin) => config.plugins.includes(plugin)
2715
+ );
2716
+ },
2717
+ /**
2718
+ * Required Indexing Status IDs
2719
+ *
2720
+ * Database indexes are created by the time the omnichain indexing status
2721
+ * is either `completed` or `following`.
2722
+ */
2723
+ supportedIndexingStatusIds: [
2724
+ OmnichainIndexingStatusIds.Completed,
2725
+ OmnichainIndexingStatusIds.Following
2726
+ ],
2727
+ /**
2728
+ * Check if provided indexing status supports the Name Tokens API.
2729
+ */
2730
+ hasIndexingStatusSupport(omnichainIndexingStatusId) {
2731
+ return nameTokensPrerequisites.supportedIndexingStatusIds.some(
2732
+ (supportedIndexingStatusId) => supportedIndexingStatusId === omnichainIndexingStatusId
2733
+ );
2734
+ }
2735
+ });
2736
+
2737
+ // src/api/name-tokens/serialize.ts
2738
+ function serializeRegisteredNameTokens({
2739
+ domainId,
2740
+ name,
2741
+ tokens,
2742
+ expiresAt,
2743
+ accurateAsOf
2744
+ }) {
2745
+ return {
2746
+ domainId,
2747
+ name,
2748
+ tokens: tokens.map(serializeNameToken),
2749
+ expiresAt,
2750
+ accurateAsOf
2751
+ };
2752
+ }
2753
+ function serializeNameTokensResponse(response) {
2754
+ switch (response.responseCode) {
2755
+ case NameTokensResponseCodes.Ok:
2756
+ return {
2757
+ responseCode: response.responseCode,
2758
+ registeredNameTokens: serializeRegisteredNameTokens(response.registeredNameTokens)
2759
+ };
2760
+ case NameTokensResponseCodes.Error:
2761
+ return response;
2762
+ }
2763
+ }
2764
+
2765
+ // src/api/registrar-actions/deserialize.ts
2766
+ var import_v419 = require("zod/v4");
2767
+
2768
+ // src/api/registrar-actions/zod-schemas.ts
2769
+ var import_ens7 = require("viem/ens");
2770
+ var import_v418 = __toESM(require("zod/v4"), 1);
2771
+
2772
+ // ../ens-referrals/src/address.ts
2773
+ var import_viem15 = require("viem");
2774
+
2775
+ // ../ens-referrals/src/encoding.ts
2776
+ var import_viem16 = require("viem");
2777
+ var ENCODED_REFERRER_BYTE_OFFSET = 12;
2778
+ var ENCODED_REFERRER_BYTE_LENGTH = 32;
2779
+ var EXPECTED_ENCODED_REFERRER_PADDING = (0, import_viem16.pad)("0x", {
2780
+ size: ENCODED_REFERRER_BYTE_OFFSET,
2781
+ dir: "left"
2782
+ });
2783
+ var ZERO_ENCODED_REFERRER = (0, import_viem16.pad)("0x", {
2784
+ size: ENCODED_REFERRER_BYTE_LENGTH,
2785
+ dir: "left"
2786
+ });
2787
+ function decodeEncodedReferrer(encodedReferrer) {
2788
+ if ((0, import_viem16.size)(encodedReferrer) !== ENCODED_REFERRER_BYTE_LENGTH) {
2789
+ throw new Error(
2790
+ `Encoded referrer value must be represented by ${ENCODED_REFERRER_BYTE_LENGTH} bytes.`
2791
+ );
2792
+ }
2793
+ const padding = (0, import_viem16.slice)(encodedReferrer, 0, ENCODED_REFERRER_BYTE_OFFSET);
2794
+ if (padding !== EXPECTED_ENCODED_REFERRER_PADDING) {
2795
+ return import_viem16.zeroAddress;
2796
+ }
2797
+ const decodedReferrer = (0, import_viem16.slice)(encodedReferrer, ENCODED_REFERRER_BYTE_OFFSET);
2798
+ try {
2799
+ return (0, import_viem16.getAddress)(decodedReferrer);
2800
+ } catch {
2801
+ throw new Error(`Decoded referrer value must be a valid EVM address.`);
2802
+ }
2803
+ }
2804
+
2805
+ // ../ens-referrals/src/leaderboard-page.ts
2806
+ var REFERRERS_PER_LEADERBOARD_PAGE_MAX = 100;
2807
+
2808
+ // ../ens-referrals/src/link.ts
2809
+ var import_viem17 = require("viem");
2810
+
2811
+ // ../ens-referrals/src/referrer-detail.ts
2812
+ var ReferrerDetailTypeIds = {
2813
+ /**
2814
+ * Represents a referrer who is ranked on the leaderboard.
2815
+ */
2816
+ Ranked: "ranked",
2817
+ /**
2818
+ * Represents a referrer who is not ranked on the leaderboard.
2819
+ */
2820
+ Unranked: "unranked"
2821
+ };
2822
+
2823
+ // src/registrars/zod-schemas.ts
2824
+ var import_v416 = __toESM(require("zod/v4"), 1);
2825
+
2826
+ // src/registrars/registrar-action.ts
2827
+ var RegistrarActionTypes = {
2828
+ Registration: "registration",
2829
+ Renewal: "renewal"
2830
+ };
2831
+ function isRegistrarActionPricingAvailable(registrarActionPricing) {
2832
+ const { baseCost, premium, total } = registrarActionPricing;
2833
+ return baseCost !== null && premium !== null && total !== null;
2834
+ }
2835
+ function isRegistrarActionReferralAvailable(registrarActionReferral) {
2836
+ const { encodedReferrer, decodedReferrer } = registrarActionReferral;
2837
+ return encodedReferrer !== null && decodedReferrer !== null;
2838
+ }
2839
+ function serializeRegistrarActionPricing(pricing) {
2840
+ if (isRegistrarActionPricingAvailable(pricing)) {
2841
+ return {
2842
+ baseCost: serializePriceEth(pricing.baseCost),
2843
+ premium: serializePriceEth(pricing.premium),
2844
+ total: serializePriceEth(pricing.total)
2845
+ };
2846
+ }
2847
+ return pricing;
2848
+ }
2849
+ function serializeRegistrarAction(registrarAction) {
2850
+ return {
2851
+ id: registrarAction.id,
2852
+ type: registrarAction.type,
2853
+ incrementalDuration: registrarAction.incrementalDuration,
2854
+ registrant: registrarAction.registrant,
2855
+ registrationLifecycle: registrarAction.registrationLifecycle,
2856
+ pricing: serializeRegistrarActionPricing(registrarAction.pricing),
2857
+ referral: registrarAction.referral,
2858
+ block: registrarAction.block,
2859
+ transactionHash: registrarAction.transactionHash,
2860
+ eventIds: registrarAction.eventIds
2861
+ };
2862
+ }
2863
+
2864
+ // src/registrars/zod-schemas.ts
2865
+ var makeSubregistrySchema = (valueLabel = "Subregistry") => import_v416.default.object({
2866
+ subregistryId: makeAccountIdSchema(`${valueLabel} Subregistry ID`),
2867
+ node: makeNodeSchema(`${valueLabel} Node`)
2868
+ });
2869
+ var makeRegistrationLifecycleSchema = (valueLabel = "Registration Lifecycle") => import_v416.default.object({
2870
+ subregistry: makeSubregistrySchema(`${valueLabel} Subregistry`),
2871
+ node: makeNodeSchema(`${valueLabel} Node`),
2872
+ expiresAt: makeUnixTimestampSchema(`${valueLabel} Expires at`)
2873
+ });
2874
+ function invariant_registrarActionPricingTotalIsSumOfBaseCostAndPremium(ctx) {
2875
+ const { baseCost, premium, total } = ctx.value;
2876
+ const actualTotal = addPrices(baseCost, premium);
2877
+ if (!isPriceEqual(actualTotal, total)) {
2878
+ ctx.issues.push({
2879
+ code: "custom",
2880
+ input: ctx.value,
2881
+ message: `'total' must be equal to the sum of 'baseCost' and 'premium'`
2882
+ });
2883
+ }
2884
+ }
2885
+ var makeRegistrarActionPricingSchema = (valueLabel = "Registrar Action Pricing") => import_v416.default.union([
2886
+ // pricing available
2887
+ import_v416.default.object({
2888
+ baseCost: makePriceEthSchema(`${valueLabel} Base Cost`),
2889
+ premium: makePriceEthSchema(`${valueLabel} Premium`),
2890
+ total: makePriceEthSchema(`${valueLabel} Total`)
2891
+ }).check(invariant_registrarActionPricingTotalIsSumOfBaseCostAndPremium).transform((v) => v),
2892
+ // pricing unknown
2893
+ import_v416.default.object({
2894
+ baseCost: import_v416.default.null(),
2895
+ premium: import_v416.default.null(),
2896
+ total: import_v416.default.null()
2897
+ }).transform((v) => v)
2898
+ ]);
2899
+ function invariant_registrarActionDecodedReferrerBasedOnRawReferrer(ctx) {
2900
+ const { encodedReferrer, decodedReferrer } = ctx.value;
2901
+ try {
2902
+ const expectedDecodedReferrer = decodeEncodedReferrer(encodedReferrer).toLowerCase();
2903
+ if (decodedReferrer !== expectedDecodedReferrer) {
2904
+ ctx.issues.push({
2905
+ code: "custom",
2906
+ input: ctx.value,
2907
+ message: `'decodedReferrer' must be based on 'encodedReferrer'`
2908
+ });
2909
+ }
2910
+ } catch (error) {
2911
+ const errorMessage = error instanceof Error ? error.message : "Unknown error";
2912
+ ctx.issues.push({
2913
+ code: "custom",
2914
+ input: ctx.value,
2915
+ message: errorMessage
2916
+ });
2917
+ }
2918
+ }
2919
+ var makeRegistrarActionReferralSchema = (valueLabel = "Registrar Action Referral") => import_v416.default.union([
2920
+ // referral available
2921
+ import_v416.default.object({
2922
+ encodedReferrer: makeHexStringSchema(
2923
+ { bytesCount: ENCODED_REFERRER_BYTE_LENGTH },
2924
+ `${valueLabel} Encoded Referrer`
2925
+ ),
2926
+ decodedReferrer: makeLowercaseAddressSchema(`${valueLabel} Decoded Referrer`)
2927
+ }).check(invariant_registrarActionDecodedReferrerBasedOnRawReferrer),
2928
+ // referral not applicable
2929
+ import_v416.default.object({
2930
+ encodedReferrer: import_v416.default.null(),
2931
+ decodedReferrer: import_v416.default.null()
2932
+ })
2933
+ ]);
2934
+ function invariant_eventIdsInitialElementIsTheActionId(ctx) {
2935
+ const { id, eventIds } = ctx.value;
2936
+ if (eventIds[0] !== id) {
2937
+ ctx.issues.push({
2287
2938
  code: "custom",
2288
2939
  input: ctx.value,
2289
2940
  message: "The initial element of `eventIds` must be the `id` value"
2290
2941
  });
2291
2942
  }
2292
2943
  }
2293
- var EventIdSchema = import_v412.default.string().nonempty();
2294
- var EventIdsSchema = import_v412.default.array(EventIdSchema).min(1).transform((v) => v);
2295
- var makeBaseRegistrarActionSchema = (valueLabel = "Base Registrar Action") => import_v412.default.object({
2944
+ var EventIdSchema = import_v416.default.string().nonempty();
2945
+ var EventIdsSchema = import_v416.default.array(EventIdSchema).min(1).transform((v) => v);
2946
+ var makeBaseRegistrarActionSchema = (valueLabel = "Base Registrar Action") => import_v416.default.object({
2296
2947
  id: EventIdSchema,
2297
2948
  incrementalDuration: makeDurationSchema(`${valueLabel} Incremental Duration`),
2298
2949
  registrant: makeLowercaseAddressSchema(`${valueLabel} Registrant`),
@@ -2306,151 +2957,135 @@ var makeBaseRegistrarActionSchema = (valueLabel = "Base Registrar Action") => im
2306
2957
  eventIds: EventIdsSchema
2307
2958
  }).check(invariant_eventIdsInitialElementIsTheActionId);
2308
2959
  var makeRegistrarActionRegistrationSchema = (valueLabel = "Registration ") => makeBaseRegistrarActionSchema(valueLabel).extend({
2309
- type: import_v412.default.literal(RegistrarActionTypes.Registration)
2960
+ type: import_v416.default.literal(RegistrarActionTypes.Registration)
2310
2961
  });
2311
2962
  var makeRegistrarActionRenewalSchema = (valueLabel = "Renewal") => makeBaseRegistrarActionSchema(valueLabel).extend({
2312
- type: import_v412.default.literal(RegistrarActionTypes.Renewal)
2963
+ type: import_v416.default.literal(RegistrarActionTypes.Renewal)
2313
2964
  });
2314
- var makeRegistrarActionSchema = (valueLabel = "Registrar Action") => import_v412.default.discriminatedUnion("type", [
2965
+ var makeRegistrarActionSchema = (valueLabel = "Registrar Action") => import_v416.default.discriminatedUnion("type", [
2315
2966
  makeRegistrarActionRegistrationSchema(`${valueLabel} Registration`),
2316
2967
  makeRegistrarActionRenewalSchema(`${valueLabel} Renewal`)
2317
2968
  ]);
2318
2969
 
2319
- // src/shared/config/build-rpc-urls.ts
2320
- var import_chains = require("viem/chains");
2970
+ // src/api/shared/pagination/zod-schemas.ts
2971
+ var import_v417 = __toESM(require("zod/v4"), 1);
2321
2972
 
2322
- // src/shared/config/rpc-configs-from-env.ts
2323
- var import_datasources4 = require("@ensnode/datasources");
2973
+ // src/api/shared/pagination/request.ts
2974
+ var RECORDS_PER_PAGE_DEFAULT = 10;
2975
+ var RECORDS_PER_PAGE_MAX = 100;
2324
2976
 
2325
- // src/shared/config/validatons.ts
2326
- var import_datasources5 = require("@ensnode/datasources");
2327
- function invariant_rpcEndpointConfigIncludesAtLeastOneHTTPProtocolURL(ctx) {
2328
- const endpoints = ctx.value;
2329
- const httpEndpoints = endpoints.filter(isHttpProtocol);
2330
- if (httpEndpoints.length < 1) {
2977
+ // src/api/shared/pagination/zod-schemas.ts
2978
+ var makeRequestPageParamsSchema = (valueLabel = "RequestPageParams") => import_v417.default.object({
2979
+ page: makePositiveIntegerSchema(`${valueLabel}.page`),
2980
+ recordsPerPage: makePositiveIntegerSchema(`${valueLabel}.recordsPerPage`).max(
2981
+ RECORDS_PER_PAGE_MAX,
2982
+ `${valueLabel}.recordsPerPage must not exceed ${RECORDS_PER_PAGE_MAX}`
2983
+ )
2984
+ });
2985
+ var makeResponsePageContextSchemaWithNoRecords = (valueLabel = "ResponsePageContextWithNoRecords") => import_v417.default.object({
2986
+ totalRecords: import_v417.default.literal(0),
2987
+ totalPages: import_v417.default.literal(1),
2988
+ hasNext: import_v417.default.literal(false),
2989
+ hasPrev: import_v417.default.literal(false),
2990
+ startIndex: import_v417.default.undefined(),
2991
+ endIndex: import_v417.default.undefined()
2992
+ }).extend(makeRequestPageParamsSchema(valueLabel).shape);
2993
+ function invariant_responsePageWithRecordsIsCorrect(ctx) {
2994
+ const { hasNext, hasPrev, recordsPerPage, page, totalRecords, startIndex, endIndex } = ctx.value;
2995
+ const expectedHasNext = page * recordsPerPage < totalRecords;
2996
+ if (hasNext !== expectedHasNext) {
2331
2997
  ctx.issues.push({
2332
2998
  code: "custom",
2333
- input: endpoints,
2334
- message: `RPC endpoint configuration for a chain must include at least one http/https protocol URL.`
2999
+ input: ctx.value,
3000
+ message: `hasNext must be equal to '${expectedHasNext ? "true" : "false"}'`
2335
3001
  });
2336
3002
  }
2337
- }
2338
- function invariant_rpcEndpointConfigIncludesAtMostOneWebSocketsProtocolURL(ctx) {
2339
- const endpoints = ctx.value;
2340
- const wsEndpoints = endpoints.filter(isWebSocketProtocol);
2341
- if (wsEndpoints.length > 1) {
3003
+ const expectedHasPrev = page > 1;
3004
+ if (hasPrev !== expectedHasPrev) {
2342
3005
  ctx.issues.push({
2343
3006
  code: "custom",
2344
- input: endpoints,
2345
- message: `RPC endpoint configuration for a chain must include at most one websocket (ws/wss) protocol URL.`
3007
+ input: ctx.value,
3008
+ message: `hasPrev must be equal to '${expectedHasPrev ? "true" : "false"}'`
2346
3009
  });
2347
3010
  }
2348
- }
2349
-
2350
- // src/shared/config/zod-schemas.ts
2351
- var import_v413 = require("zod/v4");
2352
- var import_datasources6 = require("@ensnode/datasources");
2353
- var DatabaseSchemaNameSchema = import_v413.z.string({
2354
- error: "DATABASE_SCHEMA is required."
2355
- }).trim().min(1, {
2356
- error: "DATABASE_SCHEMA is required and cannot be an empty string."
2357
- });
2358
- var RpcConfigSchema = import_v413.z.string().transform((val) => val.split(",")).pipe(import_v413.z.array(makeUrlSchema("RPC URL"))).check(invariant_rpcEndpointConfigIncludesAtLeastOneHTTPProtocolURL).check(invariant_rpcEndpointConfigIncludesAtMostOneWebSocketsProtocolURL);
2359
- var RpcConfigsSchema = import_v413.z.record(makeChainIdStringSchema("RPC URL"), RpcConfigSchema, {
2360
- error: "Chains configuration must be an object mapping valid chain IDs to their configs."
2361
- }).transform((records) => {
2362
- const rpcConfigs = /* @__PURE__ */ new Map();
2363
- for (const [chainIdString, rpcConfig] of Object.entries(records)) {
2364
- const httpRPCs = rpcConfig.filter(isHttpProtocol);
2365
- const websocketRPC = rpcConfig.find(isWebSocketProtocol);
2366
- rpcConfigs.set(deserializeChainId(chainIdString), {
2367
- httpRPCs,
2368
- websocketRPC
3011
+ if (endIndex < startIndex) {
3012
+ ctx.issues.push({
3013
+ code: "custom",
3014
+ input: ctx.value,
3015
+ message: `endIndex must be greater than or equal to startIndex`
2369
3016
  });
2370
3017
  }
2371
- return rpcConfigs;
2372
- });
2373
- var EnsIndexerUrlSchema = makeUrlSchema("ENSINDEXER_URL");
2374
- var ENSNamespaceSchema = import_v413.z.enum(import_datasources6.ENSNamespaceIds, {
2375
- error: ({ input }) => `Invalid NAMESPACE. Got '${input}', but supported ENS namespaces are: ${Object.keys(import_datasources6.ENSNamespaceIds).join(", ")}`
2376
- });
2377
- var PortSchema = import_v413.z.coerce.number({ error: "PORT must be a number." }).min(1, { error: "PORT must be greater than 1." }).max(65535, { error: "PORT must be less than 65535" }).optional();
2378
- var TheGraphApiKeySchema = import_v413.z.string().optional();
2379
-
2380
- // src/shared/datasources-with-resolvers.ts
2381
- var import_datasources7 = require("@ensnode/datasources");
2382
- var DATASOURCE_NAMES_WITH_RESOLVERS = [
2383
- import_datasources7.DatasourceNames.ENSRoot,
2384
- import_datasources7.DatasourceNames.Basenames,
2385
- import_datasources7.DatasourceNames.Lineanames,
2386
- import_datasources7.DatasourceNames.ThreeDNSOptimism,
2387
- import_datasources7.DatasourceNames.ThreeDNSBase
2388
- ];
2389
-
2390
- // src/shared/log-level.ts
2391
- var import_v414 = require("zod/v4");
2392
- var LogLevelSchema = import_v414.z.enum(["fatal", "error", "warn", "info", "debug", "trace", "silent"]);
2393
-
2394
- // src/shared/protocol-acceleration/interpret-record-values.ts
2395
- var import_viem14 = require("viem");
3018
+ if (endIndex >= totalRecords) {
3019
+ ctx.issues.push({
3020
+ code: "custom",
3021
+ input: ctx.value,
3022
+ message: `endIndex must be lower than totalRecords`
3023
+ });
3024
+ }
3025
+ }
3026
+ var makeResponsePageContextSchemaWithRecords = (valueLabel = "ResponsePageContextWithRecords") => import_v417.default.object({
3027
+ totalRecords: makePositiveIntegerSchema(`${valueLabel}.totalRecords`),
3028
+ totalPages: makePositiveIntegerSchema(`${valueLabel}.totalPages`),
3029
+ hasNext: import_v417.default.boolean(),
3030
+ hasPrev: import_v417.default.boolean(),
3031
+ startIndex: makeNonNegativeIntegerSchema(`${valueLabel}.startIndex`),
3032
+ endIndex: makeNonNegativeIntegerSchema(`${valueLabel}.endIndex`)
3033
+ }).extend(makeRequestPageParamsSchema(valueLabel).shape).check(invariant_responsePageWithRecordsIsCorrect);
3034
+ var makeResponsePageContextSchema = (valueLabel = "ResponsePageContext") => import_v417.default.union([
3035
+ makeResponsePageContextSchemaWithNoRecords(valueLabel),
3036
+ makeResponsePageContextSchemaWithRecords(valueLabel)
3037
+ ]);
2396
3038
 
2397
- // src/api/indexing-status/response.ts
2398
- var IndexingStatusResponseCodes = {
3039
+ // src/api/registrar-actions/response.ts
3040
+ var RegistrarActionsResponseCodes = {
2399
3041
  /**
2400
- * Represents that the indexing status is available.
3042
+ * Represents that Registrar Actions are available.
2401
3043
  */
2402
3044
  Ok: "ok",
2403
3045
  /**
2404
- * Represents that the indexing status is unavailable.
3046
+ * Represents that Registrar Actions are unavailable.
2405
3047
  */
2406
3048
  Error: "error"
2407
3049
  };
2408
3050
 
2409
- // src/api/indexing-status/zod-schemas.ts
2410
- var makeIndexingStatusResponseOkSchema = (valueLabel = "Indexing Status Response OK") => import_v415.default.strictObject({
2411
- responseCode: import_v415.default.literal(IndexingStatusResponseCodes.Ok),
2412
- realtimeProjection: makeRealtimeIndexingStatusProjectionSchema(valueLabel)
3051
+ // src/api/registrar-actions/zod-schemas.ts
3052
+ function invariant_registrationLifecycleNodeMatchesName(ctx) {
3053
+ const { name, action } = ctx.value;
3054
+ const expectedNode = action.registrationLifecycle.node;
3055
+ const actualNode = (0, import_ens7.namehash)(name);
3056
+ if (actualNode !== expectedNode) {
3057
+ ctx.issues.push({
3058
+ code: "custom",
3059
+ input: ctx.value,
3060
+ message: `The 'action.registrationLifecycle.node' must match namehash of 'name'`
3061
+ });
3062
+ }
3063
+ }
3064
+ var makeNamedRegistrarActionSchema = (valueLabel = "Named Registrar Action") => import_v418.default.object({
3065
+ action: makeRegistrarActionSchema(valueLabel),
3066
+ name: makeReinterpretedNameSchema(valueLabel)
3067
+ }).check(invariant_registrationLifecycleNodeMatchesName);
3068
+ var makeRegistrarActionsResponseOkSchema = (valueLabel = "Registrar Actions Response OK") => import_v418.default.strictObject({
3069
+ responseCode: import_v418.default.literal(RegistrarActionsResponseCodes.Ok),
3070
+ registrarActions: import_v418.default.array(makeNamedRegistrarActionSchema(valueLabel)),
3071
+ pageContext: makeResponsePageContextSchema(`${valueLabel}.pageContext`)
2413
3072
  });
2414
- var makeIndexingStatusResponseErrorSchema = (_valueLabel = "Indexing Status Response Error") => import_v415.default.strictObject({
2415
- responseCode: import_v415.default.literal(IndexingStatusResponseCodes.Error)
3073
+ var makeRegistrarActionsResponseErrorSchema = (_valueLabel = "Registrar Actions Response Error") => import_v418.default.strictObject({
3074
+ responseCode: import_v418.default.literal(RegistrarActionsResponseCodes.Error),
3075
+ error: ErrorResponseSchema
2416
3076
  });
2417
- var makeIndexingStatusResponseSchema = (valueLabel = "Indexing Status Response") => import_v415.default.discriminatedUnion("responseCode", [
2418
- makeIndexingStatusResponseOkSchema(valueLabel),
2419
- makeIndexingStatusResponseErrorSchema(valueLabel)
3077
+ var makeRegistrarActionsResponseSchema = (valueLabel = "Registrar Actions Response") => import_v418.default.discriminatedUnion("responseCode", [
3078
+ makeRegistrarActionsResponseOkSchema(valueLabel),
3079
+ makeRegistrarActionsResponseErrorSchema(valueLabel)
2420
3080
  ]);
2421
3081
 
2422
- // src/api/indexing-status/deserialize.ts
2423
- function deserializeIndexingStatusResponse(maybeResponse) {
2424
- const parsed = makeIndexingStatusResponseSchema().safeParse(maybeResponse);
2425
- if (parsed.error) {
2426
- throw new Error(`Cannot deserialize IndexingStatusResponse:
2427
- ${(0, import_v416.prettifyError)(parsed.error)}
2428
- `);
2429
- }
2430
- return parsed.data;
2431
- }
2432
-
2433
- // src/api/indexing-status/serialize.ts
2434
- function serializeIndexingStatusResponse(response) {
2435
- switch (response.responseCode) {
2436
- case IndexingStatusResponseCodes.Ok:
2437
- return {
2438
- responseCode: response.responseCode,
2439
- realtimeProjection: serializeRealtimeIndexingStatusProjection(response.realtimeProjection)
2440
- };
2441
- case IndexingStatusResponseCodes.Error:
2442
- return response;
2443
- }
2444
- }
2445
-
2446
3082
  // src/api/registrar-actions/deserialize.ts
2447
- var import_v417 = require("zod/v4");
2448
3083
  function deserializeRegistrarActionsResponse(maybeResponse) {
2449
3084
  const parsed = makeRegistrarActionsResponseSchema().safeParse(maybeResponse);
2450
3085
  if (parsed.error) {
2451
3086
  throw new Error(
2452
3087
  `Cannot deserialize RegistrarActionsResponse:
2453
- ${(0, import_v417.prettifyError)(parsed.error)}
3088
+ ${(0, import_v419.prettifyError)(parsed.error)}
2454
3089
  `
2455
3090
  );
2456
3091
  }
@@ -2460,7 +3095,8 @@ ${(0, import_v417.prettifyError)(parsed.error)}
2460
3095
  // src/api/registrar-actions/request.ts
2461
3096
  var RegistrarActionsFilterTypes = {
2462
3097
  BySubregistryNode: "bySubregistryNode",
2463
- WithEncodedReferral: "withEncodedReferral"
3098
+ WithEncodedReferral: "withEncodedReferral",
3099
+ ByDecodedReferrer: "byDecodedReferrer"
2464
3100
  };
2465
3101
  var RegistrarActionsOrders = {
2466
3102
  LatestRegistrarActions: "orderBy[timestamp]=desc"
@@ -2484,9 +3120,19 @@ function withReferral(withReferral2) {
2484
3120
  filterType: RegistrarActionsFilterTypes.WithEncodedReferral
2485
3121
  };
2486
3122
  }
3123
+ function byDecodedReferrer(decodedReferrer) {
3124
+ if (typeof decodedReferrer === "undefined") {
3125
+ return void 0;
3126
+ }
3127
+ return {
3128
+ filterType: RegistrarActionsFilterTypes.ByDecodedReferrer,
3129
+ value: decodedReferrer
3130
+ };
3131
+ }
2487
3132
  var registrarActionsFilter = {
2488
3133
  byParentNode,
2489
- withReferral
3134
+ withReferral,
3135
+ byDecodedReferrer
2490
3136
  };
2491
3137
 
2492
3138
  // src/api/registrar-actions/prerequisites.ts
@@ -2539,12 +3185,68 @@ var registrarActionsPrerequisites = Object.freeze({
2539
3185
  }
2540
3186
  });
2541
3187
 
3188
+ // src/registrars/basenames-subregistry.ts
3189
+ var import_datasources6 = require("@ensnode/datasources");
3190
+ function getBasenamesSubregistryId(namespace) {
3191
+ const datasource = (0, import_datasources6.maybeGetDatasource)(namespace, import_datasources6.DatasourceNames.Basenames);
3192
+ if (!datasource) {
3193
+ throw new Error(`Datasource not found for ${namespace} ${import_datasources6.DatasourceNames.Basenames}`);
3194
+ }
3195
+ const address = datasource.contracts.BaseRegistrar?.address;
3196
+ if (address === void 0 || Array.isArray(address)) {
3197
+ throw new Error(`BaseRegistrar contract not found or has multiple addresses for ${namespace}`);
3198
+ }
3199
+ return {
3200
+ chainId: datasource.chain.id,
3201
+ address
3202
+ };
3203
+ }
3204
+ function getBasenamesSubregistryManagedName(namespaceId) {
3205
+ switch (namespaceId) {
3206
+ case import_datasources6.ENSNamespaceIds.Mainnet:
3207
+ return "base.eth";
3208
+ case import_datasources6.ENSNamespaceIds.Sepolia:
3209
+ return "basetest.eth";
3210
+ case import_datasources6.ENSNamespaceIds.Holesky:
3211
+ case import_datasources6.ENSNamespaceIds.EnsTestEnv:
3212
+ throw new Error(
3213
+ `No registrar managed name is known for the 'basenames' subregistry within the "${namespaceId}" namespace.`
3214
+ );
3215
+ }
3216
+ }
3217
+
2542
3218
  // src/registrars/ethnames-subregistry.ts
2543
- var import_datasources8 = require("@ensnode/datasources");
3219
+ var import_datasources7 = require("@ensnode/datasources");
2544
3220
  function getEthnamesSubregistryId(namespace) {
2545
- const datasource = (0, import_datasources8.maybeGetDatasource)(namespace, import_datasources8.DatasourceNames.ENSRoot);
3221
+ const datasource = (0, import_datasources7.maybeGetDatasource)(namespace, import_datasources7.DatasourceNames.ENSRoot);
3222
+ if (!datasource) {
3223
+ throw new Error(`Datasource not found for ${namespace} ${import_datasources7.DatasourceNames.ENSRoot}`);
3224
+ }
3225
+ const address = datasource.contracts.BaseRegistrar?.address;
3226
+ if (address === void 0 || Array.isArray(address)) {
3227
+ throw new Error(`BaseRegistrar contract not found or has multiple addresses for ${namespace}`);
3228
+ }
3229
+ return {
3230
+ chainId: datasource.chain.id,
3231
+ address
3232
+ };
3233
+ }
3234
+ function getEthnamesSubregistryManagedName(namespaceId) {
3235
+ switch (namespaceId) {
3236
+ case import_datasources7.ENSNamespaceIds.Mainnet:
3237
+ case import_datasources7.ENSNamespaceIds.Sepolia:
3238
+ case import_datasources7.ENSNamespaceIds.Holesky:
3239
+ case import_datasources7.ENSNamespaceIds.EnsTestEnv:
3240
+ return "eth";
3241
+ }
3242
+ }
3243
+
3244
+ // src/registrars/lineanames-subregistry.ts
3245
+ var import_datasources8 = require("@ensnode/datasources");
3246
+ function getLineanamesSubregistryId(namespace) {
3247
+ const datasource = (0, import_datasources8.maybeGetDatasource)(namespace, import_datasources8.DatasourceNames.Lineanames);
2546
3248
  if (!datasource) {
2547
- throw new Error(`Datasource not found for ${namespace} ${import_datasources8.DatasourceNames.ENSRoot}`);
3249
+ throw new Error(`Datasource not found for ${namespace} ${import_datasources8.DatasourceNames.Lineanames}`);
2548
3250
  }
2549
3251
  const address = datasource.contracts.BaseRegistrar?.address;
2550
3252
  if (address === void 0 || Array.isArray(address)) {
@@ -2555,6 +3257,19 @@ function getEthnamesSubregistryId(namespace) {
2555
3257
  address
2556
3258
  };
2557
3259
  }
3260
+ function getLineanamesSubregistryManagedName(namespaceId) {
3261
+ switch (namespaceId) {
3262
+ case import_datasources8.ENSNamespaceIds.Mainnet:
3263
+ return "linea.eth";
3264
+ case import_datasources8.ENSNamespaceIds.Sepolia:
3265
+ return "linea-sepolia.eth";
3266
+ case import_datasources8.ENSNamespaceIds.Holesky:
3267
+ case import_datasources8.ENSNamespaceIds.EnsTestEnv:
3268
+ throw new Error(
3269
+ `No registrar managed name is known for the 'Lineanames' subregistry within the "${namespaceId}" namespace.`
3270
+ );
3271
+ }
3272
+ }
2558
3273
 
2559
3274
  // src/api/registrar-actions/serialize.ts
2560
3275
  function serializeNamedRegistrarAction({
@@ -2571,7 +3286,8 @@ function serializeRegistrarActionsResponse(response) {
2571
3286
  case RegistrarActionsResponseCodes.Ok:
2572
3287
  return {
2573
3288
  responseCode: response.responseCode,
2574
- registrarActions: response.registrarActions.map(serializeNamedRegistrarAction)
3289
+ registrarActions: response.registrarActions.map(serializeNamedRegistrarAction),
3290
+ pageContext: response.pageContext
2575
3291
  };
2576
3292
  case RegistrarActionsResponseCodes.Error:
2577
3293
  return response;
@@ -2579,17 +3295,52 @@ function serializeRegistrarActionsResponse(response) {
2579
3295
  }
2580
3296
 
2581
3297
  // src/api/shared/errors/deserialize.ts
2582
- var import_v418 = require("zod/v4");
3298
+ var import_v420 = require("zod/v4");
2583
3299
  function deserializeErrorResponse(maybeErrorResponse) {
2584
3300
  const parsed = ErrorResponseSchema.safeParse(maybeErrorResponse);
2585
3301
  if (parsed.error) {
2586
3302
  throw new Error(`Cannot deserialize ErrorResponse:
2587
- ${(0, import_v418.prettifyError)(parsed.error)}
3303
+ ${(0, import_v420.prettifyError)(parsed.error)}
2588
3304
  `);
2589
3305
  }
2590
3306
  return parsed.data;
2591
3307
  }
2592
3308
 
3309
+ // src/api/shared/pagination/build-page-context.ts
3310
+ function buildPageContext(page, recordsPerPage, totalRecords) {
3311
+ const totalPages = Math.max(1, Math.ceil(totalRecords / recordsPerPage));
3312
+ if (page > totalPages) {
3313
+ throw new Error(`Invalid page: page ${page} exceeds total pages ${totalPages}.`);
3314
+ }
3315
+ if (totalRecords === 0) {
3316
+ return {
3317
+ page,
3318
+ recordsPerPage,
3319
+ totalRecords: 0,
3320
+ totalPages: 1,
3321
+ hasNext: false,
3322
+ hasPrev: false,
3323
+ startIndex: void 0,
3324
+ endIndex: void 0
3325
+ };
3326
+ }
3327
+ const startIndex = (page - 1) * recordsPerPage;
3328
+ const maxTheoreticalIndexOnPage = startIndex + (recordsPerPage - 1);
3329
+ const endIndex = Math.min(maxTheoreticalIndexOnPage, totalRecords - 1);
3330
+ const hasNext = maxTheoreticalIndexOnPage < totalRecords - 1;
3331
+ const hasPrev = page > 1;
3332
+ return {
3333
+ page,
3334
+ recordsPerPage,
3335
+ totalRecords,
3336
+ totalPages,
3337
+ hasNext,
3338
+ hasPrev,
3339
+ startIndex,
3340
+ endIndex
3341
+ };
3342
+ }
3343
+
2593
3344
  // src/client-error.ts
2594
3345
  var ClientError = class _ClientError extends Error {
2595
3346
  details;
@@ -2604,10 +3355,10 @@ var ClientError = class _ClientError extends Error {
2604
3355
  };
2605
3356
 
2606
3357
  // src/ensanalytics/deserialize.ts
2607
- var import_v420 = require("zod/v4");
3358
+ var import_v422 = require("zod/v4");
2608
3359
 
2609
3360
  // src/ensanalytics/zod-schemas.ts
2610
- var import_v419 = __toESM(require("zod/v4"), 1);
3361
+ var import_v421 = __toESM(require("zod/v4"), 1);
2611
3362
 
2612
3363
  // src/ensanalytics/types.ts
2613
3364
  var ReferrerLeaderboardPageResponseCodes = {
@@ -2632,20 +3383,20 @@ var ReferrerDetailResponseCodes = {
2632
3383
  };
2633
3384
 
2634
3385
  // src/ensanalytics/zod-schemas.ts
2635
- var makeReferralProgramRulesSchema = (valueLabel = "ReferralProgramRules") => import_v419.default.object({
3386
+ var makeReferralProgramRulesSchema = (valueLabel = "ReferralProgramRules") => import_v421.default.object({
2636
3387
  totalAwardPoolValue: makeFiniteNonNegativeNumberSchema(`${valueLabel}.totalAwardPoolValue`),
2637
3388
  maxQualifiedReferrers: makeNonNegativeIntegerSchema(`${valueLabel}.maxQualifiedReferrers`),
2638
3389
  startTime: makeUnixTimestampSchema(`${valueLabel}.startTime`),
2639
3390
  endTime: makeUnixTimestampSchema(`${valueLabel}.endTime`),
2640
3391
  subregistryId: makeAccountIdSchema(`${valueLabel}.subregistryId`)
2641
3392
  });
2642
- var makeAwardedReferrerMetricsSchema = (valueLabel = "AwardedReferrerMetrics") => import_v419.default.object({
3393
+ var makeAwardedReferrerMetricsSchema = (valueLabel = "AwardedReferrerMetrics") => import_v421.default.object({
2643
3394
  referrer: makeLowercaseAddressSchema(`${valueLabel}.referrer`),
2644
3395
  totalReferrals: makeNonNegativeIntegerSchema(`${valueLabel}.totalReferrals`),
2645
3396
  totalIncrementalDuration: makeDurationSchema(`${valueLabel}.totalIncrementalDuration`),
2646
3397
  score: makeFiniteNonNegativeNumberSchema(`${valueLabel}.score`),
2647
3398
  rank: makePositiveIntegerSchema(`${valueLabel}.rank`),
2648
- isQualified: import_v419.default.boolean(),
3399
+ isQualified: import_v421.default.boolean(),
2649
3400
  finalScoreBoost: makeFiniteNonNegativeNumberSchema(`${valueLabel}.finalScoreBoost`).max(
2650
3401
  1,
2651
3402
  `${valueLabel}.finalScoreBoost must be <= 1`
@@ -2657,13 +3408,13 @@ var makeAwardedReferrerMetricsSchema = (valueLabel = "AwardedReferrerMetrics") =
2657
3408
  ),
2658
3409
  awardPoolApproxValue: makeFiniteNonNegativeNumberSchema(`${valueLabel}.awardPoolApproxValue`)
2659
3410
  });
2660
- var makeUnrankedReferrerMetricsSchema = (valueLabel = "UnrankedReferrerMetrics") => import_v419.default.object({
3411
+ var makeUnrankedReferrerMetricsSchema = (valueLabel = "UnrankedReferrerMetrics") => import_v421.default.object({
2661
3412
  referrer: makeLowercaseAddressSchema(`${valueLabel}.referrer`),
2662
3413
  totalReferrals: makeNonNegativeIntegerSchema(`${valueLabel}.totalReferrals`),
2663
3414
  totalIncrementalDuration: makeDurationSchema(`${valueLabel}.totalIncrementalDuration`),
2664
3415
  score: makeFiniteNonNegativeNumberSchema(`${valueLabel}.score`),
2665
- rank: import_v419.default.null(),
2666
- isQualified: import_v419.default.literal(false),
3416
+ rank: import_v421.default.null(),
3417
+ isQualified: import_v421.default.literal(false),
2667
3418
  finalScoreBoost: makeFiniteNonNegativeNumberSchema(`${valueLabel}.finalScoreBoost`).max(
2668
3419
  1,
2669
3420
  `${valueLabel}.finalScoreBoost must be <= 1`
@@ -2675,7 +3426,7 @@ var makeUnrankedReferrerMetricsSchema = (valueLabel = "UnrankedReferrerMetrics")
2675
3426
  ),
2676
3427
  awardPoolApproxValue: makeFiniteNonNegativeNumberSchema(`${valueLabel}.awardPoolApproxValue`)
2677
3428
  });
2678
- var makeAggregatedReferrerMetricsSchema = (valueLabel = "AggregatedReferrerMetrics") => import_v419.default.object({
3429
+ var makeAggregatedReferrerMetricsSchema = (valueLabel = "AggregatedReferrerMetrics") => import_v421.default.object({
2679
3430
  grandTotalReferrals: makeNonNegativeIntegerSchema(`${valueLabel}.grandTotalReferrals`),
2680
3431
  grandTotalIncrementalDuration: makeDurationSchema(
2681
3432
  `${valueLabel}.grandTotalIncrementalDuration`
@@ -2687,66 +3438,66 @@ var makeAggregatedReferrerMetricsSchema = (valueLabel = "AggregatedReferrerMetri
2687
3438
  `${valueLabel}.minFinalScoreToQualify`
2688
3439
  )
2689
3440
  });
2690
- var makeReferrerLeaderboardPageContextSchema = (valueLabel = "ReferrerLeaderboardPageContext") => import_v419.default.object({
3441
+ var makeReferrerLeaderboardPageContextSchema = (valueLabel = "ReferrerLeaderboardPageContext") => import_v421.default.object({
2691
3442
  page: makePositiveIntegerSchema(`${valueLabel}.page`),
2692
- itemsPerPage: makePositiveIntegerSchema(`${valueLabel}.itemsPerPage`).max(
3443
+ recordsPerPage: makePositiveIntegerSchema(`${valueLabel}.recordsPerPage`).max(
2693
3444
  REFERRERS_PER_LEADERBOARD_PAGE_MAX,
2694
- `${valueLabel}.itemsPerPage must not exceed ${REFERRERS_PER_LEADERBOARD_PAGE_MAX}`
3445
+ `${valueLabel}.recordsPerPage must not exceed ${REFERRERS_PER_LEADERBOARD_PAGE_MAX}`
2695
3446
  ),
2696
3447
  totalRecords: makeNonNegativeIntegerSchema(`${valueLabel}.totalRecords`),
2697
3448
  totalPages: makePositiveIntegerSchema(`${valueLabel}.totalPages`),
2698
- hasNext: import_v419.default.boolean(),
2699
- hasPrev: import_v419.default.boolean(),
2700
- startIndex: import_v419.default.optional(makeNonNegativeIntegerSchema(`${valueLabel}.startIndex`)),
2701
- endIndex: import_v419.default.optional(makeNonNegativeIntegerSchema(`${valueLabel}.endIndex`))
3449
+ hasNext: import_v421.default.boolean(),
3450
+ hasPrev: import_v421.default.boolean(),
3451
+ startIndex: import_v421.default.optional(makeNonNegativeIntegerSchema(`${valueLabel}.startIndex`)),
3452
+ endIndex: import_v421.default.optional(makeNonNegativeIntegerSchema(`${valueLabel}.endIndex`))
2702
3453
  });
2703
- var makeReferrerLeaderboardPageSchema = (valueLabel = "ReferrerLeaderboardPage") => import_v419.default.object({
3454
+ var makeReferrerLeaderboardPageSchema = (valueLabel = "ReferrerLeaderboardPage") => import_v421.default.object({
2704
3455
  rules: makeReferralProgramRulesSchema(`${valueLabel}.rules`),
2705
- referrers: import_v419.default.array(makeAwardedReferrerMetricsSchema(`${valueLabel}.referrers[item]`)),
3456
+ referrers: import_v421.default.array(makeAwardedReferrerMetricsSchema(`${valueLabel}.referrers[record]`)),
2706
3457
  aggregatedMetrics: makeAggregatedReferrerMetricsSchema(`${valueLabel}.aggregatedMetrics`),
2707
- paginationContext: makeReferrerLeaderboardPageContextSchema(`${valueLabel}.paginationContext`),
3458
+ pageContext: makeReferrerLeaderboardPageContextSchema(`${valueLabel}.pageContext`),
2708
3459
  accurateAsOf: makeUnixTimestampSchema(`${valueLabel}.accurateAsOf`)
2709
3460
  });
2710
- var makeReferrerLeaderboardPageResponseOkSchema = (valueLabel = "ReferrerLeaderboardPageResponseOk") => import_v419.default.object({
2711
- responseCode: import_v419.default.literal(ReferrerLeaderboardPageResponseCodes.Ok),
3461
+ var makeReferrerLeaderboardPageResponseOkSchema = (valueLabel = "ReferrerLeaderboardPageResponseOk") => import_v421.default.object({
3462
+ responseCode: import_v421.default.literal(ReferrerLeaderboardPageResponseCodes.Ok),
2712
3463
  data: makeReferrerLeaderboardPageSchema(`${valueLabel}.data`)
2713
3464
  });
2714
- var makeReferrerLeaderboardPageResponseErrorSchema = (_valueLabel = "ReferrerLeaderboardPageResponseError") => import_v419.default.object({
2715
- responseCode: import_v419.default.literal(ReferrerLeaderboardPageResponseCodes.Error),
2716
- error: import_v419.default.string(),
2717
- errorMessage: import_v419.default.string()
3465
+ var makeReferrerLeaderboardPageResponseErrorSchema = (_valueLabel = "ReferrerLeaderboardPageResponseError") => import_v421.default.object({
3466
+ responseCode: import_v421.default.literal(ReferrerLeaderboardPageResponseCodes.Error),
3467
+ error: import_v421.default.string(),
3468
+ errorMessage: import_v421.default.string()
2718
3469
  });
2719
- var makeReferrerLeaderboardPageResponseSchema = (valueLabel = "ReferrerLeaderboardPageResponse") => import_v419.default.union([
3470
+ var makeReferrerLeaderboardPageResponseSchema = (valueLabel = "ReferrerLeaderboardPageResponse") => import_v421.default.union([
2720
3471
  makeReferrerLeaderboardPageResponseOkSchema(valueLabel),
2721
3472
  makeReferrerLeaderboardPageResponseErrorSchema(valueLabel)
2722
3473
  ]);
2723
- var makeReferrerDetailRankedSchema = (valueLabel = "ReferrerDetailRanked") => import_v419.default.object({
2724
- type: import_v419.default.literal(ReferrerDetailTypeIds.Ranked),
3474
+ var makeReferrerDetailRankedSchema = (valueLabel = "ReferrerDetailRanked") => import_v421.default.object({
3475
+ type: import_v421.default.literal(ReferrerDetailTypeIds.Ranked),
2725
3476
  rules: makeReferralProgramRulesSchema(`${valueLabel}.rules`),
2726
3477
  referrer: makeAwardedReferrerMetricsSchema(`${valueLabel}.referrer`),
2727
3478
  aggregatedMetrics: makeAggregatedReferrerMetricsSchema(`${valueLabel}.aggregatedMetrics`),
2728
3479
  accurateAsOf: makeUnixTimestampSchema(`${valueLabel}.accurateAsOf`)
2729
3480
  });
2730
- var makeReferrerDetailUnrankedSchema = (valueLabel = "ReferrerDetailUnranked") => import_v419.default.object({
2731
- type: import_v419.default.literal(ReferrerDetailTypeIds.Unranked),
3481
+ var makeReferrerDetailUnrankedSchema = (valueLabel = "ReferrerDetailUnranked") => import_v421.default.object({
3482
+ type: import_v421.default.literal(ReferrerDetailTypeIds.Unranked),
2732
3483
  rules: makeReferralProgramRulesSchema(`${valueLabel}.rules`),
2733
3484
  referrer: makeUnrankedReferrerMetricsSchema(`${valueLabel}.referrer`),
2734
3485
  aggregatedMetrics: makeAggregatedReferrerMetricsSchema(`${valueLabel}.aggregatedMetrics`),
2735
3486
  accurateAsOf: makeUnixTimestampSchema(`${valueLabel}.accurateAsOf`)
2736
3487
  });
2737
- var makeReferrerDetailResponseOkSchema = (valueLabel = "ReferrerDetailResponse") => import_v419.default.object({
2738
- responseCode: import_v419.default.literal(ReferrerDetailResponseCodes.Ok),
2739
- data: import_v419.default.union([
3488
+ var makeReferrerDetailResponseOkSchema = (valueLabel = "ReferrerDetailResponse") => import_v421.default.object({
3489
+ responseCode: import_v421.default.literal(ReferrerDetailResponseCodes.Ok),
3490
+ data: import_v421.default.union([
2740
3491
  makeReferrerDetailRankedSchema(`${valueLabel}.data`),
2741
3492
  makeReferrerDetailUnrankedSchema(`${valueLabel}.data`)
2742
3493
  ])
2743
3494
  });
2744
- var makeReferrerDetailResponseErrorSchema = (_valueLabel = "ReferrerDetailResponse") => import_v419.default.object({
2745
- responseCode: import_v419.default.literal(ReferrerDetailResponseCodes.Error),
2746
- error: import_v419.default.string(),
2747
- errorMessage: import_v419.default.string()
3495
+ var makeReferrerDetailResponseErrorSchema = (_valueLabel = "ReferrerDetailResponse") => import_v421.default.object({
3496
+ responseCode: import_v421.default.literal(ReferrerDetailResponseCodes.Error),
3497
+ error: import_v421.default.string(),
3498
+ errorMessage: import_v421.default.string()
2748
3499
  });
2749
- var makeReferrerDetailResponseSchema = (valueLabel = "ReferrerDetailResponse") => import_v419.default.union([
3500
+ var makeReferrerDetailResponseSchema = (valueLabel = "ReferrerDetailResponse") => import_v421.default.union([
2750
3501
  makeReferrerDetailResponseOkSchema(valueLabel),
2751
3502
  makeReferrerDetailResponseErrorSchema(valueLabel)
2752
3503
  ]);
@@ -2758,7 +3509,7 @@ function deserializeReferrerLeaderboardPageResponse(maybeResponse, valueLabel) {
2758
3509
  if (parsed.error) {
2759
3510
  throw new Error(
2760
3511
  `Cannot deserialize SerializedReferrerLeaderboardPageResponse:
2761
- ${(0, import_v420.prettifyError)(parsed.error)}
3512
+ ${(0, import_v422.prettifyError)(parsed.error)}
2762
3513
  `
2763
3514
  );
2764
3515
  }
@@ -2769,7 +3520,7 @@ function deserializeReferrerDetailResponse(maybeResponse, valueLabel) {
2769
3520
  const parsed = schema.safeParse(maybeResponse);
2770
3521
  if (parsed.error) {
2771
3522
  throw new Error(`Cannot deserialize ReferrerDetailResponse:
2772
- ${(0, import_v420.prettifyError)(parsed.error)}
3523
+ ${(0, import_v422.prettifyError)(parsed.error)}
2773
3524
  `);
2774
3525
  }
2775
3526
  return parsed.data;
@@ -3037,7 +3788,7 @@ var ENSNodeClient = class _ENSNodeClient {
3037
3788
  *
3038
3789
  * @param request - Pagination parameters
3039
3790
  * @param request.page - The page number to retrieve (1-indexed, default: 1)
3040
- * @param request.itemsPerPage - Number of items per page (default: 25, max: 100)
3791
+ * @param request.recordsPerPage - Number of records per page (default: 25, max: 100)
3041
3792
  * @returns {ReferrerLeaderboardPageResponse}
3042
3793
  *
3043
3794
  * @throws if the ENSNode request fails
@@ -3046,28 +3797,28 @@ var ENSNodeClient = class _ENSNodeClient {
3046
3797
  *
3047
3798
  * @example
3048
3799
  * ```typescript
3049
- * // Get first page with default page size (25 items)
3800
+ * // Get first page with default page size (25 records)
3050
3801
  * const response = await client.getReferrerLeaderboardPage();
3051
3802
  * if (response.responseCode === ReferrerLeaderboardPageResponseCodes.Ok) {
3052
3803
  * const {
3053
3804
  * aggregatedMetrics,
3054
3805
  * referrers,
3055
3806
  * rules,
3056
- * paginationContext,
3807
+ * pageContext,
3057
3808
  * updatedAt
3058
3809
  * } = response.data;
3059
3810
  * console.log(aggregatedMetrics);
3060
3811
  * console.log(referrers);
3061
3812
  * console.log(rules);
3062
3813
  * console.log(updatedAt);
3063
- * console.log(`Page ${paginationContext.page} of ${paginationContext.totalPages}`);
3814
+ * console.log(`Page ${pageContext.page} of ${pageContext.totalPages}`);
3064
3815
  * }
3065
3816
  * ```
3066
3817
  *
3067
3818
  * @example
3068
3819
  * ```typescript
3069
- * // Get second page with 50 items per page
3070
- * const response = await client.getReferrerLeaderboardPage({ page: 2, itemsPerPage: 50 });
3820
+ * // Get second page with 50 records per page
3821
+ * const response = await client.getReferrerLeaderboardPage({ page: 2, recordsPerPage: 50 });
3071
3822
  * ```
3072
3823
  *
3073
3824
  * @example
@@ -3084,8 +3835,8 @@ var ENSNodeClient = class _ENSNodeClient {
3084
3835
  async getReferrerLeaderboardPage(request) {
3085
3836
  const url = new URL(`/ensanalytics/referrers`, this.options.url);
3086
3837
  if (request?.page) url.searchParams.set("page", request.page.toString());
3087
- if (request?.itemsPerPage)
3088
- url.searchParams.set("itemsPerPage", request.itemsPerPage.toString());
3838
+ if (request?.recordsPerPage)
3839
+ url.searchParams.set("recordsPerPage", request.recordsPerPage.toString());
3089
3840
  const response = await fetch(url);
3090
3841
  let responseData;
3091
3842
  try {
@@ -3190,11 +3941,13 @@ var ENSNodeClient = class _ENSNodeClient {
3190
3941
  /**
3191
3942
  * Fetch ENSNode Registrar Actions
3192
3943
  *
3193
- * @param {RegistrarActionsRequestFilter} request.filter is
3194
- * an optional request filter configuration.
3195
- * @param {number} request.limit sets the maximum count of results in the response.
3196
- * @param {RegistrarActionsRequestOrder} request.order sets the order of
3197
- * results in the response by field and direction.
3944
+ * Retrieves a paginated list of registrar actions with optional filters.
3945
+ *
3946
+ * @param request is a request configuration.
3947
+ * @param request.page sets the page number to retrieve (1-indexed, default: 1)
3948
+ * @param request.recordsPerPage sets the number of records per page (default: 10, max: 100)
3949
+ * @param request.filters is an optional request filter configuration.
3950
+ * @param request.order sets the order of results in the response by field and direction.
3198
3951
  * @returns {RegistrarActionsResponse}
3199
3952
  *
3200
3953
  * @throws if the ENSNode request fails
@@ -3204,23 +3957,25 @@ var ENSNodeClient = class _ENSNodeClient {
3204
3957
  * @example
3205
3958
  * ```ts
3206
3959
  * import {
3207
- * registrarActionsFilter,,
3960
+ * registrarActionsFilter,
3208
3961
  * ENSNodeClient,
3209
3962
  * } from "@ensnode/ensnode-sdk";
3210
3963
  * import { namehash } from "viem/ens";
3211
3964
  *
3212
3965
  * const client: ENSNodeClient;
3213
3966
  *
3214
- * // get latest registrar action records across all indexed subregistries
3215
- * // NOTE: when no `limit` value is passed,
3216
- * // the default RESPONSE_ITEMS_PER_PAGE_DEFAULT applies.
3217
- * const registrarActions = await client.registrarActions();
3967
+ * // Get first page with default page size (10 records)
3968
+ * const response = await client.registrarActions();
3969
+ * if (response.responseCode === RegistrarActionsResponseCodes.Ok) {
3970
+ * const { registrarActions, pageContext } = response;
3971
+ * console.log(registrarActions);
3972
+ * console.log(`Page ${pageContext.page} of ${pageContext.totalPages}`);
3973
+ * }
3218
3974
  *
3219
- * // get latest 5 registrar action records across all indexed subregistries
3220
- * // NOTE: when a `limit` value is passed, it must be lower than or equal to
3221
- * // the RESPONSE_ITEMS_PER_PAGE_MAX value.
3222
- * const registrarActions = await client.registrarActions({
3223
- * limit: 5,
3975
+ * // Get second page with 25 records per page
3976
+ * const response = await client.registrarActions({
3977
+ * page: 2,
3978
+ * recordsPerPage: 25,
3224
3979
  * });
3225
3980
  *
3226
3981
  * // get latest registrar action records associated with
@@ -3234,49 +3989,123 @@ var ENSNodeClient = class _ENSNodeClient {
3234
3989
  * filters: [registrarActionsFilter.withReferral(true)],
3235
3990
  * });
3236
3991
  *
3992
+ * // get latest registrar action records for a specific decoded referrer
3993
+ * await client.registrarActions({
3994
+ * filters: [registrarActionsFilter.byDecodedReferrer("0x1234567890123456789012345678901234567890")],
3995
+ * });
3996
+ *
3237
3997
  * // get latest 10 registrar action records associated with
3238
3998
  * // subregistry managing `base.eth` name
3239
3999
  * await client.registrarActions({
3240
4000
  * filters: [registrarActionsFilter.byParentNode(namehash('base.eth'))],
3241
- * limit: 10
4001
+ * recordsPerPage: 10
4002
+ * });
4003
+ * ```
4004
+ */
4005
+ async registrarActions(request = {}) {
4006
+ const buildUrlPath = (filters) => {
4007
+ const bySubregistryNodeFilter = filters?.find(
4008
+ (f) => f.filterType === RegistrarActionsFilterTypes.BySubregistryNode
4009
+ );
4010
+ return bySubregistryNodeFilter ? new URL(`/api/registrar-actions/${bySubregistryNodeFilter.value}`, this.options.url) : new URL(`/api/registrar-actions`, this.options.url);
4011
+ };
4012
+ const buildWithReferralArg = (filters) => {
4013
+ const withReferralFilter = filters?.find(
4014
+ (f) => f.filterType === RegistrarActionsFilterTypes.WithEncodedReferral
4015
+ );
4016
+ return withReferralFilter ? { key: "withReferral", value: "true" } : null;
4017
+ };
4018
+ const buildDecodedReferrerArg = (filters) => {
4019
+ const decodedReferrerFilter = filters?.find(
4020
+ (f) => f.filterType === RegistrarActionsFilterTypes.ByDecodedReferrer
4021
+ );
4022
+ return decodedReferrerFilter ? { key: "decodedReferrer", value: decodedReferrerFilter.value } : null;
4023
+ };
4024
+ const buildOrderArg = (order) => {
4025
+ switch (order) {
4026
+ case RegistrarActionsOrders.LatestRegistrarActions: {
4027
+ const [field, direction] = order.split("=");
4028
+ return {
4029
+ key: `sort[${field}]`,
4030
+ value: `${direction}`
4031
+ };
4032
+ }
4033
+ }
4034
+ };
4035
+ const url = buildUrlPath(request.filters);
4036
+ if (request.order) {
4037
+ const orderArgs = buildOrderArg(request.order);
4038
+ url.searchParams.set(orderArgs.key, orderArgs.value);
4039
+ }
4040
+ if (request.page) {
4041
+ url.searchParams.set("page", request.page.toString());
4042
+ }
4043
+ if (request.recordsPerPage) {
4044
+ url.searchParams.set("recordsPerPage", request.recordsPerPage.toString());
4045
+ }
4046
+ const referralArg = buildWithReferralArg(request.filters);
4047
+ if (referralArg) {
4048
+ url.searchParams.set(referralArg.key, referralArg.value);
4049
+ }
4050
+ const decodedReferrerArg = buildDecodedReferrerArg(request.filters);
4051
+ if (decodedReferrerArg) {
4052
+ url.searchParams.set(decodedReferrerArg.key, decodedReferrerArg.value);
4053
+ }
4054
+ const response = await fetch(url);
4055
+ let responseData;
4056
+ try {
4057
+ responseData = await response.json();
4058
+ } catch {
4059
+ throw new Error("Malformed response data: invalid JSON");
4060
+ }
4061
+ if (!response.ok) {
4062
+ let errorResponse;
4063
+ try {
4064
+ errorResponse = deserializeErrorResponse(responseData);
4065
+ } catch {
4066
+ console.log("Registrar Actions API: handling a known server error.");
4067
+ }
4068
+ if (typeof errorResponse !== "undefined") {
4069
+ throw new Error(`Fetching ENSNode Registrar Actions Failed: ${errorResponse.message}`);
4070
+ }
4071
+ }
4072
+ return deserializeRegistrarActionsResponse(responseData);
4073
+ }
4074
+ /**
4075
+ * Fetch Name Tokens for requested name.
4076
+ *
4077
+ * @param request.name - Name for which Name Tokens will be fetched.
4078
+ * @returns {NameTokensResponse}
4079
+ *
4080
+ * @throws if the ENSNode request fails
4081
+ * @throws if the ENSNode API returns an error response
4082
+ * @throws if the ENSNode response breaks required invariants
4083
+ *
4084
+ * @example
4085
+ * ```ts
4086
+ * import {
4087
+ * ENSNodeClient,
4088
+ * } from "@ensnode/ensnode-sdk";
4089
+ * import { namehash } from "viem/ens";
4090
+ *
4091
+ * const client: ENSNodeClient;
4092
+ *
4093
+ * // get latest name token records from the indexed subregistry based on the requested name
4094
+ * const response = await client.nameTokens({
4095
+ * name: "vitalik.eth"
3242
4096
  * });
4097
+ *
4098
+ * const response = await client.nameTokens({
4099
+ * domainId: "0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835" // namehash('vitalik.eth')
4100
+ * })
3243
4101
  * ```
3244
4102
  */
3245
- async registrarActions(request = {}) {
3246
- const buildUrlPath = (filters) => {
3247
- const bySubregistryNodeFilter = filters?.find(
3248
- (f) => f.filterType === RegistrarActionsFilterTypes.BySubregistryNode
3249
- );
3250
- return bySubregistryNodeFilter ? new URL(`/api/registrar-actions/${bySubregistryNodeFilter.value}`, this.options.url) : new URL(`/api/registrar-actions`, this.options.url);
3251
- };
3252
- const buildWithReferralArg = (filters) => {
3253
- const withReferralFilter = filters?.find(
3254
- (f) => f.filterType === RegistrarActionsFilterTypes.WithEncodedReferral
3255
- );
3256
- return withReferralFilter ? { key: "withReferral", value: "true" } : null;
3257
- };
3258
- const buildOrderArg = (order) => {
3259
- switch (order) {
3260
- case RegistrarActionsOrders.LatestRegistrarActions: {
3261
- const [field, direction] = order.split("=");
3262
- return {
3263
- key: `sort[${field}]`,
3264
- value: `${direction}`
3265
- };
3266
- }
3267
- }
3268
- };
3269
- const url = buildUrlPath(request.filters);
3270
- if (request.order) {
3271
- const orderArgs = buildOrderArg(request.order);
3272
- url.searchParams.set(orderArgs.key, orderArgs.value);
3273
- }
3274
- if (request.itemsPerPage) {
3275
- url.searchParams.set("itemsPerPage", request.itemsPerPage.toString());
3276
- }
3277
- const referralArg = buildWithReferralArg(request.filters);
3278
- if (referralArg) {
3279
- url.searchParams.set(referralArg.key, referralArg.value);
4103
+ async nameTokens(request) {
4104
+ const url = new URL(`/api/name-tokens`, this.options.url);
4105
+ if (request.name !== void 0) {
4106
+ url.searchParams.set("name", request.name);
4107
+ } else {
4108
+ url.searchParams.set("domainId", request.domainId);
3280
4109
  }
3281
4110
  const response = await fetch(url);
3282
4111
  let responseData;
@@ -3290,13 +4119,13 @@ var ENSNodeClient = class _ENSNodeClient {
3290
4119
  try {
3291
4120
  errorResponse = deserializeErrorResponse(responseData);
3292
4121
  } catch {
3293
- console.log("Registrar Actions API: handling a known server error.");
4122
+ console.log("Name Tokens API: handling a known server error.");
3294
4123
  }
3295
4124
  if (typeof errorResponse !== "undefined") {
3296
- throw new Error(`Fetching ENSNode Registrar Actions Failed: ${errorResponse.message}`);
4125
+ throw new Error(`Fetching ENSNode Name Tokens Failed: ${errorResponse.message}`);
3297
4126
  }
3298
4127
  }
3299
- return deserializeRegistrarActionsResponse(responseData);
4128
+ return deserializedNameTokensResponse(responseData);
3300
4129
  }
3301
4130
  };
3302
4131
 
@@ -3337,11 +4166,11 @@ function isResolvedIdentity(identity) {
3337
4166
  }
3338
4167
 
3339
4168
  // src/resolution/ensip19-chainid.ts
3340
- var import_chains2 = require("viem/chains");
4169
+ var import_chains = require("viem/chains");
3341
4170
  var import_datasources10 = require("@ensnode/datasources");
3342
4171
  var getResolvePrimaryNameChainIdParam = (chainId, namespaceId) => {
3343
4172
  const ensRootChainId = (0, import_datasources10.getENSRootChainId)(namespaceId);
3344
- return chainId === ensRootChainId ? import_chains2.mainnet.id : chainId;
4173
+ return chainId === ensRootChainId ? import_chains.mainnet.id : chainId;
3345
4174
  };
3346
4175
  var translateDefaultableChainIdToChainId = (chainId, namespaceId) => {
3347
4176
  return chainId === DEFAULT_EVM_CHAIN_ID ? (0, import_datasources10.getENSRootChainId)(namespaceId) : chainId;
@@ -3350,231 +4179,6 @@ var translateDefaultableChainIdToChainId = (chainId, namespaceId) => {
3350
4179
  // src/resolution/resolver-records-selection.ts
3351
4180
  var isSelectionEmpty = (selection) => !selection.name && !selection.addresses?.length && !selection.texts?.length;
3352
4181
 
3353
- // src/tokenscope/assets.ts
3354
- var import_caip3 = require("caip");
3355
- var import_viem15 = require("viem");
3356
- var AssetNamespaces = {
3357
- ERC721: "erc721",
3358
- ERC1155: "erc1155"
3359
- };
3360
- function serializeAssetId(assetId) {
3361
- const { assetNamespace, contract, tokenId } = assetId;
3362
- return import_caip3.AssetId.format({
3363
- chainId: { namespace: "eip155", reference: contract.chainId.toString() },
3364
- assetName: { namespace: assetNamespace, reference: contract.address },
3365
- tokenId: uint256ToHex32(tokenId)
3366
- }).toLowerCase();
3367
- }
3368
- var buildAssetId = (contract, tokenId, assetNamespace) => {
3369
- return {
3370
- assetNamespace,
3371
- contract,
3372
- tokenId
3373
- };
3374
- };
3375
- var NFTMintStatuses = {
3376
- Minted: "minted",
3377
- Burned: "burned"
3378
- };
3379
- var formatNFTTransferEventMetadata = (metadata) => {
3380
- const serializedAssetId = serializeAssetId(metadata.nft);
3381
- return [
3382
- `Event: ${metadata.eventHandlerName}`,
3383
- `Chain ID: ${metadata.chainId}`,
3384
- `Block Number: ${metadata.blockNumber}`,
3385
- `Transaction Hash: ${metadata.transactionHash}`,
3386
- `NFT: ${serializedAssetId}`
3387
- ].map((line) => ` - ${line}`).join("\n");
3388
- };
3389
- var NFTTransferTypes = {
3390
- /**
3391
- * Initial transfer from zeroAddress to a non-zeroAddress
3392
- * Can happen at most once to a NFT AssetId
3393
- *
3394
- * Invariants:
3395
- * - NFT is not indexed and therefore has no previous mint status or owner
3396
- * - new NFT mint status is `minted`
3397
- * - new NFT owner is a non-zeroAddress
3398
- */
3399
- Mint: "mint",
3400
- /**
3401
- * Subsequent transfer from zeroAddress to a non-zeroAddress
3402
- * Can happen any number of times to a NFT AssetId as it passes in a cycle from
3403
- * mint -> burn -> remint -> burn -> remint -> ...
3404
- *
3405
- * Invariants:
3406
- * - NFT is indexed
3407
- * - previous NFT mint status was `burned`
3408
- * - previous NFT owner is the zeroAddress
3409
- * - new NFT mint status is `minted`
3410
- * - new NFT owner is a non-zeroAddress
3411
- */
3412
- Remint: "remint",
3413
- /**
3414
- * Special transfer type for improperly implemented NFT contracts that allow a NFT
3415
- * that is currently minted to be reminted before an intermediate burn.
3416
- *
3417
- * Transfer from zeroAddress to non-zeroAddress for an indexed NFT where the
3418
- * previously indexed nft had status `minted` with a non-zeroAddress owner.
3419
- *
3420
- * Invariants:
3421
- * - NFT is indexed
3422
- * - previous NFT mint status was `minted`
3423
- * - previous NFT owner was a non-zeroAddress
3424
- * - new NFT mint status is `minted`
3425
- * - new NFT owner is a non-zeroAddress
3426
- */
3427
- MintedRemint: "minted-remint",
3428
- /**
3429
- * Transfer from a non-zeroAddress to zeroAddress
3430
- *
3431
- * Invariants:
3432
- * - NFT is indexed
3433
- * - previous NFT mint status was `minted`
3434
- * - previous NFT owner is a non-zeroAddress
3435
- * - new NFT mint status is `burned`
3436
- * - new NFT owner is the zeroAddress
3437
- */
3438
- Burn: "burn",
3439
- /**
3440
- * Transfer from a non-zeroAddress to a distinct non-zeroAddress
3441
- *
3442
- * Invariants:
3443
- * - NFT is indexed
3444
- * - previous and new NFT mint status is `minted`
3445
- * - previous and new NFT owner are distinct non-zeroAddress
3446
- */
3447
- Transfer: "transfer",
3448
- /**
3449
- * Transfer from a non-zeroAddress to the same non-zeroAddress
3450
- *
3451
- * Invariants:
3452
- * - NFT is indexed
3453
- * - previous and new NFT mint status is `minted`
3454
- * - previous and new NFT owner are equivalent non-zeroAddress
3455
- */
3456
- SelfTransfer: "self-transfer",
3457
- /**
3458
- * Transfer from zeroAddress to zeroAddress for an indexed NFT
3459
- *
3460
- * Invariants:
3461
- * - NFT is indexed
3462
- * - previous and new NFT mint status is `burned`
3463
- * - previous and new NFT owner are zeroAddress
3464
- */
3465
- RemintBurn: "remint-burn",
3466
- /**
3467
- * Special transfer type for improperly implemented NFT contracts that allow a NFT
3468
- * that is currently minted to be reminted again before an intermediate burn.
3469
- *
3470
- * Transfer from zeroAddress to zeroAddress for an indexed NFT where the
3471
- * previously indexed nft had status `minted` with a non-zeroAddress owner.
3472
- *
3473
- * Invariants:
3474
- * - NFT is indexed
3475
- * - previous NFT mint status was `minted`
3476
- * - previous NFT owner was a non-zeroAddress
3477
- * - new NFT mint status is `burned`
3478
- * - new NFT owner is the zeroAddress
3479
- */
3480
- MintedRemintBurn: "minted-remint-burn",
3481
- /**
3482
- * Transfer from zeroAddress to zeroAddress for an unindexed NFT
3483
- *
3484
- * Invariants:
3485
- * - NFT is not indexed and therefore has no previous mint status or owner
3486
- * - NFT should remain unindexed and without any mint status or owner
3487
- */
3488
- MintBurn: "mint-burn"
3489
- };
3490
- var getNFTTransferType = (from, to, allowMintedRemint, metadata, currentlyIndexedOwner) => {
3491
- const isIndexed = currentlyIndexedOwner !== void 0;
3492
- const isIndexedAsMinted = isIndexed && !(0, import_viem15.isAddressEqual)(currentlyIndexedOwner, import_viem15.zeroAddress);
3493
- const isMint = (0, import_viem15.isAddressEqual)(from, import_viem15.zeroAddress);
3494
- const isBurn = (0, import_viem15.isAddressEqual)(to, import_viem15.zeroAddress);
3495
- const isSelfTransfer = (0, import_viem15.isAddressEqual)(from, to);
3496
- if (isIndexed && !(0, import_viem15.isAddressEqual)(currentlyIndexedOwner, from)) {
3497
- if (isMint && allowMintedRemint) {
3498
- } else {
3499
- throw new Error(
3500
- `Error: Sending from ${from} conflicts with currently indexed owner ${currentlyIndexedOwner}.
3501
- ${formatNFTTransferEventMetadata(metadata)}`
3502
- );
3503
- }
3504
- }
3505
- if (isSelfTransfer) {
3506
- if (isMint) {
3507
- if (!isIndexed) {
3508
- return NFTTransferTypes.MintBurn;
3509
- } else if (!isIndexedAsMinted) {
3510
- return NFTTransferTypes.RemintBurn;
3511
- } else if (allowMintedRemint) {
3512
- return NFTTransferTypes.MintedRemintBurn;
3513
- } else {
3514
- throw new Error(
3515
- `Error: Invalid state transition from minted -> remint-burn
3516
- ${formatNFTTransferEventMetadata(metadata)}`
3517
- );
3518
- }
3519
- } else {
3520
- if (!isIndexed) {
3521
- throw new Error(
3522
- `Error: Invalid state transition from unindexed -> self-transfer
3523
- ${formatNFTTransferEventMetadata(metadata)}`
3524
- );
3525
- } else if (!isIndexedAsMinted) {
3526
- throw new Error(
3527
- `Error: invalid state transition from burned -> self-transfer
3528
- ${formatNFTTransferEventMetadata(metadata)}`
3529
- );
3530
- } else {
3531
- return NFTTransferTypes.SelfTransfer;
3532
- }
3533
- }
3534
- } else if (isMint) {
3535
- if (!isIndexed) {
3536
- return NFTTransferTypes.Mint;
3537
- } else if (!isIndexedAsMinted) {
3538
- return NFTTransferTypes.Remint;
3539
- } else if (allowMintedRemint) {
3540
- return NFTTransferTypes.MintedRemint;
3541
- } else {
3542
- throw new Error(
3543
- `Error: Invalid state transition from minted -> mint
3544
- ${formatNFTTransferEventMetadata(metadata)}`
3545
- );
3546
- }
3547
- } else if (isBurn) {
3548
- if (!isIndexed) {
3549
- throw new Error(
3550
- `Error: Invalid state transition from unindexed -> burn
3551
- ${formatNFTTransferEventMetadata(metadata)}`
3552
- );
3553
- } else if (!isIndexedAsMinted) {
3554
- throw new Error(
3555
- `Error: Invalid state transition from burned -> burn
3556
- ${formatNFTTransferEventMetadata(metadata)}`
3557
- );
3558
- } else {
3559
- return NFTTransferTypes.Burn;
3560
- }
3561
- } else {
3562
- if (!isIndexed) {
3563
- throw new Error(
3564
- `Error: Invalid state transition from unindexed -> transfer
3565
- ${formatNFTTransferEventMetadata(metadata)}`
3566
- );
3567
- } else if (!isIndexedAsMinted) {
3568
- throw new Error(
3569
- `Error: Invalid state transition from burned -> transfer
3570
- ${formatNFTTransferEventMetadata(metadata)}`
3571
- );
3572
- } else {
3573
- return NFTTransferTypes.Transfer;
3574
- }
3575
- }
3576
- };
3577
-
3578
4182
  // src/tracing/index.ts
3579
4183
  var TraceableENSProtocol = /* @__PURE__ */ ((TraceableENSProtocol2) => {
3580
4184
  TraceableENSProtocol2["ForwardResolution"] = "forward-resolution";