SubgraphEntity reference

Entity reference

Every entity below mirrors Subgraph/schema.graphql 1-for-1. Field types use the GraphQL standard set (String, Int, BigInt, Boolean, ID); a trailing ! denotes a non-nullable field.

IDs are always namespaced by chainId. The composition is documented per entity below; any cross-chain key collision is impossible by construction.

Enums

enum ListingFormat {
  NONE      # Floor item — no owner/duration/floorMultiple
  LIQUID    # Liquid listing (above floor, prepaid Harberger tax)
  DUTCH     # Native dutch listing (declining price)
}
 
enum ListingActivityType {
  CREATED
  RELISTED
  FILLED
  TRANSFERRED
  CANCELLED
  EXTENDED
  REPRICED
  DEPOSITED   # Locker.TokenDeposit
  REDEEMED    # Locker.TokenRedeem
  SWAPPED     # Locker.TokenSwap / TokenSwapBatch
}
 
enum AirdropClaimType {
  ERC20
  ERC721
  ERC1155
  NATIVE
}

Config

Singleton per chain. id = chainId.

FieldTypeSource event
chainIdInt!
ammFeeBigInt!NFTXV4Hook.AMMFeeSet
ammBeneficiaryString!NFTXV4Hook.AMMBeneficiarySet
defaultFeeBigInt!NFTXV4Hook.DefaultFeeSet
lockedBoolean!Locker.Paused / Locker.Unpaused
collectionShutdownContractString!Locker.CollectionShutdownContractUpdated
collectionCreationFeeBigInt!Locker.CollectionCreationFeeUpdated
collectionCreationFeeRecipientString!Locker.CollectionCreationFeeRecipientUpdated
permissionlessCreateCollectionBoolean!Locker.PermissionlessCreateCollectionUpdated
defaultTaxCalculatorString!Listings.DefaultTaxCalculatorUpdated
defaultMaxFloorMultipleInt!Listings.DefaultListingConfigUpdated
defaultMinLiquidDurationBigInt!Listings.DefaultListingConfigUpdated
defaultMaxLiquidDurationBigInt!Listings.DefaultListingConfigUpdated
defaultMinDutchDurationBigInt!Listings.DefaultListingConfigUpdated
defaultMaxDutchDurationBigInt!Listings.DefaultListingConfigUpdated
defaultLiquidDutchDurationBigInt!Listings.DefaultListingConfigUpdated
updatedBigInt!last write timestamp

Collection

Created by Locker.CollectionCreated, finalised by Locker.CollectionInitialized. id = chainId-collection.

FieldTypeNotes
collectionString! (indexed)NFT contract address
collectionTokenString! (indexed)ERC-20 clone address (1 per collection)
creatorString!Address that called createCollection
poolKeyStringEncoded V4 PoolKey; null until initializeCollection
name / symbolString!Mirrors the CollectionToken clone metadata
sourceChainIdBigIntBridge provenance — null for native collections
sourceChainAddressStringBridge provenance — null for native collections
defaultFeeBigInt!From NFTXV4Hook.DefaultFeeSet
poolFeeBigInt!From NFTXV4Hook.PoolFeeSet (overrides defaultFee when set)
sqrtPriceX96 / tick / liquidityoptionalLatest pool state from PoolStateUpdated
protocolFee / swapFeeBigIntLatest from PoolStateUpdated
publicListingsInt!Liquid + dutch listings counter
shutdownPreventedBoolean!CollectionShutdown.preventShutdown(_collection, true)
taxCalculatorStringPer-collection override from Listings.CollectionTaxCalculatorUpdated; null = uses Config.defaultTaxCalculator
maxFloorMultipleIntPer-collection override from Listings.CollectionListingConfigUpdated; null = uses Config default
minLiquidDuration / maxLiquidDurationBigIntPer-collection override; null = uses Config default
minDutchDuration / maxDutchDurationBigIntPer-collection override; null = uses Config default
liquidDutchDurationBigIntPer-collection override; null = uses Config default
createdAt / updatedAtBigInt!

Reverse relations: listings, poolFees, shutdown.

The per-collection override fields are all cleared back to null (fall back to the Config defaults) when Listings.CollectionListingConfigUpdated fires with maxFloorMultiple == 0.

Listing

id = chainId-collection-tokenId. There is only one Listing row per (collection, tokenId) — when a listing is filled or cancelled the row is updated/removed in place; the lifecycle log lives in ListingActivity.

FieldTypeNotes
collectionCollection! (indexed)FK
tokenIdBigInt!
ownerStringnull for format = NONE (floor)
created / durationBigIntnull for floor
floorMultipleIntnull for floor; 1.00x = 100 in pip units
formatListingFormat!See enum
taxCapturedBigInt!Cumulative Listings.ListingFeeCaptured for this listing
createdAt / updatedAtBigInt!
⚠️

The frontend sometimes wants to display a listing as “DUTCH” once the listed duration has elapsed even though the on-chain format still reads LIQUID. This is intentional — Listings.getListingType() is the authoritative client-side resolver.

ListingActivity

One row per state-changing event. id is opaque (collection-tokenId-type-timestamp).

FieldTypeNotes
listingListing!FK
collectionCollection!denormalised for filter performance
tokenIdBigInt!denormalised
activityTypeListingActivityType!See enum
txHashString!
from / toString?optional, depending on activity type
floorMultipleInt?new value after a REPRICED
ethPriceBigInt?sale price on FILLED
createdBigInt!

LockerManager

Approved Locker manager contracts (see LockerManager.ManagerSet). id = chainId-manager.

FieldType
managerString! (indexed)
approvedBoolean!
updatedAtBigInt!

TokenEscrow

Per-payee, per-token claimable balance. Inherited by both Listings and NFTXV4Hook — the indexer aggregates writes from either source under a common (chainId, payee, token) key. id = chainId-payee-token.

FieldType
payeeString! (indexed)
tokenString! (indexed)
amountBigInt!
updatedBigInt!

PoolFees

Per-collection lifetime + queued fee accounting. Amounts are denominated in the pool’s V4-sorted currency order — queuedAmount0/totalDonated0 correspond to whichever of (native token, collection token) sorts lower by address. Resolve via Collection.poolKey. id = chainId-collection.

FieldTypeSource
collectionCollection! (indexed)FK
queuedAmount0 / queuedAmount1BigInt!incremented by PoolFeesQueued, cleared by PoolFeesDonated
totalDonated0 / totalDonated1BigInt!accumulated lifetime via PoolFeesDonated
updatedAtBigInt!

PoolFeeDonation

One row per NFTXV4Hook.PoolFeesDonated.

FieldType
collectionCollection!
amount0 / amount1BigInt!
txHashString!
triggeredByString? (tx sender)
createdBigInt!

FeeOverride

Per-beneficiary flat-fee override. id = chainId-beneficiary.

FieldType
beneficiaryString! (indexed)
flatFeeBigInt? (null when removed)
updatedAtBigInt!

CollectionShutdown

The shutdown lifecycle: start → vote / reclaim → quorum → execute → claim (or cancel). id = chainId-collection.

FieldTypeNotes
collectionCollection! (indexed)FK
quorumBigInt!Required vote weight
liquidationPoolString?Created by CollectionShutdownExecuted
liquidationPoolTokens[BigInt!]!NFT tokenIds liquidated
claimAvailableBigInt!Incremented by CollectionShutdownTokenLiquidated
startedAt / startedByBigInt! / String!
executedAt / executedByBigInt? / String?
quorumReachedAtBigInt?If non-null, shutdown can be executed

Reverse relations: votes, claims.

CollectionShutdownVote

FieldTypeNotes
shutdownCollectionShutdown!FK
voterString! (indexed)
votesBigInt!Signed — negative on reclaimVote
createdAtBigInt!

CollectionShutdownClaim

FieldType
shutdownCollectionShutdown!
claimantString! (indexed)
tokensBurntBigInt!
ethReceivedBigInt!
txHashString!
claimedAtBigInt!

AirdropDistribution

Created by AirdropRecipient.AirdropDistributed. id = chainId-merkle-claimType.

FieldType
merkleString!
claimTypeAirdropClaimType!
createdAtBigInt!

Reverse relation: claims.

AirdropClaim

FieldType
airdropAirdropDistribution!
recipientString! (indexed)
targetString!
tokenIdBigInt!
amountBigInt!
txHashString!
claimedAtBigInt!

AirdropTarget

Owner-curated allowlist for AirdropRecipient.requestAirdrop targets. id = chainId-target.

FieldType
targetString! (indexed)
allowedBoolean!
updatedAtBigInt!

ListingsContract

A Listings contract registered on the Locker (Locker.ListingsContractAdded / ListingsContractRemoved). approved is toggled rather than the row being deleted, so registry history is preserved. id = chainId-listings.

FieldType
listingsString! (indexed)
approvedBoolean!
updatedAtBigInt!

AmmFeeTaken

Append-only log of every NFTXV4Hook.AMMFeesTaken event. recipient may be address(0), indicating the cut was burnt.

FieldType
recipientString! (indexed)
tokenString!
amountBigInt!
txHashString!
createdBigInt!