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