@ensnode/ensdb-sdk 1.15.0 → 1.15.2

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.
@@ -1,7 +1,7 @@
1
1
  import * as ponder from 'ponder';
2
2
  import * as drizzle_orm from 'drizzle-orm';
3
3
  import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core';
4
- import { DomainId, ResolverId, ResolverRecordsId, InterpretedName, RegistryId, LabelHashPath, InterpretedLabel, PermissionsId, PermissionsResourceId, PermissionsUserId, RegistrationId, RenewalId } from 'enssdk';
4
+ import { DomainId, ResolverId, ResolverRecordsId, InterpretedName, RegistryId, LabelHashPath, InterpretedLabel, PermissionsId, PermissionsResourceId, PermissionsUserId, RegistrationId, RenewalId, Name } from 'enssdk';
5
5
 
6
6
  /**
7
7
  * Schema Definitions that track ENS Registry migration status for Protocol Acceleration.
@@ -361,6 +361,23 @@ declare const resolver: ponder.OnchainTable<{
361
361
  }, {}, {
362
362
  $type: `0x${string}`;
363
363
  }>;
364
+ isExtended: ponder.PgColumn<{
365
+ name: "isExtended";
366
+ tableName: "resolvers";
367
+ dataType: "boolean";
368
+ columnType: "PgBoolean";
369
+ data: boolean;
370
+ driverParam: boolean;
371
+ notNull: true;
372
+ hasDefault: true;
373
+ isPrimaryKey: false;
374
+ isAutoincrement: false;
375
+ hasRuntimeDefault: false;
376
+ enumValues: undefined;
377
+ baseColumn: never;
378
+ identity: undefined;
379
+ generated: undefined;
380
+ }, {}, {}>;
364
381
  };
365
382
  extra: {
366
383
  byId: drizzle_orm_pg_core.IndexBuilder;
@@ -670,15 +687,15 @@ declare const resolverAddressRecord: ponder.OnchainTable<{
670
687
  name: "value";
671
688
  tableName: "resolver_address_records";
672
689
  dataType: "string";
673
- columnType: "PgText";
674
- data: string;
690
+ columnType: "PgHex";
691
+ data: `0x${string}`;
675
692
  driverParam: string;
676
693
  notNull: true;
677
694
  hasDefault: false;
678
695
  isPrimaryKey: false;
679
696
  isAutoincrement: false;
680
697
  hasRuntimeDefault: false;
681
- enumValues: [string, ...string[]];
698
+ enumValues: undefined;
682
699
  baseColumn: never;
683
700
  identity: undefined;
684
701
  generated: undefined;
@@ -6133,7 +6150,31 @@ declare const relations_registry: drizzle_orm.Relations<"registries", {
6133
6150
  domainsAsSubregistry: drizzle_orm.Many<"domains">;
6134
6151
  permissions: drizzle_orm.One<"permissions", true>;
6135
6152
  }>;
6153
+ /**
6154
+ * Sentinel "+∞" sort value materialized into `Domain.__latestRegistrationStart` /
6155
+ * `__latestRegistrationExpiry` when the value is absent — a Domain with no Registration, or a
6156
+ * Registration that never expires. Holding those sort columns NOT NULL (absent → this sentinel)
6157
+ * lets REGISTRATION_*-ordered find-domains queries use a plain `(registry_id, col, id)` composite
6158
+ * index in both directions with a plain keyset tuple, with no NULL-placement special casing.
6159
+ *
6160
+ * @dev uint256 max — larger than every real timestamp/expiry, including the uint64-max ENSv2
6161
+ * "never expires" expiry. It sorts last for ASC ("oldest"/"expiring soonest") and first for DESC.
6162
+ */
6163
+ declare const REGISTRATION_SORT_SENTINEL: bigint;
6136
6164
  declare const domainType: ponder.OnchainEnum<["ENSv1Domain", "ENSv2Domain"]>;
6165
+ /**
6166
+ * Length cap (in code points) of the materialized `domain.__canonicalNamePrefix`. Sized for
6167
+ * typeahead and left-anchored search; longer (invariably spam) names truncate here and tie-break
6168
+ * by `id` in NAME ordering. Kept small to bound the prefix indexes.
6169
+ */
6170
+ declare const CANONICAL_NAME_PREFIX_LENGTH = 64;
6171
+ /**
6172
+ * Truncate a Canonical Name to {@link CANONICAL_NAME_PREFIX_LENGTH} for `domain.__canonicalNamePrefix`.
6173
+ * Uses code-point iteration so the JS-side prefix is byte-identical to Postgres `left(text, N)`
6174
+ * (which counts code points), keeping the materialized column consistent across the JS and raw-SQL
6175
+ * write paths in `canonicality-db-helpers.ts`.
6176
+ */
6177
+ declare function truncateCanonicalNamePrefix(name: Name | null): Name | null;
6137
6178
  declare const domain: ponder.OnchainTable<{
6138
6179
  name: "domains";
6139
6180
  schema: undefined;
@@ -6343,6 +6384,25 @@ declare const domain: ponder.OnchainTable<{
6343
6384
  }, {}, {
6344
6385
  $type: InterpretedName;
6345
6386
  }>;
6387
+ __canonicalNamePrefix: ponder.PgColumn<{
6388
+ name: "__canonical_name_prefix";
6389
+ tableName: "domains";
6390
+ dataType: "string";
6391
+ columnType: "PgText";
6392
+ data: string;
6393
+ driverParam: string;
6394
+ notNull: false;
6395
+ hasDefault: false;
6396
+ isPrimaryKey: false;
6397
+ isAutoincrement: false;
6398
+ hasRuntimeDefault: false;
6399
+ enumValues: [string, ...string[]];
6400
+ baseColumn: never;
6401
+ identity: undefined;
6402
+ generated: undefined;
6403
+ }, {}, {
6404
+ $type: string;
6405
+ }>;
6346
6406
  canonicalLabelHashPath: ponder.PgColumn<{
6347
6407
  name: "canonicalLabelHashPath";
6348
6408
  tableName: "domains";
@@ -6470,6 +6530,40 @@ declare const domain: ponder.OnchainTable<{
6470
6530
  }, {}, {
6471
6531
  $type: `0x${string}`;
6472
6532
  }>;
6533
+ __latestRegistrationStart: ponder.PgColumn<{
6534
+ name: "__latest_registration_start";
6535
+ tableName: "domains";
6536
+ dataType: "bigint";
6537
+ columnType: "PgEvmBigint";
6538
+ data: bigint;
6539
+ driverParam: string;
6540
+ notNull: true;
6541
+ hasDefault: true;
6542
+ isPrimaryKey: false;
6543
+ isAutoincrement: false;
6544
+ hasRuntimeDefault: false;
6545
+ enumValues: undefined;
6546
+ baseColumn: never;
6547
+ identity: undefined;
6548
+ generated: undefined;
6549
+ }, {}, {}>;
6550
+ __latestRegistrationExpiry: ponder.PgColumn<{
6551
+ name: "__latest_registration_expiry";
6552
+ tableName: "domains";
6553
+ dataType: "bigint";
6554
+ columnType: "PgEvmBigint";
6555
+ data: bigint;
6556
+ driverParam: string;
6557
+ notNull: true;
6558
+ hasDefault: true;
6559
+ isPrimaryKey: false;
6560
+ isAutoincrement: false;
6561
+ hasRuntimeDefault: false;
6562
+ enumValues: undefined;
6563
+ baseColumn: never;
6564
+ identity: undefined;
6565
+ generated: undefined;
6566
+ }, {}, {}>;
6473
6567
  };
6474
6568
  extra: {
6475
6569
  byType: drizzle_orm_pg_core.IndexBuilder;
@@ -6477,12 +6571,14 @@ declare const domain: ponder.OnchainTable<{
6477
6571
  byOwner: drizzle_orm_pg_core.IndexBuilder;
6478
6572
  byLabelHash: drizzle_orm_pg_core.IndexBuilder;
6479
6573
  byRegistryAndLabelHash: drizzle_orm_pg_core.IndexBuilder;
6480
- byRegistryAndCanonicalNameLeft: drizzle_orm_pg_core.IndexBuilder;
6574
+ byRegistryAndCanonicalNamePrefix: drizzle_orm_pg_core.IndexBuilder;
6481
6575
  byCanonicalNameExact: drizzle_orm_pg_core.IndexBuilder;
6482
- byCanonicalNameFuzzy: drizzle_orm_pg_core.IndexBuilder;
6576
+ byCanonicalNamePrefixFuzzy: drizzle_orm_pg_core.IndexBuilder;
6483
6577
  byCanonicalLabelHashPath: drizzle_orm_pg_core.IndexBuilder;
6484
6578
  byCanonicalNode: drizzle_orm_pg_core.IndexBuilder;
6485
6579
  byCanonicalDepth: drizzle_orm_pg_core.IndexBuilder;
6580
+ byRegistryAndLatestRegistrationStart: drizzle_orm_pg_core.IndexBuilder;
6581
+ byRegistryAndLatestRegistrationExpiry: drizzle_orm_pg_core.IndexBuilder;
6486
6582
  };
6487
6583
  dialect: "pg";
6488
6584
  }>;
@@ -7445,6 +7541,8 @@ declare const label_relations: drizzle_orm.Relations<"labels", {
7445
7541
  * for ENSDb, which is then used to build the ENSDb Schema for a Drizzle client for ENSDb.
7446
7542
  */
7447
7543
 
7544
+ declare const abstractEnsIndexerSchema_CANONICAL_NAME_PREFIX_LENGTH: typeof CANONICAL_NAME_PREFIX_LENGTH;
7545
+ declare const abstractEnsIndexerSchema_REGISTRATION_SORT_SENTINEL: typeof REGISTRATION_SORT_SENTINEL;
7448
7546
  declare const abstractEnsIndexerSchema_account: typeof account;
7449
7547
  declare const abstractEnsIndexerSchema_account_relations: typeof account_relations;
7450
7548
  declare const abstractEnsIndexerSchema_domain: typeof domain;
@@ -7553,8 +7651,9 @@ declare const abstractEnsIndexerSchema_subgraph_wrappedTransfer: typeof subgraph
7553
7651
  declare const abstractEnsIndexerSchema_subgraph_wrappedTransferRelations: typeof subgraph_wrappedTransferRelations;
7554
7652
  declare const abstractEnsIndexerSchema_subregistries: typeof subregistries;
7555
7653
  declare const abstractEnsIndexerSchema_subregistryRelations: typeof subregistryRelations;
7654
+ declare const abstractEnsIndexerSchema_truncateCanonicalNamePrefix: typeof truncateCanonicalNamePrefix;
7556
7655
  declare namespace abstractEnsIndexerSchema {
7557
- export { abstractEnsIndexerSchema_account as account, abstractEnsIndexerSchema_account_relations as account_relations, abstractEnsIndexerSchema_domain as domain, abstractEnsIndexerSchema_domainEvent as domainEvent, abstractEnsIndexerSchema_domainResolverRelation as domainResolverRelation, abstractEnsIndexerSchema_domainResolverRelation_relations as domainResolverRelation_relations, abstractEnsIndexerSchema_domainType as domainType, abstractEnsIndexerSchema_event as event, abstractEnsIndexerSchema_internal_registrarActionMetadata as internal_registrarActionMetadata, abstractEnsIndexerSchema_internal_registrarActionMetadataType as internal_registrarActionMetadataType, abstractEnsIndexerSchema_label as label, abstractEnsIndexerSchema_label_relations as label_relations, abstractEnsIndexerSchema_latestRegistrationIndex as latestRegistrationIndex, abstractEnsIndexerSchema_latestRegistrationIndex_relations as latestRegistrationIndex_relations, abstractEnsIndexerSchema_latestRenewalIndex as latestRenewalIndex, abstractEnsIndexerSchema_latestRenewalIndex_relations as latestRenewalIndex_relations, abstractEnsIndexerSchema_migratedNodeByNode as migratedNodeByNode, abstractEnsIndexerSchema_migratedNodeByParent as migratedNodeByParent, abstractEnsIndexerSchema_nameSales as nameSales, abstractEnsIndexerSchema_nameTokens as nameTokens, abstractEnsIndexerSchema_permissions as permissions, abstractEnsIndexerSchema_permissionsEvent as permissionsEvent, abstractEnsIndexerSchema_permissionsResource as permissionsResource, abstractEnsIndexerSchema_permissionsUser as permissionsUser, abstractEnsIndexerSchema_permissionsUserEvent as permissionsUserEvent, abstractEnsIndexerSchema_registrarActionRelations as registrarActionRelations, abstractEnsIndexerSchema_registrarActionType as registrarActionType, abstractEnsIndexerSchema_registrarActions as registrarActions, abstractEnsIndexerSchema_registration as registration, abstractEnsIndexerSchema_registrationLifecycleRelations as registrationLifecycleRelations, abstractEnsIndexerSchema_registrationLifecycles as registrationLifecycles, abstractEnsIndexerSchema_registrationType as registrationType, abstractEnsIndexerSchema_registration_relations as registration_relations, abstractEnsIndexerSchema_registry as registry, abstractEnsIndexerSchema_registryType as registryType, abstractEnsIndexerSchema_relations_domain as relations_domain, abstractEnsIndexerSchema_relations_permissions as relations_permissions, abstractEnsIndexerSchema_relations_permissionsResource as relations_permissionsResource, abstractEnsIndexerSchema_relations_permissionsUser as relations_permissionsUser, abstractEnsIndexerSchema_relations_registry as relations_registry, abstractEnsIndexerSchema_renewal as renewal, abstractEnsIndexerSchema_renewal_relations as renewal_relations, abstractEnsIndexerSchema_resolver as resolver, abstractEnsIndexerSchema_resolverAddressRecord as resolverAddressRecord, abstractEnsIndexerSchema_resolverAddressRecordRelations as resolverAddressRecordRelations, abstractEnsIndexerSchema_resolverEvent as resolverEvent, abstractEnsIndexerSchema_resolverRecords as resolverRecords, abstractEnsIndexerSchema_resolverRecords_relations as resolverRecords_relations, abstractEnsIndexerSchema_resolverTextRecord as resolverTextRecord, abstractEnsIndexerSchema_resolverTextRecordRelations as resolverTextRecordRelations, abstractEnsIndexerSchema_resolver_relations as resolver_relations, abstractEnsIndexerSchema_reverseNameRecord as reverseNameRecord, abstractEnsIndexerSchema_subgraph_abiChanged as subgraph_abiChanged, abstractEnsIndexerSchema_subgraph_abiChangedRelations as subgraph_abiChangedRelations, abstractEnsIndexerSchema_subgraph_account as subgraph_account, abstractEnsIndexerSchema_subgraph_accountRelations as subgraph_accountRelations, abstractEnsIndexerSchema_subgraph_addrChanged as subgraph_addrChanged, abstractEnsIndexerSchema_subgraph_addrChangedRelations as subgraph_addrChangedRelations, abstractEnsIndexerSchema_subgraph_authorisationChanged as subgraph_authorisationChanged, abstractEnsIndexerSchema_subgraph_authorisationChangedRelations as subgraph_authorisationChangedRelations, abstractEnsIndexerSchema_subgraph_contenthashChanged as subgraph_contenthashChanged, abstractEnsIndexerSchema_subgraph_contenthashChangedRelations as subgraph_contenthashChangedRelations, abstractEnsIndexerSchema_subgraph_domain as subgraph_domain, abstractEnsIndexerSchema_subgraph_domainRelations as subgraph_domainRelations, abstractEnsIndexerSchema_subgraph_expiryExtended as subgraph_expiryExtended, abstractEnsIndexerSchema_subgraph_expiryExtendedRelations as subgraph_expiryExtendedRelations, abstractEnsIndexerSchema_subgraph_fusesSet as subgraph_fusesSet, abstractEnsIndexerSchema_subgraph_fusesSetRelations as subgraph_fusesSetRelations, abstractEnsIndexerSchema_subgraph_interfaceChanged as subgraph_interfaceChanged, abstractEnsIndexerSchema_subgraph_interfaceChangedRelations as subgraph_interfaceChangedRelations, abstractEnsIndexerSchema_subgraph_multicoinAddrChanged as subgraph_multicoinAddrChanged, abstractEnsIndexerSchema_subgraph_multicoinAddrChangedRelations as subgraph_multicoinAddrChangedRelations, abstractEnsIndexerSchema_subgraph_nameChanged as subgraph_nameChanged, abstractEnsIndexerSchema_subgraph_nameChangedRelations as subgraph_nameChangedRelations, abstractEnsIndexerSchema_subgraph_nameRegistered as subgraph_nameRegistered, abstractEnsIndexerSchema_subgraph_nameRegisteredRelations as subgraph_nameRegisteredRelations, abstractEnsIndexerSchema_subgraph_nameRenewed as subgraph_nameRenewed, abstractEnsIndexerSchema_subgraph_nameRenewedRelations as subgraph_nameRenewedRelations, abstractEnsIndexerSchema_subgraph_nameTransferred as subgraph_nameTransferred, abstractEnsIndexerSchema_subgraph_nameTransferredRelations as subgraph_nameTransferredRelations, abstractEnsIndexerSchema_subgraph_nameUnwrapped as subgraph_nameUnwrapped, abstractEnsIndexerSchema_subgraph_nameUnwrappedRelations as subgraph_nameUnwrappedRelations, abstractEnsIndexerSchema_subgraph_nameWrapped as subgraph_nameWrapped, abstractEnsIndexerSchema_subgraph_nameWrappedRelations as subgraph_nameWrappedRelations, abstractEnsIndexerSchema_subgraph_newOwner as subgraph_newOwner, abstractEnsIndexerSchema_subgraph_newOwnerRelations as subgraph_newOwnerRelations, abstractEnsIndexerSchema_subgraph_newResolver as subgraph_newResolver, abstractEnsIndexerSchema_subgraph_newResolverRelations as subgraph_newResolverRelations, abstractEnsIndexerSchema_subgraph_newTTL as subgraph_newTTL, abstractEnsIndexerSchema_subgraph_newTTLRelations as subgraph_newTTLRelations, abstractEnsIndexerSchema_subgraph_pubkeyChanged as subgraph_pubkeyChanged, abstractEnsIndexerSchema_subgraph_pubkeyChangedRelations as subgraph_pubkeyChangedRelations, abstractEnsIndexerSchema_subgraph_registration as subgraph_registration, abstractEnsIndexerSchema_subgraph_registrationRelations as subgraph_registrationRelations, abstractEnsIndexerSchema_subgraph_resolver as subgraph_resolver, abstractEnsIndexerSchema_subgraph_resolverRelations as subgraph_resolverRelations, abstractEnsIndexerSchema_subgraph_textChanged as subgraph_textChanged, abstractEnsIndexerSchema_subgraph_textChangedRelations as subgraph_textChangedRelations, abstractEnsIndexerSchema_subgraph_transfer as subgraph_transfer, abstractEnsIndexerSchema_subgraph_transferRelations as subgraph_transferRelations, abstractEnsIndexerSchema_subgraph_versionChanged as subgraph_versionChanged, abstractEnsIndexerSchema_subgraph_versionChangedRelations as subgraph_versionChangedRelations, abstractEnsIndexerSchema_subgraph_wrappedDomain as subgraph_wrappedDomain, abstractEnsIndexerSchema_subgraph_wrappedDomainRelations as subgraph_wrappedDomainRelations, abstractEnsIndexerSchema_subgraph_wrappedTransfer as subgraph_wrappedTransfer, abstractEnsIndexerSchema_subgraph_wrappedTransferRelations as subgraph_wrappedTransferRelations, abstractEnsIndexerSchema_subregistries as subregistries, abstractEnsIndexerSchema_subregistryRelations as subregistryRelations };
7656
+ export { abstractEnsIndexerSchema_CANONICAL_NAME_PREFIX_LENGTH as CANONICAL_NAME_PREFIX_LENGTH, abstractEnsIndexerSchema_REGISTRATION_SORT_SENTINEL as REGISTRATION_SORT_SENTINEL, abstractEnsIndexerSchema_account as account, abstractEnsIndexerSchema_account_relations as account_relations, abstractEnsIndexerSchema_domain as domain, abstractEnsIndexerSchema_domainEvent as domainEvent, abstractEnsIndexerSchema_domainResolverRelation as domainResolverRelation, abstractEnsIndexerSchema_domainResolverRelation_relations as domainResolverRelation_relations, abstractEnsIndexerSchema_domainType as domainType, abstractEnsIndexerSchema_event as event, abstractEnsIndexerSchema_internal_registrarActionMetadata as internal_registrarActionMetadata, abstractEnsIndexerSchema_internal_registrarActionMetadataType as internal_registrarActionMetadataType, abstractEnsIndexerSchema_label as label, abstractEnsIndexerSchema_label_relations as label_relations, abstractEnsIndexerSchema_latestRegistrationIndex as latestRegistrationIndex, abstractEnsIndexerSchema_latestRegistrationIndex_relations as latestRegistrationIndex_relations, abstractEnsIndexerSchema_latestRenewalIndex as latestRenewalIndex, abstractEnsIndexerSchema_latestRenewalIndex_relations as latestRenewalIndex_relations, abstractEnsIndexerSchema_migratedNodeByNode as migratedNodeByNode, abstractEnsIndexerSchema_migratedNodeByParent as migratedNodeByParent, abstractEnsIndexerSchema_nameSales as nameSales, abstractEnsIndexerSchema_nameTokens as nameTokens, abstractEnsIndexerSchema_permissions as permissions, abstractEnsIndexerSchema_permissionsEvent as permissionsEvent, abstractEnsIndexerSchema_permissionsResource as permissionsResource, abstractEnsIndexerSchema_permissionsUser as permissionsUser, abstractEnsIndexerSchema_permissionsUserEvent as permissionsUserEvent, abstractEnsIndexerSchema_registrarActionRelations as registrarActionRelations, abstractEnsIndexerSchema_registrarActionType as registrarActionType, abstractEnsIndexerSchema_registrarActions as registrarActions, abstractEnsIndexerSchema_registration as registration, abstractEnsIndexerSchema_registrationLifecycleRelations as registrationLifecycleRelations, abstractEnsIndexerSchema_registrationLifecycles as registrationLifecycles, abstractEnsIndexerSchema_registrationType as registrationType, abstractEnsIndexerSchema_registration_relations as registration_relations, abstractEnsIndexerSchema_registry as registry, abstractEnsIndexerSchema_registryType as registryType, abstractEnsIndexerSchema_relations_domain as relations_domain, abstractEnsIndexerSchema_relations_permissions as relations_permissions, abstractEnsIndexerSchema_relations_permissionsResource as relations_permissionsResource, abstractEnsIndexerSchema_relations_permissionsUser as relations_permissionsUser, abstractEnsIndexerSchema_relations_registry as relations_registry, abstractEnsIndexerSchema_renewal as renewal, abstractEnsIndexerSchema_renewal_relations as renewal_relations, abstractEnsIndexerSchema_resolver as resolver, abstractEnsIndexerSchema_resolverAddressRecord as resolverAddressRecord, abstractEnsIndexerSchema_resolverAddressRecordRelations as resolverAddressRecordRelations, abstractEnsIndexerSchema_resolverEvent as resolverEvent, abstractEnsIndexerSchema_resolverRecords as resolverRecords, abstractEnsIndexerSchema_resolverRecords_relations as resolverRecords_relations, abstractEnsIndexerSchema_resolverTextRecord as resolverTextRecord, abstractEnsIndexerSchema_resolverTextRecordRelations as resolverTextRecordRelations, abstractEnsIndexerSchema_resolver_relations as resolver_relations, abstractEnsIndexerSchema_reverseNameRecord as reverseNameRecord, abstractEnsIndexerSchema_subgraph_abiChanged as subgraph_abiChanged, abstractEnsIndexerSchema_subgraph_abiChangedRelations as subgraph_abiChangedRelations, abstractEnsIndexerSchema_subgraph_account as subgraph_account, abstractEnsIndexerSchema_subgraph_accountRelations as subgraph_accountRelations, abstractEnsIndexerSchema_subgraph_addrChanged as subgraph_addrChanged, abstractEnsIndexerSchema_subgraph_addrChangedRelations as subgraph_addrChangedRelations, abstractEnsIndexerSchema_subgraph_authorisationChanged as subgraph_authorisationChanged, abstractEnsIndexerSchema_subgraph_authorisationChangedRelations as subgraph_authorisationChangedRelations, abstractEnsIndexerSchema_subgraph_contenthashChanged as subgraph_contenthashChanged, abstractEnsIndexerSchema_subgraph_contenthashChangedRelations as subgraph_contenthashChangedRelations, abstractEnsIndexerSchema_subgraph_domain as subgraph_domain, abstractEnsIndexerSchema_subgraph_domainRelations as subgraph_domainRelations, abstractEnsIndexerSchema_subgraph_expiryExtended as subgraph_expiryExtended, abstractEnsIndexerSchema_subgraph_expiryExtendedRelations as subgraph_expiryExtendedRelations, abstractEnsIndexerSchema_subgraph_fusesSet as subgraph_fusesSet, abstractEnsIndexerSchema_subgraph_fusesSetRelations as subgraph_fusesSetRelations, abstractEnsIndexerSchema_subgraph_interfaceChanged as subgraph_interfaceChanged, abstractEnsIndexerSchema_subgraph_interfaceChangedRelations as subgraph_interfaceChangedRelations, abstractEnsIndexerSchema_subgraph_multicoinAddrChanged as subgraph_multicoinAddrChanged, abstractEnsIndexerSchema_subgraph_multicoinAddrChangedRelations as subgraph_multicoinAddrChangedRelations, abstractEnsIndexerSchema_subgraph_nameChanged as subgraph_nameChanged, abstractEnsIndexerSchema_subgraph_nameChangedRelations as subgraph_nameChangedRelations, abstractEnsIndexerSchema_subgraph_nameRegistered as subgraph_nameRegistered, abstractEnsIndexerSchema_subgraph_nameRegisteredRelations as subgraph_nameRegisteredRelations, abstractEnsIndexerSchema_subgraph_nameRenewed as subgraph_nameRenewed, abstractEnsIndexerSchema_subgraph_nameRenewedRelations as subgraph_nameRenewedRelations, abstractEnsIndexerSchema_subgraph_nameTransferred as subgraph_nameTransferred, abstractEnsIndexerSchema_subgraph_nameTransferredRelations as subgraph_nameTransferredRelations, abstractEnsIndexerSchema_subgraph_nameUnwrapped as subgraph_nameUnwrapped, abstractEnsIndexerSchema_subgraph_nameUnwrappedRelations as subgraph_nameUnwrappedRelations, abstractEnsIndexerSchema_subgraph_nameWrapped as subgraph_nameWrapped, abstractEnsIndexerSchema_subgraph_nameWrappedRelations as subgraph_nameWrappedRelations, abstractEnsIndexerSchema_subgraph_newOwner as subgraph_newOwner, abstractEnsIndexerSchema_subgraph_newOwnerRelations as subgraph_newOwnerRelations, abstractEnsIndexerSchema_subgraph_newResolver as subgraph_newResolver, abstractEnsIndexerSchema_subgraph_newResolverRelations as subgraph_newResolverRelations, abstractEnsIndexerSchema_subgraph_newTTL as subgraph_newTTL, abstractEnsIndexerSchema_subgraph_newTTLRelations as subgraph_newTTLRelations, abstractEnsIndexerSchema_subgraph_pubkeyChanged as subgraph_pubkeyChanged, abstractEnsIndexerSchema_subgraph_pubkeyChangedRelations as subgraph_pubkeyChangedRelations, abstractEnsIndexerSchema_subgraph_registration as subgraph_registration, abstractEnsIndexerSchema_subgraph_registrationRelations as subgraph_registrationRelations, abstractEnsIndexerSchema_subgraph_resolver as subgraph_resolver, abstractEnsIndexerSchema_subgraph_resolverRelations as subgraph_resolverRelations, abstractEnsIndexerSchema_subgraph_textChanged as subgraph_textChanged, abstractEnsIndexerSchema_subgraph_textChangedRelations as subgraph_textChangedRelations, abstractEnsIndexerSchema_subgraph_transfer as subgraph_transfer, abstractEnsIndexerSchema_subgraph_transferRelations as subgraph_transferRelations, abstractEnsIndexerSchema_subgraph_versionChanged as subgraph_versionChanged, abstractEnsIndexerSchema_subgraph_versionChangedRelations as subgraph_versionChangedRelations, abstractEnsIndexerSchema_subgraph_wrappedDomain as subgraph_wrappedDomain, abstractEnsIndexerSchema_subgraph_wrappedDomainRelations as subgraph_wrappedDomainRelations, abstractEnsIndexerSchema_subgraph_wrappedTransfer as subgraph_wrappedTransfer, abstractEnsIndexerSchema_subgraph_wrappedTransferRelations as subgraph_wrappedTransferRelations, abstractEnsIndexerSchema_subregistries as subregistries, abstractEnsIndexerSchema_subregistryRelations as subregistryRelations, abstractEnsIndexerSchema_truncateCanonicalNamePrefix as truncateCanonicalNamePrefix };
7558
7657
  }
7559
7658
 
7560
- export { subgraph_abiChanged as $, registrarActionRelations as A, registrarActionType as B, registrarActions as C, registration as D, registrationLifecycleRelations as E, registrationLifecycles as F, registrationType as G, registration_relations as H, registry as I, registryType as J, relations_domain as K, relations_permissions as L, relations_permissionsResource as M, relations_permissionsUser as N, relations_registry as O, renewal as P, renewal_relations as Q, resolver as R, resolverAddressRecord as S, resolverAddressRecordRelations as T, resolverEvent as U, resolverRecords as V, resolverRecords_relations as W, resolverTextRecord as X, resolverTextRecordRelations as Y, resolver_relations as Z, reverseNameRecord as _, abstractEnsIndexerSchema as a, subgraph_abiChangedRelations as a0, subgraph_account as a1, subgraph_accountRelations as a2, subgraph_addrChanged as a3, subgraph_addrChangedRelations as a4, subgraph_authorisationChanged as a5, subgraph_authorisationChangedRelations as a6, subgraph_contenthashChanged as a7, subgraph_contenthashChangedRelations as a8, subgraph_domain as a9, subgraph_newTTLRelations as aA, subgraph_pubkeyChanged as aB, subgraph_pubkeyChangedRelations as aC, subgraph_registration as aD, subgraph_registrationRelations as aE, subgraph_resolver as aF, subgraph_resolverRelations as aG, subgraph_textChanged as aH, subgraph_textChangedRelations as aI, subgraph_transfer as aJ, subgraph_transferRelations as aK, subgraph_versionChanged as aL, subgraph_versionChangedRelations as aM, subgraph_wrappedDomain as aN, subgraph_wrappedDomainRelations as aO, subgraph_wrappedTransfer as aP, subgraph_wrappedTransferRelations as aQ, subregistries as aR, subregistryRelations as aS, subgraph_domainRelations as aa, subgraph_expiryExtended as ab, subgraph_expiryExtendedRelations as ac, subgraph_fusesSet as ad, subgraph_fusesSetRelations as ae, subgraph_interfaceChanged as af, subgraph_interfaceChangedRelations as ag, subgraph_multicoinAddrChanged as ah, subgraph_multicoinAddrChangedRelations as ai, subgraph_nameChanged as aj, subgraph_nameChangedRelations as ak, subgraph_nameRegistered as al, subgraph_nameRegisteredRelations as am, subgraph_nameRenewed as an, subgraph_nameRenewedRelations as ao, subgraph_nameTransferred as ap, subgraph_nameTransferredRelations as aq, subgraph_nameUnwrapped as ar, subgraph_nameUnwrappedRelations as as, subgraph_nameWrapped as at, subgraph_nameWrappedRelations as au, subgraph_newOwner as av, subgraph_newOwnerRelations as aw, subgraph_newResolver as ax, subgraph_newResolverRelations as ay, subgraph_newTTL as az, account as b, account_relations as c, domain as d, domainEvent as e, domainResolverRelation as f, domainResolverRelation_relations as g, domainType as h, event as i, internal_registrarActionMetadata as j, internal_registrarActionMetadataType as k, label as l, label_relations as m, latestRegistrationIndex as n, latestRegistrationIndex_relations as o, latestRenewalIndex as p, latestRenewalIndex_relations as q, migratedNodeByNode as r, migratedNodeByParent as s, nameSales as t, nameTokens as u, permissions as v, permissionsEvent as w, permissionsResource as x, permissionsUser as y, permissionsUserEvent as z };
7659
+ export { resolver_relations as $, registrarActionRelations as A, registrarActionType as B, CANONICAL_NAME_PREFIX_LENGTH as C, registrarActions as D, registration as E, registrationLifecycleRelations as F, registrationLifecycles as G, registrationType as H, registration_relations as I, registry as J, registryType as K, relations_domain as L, relations_permissions as M, relations_permissionsResource as N, relations_permissionsUser as O, relations_registry as P, renewal as Q, REGISTRATION_SORT_SENTINEL as R, renewal_relations as S, resolver as T, resolverAddressRecord as U, resolverAddressRecordRelations as V, resolverEvent as W, resolverRecords as X, resolverRecords_relations as Y, resolverTextRecord as Z, resolverTextRecordRelations as _, abstractEnsIndexerSchema as a, reverseNameRecord as a0, subgraph_abiChanged as a1, subgraph_abiChangedRelations as a2, subgraph_account as a3, subgraph_accountRelations as a4, subgraph_addrChanged as a5, subgraph_addrChangedRelations as a6, subgraph_authorisationChanged as a7, subgraph_authorisationChangedRelations as a8, subgraph_contenthashChanged as a9, subgraph_newResolverRelations as aA, subgraph_newTTL as aB, subgraph_newTTLRelations as aC, subgraph_pubkeyChanged as aD, subgraph_pubkeyChangedRelations as aE, subgraph_registration as aF, subgraph_registrationRelations as aG, subgraph_resolver as aH, subgraph_resolverRelations as aI, subgraph_textChanged as aJ, subgraph_textChangedRelations as aK, subgraph_transfer as aL, subgraph_transferRelations as aM, subgraph_versionChanged as aN, subgraph_versionChangedRelations as aO, subgraph_wrappedDomain as aP, subgraph_wrappedDomainRelations as aQ, subgraph_wrappedTransfer as aR, subgraph_wrappedTransferRelations as aS, subregistries as aT, subregistryRelations as aU, truncateCanonicalNamePrefix as aV, subgraph_contenthashChangedRelations as aa, subgraph_domain as ab, subgraph_domainRelations as ac, subgraph_expiryExtended as ad, subgraph_expiryExtendedRelations as ae, subgraph_fusesSet as af, subgraph_fusesSetRelations as ag, subgraph_interfaceChanged as ah, subgraph_interfaceChangedRelations as ai, subgraph_multicoinAddrChanged as aj, subgraph_multicoinAddrChangedRelations as ak, subgraph_nameChanged as al, subgraph_nameChangedRelations as am, subgraph_nameRegistered as an, subgraph_nameRegisteredRelations as ao, subgraph_nameRenewed as ap, subgraph_nameRenewedRelations as aq, subgraph_nameTransferred as ar, subgraph_nameTransferredRelations as as, subgraph_nameUnwrapped as at, subgraph_nameUnwrappedRelations as au, subgraph_nameWrapped as av, subgraph_nameWrappedRelations as aw, subgraph_newOwner as ax, subgraph_newOwnerRelations as ay, subgraph_newResolver as az, account as b, account_relations as c, domain as d, domainEvent as e, domainResolverRelation as f, domainResolverRelation_relations as g, domainType as h, event as i, internal_registrarActionMetadata as j, internal_registrarActionMetadataType as k, label as l, label_relations as m, latestRegistrationIndex as n, latestRegistrationIndex_relations as o, latestRenewalIndex as p, latestRenewalIndex_relations as q, migratedNodeByNode as r, migratedNodeByParent as s, nameSales as t, nameTokens as u, permissions as v, permissionsEvent as w, permissionsResource as x, permissionsUser as y, permissionsUserEvent as z };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { EnsDbPublicConfig, IndexingMetadataContext, IndexingMetadataContextInitialized, Unvalidated } from '@ensnode/ensnode-sdk';
2
2
  export { IndexingMetadataContext, IndexingMetadataContextInitialized, IndexingMetadataContextStatusCodes, IndexingMetadataContextUninitialized } from '@ensnode/ensnode-sdk';
3
3
  import { NodePgDatabase } from 'drizzle-orm/node-postgres';
4
- import { a as abstractEnsIndexerSchema } from './index-1D8_3_7g.js';
4
+ import { a as abstractEnsIndexerSchema } from './index-DH9e7wPl.js';
5
5
  import { e as ensNodeSchema } from './index-BHoa233Z.js';
6
6
  import 'ponder';
7
7
  import 'drizzle-orm';
package/dist/index.js CHANGED
@@ -7,6 +7,8 @@ var __export = (target, all) => {
7
7
  // src/ensindexer-abstract/index.ts
8
8
  var ensindexer_abstract_exports = {};
9
9
  __export(ensindexer_abstract_exports, {
10
+ CANONICAL_NAME_PREFIX_LENGTH: () => CANONICAL_NAME_PREFIX_LENGTH,
11
+ REGISTRATION_SORT_SENTINEL: () => REGISTRATION_SORT_SENTINEL,
10
12
  account: () => account,
11
13
  account_relations: () => account_relations,
12
14
  domain: () => domain,
@@ -114,7 +116,8 @@ __export(ensindexer_abstract_exports, {
114
116
  subgraph_wrappedTransfer: () => subgraph_wrappedTransfer,
115
117
  subgraph_wrappedTransferRelations: () => subgraph_wrappedTransferRelations,
116
118
  subregistries: () => subregistries,
117
- subregistryRelations: () => subregistryRelations
119
+ subregistryRelations: () => subregistryRelations,
120
+ truncateCanonicalNamePrefix: () => truncateCanonicalNamePrefix
118
121
  });
119
122
 
120
123
  // src/ensindexer-abstract/migrated-nodes.schema.ts
@@ -181,7 +184,13 @@ var resolver = onchainTable2(
181
184
  // keyed by (chainId, address)
182
185
  id: t.text().primaryKey().$type(),
183
186
  chainId: t.int8({ mode: "number" }).notNull().$type(),
184
- address: t.hex().notNull().$type()
187
+ address: t.hex().notNull().$type(),
188
+ /**
189
+ * Whether this Resolver implements ENSIP-10 wildcard resolution (`IExtendedResolver`,
190
+ * interfaceId `0x9061b923`), determined via a single `supportsInterface` RPC the first
191
+ * time the Resolver is observed (see `upsertResolver`).
192
+ */
193
+ isExtended: t.boolean().notNull().default(false)
185
194
  }),
186
195
  (t) => ({
187
196
  byId: uniqueIndex().on(t.chainId, t.address)
@@ -252,12 +261,12 @@ var resolverAddressRecord = onchainTable2(
252
261
  // stored as BigInt
253
262
  coinType: t.bigint().notNull(),
254
263
  /**
255
- * Represents the value of the Addresss Record specified by ((chainId, resolver, node), coinType).
264
+ * Represents the value of the Address Record specified by ((chainId, resolver, node), coinType).
256
265
  *
257
266
  * The value of this field is interpreted by `interpretAddressRecordValue` — see its implementation
258
267
  * for additional context and specific guarantees.
259
268
  */
260
- value: t.text().notNull()
269
+ value: t.hex().notNull()
261
270
  }),
262
271
  (t) => ({
263
272
  pk: primaryKey2({ columns: [t.chainId, t.address, t.node, t.coinType] })
@@ -1688,7 +1697,19 @@ var relations_registry = relations4(registry, ({ one, many }) => ({
1688
1697
  references: [permissions.chainId, permissions.address]
1689
1698
  })
1690
1699
  }));
1700
+ var REGISTRATION_SORT_SENTINEL = 2n ** 256n - 1n;
1691
1701
  var domainType = onchainEnum2("DomainType", ["ENSv1Domain", "ENSv2Domain"]);
1702
+ var CANONICAL_NAME_PREFIX_LENGTH = 64;
1703
+ function truncateCanonicalNamePrefix(name) {
1704
+ if (name === null) return null;
1705
+ let prefix = "";
1706
+ let count = 0;
1707
+ for (const codePoint of name) {
1708
+ prefix += codePoint;
1709
+ if (++count >= CANONICAL_NAME_PREFIX_LENGTH) break;
1710
+ }
1711
+ return prefix;
1712
+ }
1692
1713
  var domain = onchainTable6(
1693
1714
  "domains",
1694
1715
  (t) => ({
@@ -1720,6 +1741,18 @@ var domain = onchainTable6(
1720
1741
  * @example "vitalik.eth"
1721
1742
  */
1722
1743
  canonicalName: t.text().$type(),
1744
+ /**
1745
+ * Materialized prefix of `canonicalName` (first {@link CANONICAL_NAME_PREFIX_LENGTH} code
1746
+ * points), NULL iff `canonical = false`. Maintained by `canonicality-db-helpers.ts`.
1747
+ *
1748
+ * Powers left-anchored / substring search (`__canonical_name_prefix LIKE 'vit%'`) and NAME
1749
+ * ordering without `canonical_name`'s full-length btree size hazard. The `__` prefix marks it
1750
+ * an internal implementation detail (mirrors `Registry.__hasChildren`); query `canonical_name`
1751
+ * for exact matches and display.
1752
+ *
1753
+ * @example "vitalik.eth"
1754
+ */
1755
+ __canonicalNamePrefix: t.text("__canonical_name_prefix").$type(),
1723
1756
  /**
1724
1757
  * Materialized Canonical LabelHashPath, NULL iff `canonical = false`.
1725
1758
  * Maintained by `canonicality-db-helpers.ts`.
@@ -1748,7 +1781,29 @@ var domain = onchainTable6(
1748
1781
  *
1749
1782
  * @dev the computed Node (via `namehash`) of this Domain's Canonical Name.
1750
1783
  */
1751
- canonicalNode: t.hex().$type()
1784
+ canonicalNode: t.hex().$type(),
1785
+ /**
1786
+ * Materialized `start` of this Domain's latest Registration, or {@link REGISTRATION_SORT_SENTINEL}
1787
+ * when the Domain has no Registration. Mirror of the latest `registration.start` (see
1788
+ * `latestRegistrationIndex`), maintained inline by `registration-db-helpers.ts`.
1789
+ *
1790
+ * @dev Exists purely so REGISTRATION_TIMESTAMP-ordered find-domains queries can use the
1791
+ * `(registry_id, __latest_registration_start, id)` composite index instead of joining through
1792
+ * `latest_registration_indexes` → `registrations` and sorting. Held NOT NULL (absent → sentinel)
1793
+ * so the keyset stays a plain tuple compare with no NULL-placement special casing; see
1794
+ * find-domains-resolver-helpers.ts. Double-underscore prefix marks it as an internal
1795
+ * materialized mirror, not part of the on-chain protocol surface; the canonical (possibly null)
1796
+ * value lives on the Registration entity.
1797
+ */
1798
+ __latestRegistrationStart: t.bigint("__latest_registration_start").notNull().default(REGISTRATION_SORT_SENTINEL),
1799
+ /**
1800
+ * Materialized `expiry` of this Domain's latest Registration, or {@link REGISTRATION_SORT_SENTINEL}
1801
+ * when the Domain has no Registration or its latest Registration never expires (effectively +∞).
1802
+ * Mirror of the latest `registration.expiry`, maintained inline by `registration-db-helpers.ts`.
1803
+ *
1804
+ * @dev See `__latestRegistrationStart`. Backs REGISTRATION_EXPIRY-ordered queries.
1805
+ */
1806
+ __latestRegistrationExpiry: t.bigint("__latest_registration_expiry").notNull().default(REGISTRATION_SORT_SENTINEL)
1752
1807
  // NOTE: Domain-Resolver Relations tracked via Protocol Acceleration plugin
1753
1808
  }),
1754
1809
  (t) => ({
@@ -1760,29 +1815,40 @@ var domain = onchainTable6(
1760
1815
  // get-domain-by-interpreted-name.ts). The leading `registry_id` column also serves
1761
1816
  // `WHERE registry_id = X` lookups via prefix scan.
1762
1817
  byRegistryAndLabelHash: index5().on(t.registryId, t.labelHash),
1763
- // composite for `WHERE registry_id = X ORDER BY canonical_name LIMIT N` (Domain.subdomains
1764
- // and other find-domains queries when ordering by NAME). Uses `left(canonical_name, 256)`
1765
- // to bound the index tuple under btree's per-tuple max (~2712 bytes): 256 chars × max 4-byte
1766
- // UTF-8 = 1024 bytes, leaving ample room for the registry_id and id columns. Names beyond
1767
- // 256 chars (currently <0.0001% of mainnet) collide on the truncated prefix and tie-break by
1768
- // id; this is acceptable since such names are invariably spam. Callers MUST sort by the same
1769
- // expression for the planner to use this index for ordered scan.
1770
- byRegistryAndCanonicalNameLeft: index5().on(
1771
- t.registryId,
1772
- sql2`left(${t.canonicalName}, 256)`,
1773
- t.id
1774
- ),
1818
+ // composite for `WHERE registry_id = X ORDER BY __canonical_name_prefix LIMIT N` (Domain.subdomains
1819
+ // and other find-domains queries when ordering by NAME). The length-capped prefix keeps the
1820
+ // index tuple under btree's per-tuple max (~2712 bytes); 64 code points × max 4-byte UTF-8 =
1821
+ // 256 bytes, leaving ample room for the registry_id and id columns.
1822
+ byRegistryAndCanonicalNamePrefix: index5().on(t.registryId, t.__canonicalNamePrefix, t.id),
1775
1823
  // hash index avoids the btree 8191-byte row-size hazard for spam names
1776
1824
  byCanonicalNameExact: index5().using("hash", t.canonicalName),
1777
- // GIN trigram index for substring / similarity queries (inline `gin_trgm_ops` via `sql`
1778
- // because passing it through `.op()` gets dropped by Ponder)
1779
- byCanonicalNameFuzzy: index5().using("gin", sql2`${t.canonicalName} gin_trgm_ops`),
1825
+ // GIN trigram on the length-capped prefix for left-anchored (`LIKE 'vit%'`) and substring
1826
+ // search (inline `gin_trgm_ops` via `sql` because passing it through `.op()` gets dropped by
1827
+ // Ponder)
1828
+ byCanonicalNamePrefixFuzzy: index5().using("gin", sql2`${t.__canonicalNamePrefix} gin_trgm_ops`),
1780
1829
  // GIN containment for `cascadeLabelHeal`'s `canonical_label_hash_path @> ARRAY[lh]` lookup
1781
1830
  byCanonicalLabelHashPath: index5().using("gin", t.canonicalLabelHashPath),
1782
1831
  // hash index for resolver-record → canonical-domain joins
1783
1832
  byCanonicalNode: index5().using("hash", t.canonicalNode),
1784
1833
  // btree for ORDER BY canonical_depth (typeahead and DEPTH-ordered browse)
1785
- byCanonicalDepth: index5().on(t.canonicalDepth)
1834
+ byCanonicalDepth: index5().on(t.canonicalDepth),
1835
+ // Composites for `WHERE registry_id = X ORDER BY <latest registration value> LIMIT N`
1836
+ // (REGISTRATION_TIMESTAMP / REGISTRATION_EXPIRY ordering in find-domains queries). The latest
1837
+ // registration's start/expiry is mirrored onto the Domain row (see `__latestRegistration*`) so
1838
+ // the order is an index-ordered scan, not a join through `latest_registration_indexes` →
1839
+ // `registrations` followed by a sort. The columns are NOT NULL (absent → `REGISTRATION_SORT_SENTINEL`),
1840
+ // so a single plain composite per column serves both ASC and DESC (forward / backward scan) with
1841
+ // a plain keyset tuple — see find-domains-resolver-helpers.ts.
1842
+ byRegistryAndLatestRegistrationStart: index5().on(
1843
+ t.registryId,
1844
+ t.__latestRegistrationStart,
1845
+ t.id
1846
+ ),
1847
+ byRegistryAndLatestRegistrationExpiry: index5().on(
1848
+ t.registryId,
1849
+ t.__latestRegistrationExpiry,
1850
+ t.id
1851
+ )
1786
1852
  })
1787
1853
  );
1788
1854
  var relations_domain = relations4(domain, ({ one, many }) => ({
@@ -1834,7 +1900,7 @@ var registration = onchainTable6(
1834
1900
  start: t.bigint().notNull(),
1835
1901
  // may have an expiry
1836
1902
  expiry: t.bigint(),
1837
- // maybe have a grace period (BaseRegistrar)
1903
+ // may have a grace period (BaseRegistrar)
1838
1904
  gracePeriod: t.bigint(),
1839
1905
  // registrar AccountId
1840
1906
  registrarChainId: t.int8({ mode: "number" }).notNull().$type(),