@ensnode/ensdb-sdk 1.10.1 → 1.11.1

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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ensindexer-abstract/index.ts","../src/ensindexer-abstract/ensv2.schema.ts","../src/ensindexer-abstract/protocol-acceleration.schema.ts","../src/ensindexer-abstract/registrars.schema.ts","../src/ensindexer-abstract/subgraph.schema.ts","../src/lib/collate.ts","../src/ensindexer-abstract/tokenscope.schema.ts","../src/ensnode/index.ts","../src/lib/drizzle.ts","../src/lib/checksum.ts","../src/client/ensdb-config.ts","../src/client/ensdb-reader.ts","../src/lib/parse-pg-version-info.ts","../src/client/ensnode-metadata.ts","../src/client/ensdb-writer.ts","../src/client/validate/ensdb-config.ts","../src/client/zod-schemas/ensdb-config.ts"],"sourcesContent":["/**\n * Merge the various sub-schemas into an \"abstract\" ENSIndexer Schema.\n * This \"abstract\" ENSIndexer Schema is used to build the \"concrete\" ENSIndexer Schema\n * for ENSDb, which is then used to build the ENSDb Schema for a Drizzle client for ENSDb.\n */\n\nexport * from \"./ensv2.schema\";\nexport * from \"./protocol-acceleration.schema\";\nexport * from \"./registrars.schema\";\nexport * from \"./subgraph.schema\";\nexport * from \"./tokenscope.schema\";\n","import type {\n Address,\n ChainId,\n DomainId,\n ENSv1DomainId,\n ENSv2DomainId,\n InterpretedLabel,\n LabelHash,\n PermissionsId,\n PermissionsResourceId,\n PermissionsUserId,\n RegistrationId,\n RegistryId,\n RenewalId,\n ResolverId,\n} from \"enssdk\";\nimport { index, onchainEnum, onchainTable, primaryKey, relations, sql, uniqueIndex } from \"ponder\";\nimport type { BlockNumber, Hash } from \"viem\";\n\nimport type { EncodedReferrer } from \"@ensnode/ensnode-sdk\";\n\n/**\n * The ENSv2 Schema\n *\n * While the initial approach was a highly materialized view of the ENS protocol, abstracting away\n * as many on-chain details as possible, in practice—due to the sheer complexity of the protocol at\n * resolution-time—it becomes more or less impossible to appropriately materialize the canonical\n * namegraph.\n *\n * As a result, this schema takes a balanced approach. It mimics on-chain state as closely as possible,\n * with the obvious exception of materializing specific state that must trivially filterable. Then,\n * resolution-time logic is applied on _top_ of this index, at query-time, mimicking ENS's own resolution-time\n * behavior. This forces our implementation to match the protocol as closely as possible, with the\n * obvious note that the performance tradeoffs of evm code and our app are different. For example,\n * it's more expensive for us to recursively traverse the namegraph (like evm code does) because our\n * individual roundtrips from the db are relatively more expensive.\n *\n * For the datamodel, this means that instead of a polymorphic Domain entity, representing both v1\n * and v2 Domains, this schema employs separate (but overlapping) v1Domains and v2Domains entities.\n * This avoids resolution-time complications and more accurately represents the on-chain state.\n * Domain polymorphism is applied at the API later, via GraphQL Interfaces, to simplify queries.\n *\n * In general: the indexed schema should match on-chain state as closely as possible, and\n * resolution-time behavior within the ENS protocol should _also_ be implemented at resolution time\n * in ENSApi. The current obvious exception to this is that v1Domain.owner is the _materialized_\n * _effective_ owner of the v1Domain. ENSv1 includes a mind-boggling number of ways to 'own' a v1Domain,\n * including the ENSv1 Registry, various Registrars, and the NameWrapper. The ENSv1 indexing logic\n * within this ENSv2 plugin materialize the v1Domain's effective owner to simplify this aspect of ENS,\n * and enable efficient queries against v1Domain.owner.\n *\n * Many datamodels are shared between ENSv1 and ENSv2, including Registrations, Renewals, and Resolvers.\n *\n * Registrations are polymorphic between the defined RegistrationTypes, depending on the associated\n * guarantees (for example, ENSv1 BaseRegistrar Registrations may have a gracePeriod, but ENSv2\n * Registry Registrations do not).\n *\n * Instead of materializing a Domain's name at any point, we maintain an internal rainbow table of\n * labelHash -> InterpretedLabel (the Label entity). This ensures that regardless of how or when a\n * new label is encountered onchain, all Domains that use that label are automatically healed at\n * resolution-time.\n *\n * v1Domains exist in a flat namespace and are absolutely addressed by `node`. As such, they describe\n * a simple tree datamodel of:\n * v1Domain -> v1Domain(s) -> v1Domain(s) -> ...etc\n *\n * v2Domains exist in a set of namegraphs. Each namegraph is a possibly cicular directed graph of\n * (Root)Registry -> v2Domain(s) -> (sub)Regsitry -> v2Domain(s) -> ...etc\n * with exactly one RootRegistry on the ENS Root Chain establishing the beginning of the _canonical_\n * namegraph. As discussed above, the canonical namegraph is never materialized, only _navigated_\n * at resolution-time, in order to correctly implement the complexities of the ENS protocol.\n *\n * Note also that the Protocol Acceleration plugin is a hard requirement for the ENSv2 plugin. This\n * allows us to rely on the shared logic for indexing:\n * a) ENSv1RegistryOld -> ENSv1Registry migration status\n * b) Domain-Resolver Relations for both v1Domains and v2Domains\n * As such, none of that information is present in this ensv2.schema.ts file.\n *\n * In general, entities are keyed by a nominally-typed `id` that uniquely references them. This\n * allows us to trivially implement cursor-based pagination and allow consumers to reference these\n * deeply nested entities by a straightforward string ID. In cases where an entity's `id` is composed\n * of multiple pieces of information (for example, a Registry is identified by (chainId, address)),\n * then that information is, as well, included in the entity's columns, not just encoded in the id.\n *\n * Events are structured as a single \"events\" table which tracks EVM Event Metadata for any on-chain\n * Event. Then, join tables (DomainEvent, ResolverEvent, etc) track the relationship between an\n * entity that has many events (Domain, Resolver) to the relevant set of Events.\n *\n * A Registration references the event that initiated the Registration. A Renewal, too, references\n * the Event responsible for its existence.\n */\n\n//////////\n// Events\n//////////\n\nexport const event = onchainTable(\n \"events\",\n (t) => ({\n // Ponder's event.id\n id: t.text().primaryKey(),\n\n // Event Log Metadata\n\n // chain\n chainId: t.integer().notNull().$type<ChainId>(),\n\n // block\n blockNumber: t.bigint().notNull().$type<BlockNumber>(),\n blockHash: t.hex().notNull().$type<Hash>(),\n timestamp: t.bigint().notNull(),\n\n // transaction\n transactionHash: t.hex().notNull().$type<Hash>(),\n transactionIndex: t.integer().notNull(),\n from: t.hex().notNull().$type<Address>(),\n to: t.hex().$type<Address>(), // NOTE: a null `to` means this was a tx that deployed a contract\n\n // log\n address: t.hex().notNull().$type<Address>(),\n logIndex: t.integer().notNull().$type<number>(),\n selector: t.hex().notNull().$type<Hash>(),\n topics: t.hex().array().notNull().$type<[Hash, ...Hash[]]>(),\n data: t.hex().notNull(),\n }),\n (t) => ({\n bySelector: index().on(t.selector),\n byFrom: index().on(t.from),\n byTimestamp: index().on(t.timestamp),\n }),\n);\n\nexport const domainEvent = onchainTable(\n \"domain_events\",\n (t) => ({\n domainId: t.text().notNull().$type<DomainId>(),\n eventId: t.text().notNull(),\n }),\n (t) => ({ pk: primaryKey({ columns: [t.domainId, t.eventId] }) }),\n);\n\nexport const resolverEvent = onchainTable(\n \"resolver_events\",\n (t) => ({\n resolverId: t.text().notNull().$type<ResolverId>(),\n eventId: t.text().notNull(),\n }),\n (t) => ({ pk: primaryKey({ columns: [t.resolverId, t.eventId] }) }),\n);\n\nexport const permissionsEvent = onchainTable(\n \"permissions_events\",\n (t) => ({\n permissionsId: t.text().notNull().$type<PermissionsId>(),\n eventId: t.text().notNull(),\n }),\n (t) => ({ pk: primaryKey({ columns: [t.permissionsId, t.eventId] }) }),\n);\n\n///////////\n// Account\n///////////\n\nexport const account = onchainTable(\"accounts\", (t) => ({\n id: t.hex().primaryKey().$type<Address>(),\n}));\n\nexport const account_relations = relations(account, ({ many }) => ({\n registrations: many(registration, { relationName: \"registrant\" }),\n domains: many(v2Domain),\n permissions: many(permissionsUser),\n}));\n\n////////////\n// Registry\n////////////\n\nexport const registry = onchainTable(\n \"registries\",\n (t) => ({\n // see RegistryId for guarantees\n id: t.text().primaryKey().$type<RegistryId>(),\n\n chainId: t.integer().notNull().$type<ChainId>(),\n address: t.hex().notNull().$type<Address>(),\n }),\n (t) => ({\n byId: uniqueIndex().on(t.chainId, t.address),\n }),\n);\n\nexport const relations_registry = relations(registry, ({ one, many }) => ({\n domain: one(v2Domain, {\n relationName: \"subregistry\",\n fields: [registry.id],\n references: [v2Domain.registryId],\n }),\n domains: many(v2Domain, { relationName: \"registry\" }),\n permissions: one(permissions, {\n relationName: \"permissions\",\n fields: [registry.chainId, registry.address],\n references: [permissions.chainId, permissions.address],\n }),\n}));\n\n///////////\n// Domains\n///////////\n\nexport const v1Domain = onchainTable(\n \"v1_domains\",\n (t) => ({\n // keyed by node, see ENSv1DomainId for guarantees.\n id: t.text().primaryKey().$type<ENSv1DomainId>(),\n\n // must have a parent v1Domain (note: root node does not exist in index)\n parentId: t.text().notNull().$type<ENSv1DomainId>(),\n\n // may have an owner\n ownerId: t.hex().$type<Address>(),\n\n // represents a labelHash\n labelHash: t.hex().notNull().$type<LabelHash>(),\n\n // may have a `rootRegistryOwner` (ENSv1Registry's owner()), zeroAddress interpreted as null\n rootRegistryOwnerId: t.hex().$type<Address>(),\n\n // NOTE: Domain-Resolver Relations tracked via Protocol Acceleration plugin\n }),\n (t) => ({\n byParent: index().on(t.parentId),\n byOwner: index().on(t.ownerId),\n byLabelHash: index().on(t.labelHash),\n }),\n);\n\nexport const relations_v1Domain = relations(v1Domain, ({ one, many }) => ({\n // v1Domain\n parent: one(v1Domain, {\n fields: [v1Domain.parentId],\n references: [v1Domain.id],\n }),\n children: many(v1Domain, { relationName: \"parent\" }),\n rootRegistryOwner: one(account, {\n relationName: \"rootRegistryOwner\",\n fields: [v1Domain.rootRegistryOwnerId],\n references: [account.id],\n }),\n\n // shared\n owner: one(account, {\n relationName: \"owner\",\n fields: [v1Domain.ownerId],\n references: [account.id],\n }),\n label: one(label, {\n relationName: \"label\",\n fields: [v1Domain.labelHash],\n references: [label.labelHash],\n }),\n registrations: many(registration),\n}));\n\nexport const v2Domain = onchainTable(\n \"v2_domains\",\n (t) => ({\n // see ENSv2DomainId for guarantees\n id: t.text().primaryKey().$type<ENSv2DomainId>(),\n\n // has a tokenId\n tokenId: t.bigint().notNull(),\n\n // belongs to registry\n registryId: t.text().notNull().$type<RegistryId>(),\n\n // may have one subregistry\n subregistryId: t.text().$type<RegistryId>(),\n\n // may have an owner\n ownerId: t.hex().$type<Address>(),\n\n // represents a labelHash\n labelHash: t.hex().notNull().$type<LabelHash>(),\n\n // NOTE: Domain-Resolver Relations tracked via Protocol Acceleration plugin\n }),\n (t) => ({\n byRegistry: index().on(t.registryId),\n bySubregistry: index().on(t.subregistryId).where(sql`${t.subregistryId} IS NOT NULL`),\n byOwner: index().on(t.ownerId),\n byLabelHash: index().on(t.labelHash),\n }),\n);\n\nexport const relations_v2Domain = relations(v2Domain, ({ one, many }) => ({\n // v2Domain\n registry: one(registry, {\n relationName: \"registry\",\n fields: [v2Domain.registryId],\n references: [registry.id],\n }),\n subregistry: one(registry, {\n relationName: \"subregistry\",\n fields: [v2Domain.subregistryId],\n references: [registry.id],\n }),\n\n // shared\n owner: one(account, {\n relationName: \"owner\",\n fields: [v2Domain.ownerId],\n references: [account.id],\n }),\n label: one(label, {\n relationName: \"label\",\n fields: [v2Domain.labelHash],\n references: [label.labelHash],\n }),\n registrations: many(registration),\n}));\n\n/////////////////\n// Registrations\n/////////////////\n\nexport const registrationType = onchainEnum(\"RegistrationType\", [\n // TODO: prefix these with ENSv1, maybe excluding ThreeDNS\n \"NameWrapper\",\n \"BaseRegistrar\",\n \"ThreeDNS\",\n \"ENSv2RegistryRegistration\",\n \"ENSv2RegistryReservation\",\n]);\n\nexport const registration = onchainTable(\n \"registrations\",\n (t) => ({\n // keyed by (domainId, registrationIndex)\n id: t.text().primaryKey().$type<RegistrationId>(),\n\n domainId: t.text().notNull().$type<DomainId>(),\n registrationIndex: t.integer().notNull(),\n\n // has a type\n type: registrationType().notNull(),\n\n // has a start\n start: t.bigint().notNull(),\n // may have an expiry\n expiry: t.bigint(),\n // maybe have a grace period (BaseRegistrar)\n gracePeriod: t.bigint(),\n\n // registrar AccountId\n registrarChainId: t.integer().notNull().$type<ChainId>(),\n registrarAddress: t.hex().notNull().$type<Address>(),\n\n // may reference a registrant\n registrantId: t.hex().$type<Address>(),\n\n // may reference an unregistrant\n unregistrantId: t.hex().$type<Address>(),\n\n // may have referrer data\n referrer: t.hex().$type<EncodedReferrer>(),\n\n // may have fuses (NameWrapper, Wrapped BaseRegistrar)\n fuses: t.integer(),\n\n // TODO(paymentToken): add payment token tracking here\n\n // may have base cost (BaseRegistrar, ENSv2Registrar)\n base: t.bigint(),\n\n // may have a premium (BaseRegistrar)\n premium: t.bigint(),\n\n // may be Wrapped (BaseRegistrar)\n wrapped: t.boolean().default(false),\n\n // has an event\n eventId: t.text().notNull(),\n }),\n (t) => ({\n byId: uniqueIndex().on(t.domainId, t.registrationIndex),\n }),\n);\n\nexport const latestRegistrationIndex = onchainTable(\"latest_registration_indexes\", (t) => ({\n domainId: t.text().primaryKey().$type<DomainId>(),\n registrationIndex: t.integer().notNull(),\n}));\n\nexport const registration_relations = relations(registration, ({ one, many }) => ({\n // belongs to either v1Domain or v2Domain\n v1Domain: one(v1Domain, {\n fields: [registration.domainId],\n references: [v1Domain.id],\n }),\n v2Domain: one(v2Domain, {\n fields: [registration.domainId],\n references: [v2Domain.id],\n }),\n\n // has one registrant\n registrant: one(account, {\n fields: [registration.registrantId],\n references: [account.id],\n relationName: \"registrant\",\n }),\n\n // has one unregistrant\n unregistrant: one(account, {\n fields: [registration.unregistrantId],\n references: [account.id],\n relationName: \"unregistrant\",\n }),\n\n // has many renewals\n renewals: many(renewal),\n\n // has an event\n event: one(event, {\n fields: [registration.eventId],\n references: [event.id],\n }),\n}));\n\n////////////\n// Renewals\n////////////\n\nexport const renewal = onchainTable(\n \"renewals\",\n (t) => ({\n // keyed by (registrationId, index)\n id: t.text().primaryKey().$type<RenewalId>(),\n\n domainId: t.text().notNull().$type<DomainId>(),\n registrationIndex: t.integer().notNull(),\n renewalIndex: t.integer().notNull(),\n\n // all renewals have a duration\n duration: t.bigint().notNull(),\n\n // may have a referrer\n referrer: t.hex().$type<EncodedReferrer>(),\n\n // TODO(paymentToken): add payment token tracking here\n\n // may have base cost\n base: t.bigint(),\n\n // may have a premium (ENSv1 RegistrarControllers)\n premium: t.bigint(),\n\n // has an event\n eventId: t.text().notNull(),\n }),\n (t) => ({\n byId: uniqueIndex().on(t.domainId, t.registrationIndex, t.renewalIndex),\n }),\n);\n\nexport const renewal_relations = relations(renewal, ({ one }) => ({\n // belongs to registration\n registration: one(registration, {\n fields: [renewal.domainId, renewal.registrationIndex],\n references: [registration.domainId, registration.registrationIndex],\n }),\n\n // has an event\n event: one(event, {\n fields: [renewal.eventId],\n references: [event.id],\n }),\n}));\n\nexport const latestRenewalIndex = onchainTable(\n \"latest_renewal_indexes\",\n (t) => ({\n domainId: t.text().notNull().$type<DomainId>(),\n registrationIndex: t.integer().notNull(),\n renewalIndex: t.integer().notNull(),\n }),\n (t) => ({ pk: primaryKey({ columns: [t.domainId, t.registrationIndex] }) }),\n);\n\n///////////////\n// Permissions\n///////////////\n\nexport const permissions = onchainTable(\n \"permissions\",\n (t) => ({\n id: t.text().primaryKey().$type<PermissionsId>(),\n\n chainId: t.integer().notNull().$type<ChainId>(),\n address: t.hex().notNull().$type<Address>(),\n }),\n (t) => ({\n byId: uniqueIndex().on(t.chainId, t.address),\n }),\n);\n\nexport const relations_permissions = relations(permissions, ({ many }) => ({\n resources: many(permissionsResource),\n users: many(permissionsUser),\n}));\n\nexport const permissionsResource = onchainTable(\n \"permissions_resources\",\n (t) => ({\n id: t.text().primaryKey().$type<PermissionsResourceId>(),\n\n chainId: t.integer().notNull().$type<ChainId>(),\n address: t.hex().notNull().$type<Address>(),\n resource: t.bigint().notNull(),\n }),\n (t) => ({\n byId: uniqueIndex().on(t.chainId, t.address, t.resource),\n }),\n);\n\nexport const relations_permissionsResource = relations(permissionsResource, ({ one }) => ({\n permissions: one(permissions, {\n fields: [permissionsResource.chainId, permissionsResource.address],\n references: [permissions.chainId, permissions.address],\n }),\n}));\n\nexport const permissionsUser = onchainTable(\n \"permissions_users\",\n (t) => ({\n id: t.text().primaryKey().$type<PermissionsUserId>(),\n\n chainId: t.integer().notNull().$type<ChainId>(),\n address: t.hex().notNull().$type<Address>(),\n resource: t.bigint().notNull(),\n user: t.hex().notNull().$type<Address>(),\n\n // has one roles bitmap\n roles: t.bigint().notNull(),\n }),\n (t) => ({\n byId: uniqueIndex().on(t.chainId, t.address, t.resource, t.user),\n }),\n);\n\nexport const relations_permissionsUser = relations(permissionsUser, ({ one }) => ({\n account: one(account, {\n fields: [permissionsUser.user],\n references: [account.id],\n }),\n permissions: one(permissions, {\n fields: [permissionsUser.chainId, permissionsUser.address],\n references: [permissions.chainId, permissions.address],\n }),\n resource: one(permissionsResource, {\n fields: [permissionsUser.chainId, permissionsUser.address, permissionsUser.resource],\n references: [\n permissionsResource.chainId,\n permissionsResource.address,\n permissionsResource.resource,\n ],\n }),\n}));\n\n//////////\n// Labels\n//////////\n\nexport const label = onchainTable(\n \"labels\",\n (t) => ({\n labelHash: t.hex().primaryKey().$type<LabelHash>(),\n interpreted: t.text().notNull().$type<InterpretedLabel>(),\n }),\n (t) => ({\n byInterpreted: index().on(t.interpreted),\n }),\n);\n\nexport const label_relations = relations(label, ({ many }) => ({\n domains: many(v2Domain),\n}));\n\n///////////////////\n// Canonical Names\n///////////////////\n\n// TODO(canonical-names): this table will be refactored away once Canonical Names are implemented in\n// ENSv2, and we'll be able to store this information directly on the Registry entity, but until\n// then we need a place to track canonical domain references without requiring that a Registry contract\n// has emitted an event (and therefore is indexed)\n// TODO(canonical-names): this table can also disappear once the Signal pattern is implemented for\n// Registry contracts, ensuring that they are indexed during construction and are available for storage.\nexport const registryCanonicalDomain = onchainTable(\"registry_canonical_domains\", (t) => ({\n registryId: t.text().primaryKey().$type<RegistryId>(),\n domainId: t.text().notNull().$type<ENSv2DomainId>(),\n}));\n","/**\n * Schema Definitions that power Protocol Acceleration in the Resolution API.\n */\n\nimport type {\n Address,\n ChainId,\n DomainId,\n InterpretedName,\n Node,\n RecordVersion,\n ResolverId,\n ResolverRecordsId,\n} from \"enssdk\";\nimport { onchainTable, primaryKey, relations, uniqueIndex } from \"ponder\";\n\n/**\n * Tracks an Account's ENSIP-19 Reverse Name Records by CoinType.\n *\n * NOTE: this is NOT a cohesive, materialized index of ALL of an account's Primary Names, it is ONLY\n * an index of its ENSIP-19 Reverse Name _Records_ stored by a StandaloneReverseRegistrar:\n * - default.reverse\n * - [coinType].reverse\n * - NOT *.addr.reverse\n *\n * So these records CANNOT be queried directly and used as a source of truth — you MUST perform\n * Forward Resolution to resolve a consistent set of an Account's ENSIP-19 Primary Names. These records\n * are used to power Protocol Acceleration for those ReverseResolvers backed by a StandloneReverseRegistrar.\n */\nexport const reverseNameRecord = onchainTable(\n \"reverse_name_records\",\n (t) => ({\n // keyed by (address, coinType)\n address: t.hex().notNull().$type<Address>(),\n coinType: t.bigint().notNull(),\n\n /**\n * Represents the ENSIP-19 Reverse Name Record for a given (address, coinType).\n *\n * The value of this field is guaranteed to be a non-empty {@link InterpretedName}.\n */\n value: t.text().notNull().$type<InterpretedName>(),\n }),\n (t) => ({\n pk: primaryKey({ columns: [t.address, t.coinType] }),\n }),\n);\n\n/**\n * Tracks Domain-Resolver Relationships. This powers:\n * 1. Domain-Resolver Realtionships within the GraphQL API, and\n * 2. Accelerated lookups of a Domain's Resolver within the Resolution API.\n *\n * It is keyed by (chainId, address, domainId) to match the on-chain datamodel of\n * Registry/(shadow)Registry Domain-Resolver relationships.\n */\nexport const domainResolverRelation = onchainTable(\n \"domain_resolver_relations\",\n (t) => ({\n // keyed by (chainId, registry, node)\n chainId: t.integer().notNull().$type<ChainId>(),\n\n // The Registry (ENSv1Registry or ENSv2Registry)'s AccountId.\n address: t.hex().notNull().$type<Address>(),\n domainId: t.hex().notNull().$type<DomainId>(),\n\n // The Domain's assigned Resolver's address (NOTE: always scoped to chainId)\n resolver: t.hex().notNull().$type<Address>(),\n }),\n (t) => ({\n pk: primaryKey({ columns: [t.chainId, t.address, t.domainId] }),\n }),\n);\n\nexport const domainResolverRelation_relations = relations(domainResolverRelation, ({ one }) => ({\n resolver: one(resolver, {\n fields: [domainResolverRelation.chainId, domainResolverRelation.resolver],\n references: [resolver.chainId, resolver.address],\n }),\n}));\n\n/**\n * Resolver represents an individual IResolver contract that has emitted at least 1 event.\n * Note that Resolver contracts can exist on-chain but not emit any events and still function\n * properly, so checks against a Resolver's existence and metadata must be done at runtime.\n */\nexport const resolver = onchainTable(\n \"resolvers\",\n (t) => ({\n // keyed by (chainId, address)\n id: t.text().primaryKey().$type<ResolverId>(),\n\n chainId: t.integer().notNull().$type<ChainId>(),\n address: t.hex().notNull().$type<Address>(),\n }),\n (t) => ({\n byId: uniqueIndex().on(t.chainId, t.address),\n }),\n);\n\nexport const resolver_relations = relations(resolver, ({ many }) => ({\n records: many(resolverRecords),\n}));\n\n/**\n * Tracks a set of records for a specified `node` within a `resolver` contract on `chainId`.\n *\n * ResolverRecords is keyed by (chainId, resolver, node) and:\n * - has one `name` record (see ENSIP-3)\n * - has many `addressRecords` (unique by coinType) (see ENSIP-9)\n * - has many `textRecords` (unique by key) (see ENSIP-5)\n *\n * It is keyed by (chainId, resolver, node) to match the on-chain datamodel of Resolver contract storage.\n *\n * WARNING: These record values do NOT allow the caller to confidently resolve records for names\n * without following Forward Resolution according to the ENS protocol: a direct query to the database\n * for a record's value is not ENSIP-10 nor CCIP-Read compliant.\n */\nexport const resolverRecords = onchainTable(\n \"resolver_records\",\n (t) => ({\n // keyed by (chainId, resolver, node)\n id: t.text().primaryKey().$type<ResolverRecordsId>(),\n\n chainId: t.integer().notNull().$type<ChainId>(),\n address: t.hex().notNull().$type<Address>(),\n node: t.hex().notNull().$type<Node>(),\n\n /**\n * Represents the value of the reverse-resolution (ENSIP-3) name() record, used for Reverse Resolution.\n *\n * If present, the value of this field is guaranteed to be a non-empty {@link InterpretedName}.\n */\n name: t.text().$type<InterpretedName>(),\n\n /**\n * ENSIP-7 contenthash raw bytes or null if not set.\n */\n contenthash: t.hex(),\n\n /**\n * PubkeyResolver (x, y) pair, or null if not set.\n *\n * Invariant: both null together, or both set together.\n */\n pubkeyX: t.hex(),\n pubkeyY: t.hex(),\n\n /**\n * IDNSZoneResolver zonehash or null if not set.\n */\n dnszonehash: t.hex(),\n\n /**\n * IVersionableResolver version. Null when no `VersionChanged` event has been seen for this\n * (chainId, address, node) — the resolver may not implement `IVersionableResolver`, or simply\n * may never have been version-bumped. Consumers should treat null as \"unknown\" rather than 0.\n */\n version: t.bigint().$type<RecordVersion>(),\n }),\n (t) => ({\n byId: uniqueIndex().on(t.chainId, t.address, t.node),\n }),\n);\n\nexport const resolverRecords_relations = relations(resolverRecords, ({ one, many }) => ({\n // belongs to resolver\n resolver: one(resolver, {\n fields: [resolverRecords.chainId, resolverRecords.address],\n references: [resolver.chainId, resolver.address],\n }),\n\n // resolverRecord has many address records\n addressRecords: many(resolverAddressRecord),\n\n // resolverRecord has many text records\n textRecords: many(resolverTextRecord),\n}));\n\n/**\n * Tracks address records for a `node` by `coinType` within a `resolver` on `chainId`.\n *\n * ResolverAddressRecord is keyed by (chainId, resolver, node, coinType), where the composite key\n * segment (chainId, resolver, node) describes a ResolverRecord entity. A ResolverAddressRecord is\n * then additionally keyed by (coinType).\n */\nexport const resolverAddressRecord = onchainTable(\n \"resolver_address_records\",\n (t) => ({\n // keyed by ((chainId, resolver, node), coinType)\n chainId: t.integer().notNull().$type<ChainId>(),\n address: t.hex().notNull().$type<Address>(),\n node: t.hex().notNull().$type<Node>(),\n // NOTE: all well-known CoinTypes fit into javascript number but NOT postgres .integer, must be\n // stored as BigInt\n coinType: t.bigint().notNull(),\n\n /**\n * Represents the value of the Addresss Record specified by ((chainId, resolver, node), coinType).\n *\n * The value of this field is interpreted by `interpretAddressRecordValue` — see its implementation\n * for additional context and specific guarantees.\n */\n value: t.text().notNull(),\n }),\n (t) => ({\n pk: primaryKey({ columns: [t.chainId, t.address, t.node, t.coinType] }),\n }),\n);\n\nexport const resolverAddressRecordRelations = relations(resolverAddressRecord, ({ one }) => ({\n // belongs to resolverRecord\n resolver: one(resolverRecords, {\n fields: [\n resolverAddressRecord.chainId,\n resolverAddressRecord.address,\n resolverAddressRecord.node,\n ],\n references: [resolverRecords.chainId, resolverRecords.address, resolverRecords.node],\n }),\n}));\n\n/**\n * Tracks text records for a `node` by `key` within a `resolver` on `chainId`.\n *\n * ResolverTextRecord is keyed by (chainId, resolver, node, key), where the composite key\n * segment (chainId, resolver, node) describes a ResolverRecord entity. A ResolverTextRecord is\n * then additionally keyed by (key).\n */\nexport const resolverTextRecord = onchainTable(\n \"resolver_text_records\",\n (t) => ({\n // keyed by ((chainId, resolver, node), key)\n chainId: t.integer().notNull().$type<ChainId>(),\n address: t.hex().notNull().$type<Address>(),\n node: t.hex().notNull().$type<Node>(),\n key: t.text().notNull(),\n\n /**\n * Represents the value of the Text Record specified by ((chainId, resolver, node), key).\n *\n * The value of this field is interpreted by `interpretTextRecordValue` — see its implementation\n * for additional context and specific guarantees.\n */\n value: t.text().notNull(),\n }),\n (t) => ({\n pk: primaryKey({ columns: [t.chainId, t.address, t.node, t.key] }),\n }),\n);\n\nexport const resolverTextRecordRelations = relations(resolverTextRecord, ({ one }) => ({\n // belongs to resolverRecord\n resolver: one(resolverRecords, {\n fields: [resolverTextRecord.chainId, resolverTextRecord.address, resolverTextRecord.node],\n references: [resolverRecords.chainId, resolverRecords.address, resolverRecords.node],\n }),\n}));\n\n/**\n * Tracks the migration status of a node.\n *\n * Due to a security issue, ENS migrated from the RegistryOld contract to a new Registry\n * contract. When indexing events, the indexer must ignore any events on the RegistryOld for domains\n * that have since been migrated to the new Registry.\n *\n * To store the necessary information required to implement this behavior, we track the set of nodes\n * that have been registered in the (new) Registry contract on the ENS Root Chain. When an event is\n * encountered on the RegistryOld contract, if the relevant node exists in this set, the event should\n * be ignored, as the node is considered migrated.\n *\n * Note that this logic is only necessary for the ENS Root Chain, the only chain that includes the\n * Registry migration: we do not track nodes in the the Basenames and Lineanames deployments of the\n * Registry on their respective chains, for example.\n *\n * Note also that this Registry migration tracking is isolated to the Protocol Acceleration schema/plugin.\n * That is, the subgraph plugin implements its own Registry migration logic. By isolating this logic\n * to the Protocol Acceleration plugin, we allow the Protocol Acceleration plugin to be run\n * independently of other plugins.\n *\n * The ensv2 plugin depends on the Protocol Acceleration plugin in order to piggyback on this\n * Registry migration logic.\n */\nexport const migratedNode = onchainTable(\"migrated_nodes\", (t) => ({\n node: t.hex().primaryKey().$type<Node>(),\n}));\n","/**\n * Schema Definitions for tracking of ENS registrars.\n */\n\nimport type { NormalizedAddress } from \"enssdk\";\nimport { index, onchainEnum, onchainTable, relations, uniqueIndex } from \"ponder\";\n\n/**\n * Subregistries\n *\n * @see https://ensnode.io/docs/reference/terminology#subregistry\n */\nexport const subregistries = onchainTable(\n \"subregistries\",\n (t) => ({\n /**\n * Subregistry ID\n *\n * Identifies the chainId and address of the smart contract associated\n * with the subregistry.\n *\n * Guaranteed to be a fully lowercase string formatted according to\n * the CAIP-10 standard.\n *\n * @see https://chainagnostic.org/CAIPs/caip-10\n */\n subregistryId: t.text().primaryKey(),\n\n /**\n * The node (namehash) of the name the subregistry manages subnames of.\n * Example subregistry managed names:\n * - `eth`\n * - `base.eth`\n * - `linea.eth`\n *\n * Guaranteed to be a fully lowercase hex string representation of 32-bytes.\n */\n node: t.hex().notNull(),\n }),\n (t) => ({\n uniqueNode: uniqueIndex().on(t.node),\n }),\n);\n\n/**\n * Registration Lifecycles\n *\n * A \"registration lifecycle\" represents a single cycle of a name being\n * registered once followed by renewals (expiry date extensions) any number of\n * times.\n *\n * Note that this data model only tracks the *most recently created*\n * \"registration lifecycle\" record for a name and doesn't track\n * *all* \"registration lifecycle\" records for a name across time.\n * Therefore, if a name goes through multiple cycles of:\n * (registration -> expiry -> release) ->\n * (registration -> expiry -> release) -> etc..\n * this data model only stores data of the most recently created\n * \"registration lifecycle\".\n *\n * For now we make the following simplifying assumptions:\n * 1. That no two subregistries hold state for the same node.\n * 2. That the subregistry associated with the name X in the ENS root registry\n * exclusively holds state for subnames of X.\n *\n * These simplifying assumptions happen to be true for the scope of our\n * current indexing logic, but nothing in the ENS protocol fundamentally\n * forces this to always be true. Therefore this data model will need\n * refactoring in the future as our indexing logic expands to handle\n * more complex scenarios.\n */\nexport const registrationLifecycles = onchainTable(\n \"registration_lifecycles\",\n (t) => ({\n /**\n * The node (namehash) of the FQDN of the domain the registration lifecycle\n * is associated with.\n *\n * Guaranteed to be a subname of the node (namehash) of the subregistry\n * identified by `subregistryId`.\n *\n * Guaranteed to be a fully lowercase hex string representation of 32-bytes.\n */\n node: t.hex().primaryKey(),\n\n /**\n * Subregistry ID\n *\n * Identifies the chainId and address of the subregistry smart contract\n * that manages the registration lifecycle.\n *\n * Guaranteed to be a fully lowercase string formatted according to\n * the CAIP-10 standard.\n *\n * @see https://chainagnostic.org/CAIPs/caip-10\n */\n subregistryId: t.text().notNull(),\n\n /**\n * Expires at\n *\n * Unix timestamp when the Registration Lifecycle is scheduled to expire.\n */\n expiresAt: t.bigint().notNull(),\n }),\n (t) => ({\n bySubregistry: index().on(t.subregistryId),\n }),\n);\n\n/**\n * \"Logical registrar action type\" enum\n *\n * Types of \"logical registrar action\".\n */\nexport const registrarActionType = onchainEnum(\"registrar_action_type\", [\n \"registration\",\n \"renewal\",\n]);\n\n/**\n * \"Logical registrar actions\"\n *\n * This table models \"logical actions\" rather than \"events\" because a single\n * \"logical action\", such as a single registration or renewal, may emit\n * multiple onchain events from multiple contracts where each of those\n * individual events may only provide a subset of the data about the full\n * \"logical action\". Therefore, here we aggregate data about each\n * \"logical action\" that may be sourced from multiple onchain events from\n * multiple contracts.\n *\n * Each \"logical action\" in this table is associated with a single transaction.\n * However, it should be noted that a single transaction may perform any number\n * of \"logical actions\".\n *\n * For example, consider the \"logical registrar action\" of registering a direct\n * subname of .eth. This \"logical action\" spans interactions across multiple\n * contracts that emit multiple onchain events:\n *\n * 1. The \"EthBaseRegistrar\" contract emits a `NameRegistered` event enabling\n * the tracking of data including:\n * - `node`\n * - `incrementalDuration`\n * - `registrant`\n * 2. A \"RegistrarController\" contract emits its own `NameRegistered` event\n * enabling the tracking of data that may include:\n * - `baseCost`\n * - `premium`\n * - `total`\n * - `encodedReferrer`\n *\n * Here we aggregate the state from both of these events into a single\n * \"logical registrar action\".\n */\nexport const registrarActions = onchainTable(\n \"registrar_actions\",\n (t) => ({\n /**\n * \"Logical registrar action\" ID\n *\n * The `id` value is a deterministic and globally unique identifier for\n * the \"logical registrar action\".\n *\n * The `id` value represents the *initial* onchain event associated with\n * the \"logical registrar action\", but the full state of\n * the \"logical registrar action\" is an aggregate across each of\n * the onchain events referenced in the `eventIds` field.\n *\n * Guaranteed to be the very first element in `eventIds` array.\n *\n * Implementation details: The `id` value is a Ponder checkpoint string — a fixed-length\n * decimal string encoding the following fields (left to right, most to least significant):\n *\n * | Field | Width (digits) | Description |\n * |--------------------|----------------|-------------------------------------------|\n * | `blockTimestamp` | 10 | Unix seconds timestamp of the block |\n * | `chainId` | 16 | EIP-155 chain ID |\n * | `blockNumber` | 16 | Block number |\n * | `transactionIndex` | 16 | Index of the transaction within the block |\n * | `eventType` | 1 | Internal Ponder event type (always 5) |\n * | `eventIndex` | 16 | Index of the event within the transaction |\n *\n * All fields are zero-padded to their fixed widths, so the string has constant\n * length and lexicographic order equals chronological order.\n *\n * Because all registrar actions originate from Ponder log (smart-contract event)\n * handlers, every `id` shares the same `eventType` digit (5), making direct\n * lexicographic or bigint comparison safe for establishing total chronological order.\n */\n id: t.text().primaryKey(),\n\n /**\n * The type of the \"logical registrar action\".\n */\n type: registrarActionType().notNull(),\n\n /**\n * Subregistry ID\n *\n * The ID of the subregistry the \"logical registrar action\" was taken on.\n *\n * Identifies the chainId and address of the associated subregistry smart\n * contract.\n *\n * Guaranteed to be a fully lowercase string formatted according to\n * the CAIP-10 standard.\n *\n * @see https://chainagnostic.org/CAIPs/caip-10\n */\n subregistryId: t.text().notNull(),\n\n /**\n * The node (namehash) of the FQDN of the domain associated with\n * the \"logical registrar action\".\n *\n * Guaranteed to be a fully lowercase hex string representation of 32-bytes.\n */\n node: t.hex().notNull(),\n\n /**\n * Incremental Duration\n *\n * If `type` is \"registration\":\n * - Represents the duration between `blockTimestamp` and\n * the initial `expiresAt` value that the associated\n * \"registration lifecycle\" will be initialized with.\n * If `type` is \"renewal\":\n * - Represents the incremental increase in duration made to\n * the `expiresAt` value in the associated \"registration lifecycle\".\n *\n * A \"registration lifecycle\" may be extended via renewal even after it\n * expires if it is still within its grace period.\n *\n * Consider the following scenario:\n *\n * The \"registration lifecycle\" of a direct subname of .eth is scheduled to\n * expire on Jan 1, midnight UTC. It is currently 30 days after this\n * expiration time. Therefore, there are currently another 60 days of grace\n * period remaining for this name. Anyone can still make a renewal to\n * extend the \"registration lifecycle\" of this name.\n *\n * Given this scenario, consider the following examples:\n *\n * 1. If a renewal is made with 10 days incremental duration,\n * the \"registration lifecycle\" for this name will remain in\n * an \"expired\" state, but it will now have another 70 days of\n * grace period remaining.\n *\n * 2. If a renewal is made with 50 days incremental duration,\n * the \"registration lifecycle\" for this name will no longer be\n * \"expired\" and will become \"active\", but the \"registration lifecycle\"\n * will now be scheduled to expire again in 20 days.\n *\n * After the \"registration lifecycle\" for a name becomes expired by more\n * than its grace period, it can no longer be renewed by anyone and is\n * considered \"released\". The name must first be registered again, starting\n * a new \"registration lifecycle\" of\n * active / expired / grace period / released.\n *\n * May be 0.\n *\n * Guaranteed to be a non-negative bigint value.\n */\n incrementalDuration: t.bigint().notNull(),\n\n /**\n * Base cost\n *\n * Base cost (before any `premium`) of Ether measured in units of Wei\n * paid to execute the \"logical registrar action\".\n *\n * May be 0.\n *\n * Guaranteed to be:\n * 1) null if and only if `total` is null.\n * 2) Otherwise, a non-negative bigint value.\n */\n baseCost: t.bigint(),\n\n /**\n * Premium\n *\n * \"premium\" cost (in excesses of the `baseCost`) of Ether measured in\n * units of Wei paid to execute the \"logical registrar action\".\n *\n * May be 0.\n *\n * Guaranteed to be:\n * 1) null if and only if `total` is null.\n * 2) Otherwise, zero when `type` is `renewal`.\n * 3) Otherwise, a non-negative bigint value.\n */\n premium: t.bigint(),\n\n /**\n * Total\n *\n * Total cost of Ether measured in units of Wei paid to execute\n * the \"logical registrar action\".\n *\n * May be 0.\n *\n * Guaranteed to be:\n * 1) null if and only if both `baseCost` and `premium` are null.\n * 2) Otherwise, a non-negative bigint value, equal to the sum of\n * `baseCost` and `premium`.\n */\n total: t.bigint(),\n\n /**\n * Registrant\n *\n * Identifies the address that initiated the \"logical registrar action\" and\n * is paying the `total` cost (if applicable).\n *\n * It may not be the owner of the name:\n * 1. When a name is registered, the initial owner of the name may be\n * distinct from the registrant.\n * 2. There are no restrictions on who may renew a name.\n * Therefore the owner of the name may be distinct from the registrant.\n *\n *\n * The \"chainId\" of this address is the same as is referenced in `subregistryId`.\n *\n * Guaranteed to be a fully lowercase address\n */\n registrant: t.hex().notNull(),\n\n /**\n * Encoded Referrer\n *\n * Represents the \"raw\" 32-byte \"referrer\" value emitted onchain in\n * association with the registrar action.\n *\n * Guaranteed to be:\n * 1) null if the emitted `eventIds` contain no information about a referrer.\n * 2) Otherwise, a fully lowercase hex string representation of 32-bytes.\n */\n encodedReferrer: t.hex(),\n\n /**\n * Decoded referrer\n *\n * The referrer address decoded from `encodedReferrer` using strict\n * left-zero-padding validation.\n *\n * Identifies the interpreted address of the referrer.\n * The \"chainId\" of this address is the same as is referenced in\n * `subregistryId`.\n *\n * Guaranteed to be:\n * 1) null if `encodedReferrer` is null.\n * 2) Otherwise, a fully lowercase address.\n * 3) May be the \"zero address\" to represent that an `encodedReferrer` is\n * defined but that it is interpreted as no referrer.\n */\n decodedReferrer: t.hex().$type<NormalizedAddress>(),\n\n /**\n * Number of the block that includes the \"logical registrar action\".\n *\n * The \"chainId\" of this block is the same as is referenced in\n * `subregistryId`.\n *\n * Guaranteed to be a non-negative bigint value.\n */\n blockNumber: t.bigint().notNull(),\n\n /**\n * Unix timestamp of the block referenced by `blockNumber` that includes\n * the \"logical registrar action\".\n */\n timestamp: t.bigint().notNull(),\n\n /**\n * Transaction hash of the transaction associated with\n * the \"logical registrar action\".\n *\n * The \"chainId\" of this transaction is the same as is referenced in\n * `subregistryId`.\n *\n * Note that a single transaction may be associated with any number of\n * \"logical registrar actions\".\n *\n * Guaranteed to be a fully lowercase hex string representation of 32-bytes.\n */\n transactionHash: t.hex().notNull(),\n\n /**\n * Event IDs\n *\n * Array of the eventIds that have contributed to the state of\n * the \"logical registrar action\" record.\n *\n * Each eventId is a deterministic and globally unique onchain event\n * identifier.\n *\n * Guarantees:\n * - Each eventId is of events that occurred within the block\n * referenced by `blockNumber`.\n * - At least 1 eventId.\n * - Ordered chronologically (ascending) by logIndex within `blockNumber`.\n * - The first element in the array is equal to the `id` of\n * the overall \"logical registrar action\" record.\n *\n * The following ideas are not generalized for ENS overall but happen to\n * be a characteristic of the scope of our current indexing logic:\n * 1. These id's always reference events emitted by\n * a related \"BaseRegistrar\" contract.\n * 2. These id's optionally reference events emitted by\n * a related \"Registrar Controller\" contract. This is because our\n * current indexing logic doesn't guarantee to index\n * all \"Registrar Controller\" contracts.\n */\n eventIds: t.text().array().notNull(),\n }),\n (t) => ({\n byDecodedReferrer: index().on(t.decodedReferrer),\n byTimestamp: index().on(t.timestamp),\n }),\n);\n\n/**\n * Logical Registrar Action Metadata Type Enum\n *\n * Types of internal registrar action metadata.\n *\n * NOTE: This enum is an internal implementation detail of ENSIndexer and\n * should not be used outside of ENSIndexer.\n */\nexport const internal_registrarActionMetadataType = onchainEnum(\n \"_ensindexer_registrar_action_metadata_type\",\n [\"CURRENT_LOGICAL_REGISTRAR_ACTION\"],\n);\n\n/**\n * Logical Registrar Action Metadata\n *\n * NOTE: This table is an internal implementation detail of ENSIndexer and\n * should not be queried outside of ENSIndexer.\n *\n * Building a \"logical registrar action\" record may require data from\n * multiple onchain events. To help aggregate data from multiple events into\n * a single \"logical registrar action\" ENSIndexer may temporarily store data\n * here to achieve this data aggregation.\n *\n * Note how multiple \"logical registrar actions\" may be taken on\n * the same `node` in the same `transactionHash`. For example, consider\n * a case of a single transaction registering a name and subsequently renewing\n * it twice. While this may be silly it is technically possible and therefore\n * such cases must be considered. To support such cases, when\n * the last event handler for a \"logical registrar action\" has completed its\n * processing the record referenced by the `logicalEventKey` must be removed.\n */\nexport const internal_registrarActionMetadata = onchainTable(\n \"_ensindexer_registrar_action_metadata\",\n (t) => ({\n /**\n * Registrar Action Metadata Type\n *\n * The type of internal registrar action metadata being stored.\n */\n metadataType: internal_registrarActionMetadataType().primaryKey(),\n\n /**\n * Logical Event Key\n *\n * A fully lowercase string formatted as:\n * `{domainId}:{transactionHash}`\n */\n logicalEventKey: t.text().notNull(),\n\n /**\n * Logical Event ID\n *\n * A string holding the `id` value of the existing \"logical registrar action\"\n * record that is currently being built as an aggregation of onchain events.\n *\n * May be used by subsequent event handlers to identify which\n * \"logical registrar action\" to aggregate additional indexed state into.\n */\n logicalEventId: t.text().notNull(),\n }),\n);\n\n/// Relations\n\n/**\n * Subregistry Relations\n *\n * Each Subregistry is related to:\n * - 0 or more RegistrationLifecycles\n */\nexport const subregistryRelations = relations(subregistries, ({ many }) => ({\n registrationLifecycle: many(registrationLifecycles),\n}));\n\n/**\n * Registration Lifecycle Relations\n *\n * Each Registration Lifecycle is related to:\n * - exactly one Subregistry\n * - 0 or more \"logical registrar action\"\n */\nexport const registrationLifecycleRelations = relations(\n registrationLifecycles,\n ({ one, many }) => ({\n subregistry: one(subregistries, {\n fields: [registrationLifecycles.subregistryId],\n references: [subregistries.subregistryId],\n }),\n\n registrarAction: many(registrarActions),\n }),\n);\n\n/**\n * \"Logical registrar action\" Relations\n *\n * Each \"logical registrar action\" is related to:\n * - exactly one Registration Lifecycle (note the docs on\n * Registration Lifecycle explaining how these records may\n * be recycled across time).\n */\nexport const registrarActionRelations = relations(registrarActions, ({ one }) => ({\n registrationLifecycle: one(registrationLifecycles, {\n fields: [registrarActions.node],\n references: [registrationLifecycles.node],\n }),\n}));\n","import type { Address } from \"enssdk\";\nimport { index, onchainTable, relations, sql } from \"ponder\";\n\nimport { monkeypatchCollate } from \"../lib/collate\";\n\n/**\n * This file specifies an Legacy-ENS-Subgraph-Compatible Ponder Schema.\n *\n * When the subgraph_prefix is stripped and the resulting schema is paired with @ensnode/ponder-subgraph,\n * the resulting GraphQL API is fully compatible with the legacy ENS Subgraph.\n */\n\n/**\n * Domain\n */\n\nexport const subgraph_domain = onchainTable(\n \"subgraph_domains\",\n (t) => ({\n // The namehash of the name\n id: t.hex().primaryKey(),\n\n /**\n * The ENS Name that this Domain represents.\n *\n * If {@link ENSIndexerConfig#isSubgraphCompatible}, this value is guaranteed to be either:\n * a) null (in the case of the root node), or\n * b) a Subgraph Interpreted Name.\n *\n * @see https://ensnode.io/docs/reference/terminology#subgraph-indexability--labelname-interpretation\n *\n * Otherwise, this value is guaranteed to be an Interpreted Name, which is either:\n * a) a normalized Name, or\n * b) a Name entirely consisting of Interpreted Labels.\n *\n * Note that the type of the column will remain string | null, for legacy subgraph compatibility,\n * but in practice will never be null. The Root node's name will be '' (empty string).\n *\n * @see https://ensnode.io/docs/reference/terminology#interpreted-name\n */\n name: t.text(),\n\n /**\n * The Label associated with the Domain.\n *\n * If {@link ENSIndexerConfig#isSubgraphCompatible}, this value is guaranteed to be either:\n * a) null, in the case of the root Node or a name whose childmost label is subgraph-unindexable, or\n * b) a subgraph-indexable Subgraph Interpreted Label (i.e. a Literal Label of undefined normalization).\n *\n * @see https://ensnode.io/docs/reference/terminology#subgraph-indexability--labelname-interpretation\n *\n * Otherwise, this value is guaranteed to be an Interpreted Label which is either:\n * a) null, exclusively in the case of the root Node,\n * b) a normalized Label, or\n * c) an Encoded LabelHash, which encodes either\n * i. in the case of an Unknown Label, the LabelHash emitted onchain, or\n * ii. in the case of an Unnormalized Label, the LabelHash of the Literal Label value found onchain.\n *\n * @see https://ensnode.io/docs/reference/terminology#interpreted-label\n */\n labelName: t.text(),\n\n // keccak256(labelName)\n labelhash: t.hex(),\n // The namehash (id) of the parent name\n parentId: t.hex(),\n\n // The number of subdomains\n subdomainCount: t.integer().notNull().default(0),\n\n // Address logged from current resolver, if any\n resolvedAddressId: t.hex(),\n\n // The resolver that controls the domain's settings\n resolverId: t.text(),\n\n // The time-to-live (TTL) value of the domain's records\n ttl: t.bigint(),\n\n // Indicates whether the domain has been migrated to a new registrar\n isMigrated: t.boolean().notNull().default(false),\n // The time when the domain was created\n createdAt: t.bigint().notNull(),\n\n // The account that owns the domain\n ownerId: t.hex().notNull(),\n // The account that owns the ERC721 NFT for the domain\n registrantId: t.hex(),\n // The account that owns the wrapped domain\n wrappedOwnerId: t.hex(),\n\n // The expiry date for the domain, from either the registration, or the wrapped domain if PCC is burned\n expiryDate: t.bigint(),\n }),\n (t) => ({\n // uses a hash index because some name values exceed the btree max row size (8191 bytes)\n byExactName: index().using(\"hash\", t.name),\n // GIN trigram index for partial-match filters (_contains, _starts_with, _ends_with).\n // (inline `gin_trgm_ops` via `sql` because passing it through `.op()` gets dropped by Ponder,\n // producing `USING gin (name)` with no opclass)\n byFuzzyName: index().using(\"gin\", sql`${t.name} gin_trgm_ops`),\n\n byLabelhash: index().on(t.labelhash),\n byParentId: index().on(t.parentId),\n byOwnerId: index().on(t.ownerId),\n byRegistrantId: index().on(t.registrantId),\n byWrappedOwnerId: index().on(t.wrappedOwnerId),\n byResolvedAddressId: index().on(t.resolvedAddressId),\n }),\n);\n\n// monkeypatch drizzle's column (necessary to match graph-node default collation \"C\")\n// https://github.com/drizzle-team/drizzle-orm/issues/638\nmonkeypatchCollate(subgraph_domain.name, '\"C\"');\nmonkeypatchCollate(subgraph_domain.labelName, '\"C\"');\n\nexport const subgraph_domainRelations = relations(subgraph_domain, ({ one, many }) => ({\n resolvedAddress: one(subgraph_account, {\n fields: [subgraph_domain.resolvedAddressId],\n references: [subgraph_account.id],\n }),\n owner: one(subgraph_account, {\n fields: [subgraph_domain.ownerId],\n references: [subgraph_account.id],\n }),\n parent: one(subgraph_domain, {\n fields: [subgraph_domain.parentId],\n references: [subgraph_domain.id],\n }),\n resolver: one(subgraph_resolver, {\n fields: [subgraph_domain.resolverId],\n references: [subgraph_resolver.id],\n }),\n subdomains: many(subgraph_domain, { relationName: \"parent\" }),\n registrant: one(subgraph_account, {\n fields: [subgraph_domain.registrantId],\n references: [subgraph_account.id],\n }),\n wrappedOwner: one(subgraph_account, {\n fields: [subgraph_domain.wrappedOwnerId],\n references: [subgraph_account.id],\n }),\n wrappedDomain: one(subgraph_wrappedDomain, {\n fields: [subgraph_domain.id],\n references: [subgraph_wrappedDomain.domainId],\n }),\n registration: one(subgraph_registration, {\n fields: [subgraph_domain.id],\n references: [subgraph_registration.domainId],\n }),\n\n // event relations\n transfers: many(subgraph_transfer),\n newOwners: many(subgraph_newOwner),\n newResolvers: many(subgraph_newResolver),\n newTTLs: many(subgraph_newTTL),\n wrappedTransfers: many(subgraph_wrappedTransfer),\n nameWrappeds: many(subgraph_nameWrapped),\n nameUnwrappeds: many(subgraph_nameUnwrapped),\n fusesSets: many(subgraph_fusesSet),\n expiryExtendeds: many(subgraph_expiryExtended),\n}));\n\n/**\n * Account\n */\n\nexport const subgraph_account = onchainTable(\"subgraph_accounts\", (t) => ({\n id: t.hex().primaryKey(),\n}));\n\nexport const subgraph_accountRelations = relations(subgraph_account, ({ many }) => ({\n domains: many(subgraph_domain),\n wrappedDomains: many(subgraph_wrappedDomain),\n registrations: many(subgraph_registration),\n}));\n\n/**\n * Resolver\n */\n\nexport const subgraph_resolver = onchainTable(\n \"subgraph_resolvers\",\n (t) => ({\n // The unique identifier for this resolver, which is a concatenation of the domain namehash and the resolver address\n id: t.text().primaryKey(),\n // The domain that this resolver is associated with\n domainId: t.hex().notNull(),\n // The address of the resolver contract\n address: t.hex().notNull().$type<Address>(),\n\n // The current value of the 'addr' record for this resolver, as determined by the associated events\n addrId: t.hex(),\n // The content hash for this resolver, in binary format\n contentHash: t.text(),\n // The set of observed text record keys for this resolver\n // NOTE: we avoid .notNull.default([]) to match subgraph behavior\n texts: t.text().array(),\n // The set of observed SLIP-44 coin types for this resolver\n // NOTE: we avoid .notNull.default([]) to match subgraph behavior\n coinTypes: t.bigint().array(),\n }),\n (t) => ({\n byDomainId: index().on(t.domainId),\n }),\n);\n\nexport const subgraph_resolverRelations = relations(subgraph_resolver, ({ one, many }) => ({\n addr: one(subgraph_account, {\n fields: [subgraph_resolver.addrId],\n references: [subgraph_account.id],\n }),\n domain: one(subgraph_domain, {\n fields: [subgraph_resolver.domainId],\n references: [subgraph_domain.id],\n }),\n\n // event relations\n addrChangeds: many(subgraph_addrChanged),\n multicoinAddrChangeds: many(subgraph_multicoinAddrChanged),\n nameChangeds: many(subgraph_nameChanged),\n abiChangeds: many(subgraph_abiChanged),\n pubkeyChangeds: many(subgraph_pubkeyChanged),\n textChangeds: many(subgraph_textChanged),\n contenthashChangeds: many(subgraph_contenthashChanged),\n interfaceChangeds: many(subgraph_interfaceChanged),\n authorisationChangeds: many(subgraph_authorisationChanged),\n versionChangeds: many(subgraph_versionChanged),\n}));\n\n/**\n * Registration\n */\n\nexport const subgraph_registration = onchainTable(\n \"subgraph_registrations\",\n (t) => ({\n // The unique identifier of the registration\n id: t.hex().primaryKey(),\n // The domain name associated with the registration\n domainId: t.hex().notNull(),\n // The registration date of the domain\n registrationDate: t.bigint().notNull(),\n // The expiry date of the domain\n expiryDate: t.bigint().notNull(),\n // The cost associated with the domain registration\n cost: t.bigint(),\n // The account that registered the domain\n registrantId: t.hex().notNull(),\n /**\n * The Label associated with the domain registration.\n *\n * If {@link ENSIndexerConfig#isSubgraphCompatible}, this value is guaranteed to be either:\n * a) null, in the case of the root Node or a Domain whose label is subgraph-unindexable, or\n * b) a subgraph-indexable Subgraph Interpreted Label (i.e. a Literal Label of undefined normalization).\n *\n * @see https://ensnode.io/docs/reference/terminology#subgraph-indexability--labelname-interpretation\n *\n * Otherwise, this value is guaranteed to be an Interpreted Label which is either:\n * a) a normalized Label, or\n * b) in the case of an Unnormalized Label, an Encoded LabelHash of the Literal Label value found onchain.\n *\n * Note that the type of the column will remain string | null, for legacy subgraph compatibility.\n * In practice however, because there is no Registration entity for the root Node (the only Node\n * with a null labelName) this field will never be null.\n *\n * @see https://ensnode.io/docs/reference/terminology#interpreted-label\n */\n labelName: t.text(),\n }),\n (t) => ({\n byDomainId: index().on(t.domainId),\n byRegistrationDate: index().on(t.registrationDate),\n byExpiryDate: index().on(t.expiryDate),\n }),\n);\n\nexport const subgraph_registrationRelations = relations(subgraph_registration, ({ one, many }) => ({\n domain: one(subgraph_domain, {\n fields: [subgraph_registration.domainId],\n references: [subgraph_domain.id],\n }),\n registrant: one(subgraph_account, {\n fields: [subgraph_registration.registrantId],\n references: [subgraph_account.id],\n }),\n\n // event relations\n nameRegistereds: many(subgraph_nameRegistered),\n nameReneweds: many(subgraph_nameRenewed),\n nameTransferreds: many(subgraph_nameTransferred),\n}));\n\n/**\n * Wrapped Domain\n */\n\nexport const subgraph_wrappedDomain = onchainTable(\n \"subgraph_wrapped_domains\",\n (t) => ({\n // The unique identifier for each instance of the WrappedDomain entity\n id: t.hex().primaryKey(),\n // The domain that is wrapped by this WrappedDomain\n domainId: t.hex().notNull(),\n // The expiry date of the wrapped domain\n expiryDate: t.bigint().notNull(),\n // The number of fuses remaining on the wrapped domain\n fuses: t.integer().notNull(),\n // The account that owns this WrappedDomain\n ownerId: t.hex().notNull(),\n /**\n * The Name that this WrappedDomain represents. Names are emitted by the NameWrapper contract as\n * DNS-Encoded Names which may be malformed, which will result in this field being `null`.\n *\n * If {@link ENSIndexerConfig#isSubgraphCompatible}, this value is guaranteed to be either:\n * a) null (in the case of a DNS-Encoded Name that is malformed or contains subgraph-unindexable labels), or\n * b) a subgraph-indexable Subgraph Interpreted Label (i.e. a Literal Label of undefined normalization).\n *\n * @see https://ensnode.io/docs/reference/terminology#subgraph-indexability--labelname-interpretation\n *\n * Otherwise, this value is guaranteed to be either:\n * a) null (in the case of a malformed DNS-Encoded Name),\n * b) an Interpreted Name.\n *\n * @see https://ensnode.io/docs/reference/terminology#interpreted-name\n */\n name: t.text(),\n }),\n (t) => ({\n byDomainId: index().on(t.domainId),\n }),\n);\n\nexport const subgraph_wrappedDomainRelations = relations(subgraph_wrappedDomain, ({ one }) => ({\n domain: one(subgraph_domain, {\n fields: [subgraph_wrappedDomain.domainId],\n references: [subgraph_domain.id],\n }),\n owner: one(subgraph_account, {\n fields: [subgraph_wrappedDomain.ownerId],\n references: [subgraph_account.id],\n }),\n}));\n\n/**\n * Events\n */\n\nconst sharedEventColumns = (t: any) => ({\n id: t.text().primaryKey(),\n blockNumber: t.integer().notNull(),\n transactionID: t.hex().notNull(),\n});\n\nconst domainEvent = (t: any) => ({\n ...sharedEventColumns(t),\n domainId: t.hex().notNull(),\n});\n\nconst domainEventIndex = (t: any) => ({\n // primary reverse lookup\n idx: index().on(t.domainId),\n // sorting index\n idx_compound: index().on(t.domainId, t.id),\n});\n\n// Domain Event Entities\n\nexport const subgraph_transfer = onchainTable(\n \"subgraph_transfers\",\n (t) => ({\n ...domainEvent(t),\n ownerId: t.hex().notNull(),\n }),\n domainEventIndex,\n);\n\nexport const subgraph_newOwner = onchainTable(\n \"subgraph_new_owners\",\n (t) => ({\n ...domainEvent(t),\n ownerId: t.hex().notNull(),\n parentDomainId: t.hex().notNull(),\n }),\n domainEventIndex,\n);\n\nexport const subgraph_newResolver = onchainTable(\n \"subgraph_new_resolvers\",\n (t) => ({\n ...domainEvent(t),\n resolverId: t.text().notNull(),\n }),\n domainEventIndex,\n);\n\nexport const subgraph_newTTL = onchainTable(\n \"subgraph_new_ttls\",\n (t) => ({\n ...domainEvent(t),\n ttl: t.bigint().notNull(),\n }),\n domainEventIndex,\n);\n\nexport const subgraph_wrappedTransfer = onchainTable(\n \"subgraph_wrapped_transfers\",\n (t) => ({\n ...domainEvent(t),\n ownerId: t.hex().notNull(),\n }),\n domainEventIndex,\n);\n\nexport const subgraph_nameWrapped = onchainTable(\n \"subgraph_name_wrapped\",\n (t) => ({\n ...domainEvent(t),\n name: t.text(),\n fuses: t.integer().notNull(),\n ownerId: t.hex().notNull(),\n expiryDate: t.bigint().notNull(),\n }),\n domainEventIndex,\n);\n\nexport const subgraph_nameUnwrapped = onchainTable(\n \"subgraph_name_unwrapped\",\n (t) => ({\n ...domainEvent(t),\n ownerId: t.hex().notNull(),\n }),\n domainEventIndex,\n);\n\nexport const subgraph_fusesSet = onchainTable(\n \"subgraph_fuses_set\",\n (t) => ({\n ...domainEvent(t),\n fuses: t.integer().notNull(),\n }),\n domainEventIndex,\n);\n\nexport const subgraph_expiryExtended = onchainTable(\n \"subgraph_expiry_extended\",\n (t) => ({\n ...domainEvent(t),\n expiryDate: t.bigint().notNull(),\n }),\n domainEventIndex,\n);\n\n// Registration Event Entities\n\nconst registrationEvent = (t: any) => ({\n ...sharedEventColumns(t),\n registrationId: t.hex().notNull(),\n});\n\nconst registrationEventIndex = (t: any) => ({\n // primary reverse lookup\n idx: index().on(t.registrationId),\n // sorting index\n idx_compound: index().on(t.registrationId, t.id),\n});\n\nexport const subgraph_nameRegistered = onchainTable(\n \"subgraph_name_registered\",\n (t) => ({\n ...registrationEvent(t),\n registrantId: t.hex().notNull(),\n expiryDate: t.bigint().notNull(),\n }),\n registrationEventIndex,\n);\n\nexport const subgraph_nameRenewed = onchainTable(\n \"subgraph_name_renewed\",\n (t) => ({\n ...registrationEvent(t),\n expiryDate: t.bigint().notNull(),\n }),\n registrationEventIndex,\n);\n\nexport const subgraph_nameTransferred = onchainTable(\n \"subgraph_name_transferred\",\n (t) => ({\n ...registrationEvent(t),\n newOwnerId: t.hex().notNull(),\n }),\n registrationEventIndex,\n);\n\n// Resolver Event Entities\n\nconst resolverEvent = (t: any) => ({\n ...sharedEventColumns(t),\n resolverId: t.text().notNull(),\n});\n\nconst resolverEventIndex = (t: any) => ({\n // primary reverse lookup\n idx: index().on(t.resolverId),\n // sorting index\n idx_compound: index().on(t.resolverId, t.id),\n});\n\nexport const subgraph_addrChanged = onchainTable(\n \"subgraph_addr_changed\",\n (t) => ({\n ...resolverEvent(t),\n addrId: t.hex().notNull(),\n }),\n resolverEventIndex,\n);\n\nexport const subgraph_multicoinAddrChanged = onchainTable(\n \"subgraph_multicoin_addr_changed\",\n (t) => ({\n ...resolverEvent(t),\n coinType: t.bigint().notNull(),\n addr: t.hex().notNull(),\n }),\n resolverEventIndex,\n);\n\nexport const subgraph_nameChanged = onchainTable(\n \"subgraph_name_changed\",\n (t) => ({\n ...resolverEvent(t),\n name: t.text().notNull(),\n }),\n resolverEventIndex,\n);\n\nexport const subgraph_abiChanged = onchainTable(\n \"subgraph_abi_changed\",\n (t) => ({\n ...resolverEvent(t),\n contentType: t.bigint().notNull(),\n }),\n resolverEventIndex,\n);\n\nexport const subgraph_pubkeyChanged = onchainTable(\n \"subgraph_pubkey_changed\",\n (t) => ({\n ...resolverEvent(t),\n x: t.hex().notNull(),\n y: t.hex().notNull(),\n }),\n resolverEventIndex,\n);\n\nexport const subgraph_textChanged = onchainTable(\n \"subgraph_text_changed\",\n (t) => ({\n ...resolverEvent(t),\n key: t.text().notNull(),\n value: t.text(),\n }),\n resolverEventIndex,\n);\n\nexport const subgraph_contenthashChanged = onchainTable(\n \"subgraph_contenthash_changed\",\n (t) => ({\n ...resolverEvent(t),\n hash: t.hex().notNull(),\n }),\n resolverEventIndex,\n);\n\nexport const subgraph_interfaceChanged = onchainTable(\n \"subgraph_interface_changed\",\n (t) => ({\n ...resolverEvent(t),\n interfaceID: t.hex().notNull(),\n implementer: t.hex().notNull(),\n }),\n resolverEventIndex,\n);\n\nexport const subgraph_authorisationChanged = onchainTable(\n \"subgraph_authorisation_changed\",\n (t) => ({\n ...resolverEvent(t),\n owner: t.hex().notNull(),\n target: t.hex().notNull(),\n isAuthorized: t.boolean().notNull(),\n }),\n resolverEventIndex,\n);\n\nexport const subgraph_versionChanged = onchainTable(\n \"subgraph_version_changed\",\n (t) => ({\n ...resolverEvent(t),\n version: t.bigint().notNull(),\n }),\n resolverEventIndex,\n);\n\n/**\n * Event Relations\n */\n\n// Domain Event Relations\n\nexport const subgraph_transferRelations = relations(subgraph_transfer, ({ one }) => ({\n domain: one(subgraph_domain, {\n fields: [subgraph_transfer.domainId],\n references: [subgraph_domain.id],\n }),\n owner: one(subgraph_account, {\n fields: [subgraph_transfer.ownerId],\n references: [subgraph_account.id],\n }),\n}));\n\nexport const subgraph_newOwnerRelations = relations(subgraph_newOwner, ({ one }) => ({\n domain: one(subgraph_domain, {\n fields: [subgraph_newOwner.domainId],\n references: [subgraph_domain.id],\n }),\n owner: one(subgraph_account, {\n fields: [subgraph_newOwner.ownerId],\n references: [subgraph_account.id],\n }),\n parentDomain: one(subgraph_domain, {\n fields: [subgraph_newOwner.parentDomainId],\n references: [subgraph_domain.id],\n }),\n}));\n\nexport const subgraph_newResolverRelations = relations(subgraph_newResolver, ({ one }) => ({\n domain: one(subgraph_domain, {\n fields: [subgraph_newResolver.domainId],\n references: [subgraph_domain.id],\n }),\n resolver: one(subgraph_resolver, {\n fields: [subgraph_newResolver.resolverId],\n references: [subgraph_resolver.id],\n }),\n}));\n\nexport const subgraph_newTTLRelations = relations(subgraph_newTTL, ({ one }) => ({\n domain: one(subgraph_domain, {\n fields: [subgraph_newTTL.domainId],\n references: [subgraph_domain.id],\n }),\n}));\n\nexport const subgraph_wrappedTransferRelations = relations(subgraph_wrappedTransfer, ({ one }) => ({\n domain: one(subgraph_domain, {\n fields: [subgraph_wrappedTransfer.domainId],\n references: [subgraph_domain.id],\n }),\n owner: one(subgraph_account, {\n fields: [subgraph_wrappedTransfer.ownerId],\n references: [subgraph_account.id],\n }),\n}));\n\nexport const subgraph_nameWrappedRelations = relations(subgraph_nameWrapped, ({ one }) => ({\n domain: one(subgraph_domain, {\n fields: [subgraph_nameWrapped.domainId],\n references: [subgraph_domain.id],\n }),\n owner: one(subgraph_account, {\n fields: [subgraph_nameWrapped.ownerId],\n references: [subgraph_account.id],\n }),\n}));\n\nexport const subgraph_nameUnwrappedRelations = relations(subgraph_nameUnwrapped, ({ one }) => ({\n domain: one(subgraph_domain, {\n fields: [subgraph_nameUnwrapped.domainId],\n references: [subgraph_domain.id],\n }),\n owner: one(subgraph_account, {\n fields: [subgraph_nameUnwrapped.ownerId],\n references: [subgraph_account.id],\n }),\n}));\n\nexport const subgraph_fusesSetRelations = relations(subgraph_fusesSet, ({ one }) => ({\n domain: one(subgraph_domain, {\n fields: [subgraph_fusesSet.domainId],\n references: [subgraph_domain.id],\n }),\n}));\n\nexport const subgraph_expiryExtendedRelations = relations(subgraph_expiryExtended, ({ one }) => ({\n domain: one(subgraph_domain, {\n fields: [subgraph_expiryExtended.domainId],\n references: [subgraph_domain.id],\n }),\n}));\n\n// Registration Event Relations\n\nexport const subgraph_nameRegisteredRelations = relations(subgraph_nameRegistered, ({ one }) => ({\n registration: one(subgraph_registration, {\n fields: [subgraph_nameRegistered.registrationId],\n references: [subgraph_registration.id],\n }),\n registrant: one(subgraph_account, {\n fields: [subgraph_nameRegistered.registrantId],\n references: [subgraph_account.id],\n }),\n}));\n\nexport const subgraph_nameRenewedRelations = relations(subgraph_nameRenewed, ({ one }) => ({\n registration: one(subgraph_registration, {\n fields: [subgraph_nameRenewed.registrationId],\n references: [subgraph_registration.id],\n }),\n}));\n\nexport const subgraph_nameTransferredRelations = relations(subgraph_nameTransferred, ({ one }) => ({\n registration: one(subgraph_registration, {\n fields: [subgraph_nameTransferred.registrationId],\n references: [subgraph_registration.id],\n }),\n newOwner: one(subgraph_account, {\n fields: [subgraph_nameTransferred.newOwnerId],\n references: [subgraph_account.id],\n }),\n}));\n\n// Resolver Event Relations\n\nexport const subgraph_addrChangedRelations = relations(subgraph_addrChanged, ({ one }) => ({\n resolver: one(subgraph_resolver, {\n fields: [subgraph_addrChanged.resolverId],\n references: [subgraph_resolver.id],\n }),\n addr: one(subgraph_account, {\n fields: [subgraph_addrChanged.addrId],\n references: [subgraph_account.id],\n }),\n}));\n\nexport const subgraph_multicoinAddrChangedRelations = relations(\n subgraph_multicoinAddrChanged,\n ({ one }) => ({\n resolver: one(subgraph_resolver, {\n fields: [subgraph_multicoinAddrChanged.resolverId],\n references: [subgraph_resolver.id],\n }),\n }),\n);\n\nexport const subgraph_nameChangedRelations = relations(subgraph_nameChanged, ({ one }) => ({\n resolver: one(subgraph_resolver, {\n fields: [subgraph_nameChanged.resolverId],\n references: [subgraph_resolver.id],\n }),\n}));\n\nexport const subgraph_abiChangedRelations = relations(subgraph_abiChanged, ({ one }) => ({\n resolver: one(subgraph_resolver, {\n fields: [subgraph_abiChanged.resolverId],\n references: [subgraph_resolver.id],\n }),\n}));\n\nexport const subgraph_pubkeyChangedRelations = relations(subgraph_pubkeyChanged, ({ one }) => ({\n resolver: one(subgraph_resolver, {\n fields: [subgraph_pubkeyChanged.resolverId],\n references: [subgraph_resolver.id],\n }),\n}));\n\nexport const subgraph_textChangedRelations = relations(subgraph_textChanged, ({ one }) => ({\n resolver: one(subgraph_resolver, {\n fields: [subgraph_textChanged.resolverId],\n references: [subgraph_resolver.id],\n }),\n}));\n\nexport const subgraph_contenthashChangedRelations = relations(\n subgraph_contenthashChanged,\n ({ one }) => ({\n resolver: one(subgraph_resolver, {\n fields: [subgraph_contenthashChanged.resolverId],\n references: [subgraph_resolver.id],\n }),\n }),\n);\n\nexport const subgraph_interfaceChangedRelations = relations(\n subgraph_interfaceChanged,\n ({ one }) => ({\n resolver: one(subgraph_resolver, {\n fields: [subgraph_interfaceChanged.resolverId],\n references: [subgraph_resolver.id],\n }),\n }),\n);\n\nexport const subgraph_authorisationChangedRelations = relations(\n subgraph_authorisationChanged,\n ({ one }) => ({\n resolver: one(subgraph_resolver, {\n fields: [subgraph_authorisationChanged.resolverId],\n references: [subgraph_resolver.id],\n }),\n }),\n);\n\nexport const subgraph_versionChangedRelations = relations(subgraph_versionChanged, ({ one }) => ({\n resolver: one(subgraph_resolver, {\n fields: [subgraph_versionChanged.resolverId],\n references: [subgraph_resolver.id],\n }),\n}));\n","// https://github.com/drizzle-team/drizzle-orm/issues/638\nexport function monkeypatchCollate(col: any, collation: string) {\n col.getSQLType = function (this: any) {\n return `${Object.getPrototypeOf(this).getSQLType.call(this)} COLLATE ${collation}`;\n };\n return col;\n}\n","import { index, onchainTable } from \"ponder\";\n\nexport const nameSales = onchainTable(\n \"name_sales\",\n (t) => ({\n /**\n * Unique and deterministic identifier of the onchain event associated with the sale.\n *\n * Composite key format: \"{chainId}-{blockNumber}-{logIndex}\" (e.g., \"1-1234567-5\")\n */\n id: t.text().primaryKey(),\n\n /**\n * The chain where the sale occurred.\n */\n chainId: t.integer().notNull(),\n\n /**\n * The block number on chainId where the sale occurred.\n */\n blockNumber: t.bigint().notNull(),\n\n /**\n * The log index position of the sale event within blockNumber.\n */\n logIndex: t.integer().notNull(),\n\n /**\n * The EVM transaction hash on chainId associated with the sale.\n */\n transactionHash: t.hex().notNull(),\n\n /**\n * The Seaport order hash.\n */\n orderHash: t.hex().notNull(),\n\n /**\n * The address of the contract on chainId that manages tokenId.\n */\n contractAddress: t.hex().notNull(),\n\n /**\n * The tokenId managed by contractAddress that was sold.\n *\n * In a general context (outside of TokenScope) ERC1155 NFTs may have\n * multiple copies, however TokenScope guarantees that all indexed NFTs\n * never have an amount / balance > 1.\n */\n tokenId: t.bigint().notNull(),\n\n /**\n * The CAIP-19 Asset Namespace of the token that was sold. Either `erc721` or `erc1155`.\n *\n * @see https://chainagnostic.org/CAIPs/caip-19\n */\n assetNamespace: t.text().notNull(),\n\n /**\n * The CAIP-19 Asset ID of token that was sold. This is a globally unique reference to the\n * specific asset in question.\n *\n * @see https://chainagnostic.org/CAIPs/caip-19\n */\n assetId: t.text().notNull(),\n\n /**\n * The namehash (Node) of the ENS domain that was sold.\n */\n domainId: t.hex().notNull(),\n\n /**\n * The account that bought the token controlling ownership of domainId from\n * the seller for the amount of currency associated with the sale.\n */\n buyer: t.hex().notNull(),\n\n /**\n * The account that sold the token controlling ownership of domainId to\n * buyer for the amount of currency associated with the sale.\n */\n seller: t.hex().notNull(),\n\n /**\n * Currency of the payment (ETH, USDC or DAI) from buyer to seller in exchange for tokenId.\n */\n currency: t.text().notNull(),\n\n /**\n * The amount of currency paid from buyer to seller in exchange for tokenId.\n *\n * Denominated in the smallest unit of currency.\n *\n * Amount interpretation depends on currency:\n * - ETH/WETH: Amount in wei (1 ETH = 10^18 wei)\n * - USDC: Amount in micro-units (1 USDC = 10^6 units)\n * - DAI: Amount in wei-equivalent (1 DAI = 10^18 units)\n */\n amount: t.bigint().notNull(),\n\n /**\n * Unix timestamp of the block timestamp when the sale occurred.\n */\n timestamp: t.bigint().notNull(),\n }),\n (t) => ({\n idx_domainId: index().on(t.domainId),\n idx_assetId: index().on(t.assetId),\n idx_buyer: index().on(t.buyer),\n idx_seller: index().on(t.seller),\n idx_timestamp: index().on(t.timestamp),\n }),\n);\n\nexport const nameTokens = onchainTable(\n \"name_tokens\",\n (t) => ({\n /**\n * The CAIP-19 Asset ID of the token.\n *\n * This is a globally unique reference to the token.\n *\n * @see https://chainagnostic.org/CAIPs/caip-19\n */\n id: t.text().primaryKey(),\n\n /**\n * The namehash (Node) of the ENS name associated with the token.\n *\n * Note: An ENS name may have more than one distinct token across time. It is\n * also possible for multiple distinct tokens for an ENS name to have\n * a mintStatus of `minted` at the same time. For example:\n * - When a direct subname of .eth is wrapped by the NameWrapper. This state\n * has one minted token for the name managed by the BaseRegistrar (this\n * token will be owned by the NameWrapper) and another minted token for\n * the name managed by the NameWrapper (owned by the effective owner of\n * the name).\n * - When a direct subname of .eth is wrapped by the NameWrapper and then\n * unwrapped. This state has one minted token (managed by the BaseRegistrar)\n * and another burned token (managed by the NameWrapper).\n */\n domainId: t.hex().notNull(),\n\n /**\n * The chain that manages the token.\n */\n chainId: t.integer().notNull(),\n\n /**\n * The address of the contract on chainId that manages the token.\n */\n contractAddress: t.hex().notNull(),\n\n /**\n * The tokenId of the token managed by contractAddress.\n *\n * In a general context (outside of TokenScope) ERC1155 NFTs may have\n * multiple copies, however TokenScope guarantees that all indexed NFTs\n * never have an amount / balance > 1.\n */\n tokenId: t.bigint().notNull(),\n\n /**\n * The CAIP-19 Asset Namespace of the token. Either `erc721` or `erc1155`.\n *\n * @see https://chainagnostic.org/CAIPs/caip-19\n */\n assetNamespace: t.text().notNull(),\n\n /**\n * The account that owns the token.\n *\n * Value is zeroAddress if and only if mintStatus is `burned`.\n *\n * Note: The owner of the token for a given domainId may differ from the\n * owner of the associated node in the registry. For example:\n * - Consider the case where address X owns the ENS name `foo.eth` in\n * both the BaseRegistrar and the Registry. If X sends a request directly\n * to the Registry to transfer ownership to Y, ownership of `foo.eth` will\n * be transferred to Y in the Registry but not in the BaseRegistrar.\n * - ... for the case above, the BaseRegistrar implements a `reclaim`\n * allowing the owner of the name in the BaseRegistrar to reclaim ownership\n * of the name in the Registry.\n *\n * Note: When a name is wrapped by the NameWrapper, the owner of the token\n * in the BaseRegistrar is the NameWrapper, while a new token for the name is\n * minted by the NameWrapper and owned by the effective owner of the name.\n */\n owner: t.hex().notNull(),\n\n /**\n * The mint status of the token. Either `minted` or `burned`.\n *\n * After we index a NFT we never delete it from our index. Instead, when an\n * indexed NFT is burned onchain we retain its record and update its mint\n * status as `burned`. If a NFT is minted again after it is burned its mint\n * status is updated to `minted`.\n */\n mintStatus: t.text().notNull(),\n }),\n (t) => ({\n idx_domainId: index().on(t.domainId),\n idx_owner: index().on(t.owner),\n }),\n);\n","import { pgSchema, primaryKey } from \"drizzle-orm/pg-core\";\n\n/**\n * ENSNode Schema Name\n *\n * The name of the ENSNode schema in an ENSDb.\n */\nconst ENSNODE_SCHEMA_NAME = \"ensnode\";\n\n/**\n * ENSNode Schema\n *\n * Defines database objects within the ENSNode Schema in ENSDb.\n */\nconst ENSNODE_SCHEMA = pgSchema(ENSNODE_SCHEMA_NAME);\n\n/**\n * ENSNode Metadata\n *\n * Possible key value pairs are defined by 'EnsNodeMetadata' type:\n * - `EnsNodeMetadataEnsDbVersion`\n * - `EnsNodeMetadataEnsIndexerPublicConfig`\n * - `EnsNodeMetadataEnsIndexerIndexingStatus`\n */\nexport const metadata = ENSNODE_SCHEMA.table(\n \"metadata\",\n (t) => ({\n /**\n * ENSIndexer Schema Name\n *\n * References the name of the ENSIndexer Schema that the metadata record\n * belongs to. This allows multi-tenancy where multiple ENSIndexer\n * instances can write to the same ENSNode Metadata table.\n */\n ensIndexerSchemaName: t.text().notNull(),\n\n /**\n * Key\n *\n * Allowed keys:\n * - `EnsNodeMetadataEnsDbVersion['key']`\n * - `EnsNodeMetadataEnsIndexerPublicConfig['key']`\n * - `EnsNodeMetadataEnsIndexerIndexingStatus['key']`\n */\n key: t.text().notNull(),\n\n /**\n * Value\n *\n * Allowed values:\n * - `EnsNodeMetadataEnsDbVersion['value']`\n * - `EnsNodeMetadataEnsIndexerPublicConfig['value']`\n * - `EnsNodeMetadataEnsIndexerIndexingStatus['value']`\n *\n * Guaranteed to be a serialized representation of JSON object.\n */\n value: t.jsonb().notNull(),\n }),\n (table) => [\n /**\n * Primary key constraint on 'ensIndexerSchemaName' and 'key' columns,\n * to ensure that there is only one record for each key per ENSIndexer instance.\n */\n primaryKey({\n name: \"metadata_pkey\",\n columns: [table.ensIndexerSchemaName, table.key],\n }),\n ],\n);\n","/**\n * Utilities for Drizzle ORM integration with ENSDb.\n */\nimport type { Logger as DrizzleLogger } from \"drizzle-orm/logger\";\nimport { drizzle, type NodePgDatabase } from \"drizzle-orm/node-postgres\";\nimport { isPgEnum } from \"drizzle-orm/pg-core\";\nimport { isTable, Table } from \"drizzle-orm/table\";\n\n// Import the \"abstract\" ENSIndexer Schema.\n// It's called \"abstract\" here because tables defined in this schema do not\n// reference the specific ENSIndexer Schema name, and therefore cannot be used\n// directly to build a Drizzle client for ENSDb.\nimport * as abstractEnsIndexerSchema from \"../ensindexer-abstract\";\nimport * as ensNodeSchema from \"../ensnode\";\nimport { createChecksum } from \"./checksum\";\n\n/**\n * PostgreSQL startup `options` string for ENSDb connections.\n *\n * Sets `search_path` so unqualified references (notably the `gin_trgm_ops`\n * opclass from the pg_trgm extension, installed in the `ensnode` schema by\n * migration 0001) resolve correctly at query and index-creation time.\n *\n * Pass via node-postgres `PoolConfig.options` (e.g. Ponder's\n * `database.poolConfig.options`) or Drizzle's connection config.\n */\nexport const ENSDB_CONNECTION_OPTIONS = \"-c search_path=ensnode,public\";\n\n/**\n * Abstract ENSIndexer Schema\n *\n * Represents the \"abstract\" ENSIndexer Schema definition, where tables do not reference\n * the specific ENSIndexer Schema name.\n */\nexport type AbstractEnsIndexerSchema = typeof abstractEnsIndexerSchema;\n\n// TODO: remove the `appliedNameForConcreteEnsIndexerSchema` variable and\n// related logic when the `buildConcreteEnsIndexerSchema` function is\n// refactored to avoid mutating the \"abstract\" ENSIndexer Schema definition.\n/**\n * Applied name for the \"concrete\" ENSIndexer Schema.\n *\n * This is needed to prevent multiple calls to `buildConcreteEnsIndexerSchema` with different schema names,\n * which would mutate the same \"abstract\" ENSIndexer Schema and cause schema corruption.\n */\nlet appliedNameForConcreteEnsIndexerSchema: string | undefined;\n\n/**\n * Build a \"concrete\" ENSIndexer Schema definition for ENSDb.\n *\n * This function uses the \"abstract\" ENSIndexer Schema definition\n * to create a \"concrete\" ENSIndexer Schema definition referencing the provided\n * ENSIndexer Schema name. The \"concrete\" ENSIndexer Schema definition can then\n * be used to build the ENSDb Schema for a Drizzle client for ENSDb.\n *\n * @param ensIndexerSchemaName - The name of the ENSIndexer Schema instance in ENSDb.\n *\n * Note: this function is a replacement for `setDatabaseSchema` from `@ponder/client`.\n */\nfunction buildConcreteEnsIndexerSchema<ConcreteEnsIndexerSchema extends AbstractEnsIndexerSchema>(\n ensIndexerSchemaName: string,\n): ConcreteEnsIndexerSchema {\n // TODO: Refactor this function to avoid mutating the \"abstract\" ENSIndexer Schema definition.\n // https://github.com/namehash/ensnode/issues/1830\n\n if (\n appliedNameForConcreteEnsIndexerSchema !== undefined &&\n appliedNameForConcreteEnsIndexerSchema !== ensIndexerSchemaName\n ) {\n throw new Error(\n `buildConcreteEnsIndexerSchema was already called with schema \"${appliedNameForConcreteEnsIndexerSchema}\". ` +\n `Calling it again with \"${ensIndexerSchemaName}\" would corrupt the previously built schema.`,\n );\n }\n appliedNameForConcreteEnsIndexerSchema = ensIndexerSchemaName;\n\n const concreteEnsIndexerSchema = abstractEnsIndexerSchema as ConcreteEnsIndexerSchema;\n\n for (const dbObject of Object.values(abstractEnsIndexerSchema)) {\n if (isTable(dbObject)) {\n // Update Drizzle table definition to reference\n // the specific `ensIndexerSchemaName` name of the ENSIndexer Schema.\n // @ts-expect-error - Drizzle types don't define `Table.Symbol.Schema` type,\n // but it's present at runtime.\n dbObject[Table.Symbol.Schema] = ensIndexerSchemaName;\n } else if (isPgEnum(dbObject)) {\n // Update Drizzle enum definition to reference\n // the specific `ensIndexerSchemaName` name of the ENSIndexer Schema.\n // @ts-expect-error - Drizzle types consider `schema` to be\n // a readonly property.\n dbObject.schema = ensIndexerSchemaName;\n }\n }\n\n return concreteEnsIndexerSchema;\n}\n\n/**\n * ENSNode Schema\n *\n * Represents the ENSNode Schema definition for ENSDb.\n */\nexport type EnsNodeSchema = typeof ensNodeSchema;\n\n/**\n * Build individual ENSDb Schemas\n *\n * @param ensIndexerSchemaName - The name of the ENSIndexer Schema instance in ENSDb.\n * @returns An object containing the \"concrete\" ENSIndexer Schema and the ENSNode Schema.\n */\nexport function buildIndividualEnsDbSchemas<\n ConcreteEnsIndexerSchema extends AbstractEnsIndexerSchema,\n>(\n ensIndexerSchemaName: string,\n): {\n concreteEnsIndexerSchema: ConcreteEnsIndexerSchema;\n ensNodeSchema: EnsNodeSchema;\n} {\n return {\n concreteEnsIndexerSchema: buildConcreteEnsIndexerSchema(ensIndexerSchemaName),\n ensNodeSchema,\n };\n}\n\n/**\n * ENSDb Schema type\n *\n * Represents the combined database schema for ENSDb,\n * including both the \"concrete\" ENSIndexer Schema and the ENSNode Schema.\n */\ntype EnsDbSchema<ConcreteEnsIndexerSchema extends AbstractEnsIndexerSchema> =\n ConcreteEnsIndexerSchema & EnsNodeSchema;\n\n/**\n * Build ENSDb Schema for Drizzle client\n *\n * Uses the provided \"concrete\" ENSIndexer Schema definition to build\n * the ENSDb Schema.\n *\n * @param concreteEnsIndexerSchema - The \"concrete\" ENSIndexer Schema definition.\n * @returns The ENSDb Schema definition for use in building\n * a Drizzle client for ENSDb.\n */\nfunction buildEnsDbSchema<ConcreteEnsIndexerSchema extends AbstractEnsIndexerSchema>(\n concreteEnsIndexerSchema: ConcreteEnsIndexerSchema,\n): EnsDbSchema<ConcreteEnsIndexerSchema> {\n return {\n ...concreteEnsIndexerSchema,\n ...ensNodeSchema,\n };\n}\n\n/**\n * Drizzle client type for ENSDb.\n *\n * The `ConcreteEnsIndexerSchema` type parameter allows for typing\n * the Drizzle client with a \"concrete\" ENSIndexer Schema definition\n * where tables reference the specific ENSIndexer Schema name.\n */\nexport type EnsDbDrizzleClient<ConcreteEnsIndexerSchema extends AbstractEnsIndexerSchema> =\n NodePgDatabase<EnsDbSchema<ConcreteEnsIndexerSchema>>;\n\n/**\n * Build a Drizzle client for ENSDb.\n *\n * @param connectionString - The connection string for the ENSDb.\n * @param concreteEnsIndexerSchema - The \"concrete\" ENSIndexer Schema definition for the Drizzle client.\n * @param logger - Optional Drizzle logger for query logging.\n * @returns A Drizzle client for ENSDb.\n */\nexport function buildEnsDbDrizzleClient<ConcreteEnsIndexerSchema extends AbstractEnsIndexerSchema>(\n connectionString: string,\n concreteEnsIndexerSchema: ConcreteEnsIndexerSchema,\n logger?: DrizzleLogger,\n): EnsDbDrizzleClient<ConcreteEnsIndexerSchema> {\n const ensDbSchema = buildEnsDbSchema<ConcreteEnsIndexerSchema>(concreteEnsIndexerSchema);\n\n return drizzle({\n connection: { connectionString, options: ENSDB_CONNECTION_OPTIONS },\n schema: ensDbSchema,\n casing: \"snake_case\",\n logger,\n });\n}\n\n/**\n * Safely stringify a Drizzle schema definition.\n *\n * Handles circular references in the Drizzle schema definition by replacing\n * them with the string \"[circular]\". Thanks to this, we can safely stringify\n * any Drizzle schema definition without running into errors due to inability\n * of {@link JSON.stringify} to handle circular references by default.\n *\n * Note: {@link JSON.stringify} omits function-valued properties, so\n * column-level attributes such as `.$defaultFn()` or `.$onUpdateFn()` will not\n * be included in the stringified output and will not affect the checksum.\n * Schema changes that only modify such function-valued properties may go\n * undetected.\n *\n * @param schema - A Drizzle schema definition to stringify.\n * @returns A JSON string representation of the schema, with circular\n * references replaced by \"[circular]\".\n */\nfunction safeStringifyDrizzleSchema(schema: Record<string, unknown>): string {\n const seen = new WeakSet();\n\n return JSON.stringify(schema, (_key, value) => {\n if (typeof value === \"bigint\") return `${value}n`;\n\n if (typeof value === \"object\" && value !== null) {\n if (seen.has(value)) return \"[circular]\";\n seen.add(value);\n }\n\n return value;\n });\n}\n\n/**\n * Get a checksum for a Drizzle schema definition.\n *\n * @param schema - A Drizzle schema definition to get the checksum for.\n * @returns A 10-character checksum string for the schema.\n */\nexport function getDrizzleSchemaChecksum(schema: Record<string, unknown>): string {\n const stringifiedSchema = safeStringifyDrizzleSchema(schema);\n\n return createChecksum(stringifiedSchema);\n}\n","import { type BinaryLike, createHash } from \"node:crypto\";\n\n/**\n * Create a checksum for the given data\n *\n * @param data - The data to create a checksum for\n * @returns A 10-character hash string representing the checksum of the data\n *\n */\nexport function createChecksum(data: BinaryLike): string {\n return createHash(\"sha256\").update(data).digest(\"hex\").slice(0, 10);\n}\n","import * as abstractEnsIndexerSchema from \"../ensindexer-abstract\";\nimport * as ensNodeSchema from \"../ensnode\";\nimport { getDrizzleSchemaChecksum } from \"../lib/drizzle\";\n\n/**\n * ENSDb Config\n */\nexport interface EnsDbConfig {\n /**\n * PostgreSQL connection string for ENSDb.\n *\n * Guaranteed to be a valid PostgreSQL connection string with the format:\n * `postgresql://username:password@host:port/database` or\n * `postgres://username:password@host:port/database`\n */\n ensDbUrl: string;\n\n /**\n * The name of the ENSIndexer Schema in the ENSDb instance.\n *\n * Guaranteed to be a non-empty string that is\n * a valid Postgres database schema identifier\n */\n ensIndexerSchemaName: string;\n}\n\n/**\n * ENSDb Schema Checksum\n *\n * Checksum representing the ENSDb Schema definition, which is a combination of\n * - the ENSIndexer Schema definition, and\n * - the ENSNode Schema definition.\n *\n * This checksum can be used to verify compatibility between\n * the ENSDb Schema definition expected by any client app connecting to ENSDb\n * instance and the actual ENSDb Schema definition present in ENSDb SDK.\n */\nexport const ENSDB_SCHEMA_CHECKSUM = getDrizzleSchemaChecksum({\n ...abstractEnsIndexerSchema,\n ...ensNodeSchema,\n});\n\nexport { ENSDB_CONNECTION_OPTIONS } from \"../lib/drizzle\";\n","import { and, eq } from \"drizzle-orm/sql\";\n\nimport {\n type CrossChainIndexingStatusSnapshot,\n deserializeCrossChainIndexingStatusSnapshot,\n deserializeEnsIndexerPublicConfig,\n type EnsDbPublicConfig,\n type EnsDbVersionInfo,\n type EnsIndexerPublicConfig,\n} from \"@ensnode/ensnode-sdk\";\n\nimport {\n type AbstractEnsIndexerSchema,\n buildEnsDbDrizzleClient,\n buildIndividualEnsDbSchemas,\n type EnsDbDrizzleClient,\n type EnsNodeSchema,\n} from \"../lib/drizzle\";\nimport { parsePgVersionInfo } from \"../lib/parse-pg-version-info\";\nimport { EnsNodeMetadataKeys } from \"./ensnode-metadata\";\nimport type {\n SerializedEnsNodeMetadata,\n SerializedEnsNodeMetadataEnsDbVersion,\n SerializedEnsNodeMetadataEnsIndexerIndexingStatus,\n SerializedEnsNodeMetadataEnsIndexerPublicConfig,\n} from \"./serialize/ensnode-metadata\";\n\n/**\n * Re-export the ENSDb Drizzle Client type for external use in building\n * custom ENSDb queries with proper typing of the \"concrete\" ENSIndexer Schema\n * from the ENSDbReader instance.\n */\nexport type { EnsDbDrizzleClient } from \"../lib/drizzle\";\n\n/**\n * ENSDb Reader\n *\n * Enables read-only querying of an ENSDb instance, including data spanning\n * the ENSNode Schema and the specified ENSIndexer Schema.\n *\n * Note: we use a parameter type `ConcreteEnsIndexerSchema` to represent\n * the \"concrete\" ENSIndexer Schema type within the ENSDb Schema and\n * make sure that the Drizzle client used for querying is typed with\n * the same \"concrete\" ENSIndexer Schema type.\n */\nexport class EnsDbReader<\n ConcreteEnsIndexerSchema extends AbstractEnsIndexerSchema = AbstractEnsIndexerSchema,\n> {\n /**\n * Drizzle client for ENSDb.\n *\n * Uses the ENSDb Schema from {@link ensDbSchema}.\n */\n protected drizzleClient: EnsDbDrizzleClient<ConcreteEnsIndexerSchema>;\n\n /**\n * \"Concrete\" ENSIndexer Schema definition for ENSDb.\n *\n * This is the \"concrete\" ENSIndexer Schema in which tables reference\n * the ENSIndexer Schema name from {@link ensIndexerSchemaName}.\n */\n protected _concreteEnsIndexerSchema: ConcreteEnsIndexerSchema;\n\n /**\n * The name of the ENSIndexer schema to read from in ENSDb.\n *\n * This also identifies which ENSNode metadata records to read from the ENSNode Schema\n * as the ENSNode Schema is multi-tenant across ENSIndexer instances / ENSIndexer Schemas in an ENSDb.\n */\n protected _ensIndexerSchemaName: string;\n\n protected _ensNodeSchema: EnsNodeSchema;\n\n /**\n * @param ensDbUrl The connection string for Drizzle to connect to the ENSDb instance.\n * @param ensIndexerSchemaName The name of the ENSIndexer schema to read from in ENSDb, used to identify which ENSNode metadata records to read.\n */\n constructor(ensDbUrl: string, ensIndexerSchemaName: string) {\n const { concreteEnsIndexerSchema, ensNodeSchema } =\n buildIndividualEnsDbSchemas<ConcreteEnsIndexerSchema>(ensIndexerSchemaName);\n const ensDbDrizzleClient = buildEnsDbDrizzleClient<ConcreteEnsIndexerSchema>(\n ensDbUrl,\n concreteEnsIndexerSchema,\n );\n this.drizzleClient = ensDbDrizzleClient;\n this._concreteEnsIndexerSchema = concreteEnsIndexerSchema;\n this._ensIndexerSchemaName = ensIndexerSchemaName;\n this._ensNodeSchema = ensNodeSchema;\n }\n\n /**\n * Getter for the Drizzle client for ENSDb instance\n *\n * Useful while working on complex queries for ENSDb.\n */\n get ensDb(): EnsDbDrizzleClient<ConcreteEnsIndexerSchema> {\n return this.drizzleClient;\n }\n\n /**\n * Getter for the \"concrete\" ENSIndexer Schema definition used in the Drizzle client\n * for ENSDb instance.\n *\n * Useful while working on complex queries for ENSDb.\n *\n * Note: using `ensIndexerSchema` name for this getter to make it read better\n * in the context of query building. For example:\n * `this.ensDb.select().from(this.ensIndexerSchema.event)` vs.\n * `this.ensDb.select().from(this.concreteEnsIndexerSchema.event)`.\n */\n get ensIndexerSchema(): ConcreteEnsIndexerSchema {\n return this._concreteEnsIndexerSchema;\n }\n\n /**\n * Getter for the ENSIndexer Schema Name used by this ENSDbReader instance.\n */\n get ensIndexerSchemaName(): string {\n return this._ensIndexerSchemaName;\n }\n\n /**\n * Getter for the ENSNode Schema definition used in the Drizzle client\n * for ENSDb instance.\n *\n * Useful while working on complex queries for ENSDb.\n */\n get ensNodeSchema(): EnsNodeSchema {\n return this._ensNodeSchema;\n }\n\n /**\n * Get ENSDb Version\n *\n * @returns the existing record, or `undefined`.\n */\n async getEnsDbVersion(): Promise<string | undefined> {\n const record = await this.getEnsNodeMetadata<SerializedEnsNodeMetadataEnsDbVersion>({\n key: EnsNodeMetadataKeys.EnsDbVersion,\n });\n\n return record;\n }\n\n /**\n * Get ENSIndexer Public Config\n *\n * @returns the existing record, or `undefined`.\n */\n async getEnsIndexerPublicConfig(): Promise<EnsIndexerPublicConfig | undefined> {\n const record = await this.getEnsNodeMetadata<SerializedEnsNodeMetadataEnsIndexerPublicConfig>({\n key: EnsNodeMetadataKeys.EnsIndexerPublicConfig,\n });\n\n if (!record) {\n return undefined;\n }\n\n return deserializeEnsIndexerPublicConfig(record);\n }\n\n /**\n * Build ENSDb Public Config\n */\n async buildEnsDbPublicConfig(): Promise<EnsDbPublicConfig> {\n const versionInfo = await this.buildEnsDbVersionInfo();\n\n return {\n versionInfo,\n };\n }\n\n /**\n * Get Indexing Status Snapshot\n *\n * @returns the existing record, or `undefined`.\n */\n async getIndexingStatusSnapshot(): Promise<CrossChainIndexingStatusSnapshot | undefined> {\n const record = await this.getEnsNodeMetadata<SerializedEnsNodeMetadataEnsIndexerIndexingStatus>(\n {\n key: EnsNodeMetadataKeys.EnsIndexerIndexingStatus,\n },\n );\n\n if (!record) {\n return undefined;\n }\n\n return deserializeCrossChainIndexingStatusSnapshot(record);\n }\n\n /**\n * Get ENSNode Metadata record\n *\n * @returns selected record in ENSDb.\n * @throws when more than one matching metadata record is found\n * (should be impossible given the composite PK constraint on\n * 'ensIndexerSchemaName' and 'key')\n */\n private async getEnsNodeMetadata<EnsNodeMetadataType extends SerializedEnsNodeMetadata>(\n metadata: Pick<EnsNodeMetadataType, \"key\">,\n ): Promise<EnsNodeMetadataType[\"value\"] | undefined> {\n const result = await this.ensDb\n .select()\n .from(this.ensNodeSchema.metadata)\n .where(\n and(\n eq(this.ensNodeSchema.metadata.ensIndexerSchemaName, this.ensIndexerSchemaName),\n eq(this.ensNodeSchema.metadata.key, metadata.key),\n ),\n );\n\n if (result.length === 0) {\n return undefined;\n }\n\n if (result.length === 1 && result[0]) {\n return result[0].value as EnsNodeMetadataType[\"value\"];\n }\n\n throw new Error(\n `There must be exactly one ENSNodeMetadata record for ('${this.ensIndexerSchemaName}', '${metadata.key}') composite key`,\n );\n }\n\n /**\n * Get PostgreSQL version for the server hosting the ENSDb instance.\n *\n * @throws when the version cannot be retrieved or parsed from the query result.\n */\n private async getPostgresVersion(): Promise<string> {\n const result = await this.ensDb.execute<{ version: string }>(\"SELECT version();\");\n\n // result will be in the form of [{ version: \"PostgreSQL 15.5 (Ubuntu 15.5-0ubuntu0.22.04.1) ...\" }]\n const versionString = result.rows[0]?.version;\n\n try {\n return parsePgVersionInfo(versionString);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"Unknown error\";\n throw new Error(`Failed to get PostgreSQL version for the ENSDb instance: ${errorMessage}`);\n }\n }\n\n /**\n * Build ENSDb version info.\n *\n * @throws when version info cannot be retrieved or parsed from\n * the ENSDb instance.\n */\n private async buildEnsDbVersionInfo(): Promise<EnsDbVersionInfo> {\n const postgresVersion = await this.getPostgresVersion();\n\n return {\n postgresql: postgresVersion,\n };\n }\n}\n","/**\n * Parse PostgreSQL version information from a version string.\n *\n * @param versionString The version string is expected to be in the format\n * returned by the PostgreSQL `version()` function,\n * which typically looks like:\n * \"PostgreSQL 15.5 (Ubuntu 15.5-0ubuntu0.22.04.1) ...\"\n * @returns The parsed PostgreSQL version as a string.\n */\nexport function parsePgVersionInfo(versionString: string | undefined): string {\n if (typeof versionString !== \"string\") {\n throw new Error(\"PostgreSQL version string must be a string\");\n }\n\n // extract the version number using regex\n const match = versionString.match(/PostgreSQL (\\d+\\.\\d+)/);\n\n if (!match) {\n throw new Error(`Failed to parse PostgreSQL version from version string: '${versionString}'`);\n }\n\n const parsedVersion = match[1];\n\n if (typeof parsedVersion !== \"string\") {\n throw new Error(`Parsed PostgreSQL version is not a string: '${parsedVersion}'`);\n }\n\n return parsedVersion;\n}\n","import type {\n CrossChainIndexingStatusSnapshot,\n EnsIndexerPublicConfig,\n} from \"@ensnode/ensnode-sdk\";\n\n/**\n * Keys used to distinguish records in `ensnode_metadata` table in the ENSDb.\n */\nexport const EnsNodeMetadataKeys = {\n EnsDbVersion: \"ensdb_version\",\n EnsIndexerPublicConfig: \"ensindexer_public_config\",\n EnsIndexerIndexingStatus: \"ensindexer_indexing_status\",\n} as const;\n\nexport type EnsNodeMetadataKey = (typeof EnsNodeMetadataKeys)[keyof typeof EnsNodeMetadataKeys];\n\nexport interface EnsNodeMetadataEnsDbVersion {\n key: typeof EnsNodeMetadataKeys.EnsDbVersion;\n value: string;\n}\n\nexport interface EnsNodeMetadataEnsIndexerPublicConfig {\n key: typeof EnsNodeMetadataKeys.EnsIndexerPublicConfig;\n value: EnsIndexerPublicConfig;\n}\n\nexport interface EnsNodeMetadataEnsIndexerIndexingStatus {\n key: typeof EnsNodeMetadataKeys.EnsIndexerIndexingStatus;\n value: CrossChainIndexingStatusSnapshot;\n}\n\n/**\n * ENSNode Metadata\n *\n * Union type gathering all variants of ENSNode Metadata.\n */\nexport type EnsNodeMetadata =\n | EnsNodeMetadataEnsDbVersion\n | EnsNodeMetadataEnsIndexerPublicConfig\n | EnsNodeMetadataEnsIndexerIndexingStatus;\n","import { migrate } from \"drizzle-orm/node-postgres/migrator\";\n\nimport {\n type CrossChainIndexingStatusSnapshot,\n type EnsIndexerPublicConfig,\n serializeCrossChainIndexingStatusSnapshot,\n serializeEnsIndexerPublicConfig,\n} from \"@ensnode/ensnode-sdk\";\n\nimport { EnsDbReader } from \"./ensdb-reader\";\nimport { EnsNodeMetadataKeys } from \"./ensnode-metadata\";\nimport type { SerializedEnsNodeMetadata } from \"./serialize/ensnode-metadata\";\n\n/**\n * ENSDb Writer\n *\n * Allows updating an ENSDb instance, including:\n * - executing database migrations for ENSNode Schema,\n * - updating ENSNode Metadata records in ENSDb for the given ENSIndexer instance.\n */\nexport class EnsDbWriter extends EnsDbReader {\n /**\n * Execute pending database migrations for ENSNode Schema in ENSDb.\n *\n * @param migrationsDirPath - The file path to the directory containing\n * database migration files for ENSNode Schema.\n * @throws error when migration execution fails.\n */\n async migrateEnsNodeSchema(migrationsDirPath: string): Promise<void> {\n return migrate(this.drizzleClient, {\n migrationsFolder: migrationsDirPath,\n migrationsSchema: \"ensnode\",\n });\n }\n\n /**\n * Upsert ENSDb Version\n *\n * @throws when upsert operation failed.\n */\n async upsertEnsDbVersion(ensDbVersion: string): Promise<void> {\n await this.upsertEnsNodeMetadata({\n key: EnsNodeMetadataKeys.EnsDbVersion,\n value: ensDbVersion,\n });\n }\n\n /**\n * Upsert ENSIndexer Public Config\n *\n * @throws when upsert operation failed.\n */\n async upsertEnsIndexerPublicConfig(\n ensIndexerPublicConfig: EnsIndexerPublicConfig,\n ): Promise<void> {\n await this.upsertEnsNodeMetadata({\n key: EnsNodeMetadataKeys.EnsIndexerPublicConfig,\n value: serializeEnsIndexerPublicConfig(ensIndexerPublicConfig),\n });\n }\n\n /**\n * Upsert Indexing Status Snapshot\n *\n * @throws when upsert operation failed.\n */\n async upsertIndexingStatusSnapshot(\n indexingStatus: CrossChainIndexingStatusSnapshot,\n ): Promise<void> {\n await this.upsertEnsNodeMetadata({\n key: EnsNodeMetadataKeys.EnsIndexerIndexingStatus,\n value: serializeCrossChainIndexingStatusSnapshot(indexingStatus),\n });\n }\n\n /**\n * Upsert ENSNode metadata\n *\n * @throws when upsert operation failed.\n */\n private async upsertEnsNodeMetadata(metadata: SerializedEnsNodeMetadata): Promise<void> {\n await this.ensDb\n .insert(this.ensNodeSchema.metadata)\n .values({\n ensIndexerSchemaName: this.ensIndexerSchemaName,\n key: metadata.key,\n value: metadata.value,\n })\n .onConflictDoUpdate({\n target: [this.ensNodeSchema.metadata.ensIndexerSchemaName, this.ensNodeSchema.metadata.key],\n set: { value: metadata.value },\n });\n }\n}\n","import { prettifyError } from \"zod/v4\";\n\nimport type { Unvalidated } from \"@ensnode/ensnode-sdk\";\n\nimport type { EnsDbConfig } from \"../ensdb-config\";\nimport { EnsDbConfigSchema } from \"../zod-schemas/ensdb-config\";\n\n/**\n * Validate ENSDb config\n *\n * @param unvalidatedConfig - Unvalidated ENSDb config\n * @returns Valid ENSDb config\n * @throws Error if validation fails, with details about the validation errors\n */\nexport function validateEnsDbConfig(unvalidatedConfig: Unvalidated<EnsDbConfig>): EnsDbConfig {\n const ensDbConfig = EnsDbConfigSchema.safeParse(unvalidatedConfig);\n\n if (!ensDbConfig.success) {\n throw new Error(`Failed to parse ENSDb configuration: \\n${prettifyError(ensDbConfig.error)}\\n`);\n }\n\n return ensDbConfig.data;\n}\n","import { parse as parseConnectionString } from \"pg-connection-string\";\nimport { z } from \"zod/v4\";\n\nexport const EnsDbUrlSchema = z.string().refine(\n (url) => {\n try {\n if (!url.startsWith(\"postgresql://\") && !url.startsWith(\"postgres://\")) {\n return false;\n }\n const config = parseConnectionString(url);\n return !!(config.host && config.port && config.database);\n } catch {\n return false;\n }\n },\n {\n error:\n \"Invalid PostgreSQL connection string for ENSDb. Expected format: postgresql://username:password@host:port/database\",\n },\n);\n\nconst EnsIndexerSchemaNameSchema = z\n .string({\n error: \"ENSIndexer Schema Name is required.\",\n })\n .trim()\n .nonempty({\n error: \"ENSIndexer Schema Name cannot be an empty string.\",\n });\n\nexport const EnsDbConfigSchema = z.object({\n ensDbUrl: EnsDbUrlSchema,\n ensIndexerSchemaName: EnsIndexerSchemaNameSchema,\n});\n"],"mappings":"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","names":["onchainTable","primaryKey","relations","uniqueIndex","index","onchainEnum","onchainTable","relations","uniqueIndex","index","onchainTable","relations","sql","onchainTable","index","sql","relations","domainEvent","resolverEvent","index","onchainTable","primaryKey","metadata","metadata"]}
1
+ {"version":3,"sources":["../src/ensindexer-abstract/index.ts","../src/ensindexer-abstract/ensv2.schema.ts","../src/ensindexer-abstract/migrated-nodes.schema.ts","../src/ensindexer-abstract/protocol-acceleration.schema.ts","../src/ensindexer-abstract/registrars.schema.ts","../src/ensindexer-abstract/subgraph.schema.ts","../src/lib/collate.ts","../src/ensindexer-abstract/tokenscope.schema.ts","../src/ensnode/index.ts","../src/lib/drizzle.ts","../src/lib/checksum.ts","../src/client/ensdb-config.ts","../src/client/ensdb-reader.ts","../src/lib/parse-pg-version-info.ts","../src/client/ensnode-metadata.ts","../src/client/ensdb-writer.ts","../src/lib/advisory-lock-id.ts","../src/client/validate/ensdb-config.ts","../src/client/zod-schemas/ensdb-config.ts"],"sourcesContent":["/**\n * Merge the various sub-schemas into an \"abstract\" ENSIndexer Schema.\n * This \"abstract\" ENSIndexer Schema is used to build the \"concrete\" ENSIndexer Schema\n * for ENSDb, which is then used to build the ENSDb Schema for a Drizzle client for ENSDb.\n */\n\nexport * from \"./ensv2.schema\";\nexport * from \"./migrated-nodes.schema\";\nexport * from \"./protocol-acceleration.schema\";\nexport * from \"./registrars.schema\";\nexport * from \"./subgraph.schema\";\nexport * from \"./tokenscope.schema\";\n","import type {\n ChainId,\n DomainId,\n InterpretedLabel,\n LabelHash,\n Node,\n NormalizedAddress,\n PermissionsId,\n PermissionsResourceId,\n PermissionsUserId,\n RegistrationId,\n RegistryId,\n RenewalId,\n ResolverId,\n TokenId,\n} from \"enssdk\";\nimport { index, onchainEnum, onchainTable, primaryKey, relations, sql, uniqueIndex } from \"ponder\";\nimport type { BlockNumber, Hash } from \"viem\";\n\nimport type { EncodedReferrer } from \"@ensnode/ensnode-sdk\";\n\n/**\n * The ENSv2 Schema\n *\n * While the initial approach was a highly materialized view of the ENS protocol, abstracting away\n * as many on-chain details as possible, in practice—due to the sheer complexity of the protocol at\n * resolution-time—it becomes more or less impossible to appropriately materialize the canonical\n * namegraph.\n *\n * As a result, this schema takes a balanced approach. It mimics on-chain state as closely as possible,\n * with the obvious exception of materializing specific state that must trivially filterable. Then,\n * resolution-time logic is applied on _top_ of this index, at query-time, mimicking ENS's own resolution-time\n * behavior. This forces our implementation to match the protocol as closely as possible, with the\n * obvious note that the performance tradeoffs of evm code and our app are different. For example,\n * it's more expensive for us to recursively traverse the namegraph (like evm code does) because our\n * individual roundtrips from the db are relatively more expensive.\n *\n * In general: the indexed schema should match on-chain state as closely as possible, and\n * resolution-time behavior within the ENS protocol should _also_ be implemented at resolution time\n * in ENSApi. The current obvious exception is that `domain.ownerId` for ENSv1 Domains is the\n * _materialized_ _effective_ owner. ENSv1 includes a diverse number of ways to 'own' a domain,\n * including the ENSv1 Registry, various Registrars, and the NameWrapper. The ENSv1 indexing logic\n * within this ENSv2 plugin materializes the effective owner to simplify this aspect of ENS and\n * enable efficient queries against `domain.ownerId`.\n *\n * When necessary, all datamodels are shared or polymorphic between ENSv1 and ENSv2, including\n * Domains, Registries, Registrations, Renewals, and Resolvers.\n *\n * Registrations are polymorphic between the defined RegistrationTypes, depending on the associated\n * guarantees (for example, ENSv1 BaseRegistrar Registrations may have a gracePeriod, but ENSv2\n * Registry Registrations do not).\n *\n * Instead of materializing a Domain's name at any point, we maintain an internal rainbow table of\n * labelHash -> InterpretedLabel (the Label entity). This ensures that regardless of how or when a\n * new label is encountered onchain, all Domains that use that label are automatically healed at\n * resolution-time.\n *\n * ENSv1 and ENSv2 both fit the Registry → Domain → (Sub)Registry → Domain → ... namegraph model.\n * For ENSv1, each domain that has children implicitly owns a \"virtual\" Registry (a row of type\n * `ENSv1VirtualRegistry`) whose sole parent is that domain; children of the parent then point their\n * `registryId` at the virtual registry. Concrete `ENSv1Registry` rows (e.g. the mainnet ENS Registry,\n * the Basenames Registry, the Lineanames Registry) sit at the top. ENSv2 namegraphs are rooted in\n * a single `ENSv2Registry` RootRegistry on the ENS Root Chain and are possibly circular directed\n * graphs. The canonical namegraph is never materialized, only _navigated_ at resolution-time.\n *\n * Note also that the Protocol Acceleration plugin is a hard requirement for the ENSv2 plugin. This\n * allows us to rely on the shared logic for indexing:\n * a) ENSv1RegistryOld -> ENSv1Registry migration status\n * b) Domain-Resolver Relations for both ENSv1 and ENSv2 Domains\n * As such, none of that information is present in this ensv2.schema.ts file.\n *\n * In general, entities are keyed by a nominally-typed `id` that uniquely references them. This\n * allows us to trivially implement cursor-based pagination and allow consumers to reference these\n * deeply nested entities by a straightforward string ID. In cases where an entity's `id` is composed\n * of multiple pieces of information (for example, a Registry is identified by (chainId, address)),\n * then that information is, as well, included in the entity's columns, not just encoded in the id.\n * Nowhere in this application, nor in user applications, should an entity's id be parsed for its\n * constituent parts; all should be available, with their various type guarantees, on the entity\n * itself.\n *\n * Events are structured as a single \"events\" table which tracks EVM Event Metadata for any on-chain\n * Event. Then, join tables (DomainEvent, ResolverEvent, etc) track the relationship between an\n * entity that has many events (Domain, Resolver) to the relevant set of Events.\n *\n * A Registration references the event that initiated the Registration. A Renewal, too, references\n * the Event responsible for its existence.\n */\n\n//////////\n// Events\n//////////\n\nexport const event = onchainTable(\n \"events\",\n (t) => ({\n // Ponder's event.id\n id: t.text().primaryKey(),\n\n // The HCA account address if used, otherwise Transaction.from.\n sender: t.hex().notNull().$type<NormalizedAddress>(),\n\n // Event Log Metadata\n\n // chain\n chainId: t.int8({ mode: \"number\" }).notNull().$type<ChainId>(),\n\n // block\n blockNumber: t.bigint().notNull().$type<BlockNumber>(),\n blockHash: t.hex().notNull().$type<Hash>(),\n timestamp: t.bigint().notNull(),\n\n // transaction\n transactionHash: t.hex().notNull().$type<Hash>(),\n transactionIndex: t.integer().notNull(),\n // `tx.from` — never HCA-aware. Always the EOA/relayer that submitted the transaction.\n // Use `event.sender` for the HCA-aware actor.\n from: t.hex().notNull().$type<NormalizedAddress>(),\n to: t.hex().$type<NormalizedAddress>(), // NOTE: a null `to` means this was a tx that deployed a contract\n\n // log\n address: t.hex().notNull().$type<NormalizedAddress>(),\n logIndex: t.integer().notNull().$type<number>(),\n selector: t.hex().notNull().$type<Hash>(),\n topics: t.hex().array().notNull().$type<[Hash, ...Hash[]]>(),\n data: t.hex().notNull(),\n }),\n (t) => ({\n bySelector: index().on(t.selector),\n byFrom: index().on(t.from),\n bySender: index().on(t.sender),\n byTimestamp: index().on(t.timestamp),\n }),\n);\n\nexport const domainEvent = onchainTable(\n \"domain_events\",\n (t) => ({\n domainId: t.text().notNull().$type<DomainId>(),\n eventId: t.text().notNull(),\n }),\n (t) => ({ pk: primaryKey({ columns: [t.domainId, t.eventId] }) }),\n);\n\nexport const resolverEvent = onchainTable(\n \"resolver_events\",\n (t) => ({\n resolverId: t.text().notNull().$type<ResolverId>(),\n eventId: t.text().notNull(),\n }),\n (t) => ({ pk: primaryKey({ columns: [t.resolverId, t.eventId] }) }),\n);\n\nexport const permissionsEvent = onchainTable(\n \"permissions_events\",\n (t) => ({\n permissionsId: t.text().notNull().$type<PermissionsId>(),\n eventId: t.text().notNull(),\n }),\n (t) => ({ pk: primaryKey({ columns: [t.permissionsId, t.eventId] }) }),\n);\n\nexport const permissionsUserEvent = onchainTable(\n \"permissions_user_events\",\n (t) => ({\n permissionsUserId: t.text().notNull().$type<PermissionsUserId>(),\n eventId: t.text().notNull(),\n }),\n (t) => ({ pk: primaryKey({ columns: [t.permissionsUserId, t.eventId] }) }),\n);\n\n///////////\n// Account\n///////////\n\nexport const account = onchainTable(\"accounts\", (t) => ({\n id: t.hex().primaryKey().$type<NormalizedAddress>(),\n}));\n\nexport const account_relations = relations(account, ({ many }) => ({\n registrations: many(registration, { relationName: \"registrant\" }),\n domains: many(domain),\n permissions: many(permissionsUser),\n}));\n\n////////////\n// Registry\n////////////\n\nexport const registryType = onchainEnum(\"RegistryType\", [\n \"ENSv1Registry\",\n \"ENSv1VirtualRegistry\",\n \"ENSv2Registry\",\n]);\n\nexport const registry = onchainTable(\n \"registries\",\n (t) => ({\n // see RegistryId for guarantees\n id: t.text().primaryKey().$type<RegistryId>(),\n\n // has a type\n type: registryType().notNull(),\n\n chainId: t.int8({ mode: \"number\" }).notNull().$type<ChainId>(),\n address: t.hex().notNull().$type<NormalizedAddress>(),\n\n // If this is an ENSv1VirtualRegistry, `node` is the namehash of the parent ENSv1 domain that\n // owns it, otherwise null.\n node: t.hex().$type<Node>(),\n }),\n (t) => ({\n // NOTE: non-unique index because multiple rows can share (chainId, address) across virtual registries\n byChainAddress: index().on(t.chainId, t.address),\n }),\n);\n\nexport const relations_registry = relations(registry, ({ one, many }) => ({\n // domains that declare this registry as their parent registry\n domains: many(domain, { relationName: \"registry\" }),\n // domains that declare this registry as their subregistry\n domainsAsSubregistry: many(domain, { relationName: \"subregistry\" }),\n permissions: one(permissions, {\n relationName: \"permissions\",\n fields: [registry.chainId, registry.address],\n references: [permissions.chainId, permissions.address],\n }),\n}));\n\n///////////\n// Domains\n///////////\n\nexport const domainType = onchainEnum(\"DomainType\", [\"ENSv1Domain\", \"ENSv2Domain\"]);\n\nexport const domain = onchainTable(\n \"domains\",\n (t) => ({\n // see DomainId for guarantees (ENSv1DomainId: `${ENSv1RegistryId}/${node}`, ENSv2DomainId: CAIP-19)\n id: t.text().primaryKey().$type<DomainId>(),\n\n // has a type\n type: domainType().notNull(),\n\n // belongs to a registry\n registryId: t.text().notNull().$type<RegistryId>(),\n\n // may have a subregistry\n subregistryId: t.text().$type<RegistryId>(),\n\n // If this is an ENSv2Domain, the TokenId within the ENSv2Registry, otherwise null.\n tokenId: t.bigint().$type<TokenId>(),\n\n // If this is an ENSv1Domain, The Domain's namehash, otherwise null.\n node: t.hex().$type<Node>(),\n\n // represents a labelHash\n labelHash: t.hex().notNull().$type<LabelHash>(),\n\n // If this is an ENSv1Domain, this is the effective owner of the Domain.\n // If this is an ENSv2Domain, this is the on-chain owner address (the HCA account address if used).\n ownerId: t.hex().$type<NormalizedAddress>(),\n\n // If this is an ENSv1Domain, may have a `rootRegistryOwner`, otherwise null.\n rootRegistryOwnerId: t.hex().$type<NormalizedAddress>(),\n\n // NOTE: Domain-Resolver Relations tracked via Protocol Acceleration plugin\n // NOTE: parent is derived via registryCanonicalDomain, not stored on the domain row\n }),\n (t) => ({\n byType: index().on(t.type),\n byRegistry: index().on(t.registryId),\n bySubregistry: index().on(t.subregistryId).where(sql`${t.subregistryId} IS NOT NULL`),\n byOwner: index().on(t.ownerId),\n byLabelHash: index().on(t.labelHash),\n }),\n);\n\nexport const relations_domain = relations(domain, ({ one, many }) => ({\n registry: one(registry, {\n relationName: \"registry\",\n fields: [domain.registryId],\n references: [registry.id],\n }),\n subregistry: one(registry, {\n relationName: \"subregistry\",\n fields: [domain.subregistryId],\n references: [registry.id],\n }),\n owner: one(account, {\n relationName: \"owner\",\n fields: [domain.ownerId],\n references: [account.id],\n }),\n rootRegistryOwner: one(account, {\n relationName: \"rootRegistryOwner\",\n fields: [domain.rootRegistryOwnerId],\n references: [account.id],\n }),\n label: one(label, {\n relationName: \"label\",\n fields: [domain.labelHash],\n references: [label.labelHash],\n }),\n registrations: many(registration),\n}));\n\n/////////////////\n// Registrations\n/////////////////\n\nexport const registrationType = onchainEnum(\"RegistrationType\", [\n // TODO: prefix these with ENSv1, maybe excluding ThreeDNS\n \"NameWrapper\",\n \"BaseRegistrar\",\n \"ThreeDNS\",\n \"ENSv2RegistryRegistration\",\n \"ENSv2RegistryReservation\",\n]);\n\nexport const registration = onchainTable(\n \"registrations\",\n (t) => ({\n // keyed by (domainId, registrationIndex)\n id: t.text().primaryKey().$type<RegistrationId>(),\n\n domainId: t.text().notNull().$type<DomainId>(),\n registrationIndex: t.integer().notNull(),\n\n // has a type\n type: registrationType().notNull(),\n\n // has a start\n start: t.bigint().notNull(),\n // may have an expiry\n expiry: t.bigint(),\n // maybe have a grace period (BaseRegistrar)\n gracePeriod: t.bigint(),\n\n // registrar AccountId\n registrarChainId: t.int8({ mode: \"number\" }).notNull().$type<ChainId>(),\n registrarAddress: t.hex().notNull().$type<NormalizedAddress>(),\n\n // may reference a registrant. If this is an ENSv2 Registration, the protocol-emitted\n // registrant address (the HCA account address if used).\n registrantId: t.hex().$type<NormalizedAddress>(),\n\n // may reference an unregistrant. If this is an ENSv2 Registration, the protocol-emitted\n // unregistrant address (the HCA account address if used).\n unregistrantId: t.hex().$type<NormalizedAddress>(),\n\n // may have referrer data\n referrer: t.hex().$type<EncodedReferrer>(),\n\n // may have fuses (NameWrapper, Wrapped BaseRegistrar)\n fuses: t.integer(),\n\n // TODO(paymentToken): add payment token tracking here\n\n // may have base cost (BaseRegistrar, ENSv2Registrar)\n base: t.bigint(),\n\n // may have a premium (BaseRegistrar)\n premium: t.bigint(),\n\n // may be Wrapped (BaseRegistrar)\n wrapped: t.boolean().default(false),\n\n // has an event\n eventId: t.text().notNull(),\n }),\n (t) => ({\n byId: uniqueIndex().on(t.domainId, t.registrationIndex),\n }),\n);\n\nexport const registration_relations = relations(registration, ({ one, many }) => ({\n // belongs to a domain\n domain: one(domain, {\n fields: [registration.domainId],\n references: [domain.id],\n }),\n\n // has one registrant\n registrant: one(account, {\n fields: [registration.registrantId],\n references: [account.id],\n relationName: \"registrant\",\n }),\n\n // has a latest registration index\n latestRegistrationIndex: one(latestRegistrationIndex),\n\n // has a latest renewal index\n latestRenewalIndex: one(latestRenewalIndex),\n\n // has one unregistrant\n unregistrant: one(account, {\n fields: [registration.unregistrantId],\n references: [account.id],\n relationName: \"unregistrant\",\n }),\n\n // has many renewals\n renewals: many(renewal),\n\n // has an event\n event: one(event, {\n fields: [registration.eventId],\n references: [event.id],\n }),\n}));\n\nexport const latestRegistrationIndex = onchainTable(\"latest_registration_indexes\", (t) => ({\n domainId: t.text().primaryKey().$type<DomainId>(),\n registrationIndex: t.integer().notNull(),\n}));\n\nexport const latestRegistrationIndex_relations = relations(latestRegistrationIndex, ({ one }) => ({\n // references domain\n domain: one(domain, {\n fields: [latestRegistrationIndex.domainId],\n references: [domain.id],\n }),\n}));\n\n////////////\n// Renewals\n////////////\n\nexport const renewal = onchainTable(\n \"renewals\",\n (t) => ({\n // keyed by (registrationId, index)\n id: t.text().primaryKey().$type<RenewalId>(),\n\n domainId: t.text().notNull().$type<DomainId>(),\n registrationIndex: t.integer().notNull(),\n renewalIndex: t.integer().notNull(),\n\n // all renewals have a duration\n duration: t.bigint().notNull(),\n\n // may have a referrer\n referrer: t.hex().$type<EncodedReferrer>(),\n\n // TODO(paymentToken): add payment token tracking here\n\n // may have base cost\n base: t.bigint(),\n\n // may have a premium (ENSv1 RegistrarControllers)\n premium: t.bigint(),\n\n // has an event\n eventId: t.text().notNull(),\n }),\n (t) => ({\n byId: uniqueIndex().on(t.domainId, t.registrationIndex, t.renewalIndex),\n }),\n);\n\nexport const renewal_relations = relations(renewal, ({ one }) => ({\n // belongs to registration\n registration: one(registration, {\n fields: [renewal.domainId, renewal.registrationIndex],\n references: [registration.domainId, registration.registrationIndex],\n }),\n\n // has an event\n event: one(event, {\n fields: [renewal.eventId],\n references: [event.id],\n }),\n}));\n\nexport const latestRenewalIndex = onchainTable(\n \"latest_renewal_indexes\",\n (t) => ({\n domainId: t.text().notNull().$type<DomainId>(),\n registrationIndex: t.integer().notNull(),\n renewalIndex: t.integer().notNull(),\n }),\n (t) => ({ pk: primaryKey({ columns: [t.domainId, t.registrationIndex] }) }),\n);\n\nexport const latestRenewalIndex_relations = relations(latestRenewalIndex, ({ one }) => ({\n // references domain\n domain: one(domain, {\n fields: [latestRenewalIndex.domainId],\n references: [domain.id],\n }),\n}));\n\n///////////////\n// Permissions\n///////////////\n\nexport const permissions = onchainTable(\n \"permissions\",\n (t) => ({\n id: t.text().primaryKey().$type<PermissionsId>(),\n\n chainId: t.int8({ mode: \"number\" }).notNull().$type<ChainId>(),\n address: t.hex().notNull().$type<NormalizedAddress>(),\n }),\n (t) => ({\n byId: uniqueIndex().on(t.chainId, t.address),\n }),\n);\n\nexport const relations_permissions = relations(permissions, ({ many }) => ({\n resources: many(permissionsResource),\n users: many(permissionsUser),\n}));\n\nexport const permissionsResource = onchainTable(\n \"permissions_resources\",\n (t) => ({\n id: t.text().primaryKey().$type<PermissionsResourceId>(),\n\n chainId: t.int8({ mode: \"number\" }).notNull().$type<ChainId>(),\n address: t.hex().notNull().$type<NormalizedAddress>(),\n resource: t.bigint().notNull(),\n }),\n (t) => ({\n byId: uniqueIndex().on(t.chainId, t.address, t.resource),\n }),\n);\n\nexport const relations_permissionsResource = relations(permissionsResource, ({ one }) => ({\n permissions: one(permissions, {\n fields: [permissionsResource.chainId, permissionsResource.address],\n references: [permissions.chainId, permissions.address],\n }),\n}));\n\nexport const permissionsUser = onchainTable(\n \"permissions_users\",\n (t) => ({\n id: t.text().primaryKey().$type<PermissionsUserId>(),\n\n chainId: t.int8({ mode: \"number\" }).notNull().$type<ChainId>(),\n address: t.hex().notNull().$type<NormalizedAddress>(),\n resource: t.bigint().notNull(),\n // The user/grantee address this Permission is granted to (the HCA account address if used).\n user: t.hex().notNull().$type<NormalizedAddress>(),\n\n // has one roles bitmap\n roles: t.bigint().notNull(),\n }),\n (t) => ({\n byId: uniqueIndex().on(t.chainId, t.address, t.resource, t.user),\n }),\n);\n\nexport const relations_permissionsUser = relations(permissionsUser, ({ one }) => ({\n account: one(account, {\n fields: [permissionsUser.user],\n references: [account.id],\n }),\n permissions: one(permissions, {\n fields: [permissionsUser.chainId, permissionsUser.address],\n references: [permissions.chainId, permissions.address],\n }),\n resource: one(permissionsResource, {\n fields: [permissionsUser.chainId, permissionsUser.address, permissionsUser.resource],\n references: [\n permissionsResource.chainId,\n permissionsResource.address,\n permissionsResource.resource,\n ],\n }),\n}));\n\n//////////\n// Labels\n//////////\n\nexport const label = onchainTable(\n \"labels\",\n (t) => ({\n labelHash: t.hex().primaryKey().$type<LabelHash>(),\n interpreted: t.text().notNull().$type<InterpretedLabel>(),\n }),\n (t) => ({\n byInterpreted: index().on(t.interpreted),\n }),\n);\n\nexport const label_relations = relations(label, ({ many }) => ({\n domains: many(domain),\n}));\n\n///////////////////\n// Canonical Names\n///////////////////\n\n// TODO(canonical-names): this table will be refactored away once Canonical Names are implemented in\n// ENSv2, and we'll be able to store this information directly on the Registry entity, but until\n// then we need a place to track canonical domain references without requiring that a Registry contract\n// has emitted an event (and therefore is indexed)\n// TODO(canonical-names): this table can also disappear once the Signal pattern is implemented for\n// Registry contracts, ensuring that they are indexed during construction and are available for storage.\nexport const registryCanonicalDomain = onchainTable(\"registry_canonical_domains\", (t) => ({\n registryId: t.text().primaryKey().$type<RegistryId>(),\n domainId: t.text().notNull().$type<DomainId>(),\n}));\n","/**\n * Schema Definitions that track ENS Registry migration status for Protocol Acceleration.\n */\n\nimport type { LabelHash, Node } from \"enssdk\";\nimport { onchainTable, primaryKey } from \"ponder\";\n\n/**\n * Tracks the migration status of a node.\n *\n * Due to a security issue, ENS migrated from the RegistryOld contract to a new Registry\n * contract. When indexing events, the indexer must ignore any events on the RegistryOld for domains\n * that have since been migrated to the new Registry.\n *\n * To store the necessary information required to implement this behavior, we track the set of nodes\n * that have been registered in the (new) Registry contract on the ENS Root Chain. When an event is\n * encountered on the RegistryOld contract, if the relevant node exists in this set, the event should\n * be ignored, as the node is considered migrated.\n *\n * Note that this logic is only necessary for the ENS Root Chain, the only chain that includes the\n * Registry migration: we do not track nodes in the Basenames and Lineanames deployments of the\n * Registry on their respective chains, for example.\n *\n * Note also that this Registry migration tracking is isolated to the Protocol Acceleration schema/plugin.\n * That is, the subgraph plugin implements its own Registry migration logic. By isolating this logic\n * to the Protocol Acceleration plugin, we allow the Protocol Acceleration plugin to be run\n * independently of other plugins.\n *\n * Note also that we key this record by (parentNode, labelHash) to stay on Ponder's prefetch hot-path,\n * which requires that the key of the entity be trivially derived from event arguments. Because this\n * record is consulted in the context of the ENSv1RegistryOld#NewOwner event (which emits both\n * `parentNode` and `labelHash` directly), keying by (parentNode, labelHash) lets Ponder's profile\n * pattern matcher recover the key from event args. See the helper module's block comment for the\n * full rationale.\n *\n * The ensv2 plugin depends on the Protocol Acceleration plugin in order to piggyback on this\n * Registry migration logic.\n */\nexport const migratedNodeByParent = onchainTable(\n \"migrated_nodes_by_parent\",\n (t) => ({\n // keyed by (parentNode, labelHash)\n parentNode: t.hex().notNull().$type<Node>(),\n labelHash: t.hex().notNull().$type<LabelHash>(),\n }),\n (t) => ({\n pk: primaryKey({ columns: [t.parentNode, t.labelHash] }),\n }),\n);\n\n/**\n * Sibling lookup-by-namehash table for {@link migratedNodeByParent}. Indexed by `node` so that\n * ENSv1RegistryOld#Transfer/NewTTL/NewResolver — which emit only `node` — can read migration\n * status on Ponder's prefetch hot-path. Existence in this table is equivalent to existence in\n * {@link migratedNodeByParent}; both are written together by the migration helper.\n */\nexport const migratedNodeByNode = onchainTable(\"migrated_nodes_by_node\", (t) => ({\n node: t.hex().primaryKey().$type<Node>(),\n}));\n","/**\n * Schema Definitions that power Protocol Acceleration in the Resolution API.\n */\n\nimport type {\n Address,\n ChainId,\n DomainId,\n InterpretedName,\n Node,\n RecordVersion,\n ResolverId,\n ResolverRecordsId,\n} from \"enssdk\";\nimport { onchainTable, primaryKey, relations, uniqueIndex } from \"ponder\";\n\n/**\n * Tracks an Account's ENSIP-19 Reverse Name Records by CoinType.\n *\n * NOTE: this is NOT a cohesive, materialized index of ALL of an account's Primary Names, it is ONLY\n * an index of its ENSIP-19 Reverse Name _Records_ stored by a StandaloneReverseRegistrar:\n * - default.reverse\n * - [coinType].reverse\n * - NOT *.addr.reverse\n *\n * So these records CANNOT be queried directly and used as a source of truth — you MUST perform\n * Forward Resolution to resolve a consistent set of an Account's ENSIP-19 Primary Names. These records\n * are used to power Protocol Acceleration for those ReverseResolvers backed by a StandloneReverseRegistrar.\n */\nexport const reverseNameRecord = onchainTable(\n \"reverse_name_records\",\n (t) => ({\n // keyed by (address, coinType)\n address: t.hex().notNull().$type<Address>(),\n coinType: t.bigint().notNull(),\n\n /**\n * Represents the ENSIP-19 Reverse Name Record for a given (address, coinType).\n *\n * The value of this field is guaranteed to be a non-empty {@link InterpretedName}.\n */\n value: t.text().notNull().$type<InterpretedName>(),\n }),\n (t) => ({\n pk: primaryKey({ columns: [t.address, t.coinType] }),\n }),\n);\n\n/**\n * Tracks Domain-Resolver Relationships. This powers:\n * 1. Domain-Resolver Realtionships within the GraphQL API, and\n * 2. Accelerated lookups of a Domain's Resolver within the Resolution API.\n *\n * It is keyed by (chainId, address, domainId) to match the on-chain datamodel of\n * Registry/(shadow)Registry Domain-Resolver relationships.\n */\nexport const domainResolverRelation = onchainTable(\n \"domain_resolver_relations\",\n (t) => ({\n // keyed by (chainId, address, node)\n chainId: t.int8({ mode: \"number\" }).notNull().$type<ChainId>(),\n\n // The Registry (ENSv1Registry or ENSv2Registry)'s AccountId.\n address: t.hex().notNull().$type<Address>(),\n domainId: t.text().notNull().$type<DomainId>(),\n\n // The Domain's assigned Resolver's address (NOTE: always scoped to chainId)\n resolver: t.hex().notNull().$type<Address>(),\n }),\n (t) => ({\n pk: primaryKey({ columns: [t.chainId, t.address, t.domainId] }),\n }),\n);\n\nexport const domainResolverRelation_relations = relations(domainResolverRelation, ({ one }) => ({\n resolver: one(resolver, {\n fields: [domainResolverRelation.chainId, domainResolverRelation.resolver],\n references: [resolver.chainId, resolver.address],\n }),\n}));\n\n/**\n * Resolver represents an individual IResolver contract that has emitted at least 1 event.\n * Note that Resolver contracts can exist on-chain but not emit any events and still function\n * properly, so checks against a Resolver's existence and metadata must be done at runtime.\n */\nexport const resolver = onchainTable(\n \"resolvers\",\n (t) => ({\n // keyed by (chainId, address)\n id: t.text().primaryKey().$type<ResolverId>(),\n\n chainId: t.int8({ mode: \"number\" }).notNull().$type<ChainId>(),\n address: t.hex().notNull().$type<Address>(),\n }),\n (t) => ({\n byId: uniqueIndex().on(t.chainId, t.address),\n }),\n);\n\nexport const resolver_relations = relations(resolver, ({ many }) => ({\n records: many(resolverRecords),\n}));\n\n/**\n * Tracks a set of records for a specified `node` within a `resolver` contract on `chainId`.\n *\n * ResolverRecords is keyed by (chainId, resolver, node) and:\n * - has one `name` record (see ENSIP-3)\n * - has many `addressRecords` (unique by coinType) (see ENSIP-9)\n * - has many `textRecords` (unique by key) (see ENSIP-5)\n *\n * It is keyed by (chainId, resolver, node) to match the on-chain datamodel of Resolver contract storage.\n *\n * WARNING: These record values do NOT allow the caller to confidently resolve records for names\n * without following Forward Resolution according to the ENS protocol: a direct query to the database\n * for a record's value is not ENSIP-10 nor CCIP-Read compliant.\n */\nexport const resolverRecords = onchainTable(\n \"resolver_records\",\n (t) => ({\n // keyed by (chainId, resolver, node)\n id: t.text().primaryKey().$type<ResolverRecordsId>(),\n\n chainId: t.int8({ mode: \"number\" }).notNull().$type<ChainId>(),\n address: t.hex().notNull().$type<Address>(),\n node: t.hex().notNull().$type<Node>(),\n\n /**\n * Represents the value of the reverse-resolution (ENSIP-3) name() record, used for Reverse Resolution.\n *\n * If present, the value of this field is guaranteed to be a non-empty {@link InterpretedName}.\n */\n name: t.text().$type<InterpretedName>(),\n\n /**\n * ENSIP-7 contenthash raw bytes or null if not set.\n */\n contenthash: t.hex(),\n\n /**\n * PubkeyResolver (x, y) pair, or null if not set.\n *\n * Invariant: both null together, or both set together.\n */\n pubkeyX: t.hex(),\n pubkeyY: t.hex(),\n\n /**\n * IDNSZoneResolver zonehash or null if not set.\n */\n dnszonehash: t.hex(),\n\n /**\n * IVersionableResolver version. Null when no `VersionChanged` event has been seen for this\n * (chainId, address, node) — the resolver may not implement `IVersionableResolver`, or simply\n * may never have been version-bumped. Consumers should treat null as \"unknown\" rather than 0.\n */\n version: t.bigint().$type<RecordVersion>(),\n }),\n (t) => ({\n byId: uniqueIndex().on(t.chainId, t.address, t.node),\n }),\n);\n\nexport const resolverRecords_relations = relations(resolverRecords, ({ one, many }) => ({\n // belongs to resolver\n resolver: one(resolver, {\n fields: [resolverRecords.chainId, resolverRecords.address],\n references: [resolver.chainId, resolver.address],\n }),\n\n // resolverRecord has many address records\n addressRecords: many(resolverAddressRecord),\n\n // resolverRecord has many text records\n textRecords: many(resolverTextRecord),\n}));\n\n/**\n * Tracks address records for a `node` by `coinType` within a `resolver` on `chainId`.\n *\n * ResolverAddressRecord is keyed by (chainId, resolver, node, coinType), where the composite key\n * segment (chainId, resolver, node) describes a ResolverRecord entity. A ResolverAddressRecord is\n * then additionally keyed by (coinType).\n */\nexport const resolverAddressRecord = onchainTable(\n \"resolver_address_records\",\n (t) => ({\n // keyed by ((chainId, resolver, node), coinType)\n chainId: t.int8({ mode: \"number\" }).notNull().$type<ChainId>(),\n address: t.hex().notNull().$type<Address>(),\n node: t.hex().notNull().$type<Node>(),\n // NOTE: all well-known CoinTypes fit into javascript number but NOT postgres .integer, must be\n // stored as BigInt\n coinType: t.bigint().notNull(),\n\n /**\n * Represents the value of the Addresss Record specified by ((chainId, resolver, node), coinType).\n *\n * The value of this field is interpreted by `interpretAddressRecordValue` — see its implementation\n * for additional context and specific guarantees.\n */\n value: t.text().notNull(),\n }),\n (t) => ({\n pk: primaryKey({ columns: [t.chainId, t.address, t.node, t.coinType] }),\n }),\n);\n\nexport const resolverAddressRecordRelations = relations(resolverAddressRecord, ({ one }) => ({\n // belongs to resolverRecord\n resolver: one(resolverRecords, {\n fields: [\n resolverAddressRecord.chainId,\n resolverAddressRecord.address,\n resolverAddressRecord.node,\n ],\n references: [resolverRecords.chainId, resolverRecords.address, resolverRecords.node],\n }),\n}));\n\n/**\n * Tracks text records for a `node` by `key` within a `resolver` on `chainId`.\n *\n * ResolverTextRecord is keyed by (chainId, resolver, node, key), where the composite key\n * segment (chainId, resolver, node) describes a ResolverRecord entity. A ResolverTextRecord is\n * then additionally keyed by (key).\n */\nexport const resolverTextRecord = onchainTable(\n \"resolver_text_records\",\n (t) => ({\n // keyed by ((chainId, resolver, node), key)\n chainId: t.int8({ mode: \"number\" }).notNull().$type<ChainId>(),\n address: t.hex().notNull().$type<Address>(),\n node: t.hex().notNull().$type<Node>(),\n key: t.text().notNull(),\n\n /**\n * Represents the value of the Text Record specified by ((chainId, resolver, node), key).\n *\n * The value of this field is interpreted by `interpretTextRecordValue` — see its implementation\n * for additional context and specific guarantees.\n */\n value: t.text().notNull(),\n }),\n (t) => ({\n pk: primaryKey({ columns: [t.chainId, t.address, t.node, t.key] }),\n }),\n);\n\nexport const resolverTextRecordRelations = relations(resolverTextRecord, ({ one }) => ({\n // belongs to resolverRecord\n resolver: one(resolverRecords, {\n fields: [resolverTextRecord.chainId, resolverTextRecord.address, resolverTextRecord.node],\n references: [resolverRecords.chainId, resolverRecords.address, resolverRecords.node],\n }),\n}));\n","/**\n * Schema Definitions for tracking of ENS registrars.\n */\n\nimport type { NormalizedAddress } from \"enssdk\";\nimport { index, onchainEnum, onchainTable, relations, uniqueIndex } from \"ponder\";\n\n/**\n * Subregistries\n *\n * @see https://ensnode.io/docs/reference/terminology#subregistry\n */\nexport const subregistries = onchainTable(\n \"subregistries\",\n (t) => ({\n /**\n * Subregistry ID\n *\n * Identifies the chainId and address of the smart contract associated\n * with the subregistry.\n *\n * Guaranteed to be a fully lowercase string formatted according to\n * the CAIP-10 standard.\n *\n * @see https://chainagnostic.org/CAIPs/caip-10\n */\n subregistryId: t.text().primaryKey(),\n\n /**\n * The node (namehash) of the name the subregistry manages subnames of.\n * Example subregistry managed names:\n * - `eth`\n * - `base.eth`\n * - `linea.eth`\n *\n * Guaranteed to be a fully lowercase hex string representation of 32-bytes.\n */\n node: t.hex().notNull(),\n }),\n (t) => ({\n uniqueNode: uniqueIndex().on(t.node),\n }),\n);\n\n/**\n * Registration Lifecycles\n *\n * A \"registration lifecycle\" represents a single cycle of a name being\n * registered once followed by renewals (expiry date extensions) any number of\n * times.\n *\n * Note that this data model only tracks the *most recently created*\n * \"registration lifecycle\" record for a name and doesn't track\n * *all* \"registration lifecycle\" records for a name across time.\n * Therefore, if a name goes through multiple cycles of:\n * (registration -> expiry -> release) ->\n * (registration -> expiry -> release) -> etc..\n * this data model only stores data of the most recently created\n * \"registration lifecycle\".\n *\n * For now we make the following simplifying assumptions:\n * 1. That no two subregistries hold state for the same node.\n * 2. That the subregistry associated with the name X in the ENS root registry\n * exclusively holds state for subnames of X.\n *\n * These simplifying assumptions happen to be true for the scope of our\n * current indexing logic, but nothing in the ENS protocol fundamentally\n * forces this to always be true. Therefore this data model will need\n * refactoring in the future as our indexing logic expands to handle\n * more complex scenarios.\n */\nexport const registrationLifecycles = onchainTable(\n \"registration_lifecycles\",\n (t) => ({\n /**\n * The node (namehash) of the FQDN of the domain the registration lifecycle\n * is associated with.\n *\n * Guaranteed to be a subname of the node (namehash) of the subregistry\n * identified by `subregistryId`.\n *\n * Guaranteed to be a fully lowercase hex string representation of 32-bytes.\n */\n node: t.hex().primaryKey(),\n\n /**\n * Subregistry ID\n *\n * Identifies the chainId and address of the subregistry smart contract\n * that manages the registration lifecycle.\n *\n * Guaranteed to be a fully lowercase string formatted according to\n * the CAIP-10 standard.\n *\n * @see https://chainagnostic.org/CAIPs/caip-10\n */\n subregistryId: t.text().notNull(),\n\n /**\n * Expires at\n *\n * Unix timestamp when the Registration Lifecycle is scheduled to expire.\n */\n expiresAt: t.bigint().notNull(),\n }),\n (t) => ({\n bySubregistry: index().on(t.subregistryId),\n }),\n);\n\n/**\n * \"Logical registrar action type\" enum\n *\n * Types of \"logical registrar action\".\n */\nexport const registrarActionType = onchainEnum(\"registrar_action_type\", [\n \"registration\",\n \"renewal\",\n]);\n\n/**\n * \"Logical registrar actions\"\n *\n * This table models \"logical actions\" rather than \"events\" because a single\n * \"logical action\", such as a single registration or renewal, may emit\n * multiple onchain events from multiple contracts where each of those\n * individual events may only provide a subset of the data about the full\n * \"logical action\". Therefore, here we aggregate data about each\n * \"logical action\" that may be sourced from multiple onchain events from\n * multiple contracts.\n *\n * Each \"logical action\" in this table is associated with a single transaction.\n * However, it should be noted that a single transaction may perform any number\n * of \"logical actions\".\n *\n * For example, consider the \"logical registrar action\" of registering a direct\n * subname of .eth. This \"logical action\" spans interactions across multiple\n * contracts that emit multiple onchain events:\n *\n * 1. The \"EthBaseRegistrar\" contract emits a `NameRegistered` event enabling\n * the tracking of data including:\n * - `node`\n * - `incrementalDuration`\n * - `registrant`\n * 2. A \"RegistrarController\" contract emits its own `NameRegistered` event\n * enabling the tracking of data that may include:\n * - `baseCost`\n * - `premium`\n * - `total`\n * - `encodedReferrer`\n *\n * Here we aggregate the state from both of these events into a single\n * \"logical registrar action\".\n */\nexport const registrarActions = onchainTable(\n \"registrar_actions\",\n (t) => ({\n /**\n * \"Logical registrar action\" ID\n *\n * The `id` value is a deterministic and globally unique identifier for\n * the \"logical registrar action\".\n *\n * The `id` value represents the *initial* onchain event associated with\n * the \"logical registrar action\", but the full state of\n * the \"logical registrar action\" is an aggregate across each of\n * the onchain events referenced in the `eventIds` field.\n *\n * Guaranteed to be the very first element in `eventIds` array.\n *\n * Implementation details: The `id` value is a Ponder checkpoint string — a fixed-length\n * decimal string encoding the following fields (left to right, most to least significant):\n *\n * | Field | Width (digits) | Description |\n * |--------------------|----------------|-------------------------------------------|\n * | `blockTimestamp` | 10 | Unix seconds timestamp of the block |\n * | `chainId` | 16 | EIP-155 chain ID |\n * | `blockNumber` | 16 | Block number |\n * | `transactionIndex` | 16 | Index of the transaction within the block |\n * | `eventType` | 1 | Internal Ponder event type (always 5) |\n * | `eventIndex` | 16 | Index of the event within the transaction |\n *\n * All fields are zero-padded to their fixed widths, so the string has constant\n * length and lexicographic order equals chronological order.\n *\n * Because all registrar actions originate from Ponder log (smart-contract event)\n * handlers, every `id` shares the same `eventType` digit (5), making direct\n * lexicographic or bigint comparison safe for establishing total chronological order.\n */\n id: t.text().primaryKey(),\n\n /**\n * The type of the \"logical registrar action\".\n */\n type: registrarActionType().notNull(),\n\n /**\n * Subregistry ID\n *\n * The ID of the subregistry the \"logical registrar action\" was taken on.\n *\n * Identifies the chainId and address of the associated subregistry smart\n * contract.\n *\n * Guaranteed to be a fully lowercase string formatted according to\n * the CAIP-10 standard.\n *\n * @see https://chainagnostic.org/CAIPs/caip-10\n */\n subregistryId: t.text().notNull(),\n\n /**\n * The node (namehash) of the FQDN of the domain associated with\n * the \"logical registrar action\".\n *\n * Guaranteed to be a fully lowercase hex string representation of 32-bytes.\n */\n node: t.hex().notNull(),\n\n /**\n * Incremental Duration\n *\n * If `type` is \"registration\":\n * - Represents the duration between `blockTimestamp` and\n * the initial `expiresAt` value that the associated\n * \"registration lifecycle\" will be initialized with.\n * If `type` is \"renewal\":\n * - Represents the incremental increase in duration made to\n * the `expiresAt` value in the associated \"registration lifecycle\".\n *\n * A \"registration lifecycle\" may be extended via renewal even after it\n * expires if it is still within its grace period.\n *\n * Consider the following scenario:\n *\n * The \"registration lifecycle\" of a direct subname of .eth is scheduled to\n * expire on Jan 1, midnight UTC. It is currently 30 days after this\n * expiration time. Therefore, there are currently another 60 days of grace\n * period remaining for this name. Anyone can still make a renewal to\n * extend the \"registration lifecycle\" of this name.\n *\n * Given this scenario, consider the following examples:\n *\n * 1. If a renewal is made with 10 days incremental duration,\n * the \"registration lifecycle\" for this name will remain in\n * an \"expired\" state, but it will now have another 70 days of\n * grace period remaining.\n *\n * 2. If a renewal is made with 50 days incremental duration,\n * the \"registration lifecycle\" for this name will no longer be\n * \"expired\" and will become \"active\", but the \"registration lifecycle\"\n * will now be scheduled to expire again in 20 days.\n *\n * After the \"registration lifecycle\" for a name becomes expired by more\n * than its grace period, it can no longer be renewed by anyone and is\n * considered \"released\". The name must first be registered again, starting\n * a new \"registration lifecycle\" of\n * active / expired / grace period / released.\n *\n * May be 0.\n *\n * Guaranteed to be a non-negative bigint value.\n */\n incrementalDuration: t.bigint().notNull(),\n\n /**\n * Base cost\n *\n * Base cost (before any `premium`) of Ether measured in units of Wei\n * paid to execute the \"logical registrar action\".\n *\n * May be 0.\n *\n * Guaranteed to be:\n * 1) null if and only if `total` is null.\n * 2) Otherwise, a non-negative bigint value.\n */\n baseCost: t.bigint(),\n\n /**\n * Premium\n *\n * \"premium\" cost (in excesses of the `baseCost`) of Ether measured in\n * units of Wei paid to execute the \"logical registrar action\".\n *\n * May be 0.\n *\n * Guaranteed to be:\n * 1) null if and only if `total` is null.\n * 2) Otherwise, zero when `type` is `renewal`.\n * 3) Otherwise, a non-negative bigint value.\n */\n premium: t.bigint(),\n\n /**\n * Total\n *\n * Total cost of Ether measured in units of Wei paid to execute\n * the \"logical registrar action\".\n *\n * May be 0.\n *\n * Guaranteed to be:\n * 1) null if and only if both `baseCost` and `premium` are null.\n * 2) Otherwise, a non-negative bigint value, equal to the sum of\n * `baseCost` and `premium`.\n */\n total: t.bigint(),\n\n /**\n * Registrant\n *\n * Identifies the address that initiated the \"logical registrar action\" and\n * is paying the `total` cost (if applicable).\n *\n * It may not be the owner of the name:\n * 1. When a name is registered, the initial owner of the name may be\n * distinct from the registrant.\n * 2. There are no restrictions on who may renew a name.\n * Therefore the owner of the name may be distinct from the registrant.\n *\n *\n * The \"chainId\" of this address is the same as is referenced in `subregistryId`.\n *\n * Guaranteed to be a fully lowercase address\n */\n registrant: t.hex().notNull(),\n\n /**\n * Encoded Referrer\n *\n * Represents the \"raw\" 32-byte \"referrer\" value emitted onchain in\n * association with the registrar action.\n *\n * Guaranteed to be:\n * 1) null if the emitted `eventIds` contain no information about a referrer.\n * 2) Otherwise, a fully lowercase hex string representation of 32-bytes.\n */\n encodedReferrer: t.hex(),\n\n /**\n * Decoded referrer\n *\n * The referrer address decoded from `encodedReferrer` using strict\n * left-zero-padding validation.\n *\n * Identifies the interpreted address of the referrer.\n * The \"chainId\" of this address is the same as is referenced in\n * `subregistryId`.\n *\n * Guaranteed to be:\n * 1) null if `encodedReferrer` is null.\n * 2) Otherwise, a fully lowercase address.\n * 3) May be the \"zero address\" to represent that an `encodedReferrer` is\n * defined but that it is interpreted as no referrer.\n */\n decodedReferrer: t.hex().$type<NormalizedAddress>(),\n\n /**\n * Number of the block that includes the \"logical registrar action\".\n *\n * The \"chainId\" of this block is the same as is referenced in\n * `subregistryId`.\n *\n * Guaranteed to be a non-negative bigint value.\n */\n blockNumber: t.bigint().notNull(),\n\n /**\n * Unix timestamp of the block referenced by `blockNumber` that includes\n * the \"logical registrar action\".\n */\n timestamp: t.bigint().notNull(),\n\n /**\n * Transaction hash of the transaction associated with\n * the \"logical registrar action\".\n *\n * The \"chainId\" of this transaction is the same as is referenced in\n * `subregistryId`.\n *\n * Note that a single transaction may be associated with any number of\n * \"logical registrar actions\".\n *\n * Guaranteed to be a fully lowercase hex string representation of 32-bytes.\n */\n transactionHash: t.hex().notNull(),\n\n /**\n * Event IDs\n *\n * Array of the eventIds that have contributed to the state of\n * the \"logical registrar action\" record.\n *\n * Each eventId is a deterministic and globally unique onchain event\n * identifier.\n *\n * Guarantees:\n * - Each eventId is of events that occurred within the block\n * referenced by `blockNumber`.\n * - At least 1 eventId.\n * - Ordered chronologically (ascending) by logIndex within `blockNumber`.\n * - The first element in the array is equal to the `id` of\n * the overall \"logical registrar action\" record.\n *\n * The following ideas are not generalized for ENS overall but happen to\n * be a characteristic of the scope of our current indexing logic:\n * 1. These id's always reference events emitted by\n * a related \"BaseRegistrar\" contract.\n * 2. These id's optionally reference events emitted by\n * a related \"Registrar Controller\" contract. This is because our\n * current indexing logic doesn't guarantee to index\n * all \"Registrar Controller\" contracts.\n */\n eventIds: t.text().array().notNull(),\n }),\n (t) => ({\n byDecodedReferrer: index().on(t.decodedReferrer),\n byTimestamp: index().on(t.timestamp),\n }),\n);\n\n/**\n * Logical Registrar Action Metadata Type Enum\n *\n * Types of internal registrar action metadata.\n *\n * NOTE: This enum is an internal implementation detail of ENSIndexer and\n * should not be used outside of ENSIndexer.\n */\nexport const internal_registrarActionMetadataType = onchainEnum(\n \"_ensindexer_registrar_action_metadata_type\",\n [\"CURRENT_LOGICAL_REGISTRAR_ACTION\"],\n);\n\n/**\n * Logical Registrar Action Metadata\n *\n * NOTE: This table is an internal implementation detail of ENSIndexer and\n * should not be queried outside of ENSIndexer.\n *\n * Building a \"logical registrar action\" record may require data from\n * multiple onchain events. To help aggregate data from multiple events into\n * a single \"logical registrar action\" ENSIndexer may temporarily store data\n * here to achieve this data aggregation.\n *\n * Note how multiple \"logical registrar actions\" may be taken on\n * the same `node` in the same `transactionHash`. For example, consider\n * a case of a single transaction registering a name and subsequently renewing\n * it twice. While this may be silly it is technically possible and therefore\n * such cases must be considered. To support such cases, when\n * the last event handler for a \"logical registrar action\" has completed its\n * processing the record referenced by the `logicalEventKey` must be removed.\n */\nexport const internal_registrarActionMetadata = onchainTable(\n \"_ensindexer_registrar_action_metadata\",\n (t) => ({\n /**\n * Registrar Action Metadata Type\n *\n * The type of internal registrar action metadata being stored.\n */\n metadataType: internal_registrarActionMetadataType().primaryKey(),\n\n /**\n * Logical Event Key\n *\n * A fully lowercase string formatted as:\n * `{domainId}:{transactionHash}`\n */\n logicalEventKey: t.text().notNull(),\n\n /**\n * Logical Event ID\n *\n * A string holding the `id` value of the existing \"logical registrar action\"\n * record that is currently being built as an aggregation of onchain events.\n *\n * May be used by subsequent event handlers to identify which\n * \"logical registrar action\" to aggregate additional indexed state into.\n */\n logicalEventId: t.text().notNull(),\n }),\n);\n\n/// Relations\n\n/**\n * Subregistry Relations\n *\n * Each Subregistry is related to:\n * - 0 or more RegistrationLifecycles\n */\nexport const subregistryRelations = relations(subregistries, ({ many }) => ({\n registrationLifecycle: many(registrationLifecycles),\n}));\n\n/**\n * Registration Lifecycle Relations\n *\n * Each Registration Lifecycle is related to:\n * - exactly one Subregistry\n * - 0 or more \"logical registrar action\"\n */\nexport const registrationLifecycleRelations = relations(\n registrationLifecycles,\n ({ one, many }) => ({\n subregistry: one(subregistries, {\n fields: [registrationLifecycles.subregistryId],\n references: [subregistries.subregistryId],\n }),\n\n registrarAction: many(registrarActions),\n }),\n);\n\n/**\n * \"Logical registrar action\" Relations\n *\n * Each \"logical registrar action\" is related to:\n * - exactly one Registration Lifecycle (note the docs on\n * Registration Lifecycle explaining how these records may\n * be recycled across time).\n */\nexport const registrarActionRelations = relations(registrarActions, ({ one }) => ({\n registrationLifecycle: one(registrationLifecycles, {\n fields: [registrarActions.node],\n references: [registrationLifecycles.node],\n }),\n}));\n","import type { Address } from \"enssdk\";\nimport { index, onchainTable, relations, sql } from \"ponder\";\n\nimport { monkeypatchCollate } from \"../lib/collate\";\n\n/**\n * This file specifies an Legacy-ENS-Subgraph-Compatible Ponder Schema.\n *\n * When the subgraph_prefix is stripped and the resulting schema is paired with @ensnode/ponder-subgraph,\n * the resulting GraphQL API is fully compatible with the legacy ENS Subgraph.\n */\n\n/**\n * Domain\n */\n\nexport const subgraph_domain = onchainTable(\n \"subgraph_domains\",\n (t) => ({\n // The namehash of the name\n id: t.hex().primaryKey(),\n\n /**\n * The ENS Name that this Domain represents.\n *\n * If {@link ENSIndexerConfig#isSubgraphCompatible}, this value is guaranteed to be either:\n * a) null (in the case of the root node), or\n * b) a Subgraph Interpreted Name.\n *\n * @see https://ensnode.io/docs/reference/terminology#subgraph-indexability--labelname-interpretation\n *\n * Otherwise, this value is guaranteed to be an Interpreted Name, which is either:\n * a) a normalized Name, or\n * b) a Name entirely consisting of Interpreted Labels.\n *\n * Note that the type of the column will remain string | null, for legacy subgraph compatibility,\n * but in practice will never be null. The Root node's name will be '' (empty string).\n *\n * @see https://ensnode.io/docs/reference/terminology#interpreted-name\n */\n name: t.text(),\n\n /**\n * The Label associated with the Domain.\n *\n * If {@link ENSIndexerConfig#isSubgraphCompatible}, this value is guaranteed to be either:\n * a) null, in the case of the root Node or a name whose childmost label is subgraph-unindexable, or\n * b) a subgraph-indexable Subgraph Interpreted Label (i.e. a Literal Label of undefined normalization).\n *\n * @see https://ensnode.io/docs/reference/terminology#subgraph-indexability--labelname-interpretation\n *\n * Otherwise, this value is guaranteed to be an Interpreted Label which is either:\n * a) null, exclusively in the case of the root Node,\n * b) a normalized Label, or\n * c) an Encoded LabelHash, which encodes either\n * i. in the case of an Unknown Label, the LabelHash emitted onchain, or\n * ii. in the case of an Unnormalized Label, the LabelHash of the Literal Label value found onchain.\n *\n * @see https://ensnode.io/docs/reference/terminology#interpreted-label\n */\n labelName: t.text(),\n\n // keccak256(labelName)\n labelhash: t.hex(),\n // The namehash (id) of the parent name\n parentId: t.hex(),\n\n // The number of subdomains\n subdomainCount: t.integer().notNull().default(0),\n\n // Address logged from current resolver, if any\n resolvedAddressId: t.hex(),\n\n // The resolver that controls the domain's settings\n resolverId: t.text(),\n\n // The time-to-live (TTL) value of the domain's records\n ttl: t.bigint(),\n\n // Indicates whether the domain has been migrated to a new registrar\n isMigrated: t.boolean().notNull().default(false),\n // The time when the domain was created\n createdAt: t.bigint().notNull(),\n\n // The account that owns the domain\n ownerId: t.hex().notNull(),\n // The account that owns the ERC721 NFT for the domain\n registrantId: t.hex(),\n // The account that owns the wrapped domain\n wrappedOwnerId: t.hex(),\n\n // The expiry date for the domain, from either the registration, or the wrapped domain if PCC is burned\n expiryDate: t.bigint(),\n }),\n (t) => ({\n // uses a hash index because some name values exceed the btree max row size (8191 bytes)\n byExactName: index().using(\"hash\", t.name),\n // GIN trigram index for partial-match filters (_contains, _starts_with, _ends_with).\n // (inline `gin_trgm_ops` via `sql` because passing it through `.op()` gets dropped by Ponder,\n // producing `USING gin (name)` with no opclass)\n byFuzzyName: index().using(\"gin\", sql`${t.name} gin_trgm_ops`),\n\n byLabelhash: index().on(t.labelhash),\n byParentId: index().on(t.parentId),\n byOwnerId: index().on(t.ownerId),\n byRegistrantId: index().on(t.registrantId),\n byWrappedOwnerId: index().on(t.wrappedOwnerId),\n byResolvedAddressId: index().on(t.resolvedAddressId),\n }),\n);\n\n// monkeypatch drizzle's column (necessary to match graph-node default collation \"C\")\n// https://github.com/drizzle-team/drizzle-orm/issues/638\nmonkeypatchCollate(subgraph_domain.name, '\"C\"');\nmonkeypatchCollate(subgraph_domain.labelName, '\"C\"');\n\nexport const subgraph_domainRelations = relations(subgraph_domain, ({ one, many }) => ({\n resolvedAddress: one(subgraph_account, {\n fields: [subgraph_domain.resolvedAddressId],\n references: [subgraph_account.id],\n }),\n owner: one(subgraph_account, {\n fields: [subgraph_domain.ownerId],\n references: [subgraph_account.id],\n }),\n parent: one(subgraph_domain, {\n fields: [subgraph_domain.parentId],\n references: [subgraph_domain.id],\n }),\n resolver: one(subgraph_resolver, {\n fields: [subgraph_domain.resolverId],\n references: [subgraph_resolver.id],\n }),\n subdomains: many(subgraph_domain, { relationName: \"parent\" }),\n registrant: one(subgraph_account, {\n fields: [subgraph_domain.registrantId],\n references: [subgraph_account.id],\n }),\n wrappedOwner: one(subgraph_account, {\n fields: [subgraph_domain.wrappedOwnerId],\n references: [subgraph_account.id],\n }),\n wrappedDomain: one(subgraph_wrappedDomain, {\n fields: [subgraph_domain.id],\n references: [subgraph_wrappedDomain.domainId],\n }),\n registration: one(subgraph_registration, {\n fields: [subgraph_domain.id],\n references: [subgraph_registration.domainId],\n }),\n\n // event relations\n transfers: many(subgraph_transfer),\n newOwners: many(subgraph_newOwner),\n newResolvers: many(subgraph_newResolver),\n newTTLs: many(subgraph_newTTL),\n wrappedTransfers: many(subgraph_wrappedTransfer),\n nameWrappeds: many(subgraph_nameWrapped),\n nameUnwrappeds: many(subgraph_nameUnwrapped),\n fusesSets: many(subgraph_fusesSet),\n expiryExtendeds: many(subgraph_expiryExtended),\n}));\n\n/**\n * Account\n */\n\nexport const subgraph_account = onchainTable(\"subgraph_accounts\", (t) => ({\n id: t.hex().primaryKey(),\n}));\n\nexport const subgraph_accountRelations = relations(subgraph_account, ({ many }) => ({\n domains: many(subgraph_domain),\n wrappedDomains: many(subgraph_wrappedDomain),\n registrations: many(subgraph_registration),\n}));\n\n/**\n * Resolver\n */\n\nexport const subgraph_resolver = onchainTable(\n \"subgraph_resolvers\",\n (t) => ({\n // The unique identifier for this resolver, which is a concatenation of the domain namehash and the resolver address\n id: t.text().primaryKey(),\n // The domain that this resolver is associated with\n domainId: t.hex().notNull(),\n // The address of the resolver contract\n address: t.hex().notNull().$type<Address>(),\n\n // The current value of the 'addr' record for this resolver, as determined by the associated events\n addrId: t.hex(),\n // The content hash for this resolver, in binary format\n contentHash: t.text(),\n // The set of observed text record keys for this resolver\n // NOTE: we avoid .notNull.default([]) to match subgraph behavior\n texts: t.text().array(),\n // The set of observed SLIP-44 coin types for this resolver\n // NOTE: we avoid .notNull.default([]) to match subgraph behavior\n coinTypes: t.bigint().array(),\n }),\n (t) => ({\n byDomainId: index().on(t.domainId),\n }),\n);\n\nexport const subgraph_resolverRelations = relations(subgraph_resolver, ({ one, many }) => ({\n addr: one(subgraph_account, {\n fields: [subgraph_resolver.addrId],\n references: [subgraph_account.id],\n }),\n domain: one(subgraph_domain, {\n fields: [subgraph_resolver.domainId],\n references: [subgraph_domain.id],\n }),\n\n // event relations\n addrChangeds: many(subgraph_addrChanged),\n multicoinAddrChangeds: many(subgraph_multicoinAddrChanged),\n nameChangeds: many(subgraph_nameChanged),\n abiChangeds: many(subgraph_abiChanged),\n pubkeyChangeds: many(subgraph_pubkeyChanged),\n textChangeds: many(subgraph_textChanged),\n contenthashChangeds: many(subgraph_contenthashChanged),\n interfaceChangeds: many(subgraph_interfaceChanged),\n authorisationChangeds: many(subgraph_authorisationChanged),\n versionChangeds: many(subgraph_versionChanged),\n}));\n\n/**\n * Registration\n */\n\nexport const subgraph_registration = onchainTable(\n \"subgraph_registrations\",\n (t) => ({\n // The unique identifier of the registration\n id: t.hex().primaryKey(),\n // The domain name associated with the registration\n domainId: t.hex().notNull(),\n // The registration date of the domain\n registrationDate: t.bigint().notNull(),\n // The expiry date of the domain\n expiryDate: t.bigint().notNull(),\n // The cost associated with the domain registration\n cost: t.bigint(),\n // The account that registered the domain\n registrantId: t.hex().notNull(),\n /**\n * The Label associated with the domain registration.\n *\n * If {@link ENSIndexerConfig#isSubgraphCompatible}, this value is guaranteed to be either:\n * a) null, in the case of the root Node or a Domain whose label is subgraph-unindexable, or\n * b) a subgraph-indexable Subgraph Interpreted Label (i.e. a Literal Label of undefined normalization).\n *\n * @see https://ensnode.io/docs/reference/terminology#subgraph-indexability--labelname-interpretation\n *\n * Otherwise, this value is guaranteed to be an Interpreted Label which is either:\n * a) a normalized Label, or\n * b) in the case of an Unnormalized Label, an Encoded LabelHash of the Literal Label value found onchain.\n *\n * Note that the type of the column will remain string | null, for legacy subgraph compatibility.\n * In practice however, because there is no Registration entity for the root Node (the only Node\n * with a null labelName) this field will never be null.\n *\n * @see https://ensnode.io/docs/reference/terminology#interpreted-label\n */\n labelName: t.text(),\n }),\n (t) => ({\n byDomainId: index().on(t.domainId),\n byRegistrationDate: index().on(t.registrationDate),\n byExpiryDate: index().on(t.expiryDate),\n }),\n);\n\nexport const subgraph_registrationRelations = relations(subgraph_registration, ({ one, many }) => ({\n domain: one(subgraph_domain, {\n fields: [subgraph_registration.domainId],\n references: [subgraph_domain.id],\n }),\n registrant: one(subgraph_account, {\n fields: [subgraph_registration.registrantId],\n references: [subgraph_account.id],\n }),\n\n // event relations\n nameRegistereds: many(subgraph_nameRegistered),\n nameReneweds: many(subgraph_nameRenewed),\n nameTransferreds: many(subgraph_nameTransferred),\n}));\n\n/**\n * Wrapped Domain\n */\n\nexport const subgraph_wrappedDomain = onchainTable(\n \"subgraph_wrapped_domains\",\n (t) => ({\n // The unique identifier for each instance of the WrappedDomain entity\n id: t.hex().primaryKey(),\n // The domain that is wrapped by this WrappedDomain\n domainId: t.hex().notNull(),\n // The expiry date of the wrapped domain\n expiryDate: t.bigint().notNull(),\n // The number of fuses remaining on the wrapped domain\n fuses: t.integer().notNull(),\n // The account that owns this WrappedDomain\n ownerId: t.hex().notNull(),\n /**\n * The Name that this WrappedDomain represents. Names are emitted by the NameWrapper contract as\n * DNS-Encoded Names which may be malformed, which will result in this field being `null`.\n *\n * If {@link ENSIndexerConfig#isSubgraphCompatible}, this value is guaranteed to be either:\n * a) null (in the case of a DNS-Encoded Name that is malformed or contains subgraph-unindexable labels), or\n * b) a subgraph-indexable Subgraph Interpreted Label (i.e. a Literal Label of undefined normalization).\n *\n * @see https://ensnode.io/docs/reference/terminology#subgraph-indexability--labelname-interpretation\n *\n * Otherwise, this value is guaranteed to be either:\n * a) null (in the case of a malformed DNS-Encoded Name),\n * b) an Interpreted Name.\n *\n * @see https://ensnode.io/docs/reference/terminology#interpreted-name\n */\n name: t.text(),\n }),\n (t) => ({\n byDomainId: index().on(t.domainId),\n }),\n);\n\nexport const subgraph_wrappedDomainRelations = relations(subgraph_wrappedDomain, ({ one }) => ({\n domain: one(subgraph_domain, {\n fields: [subgraph_wrappedDomain.domainId],\n references: [subgraph_domain.id],\n }),\n owner: one(subgraph_account, {\n fields: [subgraph_wrappedDomain.ownerId],\n references: [subgraph_account.id],\n }),\n}));\n\n/**\n * Events\n */\n\nconst sharedEventColumns = (t: any) => ({\n id: t.text().primaryKey(),\n blockNumber: t.integer().notNull(),\n transactionID: t.hex().notNull(),\n});\n\nconst domainEvent = (t: any) => ({\n ...sharedEventColumns(t),\n domainId: t.hex().notNull(),\n});\n\nconst domainEventIndex = (t: any) => ({\n // primary reverse lookup\n idx: index().on(t.domainId),\n // sorting index\n idx_compound: index().on(t.domainId, t.id),\n});\n\n// Domain Event Entities\n\nexport const subgraph_transfer = onchainTable(\n \"subgraph_transfers\",\n (t) => ({\n ...domainEvent(t),\n ownerId: t.hex().notNull(),\n }),\n domainEventIndex,\n);\n\nexport const subgraph_newOwner = onchainTable(\n \"subgraph_new_owners\",\n (t) => ({\n ...domainEvent(t),\n ownerId: t.hex().notNull(),\n parentDomainId: t.hex().notNull(),\n }),\n domainEventIndex,\n);\n\nexport const subgraph_newResolver = onchainTable(\n \"subgraph_new_resolvers\",\n (t) => ({\n ...domainEvent(t),\n resolverId: t.text().notNull(),\n }),\n domainEventIndex,\n);\n\nexport const subgraph_newTTL = onchainTable(\n \"subgraph_new_ttls\",\n (t) => ({\n ...domainEvent(t),\n ttl: t.bigint().notNull(),\n }),\n domainEventIndex,\n);\n\nexport const subgraph_wrappedTransfer = onchainTable(\n \"subgraph_wrapped_transfers\",\n (t) => ({\n ...domainEvent(t),\n ownerId: t.hex().notNull(),\n }),\n domainEventIndex,\n);\n\nexport const subgraph_nameWrapped = onchainTable(\n \"subgraph_name_wrapped\",\n (t) => ({\n ...domainEvent(t),\n name: t.text(),\n fuses: t.integer().notNull(),\n ownerId: t.hex().notNull(),\n expiryDate: t.bigint().notNull(),\n }),\n domainEventIndex,\n);\n\nexport const subgraph_nameUnwrapped = onchainTable(\n \"subgraph_name_unwrapped\",\n (t) => ({\n ...domainEvent(t),\n ownerId: t.hex().notNull(),\n }),\n domainEventIndex,\n);\n\nexport const subgraph_fusesSet = onchainTable(\n \"subgraph_fuses_set\",\n (t) => ({\n ...domainEvent(t),\n fuses: t.integer().notNull(),\n }),\n domainEventIndex,\n);\n\nexport const subgraph_expiryExtended = onchainTable(\n \"subgraph_expiry_extended\",\n (t) => ({\n ...domainEvent(t),\n expiryDate: t.bigint().notNull(),\n }),\n domainEventIndex,\n);\n\n// Registration Event Entities\n\nconst registrationEvent = (t: any) => ({\n ...sharedEventColumns(t),\n registrationId: t.hex().notNull(),\n});\n\nconst registrationEventIndex = (t: any) => ({\n // primary reverse lookup\n idx: index().on(t.registrationId),\n // sorting index\n idx_compound: index().on(t.registrationId, t.id),\n});\n\nexport const subgraph_nameRegistered = onchainTable(\n \"subgraph_name_registered\",\n (t) => ({\n ...registrationEvent(t),\n registrantId: t.hex().notNull(),\n expiryDate: t.bigint().notNull(),\n }),\n registrationEventIndex,\n);\n\nexport const subgraph_nameRenewed = onchainTable(\n \"subgraph_name_renewed\",\n (t) => ({\n ...registrationEvent(t),\n expiryDate: t.bigint().notNull(),\n }),\n registrationEventIndex,\n);\n\nexport const subgraph_nameTransferred = onchainTable(\n \"subgraph_name_transferred\",\n (t) => ({\n ...registrationEvent(t),\n newOwnerId: t.hex().notNull(),\n }),\n registrationEventIndex,\n);\n\n// Resolver Event Entities\n\nconst resolverEvent = (t: any) => ({\n ...sharedEventColumns(t),\n resolverId: t.text().notNull(),\n});\n\nconst resolverEventIndex = (t: any) => ({\n // primary reverse lookup\n idx: index().on(t.resolverId),\n // sorting index\n idx_compound: index().on(t.resolverId, t.id),\n});\n\nexport const subgraph_addrChanged = onchainTable(\n \"subgraph_addr_changed\",\n (t) => ({\n ...resolverEvent(t),\n addrId: t.hex().notNull(),\n }),\n resolverEventIndex,\n);\n\nexport const subgraph_multicoinAddrChanged = onchainTable(\n \"subgraph_multicoin_addr_changed\",\n (t) => ({\n ...resolverEvent(t),\n coinType: t.bigint().notNull(),\n addr: t.hex().notNull(),\n }),\n resolverEventIndex,\n);\n\nexport const subgraph_nameChanged = onchainTable(\n \"subgraph_name_changed\",\n (t) => ({\n ...resolverEvent(t),\n name: t.text().notNull(),\n }),\n resolverEventIndex,\n);\n\nexport const subgraph_abiChanged = onchainTable(\n \"subgraph_abi_changed\",\n (t) => ({\n ...resolverEvent(t),\n contentType: t.bigint().notNull(),\n }),\n resolverEventIndex,\n);\n\nexport const subgraph_pubkeyChanged = onchainTable(\n \"subgraph_pubkey_changed\",\n (t) => ({\n ...resolverEvent(t),\n x: t.hex().notNull(),\n y: t.hex().notNull(),\n }),\n resolverEventIndex,\n);\n\nexport const subgraph_textChanged = onchainTable(\n \"subgraph_text_changed\",\n (t) => ({\n ...resolverEvent(t),\n key: t.text().notNull(),\n value: t.text(),\n }),\n resolverEventIndex,\n);\n\nexport const subgraph_contenthashChanged = onchainTable(\n \"subgraph_contenthash_changed\",\n (t) => ({\n ...resolverEvent(t),\n hash: t.hex().notNull(),\n }),\n resolverEventIndex,\n);\n\nexport const subgraph_interfaceChanged = onchainTable(\n \"subgraph_interface_changed\",\n (t) => ({\n ...resolverEvent(t),\n interfaceID: t.hex().notNull(),\n implementer: t.hex().notNull(),\n }),\n resolverEventIndex,\n);\n\nexport const subgraph_authorisationChanged = onchainTable(\n \"subgraph_authorisation_changed\",\n (t) => ({\n ...resolverEvent(t),\n owner: t.hex().notNull(),\n target: t.hex().notNull(),\n isAuthorized: t.boolean().notNull(),\n }),\n resolverEventIndex,\n);\n\nexport const subgraph_versionChanged = onchainTable(\n \"subgraph_version_changed\",\n (t) => ({\n ...resolverEvent(t),\n version: t.bigint().notNull(),\n }),\n resolverEventIndex,\n);\n\n/**\n * Event Relations\n */\n\n// Domain Event Relations\n\nexport const subgraph_transferRelations = relations(subgraph_transfer, ({ one }) => ({\n domain: one(subgraph_domain, {\n fields: [subgraph_transfer.domainId],\n references: [subgraph_domain.id],\n }),\n owner: one(subgraph_account, {\n fields: [subgraph_transfer.ownerId],\n references: [subgraph_account.id],\n }),\n}));\n\nexport const subgraph_newOwnerRelations = relations(subgraph_newOwner, ({ one }) => ({\n domain: one(subgraph_domain, {\n fields: [subgraph_newOwner.domainId],\n references: [subgraph_domain.id],\n }),\n owner: one(subgraph_account, {\n fields: [subgraph_newOwner.ownerId],\n references: [subgraph_account.id],\n }),\n parentDomain: one(subgraph_domain, {\n fields: [subgraph_newOwner.parentDomainId],\n references: [subgraph_domain.id],\n }),\n}));\n\nexport const subgraph_newResolverRelations = relations(subgraph_newResolver, ({ one }) => ({\n domain: one(subgraph_domain, {\n fields: [subgraph_newResolver.domainId],\n references: [subgraph_domain.id],\n }),\n resolver: one(subgraph_resolver, {\n fields: [subgraph_newResolver.resolverId],\n references: [subgraph_resolver.id],\n }),\n}));\n\nexport const subgraph_newTTLRelations = relations(subgraph_newTTL, ({ one }) => ({\n domain: one(subgraph_domain, {\n fields: [subgraph_newTTL.domainId],\n references: [subgraph_domain.id],\n }),\n}));\n\nexport const subgraph_wrappedTransferRelations = relations(subgraph_wrappedTransfer, ({ one }) => ({\n domain: one(subgraph_domain, {\n fields: [subgraph_wrappedTransfer.domainId],\n references: [subgraph_domain.id],\n }),\n owner: one(subgraph_account, {\n fields: [subgraph_wrappedTransfer.ownerId],\n references: [subgraph_account.id],\n }),\n}));\n\nexport const subgraph_nameWrappedRelations = relations(subgraph_nameWrapped, ({ one }) => ({\n domain: one(subgraph_domain, {\n fields: [subgraph_nameWrapped.domainId],\n references: [subgraph_domain.id],\n }),\n owner: one(subgraph_account, {\n fields: [subgraph_nameWrapped.ownerId],\n references: [subgraph_account.id],\n }),\n}));\n\nexport const subgraph_nameUnwrappedRelations = relations(subgraph_nameUnwrapped, ({ one }) => ({\n domain: one(subgraph_domain, {\n fields: [subgraph_nameUnwrapped.domainId],\n references: [subgraph_domain.id],\n }),\n owner: one(subgraph_account, {\n fields: [subgraph_nameUnwrapped.ownerId],\n references: [subgraph_account.id],\n }),\n}));\n\nexport const subgraph_fusesSetRelations = relations(subgraph_fusesSet, ({ one }) => ({\n domain: one(subgraph_domain, {\n fields: [subgraph_fusesSet.domainId],\n references: [subgraph_domain.id],\n }),\n}));\n\nexport const subgraph_expiryExtendedRelations = relations(subgraph_expiryExtended, ({ one }) => ({\n domain: one(subgraph_domain, {\n fields: [subgraph_expiryExtended.domainId],\n references: [subgraph_domain.id],\n }),\n}));\n\n// Registration Event Relations\n\nexport const subgraph_nameRegisteredRelations = relations(subgraph_nameRegistered, ({ one }) => ({\n registration: one(subgraph_registration, {\n fields: [subgraph_nameRegistered.registrationId],\n references: [subgraph_registration.id],\n }),\n registrant: one(subgraph_account, {\n fields: [subgraph_nameRegistered.registrantId],\n references: [subgraph_account.id],\n }),\n}));\n\nexport const subgraph_nameRenewedRelations = relations(subgraph_nameRenewed, ({ one }) => ({\n registration: one(subgraph_registration, {\n fields: [subgraph_nameRenewed.registrationId],\n references: [subgraph_registration.id],\n }),\n}));\n\nexport const subgraph_nameTransferredRelations = relations(subgraph_nameTransferred, ({ one }) => ({\n registration: one(subgraph_registration, {\n fields: [subgraph_nameTransferred.registrationId],\n references: [subgraph_registration.id],\n }),\n newOwner: one(subgraph_account, {\n fields: [subgraph_nameTransferred.newOwnerId],\n references: [subgraph_account.id],\n }),\n}));\n\n// Resolver Event Relations\n\nexport const subgraph_addrChangedRelations = relations(subgraph_addrChanged, ({ one }) => ({\n resolver: one(subgraph_resolver, {\n fields: [subgraph_addrChanged.resolverId],\n references: [subgraph_resolver.id],\n }),\n addr: one(subgraph_account, {\n fields: [subgraph_addrChanged.addrId],\n references: [subgraph_account.id],\n }),\n}));\n\nexport const subgraph_multicoinAddrChangedRelations = relations(\n subgraph_multicoinAddrChanged,\n ({ one }) => ({\n resolver: one(subgraph_resolver, {\n fields: [subgraph_multicoinAddrChanged.resolverId],\n references: [subgraph_resolver.id],\n }),\n }),\n);\n\nexport const subgraph_nameChangedRelations = relations(subgraph_nameChanged, ({ one }) => ({\n resolver: one(subgraph_resolver, {\n fields: [subgraph_nameChanged.resolverId],\n references: [subgraph_resolver.id],\n }),\n}));\n\nexport const subgraph_abiChangedRelations = relations(subgraph_abiChanged, ({ one }) => ({\n resolver: one(subgraph_resolver, {\n fields: [subgraph_abiChanged.resolverId],\n references: [subgraph_resolver.id],\n }),\n}));\n\nexport const subgraph_pubkeyChangedRelations = relations(subgraph_pubkeyChanged, ({ one }) => ({\n resolver: one(subgraph_resolver, {\n fields: [subgraph_pubkeyChanged.resolverId],\n references: [subgraph_resolver.id],\n }),\n}));\n\nexport const subgraph_textChangedRelations = relations(subgraph_textChanged, ({ one }) => ({\n resolver: one(subgraph_resolver, {\n fields: [subgraph_textChanged.resolverId],\n references: [subgraph_resolver.id],\n }),\n}));\n\nexport const subgraph_contenthashChangedRelations = relations(\n subgraph_contenthashChanged,\n ({ one }) => ({\n resolver: one(subgraph_resolver, {\n fields: [subgraph_contenthashChanged.resolverId],\n references: [subgraph_resolver.id],\n }),\n }),\n);\n\nexport const subgraph_interfaceChangedRelations = relations(\n subgraph_interfaceChanged,\n ({ one }) => ({\n resolver: one(subgraph_resolver, {\n fields: [subgraph_interfaceChanged.resolverId],\n references: [subgraph_resolver.id],\n }),\n }),\n);\n\nexport const subgraph_authorisationChangedRelations = relations(\n subgraph_authorisationChanged,\n ({ one }) => ({\n resolver: one(subgraph_resolver, {\n fields: [subgraph_authorisationChanged.resolverId],\n references: [subgraph_resolver.id],\n }),\n }),\n);\n\nexport const subgraph_versionChangedRelations = relations(subgraph_versionChanged, ({ one }) => ({\n resolver: one(subgraph_resolver, {\n fields: [subgraph_versionChanged.resolverId],\n references: [subgraph_resolver.id],\n }),\n}));\n","// https://github.com/drizzle-team/drizzle-orm/issues/638\nexport function monkeypatchCollate(col: any, collation: string) {\n col.getSQLType = function (this: any) {\n return `${Object.getPrototypeOf(this).getSQLType.call(this)} COLLATE ${collation}`;\n };\n return col;\n}\n","import { index, onchainTable } from \"ponder\";\n\nexport const nameSales = onchainTable(\n \"name_sales\",\n (t) => ({\n /**\n * Unique and deterministic identifier of the onchain event associated with the sale.\n *\n * Composite key format: \"{chainId}-{blockNumber}-{logIndex}\" (e.g., \"1-1234567-5\")\n */\n id: t.text().primaryKey(),\n\n /**\n * The chain where the sale occurred.\n */\n chainId: t.int8({ mode: \"number\" }).notNull(),\n\n /**\n * The block number on chainId where the sale occurred.\n */\n blockNumber: t.bigint().notNull(),\n\n /**\n * The log index position of the sale event within blockNumber.\n */\n logIndex: t.integer().notNull(),\n\n /**\n * The EVM transaction hash on chainId associated with the sale.\n */\n transactionHash: t.hex().notNull(),\n\n /**\n * The Seaport order hash.\n */\n orderHash: t.hex().notNull(),\n\n /**\n * The address of the contract on chainId that manages tokenId.\n */\n contractAddress: t.hex().notNull(),\n\n /**\n * The tokenId managed by contractAddress that was sold.\n *\n * In a general context (outside of TokenScope) ERC1155 NFTs may have\n * multiple copies, however TokenScope guarantees that all indexed NFTs\n * never have an amount / balance > 1.\n */\n tokenId: t.bigint().notNull(),\n\n /**\n * The CAIP-19 Asset Namespace of the token that was sold. Either `erc721` or `erc1155`.\n *\n * @see https://chainagnostic.org/CAIPs/caip-19\n */\n assetNamespace: t.text().notNull(),\n\n /**\n * The CAIP-19 Asset ID of token that was sold. This is a globally unique reference to the\n * specific asset in question.\n *\n * @see https://chainagnostic.org/CAIPs/caip-19\n */\n assetId: t.text().notNull(),\n\n /**\n * The namehash (Node) of the ENS domain that was sold.\n */\n domainId: t.hex().notNull(),\n\n /**\n * The account that bought the token controlling ownership of domainId from\n * the seller for the amount of currency associated with the sale.\n */\n buyer: t.hex().notNull(),\n\n /**\n * The account that sold the token controlling ownership of domainId to\n * buyer for the amount of currency associated with the sale.\n */\n seller: t.hex().notNull(),\n\n /**\n * Currency of the payment (ETH, USDC or DAI) from buyer to seller in exchange for tokenId.\n */\n currency: t.text().notNull(),\n\n /**\n * The amount of currency paid from buyer to seller in exchange for tokenId.\n *\n * Denominated in the smallest unit of currency.\n *\n * Amount interpretation depends on currency:\n * - ETH/WETH: Amount in wei (1 ETH = 10^18 wei)\n * - USDC: Amount in micro-units (1 USDC = 10^6 units)\n * - DAI: Amount in wei-equivalent (1 DAI = 10^18 units)\n */\n amount: t.bigint().notNull(),\n\n /**\n * Unix timestamp of the block timestamp when the sale occurred.\n */\n timestamp: t.bigint().notNull(),\n }),\n (t) => ({\n idx_domainId: index().on(t.domainId),\n idx_assetId: index().on(t.assetId),\n idx_buyer: index().on(t.buyer),\n idx_seller: index().on(t.seller),\n idx_timestamp: index().on(t.timestamp),\n }),\n);\n\nexport const nameTokens = onchainTable(\n \"name_tokens\",\n (t) => ({\n /**\n * The CAIP-19 Asset ID of the token.\n *\n * This is a globally unique reference to the token.\n *\n * @see https://chainagnostic.org/CAIPs/caip-19\n */\n id: t.text().primaryKey(),\n\n /**\n * The namehash (Node) of the ENS name associated with the token.\n *\n * Note: An ENS name may have more than one distinct token across time. It is\n * also possible for multiple distinct tokens for an ENS name to have\n * a mintStatus of `minted` at the same time. For example:\n * - When a direct subname of .eth is wrapped by the NameWrapper. This state\n * has one minted token for the name managed by the BaseRegistrar (this\n * token will be owned by the NameWrapper) and another minted token for\n * the name managed by the NameWrapper (owned by the effective owner of\n * the name).\n * - When a direct subname of .eth is wrapped by the NameWrapper and then\n * unwrapped. This state has one minted token (managed by the BaseRegistrar)\n * and another burned token (managed by the NameWrapper).\n */\n domainId: t.hex().notNull(),\n\n /**\n * The chain that manages the token.\n */\n chainId: t.int8({ mode: \"number\" }).notNull(),\n\n /**\n * The address of the contract on chainId that manages the token.\n */\n contractAddress: t.hex().notNull(),\n\n /**\n * The tokenId of the token managed by contractAddress.\n *\n * In a general context (outside of TokenScope) ERC1155 NFTs may have\n * multiple copies, however TokenScope guarantees that all indexed NFTs\n * never have an amount / balance > 1.\n */\n tokenId: t.bigint().notNull(),\n\n /**\n * The CAIP-19 Asset Namespace of the token. Either `erc721` or `erc1155`.\n *\n * @see https://chainagnostic.org/CAIPs/caip-19\n */\n assetNamespace: t.text().notNull(),\n\n /**\n * The account that owns the token.\n *\n * Value is zeroAddress if and only if mintStatus is `burned`.\n *\n * Note: The owner of the token for a given domainId may differ from the\n * owner of the associated node in the registry. For example:\n * - Consider the case where address X owns the ENS name `foo.eth` in\n * both the BaseRegistrar and the Registry. If X sends a request directly\n * to the Registry to transfer ownership to Y, ownership of `foo.eth` will\n * be transferred to Y in the Registry but not in the BaseRegistrar.\n * - ... for the case above, the BaseRegistrar implements a `reclaim`\n * allowing the owner of the name in the BaseRegistrar to reclaim ownership\n * of the name in the Registry.\n *\n * Note: When a name is wrapped by the NameWrapper, the owner of the token\n * in the BaseRegistrar is the NameWrapper, while a new token for the name is\n * minted by the NameWrapper and owned by the effective owner of the name.\n */\n owner: t.hex().notNull(),\n\n /**\n * The mint status of the token. Either `minted` or `burned`.\n *\n * After we index a NFT we never delete it from our index. Instead, when an\n * indexed NFT is burned onchain we retain its record and update its mint\n * status as `burned`. If a NFT is minted again after it is burned its mint\n * status is updated to `minted`.\n */\n mintStatus: t.text().notNull(),\n }),\n (t) => ({\n idx_domainId: index().on(t.domainId),\n idx_owner: index().on(t.owner),\n }),\n);\n","import { pgSchema, primaryKey } from \"drizzle-orm/pg-core\";\n\n/**\n * ENSNode Schema Name\n *\n * The name of the ENSNode schema in an ENSDb.\n */\nconst ENSNODE_SCHEMA_NAME = \"ensnode\";\n\n/**\n * ENSNode Schema\n *\n * Defines database objects within the ENSNode Schema in ENSDb.\n */\nconst ENSNODE_SCHEMA = pgSchema(ENSNODE_SCHEMA_NAME);\n\n/**\n * ENSNode Metadata\n *\n * Possible key value pairs are defined by 'EnsNodeMetadata' type:\n * - `EnsNodeMetadataEnsDbVersion`\n * - `EnsNodeMetadataEnsIndexerPublicConfig`\n * - `EnsNodeMetadataEnsIndexerIndexingStatus`\n */\nexport const metadata = ENSNODE_SCHEMA.table(\n \"metadata\",\n (t) => ({\n /**\n * ENSIndexer Schema Name\n *\n * References the name of the ENSIndexer Schema that the metadata record\n * belongs to. This allows multi-tenancy where multiple ENSIndexer\n * instances can write to the same ENSNode Metadata table.\n */\n ensIndexerSchemaName: t.text().notNull(),\n\n /**\n * Key\n *\n * Allowed keys:\n * - `EnsNodeMetadataEnsDbVersion['key']`\n * - `EnsNodeMetadataEnsIndexerPublicConfig['key']`\n * - `EnsNodeMetadataEnsIndexerIndexingStatus['key']`\n */\n key: t.text().notNull(),\n\n /**\n * Value\n *\n * Allowed values:\n * - `EnsNodeMetadataEnsDbVersion['value']`\n * - `EnsNodeMetadataEnsIndexerPublicConfig['value']`\n * - `EnsNodeMetadataEnsIndexerIndexingStatus['value']`\n *\n * Guaranteed to be a serialized representation of JSON object.\n */\n value: t.jsonb().notNull(),\n }),\n (table) => [\n /**\n * Primary key constraint on 'ensIndexerSchemaName' and 'key' columns,\n * to ensure that there is only one record for each key per ENSIndexer instance.\n */\n primaryKey({\n name: \"metadata_pkey\",\n columns: [table.ensIndexerSchemaName, table.key],\n }),\n ],\n);\n","/**\n * Utilities for Drizzle ORM integration with ENSDb.\n */\nimport type { Logger as DrizzleLogger } from \"drizzle-orm/logger\";\nimport { drizzle, type NodePgDatabase } from \"drizzle-orm/node-postgres\";\nimport { isPgEnum } from \"drizzle-orm/pg-core\";\nimport { isTable, Table } from \"drizzle-orm/table\";\n\n// Import the \"abstract\" ENSIndexer Schema.\n// It's called \"abstract\" here because tables defined in this schema do not\n// reference the specific ENSIndexer Schema name, and therefore cannot be used\n// directly to build a Drizzle client for ENSDb.\nimport * as abstractEnsIndexerSchema from \"../ensindexer-abstract\";\nimport * as ensNodeSchema from \"../ensnode\";\nimport { createChecksum } from \"./checksum\";\n\n/**\n * PostgreSQL startup `options` string for ENSDb connections.\n *\n * Sets `search_path` so unqualified references (notably the `gin_trgm_ops`\n * opclass from the pg_trgm extension, installed in the `ensnode` schema by\n * migration 0001) resolve correctly at query and index-creation time.\n *\n * Pass via node-postgres `PoolConfig.options` (e.g. Ponder's\n * `database.poolConfig.options`) or Drizzle's connection config.\n */\nexport const ENSDB_CONNECTION_OPTIONS = \"-c search_path=ensnode,public\";\n\n/**\n * Abstract ENSIndexer Schema\n *\n * Represents the \"abstract\" ENSIndexer Schema definition, where tables do not reference\n * the specific ENSIndexer Schema name.\n */\nexport type AbstractEnsIndexerSchema = typeof abstractEnsIndexerSchema;\n\n// TODO: remove the `appliedNameForConcreteEnsIndexerSchema` variable and\n// related logic when the `buildConcreteEnsIndexerSchema` function is\n// refactored to avoid mutating the \"abstract\" ENSIndexer Schema definition.\n/**\n * Applied name for the \"concrete\" ENSIndexer Schema.\n *\n * This is needed to prevent multiple calls to `buildConcreteEnsIndexerSchema` with different schema names,\n * which would mutate the same \"abstract\" ENSIndexer Schema and cause schema corruption.\n */\nlet appliedNameForConcreteEnsIndexerSchema: string | undefined;\n\n/**\n * Build a \"concrete\" ENSIndexer Schema definition for ENSDb.\n *\n * This function uses the \"abstract\" ENSIndexer Schema definition\n * to create a \"concrete\" ENSIndexer Schema definition referencing the provided\n * ENSIndexer Schema name. The \"concrete\" ENSIndexer Schema definition can then\n * be used to build the ENSDb Schema for a Drizzle client for ENSDb.\n *\n * @param ensIndexerSchemaName - The name of the ENSIndexer Schema instance in ENSDb.\n *\n * Note: this function is a replacement for `setDatabaseSchema` from `@ponder/client`.\n */\nfunction buildConcreteEnsIndexerSchema<ConcreteEnsIndexerSchema extends AbstractEnsIndexerSchema>(\n ensIndexerSchemaName: string,\n): ConcreteEnsIndexerSchema {\n // TODO: Refactor this function to avoid mutating the \"abstract\" ENSIndexer Schema definition.\n // https://github.com/namehash/ensnode/issues/1830\n\n if (\n appliedNameForConcreteEnsIndexerSchema !== undefined &&\n appliedNameForConcreteEnsIndexerSchema !== ensIndexerSchemaName\n ) {\n throw new Error(\n `buildConcreteEnsIndexerSchema was already called with schema \"${appliedNameForConcreteEnsIndexerSchema}\". ` +\n `Calling it again with \"${ensIndexerSchemaName}\" would corrupt the previously built schema.`,\n );\n }\n appliedNameForConcreteEnsIndexerSchema = ensIndexerSchemaName;\n\n const concreteEnsIndexerSchema = abstractEnsIndexerSchema as ConcreteEnsIndexerSchema;\n\n for (const dbObject of Object.values(abstractEnsIndexerSchema)) {\n if (isTable(dbObject)) {\n // Update Drizzle table definition to reference\n // the specific `ensIndexerSchemaName` name of the ENSIndexer Schema.\n // @ts-expect-error - Drizzle types don't define `Table.Symbol.Schema` type,\n // but it's present at runtime.\n dbObject[Table.Symbol.Schema] = ensIndexerSchemaName;\n } else if (isPgEnum(dbObject)) {\n // Update Drizzle enum definition to reference\n // the specific `ensIndexerSchemaName` name of the ENSIndexer Schema.\n // @ts-expect-error - Drizzle types consider `schema` to be\n // a readonly property.\n dbObject.schema = ensIndexerSchemaName;\n }\n }\n\n return concreteEnsIndexerSchema;\n}\n\n/**\n * ENSNode Schema\n *\n * Represents the ENSNode Schema definition for ENSDb.\n */\nexport type EnsNodeSchema = typeof ensNodeSchema;\n\n/**\n * Build individual ENSDb Schemas\n *\n * @param ensIndexerSchemaName - The name of the ENSIndexer Schema instance in ENSDb.\n * @returns An object containing the \"concrete\" ENSIndexer Schema and the ENSNode Schema.\n */\nexport function buildIndividualEnsDbSchemas<\n ConcreteEnsIndexerSchema extends AbstractEnsIndexerSchema,\n>(\n ensIndexerSchemaName: string,\n): {\n concreteEnsIndexerSchema: ConcreteEnsIndexerSchema;\n ensNodeSchema: EnsNodeSchema;\n} {\n return {\n concreteEnsIndexerSchema: buildConcreteEnsIndexerSchema(ensIndexerSchemaName),\n ensNodeSchema,\n };\n}\n\n/**\n * ENSDb Schema type\n *\n * Represents the combined database schema for ENSDb,\n * including both the \"concrete\" ENSIndexer Schema and the ENSNode Schema.\n */\ntype EnsDbSchema<ConcreteEnsIndexerSchema extends AbstractEnsIndexerSchema> =\n ConcreteEnsIndexerSchema & EnsNodeSchema;\n\n/**\n * Build ENSDb Schema for Drizzle client\n *\n * Uses the provided \"concrete\" ENSIndexer Schema definition to build\n * the ENSDb Schema.\n *\n * @param concreteEnsIndexerSchema - The \"concrete\" ENSIndexer Schema definition.\n * @returns The ENSDb Schema definition for use in building\n * a Drizzle client for ENSDb.\n */\nfunction buildEnsDbSchema<ConcreteEnsIndexerSchema extends AbstractEnsIndexerSchema>(\n concreteEnsIndexerSchema: ConcreteEnsIndexerSchema,\n): EnsDbSchema<ConcreteEnsIndexerSchema> {\n return {\n ...concreteEnsIndexerSchema,\n ...ensNodeSchema,\n };\n}\n\n/**\n * Drizzle client type for ENSDb.\n *\n * The `ConcreteEnsIndexerSchema` type parameter allows for typing\n * the Drizzle client with a \"concrete\" ENSIndexer Schema definition\n * where tables reference the specific ENSIndexer Schema name.\n */\nexport type EnsDbDrizzleClient<ConcreteEnsIndexerSchema extends AbstractEnsIndexerSchema> =\n NodePgDatabase<EnsDbSchema<ConcreteEnsIndexerSchema>>;\n\n/**\n * Build a Drizzle client for ENSDb.\n *\n * @param connectionString - The connection string for the ENSDb.\n * @param concreteEnsIndexerSchema - The \"concrete\" ENSIndexer Schema definition for the Drizzle client.\n * @param logger - Optional Drizzle logger for query logging.\n * @returns A Drizzle client for ENSDb.\n */\nexport function buildEnsDbDrizzleClient<ConcreteEnsIndexerSchema extends AbstractEnsIndexerSchema>(\n connectionString: string,\n concreteEnsIndexerSchema: ConcreteEnsIndexerSchema,\n logger?: DrizzleLogger,\n): EnsDbDrizzleClient<ConcreteEnsIndexerSchema> {\n const ensDbSchema = buildEnsDbSchema<ConcreteEnsIndexerSchema>(concreteEnsIndexerSchema);\n\n return drizzle({\n connection: { connectionString, options: ENSDB_CONNECTION_OPTIONS },\n schema: ensDbSchema,\n casing: \"snake_case\",\n logger,\n });\n}\n\n/**\n * Safely stringify a Drizzle schema definition.\n *\n * Handles circular references in the Drizzle schema definition by replacing\n * them with the string \"[circular]\". Thanks to this, we can safely stringify\n * any Drizzle schema definition without running into errors due to inability\n * of {@link JSON.stringify} to handle circular references by default.\n *\n * Note: {@link JSON.stringify} omits function-valued properties, so\n * column-level attributes such as `.$defaultFn()` or `.$onUpdateFn()` will not\n * be included in the stringified output and will not affect the checksum.\n * Schema changes that only modify such function-valued properties may go\n * undetected.\n *\n * @param schema - A Drizzle schema definition to stringify.\n * @returns A JSON string representation of the schema, with circular\n * references replaced by \"[circular]\".\n */\nfunction safeStringifyDrizzleSchema(schema: Record<string, unknown>): string {\n const seen = new WeakSet();\n\n return JSON.stringify(schema, (_key, value) => {\n if (typeof value === \"bigint\") return `${value}n`;\n\n if (typeof value === \"object\" && value !== null) {\n if (seen.has(value)) return \"[circular]\";\n seen.add(value);\n }\n\n return value;\n });\n}\n\n/**\n * Get a checksum for a Drizzle schema definition.\n *\n * @param schema - A Drizzle schema definition to get the checksum for.\n * @returns A 10-character checksum string for the schema.\n */\nexport function getDrizzleSchemaChecksum(schema: Record<string, unknown>): string {\n const stringifiedSchema = safeStringifyDrizzleSchema(schema);\n\n return createChecksum(stringifiedSchema);\n}\n","import { type BinaryLike, createHash } from \"node:crypto\";\n\n/**\n * Create a checksum for the given data\n *\n * @param data - The data to create a checksum for\n * @returns A 10-character hash string representing the checksum of the data\n *\n */\nexport function createChecksum(data: BinaryLike): string {\n return createHash(\"sha256\").update(data).digest(\"hex\").slice(0, 10);\n}\n","import * as abstractEnsIndexerSchema from \"../ensindexer-abstract\";\nimport * as ensNodeSchema from \"../ensnode\";\nimport { getDrizzleSchemaChecksum } from \"../lib/drizzle\";\n\n/**\n * ENSDb Config\n */\nexport interface EnsDbConfig {\n /**\n * PostgreSQL connection string for ENSDb.\n *\n * Guaranteed to be a valid PostgreSQL connection string with the format:\n * `postgresql://username:password@host:port/database` or\n * `postgres://username:password@host:port/database`\n */\n ensDbUrl: string;\n\n /**\n * The name of the ENSIndexer Schema in the ENSDb instance.\n *\n * Guaranteed to be a non-empty string that is\n * a valid Postgres database schema identifier\n */\n ensIndexerSchemaName: string;\n}\n\n/**\n * ENSDb Schema Checksum\n *\n * Checksum representing the ENSDb Schema definition, which is a combination of\n * - the ENSIndexer Schema definition, and\n * - the ENSNode Schema definition.\n *\n * This checksum can be used to verify compatibility between\n * the ENSDb Schema definition expected by any client app connecting to ENSDb\n * instance and the actual ENSDb Schema definition present in ENSDb SDK.\n */\nexport const ENSDB_SCHEMA_CHECKSUM = getDrizzleSchemaChecksum({\n ...abstractEnsIndexerSchema,\n ...ensNodeSchema,\n});\n\nexport { ENSDB_CONNECTION_OPTIONS } from \"../lib/drizzle\";\n","import { and, eq } from \"drizzle-orm/sql\";\n\nimport {\n buildIndexingMetadataContextUninitialized,\n deserializeIndexingMetadataContext,\n type EnsDbPublicConfig,\n type EnsDbVersionInfo,\n type IndexingMetadataContext,\n IndexingMetadataContextStatusCodes,\n} from \"@ensnode/ensnode-sdk\";\n\nexport {\n type IndexingMetadataContext,\n type IndexingMetadataContextInitialized,\n IndexingMetadataContextStatusCodes,\n type IndexingMetadataContextUninitialized,\n} from \"@ensnode/ensnode-sdk\";\n\nimport {\n type AbstractEnsIndexerSchema,\n buildEnsDbDrizzleClient,\n buildIndividualEnsDbSchemas,\n type EnsDbDrizzleClient,\n type EnsNodeSchema,\n} from \"../lib/drizzle\";\nimport { parsePgVersionInfo } from \"../lib/parse-pg-version-info\";\nimport { EnsNodeMetadataKeys } from \"./ensnode-metadata\";\nimport type {\n SerializedEnsNodeMetadata,\n SerializedEnsNodeMetadataIndexingMetadataContext,\n} from \"./serialize/ensnode-metadata\";\n\n/**\n * Re-export the ENSDb Drizzle Client type for external use in building\n * custom ENSDb queries with proper typing of the \"concrete\" ENSIndexer Schema\n * from the ENSDbReader instance.\n */\nexport type { EnsDbDrizzleClient } from \"../lib/drizzle\";\n\n/**\n * ENSDb Reader\n *\n * Enables read-only querying of an ENSDb instance, including data spanning\n * the ENSNode Schema and the specified ENSIndexer Schema.\n *\n * Note: we use a parameter type `ConcreteEnsIndexerSchema` to represent\n * the \"concrete\" ENSIndexer Schema type within the ENSDb Schema and\n * make sure that the Drizzle client used for querying is typed with\n * the same \"concrete\" ENSIndexer Schema type.\n */\nexport class EnsDbReader<\n ConcreteEnsIndexerSchema extends AbstractEnsIndexerSchema = AbstractEnsIndexerSchema,\n> {\n /**\n * Drizzle client for ENSDb.\n *\n * Uses the ENSDb Schema from {@link ensDbSchema}.\n */\n protected drizzleClient: EnsDbDrizzleClient<ConcreteEnsIndexerSchema>;\n\n /**\n * \"Concrete\" ENSIndexer Schema definition for ENSDb.\n *\n * This is the \"concrete\" ENSIndexer Schema in which tables reference\n * the ENSIndexer Schema name from {@link ensIndexerSchemaName}.\n */\n protected _concreteEnsIndexerSchema: ConcreteEnsIndexerSchema;\n\n /**\n * The name of the ENSIndexer schema to read from in ENSDb.\n *\n * This also identifies which ENSNode metadata records to read from the ENSNode Schema\n * as the ENSNode Schema is multi-tenant across ENSIndexer instances / ENSIndexer Schemas in an ENSDb.\n */\n protected _ensIndexerSchemaName: string;\n\n protected _ensNodeSchema: EnsNodeSchema;\n\n /**\n * @param ensDbUrl The connection string for Drizzle to connect to the ENSDb instance.\n * @param ensIndexerSchemaName The name of the ENSIndexer schema to read from in ENSDb, used to identify which ENSNode metadata records to read.\n */\n constructor(ensDbUrl: string, ensIndexerSchemaName: string) {\n const { concreteEnsIndexerSchema, ensNodeSchema } =\n buildIndividualEnsDbSchemas<ConcreteEnsIndexerSchema>(ensIndexerSchemaName);\n const ensDbDrizzleClient = buildEnsDbDrizzleClient<ConcreteEnsIndexerSchema>(\n ensDbUrl,\n concreteEnsIndexerSchema,\n );\n this.drizzleClient = ensDbDrizzleClient;\n this._concreteEnsIndexerSchema = concreteEnsIndexerSchema;\n this._ensIndexerSchemaName = ensIndexerSchemaName;\n this._ensNodeSchema = ensNodeSchema;\n }\n\n /**\n * Getter for the Drizzle client for ENSDb instance\n *\n * Useful while working on complex queries for ENSDb.\n */\n get ensDb(): EnsDbDrizzleClient<ConcreteEnsIndexerSchema> {\n return this.drizzleClient;\n }\n\n /**\n * Getter for the \"concrete\" ENSIndexer Schema definition used in the Drizzle client\n * for ENSDb instance.\n *\n * Useful while working on complex queries for ENSDb.\n *\n * Note: using `ensIndexerSchema` name for this getter to make it read better\n * in the context of query building. For example:\n * `this.ensDb.select().from(this.ensIndexerSchema.event)` vs.\n * `this.ensDb.select().from(this.concreteEnsIndexerSchema.event)`.\n */\n get ensIndexerSchema(): ConcreteEnsIndexerSchema {\n return this._concreteEnsIndexerSchema;\n }\n\n /**\n * Getter for the ENSIndexer Schema Name used by this ENSDbReader instance.\n */\n get ensIndexerSchemaName(): string {\n return this._ensIndexerSchemaName;\n }\n\n /**\n * Getter for the ENSNode Schema definition used in the Drizzle client\n * for ENSDb instance.\n *\n * Useful while working on complex queries for ENSDb.\n */\n get ensNodeSchema(): EnsNodeSchema {\n return this._ensNodeSchema;\n }\n\n /**\n * Check if the ENSDb instance is healthy by running a simple query\n * against it.\n */\n async isHealthy(): Promise<boolean> {\n try {\n await this.ensDb.execute(\"SELECT 1;\");\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Check if the ENSDb instance is ready by verifying that\n * the {@link IndexingMetadataContext} has been initialized for\n * the ENSIndexer Schema used by this ENSDbReader instance.\n */\n async isReady(): Promise<boolean> {\n try {\n const indexingMetadataContext = await this.getIndexingMetadataContext();\n return indexingMetadataContext.statusCode === IndexingMetadataContextStatusCodes.Initialized;\n } catch {\n return false;\n }\n }\n\n /**\n * Build ENSDb Public Config\n */\n async buildEnsDbPublicConfig(): Promise<EnsDbPublicConfig> {\n const versionInfo = await this.buildEnsDbVersionInfo();\n\n return {\n versionInfo,\n };\n }\n\n /**\n * Get Indexing Metadata Context\n *\n * @returns the initialized record, or a default uninitialized one if no record exists in ENSDb.\n */\n async getIndexingMetadataContext(): Promise<IndexingMetadataContext> {\n const record = await this.getEnsNodeMetadata<SerializedEnsNodeMetadataIndexingMetadataContext>({\n key: EnsNodeMetadataKeys.IndexingMetadataContext,\n });\n\n if (!record) {\n return buildIndexingMetadataContextUninitialized();\n }\n\n return deserializeIndexingMetadataContext(record);\n }\n\n /**\n * Get ENSNode Metadata record\n *\n * @returns selected record in ENSDb.\n * @throws when more than one matching metadata record is found\n * (should be impossible given the composite PK constraint on\n * 'ensIndexerSchemaName' and 'key')\n */\n private async getEnsNodeMetadata<EnsNodeMetadataType extends SerializedEnsNodeMetadata>(\n metadata: Pick<EnsNodeMetadataType, \"key\">,\n ): Promise<EnsNodeMetadataType[\"value\"] | undefined> {\n const result = await this.ensDb\n .select()\n .from(this.ensNodeSchema.metadata)\n .where(\n and(\n eq(this.ensNodeSchema.metadata.ensIndexerSchemaName, this.ensIndexerSchemaName),\n eq(this.ensNodeSchema.metadata.key, metadata.key),\n ),\n );\n\n if (result.length === 0) {\n return undefined;\n }\n\n if (result.length === 1 && result[0]) {\n return result[0].value as EnsNodeMetadataType[\"value\"];\n }\n\n throw new Error(\n `There must be exactly one ENSNodeMetadata record for ('${this.ensIndexerSchemaName}', '${metadata.key}') composite key`,\n );\n }\n\n /**\n * Get PostgreSQL version for the server hosting the ENSDb instance.\n *\n * @throws when the version cannot be retrieved or parsed from the query result.\n */\n private async getPostgresVersion(): Promise<string> {\n const result = await this.ensDb.execute<{ version: string }>(\"SELECT version();\");\n\n // result will be in the form of [{ version: \"PostgreSQL 15.5 (Ubuntu 15.5-0ubuntu0.22.04.1) ...\" }]\n const versionString = result.rows[0]?.version;\n\n try {\n return parsePgVersionInfo(versionString);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"Unknown error\";\n throw new Error(`Failed to get PostgreSQL version for the ENSDb instance: ${errorMessage}`);\n }\n }\n\n /**\n * Build ENSDb version info.\n *\n * @throws when version info cannot be retrieved or parsed from\n * the ENSDb instance.\n */\n private async buildEnsDbVersionInfo(): Promise<EnsDbVersionInfo> {\n const postgresVersion = await this.getPostgresVersion();\n\n return {\n postgresql: postgresVersion,\n };\n }\n}\n","/**\n * Parse PostgreSQL version information from a version string.\n *\n * @param versionString The version string is expected to be in the format\n * returned by the PostgreSQL `version()` function,\n * which typically looks like:\n * \"PostgreSQL 15.5 (Ubuntu 15.5-0ubuntu0.22.04.1) ...\"\n * @returns The parsed PostgreSQL version as a string.\n */\nexport function parsePgVersionInfo(versionString: string | undefined): string {\n if (typeof versionString !== \"string\") {\n throw new Error(\"PostgreSQL version string must be a string\");\n }\n\n // extract the version number using regex\n const match = versionString.match(/PostgreSQL (\\d+\\.\\d+)/);\n\n if (!match) {\n throw new Error(`Failed to parse PostgreSQL version from version string: '${versionString}'`);\n }\n\n const parsedVersion = match[1];\n\n if (typeof parsedVersion !== \"string\") {\n throw new Error(`Parsed PostgreSQL version is not a string: '${parsedVersion}'`);\n }\n\n return parsedVersion;\n}\n","import type { IndexingMetadataContextInitialized } from \"@ensnode/ensnode-sdk\";\n\n/**\n * Keys used to distinguish records in `ensnode_metadata` table in the ENSDb.\n */\nexport const EnsNodeMetadataKeys = {\n IndexingMetadataContext: \"indexing_metadata_context\",\n} as const;\n\nexport type EnsNodeMetadataKey = (typeof EnsNodeMetadataKeys)[keyof typeof EnsNodeMetadataKeys];\n\n/**\n * ENSNode Metadata record for Indexing Metadata Context\n *\n * This record is used to store the Indexing Metadata Context in\n * ENSNode Metadata table for each ENSIndexer instance.\n */\nexport interface EnsNodeMetadataIndexingMetadataContext {\n key: typeof EnsNodeMetadataKeys.IndexingMetadataContext;\n value: IndexingMetadataContextInitialized;\n}\n\n/**\n * ENSNode Metadata\n *\n * Type alias for ENSNode Metadata records,\n * currently only includes the record for Indexing Metadata Context,\n * but can be extended in the future to include more types of\n * ENSNode Metadata records as needed.\n */\nexport type EnsNodeMetadata = EnsNodeMetadataIndexingMetadataContext;\n","import { sql } from \"drizzle-orm\";\nimport { migrate } from \"drizzle-orm/node-postgres/migrator\";\n\nimport {\n type IndexingMetadataContextInitialized,\n serializeIndexingMetadataContext,\n} from \"@ensnode/ensnode-sdk\";\n\nimport { advisoryLockId } from \"../lib/advisory-lock-id\";\nimport { EnsDbReader } from \"./ensdb-reader\";\nimport { EnsNodeMetadataKeys } from \"./ensnode-metadata\";\nimport type { SerializedEnsNodeMetadata } from \"./serialize/ensnode-metadata\";\n\n/**\n * ENSDb Writer\n *\n * Allows updating an ENSDb instance, including:\n * - executing database migrations for ENSNode Schema,\n * - updating ENSNode Metadata records in ENSDb for the given ENSIndexer instance.\n */\nexport class EnsDbWriter extends EnsDbReader {\n /**\n * Stable arbitrary lock ID for ENSNode Schema migrations to\n * prevent concurrent migration execution across multiple ENSIndexer instances.\n */\n private static readonly MIGRATION_LOCK_ID: bigint = advisoryLockId(\n \"ensnode-schema-migration-lock\",\n );\n\n /**\n * Execute pending database migrations for ENSNode Schema in ENSDb.\n *\n * This function is:\n * - idempotent and can be safely executed multiple times,\n * - safe to execute concurrently across multiple ENSIndexer instances,\n * as it uses a stable arbitrary advisory lock to prevent concurrent\n * execution of migrations.\n *\n * @param migrationsDirPath - The file path to the directory containing\n * database migration files for ENSNode Schema.\n * @throws error when migration execution fails.\n */\n async migrateEnsNodeSchema(migrationsDirPath: string): Promise<void> {\n // `pg_advisory_xact_lock` is transaction-scoped, and is automatically released\n // when the transaction ends, with no explicit unlock needed. Running it inside\n // a Drizzle transaction also guarantees that the lock acquisition, all\n // migration queries, and the lock release all run on the same physical\n // connection — which is required for advisory locks to work correctly with a\n // connection pool.\n await this.drizzleClient.transaction(async (tx) => {\n await tx.execute(sql`SELECT pg_advisory_xact_lock(${EnsDbWriter.MIGRATION_LOCK_ID})`);\n await migrate(tx, {\n migrationsFolder: migrationsDirPath,\n migrationsSchema: \"ensnode\",\n });\n });\n }\n\n /**\n * Upsert Indexing Metadata Context Initialized\n *\n * @throws when upsert operation failed.\n */\n async upsertIndexingMetadataContext(\n indexingMetadataContext: IndexingMetadataContextInitialized,\n ): Promise<void> {\n await this.upsertEnsNodeMetadata({\n key: EnsNodeMetadataKeys.IndexingMetadataContext,\n value: serializeIndexingMetadataContext(indexingMetadataContext),\n });\n }\n\n /**\n * Upsert ENSNode metadata\n *\n * @throws when upsert operation failed.\n */\n private async upsertEnsNodeMetadata(metadata: SerializedEnsNodeMetadata): Promise<void> {\n await this.ensDb\n .insert(this.ensNodeSchema.metadata)\n .values({\n ensIndexerSchemaName: this.ensIndexerSchemaName,\n key: metadata.key,\n value: metadata.value,\n })\n .onConflictDoUpdate({\n target: [this.ensNodeSchema.metadata.ensIndexerSchemaName, this.ensNodeSchema.metadata.key],\n set: { value: metadata.value },\n });\n }\n}\n","import { createHash } from \"node:crypto\";\n\n/**\n * Generate a stable arbitrary advisory lock ID for the given name.\n *\n * @param name - The name to derive the advisory lock ID from. This should be\n * a fixed string that uniquely identifies the critical section of code that\n * requires synchronization, such as \"schema-migrations\".\n * @returns A bigint representing the advisory lock ID to be used with PostgreSQL advisory locks.\n */\nexport function advisoryLockId(name: string): bigint {\n const hash = createHash(\"sha256\").update(name).digest();\n // Read the first 8 bytes as a signed 64-bit integer (Postgres bigint range)\n return hash.readBigInt64BE(0);\n}\n","import { prettifyError } from \"zod/v4\";\n\nimport type { Unvalidated } from \"@ensnode/ensnode-sdk\";\n\nimport type { EnsDbConfig } from \"../ensdb-config\";\nimport { EnsDbConfigSchema } from \"../zod-schemas/ensdb-config\";\n\n/**\n * Validate ENSDb config\n *\n * @param unvalidatedConfig - Unvalidated ENSDb config\n * @returns Valid ENSDb config\n * @throws Error if validation fails, with details about the validation errors\n */\nexport function validateEnsDbConfig(unvalidatedConfig: Unvalidated<EnsDbConfig>): EnsDbConfig {\n const ensDbConfig = EnsDbConfigSchema.safeParse(unvalidatedConfig);\n\n if (!ensDbConfig.success) {\n throw new Error(`Failed to parse ENSDb configuration: \\n${prettifyError(ensDbConfig.error)}\\n`);\n }\n\n return ensDbConfig.data;\n}\n","import { parse as parseConnectionString } from \"pg-connection-string\";\nimport { z } from \"zod/v4\";\n\nexport const EnsDbUrlSchema = z.string().refine(\n (url) => {\n try {\n if (!url.startsWith(\"postgresql://\") && !url.startsWith(\"postgres://\")) {\n return false;\n }\n const config = parseConnectionString(url);\n return !!(config.host && config.port && config.database);\n } catch {\n return false;\n }\n },\n {\n error:\n \"Invalid PostgreSQL connection string for ENSDb. Expected format: postgresql://username:password@host:port/database\",\n },\n);\n\nconst EnsIndexerSchemaNameSchema = z\n .string({\n error: \"ENSIndexer Schema Name is required.\",\n })\n .trim()\n .nonempty({\n error: \"ENSIndexer Schema Name cannot be an empty string.\",\n });\n\nexport const EnsDbConfigSchema = z.object({\n ensDbUrl: EnsDbUrlSchema,\n ensIndexerSchemaName: EnsIndexerSchemaNameSchema,\n});\n"],"mappings":"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","names":["onchainTable","primaryKey","onchainTable","primaryKey","relations","uniqueIndex","index","onchainEnum","onchainTable","relations","uniqueIndex","index","onchainTable","relations","sql","onchainTable","index","sql","relations","domainEvent","resolverEvent","index","onchainTable","primaryKey","IndexingMetadataContextStatusCodes","metadata","sql","createHash","sql","metadata"]}