@ensnode/ensnode-sdk 1.13.1 → 1.14.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 +46 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +15 -1257
- package/dist/index.d.ts +15 -1257
- package/dist/index.js +46 -12
- package/dist/index.js.map +1 -1
- package/dist/internal.cjs +3289 -0
- package/dist/internal.cjs.map +1 -0
- package/dist/internal.d.cts +4178 -0
- package/dist/internal.d.ts +4178 -0
- package/dist/internal.js +3290 -0
- package/dist/internal.js.map +1 -0
- package/dist/namespace-specific-value-CPvcFpGI.d.cts +1260 -0
- package/dist/namespace-specific-value-CPvcFpGI.d.ts +1260 -0
- package/package.json +16 -6
|
@@ -0,0 +1,3289 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/internal.ts
|
|
31
|
+
var internal_exports = {};
|
|
32
|
+
__export(internal_exports, {
|
|
33
|
+
ConfigTemplateIds: () => ConfigTemplateIds,
|
|
34
|
+
DATASOURCE_NAMES_WITH_ENSv2_CONTRACTS: () => DATASOURCE_NAMES_WITH_ENSv2_CONTRACTS,
|
|
35
|
+
DATASOURCE_NAMES_WITH_RESOLVERS: () => DATASOURCE_NAMES_WITH_RESOLVERS,
|
|
36
|
+
ENSNamespaceSchema: () => ENSNamespaceSchema,
|
|
37
|
+
GRAPHQL_API_EXAMPLE_QUERIES: () => GRAPHQL_API_EXAMPLE_QUERIES,
|
|
38
|
+
OptionalPortNumberSchema: () => OptionalPortNumberSchema,
|
|
39
|
+
PortNumberSchema: () => PortNumberSchema,
|
|
40
|
+
RpcConfigsSchema: () => RpcConfigsSchema,
|
|
41
|
+
TheGraphApiKeySchema: () => TheGraphApiKeySchema,
|
|
42
|
+
TheGraphCannotFallbackReasonSchema: () => TheGraphCannotFallbackReasonSchema,
|
|
43
|
+
TheGraphFallbackSchema: () => TheGraphFallbackSchema,
|
|
44
|
+
alchemySupportsChain: () => alchemySupportsChain,
|
|
45
|
+
buildAlchemyBaseUrl: () => buildAlchemyBaseUrl,
|
|
46
|
+
buildDRPCUrl: () => buildDRPCUrl,
|
|
47
|
+
buildQuickNodeURL: () => buildQuickNodeURL,
|
|
48
|
+
buildRpcAutoGenMode: () => buildRpcAutoGenMode,
|
|
49
|
+
buildRpcConfigsFromEnv: () => buildRpcConfigsFromEnv,
|
|
50
|
+
canFallbackToTheGraph: () => canFallbackToTheGraph,
|
|
51
|
+
dRPCSupportsChain: () => dRPCSupportsChain,
|
|
52
|
+
errorResponseBadRequestExample: () => errorResponseBadRequestExample,
|
|
53
|
+
errorResponseInternalServerErrorExample: () => errorResponseInternalServerErrorExample,
|
|
54
|
+
errorResponseInvalidAddressExample: () => errorResponseInvalidAddressExample,
|
|
55
|
+
errorResponseInvalidNameExample: () => errorResponseInvalidNameExample,
|
|
56
|
+
getDatasourcesWithENSv2Contracts: () => getDatasourcesWithENSv2Contracts,
|
|
57
|
+
getDatasourcesWithResolvers: () => getDatasourcesWithResolvers,
|
|
58
|
+
getGraphqlApiExampleQueryById: () => getGraphqlApiExampleQueryById,
|
|
59
|
+
getLogLevelFromEnv: () => getLogLevelFromEnv,
|
|
60
|
+
interpretAddress: () => interpretAddress,
|
|
61
|
+
interpretAddressRecordValue: () => interpretAddressRecordValue,
|
|
62
|
+
interpretContenthashValue: () => interpretContenthashValue,
|
|
63
|
+
interpretDnszonehashValue: () => interpretDnszonehashValue,
|
|
64
|
+
interpretNameRecordValue: () => interpretNameRecordValue,
|
|
65
|
+
interpretPubkeyValue: () => interpretPubkeyValue,
|
|
66
|
+
interpretTextRecordKey: () => interpretTextRecordKey,
|
|
67
|
+
interpretTextRecordValue: () => interpretTextRecordValue,
|
|
68
|
+
invariant_ensRainbowSupportedLabelSetAndVersion: () => invariant_ensRainbowSupportedLabelSetAndVersion,
|
|
69
|
+
invariant_isSubgraphCompatibleRequirements: () => invariant_isSubgraphCompatibleRequirements,
|
|
70
|
+
invariant_rpcConfigsSpecifiedForRootChain: () => invariant_rpcConfigsSpecifiedForRootChain,
|
|
71
|
+
invariant_rpcEndpointConfigIncludesAtLeastOneHTTPProtocolURL: () => invariant_rpcEndpointConfigIncludesAtLeastOneHTTPProtocolURL,
|
|
72
|
+
invariant_rpcEndpointConfigIncludesAtMostOneWebSocketsProtocolURL: () => invariant_rpcEndpointConfigIncludesAtMostOneWebSocketsProtocolURL,
|
|
73
|
+
isBridgedResolver: () => isBridgedResolver,
|
|
74
|
+
isConfigTemplateSubgraphCompatible: () => isConfigTemplateSubgraphCompatible,
|
|
75
|
+
isExtendedResolver: () => isExtendedResolver,
|
|
76
|
+
isKnownENSIP19ReverseResolver: () => isKnownENSIP19ReverseResolver,
|
|
77
|
+
isStaticResolver: () => isStaticResolver,
|
|
78
|
+
makeAccountIdSchema: () => makeAccountIdSchema,
|
|
79
|
+
makeAccountIdStringSchema: () => makeAccountIdStringSchema,
|
|
80
|
+
makeAssetIdSchema: () => makeAssetIdSchema,
|
|
81
|
+
makeAssetIdStringSchema: () => makeAssetIdStringSchema,
|
|
82
|
+
makeBaseRegistrarActionSchema: () => makeBaseRegistrarActionSchema,
|
|
83
|
+
makeBlockNumberSchema: () => makeBlockNumberSchema,
|
|
84
|
+
makeBlockRefSchema: () => makeBlockRefSchema,
|
|
85
|
+
makeBooleanStringSchema: () => makeBooleanStringSchema,
|
|
86
|
+
makeChainIdSchema: () => makeChainIdSchema,
|
|
87
|
+
makeChainIdStringSchema: () => makeChainIdStringSchema,
|
|
88
|
+
makeCoinTypeSchema: () => makeCoinTypeSchema,
|
|
89
|
+
makeCoinTypeStringSchema: () => makeCoinTypeStringSchema,
|
|
90
|
+
makeCommaSeparatedList: () => makeCommaSeparatedList,
|
|
91
|
+
makeDatetimeSchema: () => makeDatetimeSchema,
|
|
92
|
+
makeDefaultableChainIdSchema: () => makeDefaultableChainIdSchema,
|
|
93
|
+
makeDefaultableChainIdStringSchema: () => makeDefaultableChainIdStringSchema,
|
|
94
|
+
makeDomainAssetSchema: () => makeDomainAssetSchema,
|
|
95
|
+
makeDurationSchema: () => makeDurationSchema,
|
|
96
|
+
makeENSApiPublicConfigSchema: () => makeENSApiPublicConfigSchema,
|
|
97
|
+
makeENSIndexerPublicConfigSchema: () => makeENSIndexerPublicConfigSchema,
|
|
98
|
+
makeENSIndexerVersionInfoSchema: () => makeENSIndexerVersionInfoSchema,
|
|
99
|
+
makeENSNamespaceIdSchema: () => makeENSNamespaceIdSchema,
|
|
100
|
+
makeEnsApiIndexingStatusResponseErrorSchema: () => makeEnsApiIndexingStatusResponseErrorSchema,
|
|
101
|
+
makeEnsApiIndexingStatusResponseOkSchema: () => makeEnsApiIndexingStatusResponseOkSchema,
|
|
102
|
+
makeEnsApiIndexingStatusResponseSchema: () => makeEnsApiIndexingStatusResponseSchema,
|
|
103
|
+
makeEnsApiPublicConfigSchema: () => makeEnsApiPublicConfigSchema,
|
|
104
|
+
makeEnsIndexerPublicConfigSchema: () => makeEnsIndexerPublicConfigSchema,
|
|
105
|
+
makeEnsIndexerSchemaNameSchema: () => makeEnsIndexerSchemaNameSchema,
|
|
106
|
+
makeEnsIndexerVersionInfoSchema: () => makeEnsIndexerVersionInfoSchema,
|
|
107
|
+
makeErrorResponseSchema: () => makeErrorResponseSchema,
|
|
108
|
+
makeFiniteNonNegativeNumberSchema: () => makeFiniteNonNegativeNumberSchema,
|
|
109
|
+
makeFullyPinnedLabelSetSchema: () => makeFullyPinnedLabelSetSchema,
|
|
110
|
+
makeHexStringSchema: () => makeHexStringSchema,
|
|
111
|
+
makeIndexedChainIdsSchema: () => makeIndexedChainIdsSchema,
|
|
112
|
+
makeIndexingStatusResponseSchema: () => makeIndexingStatusResponseSchema,
|
|
113
|
+
makeIntegerSchema: () => makeIntegerSchema,
|
|
114
|
+
makeNameTokenOwnershipBurnedSchema: () => makeNameTokenOwnershipBurnedSchema,
|
|
115
|
+
makeNameTokenOwnershipFullyOnchainSchema: () => makeNameTokenOwnershipFullyOnchainSchema,
|
|
116
|
+
makeNameTokenOwnershipNameWrapperSchema: () => makeNameTokenOwnershipNameWrapperSchema,
|
|
117
|
+
makeNameTokenOwnershipSchema: () => makeNameTokenOwnershipSchema,
|
|
118
|
+
makeNameTokenOwnershipUnknownSchema: () => makeNameTokenOwnershipUnknownSchema,
|
|
119
|
+
makeNameTokenSchema: () => makeNameTokenSchema,
|
|
120
|
+
makeNameTokensResponseErrorEnsIndexerConfigUnsupported: () => makeNameTokensResponseErrorEnsIndexerConfigUnsupported,
|
|
121
|
+
makeNameTokensResponseErrorNameIndexingStatusUnsupported: () => makeNameTokensResponseErrorNameIndexingStatusUnsupported,
|
|
122
|
+
makeNameTokensResponseErrorNameTokensNotIndexedSchema: () => makeNameTokensResponseErrorNameTokensNotIndexedSchema,
|
|
123
|
+
makeNameTokensResponseErrorSchema: () => makeNameTokensResponseErrorSchema,
|
|
124
|
+
makeNameTokensResponseOkSchema: () => makeNameTokensResponseOkSchema,
|
|
125
|
+
makeNameTokensResponseSchema: () => makeNameTokensResponseSchema,
|
|
126
|
+
makeNamedRegistrarActionSchema: () => makeNamedRegistrarActionSchema,
|
|
127
|
+
makeNodeSchema: () => makeNodeSchema,
|
|
128
|
+
makeNonNegativeIntegerSchema: () => makeNonNegativeIntegerSchema,
|
|
129
|
+
makeNormalizedAddressSchema: () => makeNormalizedAddressSchema,
|
|
130
|
+
makePluginsListSchema: () => makePluginsListSchema,
|
|
131
|
+
makePositiveIntegerSchema: () => makePositiveIntegerSchema,
|
|
132
|
+
makePriceCurrencySchema: () => makePriceCurrencySchema,
|
|
133
|
+
makePriceDaiSchema: () => makePriceDaiSchema,
|
|
134
|
+
makePriceEnsTokensSchema: () => makePriceEnsTokensSchema,
|
|
135
|
+
makePriceEthSchema: () => makePriceEthSchema,
|
|
136
|
+
makePriceSchema: () => makePriceSchema,
|
|
137
|
+
makePriceUsdcSchema: () => makePriceUsdcSchema,
|
|
138
|
+
makeRegisteredNameTokenSchema: () => makeRegisteredNameTokenSchema,
|
|
139
|
+
makeRegistrarActionRegistrationSchema: () => makeRegistrarActionRegistrationSchema,
|
|
140
|
+
makeRegistrarActionRenewalSchema: () => makeRegistrarActionRenewalSchema,
|
|
141
|
+
makeRegistrarActionSchema: () => makeRegistrarActionSchema,
|
|
142
|
+
makeRegistrarActionsResponseErrorSchema: () => makeRegistrarActionsResponseErrorSchema,
|
|
143
|
+
makeRegistrarActionsResponseOkSchema: () => makeRegistrarActionsResponseOkSchema,
|
|
144
|
+
makeRegistrarActionsResponseSchema: () => makeRegistrarActionsResponseSchema,
|
|
145
|
+
makeRegistrationLifecycleSchema: () => makeRegistrationLifecycleSchema,
|
|
146
|
+
makeReinterpretedNameSchema: () => makeReinterpretedNameSchema,
|
|
147
|
+
makeRequestPageParamsSchema: () => makeRequestPageParamsSchema,
|
|
148
|
+
makeResolvePrimaryNameResponseSchema: () => makeResolvePrimaryNameResponseSchema,
|
|
149
|
+
makeResolvePrimaryNamesResponseSchema: () => makeResolvePrimaryNamesResponseSchema,
|
|
150
|
+
makeResolveRecordsResponseSchema: () => makeResolveRecordsResponseSchema,
|
|
151
|
+
makeResponsePageContextSchema: () => makeResponsePageContextSchema,
|
|
152
|
+
makeResponsePageContextSchemaWithNoRecords: () => makeResponsePageContextSchemaWithNoRecords,
|
|
153
|
+
makeResponsePageContextSchemaWithRecords: () => makeResponsePageContextSchemaWithRecords,
|
|
154
|
+
makeSerializedEnsApiIndexingStatusResponseOkSchema: () => makeSerializedEnsApiIndexingStatusResponseOkSchema,
|
|
155
|
+
makeSerializedEnsApiIndexingStatusResponseSchema: () => makeSerializedEnsApiIndexingStatusResponseSchema,
|
|
156
|
+
makeSerializedEnsApiPublicConfigSchema: () => makeSerializedEnsApiPublicConfigSchema,
|
|
157
|
+
makeSerializedEnsIndexerPublicConfigSchema: () => makeSerializedEnsIndexerPublicConfigSchema,
|
|
158
|
+
makeSerializedIndexedChainIdsSchema: () => makeSerializedIndexedChainIdsSchema,
|
|
159
|
+
makeSerializedPriceCurrencySchema: () => makeSerializedPriceCurrencySchema,
|
|
160
|
+
makeSerializedPriceEthSchema: () => makeSerializedPriceEthSchema,
|
|
161
|
+
makeSerializedRegistrarActionPricingSchema: () => makeSerializedRegistrarActionPricingSchema,
|
|
162
|
+
makeSerializedRegistrarActionSchema: () => makeSerializedRegistrarActionSchema,
|
|
163
|
+
makeSerializedRegistrarActionsResponseOkSchema: () => makeSerializedRegistrarActionsResponseOkSchema,
|
|
164
|
+
makeSupportsInterfaceReader: () => makeSupportsInterfaceReader,
|
|
165
|
+
makeTokenIdSchema: () => makeTokenIdSchema,
|
|
166
|
+
makeTransactionHashSchema: () => makeTransactionHashSchema,
|
|
167
|
+
makeUnixTimestampSchema: () => makeUnixTimestampSchema,
|
|
168
|
+
makeUrlSchema: () => makeUrlSchema,
|
|
169
|
+
nameTokensNotIndexedExample: () => nameTokensNotIndexedExample,
|
|
170
|
+
nameTokensResponseOkExample: () => nameTokensResponseOkExample,
|
|
171
|
+
nameTokensServiceUnavailableExample: () => nameTokensServiceUnavailableExample,
|
|
172
|
+
namespaceForConfigTemplateId: () => namespaceForConfigTemplateId,
|
|
173
|
+
quickNodeSupportsChain: () => quickNodeSupportsChain,
|
|
174
|
+
realtimeResponseSchemaError: () => realtimeResponseSchemaError,
|
|
175
|
+
realtimeResponseSchemaOk: () => realtimeResponseSchemaOk,
|
|
176
|
+
redactRpcConfigs: () => redactRpcConfigs,
|
|
177
|
+
redactString: () => redactString,
|
|
178
|
+
redactUrl: () => redactUrl,
|
|
179
|
+
registrarActionsResponseOkExample: () => registrarActionsResponseOkExample,
|
|
180
|
+
resolvePrimaryNameResponseExample: () => resolvePrimaryNameResponseExample,
|
|
181
|
+
resolvePrimaryNamesResponseExample: () => resolvePrimaryNamesResponseExample,
|
|
182
|
+
resolveRecordsResponseExample: () => resolveRecordsResponseExample,
|
|
183
|
+
staticResolverImplementsAddressRecordDefaulting: () => staticResolverImplementsAddressRecordDefaulting,
|
|
184
|
+
stringifyConfig: () => stringifyConfig
|
|
185
|
+
});
|
|
186
|
+
module.exports = __toCommonJS(internal_exports);
|
|
187
|
+
|
|
188
|
+
// src/ensapi/config/zod-schemas.ts
|
|
189
|
+
var import_v45 = require("zod/v4");
|
|
190
|
+
|
|
191
|
+
// src/ensindexer/config/zod-schemas.ts
|
|
192
|
+
var import_v43 = require("zod/v4");
|
|
193
|
+
|
|
194
|
+
// src/ensrainbow/zod-schemas/config.ts
|
|
195
|
+
var import_v42 = require("zod/v4");
|
|
196
|
+
|
|
197
|
+
// src/shared/zod-schemas.ts
|
|
198
|
+
var import_caip = require("caip");
|
|
199
|
+
var import_enssdk = require("enssdk");
|
|
200
|
+
var import_viem2 = require("viem");
|
|
201
|
+
var import_v4 = require("zod/v4");
|
|
202
|
+
|
|
203
|
+
// src/ens/index.ts
|
|
204
|
+
var import_datasources = require("@ensnode/datasources");
|
|
205
|
+
|
|
206
|
+
// src/shared/currencies.ts
|
|
207
|
+
var import_viem = require("viem");
|
|
208
|
+
var CurrencyIds = {
|
|
209
|
+
ETH: "ETH",
|
|
210
|
+
USDC: "USDC",
|
|
211
|
+
DAI: "DAI",
|
|
212
|
+
ENSTokens: "ENSTokens"
|
|
213
|
+
};
|
|
214
|
+
var currencyInfo = {
|
|
215
|
+
[CurrencyIds.ETH]: {
|
|
216
|
+
id: CurrencyIds.ETH,
|
|
217
|
+
name: "ETH",
|
|
218
|
+
decimals: 18
|
|
219
|
+
},
|
|
220
|
+
[CurrencyIds.USDC]: {
|
|
221
|
+
id: CurrencyIds.USDC,
|
|
222
|
+
name: "USDC",
|
|
223
|
+
decimals: 6
|
|
224
|
+
},
|
|
225
|
+
[CurrencyIds.DAI]: {
|
|
226
|
+
id: CurrencyIds.DAI,
|
|
227
|
+
name: "Dai Stablecoin",
|
|
228
|
+
decimals: 18
|
|
229
|
+
},
|
|
230
|
+
[CurrencyIds.ENSTokens]: {
|
|
231
|
+
id: CurrencyIds.ENSTokens,
|
|
232
|
+
name: "$ENS Tokens",
|
|
233
|
+
decimals: 18
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
function isPriceCurrencyEqual(priceA, priceB) {
|
|
237
|
+
return priceA.currency === priceB.currency;
|
|
238
|
+
}
|
|
239
|
+
function isPriceEqual(priceA, priceB) {
|
|
240
|
+
return isPriceCurrencyEqual(priceA, priceB) && priceA.amount === priceB.amount;
|
|
241
|
+
}
|
|
242
|
+
function addPrices(...prices) {
|
|
243
|
+
const firstPrice = prices[0];
|
|
244
|
+
const allPricesInSameCurrency = prices.every((price) => isPriceCurrencyEqual(firstPrice, price));
|
|
245
|
+
if (allPricesInSameCurrency === false) {
|
|
246
|
+
throw new Error("All prices must have the same currency to be added together.");
|
|
247
|
+
}
|
|
248
|
+
const { currency } = firstPrice;
|
|
249
|
+
return prices.reduce(
|
|
250
|
+
(acc, price) => ({
|
|
251
|
+
amount: acc.amount + price.amount,
|
|
252
|
+
currency
|
|
253
|
+
}),
|
|
254
|
+
{
|
|
255
|
+
amount: 0n,
|
|
256
|
+
currency: firstPrice.currency
|
|
257
|
+
}
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// src/shared/zod-schemas.ts
|
|
262
|
+
var makeBooleanStringSchema = (valueLabel = "Value") => import_v4.z.string().pipe(
|
|
263
|
+
import_v4.z.enum(["true", "false"], {
|
|
264
|
+
error: `${valueLabel} must be 'true' or 'false'.`
|
|
265
|
+
})
|
|
266
|
+
).transform((val) => val === "true");
|
|
267
|
+
var makeFiniteNonNegativeNumberSchema = (valueLabel = "Value") => import_v4.z.number({
|
|
268
|
+
// NOTE: Zod's implementation of `number` automatically rejects NaN and Infinity values.
|
|
269
|
+
// and therefore the finite check is implicit.
|
|
270
|
+
error: `${valueLabel} must be a finite number.`
|
|
271
|
+
}).nonnegative({
|
|
272
|
+
error: `${valueLabel} must be a non-negative number (>=0).`
|
|
273
|
+
});
|
|
274
|
+
var makeIntegerSchema = (valueLabel = "Value") => import_v4.z.int({
|
|
275
|
+
error: `${valueLabel} must be an integer.`
|
|
276
|
+
});
|
|
277
|
+
var makePositiveIntegerSchema = (valueLabel = "Value") => makeIntegerSchema(valueLabel).positive({
|
|
278
|
+
error: `${valueLabel} must be a positive integer (>0).`
|
|
279
|
+
});
|
|
280
|
+
var makeNonNegativeIntegerSchema = (valueLabel = "Value") => makeIntegerSchema(valueLabel).nonnegative({
|
|
281
|
+
error: `${valueLabel} must be a non-negative integer (>=0).`
|
|
282
|
+
});
|
|
283
|
+
var makeDurationSchema = (valueLabel = "Value") => import_v4.z.number({
|
|
284
|
+
error: `${valueLabel} must be a number.`
|
|
285
|
+
}).pipe(makeNonNegativeIntegerSchema(valueLabel));
|
|
286
|
+
var makeChainIdSchema = (valueLabel = "Chain ID") => makePositiveIntegerSchema(valueLabel).transform((val) => val);
|
|
287
|
+
var makeChainIdStringSchema = (valueLabel = "Chain ID String") => import_v4.z.string({ error: `${valueLabel} must be a string representing a chain ID.` }).pipe(import_v4.z.coerce.number({ error: `${valueLabel} must represent a positive integer (>0).` })).pipe(makeChainIdSchema(`The numeric value represented by ${valueLabel}`));
|
|
288
|
+
var makeDefaultableChainIdSchema = (valueLabel = "Defaultable Chain ID") => makeNonNegativeIntegerSchema(valueLabel).transform((val) => val);
|
|
289
|
+
var makeDefaultableChainIdStringSchema = (valueLabel = "Defaultable Chain ID String") => import_v4.z.string({ error: `${valueLabel} must be a string representing a chain ID.` }).pipe(import_v4.z.coerce.number({ error: `${valueLabel} must represent a non-negative integer (>=0).` })).pipe(makeDefaultableChainIdSchema(`The numeric value represented by ${valueLabel}`));
|
|
290
|
+
var makeCoinTypeSchema = (valueLabel = "Coin Type") => import_v4.z.number({ error: `${valueLabel} must be a number.` }).int({ error: `${valueLabel} must be an integer.` }).nonnegative({ error: `${valueLabel} must be a non-negative integer (>=0).` }).transform((val) => val);
|
|
291
|
+
var makeCoinTypeStringSchema = (valueLabel = "Coin Type String") => import_v4.z.string({ error: `${valueLabel} must be a string representing a coin type.` }).pipe(import_v4.z.coerce.number({ error: `${valueLabel} must represent a non-negative integer (>=0).` })).pipe(makeCoinTypeSchema(`The numeric value represented by ${valueLabel}`));
|
|
292
|
+
var makeNormalizedAddressSchema = (valueLabel = "EVM address") => import_v4.z.string().check((ctx) => {
|
|
293
|
+
if (!(0, import_viem2.isAddress)(ctx.value, { strict: false })) {
|
|
294
|
+
ctx.issues.push({
|
|
295
|
+
code: "custom",
|
|
296
|
+
message: `${valueLabel} must be a valid EVM address`,
|
|
297
|
+
input: ctx.value
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
}).transform((val) => (0, import_enssdk.toNormalizedAddress)(val));
|
|
301
|
+
var makeDatetimeSchema = (valueLabel = "Datetime string") => import_v4.z.iso.datetime({ error: `${valueLabel} must be a string in ISO 8601 format.` }).transform((v) => new Date(v));
|
|
302
|
+
var makeUnixTimestampSchema = (valueLabel = "Timestamp") => makeIntegerSchema(valueLabel);
|
|
303
|
+
var makeUrlSchema = (valueLabel = "Value") => import_v4.z.url({
|
|
304
|
+
error: `${valueLabel} must be a valid URL string (e.g., http://localhost:8080 or https://example.com).`,
|
|
305
|
+
abort: true
|
|
306
|
+
}).transform((v) => new URL(v));
|
|
307
|
+
var makeCommaSeparatedList = (valueLabel = "Value") => import_v4.z.string({ error: `${valueLabel} must be a comma separated list.` }).transform((val) => val.split(",").filter(Boolean)).refine((val) => val.length > 0, {
|
|
308
|
+
error: `${valueLabel} must be a comma separated list with at least one value.`
|
|
309
|
+
});
|
|
310
|
+
var makeBlockNumberSchema = (valueLabel = "Block number") => makeNonNegativeIntegerSchema(valueLabel);
|
|
311
|
+
var makeBlockRefSchema = (valueLabel = "Value") => import_v4.z.strictObject(
|
|
312
|
+
{
|
|
313
|
+
timestamp: makeUnixTimestampSchema(`${valueLabel}.timestamp`),
|
|
314
|
+
number: makeBlockNumberSchema(`${valueLabel}.number`)
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
error: `${valueLabel} must be a valid BlockRef object.`
|
|
318
|
+
}
|
|
319
|
+
);
|
|
320
|
+
var makeENSNamespaceIdSchema = (valueLabel = "ENSNamespaceId") => import_v4.z.enum(import_datasources.ENSNamespaceIds, {
|
|
321
|
+
error() {
|
|
322
|
+
return `Invalid ${valueLabel}. Supported ENS namespace IDs are: ${Object.keys(import_datasources.ENSNamespaceIds).join(", ")}`;
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
var makePriceAmountSchema = (valueLabel = "Amount") => import_v4.z.coerce.bigint({
|
|
326
|
+
error: `${valueLabel} must represent a bigint.`
|
|
327
|
+
}).nonnegative({
|
|
328
|
+
error: `${valueLabel} must not be negative.`
|
|
329
|
+
});
|
|
330
|
+
var makeSerializedCurrencyAmountSchema = (valueLabel = "Serialized Currency Amount") => import_v4.z.string({ error: `${valueLabel} must be a string.` }).regex(/^\d+$/, {
|
|
331
|
+
error: `${valueLabel} can only contain digits (0-9) and must represent a non-negative integer.`
|
|
332
|
+
});
|
|
333
|
+
var makePriceCurrencySchema = (currency, valueLabel = "Price Currency") => import_v4.z.strictObject({
|
|
334
|
+
amount: makePriceAmountSchema(`${valueLabel} amount`),
|
|
335
|
+
currency: import_v4.z.literal(currency, {
|
|
336
|
+
error: `${valueLabel} currency must be set to '${currency}'.`
|
|
337
|
+
})
|
|
338
|
+
});
|
|
339
|
+
var makeSerializedPriceCurrencySchema = (currency, valueLabel = "Price Currency") => import_v4.z.strictObject({
|
|
340
|
+
amount: makeSerializedCurrencyAmountSchema(`${valueLabel} amount`),
|
|
341
|
+
currency: import_v4.z.literal(currency, {
|
|
342
|
+
error: `${valueLabel} currency must be set to '${currency}'.`
|
|
343
|
+
})
|
|
344
|
+
});
|
|
345
|
+
var makePriceSchema = (valueLabel = "Price") => import_v4.z.discriminatedUnion(
|
|
346
|
+
"currency",
|
|
347
|
+
[
|
|
348
|
+
makePriceCurrencySchema(CurrencyIds.ETH, valueLabel),
|
|
349
|
+
makePriceCurrencySchema(CurrencyIds.USDC, valueLabel),
|
|
350
|
+
makePriceCurrencySchema(CurrencyIds.DAI, valueLabel),
|
|
351
|
+
makePriceCurrencySchema(CurrencyIds.ENSTokens, valueLabel)
|
|
352
|
+
],
|
|
353
|
+
{ error: `${valueLabel} currency must be one of ${Object.values(CurrencyIds).join(", ")}` }
|
|
354
|
+
);
|
|
355
|
+
var makePriceEthSchema = (valueLabel = "Price ETH") => makePriceCurrencySchema(CurrencyIds.ETH, valueLabel).transform((v) => v);
|
|
356
|
+
var makeSerializedPriceEthSchema = (valueLabel = "Serialized Price ETH") => makeSerializedPriceCurrencySchema(CurrencyIds.ETH, valueLabel).transform(
|
|
357
|
+
(v) => v
|
|
358
|
+
);
|
|
359
|
+
var makePriceUsdcSchema = (valueLabel = "Price USDC") => makePriceCurrencySchema(CurrencyIds.USDC, valueLabel).transform((v) => v);
|
|
360
|
+
var makePriceDaiSchema = (valueLabel = "Price DAI") => makePriceCurrencySchema(CurrencyIds.DAI, valueLabel).transform((v) => v);
|
|
361
|
+
var makePriceEnsTokensSchema = (valueLabel = "Price ENSTokens") => makePriceCurrencySchema(CurrencyIds.ENSTokens, valueLabel).transform((v) => v);
|
|
362
|
+
var makeAccountIdSchema = (valueLabel = "AccountId") => import_v4.z.strictObject({
|
|
363
|
+
chainId: makeChainIdSchema(`${valueLabel} chain ID`),
|
|
364
|
+
address: makeNormalizedAddressSchema(`${valueLabel} address`)
|
|
365
|
+
});
|
|
366
|
+
var makeAccountIdStringSchema = (valueLabel = "Account ID String") => import_v4.z.coerce.string().transform((v) => {
|
|
367
|
+
const result = new import_caip.AccountId(v);
|
|
368
|
+
return {
|
|
369
|
+
chainId: Number(result.chainId.reference),
|
|
370
|
+
address: result.address
|
|
371
|
+
};
|
|
372
|
+
}).pipe(makeAccountIdSchema(valueLabel));
|
|
373
|
+
var makeHexStringSchema = (options, valueLabel = "String representation of bytes array") => import_v4.z.string().check(function invariant_isHexEncoded(ctx) {
|
|
374
|
+
if (!(0, import_viem2.isHex)(ctx.value)) {
|
|
375
|
+
ctx.issues.push({
|
|
376
|
+
code: "custom",
|
|
377
|
+
input: ctx.value,
|
|
378
|
+
message: `${valueLabel} must be a hexadecimal value which starts with '0x'.`
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
}).transform((v) => v).check(function invariant_encodesRequiredBytesCount(ctx) {
|
|
382
|
+
const expectedBytesCount = options.bytesCount;
|
|
383
|
+
const actualBytesCount = (0, import_viem2.size)(ctx.value);
|
|
384
|
+
if (actualBytesCount !== expectedBytesCount) {
|
|
385
|
+
ctx.issues.push({
|
|
386
|
+
code: "custom",
|
|
387
|
+
input: ctx.value,
|
|
388
|
+
message: `${valueLabel} must represent exactly ${expectedBytesCount} bytes. Currently represented bytes count: ${actualBytesCount}.`
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
});
|
|
392
|
+
var makeNodeSchema = (valueLabel = "Node") => makeHexStringSchema({ bytesCount: 32 }, valueLabel);
|
|
393
|
+
var makeTransactionHashSchema = (valueLabel = "Transaction hash") => makeHexStringSchema({ bytesCount: 32 }, valueLabel);
|
|
394
|
+
var makeReinterpretedNameSchema = (valueLabel = "Reinterpreted Name") => import_v4.z.string().transform((v) => v).check((ctx) => {
|
|
395
|
+
try {
|
|
396
|
+
(0, import_enssdk.reinterpretName)(ctx.value);
|
|
397
|
+
} catch (error) {
|
|
398
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
399
|
+
ctx.issues.push({
|
|
400
|
+
code: "custom",
|
|
401
|
+
input: ctx.value,
|
|
402
|
+
message: `${valueLabel} cannot be reinterpreted: ${errorMessage}`
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
}).transform(import_enssdk.reinterpretName);
|
|
406
|
+
|
|
407
|
+
// src/ensrainbow/zod-schemas/config.ts
|
|
408
|
+
var makeLabelSetIdSchema = (valueLabel = "Label set ID") => {
|
|
409
|
+
return import_v42.z.string({ error: `${valueLabel} must be a string` }).min(1, { error: `${valueLabel} must be 1-50 characters long` }).max(50, { error: `${valueLabel} must be 1-50 characters long` }).regex(/^[a-z-]+$/, {
|
|
410
|
+
error: `${valueLabel} can only contain lowercase letters (a-z) and hyphens (-)`
|
|
411
|
+
});
|
|
412
|
+
};
|
|
413
|
+
var makeLabelSetVersionSchema = (valueLabel = "Label set version") => makeNonNegativeIntegerSchema(valueLabel);
|
|
414
|
+
var makeLabelSetVersionStringSchema = (valueLabel = "Label set version") => import_v42.z.coerce.number({ error: `${valueLabel} must be a non-negative integer` }).pipe(makeLabelSetVersionSchema(valueLabel));
|
|
415
|
+
var makeEnsRainbowPublicConfigSchema = (valueLabel = "EnsRainbowPublicConfig") => import_v42.z.object({
|
|
416
|
+
serverLabelSet: import_v42.z.object({
|
|
417
|
+
labelSetId: makeLabelSetIdSchema(`${valueLabel}.serverLabelSet.labelSetId`),
|
|
418
|
+
highestLabelSetVersion: makeLabelSetVersionSchema(
|
|
419
|
+
`${valueLabel}.serverLabelSet.highestLabelSetVersion`
|
|
420
|
+
)
|
|
421
|
+
}),
|
|
422
|
+
versionInfo: import_v42.z.object({
|
|
423
|
+
ensRainbow: import_v42.z.string().nonempty({ error: `${valueLabel}.versionInfo.ensRainbow must be a non-empty string.` })
|
|
424
|
+
})
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
// src/shared/collections.ts
|
|
428
|
+
var uniq = (arr) => [...new Set(arr)];
|
|
429
|
+
|
|
430
|
+
// src/ensindexer/config/is-subgraph-compatible.ts
|
|
431
|
+
var import_datasources2 = require("@ensnode/datasources");
|
|
432
|
+
function isSubgraphCompatible(config) {
|
|
433
|
+
const onlySubgraphPluginActivated = config.plugins.length === 1 && config.plugins[0] === "subgraph" /* Subgraph */;
|
|
434
|
+
const isSubgraphLabelSet = config.clientLabelSet.labelSetId === "subgraph" && config.clientLabelSet.labelSetVersion === 0;
|
|
435
|
+
const isEnsTestEnvLabelSet = config.clientLabelSet.labelSetId === "ens-test-env" && config.clientLabelSet.labelSetVersion === 0;
|
|
436
|
+
const labelSetIsSubgraphCompatible = isSubgraphLabelSet || config.namespace === import_datasources2.ENSNamespaceIds.EnsTestEnv && isEnsTestEnvLabelSet;
|
|
437
|
+
return onlySubgraphPluginActivated && labelSetIsSubgraphCompatible;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
// src/ensindexer/config/labelset-utils.ts
|
|
441
|
+
function validateSupportedLabelSetAndVersion(serverSet, clientSet) {
|
|
442
|
+
if (clientSet.labelSetId === void 0) {
|
|
443
|
+
return;
|
|
444
|
+
}
|
|
445
|
+
if (serverSet.labelSetId !== clientSet.labelSetId) {
|
|
446
|
+
throw new Error(
|
|
447
|
+
`Server label set ID "${serverSet.labelSetId}" does not match client's requested label set ID "${clientSet.labelSetId}".`
|
|
448
|
+
);
|
|
449
|
+
}
|
|
450
|
+
if (clientSet.labelSetVersion !== void 0 && serverSet.highestLabelSetVersion < clientSet.labelSetVersion) {
|
|
451
|
+
throw new Error(
|
|
452
|
+
`Server highest label set version ${serverSet.highestLabelSetVersion} is less than client's requested version ${clientSet.labelSetVersion} for label set ID "${clientSet.labelSetId}".`
|
|
453
|
+
);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
// src/ensindexer/config/validations.ts
|
|
458
|
+
function invariant_ensDbVersionIsSameAsEnsIndexerVersion(ctx) {
|
|
459
|
+
const versionInfo = ctx.value;
|
|
460
|
+
if (versionInfo.ensDb !== versionInfo.ensIndexer) {
|
|
461
|
+
ctx.issues.push({
|
|
462
|
+
code: "custom",
|
|
463
|
+
input: versionInfo,
|
|
464
|
+
message: "`ensDb` version must be same as `ensIndexer` version"
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
// src/ensindexer/config/zod-schemas.ts
|
|
470
|
+
var makeIndexedChainIdsSchema = (valueLabel = "Indexed Chain IDs") => import_v43.z.set(makeChainIdSchema(valueLabel), { error: `${valueLabel} must be a set` }).min(1, {
|
|
471
|
+
error: `${valueLabel} must be a set with at least one chain ID.`
|
|
472
|
+
});
|
|
473
|
+
var makeSerializedIndexedChainIdsSchema = (valueLabel = "Indexed Chain IDs") => import_v43.z.array(makeChainIdSchema(valueLabel), {
|
|
474
|
+
error: `${valueLabel} must be an array.`
|
|
475
|
+
}).min(1, {
|
|
476
|
+
error: `${valueLabel} must be an array with at least one chain ID.`
|
|
477
|
+
});
|
|
478
|
+
var makePluginsListSchema = (valueLabel = "Plugins") => import_v43.z.array(import_v43.z.string(), {
|
|
479
|
+
error: `${valueLabel} must be a list of strings.`
|
|
480
|
+
}).min(1, {
|
|
481
|
+
error: `${valueLabel} must be a list of strings with at least one string value`
|
|
482
|
+
}).refine((arr) => arr.length === uniq(arr).length, {
|
|
483
|
+
error: `${valueLabel} cannot contain duplicate values.`
|
|
484
|
+
});
|
|
485
|
+
var makeEnsIndexerSchemaNameSchema = (valueLabel = "ENS Indexer Schema Name") => import_v43.z.string({ error: `${valueLabel} must be a string` }).trim().nonempty({
|
|
486
|
+
error: `${valueLabel} is required and must be a non-empty string.`
|
|
487
|
+
});
|
|
488
|
+
var makeFullyPinnedLabelSetSchema = (valueLabel = "Label set") => {
|
|
489
|
+
let valueLabelLabelSetId = valueLabel;
|
|
490
|
+
let valueLabelLabelSetVersion = valueLabel;
|
|
491
|
+
if (valueLabel === "LABEL_SET") {
|
|
492
|
+
valueLabelLabelSetId = "LABEL_SET_ID";
|
|
493
|
+
valueLabelLabelSetVersion = "LABEL_SET_VERSION";
|
|
494
|
+
} else {
|
|
495
|
+
valueLabelLabelSetId = `${valueLabel}.labelSetId`;
|
|
496
|
+
valueLabelLabelSetVersion = `${valueLabel}.labelSetVersion`;
|
|
497
|
+
}
|
|
498
|
+
return import_v43.z.object({
|
|
499
|
+
labelSetId: makeLabelSetIdSchema(valueLabelLabelSetId),
|
|
500
|
+
labelSetVersion: makeLabelSetVersionStringSchema(valueLabelLabelSetVersion)
|
|
501
|
+
});
|
|
502
|
+
};
|
|
503
|
+
var makeNonEmptyStringSchema = (valueLabel = "Value") => import_v43.z.string().nonempty({ error: `${valueLabel} must be a non-empty string.` });
|
|
504
|
+
var makeEnsIndexerVersionInfoSchema = (valueLabel = "Value") => import_v43.z.object(
|
|
505
|
+
{
|
|
506
|
+
ponder: makeNonEmptyStringSchema(),
|
|
507
|
+
ensDb: makeNonEmptyStringSchema(),
|
|
508
|
+
ensIndexer: makeNonEmptyStringSchema(),
|
|
509
|
+
ensNormalize: makeNonEmptyStringSchema()
|
|
510
|
+
},
|
|
511
|
+
{
|
|
512
|
+
error: `${valueLabel} must be a valid ENSIndexerVersionInfo object.`
|
|
513
|
+
}
|
|
514
|
+
).check(invariant_ensDbVersionIsSameAsEnsIndexerVersion);
|
|
515
|
+
var makeENSIndexerVersionInfoSchema = makeEnsIndexerVersionInfoSchema;
|
|
516
|
+
function invariant_isSubgraphCompatibleRequirements(ctx) {
|
|
517
|
+
const { value: config } = ctx;
|
|
518
|
+
if (config.isSubgraphCompatible && !isSubgraphCompatible(config)) {
|
|
519
|
+
ctx.issues.push({
|
|
520
|
+
code: "custom",
|
|
521
|
+
input: config,
|
|
522
|
+
message: `'isSubgraphCompatible' requires only the '${"subgraph" /* Subgraph */}' plugin to be active and 'clientLabelSet' must be {labelSetId: "subgraph", labelSetVersion: 0}`
|
|
523
|
+
});
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
function invariant_ensRainbowSupportedLabelSetAndVersion(ctx) {
|
|
527
|
+
const { clientLabelSet } = ctx.value;
|
|
528
|
+
const { serverLabelSet } = ctx.value.ensRainbowPublicConfig;
|
|
529
|
+
try {
|
|
530
|
+
validateSupportedLabelSetAndVersion(serverLabelSet, clientLabelSet);
|
|
531
|
+
} catch (error) {
|
|
532
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
533
|
+
ctx.issues.push({
|
|
534
|
+
code: "custom",
|
|
535
|
+
input: ctx.value,
|
|
536
|
+
message: `The ENSRainbow label set and version specified in the config are not supported by the ENSRainbow version specified in ensRainbowPublicConfig. Cause: ${errorMessage}`
|
|
537
|
+
});
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
var makeEnsIndexerPublicConfigSchema = (valueLabel = "ENSIndexerPublicConfig") => import_v43.z.object({
|
|
541
|
+
ensIndexerSchemaName: makeEnsIndexerSchemaNameSchema(`${valueLabel}.ensIndexerSchemaName`),
|
|
542
|
+
ensRainbowPublicConfig: makeEnsRainbowPublicConfigSchema(
|
|
543
|
+
`${valueLabel}.ensRainbowPublicConfig`
|
|
544
|
+
),
|
|
545
|
+
indexedChainIds: makeIndexedChainIdsSchema(`${valueLabel}.indexedChainIds`),
|
|
546
|
+
isSubgraphCompatible: import_v43.z.boolean({
|
|
547
|
+
error: `${valueLabel}.isSubgraphCompatible must be a boolean value.`
|
|
548
|
+
}),
|
|
549
|
+
clientLabelSet: makeFullyPinnedLabelSetSchema(`${valueLabel}.clientLabelSet`),
|
|
550
|
+
namespace: makeENSNamespaceIdSchema(`${valueLabel}.namespace`),
|
|
551
|
+
plugins: makePluginsListSchema(`${valueLabel}.plugins`),
|
|
552
|
+
versionInfo: makeEnsIndexerVersionInfoSchema(`${valueLabel}.versionInfo`)
|
|
553
|
+
}).check(invariant_isSubgraphCompatibleRequirements).check(invariant_ensRainbowSupportedLabelSetAndVersion);
|
|
554
|
+
var makeENSIndexerPublicConfigSchema = makeEnsIndexerPublicConfigSchema;
|
|
555
|
+
var makeSerializedEnsIndexerPublicConfigSchema = (valueLabel = "Serialized ENSIndexerPublicConfig") => import_v43.z.object({
|
|
556
|
+
ensIndexerSchemaName: makeEnsIndexerSchemaNameSchema(`${valueLabel}.ensIndexerSchemaName`),
|
|
557
|
+
ensRainbowPublicConfig: makeEnsRainbowPublicConfigSchema(
|
|
558
|
+
`${valueLabel}.ensRainbowPublicConfig`
|
|
559
|
+
),
|
|
560
|
+
indexedChainIds: makeSerializedIndexedChainIdsSchema(`${valueLabel}.indexedChainIds`),
|
|
561
|
+
isSubgraphCompatible: import_v43.z.boolean({
|
|
562
|
+
error: `${valueLabel}.isSubgraphCompatible must be a boolean value.`
|
|
563
|
+
}),
|
|
564
|
+
clientLabelSet: makeFullyPinnedLabelSetSchema(`${valueLabel}.clientLabelSet`),
|
|
565
|
+
namespace: makeENSNamespaceIdSchema(`${valueLabel}.namespace`),
|
|
566
|
+
plugins: makePluginsListSchema(`${valueLabel}.plugins`),
|
|
567
|
+
versionInfo: makeEnsIndexerVersionInfoSchema(`${valueLabel}.versionInfo`)
|
|
568
|
+
});
|
|
569
|
+
|
|
570
|
+
// src/shared/config/thegraph.ts
|
|
571
|
+
var import_v44 = require("zod/v4");
|
|
572
|
+
var TheGraphCannotFallbackReasonSchema = import_v44.z.enum({
|
|
573
|
+
NotSubgraphCompatible: "not-subgraph-compatible",
|
|
574
|
+
NoApiKey: "no-api-key",
|
|
575
|
+
NoSubgraphUrl: "no-subgraph-url"
|
|
576
|
+
});
|
|
577
|
+
var TheGraphFallbackSchema = import_v44.z.discriminatedUnion("canFallback", [
|
|
578
|
+
import_v44.z.strictObject({
|
|
579
|
+
canFallback: import_v44.z.literal(true),
|
|
580
|
+
url: import_v44.z.string()
|
|
581
|
+
}),
|
|
582
|
+
import_v44.z.strictObject({
|
|
583
|
+
canFallback: import_v44.z.literal(false),
|
|
584
|
+
reason: TheGraphCannotFallbackReasonSchema
|
|
585
|
+
})
|
|
586
|
+
]);
|
|
587
|
+
|
|
588
|
+
// src/ensapi/config/zod-schemas.ts
|
|
589
|
+
var makeEnsApiVersionInfoSchema = (valueLabel = "ENS API version info") => import_v45.z.object({
|
|
590
|
+
ensApi: import_v45.z.string().nonempty(`${valueLabel}.ensApi must be a non-empty string`),
|
|
591
|
+
ensNormalize: import_v45.z.string().nonempty(`${valueLabel}.ensNormalize must be a non-empty string`)
|
|
592
|
+
});
|
|
593
|
+
function makeEnsApiPublicConfigSchema(valueLabel) {
|
|
594
|
+
const label = valueLabel ?? "ENSApiPublicConfig";
|
|
595
|
+
return import_v45.z.object({
|
|
596
|
+
theGraphFallback: TheGraphFallbackSchema,
|
|
597
|
+
ensIndexerPublicConfig: makeEnsIndexerPublicConfigSchema(`${label}.ensIndexerPublicConfig`),
|
|
598
|
+
versionInfo: makeEnsApiVersionInfoSchema(`${label}.versionInfo`)
|
|
599
|
+
});
|
|
600
|
+
}
|
|
601
|
+
var makeENSApiPublicConfigSchema = makeEnsApiPublicConfigSchema;
|
|
602
|
+
function makeSerializedEnsApiPublicConfigSchema(valueLabel) {
|
|
603
|
+
const label = valueLabel ?? "ENSApiPublicConfig";
|
|
604
|
+
return import_v45.z.object({
|
|
605
|
+
ensIndexerPublicConfig: makeSerializedEnsIndexerPublicConfigSchema(
|
|
606
|
+
`${label}.ensIndexerPublicConfig`
|
|
607
|
+
),
|
|
608
|
+
theGraphFallback: TheGraphFallbackSchema,
|
|
609
|
+
versionInfo: makeEnsApiVersionInfoSchema(`${label}.versionInfo`)
|
|
610
|
+
});
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
// src/ensnode/api/indexing-status/zod-schemas.ts
|
|
614
|
+
var import_v412 = require("zod/v4");
|
|
615
|
+
|
|
616
|
+
// src/indexing-status/zod-schema/realtime-indexing-status-projection.ts
|
|
617
|
+
var import_v49 = require("zod/v4");
|
|
618
|
+
|
|
619
|
+
// src/indexing-status/zod-schema/cross-chain-indexing-status-snapshot.ts
|
|
620
|
+
var import_v48 = require("zod/v4");
|
|
621
|
+
|
|
622
|
+
// src/shared/block-ref.ts
|
|
623
|
+
function isBefore(blockA, blockB) {
|
|
624
|
+
return blockA.number < blockB.number;
|
|
625
|
+
}
|
|
626
|
+
function isEqualTo(blockA, blockB) {
|
|
627
|
+
return blockA.number === blockB.number && blockA.timestamp === blockB.timestamp;
|
|
628
|
+
}
|
|
629
|
+
function isBeforeOrEqualTo(blockA, blockB) {
|
|
630
|
+
return isBefore(blockA, blockB) || isEqualTo(blockA, blockB);
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
// src/shared/blockrange.ts
|
|
634
|
+
var RangeTypeIds = {
|
|
635
|
+
Unbounded: "unbounded",
|
|
636
|
+
LeftBounded: "left-bounded",
|
|
637
|
+
RightBounded: "right-bounded",
|
|
638
|
+
Bounded: "bounded"
|
|
639
|
+
};
|
|
640
|
+
|
|
641
|
+
// src/indexing-status/chain-indexing-status-snapshot.ts
|
|
642
|
+
var ChainIndexingStatusIds = {
|
|
643
|
+
/**
|
|
644
|
+
* Represents that indexing of the chain is not ready to begin yet because:
|
|
645
|
+
* - ENSIndexer is in its initialization phase and the data to build a
|
|
646
|
+
* "true" {@link ChainIndexingStatusSnapshot} for the chain is still being loaded; or
|
|
647
|
+
* - ENSIndexer is using an omnichain indexing strategy and the
|
|
648
|
+
* `omnichainIndexingCursor` is <= `config.startBlock.timestamp` for the chain's
|
|
649
|
+
* {@link ChainIndexingStatusSnapshot}.
|
|
650
|
+
*/
|
|
651
|
+
Queued: "chain-queued",
|
|
652
|
+
/**
|
|
653
|
+
* Represents that indexing of the chain is in progress and under a special
|
|
654
|
+
* "backfill" phase that optimizes for accelerated indexing until reaching the
|
|
655
|
+
* "fixed target" `backfillEndBlock`.
|
|
656
|
+
*/
|
|
657
|
+
Backfill: "chain-backfill",
|
|
658
|
+
/**
|
|
659
|
+
* Represents that the "backfill" phase of indexing the chain is completed
|
|
660
|
+
* and that the chain is configured to be indexed for an indefinite range.
|
|
661
|
+
* Therefore, indexing of the chain remains indefinitely in progress where
|
|
662
|
+
* ENSIndexer will continuously work to discover and index new blocks as they
|
|
663
|
+
* are added to the chain across time.
|
|
664
|
+
*/
|
|
665
|
+
Following: "chain-following",
|
|
666
|
+
/**
|
|
667
|
+
* Represents that indexing of the chain is completed as the chain is configured
|
|
668
|
+
* to be indexed for a definite range and the indexing of all blocks through
|
|
669
|
+
* that definite range is completed.
|
|
670
|
+
*/
|
|
671
|
+
Completed: "chain-completed"
|
|
672
|
+
};
|
|
673
|
+
|
|
674
|
+
// src/indexing-status/cross-chain-indexing-status-snapshot.ts
|
|
675
|
+
var CrossChainIndexingStrategyIds = {
|
|
676
|
+
/**
|
|
677
|
+
* Represents that the indexing of events across all indexed chains will
|
|
678
|
+
* proceed in a deterministic "omnichain" ordering by block timestamp, chain ID,
|
|
679
|
+
* and block number.
|
|
680
|
+
*
|
|
681
|
+
* This strategy is "deterministic" in that the order of processing cross-chain indexed
|
|
682
|
+
* events and each resulting indexed data state transition recorded in ENSDb is always
|
|
683
|
+
* the same for each ENSIndexer instance operating with an equivalent
|
|
684
|
+
* `ENSIndexerConfig` and ENSIndexer version. However it also has the drawbacks of:
|
|
685
|
+
* - increased indexing latency that must wait for the slowest indexed chain to
|
|
686
|
+
* add new blocks or to discover new blocks through the configured RPCs.
|
|
687
|
+
* - if any indexed chain gets "stuck" due to chain or RPC failures, all indexed chains
|
|
688
|
+
* will be affected.
|
|
689
|
+
*/
|
|
690
|
+
Omnichain: "omnichain"
|
|
691
|
+
};
|
|
692
|
+
function getHighestKnownBlockTimestamp(chains) {
|
|
693
|
+
if (chains.length === 0) {
|
|
694
|
+
throw new Error(
|
|
695
|
+
"Invariant violation: at least one chain is required to determine the highest known block timestamp"
|
|
696
|
+
);
|
|
697
|
+
}
|
|
698
|
+
const startBlockTimestamps = chains.map((chain) => chain.config.startBlock.timestamp);
|
|
699
|
+
const endBlockTimestamps = chains.map((chain) => chain.config).filter((chainConfig) => chainConfig.rangeType === RangeTypeIds.Bounded).map((chainConfig) => chainConfig.endBlock.timestamp);
|
|
700
|
+
const backfillEndBlockTimestamps = chains.filter((chain) => chain.chainStatus === ChainIndexingStatusIds.Backfill).map((chain) => chain.backfillEndBlock.timestamp);
|
|
701
|
+
const latestKnownBlockTimestamps = chains.filter((chain) => chain.chainStatus === ChainIndexingStatusIds.Following).map((chain) => chain.latestKnownBlock.timestamp);
|
|
702
|
+
return Math.max(
|
|
703
|
+
...startBlockTimestamps,
|
|
704
|
+
...endBlockTimestamps,
|
|
705
|
+
...backfillEndBlockTimestamps,
|
|
706
|
+
...latestKnownBlockTimestamps
|
|
707
|
+
);
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
// src/indexing-status/zod-schema/omnichain-indexing-status-snapshot.ts
|
|
711
|
+
var import_v47 = require("zod/v4");
|
|
712
|
+
|
|
713
|
+
// src/indexing-status/omnichain-indexing-status-snapshot.ts
|
|
714
|
+
var OmnichainIndexingStatusIds = {
|
|
715
|
+
/**
|
|
716
|
+
* Represents that omnichain indexing is not ready to begin yet because
|
|
717
|
+
* ENSIndexer is in its initialization phase and the data to build a "true"
|
|
718
|
+
* {@link OmnichainIndexingStatusSnapshot} is still being loaded.
|
|
719
|
+
*/
|
|
720
|
+
Unstarted: "omnichain-unstarted",
|
|
721
|
+
/**
|
|
722
|
+
* Represents that omnichain indexing is in an overall "backfill" status because
|
|
723
|
+
* - At least one indexed chain has a `chainStatus` of
|
|
724
|
+
* {@link ChainIndexingStatusIds.Backfill}; and
|
|
725
|
+
* - No indexed chain has a `chainStatus` of {@link ChainIndexingStatusIds.Following}.
|
|
726
|
+
*/
|
|
727
|
+
Backfill: "omnichain-backfill",
|
|
728
|
+
/**
|
|
729
|
+
* Represents that omnichain indexing is in an overall "following" status because
|
|
730
|
+
* at least one indexed chain has a `chainStatus` of
|
|
731
|
+
* {@link ChainIndexingStatusIds.Following}.
|
|
732
|
+
*/
|
|
733
|
+
Following: "omnichain-following",
|
|
734
|
+
/**
|
|
735
|
+
* Represents that omnichain indexing has completed because all indexed chains have
|
|
736
|
+
* a `chainStatus` of {@link ChainIndexingStatusIds.Completed}.
|
|
737
|
+
*/
|
|
738
|
+
Completed: "omnichain-completed"
|
|
739
|
+
};
|
|
740
|
+
function checkChainIndexingStatusSnapshotsForOmnichainStatusSnapshotUnstarted(chains) {
|
|
741
|
+
return chains.every((chain) => chain.chainStatus === ChainIndexingStatusIds.Queued);
|
|
742
|
+
}
|
|
743
|
+
function checkChainIndexingStatusSnapshotsForOmnichainStatusSnapshotBackfill(chains) {
|
|
744
|
+
const atLeastOneChainInTargetStatus = chains.some(
|
|
745
|
+
(chain) => chain.chainStatus === ChainIndexingStatusIds.Backfill
|
|
746
|
+
);
|
|
747
|
+
const otherChainsHaveValidStatuses = chains.every(
|
|
748
|
+
(chain) => chain.chainStatus === ChainIndexingStatusIds.Queued || chain.chainStatus === ChainIndexingStatusIds.Backfill || chain.chainStatus === ChainIndexingStatusIds.Completed
|
|
749
|
+
);
|
|
750
|
+
return atLeastOneChainInTargetStatus && otherChainsHaveValidStatuses;
|
|
751
|
+
}
|
|
752
|
+
function checkChainIndexingStatusSnapshotsForOmnichainStatusSnapshotCompleted(chains) {
|
|
753
|
+
const allChainsHaveValidStatuses = chains.every(
|
|
754
|
+
(chain) => chain.chainStatus === ChainIndexingStatusIds.Completed
|
|
755
|
+
);
|
|
756
|
+
return allChainsHaveValidStatuses;
|
|
757
|
+
}
|
|
758
|
+
function checkChainIndexingStatusSnapshotsForOmnichainStatusSnapshotFollowing(chains) {
|
|
759
|
+
const allChainsHaveValidStatuses = chains.some(
|
|
760
|
+
(chain) => chain.chainStatus === ChainIndexingStatusIds.Following
|
|
761
|
+
);
|
|
762
|
+
return allChainsHaveValidStatuses;
|
|
763
|
+
}
|
|
764
|
+
function getOmnichainIndexingStatus(chains) {
|
|
765
|
+
if (checkChainIndexingStatusSnapshotsForOmnichainStatusSnapshotFollowing(chains)) {
|
|
766
|
+
return OmnichainIndexingStatusIds.Following;
|
|
767
|
+
}
|
|
768
|
+
if (checkChainIndexingStatusSnapshotsForOmnichainStatusSnapshotBackfill(chains)) {
|
|
769
|
+
return OmnichainIndexingStatusIds.Backfill;
|
|
770
|
+
}
|
|
771
|
+
if (checkChainIndexingStatusSnapshotsForOmnichainStatusSnapshotUnstarted(chains)) {
|
|
772
|
+
return OmnichainIndexingStatusIds.Unstarted;
|
|
773
|
+
}
|
|
774
|
+
if (checkChainIndexingStatusSnapshotsForOmnichainStatusSnapshotCompleted(chains)) {
|
|
775
|
+
return OmnichainIndexingStatusIds.Completed;
|
|
776
|
+
}
|
|
777
|
+
throw new Error(`Unable to determine omnichain indexing status for provided chains.`);
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
// src/indexing-status/zod-schema/chain-indexing-status-snapshot.ts
|
|
781
|
+
var import_v46 = require("zod/v4");
|
|
782
|
+
function invariant_chainSnapshotQueuedBlocks(ctx) {
|
|
783
|
+
const { config } = ctx.value;
|
|
784
|
+
if (config.rangeType === RangeTypeIds.LeftBounded) {
|
|
785
|
+
return;
|
|
786
|
+
}
|
|
787
|
+
if (isBeforeOrEqualTo(config.startBlock, config.endBlock) === false) {
|
|
788
|
+
ctx.issues.push({
|
|
789
|
+
code: "custom",
|
|
790
|
+
input: ctx.value,
|
|
791
|
+
message: "`config.startBlock` must be before or same as `config.endBlock`."
|
|
792
|
+
});
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
function invariant_chainSnapshotBackfillBlocks(ctx) {
|
|
796
|
+
const { config, latestIndexedBlock, backfillEndBlock } = ctx.value;
|
|
797
|
+
if (isBeforeOrEqualTo(config.startBlock, latestIndexedBlock) === false) {
|
|
798
|
+
ctx.issues.push({
|
|
799
|
+
code: "custom",
|
|
800
|
+
input: ctx.value,
|
|
801
|
+
message: "`config.startBlock` must be before or same as `latestIndexedBlock`."
|
|
802
|
+
});
|
|
803
|
+
}
|
|
804
|
+
if (isBeforeOrEqualTo(latestIndexedBlock, backfillEndBlock) === false) {
|
|
805
|
+
ctx.issues.push({
|
|
806
|
+
code: "custom",
|
|
807
|
+
input: ctx.value,
|
|
808
|
+
message: "`latestIndexedBlock` must be before or same as `backfillEndBlock`."
|
|
809
|
+
});
|
|
810
|
+
}
|
|
811
|
+
if (config.rangeType === RangeTypeIds.LeftBounded) {
|
|
812
|
+
return;
|
|
813
|
+
}
|
|
814
|
+
if (isEqualTo(backfillEndBlock, config.endBlock) === false) {
|
|
815
|
+
ctx.issues.push({
|
|
816
|
+
code: "custom",
|
|
817
|
+
input: ctx.value,
|
|
818
|
+
message: "`backfillEndBlock` must be the same as `config.endBlock`."
|
|
819
|
+
});
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
function invariant_chainSnapshotCompletedBlocks(ctx) {
|
|
823
|
+
const { config, latestIndexedBlock } = ctx.value;
|
|
824
|
+
if (isBeforeOrEqualTo(config.startBlock, latestIndexedBlock) === false) {
|
|
825
|
+
ctx.issues.push({
|
|
826
|
+
code: "custom",
|
|
827
|
+
input: ctx.value,
|
|
828
|
+
message: "`config.startBlock` must be before or same as `latestIndexedBlock`."
|
|
829
|
+
});
|
|
830
|
+
}
|
|
831
|
+
if (isBeforeOrEqualTo(latestIndexedBlock, config.endBlock) === false) {
|
|
832
|
+
ctx.issues.push({
|
|
833
|
+
code: "custom",
|
|
834
|
+
input: ctx.value,
|
|
835
|
+
message: "`latestIndexedBlock` must be before or same as `config.endBlock`."
|
|
836
|
+
});
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
function invariant_chainSnapshotFollowingBlocks(ctx) {
|
|
840
|
+
const { config, latestIndexedBlock, latestKnownBlock } = ctx.value;
|
|
841
|
+
if (isBeforeOrEqualTo(config.startBlock, latestIndexedBlock) === false) {
|
|
842
|
+
ctx.issues.push({
|
|
843
|
+
code: "custom",
|
|
844
|
+
input: ctx.value,
|
|
845
|
+
message: "`config.startBlock` must be before or same as `latestIndexedBlock`."
|
|
846
|
+
});
|
|
847
|
+
}
|
|
848
|
+
if (isBeforeOrEqualTo(latestIndexedBlock, latestKnownBlock) === false) {
|
|
849
|
+
ctx.issues.push({
|
|
850
|
+
code: "custom",
|
|
851
|
+
input: ctx.value,
|
|
852
|
+
message: "`latestIndexedBlock` must be before or same as `latestKnownBlock`."
|
|
853
|
+
});
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
var makeChainIndexingStatusSnapshotQueuedSchema = (valueLabel = "Value") => import_v46.z.object({
|
|
857
|
+
chainStatus: import_v46.z.literal(ChainIndexingStatusIds.Queued),
|
|
858
|
+
config: import_v46.z.discriminatedUnion("rangeType", [
|
|
859
|
+
import_v46.z.object({
|
|
860
|
+
rangeType: import_v46.z.literal(RangeTypeIds.LeftBounded),
|
|
861
|
+
startBlock: makeBlockRefSchema(valueLabel)
|
|
862
|
+
}),
|
|
863
|
+
import_v46.z.object({
|
|
864
|
+
rangeType: import_v46.z.literal(RangeTypeIds.Bounded),
|
|
865
|
+
startBlock: makeBlockRefSchema(valueLabel),
|
|
866
|
+
endBlock: makeBlockRefSchema(valueLabel)
|
|
867
|
+
})
|
|
868
|
+
])
|
|
869
|
+
}).check(invariant_chainSnapshotQueuedBlocks);
|
|
870
|
+
var makeChainIndexingStatusSnapshotBackfillSchema = (valueLabel = "Value") => import_v46.z.object({
|
|
871
|
+
chainStatus: import_v46.z.literal(ChainIndexingStatusIds.Backfill),
|
|
872
|
+
config: import_v46.z.discriminatedUnion("rangeType", [
|
|
873
|
+
import_v46.z.object({
|
|
874
|
+
rangeType: import_v46.z.literal(RangeTypeIds.LeftBounded),
|
|
875
|
+
startBlock: makeBlockRefSchema(valueLabel)
|
|
876
|
+
}),
|
|
877
|
+
import_v46.z.object({
|
|
878
|
+
rangeType: import_v46.z.literal(RangeTypeIds.Bounded),
|
|
879
|
+
startBlock: makeBlockRefSchema(valueLabel),
|
|
880
|
+
endBlock: makeBlockRefSchema(valueLabel)
|
|
881
|
+
})
|
|
882
|
+
]),
|
|
883
|
+
latestIndexedBlock: makeBlockRefSchema(valueLabel),
|
|
884
|
+
backfillEndBlock: makeBlockRefSchema(valueLabel)
|
|
885
|
+
}).check(invariant_chainSnapshotBackfillBlocks);
|
|
886
|
+
var makeChainIndexingStatusSnapshotCompletedSchema = (valueLabel = "Value") => import_v46.z.object({
|
|
887
|
+
chainStatus: import_v46.z.literal(ChainIndexingStatusIds.Completed),
|
|
888
|
+
config: import_v46.z.object({
|
|
889
|
+
rangeType: import_v46.z.literal(RangeTypeIds.Bounded),
|
|
890
|
+
startBlock: makeBlockRefSchema(valueLabel),
|
|
891
|
+
endBlock: makeBlockRefSchema(valueLabel)
|
|
892
|
+
}),
|
|
893
|
+
latestIndexedBlock: makeBlockRefSchema(valueLabel)
|
|
894
|
+
}).check(invariant_chainSnapshotCompletedBlocks);
|
|
895
|
+
var makeChainIndexingStatusSnapshotFollowingSchema = (valueLabel = "Value") => import_v46.z.object({
|
|
896
|
+
chainStatus: import_v46.z.literal(ChainIndexingStatusIds.Following),
|
|
897
|
+
config: import_v46.z.object({
|
|
898
|
+
rangeType: import_v46.z.literal(RangeTypeIds.LeftBounded),
|
|
899
|
+
startBlock: makeBlockRefSchema(valueLabel)
|
|
900
|
+
}),
|
|
901
|
+
latestIndexedBlock: makeBlockRefSchema(valueLabel),
|
|
902
|
+
latestKnownBlock: makeBlockRefSchema(valueLabel)
|
|
903
|
+
}).check(invariant_chainSnapshotFollowingBlocks);
|
|
904
|
+
|
|
905
|
+
// src/indexing-status/zod-schema/omnichain-indexing-status-snapshot.ts
|
|
906
|
+
function invariant_omnichainSnapshotStatusIsConsistentWithChainSnapshot(ctx) {
|
|
907
|
+
const snapshot = ctx.value;
|
|
908
|
+
const chains = Array.from(snapshot.chains.values());
|
|
909
|
+
const expectedOmnichainStatus = getOmnichainIndexingStatus(chains);
|
|
910
|
+
const actualOmnichainStatus = snapshot.omnichainStatus;
|
|
911
|
+
if (expectedOmnichainStatus !== actualOmnichainStatus) {
|
|
912
|
+
ctx.issues.push({
|
|
913
|
+
code: "custom",
|
|
914
|
+
input: snapshot,
|
|
915
|
+
message: `'${actualOmnichainStatus}' is an invalid omnichainStatus. Expected '${expectedOmnichainStatus}' based on the statuses of individual chains.`
|
|
916
|
+
});
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
function invariant_omnichainIndexingCursorLowerThanEarliestStartBlockAcrossQueuedChains(ctx) {
|
|
920
|
+
const snapshot = ctx.value;
|
|
921
|
+
const queuedChains = Array.from(snapshot.chains.values()).filter(
|
|
922
|
+
(chain) => chain.chainStatus === ChainIndexingStatusIds.Queued
|
|
923
|
+
);
|
|
924
|
+
if (queuedChains.length === 0) {
|
|
925
|
+
return;
|
|
926
|
+
}
|
|
927
|
+
const queuedChainStartBlocks = queuedChains.map((chain) => chain.config.startBlock.timestamp);
|
|
928
|
+
const queuedChainEarliestStartBlock = Math.min(...queuedChainStartBlocks);
|
|
929
|
+
if (snapshot.omnichainIndexingCursor >= queuedChainEarliestStartBlock) {
|
|
930
|
+
ctx.issues.push({
|
|
931
|
+
code: "custom",
|
|
932
|
+
input: snapshot,
|
|
933
|
+
message: "`omnichainIndexingCursor` must be lower than the earliest start block across all queued chains."
|
|
934
|
+
});
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
function invariant_omnichainIndexingCursorLowerThanOrEqualToLatestBackfillEndBlockAcrossBackfillChains(ctx) {
|
|
938
|
+
const snapshot = ctx.value;
|
|
939
|
+
const backfillChains = Array.from(snapshot.chains.values()).filter(
|
|
940
|
+
(chain) => chain.chainStatus === ChainIndexingStatusIds.Backfill
|
|
941
|
+
);
|
|
942
|
+
if (backfillChains.length === 0) {
|
|
943
|
+
return;
|
|
944
|
+
}
|
|
945
|
+
const backfillEndBlocks = backfillChains.map((chain) => chain.backfillEndBlock.timestamp);
|
|
946
|
+
const highestBackfillEndBlock = Math.max(...backfillEndBlocks);
|
|
947
|
+
if (snapshot.omnichainIndexingCursor > highestBackfillEndBlock) {
|
|
948
|
+
ctx.issues.push({
|
|
949
|
+
code: "custom",
|
|
950
|
+
input: snapshot,
|
|
951
|
+
message: "`omnichainIndexingCursor` must be lower than or equal to the highest `backfillEndBlock` across all backfill chains."
|
|
952
|
+
});
|
|
953
|
+
}
|
|
954
|
+
}
|
|
955
|
+
function invariant_omnichainIndexingCursorIsEqualToHighestLatestIndexedBlockAcrossIndexedChain(ctx) {
|
|
956
|
+
const snapshot = ctx.value;
|
|
957
|
+
const indexedChains = Array.from(snapshot.chains.values()).filter(
|
|
958
|
+
(chain) => chain.chainStatus === ChainIndexingStatusIds.Backfill || chain.chainStatus === ChainIndexingStatusIds.Completed || chain.chainStatus === ChainIndexingStatusIds.Following
|
|
959
|
+
);
|
|
960
|
+
if (indexedChains.length === 0) {
|
|
961
|
+
return;
|
|
962
|
+
}
|
|
963
|
+
const indexedChainLatestIndexedBlocks = indexedChains.map(
|
|
964
|
+
(chain) => chain.latestIndexedBlock.timestamp
|
|
965
|
+
);
|
|
966
|
+
const indexedChainHighestLatestIndexedBlock = Math.max(...indexedChainLatestIndexedBlocks);
|
|
967
|
+
if (snapshot.omnichainIndexingCursor !== indexedChainHighestLatestIndexedBlock) {
|
|
968
|
+
ctx.issues.push({
|
|
969
|
+
code: "custom",
|
|
970
|
+
input: snapshot,
|
|
971
|
+
message: "`omnichainIndexingCursor` must be same as the highest `latestIndexedBlock` across all indexed chains."
|
|
972
|
+
});
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
function invariant_omnichainSnapshotUnstartedHasValidChains(ctx) {
|
|
976
|
+
const snapshot = ctx.value;
|
|
977
|
+
const hasValidChains = checkChainIndexingStatusSnapshotsForOmnichainStatusSnapshotUnstarted(
|
|
978
|
+
Array.from(snapshot.chains.values())
|
|
979
|
+
);
|
|
980
|
+
if (hasValidChains === false) {
|
|
981
|
+
ctx.issues.push({
|
|
982
|
+
code: "custom",
|
|
983
|
+
input: snapshot,
|
|
984
|
+
message: `For omnichain status snapshot 'unstarted', all chains must have "queued" status.`
|
|
985
|
+
});
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
function invariant_omnichainStatusSnapshotBackfillHasValidChains(ctx) {
|
|
989
|
+
const snapshot = ctx.value;
|
|
990
|
+
const hasValidChains = checkChainIndexingStatusSnapshotsForOmnichainStatusSnapshotBackfill(
|
|
991
|
+
Array.from(snapshot.chains.values())
|
|
992
|
+
);
|
|
993
|
+
if (hasValidChains === false) {
|
|
994
|
+
ctx.issues.push({
|
|
995
|
+
code: "custom",
|
|
996
|
+
input: snapshot,
|
|
997
|
+
message: `For omnichain status snapshot 'backfill', at least one chain must be in "backfill" status and each chain has to have a status of either "queued", "backfill" or "completed".`
|
|
998
|
+
});
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
function invariant_omnichainStatusSnapshotCompletedHasValidChains(ctx) {
|
|
1002
|
+
const snapshot = ctx.value;
|
|
1003
|
+
const hasValidChains = checkChainIndexingStatusSnapshotsForOmnichainStatusSnapshotCompleted(
|
|
1004
|
+
Array.from(snapshot.chains.values())
|
|
1005
|
+
);
|
|
1006
|
+
if (hasValidChains === false) {
|
|
1007
|
+
ctx.issues.push({
|
|
1008
|
+
code: "custom",
|
|
1009
|
+
input: snapshot,
|
|
1010
|
+
message: `For omnichain status snapshot 'completed', all chains must have "completed" status.`
|
|
1011
|
+
});
|
|
1012
|
+
}
|
|
1013
|
+
}
|
|
1014
|
+
function invariant_omnichainStatusSnapshotFollowingHasValidChains(ctx) {
|
|
1015
|
+
const snapshot = ctx.value;
|
|
1016
|
+
const hasValidChains = checkChainIndexingStatusSnapshotsForOmnichainStatusSnapshotFollowing(
|
|
1017
|
+
Array.from(snapshot.chains.values())
|
|
1018
|
+
);
|
|
1019
|
+
if (hasValidChains === false) {
|
|
1020
|
+
ctx.issues.push({
|
|
1021
|
+
code: "custom",
|
|
1022
|
+
input: snapshot,
|
|
1023
|
+
message: "For omnichainStatus 'following', at least one chain must be in 'following' status."
|
|
1024
|
+
});
|
|
1025
|
+
}
|
|
1026
|
+
}
|
|
1027
|
+
var makeOmnichainIndexingStatusSnapshotUnstartedSchema = (valueLabel) => import_v47.z.object({
|
|
1028
|
+
omnichainStatus: import_v47.z.literal(OmnichainIndexingStatusIds.Unstarted),
|
|
1029
|
+
chains: import_v47.z.map(
|
|
1030
|
+
makeChainIdSchema(),
|
|
1031
|
+
import_v47.z.discriminatedUnion("chainStatus", [
|
|
1032
|
+
makeChainIndexingStatusSnapshotQueuedSchema(valueLabel)
|
|
1033
|
+
]),
|
|
1034
|
+
{
|
|
1035
|
+
error: "Chains indexing statuses must be a Map with ChainId as keys and ChainIndexingStatusSnapshot as values."
|
|
1036
|
+
}
|
|
1037
|
+
),
|
|
1038
|
+
omnichainIndexingCursor: makeUnixTimestampSchema(valueLabel)
|
|
1039
|
+
}).check(invariant_omnichainSnapshotUnstartedHasValidChains);
|
|
1040
|
+
var makeOmnichainIndexingStatusSnapshotBackfillSchema = (valueLabel) => import_v47.z.object({
|
|
1041
|
+
omnichainStatus: import_v47.z.literal(OmnichainIndexingStatusIds.Backfill),
|
|
1042
|
+
chains: import_v47.z.map(
|
|
1043
|
+
makeChainIdSchema(),
|
|
1044
|
+
import_v47.z.discriminatedUnion("chainStatus", [
|
|
1045
|
+
makeChainIndexingStatusSnapshotQueuedSchema(valueLabel),
|
|
1046
|
+
makeChainIndexingStatusSnapshotBackfillSchema(valueLabel),
|
|
1047
|
+
makeChainIndexingStatusSnapshotCompletedSchema(valueLabel)
|
|
1048
|
+
]),
|
|
1049
|
+
{
|
|
1050
|
+
error: "Chains indexing statuses must be a Map with ChainId as keys and ChainIndexingStatusSnapshot as values."
|
|
1051
|
+
}
|
|
1052
|
+
),
|
|
1053
|
+
omnichainIndexingCursor: makeUnixTimestampSchema(valueLabel)
|
|
1054
|
+
}).check(invariant_omnichainStatusSnapshotBackfillHasValidChains);
|
|
1055
|
+
var makeOmnichainIndexingStatusSnapshotCompletedSchema = (valueLabel) => import_v47.z.object({
|
|
1056
|
+
omnichainStatus: import_v47.z.literal(OmnichainIndexingStatusIds.Completed),
|
|
1057
|
+
chains: import_v47.z.map(
|
|
1058
|
+
makeChainIdSchema(),
|
|
1059
|
+
import_v47.z.discriminatedUnion("chainStatus", [
|
|
1060
|
+
makeChainIndexingStatusSnapshotCompletedSchema(valueLabel)
|
|
1061
|
+
]),
|
|
1062
|
+
{
|
|
1063
|
+
error: "Chains indexing statuses must be a Map with ChainId as keys and ChainIndexingStatusSnapshot as values."
|
|
1064
|
+
}
|
|
1065
|
+
),
|
|
1066
|
+
omnichainIndexingCursor: makeUnixTimestampSchema(valueLabel)
|
|
1067
|
+
}).check(invariant_omnichainStatusSnapshotCompletedHasValidChains);
|
|
1068
|
+
var makeOmnichainIndexingStatusSnapshotFollowingSchema = (valueLabel) => import_v47.z.object({
|
|
1069
|
+
omnichainStatus: import_v47.z.literal(OmnichainIndexingStatusIds.Following),
|
|
1070
|
+
chains: import_v47.z.map(
|
|
1071
|
+
makeChainIdSchema(),
|
|
1072
|
+
import_v47.z.discriminatedUnion("chainStatus", [
|
|
1073
|
+
makeChainIndexingStatusSnapshotQueuedSchema(valueLabel),
|
|
1074
|
+
makeChainIndexingStatusSnapshotBackfillSchema(valueLabel),
|
|
1075
|
+
makeChainIndexingStatusSnapshotFollowingSchema(valueLabel),
|
|
1076
|
+
makeChainIndexingStatusSnapshotCompletedSchema(valueLabel)
|
|
1077
|
+
]),
|
|
1078
|
+
{
|
|
1079
|
+
error: "Chains indexing statuses must be a Map with ChainId as keys and ChainIndexingStatusSnapshot as values."
|
|
1080
|
+
}
|
|
1081
|
+
),
|
|
1082
|
+
omnichainIndexingCursor: makeUnixTimestampSchema(valueLabel)
|
|
1083
|
+
}).check(invariant_omnichainStatusSnapshotFollowingHasValidChains);
|
|
1084
|
+
var makeOmnichainIndexingStatusSnapshotSchema = (valueLabel = "Omnichain Indexing Snapshot") => import_v47.z.discriminatedUnion("omnichainStatus", [
|
|
1085
|
+
makeOmnichainIndexingStatusSnapshotUnstartedSchema(valueLabel),
|
|
1086
|
+
makeOmnichainIndexingStatusSnapshotBackfillSchema(valueLabel),
|
|
1087
|
+
makeOmnichainIndexingStatusSnapshotCompletedSchema(valueLabel),
|
|
1088
|
+
makeOmnichainIndexingStatusSnapshotFollowingSchema(valueLabel)
|
|
1089
|
+
]).check(invariant_omnichainSnapshotStatusIsConsistentWithChainSnapshot).check(invariant_omnichainIndexingCursorLowerThanEarliestStartBlockAcrossQueuedChains).check(
|
|
1090
|
+
invariant_omnichainIndexingCursorLowerThanOrEqualToLatestBackfillEndBlockAcrossBackfillChains
|
|
1091
|
+
).check(invariant_omnichainIndexingCursorIsEqualToHighestLatestIndexedBlockAcrossIndexedChain);
|
|
1092
|
+
var makeSerializedOmnichainIndexingStatusSnapshotUnstartedSchema = (valueLabel) => import_v47.z.object({
|
|
1093
|
+
omnichainStatus: import_v47.z.literal(OmnichainIndexingStatusIds.Unstarted),
|
|
1094
|
+
chains: import_v47.z.record(
|
|
1095
|
+
makeChainIdStringSchema(),
|
|
1096
|
+
import_v47.z.discriminatedUnion("chainStatus", [
|
|
1097
|
+
makeChainIndexingStatusSnapshotQueuedSchema(valueLabel)
|
|
1098
|
+
])
|
|
1099
|
+
),
|
|
1100
|
+
omnichainIndexingCursor: makeUnixTimestampSchema(valueLabel)
|
|
1101
|
+
});
|
|
1102
|
+
var makeSerializedOmnichainIndexingStatusSnapshotBackfillSchema = (valueLabel) => import_v47.z.object({
|
|
1103
|
+
omnichainStatus: import_v47.z.literal(OmnichainIndexingStatusIds.Backfill),
|
|
1104
|
+
chains: import_v47.z.record(
|
|
1105
|
+
makeChainIdStringSchema(),
|
|
1106
|
+
import_v47.z.discriminatedUnion("chainStatus", [
|
|
1107
|
+
makeChainIndexingStatusSnapshotQueuedSchema(valueLabel),
|
|
1108
|
+
makeChainIndexingStatusSnapshotBackfillSchema(valueLabel),
|
|
1109
|
+
makeChainIndexingStatusSnapshotCompletedSchema(valueLabel)
|
|
1110
|
+
])
|
|
1111
|
+
),
|
|
1112
|
+
omnichainIndexingCursor: makeUnixTimestampSchema(valueLabel)
|
|
1113
|
+
});
|
|
1114
|
+
var makeSerializedOmnichainIndexingStatusSnapshotCompletedSchema = (valueLabel) => import_v47.z.object({
|
|
1115
|
+
omnichainStatus: import_v47.z.literal(OmnichainIndexingStatusIds.Completed),
|
|
1116
|
+
chains: import_v47.z.record(
|
|
1117
|
+
makeChainIdStringSchema(),
|
|
1118
|
+
import_v47.z.discriminatedUnion("chainStatus", [
|
|
1119
|
+
makeChainIndexingStatusSnapshotCompletedSchema(valueLabel)
|
|
1120
|
+
])
|
|
1121
|
+
),
|
|
1122
|
+
omnichainIndexingCursor: makeUnixTimestampSchema(valueLabel)
|
|
1123
|
+
});
|
|
1124
|
+
var makeSerializedOmnichainIndexingStatusSnapshotFollowingSchema = (valueLabel) => import_v47.z.object({
|
|
1125
|
+
omnichainStatus: import_v47.z.literal(OmnichainIndexingStatusIds.Following),
|
|
1126
|
+
chains: import_v47.z.record(
|
|
1127
|
+
makeChainIdStringSchema(),
|
|
1128
|
+
import_v47.z.discriminatedUnion("chainStatus", [
|
|
1129
|
+
makeChainIndexingStatusSnapshotQueuedSchema(valueLabel),
|
|
1130
|
+
makeChainIndexingStatusSnapshotBackfillSchema(valueLabel),
|
|
1131
|
+
makeChainIndexingStatusSnapshotFollowingSchema(valueLabel),
|
|
1132
|
+
makeChainIndexingStatusSnapshotCompletedSchema(valueLabel)
|
|
1133
|
+
])
|
|
1134
|
+
),
|
|
1135
|
+
omnichainIndexingCursor: makeUnixTimestampSchema(valueLabel)
|
|
1136
|
+
});
|
|
1137
|
+
var makeSerializedOmnichainIndexingStatusSnapshotSchema = (valueLabel = "Value") => import_v47.z.discriminatedUnion("omnichainStatus", [
|
|
1138
|
+
makeSerializedOmnichainIndexingStatusSnapshotUnstartedSchema(valueLabel),
|
|
1139
|
+
makeSerializedOmnichainIndexingStatusSnapshotBackfillSchema(valueLabel),
|
|
1140
|
+
makeSerializedOmnichainIndexingStatusSnapshotCompletedSchema(valueLabel),
|
|
1141
|
+
makeSerializedOmnichainIndexingStatusSnapshotFollowingSchema(valueLabel)
|
|
1142
|
+
]);
|
|
1143
|
+
|
|
1144
|
+
// src/indexing-status/zod-schema/cross-chain-indexing-status-snapshot.ts
|
|
1145
|
+
function invariant_slowestChainEqualsToOmnichainSnapshotTime(ctx) {
|
|
1146
|
+
const { slowestChainIndexingCursor, omnichainSnapshot } = ctx.value;
|
|
1147
|
+
const { omnichainIndexingCursor } = omnichainSnapshot;
|
|
1148
|
+
if (slowestChainIndexingCursor !== omnichainIndexingCursor) {
|
|
1149
|
+
ctx.issues.push({
|
|
1150
|
+
code: "custom",
|
|
1151
|
+
input: ctx.value,
|
|
1152
|
+
message: `'slowestChainIndexingCursor' must be equal to 'omnichainSnapshot.omnichainIndexingCursor'`
|
|
1153
|
+
});
|
|
1154
|
+
}
|
|
1155
|
+
}
|
|
1156
|
+
function invariant_snapshotTimeIsTheHighestKnownBlockTimestamp(ctx) {
|
|
1157
|
+
const { snapshotTime, omnichainSnapshot } = ctx.value;
|
|
1158
|
+
const chains = Array.from(omnichainSnapshot.chains.values());
|
|
1159
|
+
const highestKnownBlockTimestamp = getHighestKnownBlockTimestamp(chains);
|
|
1160
|
+
if (snapshotTime < highestKnownBlockTimestamp) {
|
|
1161
|
+
ctx.issues.push({
|
|
1162
|
+
code: "custom",
|
|
1163
|
+
input: ctx.value,
|
|
1164
|
+
message: `'snapshotTime' (${snapshotTime}) must be greater than or equal to the "highest known block timestamp" (${highestKnownBlockTimestamp})`
|
|
1165
|
+
});
|
|
1166
|
+
}
|
|
1167
|
+
}
|
|
1168
|
+
var makeCrossChainIndexingStatusSnapshotOmnichainSchema = (valueLabel = "Cross-chain Indexing Status Snapshot Omnichain") => import_v48.z.object({
|
|
1169
|
+
strategy: import_v48.z.literal(CrossChainIndexingStrategyIds.Omnichain),
|
|
1170
|
+
slowestChainIndexingCursor: makeUnixTimestampSchema(valueLabel),
|
|
1171
|
+
snapshotTime: makeUnixTimestampSchema(valueLabel),
|
|
1172
|
+
omnichainSnapshot: makeOmnichainIndexingStatusSnapshotSchema(valueLabel)
|
|
1173
|
+
}).check(invariant_slowestChainEqualsToOmnichainSnapshotTime).check(invariant_snapshotTimeIsTheHighestKnownBlockTimestamp);
|
|
1174
|
+
var makeCrossChainIndexingStatusSnapshotSchema = (valueLabel = "Cross-chain Indexing Status Snapshot") => import_v48.z.discriminatedUnion("strategy", [
|
|
1175
|
+
makeCrossChainIndexingStatusSnapshotOmnichainSchema(valueLabel)
|
|
1176
|
+
]);
|
|
1177
|
+
var makeSerializedCrossChainIndexingStatusSnapshotSchema = (valueLabel = "Serialized Cross-chain Indexing Status Snapshot") => import_v48.z.object({
|
|
1178
|
+
strategy: import_v48.z.enum(CrossChainIndexingStrategyIds),
|
|
1179
|
+
slowestChainIndexingCursor: makeUnixTimestampSchema(valueLabel),
|
|
1180
|
+
snapshotTime: makeUnixTimestampSchema(valueLabel),
|
|
1181
|
+
omnichainSnapshot: makeSerializedOmnichainIndexingStatusSnapshotSchema(valueLabel)
|
|
1182
|
+
});
|
|
1183
|
+
|
|
1184
|
+
// src/indexing-status/zod-schema/realtime-indexing-status-projection.ts
|
|
1185
|
+
function invariant_realtimeIndexingStatusProjectionProjectedAtIsAfterOrEqualToSnapshotTime(ctx) {
|
|
1186
|
+
const projection = ctx.value;
|
|
1187
|
+
const { snapshot, projectedAt } = projection;
|
|
1188
|
+
if (snapshot.snapshotTime > projectedAt) {
|
|
1189
|
+
ctx.issues.push({
|
|
1190
|
+
code: "custom",
|
|
1191
|
+
input: projection,
|
|
1192
|
+
message: "`projectedAt` must be after or same as `snapshot.snapshotTime`."
|
|
1193
|
+
});
|
|
1194
|
+
}
|
|
1195
|
+
}
|
|
1196
|
+
function invariant_realtimeIndexingStatusProjectionWorstCaseDistanceIsCorrect(ctx) {
|
|
1197
|
+
const projection = ctx.value;
|
|
1198
|
+
const { projectedAt, snapshot, worstCaseDistance } = projection;
|
|
1199
|
+
const expectedWorstCaseDistance = projectedAt - snapshot.slowestChainIndexingCursor;
|
|
1200
|
+
if (worstCaseDistance !== expectedWorstCaseDistance) {
|
|
1201
|
+
ctx.issues.push({
|
|
1202
|
+
code: "custom",
|
|
1203
|
+
input: projection,
|
|
1204
|
+
message: "`worstCaseDistance` must be the exact difference between `projectedAt` and `snapshot.slowestChainIndexingCursor`."
|
|
1205
|
+
});
|
|
1206
|
+
}
|
|
1207
|
+
}
|
|
1208
|
+
var makeRealtimeIndexingStatusProjectionSchema = (valueLabel = "Realtime Indexing Status Projection") => import_v49.z.object({
|
|
1209
|
+
projectedAt: makeUnixTimestampSchema(valueLabel).describe(
|
|
1210
|
+
"The timestamp representing 'now' as of the time this projection was generated."
|
|
1211
|
+
),
|
|
1212
|
+
worstCaseDistance: makeDurationSchema(valueLabel).describe(
|
|
1213
|
+
"The distance between `projectedAt` and `snapshot.slowestChainIndexingCursor` in seconds. This is a worst-case distance because it assumes no indexing progress has been made since `snapshot.snapshotTime` and that each indexed chain has added a new block as of `projectedAt`."
|
|
1214
|
+
),
|
|
1215
|
+
snapshot: makeCrossChainIndexingStatusSnapshotSchema(valueLabel).describe(
|
|
1216
|
+
"The cross-chain indexing status snapshot that this projection is based on."
|
|
1217
|
+
)
|
|
1218
|
+
}).check(invariant_realtimeIndexingStatusProjectionProjectedAtIsAfterOrEqualToSnapshotTime).check(invariant_realtimeIndexingStatusProjectionWorstCaseDistanceIsCorrect);
|
|
1219
|
+
var makeSerializedRealtimeIndexingStatusProjectionSchema = (valueLabel = "Value") => import_v49.z.object({
|
|
1220
|
+
snapshot: makeSerializedCrossChainIndexingStatusSnapshotSchema(valueLabel).describe(
|
|
1221
|
+
"The cross-chain indexing status snapshot that this projection is based on."
|
|
1222
|
+
),
|
|
1223
|
+
projectedAt: makeUnixTimestampSchema(valueLabel).describe(
|
|
1224
|
+
"The timestamp representing 'now' as of the time this projection was generated."
|
|
1225
|
+
),
|
|
1226
|
+
worstCaseDistance: makeDurationSchema(valueLabel).describe(
|
|
1227
|
+
"The distance between `projectedAt` and `snapshot.slowestChainIndexingCursor` in seconds. This is a worst-case distance because it assumes no indexing progress has been made since `snapshot.snapshotTime` and that each indexed chain has added a new block as of `projectedAt`."
|
|
1228
|
+
)
|
|
1229
|
+
});
|
|
1230
|
+
|
|
1231
|
+
// src/stack-info/zod-schemas/ensindexer-stack-info.ts
|
|
1232
|
+
var import_v411 = require("zod/v4");
|
|
1233
|
+
|
|
1234
|
+
// src/ensdb/zod-schemas/config.ts
|
|
1235
|
+
var import_v410 = require("zod/v4");
|
|
1236
|
+
var makeEnsDbVersionInfoSchema = (valueLabel) => {
|
|
1237
|
+
const label = valueLabel ?? "EnsDbVersionInfo";
|
|
1238
|
+
return import_v410.z.object({
|
|
1239
|
+
postgresql: import_v410.z.string().nonempty(`${label}.postgresql must be a non-empty string`).describe("Version of the PostgreSQL server hosting the ENSDb instance.")
|
|
1240
|
+
});
|
|
1241
|
+
};
|
|
1242
|
+
var makeEnsDbPublicConfigSchema = (valueLabel) => {
|
|
1243
|
+
const label = valueLabel ?? "EnsDbPublicConfig";
|
|
1244
|
+
return import_v410.z.object({
|
|
1245
|
+
versionInfo: makeEnsDbVersionInfoSchema(`${label}.versionInfo`)
|
|
1246
|
+
});
|
|
1247
|
+
};
|
|
1248
|
+
|
|
1249
|
+
// src/stack-info/zod-schemas/ensindexer-stack-info.ts
|
|
1250
|
+
function makeSerializedEnsIndexerStackInfoSchema(valueLabel) {
|
|
1251
|
+
const label = valueLabel ?? "ENSIndexerStackInfo";
|
|
1252
|
+
return import_v411.z.object({
|
|
1253
|
+
ensDb: makeEnsDbPublicConfigSchema(`${label}.ensDb`),
|
|
1254
|
+
ensIndexer: makeSerializedEnsIndexerPublicConfigSchema(`${label}.ensIndexer`),
|
|
1255
|
+
ensRainbow: makeEnsRainbowPublicConfigSchema(`${label}.ensRainbow`)
|
|
1256
|
+
});
|
|
1257
|
+
}
|
|
1258
|
+
function invariant_ensRainbowCompatibilityWithEnsIndexer(ctx) {
|
|
1259
|
+
const { ensIndexer, ensRainbow } = ctx.value;
|
|
1260
|
+
const { clientLabelSet } = ensIndexer;
|
|
1261
|
+
const { serverLabelSet } = ensRainbow;
|
|
1262
|
+
if (clientLabelSet.labelSetId !== serverLabelSet.labelSetId) {
|
|
1263
|
+
ctx.issues.push({
|
|
1264
|
+
code: "custom",
|
|
1265
|
+
input: ctx.value,
|
|
1266
|
+
message: `ENSRainbow's label set (id: ${serverLabelSet.labelSetId}) must be the same as ENSIndexer's label set (id: ${clientLabelSet.labelSetId}).`
|
|
1267
|
+
});
|
|
1268
|
+
}
|
|
1269
|
+
if (clientLabelSet.labelSetVersion > serverLabelSet.highestLabelSetVersion) {
|
|
1270
|
+
ctx.issues.push({
|
|
1271
|
+
code: "custom",
|
|
1272
|
+
input: ctx.value,
|
|
1273
|
+
message: `ENSRainbow's server label set version (highest: ${serverLabelSet.highestLabelSetVersion}) must be greater than or equal to ENSIndexer's client label set version (current: ${clientLabelSet.labelSetVersion}).`
|
|
1274
|
+
});
|
|
1275
|
+
}
|
|
1276
|
+
}
|
|
1277
|
+
function makeEnsIndexerStackInfoSchema(valueLabel) {
|
|
1278
|
+
const label = valueLabel ?? "ENSIndexerStackInfo";
|
|
1279
|
+
return import_v411.z.object({
|
|
1280
|
+
ensDb: makeEnsDbPublicConfigSchema(`${label}.ensDb`),
|
|
1281
|
+
ensIndexer: makeEnsIndexerPublicConfigSchema(`${label}.ensIndexer`),
|
|
1282
|
+
ensRainbow: makeEnsRainbowPublicConfigSchema(`${label}.ensRainbow`)
|
|
1283
|
+
}).check(invariant_ensRainbowCompatibilityWithEnsIndexer);
|
|
1284
|
+
}
|
|
1285
|
+
|
|
1286
|
+
// src/stack-info/zod-schemas/ensnode-stack-info.ts
|
|
1287
|
+
function invariant_ensApiCompatibilityWithEnsIndexerAndEnsRainbow(ctx) {
|
|
1288
|
+
const { ensApi, ensIndexer, ensRainbow } = ctx.value;
|
|
1289
|
+
if (ensIndexer.versionInfo.ensDb !== ensApi.versionInfo.ensApi) {
|
|
1290
|
+
ctx.issues.push({
|
|
1291
|
+
code: "custom",
|
|
1292
|
+
path: ["ensIndexer", "versionInfo", "ensDb"],
|
|
1293
|
+
input: ensIndexer.versionInfo.ensDb,
|
|
1294
|
+
message: `Version Mismatch: ENSDB@${ensIndexer.versionInfo.ensDb} !== ENSApi@${ensApi.versionInfo.ensApi}`
|
|
1295
|
+
});
|
|
1296
|
+
}
|
|
1297
|
+
if (ensIndexer.versionInfo.ensIndexer !== ensApi.versionInfo.ensApi) {
|
|
1298
|
+
ctx.issues.push({
|
|
1299
|
+
code: "custom",
|
|
1300
|
+
path: ["ensIndexer", "versionInfo", "ensIndexer"],
|
|
1301
|
+
input: ensIndexer.versionInfo.ensIndexer,
|
|
1302
|
+
message: `Version Mismatch: ENSIndexer@${ensIndexer.versionInfo.ensIndexer} !== ENSApi@${ensApi.versionInfo.ensApi}`
|
|
1303
|
+
});
|
|
1304
|
+
}
|
|
1305
|
+
if (ensRainbow.versionInfo.ensRainbow !== ensApi.versionInfo.ensApi) {
|
|
1306
|
+
ctx.issues.push({
|
|
1307
|
+
code: "custom",
|
|
1308
|
+
path: ["ensRainbow", "versionInfo", "ensRainbow"],
|
|
1309
|
+
input: ensRainbow.versionInfo.ensRainbow,
|
|
1310
|
+
message: `Version Mismatch: ENSRainbow@${ensRainbow.versionInfo.ensRainbow} !== ENSApi@${ensApi.versionInfo.ensApi}`
|
|
1311
|
+
});
|
|
1312
|
+
}
|
|
1313
|
+
if (ensIndexer.versionInfo.ensNormalize !== ensApi.versionInfo.ensNormalize) {
|
|
1314
|
+
ctx.issues.push({
|
|
1315
|
+
code: "custom",
|
|
1316
|
+
path: ["ensIndexer", "versionInfo", "ensNormalize"],
|
|
1317
|
+
input: ensIndexer.versionInfo.ensNormalize,
|
|
1318
|
+
message: `Dependency Version Mismatch: '@adraffy/ens-normalize' version must be the same between ENSIndexer and ENSApi. Found ENSApi@${ensApi.versionInfo.ensNormalize} and ENSIndexer@${ensIndexer.versionInfo.ensNormalize}`
|
|
1319
|
+
});
|
|
1320
|
+
}
|
|
1321
|
+
}
|
|
1322
|
+
function makeSerializedEnsNodeStackInfoSchema(valueLabel) {
|
|
1323
|
+
const label = valueLabel ?? "ENSNodeStackInfo";
|
|
1324
|
+
return makeSerializedEnsIndexerStackInfoSchema(label).extend({
|
|
1325
|
+
ensApi: makeSerializedEnsApiPublicConfigSchema(`${label}.ensApi`)
|
|
1326
|
+
});
|
|
1327
|
+
}
|
|
1328
|
+
function makeEnsNodeStackInfoSchema(valueLabel) {
|
|
1329
|
+
const label = valueLabel ?? "ENSNodeStackInfo";
|
|
1330
|
+
return makeEnsIndexerStackInfoSchema(label).extend({
|
|
1331
|
+
ensApi: makeEnsApiPublicConfigSchema(`${label}.ensApi`)
|
|
1332
|
+
}).check(invariant_ensApiCompatibilityWithEnsIndexerAndEnsRainbow).check(invariant_ensRainbowCompatibilityWithEnsIndexer);
|
|
1333
|
+
}
|
|
1334
|
+
|
|
1335
|
+
// src/ensnode/api/indexing-status/response.ts
|
|
1336
|
+
var EnsApiIndexingStatusResponseCodes = {
|
|
1337
|
+
/**
|
|
1338
|
+
* Represents that the indexing status is available.
|
|
1339
|
+
*/
|
|
1340
|
+
Ok: "ok",
|
|
1341
|
+
/**
|
|
1342
|
+
* Represents that the indexing status is unavailable.
|
|
1343
|
+
*/
|
|
1344
|
+
Error: "error"
|
|
1345
|
+
};
|
|
1346
|
+
|
|
1347
|
+
// src/ensnode/api/indexing-status/zod-schemas.ts
|
|
1348
|
+
var makeEnsApiIndexingStatusResponseOkSchema = (valueLabel = "Indexing Status Response OK") => import_v412.z.strictObject({
|
|
1349
|
+
responseCode: import_v412.z.literal(EnsApiIndexingStatusResponseCodes.Ok),
|
|
1350
|
+
realtimeProjection: makeRealtimeIndexingStatusProjectionSchema(valueLabel),
|
|
1351
|
+
stackInfo: makeEnsNodeStackInfoSchema(valueLabel)
|
|
1352
|
+
});
|
|
1353
|
+
var makeEnsApiIndexingStatusResponseErrorSchema = (_valueLabel = "Indexing Status Response Error") => import_v412.z.strictObject({
|
|
1354
|
+
responseCode: import_v412.z.literal(EnsApiIndexingStatusResponseCodes.Error)
|
|
1355
|
+
});
|
|
1356
|
+
var makeEnsApiIndexingStatusResponseSchema = (valueLabel = "Indexing Status Response") => import_v412.z.discriminatedUnion("responseCode", [
|
|
1357
|
+
makeEnsApiIndexingStatusResponseOkSchema(valueLabel),
|
|
1358
|
+
makeEnsApiIndexingStatusResponseErrorSchema(valueLabel)
|
|
1359
|
+
]);
|
|
1360
|
+
var makeIndexingStatusResponseSchema = makeEnsApiIndexingStatusResponseSchema;
|
|
1361
|
+
var makeSerializedEnsApiIndexingStatusResponseOkSchema = (valueLabel = "Serialized Indexing Status Response OK") => import_v412.z.object({
|
|
1362
|
+
responseCode: import_v412.z.literal(EnsApiIndexingStatusResponseCodes.Ok),
|
|
1363
|
+
realtimeProjection: makeSerializedRealtimeIndexingStatusProjectionSchema(valueLabel),
|
|
1364
|
+
stackInfo: makeSerializedEnsNodeStackInfoSchema(valueLabel)
|
|
1365
|
+
});
|
|
1366
|
+
var makeSerializedEnsApiIndexingStatusResponseSchema = (valueLabel = "Serialized Indexing Status Response") => import_v412.z.discriminatedUnion("responseCode", [
|
|
1367
|
+
makeSerializedEnsApiIndexingStatusResponseOkSchema(valueLabel),
|
|
1368
|
+
makeEnsApiIndexingStatusResponseErrorSchema(valueLabel)
|
|
1369
|
+
]);
|
|
1370
|
+
|
|
1371
|
+
// src/ensnode/api/name-tokens/examples.ts
|
|
1372
|
+
var nameTokensResponseOkExample = {
|
|
1373
|
+
responseCode: "ok",
|
|
1374
|
+
registeredNameTokens: {
|
|
1375
|
+
domainId: "0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835",
|
|
1376
|
+
name: "vitalik.eth",
|
|
1377
|
+
tokens: [
|
|
1378
|
+
{
|
|
1379
|
+
token: {
|
|
1380
|
+
assetNamespace: "erc721",
|
|
1381
|
+
contract: {
|
|
1382
|
+
chainId: 1,
|
|
1383
|
+
address: "0x57f1887a8bf19b14fc0df6fd9b2acc9af147ea85"
|
|
1384
|
+
},
|
|
1385
|
+
tokenId: "0xaf2caa1c2ca1d027f1ac823b529d0a67cd144264b2789fa2ea4d63a67c7103cc"
|
|
1386
|
+
},
|
|
1387
|
+
ownership: {
|
|
1388
|
+
ownershipType: "fully-onchain",
|
|
1389
|
+
owner: {
|
|
1390
|
+
chainId: 1,
|
|
1391
|
+
address: "0x220866b1a2219f40e72f5c628b65d54268ca3a9d"
|
|
1392
|
+
}
|
|
1393
|
+
},
|
|
1394
|
+
mintStatus: "minted"
|
|
1395
|
+
}
|
|
1396
|
+
],
|
|
1397
|
+
expiresAt: 2461152330,
|
|
1398
|
+
accurateAsOf: 17e8
|
|
1399
|
+
}
|
|
1400
|
+
};
|
|
1401
|
+
var nameTokensServiceUnavailableExample = {
|
|
1402
|
+
responseCode: "error",
|
|
1403
|
+
errorCode: "unsupported-ensindexer-config",
|
|
1404
|
+
error: {
|
|
1405
|
+
message: "Name Tokens API is not available",
|
|
1406
|
+
details: "Connected ENSIndexer must have all following plugins active: registrars, tokenscope"
|
|
1407
|
+
}
|
|
1408
|
+
};
|
|
1409
|
+
var nameTokensNotIndexedExample = {
|
|
1410
|
+
responseCode: "error",
|
|
1411
|
+
errorCode: "name-tokens-not-indexed",
|
|
1412
|
+
error: {
|
|
1413
|
+
message: "No indexed Name Tokens found",
|
|
1414
|
+
details: "This ENSNode instance has not been configured to index tokens for the requested name: 'vitalik.eth'"
|
|
1415
|
+
}
|
|
1416
|
+
};
|
|
1417
|
+
|
|
1418
|
+
// src/ensnode/api/name-tokens/zod-schemas.ts
|
|
1419
|
+
var import_enssdk5 = require("enssdk");
|
|
1420
|
+
var import_v416 = require("zod/v4");
|
|
1421
|
+
|
|
1422
|
+
// src/tokenscope/name-token.ts
|
|
1423
|
+
var import_enssdk4 = require("enssdk");
|
|
1424
|
+
var import_viem6 = require("viem");
|
|
1425
|
+
var import_datasources4 = require("@ensnode/datasources");
|
|
1426
|
+
|
|
1427
|
+
// src/shared/account-id.ts
|
|
1428
|
+
var import_viem3 = require("viem");
|
|
1429
|
+
var accountIdEqual = (a, b) => {
|
|
1430
|
+
return a.chainId === b.chainId && (0, import_viem3.isAddressEqual)(a.address, b.address);
|
|
1431
|
+
};
|
|
1432
|
+
|
|
1433
|
+
// src/shared/datasource-contract.ts
|
|
1434
|
+
var import_datasources3 = require("@ensnode/datasources");
|
|
1435
|
+
var maybeGetDatasourceContract = (namespaceId, datasourceName, contractName) => {
|
|
1436
|
+
const datasource = (0, import_datasources3.maybeGetDatasource)(namespaceId, datasourceName);
|
|
1437
|
+
if (!datasource) return void 0;
|
|
1438
|
+
const address = datasource.contracts[contractName]?.address;
|
|
1439
|
+
if (address === void 0 || Array.isArray(address)) return void 0;
|
|
1440
|
+
return {
|
|
1441
|
+
chainId: datasource.chain.id,
|
|
1442
|
+
address
|
|
1443
|
+
};
|
|
1444
|
+
};
|
|
1445
|
+
var getDatasourceContract = (namespaceId, datasourceName, contractName) => {
|
|
1446
|
+
const contract = maybeGetDatasourceContract(namespaceId, datasourceName, contractName);
|
|
1447
|
+
if (!contract) {
|
|
1448
|
+
throw new Error(
|
|
1449
|
+
`Expected contract not found for ${namespaceId} ${datasourceName} ${contractName}`
|
|
1450
|
+
);
|
|
1451
|
+
}
|
|
1452
|
+
return contract;
|
|
1453
|
+
};
|
|
1454
|
+
var makeContractMatcher = (namespace, b) => (datasourceName, contractName) => {
|
|
1455
|
+
const a = maybeGetDatasourceContract(namespace, datasourceName, contractName);
|
|
1456
|
+
return a && accountIdEqual(a, b);
|
|
1457
|
+
};
|
|
1458
|
+
|
|
1459
|
+
// src/tokenscope/assets.ts
|
|
1460
|
+
var import_enssdk3 = require("enssdk");
|
|
1461
|
+
var import_viem5 = require("viem");
|
|
1462
|
+
var import_v414 = require("zod/v4");
|
|
1463
|
+
|
|
1464
|
+
// src/tokenscope/zod-schemas.ts
|
|
1465
|
+
var import_caip2 = require("caip");
|
|
1466
|
+
var import_enssdk2 = require("enssdk");
|
|
1467
|
+
var import_viem4 = require("viem");
|
|
1468
|
+
var import_v413 = require("zod/v4");
|
|
1469
|
+
var tokenIdSchemaSerializable = import_v413.z.string();
|
|
1470
|
+
var tokenIdSchemaNative = import_v413.z.preprocess(
|
|
1471
|
+
(v) => typeof v === "string" ? BigInt(v) : v,
|
|
1472
|
+
import_v413.z.bigint().positive()
|
|
1473
|
+
);
|
|
1474
|
+
function makeTokenIdSchema(_valueLabel = "Token ID Schema", serializable = false) {
|
|
1475
|
+
if (serializable) {
|
|
1476
|
+
return tokenIdSchemaSerializable;
|
|
1477
|
+
} else {
|
|
1478
|
+
return tokenIdSchemaNative;
|
|
1479
|
+
}
|
|
1480
|
+
}
|
|
1481
|
+
var makeAssetIdSchema = (valueLabel = "Asset ID Schema", serializable) => {
|
|
1482
|
+
return import_v413.z.object({
|
|
1483
|
+
assetNamespace: import_v413.z.enum(import_enssdk2.AssetNamespaces),
|
|
1484
|
+
contract: makeAccountIdSchema(valueLabel),
|
|
1485
|
+
tokenId: makeTokenIdSchema(valueLabel, serializable ?? false)
|
|
1486
|
+
});
|
|
1487
|
+
};
|
|
1488
|
+
var makeAssetIdStringSchema = (valueLabel = "Asset ID String Schema") => import_v413.z.preprocess((v) => {
|
|
1489
|
+
if (typeof v === "string") {
|
|
1490
|
+
const result = new import_caip2.AssetId(v);
|
|
1491
|
+
return {
|
|
1492
|
+
assetNamespace: result.assetName.namespace,
|
|
1493
|
+
contract: {
|
|
1494
|
+
chainId: Number(result.chainId.reference),
|
|
1495
|
+
address: result.assetName.reference
|
|
1496
|
+
},
|
|
1497
|
+
tokenId: result.tokenId
|
|
1498
|
+
};
|
|
1499
|
+
}
|
|
1500
|
+
return v;
|
|
1501
|
+
}, makeAssetIdSchema(valueLabel));
|
|
1502
|
+
var makeDomainAssetSchema = (valueLabel = "Domain Asset Schema") => makeAssetIdSchema(valueLabel).extend({
|
|
1503
|
+
domainId: makeNodeSchema(`${valueLabel}.domainId`)
|
|
1504
|
+
});
|
|
1505
|
+
function invariant_nameTokenOwnershipHasNonZeroAddressOwner(ctx) {
|
|
1506
|
+
const ownership = ctx.value;
|
|
1507
|
+
if (ctx.value.owner.address === import_viem4.zeroAddress) {
|
|
1508
|
+
ctx.issues.push({
|
|
1509
|
+
code: "custom",
|
|
1510
|
+
input: ctx.value,
|
|
1511
|
+
message: `Name Token Ownership with '${ownership.ownershipType}' must have 'address' other than the zero address.`
|
|
1512
|
+
});
|
|
1513
|
+
}
|
|
1514
|
+
}
|
|
1515
|
+
var makeNameTokenOwnershipNameWrapperSchema = (valueLabel = "Name Token Ownership NameWrapper") => import_v413.z.object({
|
|
1516
|
+
ownershipType: import_v413.z.literal(NameTokenOwnershipTypes.NameWrapper),
|
|
1517
|
+
owner: makeAccountIdSchema(`${valueLabel}.owner`)
|
|
1518
|
+
}).check(invariant_nameTokenOwnershipHasNonZeroAddressOwner);
|
|
1519
|
+
var makeNameTokenOwnershipFullyOnchainSchema = (valueLabel = "Name Token Ownership Fully Onchain") => import_v413.z.object({
|
|
1520
|
+
ownershipType: import_v413.z.literal(NameTokenOwnershipTypes.FullyOnchain),
|
|
1521
|
+
owner: makeAccountIdSchema(`${valueLabel}.owner`)
|
|
1522
|
+
}).check(invariant_nameTokenOwnershipHasNonZeroAddressOwner);
|
|
1523
|
+
var makeNameTokenOwnershipBurnedSchema = (valueLabel = "Name Token Ownership Burned") => import_v413.z.object({
|
|
1524
|
+
ownershipType: import_v413.z.literal(NameTokenOwnershipTypes.Burned),
|
|
1525
|
+
owner: makeAccountIdSchema(`${valueLabel}.owner`)
|
|
1526
|
+
}).check(invariant_nameTokenOwnershipHasZeroAddressOwner);
|
|
1527
|
+
var makeNameTokenOwnershipUnknownSchema = (valueLabel = "Name Token Ownership Unknown") => import_v413.z.object({
|
|
1528
|
+
ownershipType: import_v413.z.literal(NameTokenOwnershipTypes.Unknown),
|
|
1529
|
+
owner: makeAccountIdSchema(`${valueLabel}.owner`)
|
|
1530
|
+
}).check(invariant_nameTokenOwnershipHasNonZeroAddressOwner);
|
|
1531
|
+
function invariant_nameTokenOwnershipHasZeroAddressOwner(ctx) {
|
|
1532
|
+
const ownership = ctx.value;
|
|
1533
|
+
if (ctx.value.owner.address !== import_viem4.zeroAddress) {
|
|
1534
|
+
ctx.issues.push({
|
|
1535
|
+
code: "custom",
|
|
1536
|
+
input: ctx.value,
|
|
1537
|
+
message: `Name Token Ownership with '${ownership.ownershipType}' must have 'address' set to the zero address.`
|
|
1538
|
+
});
|
|
1539
|
+
}
|
|
1540
|
+
}
|
|
1541
|
+
var makeNameTokenOwnershipSchema = (valueLabel = "Name Token Ownership") => import_v413.z.discriminatedUnion("ownershipType", [
|
|
1542
|
+
makeNameTokenOwnershipNameWrapperSchema(valueLabel),
|
|
1543
|
+
makeNameTokenOwnershipFullyOnchainSchema(valueLabel),
|
|
1544
|
+
makeNameTokenOwnershipBurnedSchema(valueLabel),
|
|
1545
|
+
makeNameTokenOwnershipUnknownSchema(valueLabel)
|
|
1546
|
+
]);
|
|
1547
|
+
var makeNameTokenSchema = (valueLabel = "Name Token Schema", serializable) => import_v413.z.object({
|
|
1548
|
+
token: makeAssetIdSchema(`${valueLabel}.token`, serializable),
|
|
1549
|
+
ownership: makeNameTokenOwnershipSchema(`${valueLabel}.ownership`),
|
|
1550
|
+
mintStatus: import_v413.z.enum(NFTMintStatuses)
|
|
1551
|
+
});
|
|
1552
|
+
|
|
1553
|
+
// src/tokenscope/assets.ts
|
|
1554
|
+
var NFTMintStatuses = {
|
|
1555
|
+
Minted: "minted",
|
|
1556
|
+
Burned: "burned"
|
|
1557
|
+
};
|
|
1558
|
+
|
|
1559
|
+
// src/tokenscope/name-token.ts
|
|
1560
|
+
var NameTokenOwnershipTypes = {
|
|
1561
|
+
/**
|
|
1562
|
+
* Name Token is owned by NameWrapper account.
|
|
1563
|
+
*/
|
|
1564
|
+
NameWrapper: "namewrapper",
|
|
1565
|
+
/**
|
|
1566
|
+
* Name Token is owned fully onchain.
|
|
1567
|
+
*
|
|
1568
|
+
* This ownership type can only apply to direct subnames of `.eth`
|
|
1569
|
+
*/
|
|
1570
|
+
FullyOnchain: "fully-onchain",
|
|
1571
|
+
/**
|
|
1572
|
+
* Name Token ownership has been transferred to the null address.
|
|
1573
|
+
*/
|
|
1574
|
+
Burned: "burned",
|
|
1575
|
+
/**
|
|
1576
|
+
* Name Token ownership is unknown.
|
|
1577
|
+
*/
|
|
1578
|
+
Unknown: "unknown"
|
|
1579
|
+
};
|
|
1580
|
+
|
|
1581
|
+
// src/ensnode/api/shared/errors/zod-schemas.ts
|
|
1582
|
+
var import_v415 = require("zod/v4");
|
|
1583
|
+
var makeErrorResponseSchema = () => import_v415.z.object({
|
|
1584
|
+
message: import_v415.z.string().describe("A description of the error that occurred."),
|
|
1585
|
+
details: import_v415.z.optional(import_v415.z.unknown()).describe("Additional details about the error.")
|
|
1586
|
+
});
|
|
1587
|
+
|
|
1588
|
+
// src/ensnode/api/name-tokens/response.ts
|
|
1589
|
+
var NameTokensResponseCodes = {
|
|
1590
|
+
/**
|
|
1591
|
+
* Represents a response when Name Tokens API can respond with requested data.
|
|
1592
|
+
*/
|
|
1593
|
+
Ok: "ok",
|
|
1594
|
+
/**
|
|
1595
|
+
* Represents a response when Name Tokens API could not respond with requested data.
|
|
1596
|
+
*/
|
|
1597
|
+
Error: "error"
|
|
1598
|
+
};
|
|
1599
|
+
var NameTokensResponseErrorCodes = {
|
|
1600
|
+
/**
|
|
1601
|
+
* Name tokens not indexed
|
|
1602
|
+
*
|
|
1603
|
+
* Represents an error when tokens for the requested name are not indexed by
|
|
1604
|
+
* the ENSNode instance's configuration.
|
|
1605
|
+
*/
|
|
1606
|
+
NameTokensNotIndexed: "name-tokens-not-indexed",
|
|
1607
|
+
/**
|
|
1608
|
+
* Unsupported ENSIndexer Config
|
|
1609
|
+
*
|
|
1610
|
+
* Represents a prerequisites error when connected ENSIndexer config lacks
|
|
1611
|
+
* params required to enable Name Tokens API.
|
|
1612
|
+
*/
|
|
1613
|
+
EnsIndexerConfigUnsupported: "unsupported-ensindexer-config",
|
|
1614
|
+
/**
|
|
1615
|
+
* Unsupported Indexing Status
|
|
1616
|
+
*
|
|
1617
|
+
* Represents a prerequisites error when Indexing Status has not yet reached
|
|
1618
|
+
* status required to enable Name Tokens API.
|
|
1619
|
+
*/
|
|
1620
|
+
IndexingStatusUnsupported: "unsupported-indexing-status"
|
|
1621
|
+
};
|
|
1622
|
+
|
|
1623
|
+
// src/ensnode/api/name-tokens/zod-schemas.ts
|
|
1624
|
+
var makeRegisteredNameTokenSchema = (valueLabel = "Registered Name Token", serializable) => import_v416.z.object({
|
|
1625
|
+
domainId: makeNodeSchema(`${valueLabel}.domainId`),
|
|
1626
|
+
name: makeReinterpretedNameSchema(valueLabel),
|
|
1627
|
+
tokens: import_v416.z.array(makeNameTokenSchema(`${valueLabel}.tokens`, serializable)).nonempty(),
|
|
1628
|
+
expiresAt: makeUnixTimestampSchema(`${valueLabel}.expiresAt`),
|
|
1629
|
+
accurateAsOf: makeUnixTimestampSchema(`${valueLabel}.accurateAsOf`)
|
|
1630
|
+
}).check(function invariant_nameIsAssociatedWithDomainId(ctx) {
|
|
1631
|
+
const { name, domainId } = ctx.value;
|
|
1632
|
+
if ((0, import_enssdk5.namehashInterpretedName)(name) !== domainId) {
|
|
1633
|
+
ctx.issues.push({
|
|
1634
|
+
code: "custom",
|
|
1635
|
+
input: ctx.value,
|
|
1636
|
+
message: `'name' must be associated with 'domainId': ${domainId}`
|
|
1637
|
+
});
|
|
1638
|
+
}
|
|
1639
|
+
}).check(
|
|
1640
|
+
function invariant_nameTokensOwnershipTypeNameWrapperRequiresOwnershipTypeFullyOnchainOrUnknown(ctx) {
|
|
1641
|
+
const { tokens } = ctx.value;
|
|
1642
|
+
const containsOwnershipNameWrapper = tokens.some(
|
|
1643
|
+
(t) => t.ownership.ownershipType === NameTokenOwnershipTypes.NameWrapper
|
|
1644
|
+
);
|
|
1645
|
+
const containsOwnershipFullyOnchainOrUnknown = tokens.some(
|
|
1646
|
+
(t) => t.ownership.ownershipType === NameTokenOwnershipTypes.FullyOnchain || t.ownership.ownershipType === NameTokenOwnershipTypes.Unknown
|
|
1647
|
+
);
|
|
1648
|
+
if (containsOwnershipNameWrapper && !containsOwnershipFullyOnchainOrUnknown) {
|
|
1649
|
+
ctx.issues.push({
|
|
1650
|
+
code: "custom",
|
|
1651
|
+
input: ctx.value,
|
|
1652
|
+
message: `'tokens' must contain name token with ownership type 'fully-onchain' or 'unknown' when name token with ownership type 'namewrapper' in listed`
|
|
1653
|
+
});
|
|
1654
|
+
}
|
|
1655
|
+
}
|
|
1656
|
+
).check(function invariant_nameTokensContainAtMostOneWithOwnershipTypeEffective(ctx) {
|
|
1657
|
+
const { tokens } = ctx.value;
|
|
1658
|
+
const tokensCountWithOwnershipFullyOnchain = tokens.filter(
|
|
1659
|
+
(t) => t.ownership.ownershipType === NameTokenOwnershipTypes.FullyOnchain
|
|
1660
|
+
).length;
|
|
1661
|
+
if (tokensCountWithOwnershipFullyOnchain > 1) {
|
|
1662
|
+
ctx.issues.push({
|
|
1663
|
+
code: "custom",
|
|
1664
|
+
input: ctx.value,
|
|
1665
|
+
message: `'tokens' must contain at most one name token with ownership type 'fully-onchain', current count: ${tokensCountWithOwnershipFullyOnchain}`
|
|
1666
|
+
});
|
|
1667
|
+
}
|
|
1668
|
+
});
|
|
1669
|
+
var makeNameTokensResponseOkSchema = (valueLabel = "Name Tokens Response OK", serializable) => import_v416.z.strictObject({
|
|
1670
|
+
responseCode: import_v416.z.literal(NameTokensResponseCodes.Ok),
|
|
1671
|
+
registeredNameTokens: makeRegisteredNameTokenSchema(`${valueLabel}.nameTokens`, serializable)
|
|
1672
|
+
});
|
|
1673
|
+
var makeNameTokensResponseErrorNameTokensNotIndexedSchema = (_valueLabel = "Name Tokens Response Error Name Not Indexed") => import_v416.z.strictObject({
|
|
1674
|
+
responseCode: import_v416.z.literal(NameTokensResponseCodes.Error),
|
|
1675
|
+
errorCode: import_v416.z.literal(NameTokensResponseErrorCodes.NameTokensNotIndexed),
|
|
1676
|
+
error: makeErrorResponseSchema()
|
|
1677
|
+
});
|
|
1678
|
+
var makeNameTokensResponseErrorEnsIndexerConfigUnsupported = (_valueLabel = "Name Tokens Response Error ENSIndexer Config Unsupported") => import_v416.z.strictObject({
|
|
1679
|
+
responseCode: import_v416.z.literal(NameTokensResponseCodes.Error),
|
|
1680
|
+
errorCode: import_v416.z.literal(NameTokensResponseErrorCodes.EnsIndexerConfigUnsupported),
|
|
1681
|
+
error: makeErrorResponseSchema()
|
|
1682
|
+
});
|
|
1683
|
+
var makeNameTokensResponseErrorNameIndexingStatusUnsupported = (_valueLabel = "Name Tokens Response Error Indexing Status Unsupported") => import_v416.z.strictObject({
|
|
1684
|
+
responseCode: import_v416.z.literal(NameTokensResponseCodes.Error),
|
|
1685
|
+
errorCode: import_v416.z.literal(NameTokensResponseErrorCodes.IndexingStatusUnsupported),
|
|
1686
|
+
error: makeErrorResponseSchema()
|
|
1687
|
+
});
|
|
1688
|
+
var makeNameTokensResponseErrorSchema = (valueLabel = "Name Tokens Response Error") => import_v416.z.discriminatedUnion("errorCode", [
|
|
1689
|
+
makeNameTokensResponseErrorNameTokensNotIndexedSchema(valueLabel),
|
|
1690
|
+
makeNameTokensResponseErrorEnsIndexerConfigUnsupported(valueLabel),
|
|
1691
|
+
makeNameTokensResponseErrorNameIndexingStatusUnsupported(valueLabel)
|
|
1692
|
+
]);
|
|
1693
|
+
var makeNameTokensResponseSchema = (valueLabel = "Name Tokens Response", serializable) => {
|
|
1694
|
+
return import_v416.z.discriminatedUnion("responseCode", [
|
|
1695
|
+
makeNameTokensResponseOkSchema(valueLabel, serializable ?? false),
|
|
1696
|
+
makeNameTokensResponseErrorSchema(valueLabel)
|
|
1697
|
+
]);
|
|
1698
|
+
};
|
|
1699
|
+
|
|
1700
|
+
// src/ensnode/api/realtime/zod-schemas.ts
|
|
1701
|
+
var import_v417 = require("zod/v4");
|
|
1702
|
+
var realtimeResponseSchemaOk = import_v417.z.object({
|
|
1703
|
+
maxWorstCaseDistance: makeDurationSchema().describe(
|
|
1704
|
+
"The requested maximum acceptable worst-case indexing distance in seconds."
|
|
1705
|
+
),
|
|
1706
|
+
slowestChainIndexingCursor: makeUnixTimestampSchema().describe(
|
|
1707
|
+
"The timestamp of the slowest chain's latest indexed block."
|
|
1708
|
+
),
|
|
1709
|
+
worstCaseDistance: makeDurationSchema().describe(
|
|
1710
|
+
"The actual worst-case distance in seconds between 'now' and the slowest chain's indexing cursor. This allows your client to programmatically determine whether the ENSNode instance is sufficiently synchronized for your use case."
|
|
1711
|
+
)
|
|
1712
|
+
});
|
|
1713
|
+
var realtimeResponseSchemaError = makeErrorResponseSchema();
|
|
1714
|
+
|
|
1715
|
+
// src/ensnode/api/registrar-actions/examples.ts
|
|
1716
|
+
var registrarActionsResponseOkExample = {
|
|
1717
|
+
responseCode: "ok",
|
|
1718
|
+
registrarActions: [
|
|
1719
|
+
{
|
|
1720
|
+
action: {
|
|
1721
|
+
type: "registration",
|
|
1722
|
+
id: "0x0000000000000000000000000000000000000000000000000000000000000001",
|
|
1723
|
+
incrementalDuration: 31536e3,
|
|
1724
|
+
registrant: "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
|
|
1725
|
+
registrationLifecycle: {
|
|
1726
|
+
subregistry: {
|
|
1727
|
+
subregistryId: {
|
|
1728
|
+
chainId: 1,
|
|
1729
|
+
address: "0x253553366da8546fc250f225fe3d25d0c782303b"
|
|
1730
|
+
},
|
|
1731
|
+
node: "0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae"
|
|
1732
|
+
},
|
|
1733
|
+
node: "0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835",
|
|
1734
|
+
expiresAt: 1893456e3
|
|
1735
|
+
},
|
|
1736
|
+
pricing: {
|
|
1737
|
+
baseCost: { amount: "1000000000000000", currency: "ETH" },
|
|
1738
|
+
premium: { amount: "0", currency: "ETH" },
|
|
1739
|
+
total: { amount: "1000000000000000", currency: "ETH" }
|
|
1740
|
+
},
|
|
1741
|
+
referral: { encodedReferrer: null, decodedReferrer: null },
|
|
1742
|
+
block: { timestamp: 17e8, number: 185e5 },
|
|
1743
|
+
transactionHash: "0x0000000000000000000000000000000000000000000000000000000000000001",
|
|
1744
|
+
eventIds: ["0x0000000000000000000000000000000000000000000000000000000000000001"]
|
|
1745
|
+
},
|
|
1746
|
+
name: "vitalik.eth"
|
|
1747
|
+
}
|
|
1748
|
+
],
|
|
1749
|
+
pageContext: {
|
|
1750
|
+
page: 1,
|
|
1751
|
+
recordsPerPage: 25,
|
|
1752
|
+
totalRecords: 1,
|
|
1753
|
+
totalPages: 1,
|
|
1754
|
+
hasNext: false,
|
|
1755
|
+
hasPrev: false,
|
|
1756
|
+
startIndex: 0,
|
|
1757
|
+
endIndex: 0
|
|
1758
|
+
},
|
|
1759
|
+
accurateAsOf: 17e8
|
|
1760
|
+
};
|
|
1761
|
+
|
|
1762
|
+
// src/ensnode/api/registrar-actions/zod-schemas.ts
|
|
1763
|
+
var import_enssdk7 = require("enssdk");
|
|
1764
|
+
var import_v420 = require("zod/v4");
|
|
1765
|
+
|
|
1766
|
+
// src/registrars/zod-schemas.ts
|
|
1767
|
+
var import_v418 = require("zod/v4");
|
|
1768
|
+
|
|
1769
|
+
// src/registrars/encoded-referrer.ts
|
|
1770
|
+
var import_enssdk6 = require("enssdk");
|
|
1771
|
+
var import_viem7 = require("viem");
|
|
1772
|
+
var ENCODED_REFERRER_BYTE_OFFSET = 12;
|
|
1773
|
+
var ENCODED_REFERRER_BYTE_LENGTH = 32;
|
|
1774
|
+
var EXPECTED_ENCODED_REFERRER_PADDING = (0, import_viem7.pad)("0x", {
|
|
1775
|
+
size: ENCODED_REFERRER_BYTE_OFFSET,
|
|
1776
|
+
dir: "left"
|
|
1777
|
+
});
|
|
1778
|
+
var ZERO_ENCODED_REFERRER = (0, import_viem7.pad)("0x", {
|
|
1779
|
+
size: ENCODED_REFERRER_BYTE_LENGTH,
|
|
1780
|
+
dir: "left"
|
|
1781
|
+
});
|
|
1782
|
+
function decodeEncodedReferrer(encodedReferrer) {
|
|
1783
|
+
if ((0, import_viem7.size)(encodedReferrer) !== ENCODED_REFERRER_BYTE_LENGTH) {
|
|
1784
|
+
throw new Error(
|
|
1785
|
+
`Encoded referrer value must be represented by ${ENCODED_REFERRER_BYTE_LENGTH} bytes.`
|
|
1786
|
+
);
|
|
1787
|
+
}
|
|
1788
|
+
const padding = (0, import_viem7.slice)(encodedReferrer, 0, ENCODED_REFERRER_BYTE_OFFSET);
|
|
1789
|
+
if (padding !== EXPECTED_ENCODED_REFERRER_PADDING) return import_viem7.zeroAddress;
|
|
1790
|
+
const decodedReferrer = (0, import_viem7.slice)(encodedReferrer, ENCODED_REFERRER_BYTE_OFFSET);
|
|
1791
|
+
try {
|
|
1792
|
+
return (0, import_enssdk6.toNormalizedAddress)(decodedReferrer);
|
|
1793
|
+
} catch {
|
|
1794
|
+
throw new Error(`Decoded referrer value must be a valid EVM address.`);
|
|
1795
|
+
}
|
|
1796
|
+
}
|
|
1797
|
+
|
|
1798
|
+
// src/shared/serialize.ts
|
|
1799
|
+
function serializeChainId(chainId) {
|
|
1800
|
+
return chainId.toString();
|
|
1801
|
+
}
|
|
1802
|
+
|
|
1803
|
+
// src/registrars/registrar-action.ts
|
|
1804
|
+
var RegistrarActionTypes = {
|
|
1805
|
+
Registration: "registration",
|
|
1806
|
+
Renewal: "renewal"
|
|
1807
|
+
};
|
|
1808
|
+
|
|
1809
|
+
// src/registrars/zod-schemas.ts
|
|
1810
|
+
var makeSubregistrySchema = (valueLabel = "Subregistry") => import_v418.z.object({
|
|
1811
|
+
subregistryId: makeAccountIdSchema(`${valueLabel} Subregistry ID`),
|
|
1812
|
+
node: makeNodeSchema(`${valueLabel} Node`)
|
|
1813
|
+
});
|
|
1814
|
+
var makeRegistrationLifecycleSchema = (valueLabel = "Registration Lifecycle") => import_v418.z.object({
|
|
1815
|
+
subregistry: makeSubregistrySchema(`${valueLabel} Subregistry`),
|
|
1816
|
+
node: makeNodeSchema(`${valueLabel} Node`),
|
|
1817
|
+
expiresAt: makeUnixTimestampSchema(`${valueLabel} Expires at`)
|
|
1818
|
+
});
|
|
1819
|
+
function invariant_registrarActionPricingTotalIsSumOfBaseCostAndPremium(ctx) {
|
|
1820
|
+
const { baseCost, premium, total } = ctx.value;
|
|
1821
|
+
const actualTotal = addPrices(baseCost, premium);
|
|
1822
|
+
if (!isPriceEqual(actualTotal, total)) {
|
|
1823
|
+
ctx.issues.push({
|
|
1824
|
+
code: "custom",
|
|
1825
|
+
input: ctx.value,
|
|
1826
|
+
message: `'total' must be equal to the sum of 'baseCost' and 'premium'`
|
|
1827
|
+
});
|
|
1828
|
+
}
|
|
1829
|
+
}
|
|
1830
|
+
var makeRegistrarActionPricingSchema = (valueLabel = "Registrar Action Pricing") => import_v418.z.union([
|
|
1831
|
+
// pricing available
|
|
1832
|
+
import_v418.z.object({
|
|
1833
|
+
baseCost: makePriceEthSchema(`${valueLabel} Base Cost`),
|
|
1834
|
+
premium: makePriceEthSchema(`${valueLabel} Premium`),
|
|
1835
|
+
total: makePriceEthSchema(`${valueLabel} Total`)
|
|
1836
|
+
}).check(invariant_registrarActionPricingTotalIsSumOfBaseCostAndPremium).transform((v) => v),
|
|
1837
|
+
// pricing unknown
|
|
1838
|
+
import_v418.z.object({
|
|
1839
|
+
baseCost: import_v418.z.null(),
|
|
1840
|
+
premium: import_v418.z.null(),
|
|
1841
|
+
total: import_v418.z.null()
|
|
1842
|
+
}).transform((v) => v)
|
|
1843
|
+
]);
|
|
1844
|
+
var makeSerializedRegistrarActionPricingSchema = (valueLabel = "Serialized Registrar Action Pricing") => import_v418.z.union([
|
|
1845
|
+
// pricing available
|
|
1846
|
+
import_v418.z.object({
|
|
1847
|
+
baseCost: makeSerializedPriceEthSchema(`${valueLabel} Base Cost`),
|
|
1848
|
+
premium: makeSerializedPriceEthSchema(`${valueLabel} Premium`),
|
|
1849
|
+
total: makeSerializedPriceEthSchema(`${valueLabel} Total`)
|
|
1850
|
+
}),
|
|
1851
|
+
// pricing unknown
|
|
1852
|
+
import_v418.z.object({
|
|
1853
|
+
baseCost: import_v418.z.null(),
|
|
1854
|
+
premium: import_v418.z.null(),
|
|
1855
|
+
total: import_v418.z.null()
|
|
1856
|
+
})
|
|
1857
|
+
]);
|
|
1858
|
+
function invariant_registrarActionDecodedReferrerBasedOnRawReferrer(ctx) {
|
|
1859
|
+
const { encodedReferrer, decodedReferrer } = ctx.value;
|
|
1860
|
+
try {
|
|
1861
|
+
const expectedDecodedReferrer = decodeEncodedReferrer(encodedReferrer);
|
|
1862
|
+
if (decodedReferrer !== expectedDecodedReferrer) {
|
|
1863
|
+
ctx.issues.push({
|
|
1864
|
+
code: "custom",
|
|
1865
|
+
input: ctx.value,
|
|
1866
|
+
message: `'decodedReferrer' must be based on 'encodedReferrer'`
|
|
1867
|
+
});
|
|
1868
|
+
}
|
|
1869
|
+
} catch (error) {
|
|
1870
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
1871
|
+
ctx.issues.push({
|
|
1872
|
+
code: "custom",
|
|
1873
|
+
input: ctx.value,
|
|
1874
|
+
message: errorMessage
|
|
1875
|
+
});
|
|
1876
|
+
}
|
|
1877
|
+
}
|
|
1878
|
+
var makeRegistrarActionReferralSchema = (valueLabel = "Registrar Action Referral") => import_v418.z.union([
|
|
1879
|
+
// referral available
|
|
1880
|
+
import_v418.z.object({
|
|
1881
|
+
encodedReferrer: makeHexStringSchema(
|
|
1882
|
+
{ bytesCount: ENCODED_REFERRER_BYTE_LENGTH },
|
|
1883
|
+
`${valueLabel} Encoded Referrer`
|
|
1884
|
+
),
|
|
1885
|
+
decodedReferrer: makeNormalizedAddressSchema(`${valueLabel} Decoded Referrer`)
|
|
1886
|
+
}).check(invariant_registrarActionDecodedReferrerBasedOnRawReferrer),
|
|
1887
|
+
// referral not applicable
|
|
1888
|
+
import_v418.z.object({
|
|
1889
|
+
encodedReferrer: import_v418.z.null(),
|
|
1890
|
+
decodedReferrer: import_v418.z.null()
|
|
1891
|
+
})
|
|
1892
|
+
]);
|
|
1893
|
+
function invariant_eventIdsInitialElementIsTheActionId(ctx) {
|
|
1894
|
+
const { id, eventIds } = ctx.value;
|
|
1895
|
+
if (eventIds[0] !== id) {
|
|
1896
|
+
ctx.issues.push({
|
|
1897
|
+
code: "custom",
|
|
1898
|
+
input: ctx.value,
|
|
1899
|
+
message: "The initial element of `eventIds` must be the `id` value"
|
|
1900
|
+
});
|
|
1901
|
+
}
|
|
1902
|
+
}
|
|
1903
|
+
var EventIdSchema = import_v418.z.string().nonempty();
|
|
1904
|
+
var EventIdsSchema = import_v418.z.array(EventIdSchema).min(1).transform((v) => v);
|
|
1905
|
+
var makeBaseRegistrarActionSchemaWithoutCheck = (valueLabel = "Base Registrar Action") => import_v418.z.object({
|
|
1906
|
+
id: EventIdSchema,
|
|
1907
|
+
incrementalDuration: makeDurationSchema(`${valueLabel} Incremental Duration`),
|
|
1908
|
+
registrant: makeNormalizedAddressSchema(`${valueLabel} Registrant`),
|
|
1909
|
+
registrationLifecycle: makeRegistrationLifecycleSchema(`${valueLabel} Registration Lifecycle`),
|
|
1910
|
+
pricing: makeRegistrarActionPricingSchema(`${valueLabel} Pricing`),
|
|
1911
|
+
referral: makeRegistrarActionReferralSchema(`${valueLabel} Referral`),
|
|
1912
|
+
block: makeBlockRefSchema(`${valueLabel} Block`),
|
|
1913
|
+
transactionHash: makeTransactionHashSchema(`${valueLabel} Transaction Hash`),
|
|
1914
|
+
eventIds: EventIdsSchema
|
|
1915
|
+
});
|
|
1916
|
+
var makeBaseRegistrarActionSchema = (valueLabel = "Base Registrar Action") => makeBaseRegistrarActionSchemaWithoutCheck(valueLabel).check(
|
|
1917
|
+
invariant_eventIdsInitialElementIsTheActionId
|
|
1918
|
+
);
|
|
1919
|
+
var makeRegistrarActionRegistrationSchema = (valueLabel = "Registration ") => makeBaseRegistrarActionSchema(valueLabel).extend({
|
|
1920
|
+
type: import_v418.z.literal(RegistrarActionTypes.Registration)
|
|
1921
|
+
});
|
|
1922
|
+
var makeRegistrarActionRenewalSchema = (valueLabel = "Renewal") => makeBaseRegistrarActionSchema(valueLabel).extend({
|
|
1923
|
+
type: import_v418.z.literal(RegistrarActionTypes.Renewal)
|
|
1924
|
+
});
|
|
1925
|
+
var makeRegistrarActionSchema = (valueLabel = "Registrar Action") => import_v418.z.discriminatedUnion("type", [
|
|
1926
|
+
makeRegistrarActionRegistrationSchema(`${valueLabel} Registration`),
|
|
1927
|
+
makeRegistrarActionRenewalSchema(`${valueLabel} Renewal`)
|
|
1928
|
+
]);
|
|
1929
|
+
var makeSerializedBaseRegistrarActionSchema = (valueLabel = "Serialized Base Registrar Action") => makeBaseRegistrarActionSchemaWithoutCheck(valueLabel).extend({
|
|
1930
|
+
pricing: makeSerializedRegistrarActionPricingSchema(`${valueLabel} Pricing`)
|
|
1931
|
+
});
|
|
1932
|
+
var makeSerializedRegistrarActionRegistrationSchema = (valueLabel = "Serialized Registration") => makeSerializedBaseRegistrarActionSchema(valueLabel).extend({
|
|
1933
|
+
type: import_v418.z.literal(RegistrarActionTypes.Registration)
|
|
1934
|
+
});
|
|
1935
|
+
var makeSerializedRegistrarActionRenewalSchema = (valueLabel = "Serialized Renewal") => makeSerializedBaseRegistrarActionSchema(valueLabel).extend({
|
|
1936
|
+
type: import_v418.z.literal(RegistrarActionTypes.Renewal)
|
|
1937
|
+
});
|
|
1938
|
+
var makeSerializedRegistrarActionSchema = (valueLabel = "Serialized Registrar Action") => import_v418.z.discriminatedUnion("type", [
|
|
1939
|
+
makeSerializedRegistrarActionRegistrationSchema(`${valueLabel} Registration`),
|
|
1940
|
+
makeSerializedRegistrarActionRenewalSchema(`${valueLabel} Renewal`)
|
|
1941
|
+
]);
|
|
1942
|
+
|
|
1943
|
+
// src/ensnode/api/shared/pagination/zod-schemas.ts
|
|
1944
|
+
var import_v419 = require("zod/v4");
|
|
1945
|
+
|
|
1946
|
+
// src/ensnode/api/shared/pagination/request.ts
|
|
1947
|
+
var RECORDS_PER_PAGE_MAX = 100;
|
|
1948
|
+
|
|
1949
|
+
// src/ensnode/api/shared/pagination/zod-schemas.ts
|
|
1950
|
+
var makeRequestPageParamsSchema = (valueLabel = "RequestPageParams") => import_v419.z.object({
|
|
1951
|
+
page: makePositiveIntegerSchema(`${valueLabel}.page`),
|
|
1952
|
+
recordsPerPage: makePositiveIntegerSchema(`${valueLabel}.recordsPerPage`).max(
|
|
1953
|
+
RECORDS_PER_PAGE_MAX,
|
|
1954
|
+
`${valueLabel}.recordsPerPage must not exceed ${RECORDS_PER_PAGE_MAX}`
|
|
1955
|
+
)
|
|
1956
|
+
});
|
|
1957
|
+
var makeResponsePageContextSchemaWithNoRecords = (valueLabel = "ResponsePageContextWithNoRecords") => import_v419.z.object({
|
|
1958
|
+
totalRecords: import_v419.z.literal(0),
|
|
1959
|
+
totalPages: import_v419.z.literal(1),
|
|
1960
|
+
hasNext: import_v419.z.literal(false),
|
|
1961
|
+
hasPrev: import_v419.z.literal(false)
|
|
1962
|
+
}).extend(makeRequestPageParamsSchema(valueLabel).shape);
|
|
1963
|
+
function invariant_responsePageWithRecordsIsCorrect(ctx) {
|
|
1964
|
+
const { hasNext, hasPrev, recordsPerPage, page, totalRecords, startIndex, endIndex } = ctx.value;
|
|
1965
|
+
const expectedHasNext = page * recordsPerPage < totalRecords;
|
|
1966
|
+
if (hasNext !== expectedHasNext) {
|
|
1967
|
+
ctx.issues.push({
|
|
1968
|
+
code: "custom",
|
|
1969
|
+
input: ctx.value,
|
|
1970
|
+
message: `hasNext must be equal to '${expectedHasNext ? "true" : "false"}'`
|
|
1971
|
+
});
|
|
1972
|
+
}
|
|
1973
|
+
const expectedHasPrev = page > 1;
|
|
1974
|
+
if (hasPrev !== expectedHasPrev) {
|
|
1975
|
+
ctx.issues.push({
|
|
1976
|
+
code: "custom",
|
|
1977
|
+
input: ctx.value,
|
|
1978
|
+
message: `hasPrev must be equal to '${expectedHasPrev ? "true" : "false"}'`
|
|
1979
|
+
});
|
|
1980
|
+
}
|
|
1981
|
+
if (endIndex < startIndex) {
|
|
1982
|
+
ctx.issues.push({
|
|
1983
|
+
code: "custom",
|
|
1984
|
+
input: ctx.value,
|
|
1985
|
+
message: `endIndex must be greater than or equal to startIndex`
|
|
1986
|
+
});
|
|
1987
|
+
}
|
|
1988
|
+
if (endIndex >= totalRecords) {
|
|
1989
|
+
ctx.issues.push({
|
|
1990
|
+
code: "custom",
|
|
1991
|
+
input: ctx.value,
|
|
1992
|
+
message: `endIndex must be lower than totalRecords`
|
|
1993
|
+
});
|
|
1994
|
+
}
|
|
1995
|
+
}
|
|
1996
|
+
var makeResponsePageContextSchemaWithRecords = (valueLabel = "ResponsePageContextWithRecords") => import_v419.z.object({
|
|
1997
|
+
totalRecords: makePositiveIntegerSchema(`${valueLabel}.totalRecords`),
|
|
1998
|
+
totalPages: makePositiveIntegerSchema(`${valueLabel}.totalPages`),
|
|
1999
|
+
hasNext: import_v419.z.boolean(),
|
|
2000
|
+
hasPrev: import_v419.z.boolean(),
|
|
2001
|
+
startIndex: makeNonNegativeIntegerSchema(`${valueLabel}.startIndex`),
|
|
2002
|
+
endIndex: makeNonNegativeIntegerSchema(`${valueLabel}.endIndex`)
|
|
2003
|
+
}).extend(makeRequestPageParamsSchema(valueLabel).shape).check(invariant_responsePageWithRecordsIsCorrect);
|
|
2004
|
+
var makeResponsePageContextSchema = (valueLabel = "ResponsePageContext") => import_v419.z.union([
|
|
2005
|
+
makeResponsePageContextSchemaWithNoRecords(valueLabel),
|
|
2006
|
+
makeResponsePageContextSchemaWithRecords(valueLabel)
|
|
2007
|
+
]);
|
|
2008
|
+
|
|
2009
|
+
// src/ensnode/api/registrar-actions/response.ts
|
|
2010
|
+
var RegistrarActionsResponseCodes = {
|
|
2011
|
+
/**
|
|
2012
|
+
* Represents that Registrar Actions are available.
|
|
2013
|
+
*/
|
|
2014
|
+
Ok: "ok",
|
|
2015
|
+
/**
|
|
2016
|
+
* Represents that Registrar Actions are unavailable.
|
|
2017
|
+
*/
|
|
2018
|
+
Error: "error"
|
|
2019
|
+
};
|
|
2020
|
+
|
|
2021
|
+
// src/ensnode/api/registrar-actions/zod-schemas.ts
|
|
2022
|
+
function invariant_registrationLifecycleNodeMatchesName(ctx) {
|
|
2023
|
+
const { name, action } = ctx.value;
|
|
2024
|
+
const expectedNode = action.registrationLifecycle.node;
|
|
2025
|
+
const actualNode = (0, import_enssdk7.namehashInterpretedName)(name);
|
|
2026
|
+
if (actualNode !== expectedNode) {
|
|
2027
|
+
ctx.issues.push({
|
|
2028
|
+
code: "custom",
|
|
2029
|
+
input: ctx.value,
|
|
2030
|
+
message: `The 'action.registrationLifecycle.node' must match namehash of 'name'`
|
|
2031
|
+
});
|
|
2032
|
+
}
|
|
2033
|
+
}
|
|
2034
|
+
var makeNamedRegistrarActionSchema = (valueLabel = "Named Registrar Action") => import_v420.z.object({
|
|
2035
|
+
action: makeRegistrarActionSchema(valueLabel),
|
|
2036
|
+
name: makeReinterpretedNameSchema(valueLabel)
|
|
2037
|
+
}).check(invariant_registrationLifecycleNodeMatchesName);
|
|
2038
|
+
var makeSerializedNamedRegistrarActionSchema = (valueLabel = "Serialized Named Registrar Action") => import_v420.z.object({
|
|
2039
|
+
action: makeSerializedRegistrarActionSchema(valueLabel),
|
|
2040
|
+
name: makeReinterpretedNameSchema(valueLabel)
|
|
2041
|
+
});
|
|
2042
|
+
var makeRegistrarActionsResponseOkSchema = (valueLabel = "Registrar Actions Response OK") => import_v420.z.object({
|
|
2043
|
+
responseCode: import_v420.z.literal(RegistrarActionsResponseCodes.Ok),
|
|
2044
|
+
registrarActions: import_v420.z.array(makeNamedRegistrarActionSchema(valueLabel)),
|
|
2045
|
+
pageContext: makeResponsePageContextSchema(`${valueLabel}.pageContext`),
|
|
2046
|
+
accurateAsOf: makeUnixTimestampSchema(`${valueLabel}.accurateAsOf`)
|
|
2047
|
+
});
|
|
2048
|
+
var makeRegistrarActionsResponseErrorSchema = (_valueLabel = "Registrar Actions Response Error") => import_v420.z.strictObject({
|
|
2049
|
+
responseCode: import_v420.z.literal(RegistrarActionsResponseCodes.Error),
|
|
2050
|
+
error: makeErrorResponseSchema()
|
|
2051
|
+
});
|
|
2052
|
+
var makeRegistrarActionsResponseSchema = (valueLabel = "Registrar Actions Response") => import_v420.z.discriminatedUnion("responseCode", [
|
|
2053
|
+
makeRegistrarActionsResponseOkSchema(valueLabel),
|
|
2054
|
+
makeRegistrarActionsResponseErrorSchema(valueLabel)
|
|
2055
|
+
]);
|
|
2056
|
+
var makeSerializedRegistrarActionsResponseOkSchema = (valueLabel = "Serialized Registrar Actions Response OK") => import_v420.z.object({
|
|
2057
|
+
responseCode: import_v420.z.literal(RegistrarActionsResponseCodes.Ok),
|
|
2058
|
+
registrarActions: import_v420.z.array(makeSerializedNamedRegistrarActionSchema(valueLabel)),
|
|
2059
|
+
pageContext: makeResponsePageContextSchema(`${valueLabel}.pageContext`),
|
|
2060
|
+
accurateAsOf: makeUnixTimestampSchema(`${valueLabel}.accurateAsOf`)
|
|
2061
|
+
});
|
|
2062
|
+
|
|
2063
|
+
// src/ensnode/api/resolution/examples.ts
|
|
2064
|
+
var resolveRecordsResponseExample = {
|
|
2065
|
+
records: {
|
|
2066
|
+
addresses: { "60": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045" },
|
|
2067
|
+
texts: {
|
|
2068
|
+
description: "mi pinxe lo crino tcati"
|
|
2069
|
+
}
|
|
2070
|
+
},
|
|
2071
|
+
accelerationRequested: false,
|
|
2072
|
+
accelerationAttempted: false
|
|
2073
|
+
};
|
|
2074
|
+
var resolvePrimaryNameResponseExample = {
|
|
2075
|
+
name: "jesse.base.eth",
|
|
2076
|
+
accelerationRequested: false,
|
|
2077
|
+
accelerationAttempted: false
|
|
2078
|
+
};
|
|
2079
|
+
var resolvePrimaryNamesResponseExample = {
|
|
2080
|
+
names: {
|
|
2081
|
+
"1": "jesse.base.eth",
|
|
2082
|
+
"10": null,
|
|
2083
|
+
"8453": "jesse.base.eth",
|
|
2084
|
+
"42161": null,
|
|
2085
|
+
"59144": null,
|
|
2086
|
+
"534352": null
|
|
2087
|
+
},
|
|
2088
|
+
accelerationRequested: false,
|
|
2089
|
+
accelerationAttempted: false
|
|
2090
|
+
};
|
|
2091
|
+
|
|
2092
|
+
// src/ensnode/api/resolution/zod-schemas.ts
|
|
2093
|
+
var import_v421 = require("zod/v4");
|
|
2094
|
+
var makeResolverRecordsResponseSchema = () => import_v421.z.object({
|
|
2095
|
+
name: import_v421.z.string().nullable().optional(),
|
|
2096
|
+
addresses: import_v421.z.record(import_v421.z.string(), import_v421.z.string().nullable()).optional(),
|
|
2097
|
+
texts: import_v421.z.record(import_v421.z.string(), import_v421.z.string().nullable()).optional(),
|
|
2098
|
+
contenthash: import_v421.z.string().nullable().optional(),
|
|
2099
|
+
pubkey: import_v421.z.object({ x: import_v421.z.string(), y: import_v421.z.string() }).nullable().optional(),
|
|
2100
|
+
dnszonehash: import_v421.z.string().nullable().optional(),
|
|
2101
|
+
version: import_v421.z.string().nullable().optional(),
|
|
2102
|
+
abi: import_v421.z.object({ contentType: import_v421.z.string(), data: import_v421.z.string() }).nullable().optional(),
|
|
2103
|
+
interfaces: import_v421.z.record(import_v421.z.string(), import_v421.z.string().nullable()).optional()
|
|
2104
|
+
});
|
|
2105
|
+
var makeResolveRecordsResponseSchema = () => import_v421.z.object({
|
|
2106
|
+
records: makeResolverRecordsResponseSchema(),
|
|
2107
|
+
accelerationRequested: import_v421.z.boolean(),
|
|
2108
|
+
accelerationAttempted: import_v421.z.boolean(),
|
|
2109
|
+
// TODO: Find a better way to handle recursive types, patch solution is .unknown()
|
|
2110
|
+
trace: import_v421.z.array(import_v421.z.unknown()).optional()
|
|
2111
|
+
});
|
|
2112
|
+
var makeResolvePrimaryNameResponseSchema = () => import_v421.z.object({
|
|
2113
|
+
name: import_v421.z.string().nullable(),
|
|
2114
|
+
accelerationRequested: import_v421.z.boolean(),
|
|
2115
|
+
accelerationAttempted: import_v421.z.boolean(),
|
|
2116
|
+
trace: import_v421.z.array(import_v421.z.unknown()).optional()
|
|
2117
|
+
});
|
|
2118
|
+
var makeResolvePrimaryNamesResponseSchema = () => import_v421.z.object({
|
|
2119
|
+
names: import_v421.z.record(import_v421.z.number(), import_v421.z.string().nullable()),
|
|
2120
|
+
accelerationRequested: import_v421.z.boolean(),
|
|
2121
|
+
accelerationAttempted: import_v421.z.boolean(),
|
|
2122
|
+
trace: import_v421.z.array(import_v421.z.unknown()).optional()
|
|
2123
|
+
});
|
|
2124
|
+
|
|
2125
|
+
// src/ensnode/api/shared/errors/examples.ts
|
|
2126
|
+
var errorResponseBadRequestExample = {
|
|
2127
|
+
message: "Invalid Input"
|
|
2128
|
+
};
|
|
2129
|
+
var errorResponseInvalidNameExample = {
|
|
2130
|
+
message: "Invalid Input",
|
|
2131
|
+
details: {
|
|
2132
|
+
errors: [],
|
|
2133
|
+
properties: {
|
|
2134
|
+
name: { errors: ["Must be normalized, see https://docs.ens.domains/resolution/names/"] }
|
|
2135
|
+
}
|
|
2136
|
+
}
|
|
2137
|
+
};
|
|
2138
|
+
var errorResponseInvalidAddressExample = {
|
|
2139
|
+
message: "Invalid Input",
|
|
2140
|
+
details: {
|
|
2141
|
+
errors: [],
|
|
2142
|
+
properties: { address: { errors: ["EVM address must be a valid EVM address"] } }
|
|
2143
|
+
}
|
|
2144
|
+
};
|
|
2145
|
+
var errorResponseInternalServerErrorExample = {
|
|
2146
|
+
message: "Internal Server Error"
|
|
2147
|
+
};
|
|
2148
|
+
|
|
2149
|
+
// src/omnigraph-api/example-queries.ts
|
|
2150
|
+
var import_enssdk8 = require("enssdk");
|
|
2151
|
+
var import_datasources5 = require("@ensnode/datasources");
|
|
2152
|
+
var import_devnet = require("@ensnode/datasources/devnet");
|
|
2153
|
+
var SEPOLIA_V2_V2_ETH_REGISTRY = maybeGetDatasourceContract(
|
|
2154
|
+
import_datasources5.ENSNamespaceIds.SepoliaV2,
|
|
2155
|
+
import_datasources5.DatasourceNames.ENSv2Root,
|
|
2156
|
+
"ETHRegistry"
|
|
2157
|
+
);
|
|
2158
|
+
var SEPOLIA_V2_V2_ETH_REGISTRAR = maybeGetDatasourceContract(
|
|
2159
|
+
import_datasources5.ENSNamespaceIds.SepoliaV2,
|
|
2160
|
+
import_datasources5.DatasourceNames.ENSv2Root,
|
|
2161
|
+
"ETHRegistrar"
|
|
2162
|
+
);
|
|
2163
|
+
var ENS_TEST_ENV_V2_ETH_REGISTRY = maybeGetDatasourceContract(
|
|
2164
|
+
import_datasources5.ENSNamespaceIds.EnsTestEnv,
|
|
2165
|
+
import_datasources5.DatasourceNames.ENSv2Root,
|
|
2166
|
+
"ETHRegistry"
|
|
2167
|
+
);
|
|
2168
|
+
var ENS_TEST_ENV_V2_ETH_REGISTRAR = maybeGetDatasourceContract(
|
|
2169
|
+
import_datasources5.ENSNamespaceIds.EnsTestEnv,
|
|
2170
|
+
import_datasources5.DatasourceNames.ENSv2Root,
|
|
2171
|
+
"ETHRegistrar"
|
|
2172
|
+
);
|
|
2173
|
+
var VITALIK_ADDRESS = (0, import_enssdk8.toNormalizedAddress)("0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045");
|
|
2174
|
+
var _SEPOLIA_V2_USER_ADDRESS = (0, import_enssdk8.toNormalizedAddress)("0x2f8e8b1126e75fde0b7f731e7cb5847eba2d2574");
|
|
2175
|
+
var SEPOLIA_V2_ADDRESS_WITH_LOT_OF_NAMES = (0, import_enssdk8.toNormalizedAddress)(
|
|
2176
|
+
"0x205d2686da3bf33f64c17f21462c51b5ead462cf"
|
|
2177
|
+
);
|
|
2178
|
+
var DEVNET_NAME_WITH_OWNED_RESOLVER = (0, import_enssdk8.asInterpretedName)("example.eth");
|
|
2179
|
+
var SEPOLIA_V2_NAME_WITH_OWNED_RESOLVER = (0, import_enssdk8.asInterpretedName)("sfmonicdebmig.eth");
|
|
2180
|
+
var SEPOLIA_V2_TEST_NAME = (0, import_enssdk8.asInterpretedName)("test-name.eth");
|
|
2181
|
+
function getGraphqlApiExampleQueryById(id) {
|
|
2182
|
+
const found = graphqlApiExampleQueryById.get(id);
|
|
2183
|
+
if (!found) {
|
|
2184
|
+
throw new Error(`Unknown GraphQL API example query id: ${id}`);
|
|
2185
|
+
}
|
|
2186
|
+
return found;
|
|
2187
|
+
}
|
|
2188
|
+
var GRAPHQL_API_EXAMPLE_QUERIES = [
|
|
2189
|
+
////////////////
|
|
2190
|
+
// Hello World
|
|
2191
|
+
////////////////
|
|
2192
|
+
{
|
|
2193
|
+
id: "hello-world",
|
|
2194
|
+
query: `#
|
|
2195
|
+
# Welcome to this interactive playground for
|
|
2196
|
+
# ENSNode's GraphQL API!
|
|
2197
|
+
#
|
|
2198
|
+
# You can get started by typing your query here or by using
|
|
2199
|
+
# the Explorer on the left to select the data you want to query.
|
|
2200
|
+
#
|
|
2201
|
+
# There are also example queries in the tabs above \u261D\uFE0F
|
|
2202
|
+
query HelloWorld {
|
|
2203
|
+
domain(by: { name: "eth" }) { canonical { name { interpreted } } owner { address } }
|
|
2204
|
+
}`,
|
|
2205
|
+
variables: { default: {} }
|
|
2206
|
+
},
|
|
2207
|
+
/////////////////
|
|
2208
|
+
// Find Domains
|
|
2209
|
+
/////////////////
|
|
2210
|
+
{
|
|
2211
|
+
id: "find-domains",
|
|
2212
|
+
query: `
|
|
2213
|
+
query FindDomains(
|
|
2214
|
+
$name: DomainsNameFilter!
|
|
2215
|
+
$order: DomainsOrderInput
|
|
2216
|
+
) {
|
|
2217
|
+
domains(
|
|
2218
|
+
where: { name: $name }
|
|
2219
|
+
order: $order
|
|
2220
|
+
first: 20
|
|
2221
|
+
) {
|
|
2222
|
+
edges {
|
|
2223
|
+
node {
|
|
2224
|
+
__typename
|
|
2225
|
+
id
|
|
2226
|
+
label { interpreted hash }
|
|
2227
|
+
canonical { name { interpreted } }
|
|
2228
|
+
|
|
2229
|
+
registration { expiry event { timestamp } }
|
|
2230
|
+
}
|
|
2231
|
+
}
|
|
2232
|
+
}
|
|
2233
|
+
}`,
|
|
2234
|
+
variables: {
|
|
2235
|
+
default: { name: { starts_with: "vitalik" }, order: { by: "NAME", dir: "DESC" } },
|
|
2236
|
+
[import_datasources5.ENSNamespaceIds.EnsTestEnv]: {
|
|
2237
|
+
name: { starts_with: "c" },
|
|
2238
|
+
order: { by: "NAME", dir: "DESC" }
|
|
2239
|
+
},
|
|
2240
|
+
[import_datasources5.ENSNamespaceIds.SepoliaV2]: {
|
|
2241
|
+
name: { starts_with: "test-na" },
|
|
2242
|
+
order: { by: "NAME", dir: "DESC" }
|
|
2243
|
+
}
|
|
2244
|
+
}
|
|
2245
|
+
},
|
|
2246
|
+
///////////////////
|
|
2247
|
+
// Domain By Name
|
|
2248
|
+
///////////////////
|
|
2249
|
+
{
|
|
2250
|
+
id: "domain-by-name",
|
|
2251
|
+
query: `
|
|
2252
|
+
query DomainByName($name: InterpretedName!) {
|
|
2253
|
+
domain(by: {name: $name}) {
|
|
2254
|
+
__typename
|
|
2255
|
+
id
|
|
2256
|
+
label { interpreted hash }
|
|
2257
|
+
canonical { name { interpreted } node path { id } }
|
|
2258
|
+
owner { address }
|
|
2259
|
+
subregistry { contract { chainId address } }
|
|
2260
|
+
|
|
2261
|
+
... on ENSv1Domain {
|
|
2262
|
+
rootRegistryOwner { address }
|
|
2263
|
+
}
|
|
2264
|
+
}
|
|
2265
|
+
}`,
|
|
2266
|
+
variables: {
|
|
2267
|
+
default: { name: "eth" },
|
|
2268
|
+
[import_datasources5.ENSNamespaceIds.SepoliaV2]: { name: SEPOLIA_V2_TEST_NAME }
|
|
2269
|
+
}
|
|
2270
|
+
},
|
|
2271
|
+
//////////////////////
|
|
2272
|
+
// Domain Subdomains
|
|
2273
|
+
//////////////////////
|
|
2274
|
+
{
|
|
2275
|
+
id: "domain-subdomains",
|
|
2276
|
+
query: `
|
|
2277
|
+
query DomainSubdomains($name: InterpretedName!) {
|
|
2278
|
+
domain(by: {name: $name}) {
|
|
2279
|
+
canonical { name { interpreted } }
|
|
2280
|
+
subdomains(first: 10) {
|
|
2281
|
+
edges {
|
|
2282
|
+
node {
|
|
2283
|
+
canonical { name { interpreted } }
|
|
2284
|
+
}
|
|
2285
|
+
}
|
|
2286
|
+
}
|
|
2287
|
+
}
|
|
2288
|
+
}`,
|
|
2289
|
+
variables: { default: { name: "eth" } }
|
|
2290
|
+
},
|
|
2291
|
+
/////////////////
|
|
2292
|
+
// Domain Events
|
|
2293
|
+
/////////////////
|
|
2294
|
+
{
|
|
2295
|
+
id: "domain-events",
|
|
2296
|
+
query: `
|
|
2297
|
+
query DomainEvents($name: InterpretedName!) {
|
|
2298
|
+
domain(by: {name: $name}) {
|
|
2299
|
+
events {
|
|
2300
|
+
totalCount
|
|
2301
|
+
edges {
|
|
2302
|
+
node {
|
|
2303
|
+
from
|
|
2304
|
+
to
|
|
2305
|
+
topics
|
|
2306
|
+
data
|
|
2307
|
+
timestamp
|
|
2308
|
+
transactionHash
|
|
2309
|
+
}
|
|
2310
|
+
}
|
|
2311
|
+
}
|
|
2312
|
+
}
|
|
2313
|
+
}`,
|
|
2314
|
+
variables: {
|
|
2315
|
+
default: { name: "newowner.eth" },
|
|
2316
|
+
[import_datasources5.ENSNamespaceIds.SepoliaV2]: { name: "sfmonicdebmig.eth" }
|
|
2317
|
+
}
|
|
2318
|
+
},
|
|
2319
|
+
////////////////////
|
|
2320
|
+
// Account Domains
|
|
2321
|
+
////////////////////
|
|
2322
|
+
{
|
|
2323
|
+
id: "domains-by-address",
|
|
2324
|
+
query: `
|
|
2325
|
+
query AccountDomains(
|
|
2326
|
+
$address: Address!
|
|
2327
|
+
) {
|
|
2328
|
+
account(by: { address: $address }) {
|
|
2329
|
+
domains {
|
|
2330
|
+
edges {
|
|
2331
|
+
node {
|
|
2332
|
+
label { interpreted }
|
|
2333
|
+
canonical { name { interpreted } }
|
|
2334
|
+
}
|
|
2335
|
+
}
|
|
2336
|
+
}
|
|
2337
|
+
}
|
|
2338
|
+
}`,
|
|
2339
|
+
variables: {
|
|
2340
|
+
default: { address: VITALIK_ADDRESS },
|
|
2341
|
+
[import_datasources5.ENSNamespaceIds.EnsTestEnv]: { address: import_devnet.accounts.owner.address },
|
|
2342
|
+
[import_datasources5.ENSNamespaceIds.SepoliaV2]: { address: SEPOLIA_V2_ADDRESS_WITH_LOT_OF_NAMES }
|
|
2343
|
+
}
|
|
2344
|
+
},
|
|
2345
|
+
////////////////////
|
|
2346
|
+
// Account Events
|
|
2347
|
+
////////////////////
|
|
2348
|
+
{
|
|
2349
|
+
id: "account-events",
|
|
2350
|
+
query: `
|
|
2351
|
+
query AccountEvents(
|
|
2352
|
+
$address: Address!
|
|
2353
|
+
) {
|
|
2354
|
+
account(by: { address: $address }) {
|
|
2355
|
+
events { totalCount edges { node { topics data timestamp } } }
|
|
2356
|
+
}
|
|
2357
|
+
}`,
|
|
2358
|
+
variables: {
|
|
2359
|
+
default: { address: VITALIK_ADDRESS },
|
|
2360
|
+
[import_datasources5.ENSNamespaceIds.EnsTestEnv]: { address: import_devnet.accounts.deployer.address },
|
|
2361
|
+
[import_datasources5.ENSNamespaceIds.SepoliaV2]: { address: SEPOLIA_V2_ADDRESS_WITH_LOT_OF_NAMES }
|
|
2362
|
+
}
|
|
2363
|
+
},
|
|
2364
|
+
/////////////////////
|
|
2365
|
+
// Registry Domains
|
|
2366
|
+
/////////////////////
|
|
2367
|
+
{
|
|
2368
|
+
id: "registry-domains",
|
|
2369
|
+
query: `
|
|
2370
|
+
query RegistryDomains(
|
|
2371
|
+
$registry: AccountIdInput!
|
|
2372
|
+
) {
|
|
2373
|
+
registry(by: { contract: $registry }) {
|
|
2374
|
+
domains {
|
|
2375
|
+
edges {
|
|
2376
|
+
node {
|
|
2377
|
+
label { interpreted }
|
|
2378
|
+
canonical { name { interpreted } }
|
|
2379
|
+
}
|
|
2380
|
+
}
|
|
2381
|
+
}
|
|
2382
|
+
}
|
|
2383
|
+
}`,
|
|
2384
|
+
variables: {
|
|
2385
|
+
// TODO: this only accesses v2 registries, so we default to ens-test-env for now
|
|
2386
|
+
default: { registry: ENS_TEST_ENV_V2_ETH_REGISTRY },
|
|
2387
|
+
[import_datasources5.ENSNamespaceIds.SepoliaV2]: { registry: SEPOLIA_V2_V2_ETH_REGISTRY }
|
|
2388
|
+
}
|
|
2389
|
+
},
|
|
2390
|
+
////////////////////////////
|
|
2391
|
+
// Permissions By Contract
|
|
2392
|
+
////////////////////////////
|
|
2393
|
+
{
|
|
2394
|
+
id: "permissions-by-contract",
|
|
2395
|
+
query: `
|
|
2396
|
+
query PermissionsByContract(
|
|
2397
|
+
$contract: AccountIdInput!
|
|
2398
|
+
) {
|
|
2399
|
+
permissions(by: { contract: $contract }) {
|
|
2400
|
+
resources {
|
|
2401
|
+
edges {
|
|
2402
|
+
node {
|
|
2403
|
+
resource
|
|
2404
|
+
users {
|
|
2405
|
+
edges {
|
|
2406
|
+
node {
|
|
2407
|
+
id
|
|
2408
|
+
user { address }
|
|
2409
|
+
roles
|
|
2410
|
+
}
|
|
2411
|
+
}
|
|
2412
|
+
}
|
|
2413
|
+
}
|
|
2414
|
+
}
|
|
2415
|
+
}
|
|
2416
|
+
events { totalCount edges { node { topics data timestamp } } }
|
|
2417
|
+
}
|
|
2418
|
+
}`,
|
|
2419
|
+
variables: {
|
|
2420
|
+
// TODO: same as above
|
|
2421
|
+
default: { contract: ENS_TEST_ENV_V2_ETH_REGISTRAR },
|
|
2422
|
+
// TODO: example response is empty for this address on Sepolia V2
|
|
2423
|
+
[import_datasources5.ENSNamespaceIds.SepoliaV2]: { contract: SEPOLIA_V2_V2_ETH_REGISTRAR }
|
|
2424
|
+
}
|
|
2425
|
+
},
|
|
2426
|
+
////////////////////////
|
|
2427
|
+
// Permissions By User
|
|
2428
|
+
////////////////////////
|
|
2429
|
+
{
|
|
2430
|
+
id: "permissions-by-user",
|
|
2431
|
+
query: `
|
|
2432
|
+
query PermissionsByUser($address: Address!) {
|
|
2433
|
+
account(by: { address: $address }) {
|
|
2434
|
+
permissions {
|
|
2435
|
+
edges {
|
|
2436
|
+
node {
|
|
2437
|
+
resource
|
|
2438
|
+
roles
|
|
2439
|
+
}
|
|
2440
|
+
}
|
|
2441
|
+
}
|
|
2442
|
+
}
|
|
2443
|
+
}`,
|
|
2444
|
+
variables: {
|
|
2445
|
+
default: { address: import_devnet.accounts.deployer.address },
|
|
2446
|
+
// TODO: example response is empty for this address on Sepolia V2
|
|
2447
|
+
[import_datasources5.ENSNamespaceIds.SepoliaV2]: { address: SEPOLIA_V2_ADDRESS_WITH_LOT_OF_NAMES }
|
|
2448
|
+
}
|
|
2449
|
+
},
|
|
2450
|
+
//////////////////////////////////
|
|
2451
|
+
// Account Resolver Permissions
|
|
2452
|
+
//////////////////////////////////
|
|
2453
|
+
{
|
|
2454
|
+
id: "account-resolver-permissions",
|
|
2455
|
+
query: `
|
|
2456
|
+
query AccountResolverPermissions($address: Address!) {
|
|
2457
|
+
account(by: { address: $address }) {
|
|
2458
|
+
resolverPermissions {
|
|
2459
|
+
edges {
|
|
2460
|
+
node {
|
|
2461
|
+
resolver {
|
|
2462
|
+
contract {
|
|
2463
|
+
address
|
|
2464
|
+
}
|
|
2465
|
+
}
|
|
2466
|
+
}
|
|
2467
|
+
}
|
|
2468
|
+
}
|
|
2469
|
+
}
|
|
2470
|
+
}`,
|
|
2471
|
+
variables: {
|
|
2472
|
+
default: { address: import_devnet.accounts.deployer.address },
|
|
2473
|
+
[import_datasources5.ENSNamespaceIds.SepoliaV2]: { address: SEPOLIA_V2_ADDRESS_WITH_LOT_OF_NAMES }
|
|
2474
|
+
}
|
|
2475
|
+
},
|
|
2476
|
+
//////////////////////////////
|
|
2477
|
+
// Domain's Assigned Resolver
|
|
2478
|
+
//////////////////////////////
|
|
2479
|
+
{
|
|
2480
|
+
id: "domain-resolver",
|
|
2481
|
+
query: `
|
|
2482
|
+
query DomainResolver($name: InterpretedName!) {
|
|
2483
|
+
domain(by: { name: $name }) {
|
|
2484
|
+
resolver {
|
|
2485
|
+
assigned {
|
|
2486
|
+
records { edges { node { node keys coinTypes } } }
|
|
2487
|
+
permissions { resources { edges { node { resource users { edges { node { user { address } roles } } } } } } }
|
|
2488
|
+
events { totalCount edges { node { topics data timestamp } } }
|
|
2489
|
+
}
|
|
2490
|
+
}
|
|
2491
|
+
}
|
|
2492
|
+
}`,
|
|
2493
|
+
variables: {
|
|
2494
|
+
default: { name: "vitalik.eth" },
|
|
2495
|
+
[import_datasources5.ENSNamespaceIds.EnsTestEnv]: { name: DEVNET_NAME_WITH_OWNED_RESOLVER },
|
|
2496
|
+
[import_datasources5.ENSNamespaceIds.SepoliaV2]: { name: SEPOLIA_V2_NAME_WITH_OWNED_RESOLVER }
|
|
2497
|
+
}
|
|
2498
|
+
},
|
|
2499
|
+
//////////////
|
|
2500
|
+
// Namegraph
|
|
2501
|
+
//////////////
|
|
2502
|
+
{
|
|
2503
|
+
id: "namegraph",
|
|
2504
|
+
query: `
|
|
2505
|
+
query Namegraph {
|
|
2506
|
+
root {
|
|
2507
|
+
id
|
|
2508
|
+
domains {
|
|
2509
|
+
edges {
|
|
2510
|
+
node {
|
|
2511
|
+
canonical { name { interpreted } }
|
|
2512
|
+
|
|
2513
|
+
subdomains {
|
|
2514
|
+
edges {
|
|
2515
|
+
node {
|
|
2516
|
+
canonical { name { interpreted } }
|
|
2517
|
+
|
|
2518
|
+
subdomains {
|
|
2519
|
+
edges {
|
|
2520
|
+
node {
|
|
2521
|
+
canonical { name { interpreted } }
|
|
2522
|
+
}
|
|
2523
|
+
}
|
|
2524
|
+
}
|
|
2525
|
+
}
|
|
2526
|
+
}
|
|
2527
|
+
}
|
|
2528
|
+
}
|
|
2529
|
+
}
|
|
2530
|
+
}
|
|
2531
|
+
}
|
|
2532
|
+
}`,
|
|
2533
|
+
variables: { default: {} }
|
|
2534
|
+
}
|
|
2535
|
+
];
|
|
2536
|
+
var graphqlApiExampleQueryById = new Map(
|
|
2537
|
+
GRAPHQL_API_EXAMPLE_QUERIES.map((entry) => [entry.id, entry])
|
|
2538
|
+
);
|
|
2539
|
+
|
|
2540
|
+
// src/rpc/eip-165.ts
|
|
2541
|
+
var EIP_165_ABI = [
|
|
2542
|
+
{
|
|
2543
|
+
inputs: [
|
|
2544
|
+
{
|
|
2545
|
+
internalType: "bytes4",
|
|
2546
|
+
name: "interfaceID",
|
|
2547
|
+
type: "bytes4"
|
|
2548
|
+
}
|
|
2549
|
+
],
|
|
2550
|
+
name: "supportsInterface",
|
|
2551
|
+
outputs: [
|
|
2552
|
+
{
|
|
2553
|
+
internalType: "bool",
|
|
2554
|
+
name: "",
|
|
2555
|
+
type: "bool"
|
|
2556
|
+
}
|
|
2557
|
+
],
|
|
2558
|
+
stateMutability: "view",
|
|
2559
|
+
type: "function"
|
|
2560
|
+
}
|
|
2561
|
+
];
|
|
2562
|
+
async function supportsInterface({
|
|
2563
|
+
publicClient,
|
|
2564
|
+
interfaceId: selector,
|
|
2565
|
+
address
|
|
2566
|
+
}) {
|
|
2567
|
+
try {
|
|
2568
|
+
return await publicClient.readContract({
|
|
2569
|
+
abi: EIP_165_ABI,
|
|
2570
|
+
functionName: "supportsInterface",
|
|
2571
|
+
address,
|
|
2572
|
+
args: [selector]
|
|
2573
|
+
});
|
|
2574
|
+
} catch {
|
|
2575
|
+
return false;
|
|
2576
|
+
}
|
|
2577
|
+
}
|
|
2578
|
+
var makeSupportsInterfaceReader = (interfaceId) => (args) => supportsInterface({
|
|
2579
|
+
...args,
|
|
2580
|
+
interfaceId
|
|
2581
|
+
});
|
|
2582
|
+
|
|
2583
|
+
// src/rpc/is-extended-resolver.ts
|
|
2584
|
+
var IExtendedResolverInterfaceId = "0x9061b923";
|
|
2585
|
+
var isExtendedResolver = makeSupportsInterfaceReader(IExtendedResolverInterfaceId);
|
|
2586
|
+
|
|
2587
|
+
// src/shared/config/build-rpc-urls.ts
|
|
2588
|
+
var import_chains = require("viem/chains");
|
|
2589
|
+
function buildAlchemyBaseUrl(chainId, key) {
|
|
2590
|
+
switch (chainId) {
|
|
2591
|
+
case import_chains.mainnet.id:
|
|
2592
|
+
return `eth-mainnet.g.alchemy.com/v2/${key}`;
|
|
2593
|
+
case import_chains.sepolia.id:
|
|
2594
|
+
return `eth-sepolia.g.alchemy.com/v2/${key}`;
|
|
2595
|
+
case import_chains.arbitrum.id:
|
|
2596
|
+
return `arb-mainnet.g.alchemy.com/v2/${key}`;
|
|
2597
|
+
case import_chains.arbitrumSepolia.id:
|
|
2598
|
+
return `arb-sepolia.g.alchemy.com/v2/${key}`;
|
|
2599
|
+
case import_chains.base.id:
|
|
2600
|
+
return `base-mainnet.g.alchemy.com/v2/${key}`;
|
|
2601
|
+
case import_chains.baseSepolia.id:
|
|
2602
|
+
return `base-sepolia.g.alchemy.com/v2/${key}`;
|
|
2603
|
+
case import_chains.optimism.id:
|
|
2604
|
+
return `opt-mainnet.g.alchemy.com/v2/${key}`;
|
|
2605
|
+
case import_chains.optimismSepolia.id:
|
|
2606
|
+
return `opt-sepolia.g.alchemy.com/v2/${key}`;
|
|
2607
|
+
case import_chains.linea.id:
|
|
2608
|
+
return `linea-mainnet.g.alchemy.com/v2/${key}`;
|
|
2609
|
+
case import_chains.lineaSepolia.id:
|
|
2610
|
+
return `linea-sepolia.g.alchemy.com/v2/${key}`;
|
|
2611
|
+
case import_chains.scroll.id:
|
|
2612
|
+
return `scroll-mainnet.g.alchemy.com/v2/${key}`;
|
|
2613
|
+
case import_chains.scrollSepolia.id:
|
|
2614
|
+
return `scroll-sepolia.g.alchemy.com/v2/${key}`;
|
|
2615
|
+
default:
|
|
2616
|
+
return void 0;
|
|
2617
|
+
}
|
|
2618
|
+
}
|
|
2619
|
+
function buildDRPCUrl(chainId, key) {
|
|
2620
|
+
switch (chainId) {
|
|
2621
|
+
case import_chains.mainnet.id:
|
|
2622
|
+
return `https://lb.drpc.live/ethereum/${key}`;
|
|
2623
|
+
case import_chains.sepolia.id:
|
|
2624
|
+
return `https://lb.drpc.live/ethereum-sepolia/${key}`;
|
|
2625
|
+
case import_chains.arbitrum.id:
|
|
2626
|
+
return `https://lb.drpc.live/arbitrum/${key}`;
|
|
2627
|
+
case import_chains.arbitrumSepolia.id:
|
|
2628
|
+
return `https://lb.drpc.live/arbitrum-sepolia/${key}`;
|
|
2629
|
+
case import_chains.base.id:
|
|
2630
|
+
return `https://lb.drpc.live/base/${key}`;
|
|
2631
|
+
case import_chains.baseSepolia.id:
|
|
2632
|
+
return `https://lb.drpc.live/base-sepolia/${key}`;
|
|
2633
|
+
case import_chains.optimism.id:
|
|
2634
|
+
return `https://lb.drpc.live/optimism/${key}`;
|
|
2635
|
+
case import_chains.optimismSepolia.id:
|
|
2636
|
+
return `https://lb.drpc.live/optimism-sepolia/${key}`;
|
|
2637
|
+
case import_chains.linea.id:
|
|
2638
|
+
return `https://lb.drpc.live/linea/${key}`;
|
|
2639
|
+
case import_chains.lineaSepolia.id:
|
|
2640
|
+
return `https://lb.drpc.live/linea-sepolia/${key}`;
|
|
2641
|
+
case import_chains.scroll.id:
|
|
2642
|
+
return `https://lb.drpc.live/scroll/${key}`;
|
|
2643
|
+
case import_chains.scrollSepolia.id:
|
|
2644
|
+
return `https://lb.drpc.live/scroll-sepolia/${key}`;
|
|
2645
|
+
default:
|
|
2646
|
+
return void 0;
|
|
2647
|
+
}
|
|
2648
|
+
}
|
|
2649
|
+
function buildQuickNodeURL(chainId, apiKey, endpointName) {
|
|
2650
|
+
switch (chainId) {
|
|
2651
|
+
case import_chains.mainnet.id:
|
|
2652
|
+
return `${endpointName}.quiknode.pro/${apiKey}`;
|
|
2653
|
+
case import_chains.sepolia.id:
|
|
2654
|
+
return `${endpointName}.ethereum-sepolia.quiknode.pro/${apiKey}`;
|
|
2655
|
+
case import_chains.arbitrum.id:
|
|
2656
|
+
return `${endpointName}.arbitrum-mainnet.quiknode.pro/${apiKey}`;
|
|
2657
|
+
case import_chains.arbitrumSepolia.id:
|
|
2658
|
+
return `${endpointName}.arbitrum-sepolia.quiknode.pro/${apiKey}`;
|
|
2659
|
+
case import_chains.base.id:
|
|
2660
|
+
return `${endpointName}.base-mainnet.quiknode.pro/${apiKey}`;
|
|
2661
|
+
case import_chains.baseSepolia.id:
|
|
2662
|
+
return `${endpointName}.base-sepolia.quiknode.pro/${apiKey}`;
|
|
2663
|
+
case import_chains.optimism.id:
|
|
2664
|
+
return `${endpointName}.optimism.quiknode.pro/${apiKey}`;
|
|
2665
|
+
case import_chains.optimismSepolia.id:
|
|
2666
|
+
return `${endpointName}.optimism-sepolia.quiknode.pro/${apiKey}`;
|
|
2667
|
+
case import_chains.linea.id:
|
|
2668
|
+
return `${endpointName}.linea-mainnet.quiknode.pro/${apiKey}`;
|
|
2669
|
+
case import_chains.lineaSepolia.id:
|
|
2670
|
+
return void 0;
|
|
2671
|
+
case import_chains.scroll.id:
|
|
2672
|
+
return `${endpointName}.scroll-mainnet.quiknode.pro/${apiKey}`;
|
|
2673
|
+
case import_chains.scrollSepolia.id:
|
|
2674
|
+
return `${endpointName}.scroll-testnet.quiknode.pro/${apiKey}`;
|
|
2675
|
+
default:
|
|
2676
|
+
return void 0;
|
|
2677
|
+
}
|
|
2678
|
+
}
|
|
2679
|
+
function alchemySupportsChain(chainId) {
|
|
2680
|
+
return buildAlchemyBaseUrl(chainId, "") !== void 0;
|
|
2681
|
+
}
|
|
2682
|
+
function dRPCSupportsChain(chainId) {
|
|
2683
|
+
return buildDRPCUrl(chainId, "") !== void 0;
|
|
2684
|
+
}
|
|
2685
|
+
function quickNodeSupportsChain(chainId) {
|
|
2686
|
+
return buildQuickNodeURL(chainId, "", "") !== void 0;
|
|
2687
|
+
}
|
|
2688
|
+
|
|
2689
|
+
// src/shared/config/pretty-printing.ts
|
|
2690
|
+
function configJSONReplacer(key, value) {
|
|
2691
|
+
if (value instanceof URL) return value.href;
|
|
2692
|
+
if (key === "abi") return "(truncated ABI output)";
|
|
2693
|
+
if (value instanceof Map) return Object.fromEntries(value);
|
|
2694
|
+
if (value instanceof Set) return Array.from(value);
|
|
2695
|
+
return value;
|
|
2696
|
+
}
|
|
2697
|
+
var stringifyConfig = (json, options = { pretty: false }) => JSON.stringify(json, configJSONReplacer, options.pretty ? 2 : void 0);
|
|
2698
|
+
|
|
2699
|
+
// src/shared/config/redacting.ts
|
|
2700
|
+
var REDACTED = "*****";
|
|
2701
|
+
function redactUrl(url) {
|
|
2702
|
+
return new URL(`/${REDACTED}`, url.origin);
|
|
2703
|
+
}
|
|
2704
|
+
function redactString(_) {
|
|
2705
|
+
return REDACTED;
|
|
2706
|
+
}
|
|
2707
|
+
function redactRpcConfigs(rpcConfigs) {
|
|
2708
|
+
const redactedRpcConfigs = /* @__PURE__ */ new Map();
|
|
2709
|
+
for (const [chainId, rpcConfig] of rpcConfigs.entries()) {
|
|
2710
|
+
const redactedHttpRPCs = rpcConfig.httpRPCs.map(redactUrl);
|
|
2711
|
+
const redactedWebsocketRPC = rpcConfig.websocketRPC ? redactUrl(rpcConfig.websocketRPC) : void 0;
|
|
2712
|
+
redactedRpcConfigs.set(chainId, {
|
|
2713
|
+
httpRPCs: redactedHttpRPCs,
|
|
2714
|
+
websocketRPC: redactedWebsocketRPC
|
|
2715
|
+
});
|
|
2716
|
+
}
|
|
2717
|
+
return redactedRpcConfigs;
|
|
2718
|
+
}
|
|
2719
|
+
|
|
2720
|
+
// src/shared/config/rpc-configs-from-env.ts
|
|
2721
|
+
var import_datasources6 = require("@ensnode/datasources");
|
|
2722
|
+
var RpcAutoGenModes = {
|
|
2723
|
+
/**
|
|
2724
|
+
* Auto-generates only HTTP RPCs for supported chains.
|
|
2725
|
+
*/
|
|
2726
|
+
HttpOnly: "http-only",
|
|
2727
|
+
/**
|
|
2728
|
+
* Auto-generates both HTTP and WebSocket RPCs for supported chains.
|
|
2729
|
+
*/
|
|
2730
|
+
HttpAndWs: "http-and-ws"
|
|
2731
|
+
};
|
|
2732
|
+
var DEFAULT_RPC_AUTO_GEN_MODE = RpcAutoGenModes.HttpOnly;
|
|
2733
|
+
function buildRpcAutoGenMode(env) {
|
|
2734
|
+
const mode = env.RPC_AUTO_GEN_MODE;
|
|
2735
|
+
if (!mode) {
|
|
2736
|
+
return DEFAULT_RPC_AUTO_GEN_MODE;
|
|
2737
|
+
}
|
|
2738
|
+
if (!Object.values(RpcAutoGenModes).includes(mode)) {
|
|
2739
|
+
throw new Error(
|
|
2740
|
+
`Invalid RPC_AUTO_GEN_MODE env var: ${mode}. Valid values are: ${Object.values(RpcAutoGenModes).join(", ")}`
|
|
2741
|
+
);
|
|
2742
|
+
}
|
|
2743
|
+
return mode;
|
|
2744
|
+
}
|
|
2745
|
+
function buildRpcConfigsFromEnv(env, namespace) {
|
|
2746
|
+
const alchemyApiKey = env.ALCHEMY_API_KEY;
|
|
2747
|
+
const quickNodeApiKey = env.QUICKNODE_API_KEY;
|
|
2748
|
+
const quickNodeEndpointName = env.QUICKNODE_ENDPOINT_NAME;
|
|
2749
|
+
const dRPCKey = env.DRPC_API_KEY;
|
|
2750
|
+
if (quickNodeApiKey && !quickNodeEndpointName) {
|
|
2751
|
+
throw new Error(
|
|
2752
|
+
"Use of the QUICKNODE_API_KEY environment variable requires use of the QUICKNODE_ENDPOINT_NAME environment variable as well."
|
|
2753
|
+
);
|
|
2754
|
+
}
|
|
2755
|
+
if (quickNodeEndpointName && !quickNodeApiKey) {
|
|
2756
|
+
throw new Error(
|
|
2757
|
+
"Use of the QUICKNODE_ENDPOINT_NAME environment variable requires use of the QUICKNODE_API_KEY environment variable as well."
|
|
2758
|
+
);
|
|
2759
|
+
}
|
|
2760
|
+
const chainsInNamespace = Object.entries((0, import_datasources6.getENSNamespace)(namespace)).map(
|
|
2761
|
+
([, datasource]) => datasource.chain
|
|
2762
|
+
);
|
|
2763
|
+
const rpcAutoGenMode = buildRpcAutoGenMode(env);
|
|
2764
|
+
const rpcConfigs = {};
|
|
2765
|
+
for (const chain of chainsInNamespace) {
|
|
2766
|
+
const specificValue = env[`RPC_URL_${chain.id}`];
|
|
2767
|
+
if (specificValue) {
|
|
2768
|
+
rpcConfigs[serializeChainId(chain.id)] = specificValue;
|
|
2769
|
+
continue;
|
|
2770
|
+
}
|
|
2771
|
+
if (chain.id === import_datasources6.ensTestEnvChain.id) {
|
|
2772
|
+
rpcConfigs[serializeChainId(import_datasources6.ensTestEnvChain.id)] = import_datasources6.ensTestEnvChain.rpcUrls.default.http[0];
|
|
2773
|
+
continue;
|
|
2774
|
+
}
|
|
2775
|
+
const httpUrls = [
|
|
2776
|
+
// alchemy, if specified and available
|
|
2777
|
+
alchemyApiKey && alchemySupportsChain(chain.id) && `https://${buildAlchemyBaseUrl(chain.id, alchemyApiKey)}`,
|
|
2778
|
+
// QuickNode, if specified and available
|
|
2779
|
+
quickNodeApiKey && quickNodeEndpointName && quickNodeSupportsChain(chain.id) && `https://${buildQuickNodeURL(chain.id, quickNodeApiKey, quickNodeEndpointName)}`,
|
|
2780
|
+
// dRPC, if specified and available
|
|
2781
|
+
dRPCKey && dRPCSupportsChain(chain.id) && buildDRPCUrl(chain.id, dRPCKey)
|
|
2782
|
+
];
|
|
2783
|
+
const wsUrl = rpcAutoGenMode === RpcAutoGenModes.HttpAndWs && alchemyApiKey && alchemySupportsChain(chain.id) && //
|
|
2784
|
+
`wss://${buildAlchemyBaseUrl(chain.id, alchemyApiKey)}`;
|
|
2785
|
+
const urls = [...httpUrls, wsUrl].filter(Boolean);
|
|
2786
|
+
if (urls.length > 0) {
|
|
2787
|
+
rpcConfigs[serializeChainId(chain.id)] = urls.join(
|
|
2788
|
+
","
|
|
2789
|
+
);
|
|
2790
|
+
}
|
|
2791
|
+
}
|
|
2792
|
+
return rpcConfigs;
|
|
2793
|
+
}
|
|
2794
|
+
|
|
2795
|
+
// src/shared/config/validatons.ts
|
|
2796
|
+
var import_datasources7 = require("@ensnode/datasources");
|
|
2797
|
+
|
|
2798
|
+
// src/shared/url.ts
|
|
2799
|
+
function isHttpProtocol(url) {
|
|
2800
|
+
return ["http:", "https:"].includes(url.protocol);
|
|
2801
|
+
}
|
|
2802
|
+
function isWebSocketProtocol(url) {
|
|
2803
|
+
return ["ws:", "wss:"].includes(url.protocol);
|
|
2804
|
+
}
|
|
2805
|
+
|
|
2806
|
+
// src/shared/config/validatons.ts
|
|
2807
|
+
function invariant_rpcEndpointConfigIncludesAtLeastOneHTTPProtocolURL(ctx) {
|
|
2808
|
+
const endpoints = ctx.value;
|
|
2809
|
+
const httpEndpoints = endpoints.filter(isHttpProtocol);
|
|
2810
|
+
if (httpEndpoints.length < 1) {
|
|
2811
|
+
ctx.issues.push({
|
|
2812
|
+
code: "custom",
|
|
2813
|
+
input: endpoints,
|
|
2814
|
+
message: `RPC endpoint configuration for a chain must include at least one http/https protocol URL.`
|
|
2815
|
+
});
|
|
2816
|
+
}
|
|
2817
|
+
}
|
|
2818
|
+
function invariant_rpcEndpointConfigIncludesAtMostOneWebSocketsProtocolURL(ctx) {
|
|
2819
|
+
const endpoints = ctx.value;
|
|
2820
|
+
const wsEndpoints = endpoints.filter(isWebSocketProtocol);
|
|
2821
|
+
if (wsEndpoints.length > 1) {
|
|
2822
|
+
ctx.issues.push({
|
|
2823
|
+
code: "custom",
|
|
2824
|
+
input: endpoints,
|
|
2825
|
+
message: `RPC endpoint configuration for a chain must include at most one websocket (ws/wss) protocol URL.`
|
|
2826
|
+
});
|
|
2827
|
+
}
|
|
2828
|
+
}
|
|
2829
|
+
function invariant_rpcConfigsSpecifiedForRootChain(ctx) {
|
|
2830
|
+
const { value: config } = ctx;
|
|
2831
|
+
const ensRootChainId = (0, import_datasources7.getENSRootChainId)(config.namespace);
|
|
2832
|
+
if (!config.rpcConfigs.has(ensRootChainId)) {
|
|
2833
|
+
ctx.issues.push({
|
|
2834
|
+
code: "custom",
|
|
2835
|
+
input: config,
|
|
2836
|
+
message: `An RPC Config for the ENS Root Chain ('${ensRootChainId}') is required, but none was specified.`
|
|
2837
|
+
});
|
|
2838
|
+
}
|
|
2839
|
+
}
|
|
2840
|
+
|
|
2841
|
+
// src/shared/config/zod-schemas.ts
|
|
2842
|
+
var import_v423 = require("zod/v4");
|
|
2843
|
+
var import_datasources8 = require("@ensnode/datasources");
|
|
2844
|
+
|
|
2845
|
+
// src/shared/deserialize.ts
|
|
2846
|
+
var import_v422 = __toESM(require("zod/v4"), 1);
|
|
2847
|
+
function deserializeChainId(maybeChainId, valueLabel) {
|
|
2848
|
+
const schema = makeChainIdStringSchema(valueLabel);
|
|
2849
|
+
const parsed = schema.safeParse(maybeChainId);
|
|
2850
|
+
if (parsed.error) {
|
|
2851
|
+
throw new Error(`Cannot deserialize ChainId:
|
|
2852
|
+
${(0, import_v422.prettifyError)(parsed.error)}
|
|
2853
|
+
`);
|
|
2854
|
+
}
|
|
2855
|
+
return parsed.data;
|
|
2856
|
+
}
|
|
2857
|
+
|
|
2858
|
+
// src/shared/config/zod-schemas.ts
|
|
2859
|
+
var RpcConfigSchema = import_v423.z.string().transform((val) => val.split(",")).pipe(import_v423.z.array(makeUrlSchema("RPC URL"))).check(invariant_rpcEndpointConfigIncludesAtLeastOneHTTPProtocolURL).check(invariant_rpcEndpointConfigIncludesAtMostOneWebSocketsProtocolURL);
|
|
2860
|
+
var RpcConfigsSchema = import_v423.z.record(makeChainIdStringSchema("RPC URL"), RpcConfigSchema, {
|
|
2861
|
+
error: "Chains configuration must be an object mapping valid chain IDs to their configs."
|
|
2862
|
+
}).transform((records) => {
|
|
2863
|
+
const rpcConfigs = /* @__PURE__ */ new Map();
|
|
2864
|
+
for (const [chainIdString, rpcConfig] of Object.entries(records)) {
|
|
2865
|
+
const httpRPCs = rpcConfig.filter(isHttpProtocol);
|
|
2866
|
+
const websocketRPC = rpcConfig.find(isWebSocketProtocol);
|
|
2867
|
+
rpcConfigs.set(deserializeChainId(chainIdString), {
|
|
2868
|
+
httpRPCs,
|
|
2869
|
+
websocketRPC
|
|
2870
|
+
});
|
|
2871
|
+
}
|
|
2872
|
+
return rpcConfigs;
|
|
2873
|
+
});
|
|
2874
|
+
var ENSNamespaceSchema = import_v423.z.enum(import_datasources8.ENSNamespaceIds, {
|
|
2875
|
+
error: ({ input }) => `Invalid NAMESPACE. Got '${input}', but supported ENS namespaces are: ${Object.keys(import_datasources8.ENSNamespaceIds).join(", ")}`
|
|
2876
|
+
});
|
|
2877
|
+
var PortNumberSchema = import_v423.z.coerce.number({ error: "PORT must be a number." }).int({ error: "PORT must be an integer." }).min(1, { error: "PORT must be greater than or equal to 1." }).max(65535, { error: "PORT must be less than or equal to 65535." });
|
|
2878
|
+
var OptionalPortNumberSchema = PortNumberSchema.optional();
|
|
2879
|
+
var TheGraphApiKeySchema = import_v423.z.string().optional();
|
|
2880
|
+
|
|
2881
|
+
// src/shared/config-templates.ts
|
|
2882
|
+
var import_datasources9 = require("@ensnode/datasources");
|
|
2883
|
+
var ConfigTemplateIds = {
|
|
2884
|
+
Mainnet: "mainnet",
|
|
2885
|
+
Sepolia: "sepolia",
|
|
2886
|
+
Alpha: "alpha",
|
|
2887
|
+
AlphaSepolia: "alpha-sepolia"
|
|
2888
|
+
};
|
|
2889
|
+
function isConfigTemplateSubgraphCompatible(configTemplateId) {
|
|
2890
|
+
switch (configTemplateId) {
|
|
2891
|
+
// these ConfigTemplates are run with SUBGRAPH_COMPAT, meaning they are Subgraph Compatible
|
|
2892
|
+
case ConfigTemplateIds.Mainnet:
|
|
2893
|
+
case ConfigTemplateIds.Sepolia:
|
|
2894
|
+
return true;
|
|
2895
|
+
// these instances are NOT run with SUBGRAPH_COMPAT, meaning they are NOT Subgraph Compatible
|
|
2896
|
+
case ConfigTemplateIds.Alpha:
|
|
2897
|
+
case ConfigTemplateIds.AlphaSepolia:
|
|
2898
|
+
return false;
|
|
2899
|
+
default:
|
|
2900
|
+
throw new Error("never");
|
|
2901
|
+
}
|
|
2902
|
+
}
|
|
2903
|
+
function namespaceForConfigTemplateId(configTemplateId) {
|
|
2904
|
+
switch (configTemplateId) {
|
|
2905
|
+
case ConfigTemplateIds.Alpha:
|
|
2906
|
+
case ConfigTemplateIds.Mainnet:
|
|
2907
|
+
return import_datasources9.ENSNamespaceIds.Mainnet;
|
|
2908
|
+
case ConfigTemplateIds.AlphaSepolia:
|
|
2909
|
+
case ConfigTemplateIds.Sepolia:
|
|
2910
|
+
return import_datasources9.ENSNamespaceIds.Sepolia;
|
|
2911
|
+
default:
|
|
2912
|
+
throw new Error("never");
|
|
2913
|
+
}
|
|
2914
|
+
}
|
|
2915
|
+
|
|
2916
|
+
// src/shared/datasources-with-ensv2-contracts.ts
|
|
2917
|
+
var import_datasources10 = require("@ensnode/datasources");
|
|
2918
|
+
var DATASOURCE_NAMES_WITH_ENSv2_CONTRACTS = [
|
|
2919
|
+
import_datasources10.DatasourceNames.ENSv2Root
|
|
2920
|
+
];
|
|
2921
|
+
var getDatasourcesWithENSv2Contracts = (namespace) => DATASOURCE_NAMES_WITH_ENSv2_CONTRACTS.map(
|
|
2922
|
+
(datasourceName) => (0, import_datasources10.maybeGetDatasource)(namespace, datasourceName)
|
|
2923
|
+
).filter((datasource) => !!datasource).map((datasource) => {
|
|
2924
|
+
if (!datasource.contracts.Registry || !datasource.contracts.EnhancedAccessControl) {
|
|
2925
|
+
throw new Error(
|
|
2926
|
+
`Invariant: Datasource does not define 'Registry' and 'EnhancedAccessControl' contracts. Defined contracts: ${JSON.stringify(Object.keys(datasource.contracts))}`
|
|
2927
|
+
);
|
|
2928
|
+
}
|
|
2929
|
+
return datasource;
|
|
2930
|
+
});
|
|
2931
|
+
|
|
2932
|
+
// src/shared/datasources-with-resolvers.ts
|
|
2933
|
+
var import_datasources11 = require("@ensnode/datasources");
|
|
2934
|
+
var DATASOURCE_NAMES_WITH_RESOLVERS = [
|
|
2935
|
+
import_datasources11.DatasourceNames.ENSRoot,
|
|
2936
|
+
import_datasources11.DatasourceNames.Basenames,
|
|
2937
|
+
import_datasources11.DatasourceNames.Lineanames,
|
|
2938
|
+
import_datasources11.DatasourceNames.ThreeDNSOptimism,
|
|
2939
|
+
import_datasources11.DatasourceNames.ThreeDNSBase,
|
|
2940
|
+
// all datasources that define ENSv2 contracts also define Resolver
|
|
2941
|
+
...DATASOURCE_NAMES_WITH_ENSv2_CONTRACTS
|
|
2942
|
+
];
|
|
2943
|
+
var getDatasourcesWithResolvers = (namespace) => DATASOURCE_NAMES_WITH_RESOLVERS.map(
|
|
2944
|
+
(datasourceName) => (0, import_datasources11.maybeGetDatasource)(namespace, datasourceName)
|
|
2945
|
+
).filter((datasource) => !!datasource).map((datasource) => {
|
|
2946
|
+
if (!datasource.contracts.Resolver) {
|
|
2947
|
+
throw new Error(
|
|
2948
|
+
`Invariant: Datasource does not define a 'Resolver' contract. Defined contracts: ${JSON.stringify(Object.keys(datasource.contracts))}`
|
|
2949
|
+
);
|
|
2950
|
+
}
|
|
2951
|
+
return datasource;
|
|
2952
|
+
});
|
|
2953
|
+
|
|
2954
|
+
// src/shared/interpretation/interpret-address.ts
|
|
2955
|
+
var import_viem8 = require("viem");
|
|
2956
|
+
var interpretAddress = (owner) => (0, import_viem8.isAddressEqual)(import_viem8.zeroAddress, owner) ? null : owner;
|
|
2957
|
+
|
|
2958
|
+
// src/shared/interpretation/interpret-record-values.ts
|
|
2959
|
+
var import_enssdk9 = require("enssdk");
|
|
2960
|
+
var import_viem9 = require("viem");
|
|
2961
|
+
|
|
2962
|
+
// src/shared/null-bytes.ts
|
|
2963
|
+
var hasNullByte = (value) => value.indexOf("\0") !== -1;
|
|
2964
|
+
|
|
2965
|
+
// src/shared/interpretation/interpret-record-values.ts
|
|
2966
|
+
function interpretNameRecordValue(value) {
|
|
2967
|
+
if (value === "") return null;
|
|
2968
|
+
if (!(0, import_enssdk9.isInterpretedName)(value)) return null;
|
|
2969
|
+
return value;
|
|
2970
|
+
}
|
|
2971
|
+
function interpretAddressRecordValue(value) {
|
|
2972
|
+
if (hasNullByte(value)) return null;
|
|
2973
|
+
if (value === "") return null;
|
|
2974
|
+
if (value === "0x") return null;
|
|
2975
|
+
if (!(0, import_viem9.isAddress)(value, { strict: false })) return value;
|
|
2976
|
+
if ((0, import_viem9.isAddressEqual)(value, import_viem9.zeroAddress)) return null;
|
|
2977
|
+
return (0, import_enssdk9.toNormalizedAddress)(value);
|
|
2978
|
+
}
|
|
2979
|
+
function interpretTextRecordKey(key) {
|
|
2980
|
+
if (hasNullByte(key)) return null;
|
|
2981
|
+
if (key === "") return null;
|
|
2982
|
+
return key;
|
|
2983
|
+
}
|
|
2984
|
+
function interpretTextRecordValue(value) {
|
|
2985
|
+
if (hasNullByte(value)) return null;
|
|
2986
|
+
if (value === "") return null;
|
|
2987
|
+
return value;
|
|
2988
|
+
}
|
|
2989
|
+
|
|
2990
|
+
// src/shared/interpretation/interpret-resolver-values.ts
|
|
2991
|
+
var import_viem10 = require("viem");
|
|
2992
|
+
function interpretContenthashValue(value) {
|
|
2993
|
+
if ((0, import_viem10.size)(value) === 0) return null;
|
|
2994
|
+
return value;
|
|
2995
|
+
}
|
|
2996
|
+
function interpretPubkeyValue(x, y) {
|
|
2997
|
+
if (x === import_viem10.zeroHash && y === import_viem10.zeroHash) return null;
|
|
2998
|
+
return { x, y };
|
|
2999
|
+
}
|
|
3000
|
+
function interpretDnszonehashValue(value) {
|
|
3001
|
+
if ((0, import_viem10.size)(value) === 0) return null;
|
|
3002
|
+
return value;
|
|
3003
|
+
}
|
|
3004
|
+
|
|
3005
|
+
// src/shared/log-level.ts
|
|
3006
|
+
var import_v424 = require("zod/v4");
|
|
3007
|
+
var LogLevelSchema = import_v424.z.enum(["fatal", "error", "warn", "info", "debug", "trace", "silent"]);
|
|
3008
|
+
function getLogLevelFromEnv(env, defaultLogLevel) {
|
|
3009
|
+
try {
|
|
3010
|
+
return LogLevelSchema.default(defaultLogLevel).parse(env.LOG_LEVEL);
|
|
3011
|
+
} catch {
|
|
3012
|
+
console.warn(
|
|
3013
|
+
`Invalid LOG_LEVEL '${env.LOG_LEVEL}', expected one of '${Object.values(LogLevelSchema.enum).join("' | '")}' defaulting to '${defaultLogLevel}'`
|
|
3014
|
+
);
|
|
3015
|
+
return defaultLogLevel;
|
|
3016
|
+
}
|
|
3017
|
+
}
|
|
3018
|
+
|
|
3019
|
+
// src/shared/protocol-acceleration/is-bridged-resolver.ts
|
|
3020
|
+
var import_enssdk12 = require("enssdk");
|
|
3021
|
+
var import_datasources14 = require("@ensnode/datasources");
|
|
3022
|
+
|
|
3023
|
+
// src/shared/managed-names.ts
|
|
3024
|
+
var import_enssdk10 = require("enssdk");
|
|
3025
|
+
var import_datasources12 = require("@ensnode/datasources");
|
|
3026
|
+
|
|
3027
|
+
// src/shared/to-json.ts
|
|
3028
|
+
var toJson = (value, options) => JSON.stringify(
|
|
3029
|
+
value,
|
|
3030
|
+
(_key, val) => typeof val === "bigint" ? String(val) : val,
|
|
3031
|
+
options?.pretty ? 2 : void 0
|
|
3032
|
+
);
|
|
3033
|
+
|
|
3034
|
+
// src/shared/managed-names.ts
|
|
3035
|
+
var MANAGED_NAME_BY_NAMESPACE = {
|
|
3036
|
+
sepolia: {
|
|
3037
|
+
"base.eth": "basetest.eth",
|
|
3038
|
+
"linea.eth": "linea-sepolia.eth"
|
|
3039
|
+
}
|
|
3040
|
+
};
|
|
3041
|
+
var getContractsByManagedName = (namespace) => {
|
|
3042
|
+
const ensRootRegistry = getDatasourceContract(
|
|
3043
|
+
namespace,
|
|
3044
|
+
import_datasources12.DatasourceNames.ENSRoot,
|
|
3045
|
+
"ENSv1Registry"
|
|
3046
|
+
);
|
|
3047
|
+
const ensRootRegistryOld = getDatasourceContract(
|
|
3048
|
+
namespace,
|
|
3049
|
+
import_datasources12.DatasourceNames.ENSRoot,
|
|
3050
|
+
"ENSv1RegistryOld"
|
|
3051
|
+
);
|
|
3052
|
+
const ethnamesNameWrapper = getDatasourceContract(
|
|
3053
|
+
namespace,
|
|
3054
|
+
import_datasources12.DatasourceNames.ENSRoot,
|
|
3055
|
+
"NameWrapper"
|
|
3056
|
+
);
|
|
3057
|
+
const basenamesRegistry = maybeGetDatasourceContract(
|
|
3058
|
+
namespace,
|
|
3059
|
+
import_datasources12.DatasourceNames.Basenames,
|
|
3060
|
+
"Registry"
|
|
3061
|
+
);
|
|
3062
|
+
const lineanamesRegistry = maybeGetDatasourceContract(
|
|
3063
|
+
namespace,
|
|
3064
|
+
import_datasources12.DatasourceNames.Lineanames,
|
|
3065
|
+
"Registry"
|
|
3066
|
+
);
|
|
3067
|
+
const lineanamesNameWrapper = maybeGetDatasourceContract(
|
|
3068
|
+
namespace,
|
|
3069
|
+
import_datasources12.DatasourceNames.Lineanames,
|
|
3070
|
+
"NameWrapper"
|
|
3071
|
+
);
|
|
3072
|
+
return {
|
|
3073
|
+
[import_enssdk10.ENS_ROOT_NAME]: {
|
|
3074
|
+
registry: ensRootRegistry,
|
|
3075
|
+
contracts: [ensRootRegistry, ensRootRegistryOld]
|
|
3076
|
+
},
|
|
3077
|
+
eth: {
|
|
3078
|
+
registry: ensRootRegistry,
|
|
3079
|
+
contracts: [
|
|
3080
|
+
getDatasourceContract(namespace, import_datasources12.DatasourceNames.ENSRoot, "BaseRegistrar"),
|
|
3081
|
+
getDatasourceContract(
|
|
3082
|
+
namespace,
|
|
3083
|
+
import_datasources12.DatasourceNames.ENSRoot,
|
|
3084
|
+
"UnwrappedEthRegistrarController"
|
|
3085
|
+
),
|
|
3086
|
+
maybeGetDatasourceContract(
|
|
3087
|
+
namespace,
|
|
3088
|
+
import_datasources12.DatasourceNames.ENSRoot,
|
|
3089
|
+
"LegacyEthRegistrarController"
|
|
3090
|
+
),
|
|
3091
|
+
maybeGetDatasourceContract(
|
|
3092
|
+
namespace,
|
|
3093
|
+
import_datasources12.DatasourceNames.ENSRoot,
|
|
3094
|
+
"WrappedEthRegistrarController"
|
|
3095
|
+
),
|
|
3096
|
+
maybeGetDatasourceContract(
|
|
3097
|
+
namespace,
|
|
3098
|
+
import_datasources12.DatasourceNames.ENSRoot,
|
|
3099
|
+
"UniversalRegistrarRenewalWithReferrer"
|
|
3100
|
+
),
|
|
3101
|
+
ethnamesNameWrapper
|
|
3102
|
+
].filter((c) => !!c)
|
|
3103
|
+
},
|
|
3104
|
+
...basenamesRegistry && {
|
|
3105
|
+
"base.eth": {
|
|
3106
|
+
registry: basenamesRegistry,
|
|
3107
|
+
contracts: [
|
|
3108
|
+
basenamesRegistry,
|
|
3109
|
+
maybeGetDatasourceContract(namespace, import_datasources12.DatasourceNames.Basenames, "BaseRegistrar"),
|
|
3110
|
+
maybeGetDatasourceContract(namespace, import_datasources12.DatasourceNames.Basenames, "EARegistrarController"),
|
|
3111
|
+
maybeGetDatasourceContract(namespace, import_datasources12.DatasourceNames.Basenames, "RegistrarController"),
|
|
3112
|
+
maybeGetDatasourceContract(
|
|
3113
|
+
namespace,
|
|
3114
|
+
import_datasources12.DatasourceNames.Basenames,
|
|
3115
|
+
"UpgradeableRegistrarController"
|
|
3116
|
+
)
|
|
3117
|
+
].filter((c) => !!c)
|
|
3118
|
+
}
|
|
3119
|
+
},
|
|
3120
|
+
...lineanamesRegistry && {
|
|
3121
|
+
"linea.eth": {
|
|
3122
|
+
registry: lineanamesRegistry,
|
|
3123
|
+
contracts: [
|
|
3124
|
+
lineanamesRegistry,
|
|
3125
|
+
maybeGetDatasourceContract(namespace, import_datasources12.DatasourceNames.Lineanames, "BaseRegistrar"),
|
|
3126
|
+
maybeGetDatasourceContract(
|
|
3127
|
+
namespace,
|
|
3128
|
+
import_datasources12.DatasourceNames.Lineanames,
|
|
3129
|
+
"EthRegistrarController"
|
|
3130
|
+
),
|
|
3131
|
+
lineanamesNameWrapper
|
|
3132
|
+
].filter((c) => !!c)
|
|
3133
|
+
}
|
|
3134
|
+
}
|
|
3135
|
+
};
|
|
3136
|
+
};
|
|
3137
|
+
var cache = /* @__PURE__ */ new Map();
|
|
3138
|
+
var getManagedName = (namespace, contract) => {
|
|
3139
|
+
const cacheKey = `${namespace}:${(0, import_enssdk10.stringifyAccountId)(contract)}`;
|
|
3140
|
+
const cached = cache.get(cacheKey);
|
|
3141
|
+
if (cached !== void 0) return cached;
|
|
3142
|
+
for (const [managedName, group] of Object.entries(getContractsByManagedName(namespace))) {
|
|
3143
|
+
const isAnyOfTheContracts = group.contracts.some(
|
|
3144
|
+
(_contract) => accountIdEqual(_contract, contract)
|
|
3145
|
+
);
|
|
3146
|
+
if (isAnyOfTheContracts) {
|
|
3147
|
+
const namespaceSpecific = MANAGED_NAME_BY_NAMESPACE[namespace]?.[managedName];
|
|
3148
|
+
const name = (0, import_enssdk10.asInterpretedName)(namespaceSpecific ?? managedName);
|
|
3149
|
+
const node = (0, import_enssdk10.namehashInterpretedName)(name);
|
|
3150
|
+
const result = { name, node, registry: group.registry };
|
|
3151
|
+
cache.set(cacheKey, result);
|
|
3152
|
+
return result;
|
|
3153
|
+
}
|
|
3154
|
+
}
|
|
3155
|
+
throw new Error(
|
|
3156
|
+
`The following contract ${toJson(contract, { pretty: true })} does not have a configured Managed Name in namespace '${namespace}'.`
|
|
3157
|
+
);
|
|
3158
|
+
};
|
|
3159
|
+
|
|
3160
|
+
// src/shared/root-registry.ts
|
|
3161
|
+
var import_enssdk11 = require("enssdk");
|
|
3162
|
+
var import_datasources13 = require("@ensnode/datasources");
|
|
3163
|
+
var getENSv1RootRegistry = (namespace) => getDatasourceContract(namespace, import_datasources13.DatasourceNames.ENSRoot, "ENSv1Registry");
|
|
3164
|
+
|
|
3165
|
+
// src/shared/protocol-acceleration/is-bridged-resolver.ts
|
|
3166
|
+
var cache2 = /* @__PURE__ */ new Map();
|
|
3167
|
+
var getBridgedResolverConfigs = (namespace) => {
|
|
3168
|
+
const cached = cache2.get(namespace);
|
|
3169
|
+
if (cached) return cached;
|
|
3170
|
+
const configs = [];
|
|
3171
|
+
const basenames = (0, import_datasources14.maybeGetDatasource)(namespace, import_datasources14.DatasourceNames.Basenames);
|
|
3172
|
+
if (basenames) {
|
|
3173
|
+
const resolver = getDatasourceContract(
|
|
3174
|
+
namespace,
|
|
3175
|
+
import_datasources14.DatasourceNames.ENSRoot,
|
|
3176
|
+
"BasenamesL1Resolver"
|
|
3177
|
+
);
|
|
3178
|
+
const registry = getDatasourceContract(namespace, import_datasources14.DatasourceNames.Basenames, "Registry");
|
|
3179
|
+
const { node } = getManagedName(namespace, registry);
|
|
3180
|
+
configs.push({
|
|
3181
|
+
resolver,
|
|
3182
|
+
originDomainId: (0, import_enssdk12.makeENSv1DomainId)(getENSv1RootRegistry(namespace), node),
|
|
3183
|
+
targetRegistry: registry,
|
|
3184
|
+
targetRegistryId: (0, import_enssdk12.makeENSv1VirtualRegistryId)(registry, node)
|
|
3185
|
+
});
|
|
3186
|
+
}
|
|
3187
|
+
const lineanames = (0, import_datasources14.maybeGetDatasource)(namespace, import_datasources14.DatasourceNames.Lineanames);
|
|
3188
|
+
if (lineanames) {
|
|
3189
|
+
const resolver = getDatasourceContract(
|
|
3190
|
+
namespace,
|
|
3191
|
+
import_datasources14.DatasourceNames.ENSRoot,
|
|
3192
|
+
"LineanamesL1Resolver"
|
|
3193
|
+
);
|
|
3194
|
+
const registry = getDatasourceContract(namespace, import_datasources14.DatasourceNames.Lineanames, "Registry");
|
|
3195
|
+
const { node } = getManagedName(namespace, registry);
|
|
3196
|
+
configs.push({
|
|
3197
|
+
resolver,
|
|
3198
|
+
originDomainId: (0, import_enssdk12.makeENSv1DomainId)(getENSv1RootRegistry(namespace), node),
|
|
3199
|
+
targetRegistry: registry,
|
|
3200
|
+
targetRegistryId: (0, import_enssdk12.makeENSv1VirtualRegistryId)(registry, node)
|
|
3201
|
+
});
|
|
3202
|
+
}
|
|
3203
|
+
cache2.set(namespace, configs);
|
|
3204
|
+
return configs;
|
|
3205
|
+
};
|
|
3206
|
+
function isBridgedResolver(namespace, resolver) {
|
|
3207
|
+
return getBridgedResolverConfigs(namespace).find(
|
|
3208
|
+
(config) => accountIdEqual(config.resolver, resolver)
|
|
3209
|
+
) ?? null;
|
|
3210
|
+
}
|
|
3211
|
+
|
|
3212
|
+
// src/shared/protocol-acceleration/is-ensip-19-reverse-resolver.ts
|
|
3213
|
+
var import_datasources15 = require("@ensnode/datasources");
|
|
3214
|
+
function isKnownENSIP19ReverseResolver(namespace, resolver) {
|
|
3215
|
+
const resolverEq = makeContractMatcher(namespace, resolver);
|
|
3216
|
+
return [
|
|
3217
|
+
// DefaultReverseResolver (default.reverse)
|
|
3218
|
+
resolverEq(import_datasources15.DatasourceNames.ReverseResolverRoot, "DefaultReverseResolver3"),
|
|
3219
|
+
// the following are each ChainReverseResolver ([coinType].reverse)
|
|
3220
|
+
resolverEq(import_datasources15.DatasourceNames.ReverseResolverRoot, "BaseReverseResolver"),
|
|
3221
|
+
resolverEq(import_datasources15.DatasourceNames.ReverseResolverRoot, "LineaReverseResolver"),
|
|
3222
|
+
resolverEq(import_datasources15.DatasourceNames.ReverseResolverRoot, "OptimismReverseResolver"),
|
|
3223
|
+
resolverEq(import_datasources15.DatasourceNames.ReverseResolverRoot, "ArbitrumReverseResolver"),
|
|
3224
|
+
resolverEq(import_datasources15.DatasourceNames.ReverseResolverRoot, "ScrollReverseResolver")
|
|
3225
|
+
].some(Boolean);
|
|
3226
|
+
}
|
|
3227
|
+
|
|
3228
|
+
// src/shared/protocol-acceleration/is-static-resolver.ts
|
|
3229
|
+
var import_datasources16 = require("@ensnode/datasources");
|
|
3230
|
+
function isStaticResolver(namespace, resolver) {
|
|
3231
|
+
const resolverEq = makeContractMatcher(namespace, resolver);
|
|
3232
|
+
return [
|
|
3233
|
+
// ENS Root Chain
|
|
3234
|
+
resolverEq(import_datasources16.DatasourceNames.ReverseResolverRoot, "DefaultPublicResolver0"),
|
|
3235
|
+
resolverEq(import_datasources16.DatasourceNames.ReverseResolverRoot, "DefaultPublicResolver1"),
|
|
3236
|
+
resolverEq(import_datasources16.DatasourceNames.ReverseResolverRoot, "DefaultPublicResolver2"),
|
|
3237
|
+
resolverEq(import_datasources16.DatasourceNames.ReverseResolverRoot, "DefaultPublicResolver3"),
|
|
3238
|
+
resolverEq(import_datasources16.DatasourceNames.ReverseResolverRoot, "DefaultPublicResolver4"),
|
|
3239
|
+
resolverEq(import_datasources16.DatasourceNames.ReverseResolverRoot, "DefaultPublicResolver5"),
|
|
3240
|
+
resolverEq(import_datasources16.DatasourceNames.ENSRoot, "ArgentResolver"),
|
|
3241
|
+
resolverEq(import_datasources16.DatasourceNames.ENSRoot, "LoopringResolver"),
|
|
3242
|
+
// Basenames
|
|
3243
|
+
resolverEq(import_datasources16.DatasourceNames.Basenames, "L2Resolver1"),
|
|
3244
|
+
resolverEq(import_datasources16.DatasourceNames.Basenames, "L2Resolver2"),
|
|
3245
|
+
// Lineanames
|
|
3246
|
+
resolverEq(import_datasources16.DatasourceNames.Lineanames, "DefaultPublicResolver"),
|
|
3247
|
+
// ThreeDNS
|
|
3248
|
+
resolverEq(import_datasources16.DatasourceNames.ThreeDNSBase, "Resolver"),
|
|
3249
|
+
resolverEq(import_datasources16.DatasourceNames.ThreeDNSOptimism, "Resolver")
|
|
3250
|
+
].some(Boolean);
|
|
3251
|
+
}
|
|
3252
|
+
function staticResolverImplementsAddressRecordDefaulting(namespace, resolver) {
|
|
3253
|
+
const resolverEq = makeContractMatcher(namespace, resolver);
|
|
3254
|
+
return [
|
|
3255
|
+
// ENS Root Chain
|
|
3256
|
+
resolverEq(import_datasources16.DatasourceNames.ReverseResolverRoot, "DefaultPublicResolver5"),
|
|
3257
|
+
// Base Chain
|
|
3258
|
+
resolverEq(import_datasources16.DatasourceNames.Basenames, "L2Resolver2")
|
|
3259
|
+
].some(Boolean);
|
|
3260
|
+
}
|
|
3261
|
+
|
|
3262
|
+
// src/shared/thegraph.ts
|
|
3263
|
+
var import_datasources17 = require("@ensnode/datasources");
|
|
3264
|
+
var canFallbackToTheGraph = ({
|
|
3265
|
+
namespace,
|
|
3266
|
+
theGraphApiKey,
|
|
3267
|
+
isSubgraphCompatible: isSubgraphCompatible2
|
|
3268
|
+
}) => {
|
|
3269
|
+
if (!isSubgraphCompatible2) return { canFallback: false, reason: "not-subgraph-compatible" };
|
|
3270
|
+
const hasApiKey = theGraphApiKey !== void 0;
|
|
3271
|
+
if (!hasApiKey) return { canFallback: false, reason: "no-api-key" };
|
|
3272
|
+
const url = makeTheGraphSubgraphUrl(namespace, theGraphApiKey);
|
|
3273
|
+
if (url === null) return { canFallback: false, reason: "no-subgraph-url" };
|
|
3274
|
+
return { canFallback: true, url };
|
|
3275
|
+
};
|
|
3276
|
+
var makeTheGraphSubgraphUrl = (namespace, apiKey) => {
|
|
3277
|
+
switch (namespace) {
|
|
3278
|
+
case import_datasources17.ENSNamespaceIds.Mainnet:
|
|
3279
|
+
return `https://gateway.thegraph.com/api/${apiKey}/subgraphs/id/5XqPmWe6gjyrJtFn9cLy237i4cWw2j9HcUJEXsP5qGtH`;
|
|
3280
|
+
case import_datasources17.ENSNamespaceIds.Sepolia:
|
|
3281
|
+
return `https://gateway.thegraph.com/api/${apiKey}/subgraphs/id/G1SxZs317YUb9nQX3CC98hDyvxfMJNZH5pPRGpNrtvwN`;
|
|
3282
|
+
case import_datasources17.ENSNamespaceIds.SepoliaV2:
|
|
3283
|
+
case import_datasources17.ENSNamespaceIds.EnsTestEnv:
|
|
3284
|
+
return null;
|
|
3285
|
+
default:
|
|
3286
|
+
throw new Error("never");
|
|
3287
|
+
}
|
|
3288
|
+
};
|
|
3289
|
+
//# sourceMappingURL=internal.cjs.map
|