From 1239dbc77a3169da657bfeb211888d56553c82ed Mon Sep 17 00:00:00 2001 From: Alko89 Date: Wed, 12 Apr 2023 19:03:33 +0200 Subject: [PATCH 1/9] feat: Update collection entity and add migration --- .gitignore | 2 ++ db/migrations/1681318561000-Data.js | 13 +++++++++++++ schema.graphql | 2 ++ src/mappings/index.ts | 6 ++++++ src/model/generated/collectionEntity.model.ts | 9 +++++++++ 5 files changed, 32 insertions(+) create mode 100644 db/migrations/1681318561000-Data.js diff --git a/.gitignore b/.gitignore index 1c9878d..213f9f7 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,5 @@ .DS_Store dump_*.sql + +.env diff --git a/db/migrations/1681318561000-Data.js b/db/migrations/1681318561000-Data.js new file mode 100644 index 0000000..4b31c7e --- /dev/null +++ b/db/migrations/1681318561000-Data.js @@ -0,0 +1,13 @@ +module.exports = class Data1681318561000 { + name = 'Data1681318561000' + + async up(db) { + await db.query(`ALTER TABLE "collection_entity" ADD "volume" numeric`) + await db.query(`ALTER TABLE "collection_entity" ADD "highestSalePrice" numeric`) + } + + async down(db) { + await db.query(`ALTER TABLE "collection_entity" DROP COLUMN "volume"`) + await db.query(`ALTER TABLE "collection_entity" DROP COLUMN "highestSalePrice"`) + } +} diff --git a/schema.graphql b/schema.graphql index 53a25c3..8fa6aa1 100644 --- a/schema.graphql +++ b/schema.graphql @@ -16,6 +16,8 @@ type CollectionEntity @entity { nftCount: Int! supply: Int! type: CollectionType! + volume: BigInt! + highestSalePrice: BigInt! } type NFTEntity @entity { diff --git a/src/mappings/index.ts b/src/mappings/index.ts index 69336e4..fc20c95 100644 --- a/src/mappings/index.ts +++ b/src/mappings/index.ts @@ -94,6 +94,8 @@ export async function handleCollectionCreate(context: Context): Promise { final.nftCount = 0; final.supply = 0; final.type = type; + final.volume = BigInt(0); + final.highestSalePrice = BigInt(0); logger.debug(`metadata: ${final.metadata}`); @@ -248,6 +250,10 @@ export async function handleTokenBuy(context: Context): Promise { const collection = ensure(await get(context.store, CE, event.collectionId)); plsBe(real, collection); + collection.volume++; + if (event.price && collection.highestSalePrice < event.price) { + collection.highestSalePrice = event.price; + } collection.updatedAt = event.timestamp; logger.success(`[BUY] ${id} by ${event.caller}`); diff --git a/src/model/generated/collectionEntity.model.ts b/src/model/generated/collectionEntity.model.ts index ff820b5..2138dcb 100644 --- a/src/model/generated/collectionEntity.model.ts +++ b/src/model/generated/collectionEntity.model.ts @@ -63,4 +63,13 @@ export class CollectionEntity { @Column_("varchar", {length: 15, nullable: false}) type!: CollectionType + + @Column_("numeric", {transformer: marshal.bigintTransformer, nullable: false}) + volume!: bigint + + @Column_("numeric", {transformer: marshal.bigintTransformer, nullable: false}) + highestSalePrice!: bigint + + // @Column_("int", {nullable: true}) + // total!: number } From ef07e3c4aceca3c000a3673f3de799cb53776513 Mon Sep 17 00:00:00 2001 From: Alko89 Date: Wed, 12 Apr 2023 19:09:04 +0200 Subject: [PATCH 2/9] fix: migration --- db/migrations/1681318561000-Data.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/db/migrations/1681318561000-Data.js b/db/migrations/1681318561000-Data.js index 4b31c7e..e0cbb7e 100644 --- a/db/migrations/1681318561000-Data.js +++ b/db/migrations/1681318561000-Data.js @@ -3,11 +3,11 @@ module.exports = class Data1681318561000 { async up(db) { await db.query(`ALTER TABLE "collection_entity" ADD "volume" numeric`) - await db.query(`ALTER TABLE "collection_entity" ADD "highestSalePrice" numeric`) + await db.query(`ALTER TABLE "collection_entity" ADD "highest_sale_price" numeric`) } async down(db) { await db.query(`ALTER TABLE "collection_entity" DROP COLUMN "volume"`) - await db.query(`ALTER TABLE "collection_entity" DROP COLUMN "highestSalePrice"`) + await db.query(`ALTER TABLE "collection_entity" DROP COLUMN "highest_sale_price"`) } } From 925dd4ceed3b36cdd77012e41b5bcf764f9bda78 Mon Sep 17 00:00:00 2001 From: Alko89 Date: Wed, 12 Apr 2023 19:20:11 +0200 Subject: [PATCH 3/9] fix: remove comment --- src/model/generated/collectionEntity.model.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/model/generated/collectionEntity.model.ts b/src/model/generated/collectionEntity.model.ts index 2138dcb..f0a2a15 100644 --- a/src/model/generated/collectionEntity.model.ts +++ b/src/model/generated/collectionEntity.model.ts @@ -69,7 +69,4 @@ export class CollectionEntity { @Column_("numeric", {transformer: marshal.bigintTransformer, nullable: false}) highestSalePrice!: bigint - - // @Column_("int", {nullable: true}) - // total!: number } From 78a9ea2df7a1de12fb74bfe76a3b2f0a41ed248b Mon Sep 17 00:00:00 2001 From: Alko89 Date: Sat, 15 Apr 2023 17:46:47 +0200 Subject: [PATCH 4/9] fix: add floor, distribution and owner count --- db/migrations/1681318561000-Data.js | 12 +++- schema.graphql | 7 +- src/mappings/index.ts | 67 +++++++++++++++++-- src/mappings/utils/entity.ts | 34 ++++++++++ src/mappings/utils/helper.ts | 2 +- src/model/generated/collectionEntity.model.ts | 19 ++++-- src/model/generated/nftEntity.model.ts | 3 + src/server-extension/resolvers/index.ts | 2 + 8 files changed, 128 insertions(+), 18 deletions(-) diff --git a/db/migrations/1681318561000-Data.js b/db/migrations/1681318561000-Data.js index e0cbb7e..ab46f07 100644 --- a/db/migrations/1681318561000-Data.js +++ b/db/migrations/1681318561000-Data.js @@ -2,12 +2,18 @@ module.exports = class Data1681318561000 { name = 'Data1681318561000' async up(db) { - await db.query(`ALTER TABLE "collection_entity" ADD "volume" numeric`) - await db.query(`ALTER TABLE "collection_entity" ADD "highest_sale_price" numeric`) + await db.query(`ALTER TABLE "collection_entity" ADD "distribution" integer NOT NULL DEFAULT '0'`) + await db.query(`ALTER TABLE "collection_entity" ADD "floor" numeric NOT NULL DEFAULT '0'`) + await db.query(`ALTER TABLE "collection_entity" ADD "highest_sale" numeric NOT NULL DEFAULT '0'`) + await db.query(`ALTER TABLE "collection_entity" ADD "owner_count" integer NOT NULL DEFAULT '0'`) + await db.query(`ALTER TABLE "collection_entity" ADD "volume" numeric NOT NULL DEFAULT '0'`) } async down(db) { + await db.query(`ALTER TABLE "collection_entity" DROP COLUMN "distribution"`) + await db.query(`ALTER TABLE "collection_entity" DROP COLUMN "floor"`) + await db.query(`ALTER TABLE "collection_entity" DROP COLUMN "highest_sale"`) + await db.query(`ALTER TABLE "collection_entity" DROP COLUMN "owner_count"`) await db.query(`ALTER TABLE "collection_entity" DROP COLUMN "volume"`) - await db.query(`ALTER TABLE "collection_entity" DROP COLUMN "highest_sale_price"`) } } diff --git a/schema.graphql b/schema.graphql index 8fa6aa1..f58d7cd 100644 --- a/schema.graphql +++ b/schema.graphql @@ -1,10 +1,13 @@ type CollectionEntity @entity { id: ID! blockNumber: BigInt + burned: Boolean! createdAt: DateTime! currentOwner: String! - burned: Boolean! + distribution: Int! events: [CollectionEvent!] @derivedFrom(field: "collection") + floor: BigInt! + highestSale: BigInt! image: String issuer: String! meta: MetadataEntity @@ -12,12 +15,12 @@ type CollectionEntity @entity { media: String name: String @index nfts: [NFTEntity!] @derivedFrom(field: "collection") + ownerCount: Int! updatedAt: DateTime! nftCount: Int! supply: Int! type: CollectionType! volume: BigInt! - highestSalePrice: BigInt! } type NFTEntity @entity { diff --git a/src/mappings/index.ts b/src/mappings/index.ts index fc20c95..75077cc 100644 --- a/src/mappings/index.ts +++ b/src/mappings/index.ts @@ -13,7 +13,9 @@ import { import { CollectionType } from '../model/generated/_collectionType'; import { Extrinsic } from '../processable'; import { plsBe, real, remintable } from './utils/consolidator'; -import { create, get, getOrCreate } from './utils/entity'; +import { + calculateCollectionOwnerCountAndDistribution, create, get, getOrCreate, +} from './utils/entity'; import { unwrap } from './utils/extract'; import { getAcceptOfferEvent, @@ -85,17 +87,19 @@ export async function handleCollectionCreate(context: Context): Promise { final.id = event.id; final.issuer = event.caller; - final.currentOwner = event.caller; final.blockNumber = BigInt(event.blockNumber); - final.metadata = ensureMetadataUri(event.metadata, type); final.burned = false; + final.currentOwner = event.caller; + final.distribution = 0; + final.floor = BigInt(0); + final.highestSale = BigInt(0); + final.metadata = ensureMetadataUri(event.metadata, type); final.createdAt = event.timestamp; final.updatedAt = event.timestamp; final.nftCount = 0; final.supply = 0; final.type = type; final.volume = BigInt(0); - final.highestSalePrice = BigInt(0); logger.debug(`metadata: ${final.metadata}`); @@ -156,6 +160,14 @@ export async function handleTokenCreate(context: Context): Promise { collection.nftCount += 1; collection.supply += 1; + const { ownerCount, distribution } = await calculateCollectionOwnerCountAndDistribution( + context.store, + final.id, + final.currentOwner, + ); + collection.ownerCount = ownerCount; + collection.distribution = distribution; + logger.debug(`metadata: ${final.metadata}`); if (final.metadata) { @@ -189,10 +201,24 @@ export async function handleTokenTransfer(context: Context): Promise { entity.currentOwner = event.to; entity.updatedAt = event.timestamp; + const collection = ensure( + await get(context.store, CE, event.collectionId), + ); + plsBe(real, collection); + const { ownerCount, distribution } = await calculateCollectionOwnerCountAndDistribution( + context.store, + entity.id, + event.to, + currentOwner, + ); + collection.ownerCount = ownerCount; + collection.distribution = distribution; + logger.success( `[SEND] ${id} from ${event.caller} to ${event.to}`, ); await context.store.save(entity); + await context.store.save(collection); await createEvent(entity, Interaction.SEND, event, event.to || '', context.store, currentOwner); await updateCache(event.timestamp, context.store); } @@ -214,6 +240,15 @@ export async function handleTokenBurn(context: Context): Promise { collection.updatedAt = event.timestamp; collection.supply -= 1; + const { ownerCount, distribution } = await calculateCollectionOwnerCountAndDistribution( + context.store, + entity.id, + undefined, + entity.currentOwner, + ); + collection.ownerCount = ownerCount; + collection.distribution = distribution; + await context.store.save(entity); await context.store.save(collection); const meta = entity.metadata ?? ''; @@ -230,8 +265,16 @@ export async function handleTokenList(context: Context): Promise { plsBe(real, entity); entity.price = event.price; + + const collection = ensure(await get(context.store, CE, event.collectionId)); + plsBe(real, collection); + if (event.price && event.price < collection.floor) { + collection.floor = event.price; + } + logger.success(`[LIST] ${id} by ${event.caller}} for ${String(event.price)}`); await context.store.save(entity); + await context.store.save(collection); const meta = String(event.price || ''); const interaction = event.price ? Interaction.LIST : Interaction.UNLIST; await createEvent(entity, interaction, event, meta, context.store); @@ -244,18 +287,28 @@ export async function handleTokenBuy(context: Context): Promise { const id = createTokenId(event.collectionId, event.sn); const entity = ensure(await get(context.store, NE, id)); plsBe(real, entity); + const { currentOwner } = entity; entity.price = BigInt(0); entity.currentOwner = event.caller; entity.updatedAt = event.timestamp; const collection = ensure(await get(context.store, CE, event.collectionId)); plsBe(real, collection); - collection.volume++; - if (event.price && collection.highestSalePrice < event.price) { - collection.highestSalePrice = event.price; + collection.volume += event.price || BigInt(0); + if (event.price && collection.highestSale < event.price) { + collection.highestSale = event.price; } collection.updatedAt = event.timestamp; + const { ownerCount, distribution } = await calculateCollectionOwnerCountAndDistribution( + context.store, + entity.id, + event.caller, + currentOwner, + ); + collection.ownerCount = ownerCount; + collection.distribution = distribution; + logger.success(`[BUY] ${id} by ${event.caller}`); await context.store.save(entity); await context.store.save(collection); diff --git a/src/mappings/utils/entity.ts b/src/mappings/utils/entity.ts index c880167..2141261 100644 --- a/src/mappings/utils/entity.ts +++ b/src/mappings/utils/entity.ts @@ -72,3 +72,37 @@ export function create( Object.assign(entity, init); return entity; } + +export async function calculateCollectionOwnerCountAndDistribution( + store: Store, + collectionId: string, + newOwner?: string, + originalOwner?: string, +): Promise<{ ownerCount: number; distribution: number }> { + const query = ` + SELECT COUNT(DISTINCT current_owner) AS distribution, + COUNT(current_owner) AS owner_count + ${ + newOwner + && ` + ,(SELECT max(CASE + WHEN current_owner = '${newOwner}' THEN 0 + ELSE 1 + END) + FROM nft_entity) AS adjustment + ` +} + FROM nft_entity + WHERE collection_id = '${collectionId}' + ${newOwner && `AND current_owner != '${originalOwner}'`} + `; + const queryResult: { owner_count: number; distribution: number; adjustment?: number }[] = await store.query(query); + const result = queryResult[0]; + + const adjustedResults = { + ownerCount: result.owner_count - (result.adjustment ?? 0), + distribution: result.distribution - (result.adjustment ?? 0), + }; + + return adjustedResults; +} diff --git a/src/mappings/utils/helper.ts b/src/mappings/utils/helper.ts index fcd3410..7dae605 100644 --- a/src/mappings/utils/helper.ts +++ b/src/mappings/utils/helper.ts @@ -1,7 +1,7 @@ import * as ss58 from '@subsquid/ss58'; import { decodeHex } from '@subsquid/substrate-processor'; import { Event } from '../../processable'; -import { Context, SomethingWithOptionalMeta } from './types'; +import { Context, SomethingWithOptionalMeta, Store } from './types'; export function isEmpty(obj: Record): boolean { // eslint-disable-next-line guard-for-in, @typescript-eslint/naming-convention diff --git a/src/model/generated/collectionEntity.model.ts b/src/model/generated/collectionEntity.model.ts index f0a2a15..ea73bd6 100644 --- a/src/model/generated/collectionEntity.model.ts +++ b/src/model/generated/collectionEntity.model.ts @@ -17,18 +17,27 @@ export class CollectionEntity { @Column_("numeric", {transformer: marshal.bigintTransformer, nullable: true}) blockNumber!: bigint | undefined | null + @Column_("bool", {nullable: false}) + burned!: boolean + @Column_("timestamp with time zone", {nullable: false}) createdAt!: Date @Column_("text", {nullable: false}) currentOwner!: string - @Column_("bool", {nullable: false}) - burned!: boolean + @Column_("int4", {nullable: false}) + distribution!: number @OneToMany_(() => CollectionEvent, e => e.collection) events!: CollectionEvent[] + @Column_("numeric", {transformer: marshal.bigintTransformer, nullable: false}) + floor!: bigint + + @Column_("numeric", {transformer: marshal.bigintTransformer, nullable: false}) + highestSale!: bigint + @Column_("text", {nullable: true}) image!: string | undefined | null @@ -52,6 +61,9 @@ export class CollectionEntity { @OneToMany_(() => NFTEntity, e => e.collection) nfts!: NFTEntity[] + @Column_("int4", {nullable: false}) + ownerCount!: number + @Column_("timestamp with time zone", {nullable: false}) updatedAt!: Date @@ -66,7 +78,4 @@ export class CollectionEntity { @Column_("numeric", {transformer: marshal.bigintTransformer, nullable: false}) volume!: bigint - - @Column_("numeric", {transformer: marshal.bigintTransformer, nullable: false}) - highestSalePrice!: bigint } diff --git a/src/model/generated/nftEntity.model.ts b/src/model/generated/nftEntity.model.ts index 9d876e1..1bc74a9 100644 --- a/src/model/generated/nftEntity.model.ts +++ b/src/model/generated/nftEntity.model.ts @@ -7,6 +7,9 @@ import {MetadataEntity} from "./metadataEntity.model" @Entity_() export class NFTEntity { + static createQueryBuilder(arg0: string) { + throw new Error('Method not implemented.') + } constructor(props?: Partial) { Object.assign(this, props) } diff --git a/src/server-extension/resolvers/index.ts b/src/server-extension/resolvers/index.ts index d2d3189..da61ac4 100644 --- a/src/server-extension/resolvers/index.ts +++ b/src/server-extension/resolvers/index.ts @@ -4,8 +4,10 @@ import { OfferStatsResolver } from './offerStatsResolver'; import { EventResolver } from './event'; import { SeriesResolver } from './series'; import { SpotlightResolver } from './spotlight'; +// import { CollectionResolver } from './collectionResolver'; export { + // CollectionResolver, CollectionEventResolver, WalletResolver, OfferStatsResolver, From b48e6ecad0960c46d8261311925fba845213c725 Mon Sep 17 00:00:00 2001 From: Alko89 Date: Sat, 15 Apr 2023 22:53:16 +0200 Subject: [PATCH 5/9] fix: don't update ownerCount and distribution on mint --- src/mappings/index.ts | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/mappings/index.ts b/src/mappings/index.ts index 75077cc..427ae13 100644 --- a/src/mappings/index.ts +++ b/src/mappings/index.ts @@ -159,15 +159,6 @@ export async function handleTokenCreate(context: Context): Promise { collection.updatedAt = event.timestamp; collection.nftCount += 1; collection.supply += 1; - - const { ownerCount, distribution } = await calculateCollectionOwnerCountAndDistribution( - context.store, - final.id, - final.currentOwner, - ); - collection.ownerCount = ownerCount; - collection.distribution = distribution; - logger.debug(`metadata: ${final.metadata}`); if (final.metadata) { From d0438054b26e2dff0d396dc3ae5c0ad060a5bcc4 Mon Sep 17 00:00:00 2001 From: Alko89 Date: Mon, 17 Apr 2023 17:49:34 +0200 Subject: [PATCH 6/9] fix: remove comment and shorten result query --- src/mappings/utils/entity.ts | 3 +-- src/server-extension/resolvers/index.ts | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/mappings/utils/entity.ts b/src/mappings/utils/entity.ts index 2141261..29ac126 100644 --- a/src/mappings/utils/entity.ts +++ b/src/mappings/utils/entity.ts @@ -96,8 +96,7 @@ export async function calculateCollectionOwnerCountAndDistribution( WHERE collection_id = '${collectionId}' ${newOwner && `AND current_owner != '${originalOwner}'`} `; - const queryResult: { owner_count: number; distribution: number; adjustment?: number }[] = await store.query(query); - const result = queryResult[0]; + const [result]: { owner_count: number; distribution: number; adjustment?: number }[] = await store.query(query); const adjustedResults = { ownerCount: result.owner_count - (result.adjustment ?? 0), diff --git a/src/server-extension/resolvers/index.ts b/src/server-extension/resolvers/index.ts index da61ac4..d2d3189 100644 --- a/src/server-extension/resolvers/index.ts +++ b/src/server-extension/resolvers/index.ts @@ -4,10 +4,8 @@ import { OfferStatsResolver } from './offerStatsResolver'; import { EventResolver } from './event'; import { SeriesResolver } from './series'; import { SpotlightResolver } from './spotlight'; -// import { CollectionResolver } from './collectionResolver'; export { - // CollectionResolver, CollectionEventResolver, WalletResolver, OfferStatsResolver, From fd8f80f91a16ca51129665298d0d9f8937430ee9 Mon Sep 17 00:00:00 2001 From: Viki Val Date: Tue, 18 Apr 2023 14:47:04 +0200 Subject: [PATCH 7/9] Apply suggestions from code review --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 213f9f7..8966030 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,3 @@ .DS_Store dump_*.sql -.env From e5f75301d0519c08822475903ef8c2925e2a72e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ale=C5=A1=20Ferlan?= Date: Thu, 20 Apr 2023 18:35:39 +0200 Subject: [PATCH 8/9] Update src/mappings/utils/entity.ts Co-authored-by: roiLeo --- src/mappings/utils/entity.ts | 41 +++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/src/mappings/utils/entity.ts b/src/mappings/utils/entity.ts index 29ac126..85aa795 100644 --- a/src/mappings/utils/entity.ts +++ b/src/mappings/utils/entity.ts @@ -79,23 +79,30 @@ export async function calculateCollectionOwnerCountAndDistribution( newOwner?: string, originalOwner?: string, ): Promise<{ ownerCount: number; distribution: number }> { - const query = ` - SELECT COUNT(DISTINCT current_owner) AS distribution, - COUNT(current_owner) AS owner_count - ${ - newOwner - && ` - ,(SELECT max(CASE - WHEN current_owner = '${newOwner}' THEN 0 - ELSE 1 - END) - FROM nft_entity) AS adjustment - ` -} - FROM nft_entity - WHERE collection_id = '${collectionId}' - ${newOwner && `AND current_owner != '${originalOwner}'`} - `; + let query; + if (newOwner && originalOwner) { + query = `SELECT + COUNT(DISTINCT current_owner) AS distribution, + COUNT(current_owner) AS owner_count, + ( + SELECT max( + CASE + WHEN current_owner = '${newOwner}' THEN 0 + ELSE 1 + END + ) + FROM nft_entity + ) AS adjustment + FROM nft_entity + WHERE collection_id = '${collectionId}' + AND current_owner != '${originalOwner}'`; + } + + query = `SELECT + COUNT(DISTINCT current_owner) AS distribution, + COUNT(current_owner) AS owner_count + FROM nft_entity + WHERE collection_id = '${collectionId}'`; const [result]: { owner_count: number; distribution: number; adjustment?: number }[] = await store.query(query); const adjustedResults = { From cec04109c31d27745e6f74e487140ef5f7949a3b Mon Sep 17 00:00:00 2001 From: Alko89 Date: Sun, 23 Apr 2023 13:04:12 +0200 Subject: [PATCH 9/9] fix: use correct id for query and fix floor --- src/mappings/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mappings/index.ts b/src/mappings/index.ts index 427ae13..29caa85 100644 --- a/src/mappings/index.ts +++ b/src/mappings/index.ts @@ -198,7 +198,7 @@ export async function handleTokenTransfer(context: Context): Promise { plsBe(real, collection); const { ownerCount, distribution } = await calculateCollectionOwnerCountAndDistribution( context.store, - entity.id, + event.collectionId, event.to, currentOwner, ); @@ -233,7 +233,7 @@ export async function handleTokenBurn(context: Context): Promise { const { ownerCount, distribution } = await calculateCollectionOwnerCountAndDistribution( context.store, - entity.id, + event.collectionId, undefined, entity.currentOwner, ); @@ -259,7 +259,7 @@ export async function handleTokenList(context: Context): Promise { const collection = ensure(await get(context.store, CE, event.collectionId)); plsBe(real, collection); - if (event.price && event.price < collection.floor) { + if (event.price && (collection.floor === 0n || event.price < collection.floor)) { collection.floor = event.price; } @@ -293,7 +293,7 @@ export async function handleTokenBuy(context: Context): Promise { const { ownerCount, distribution } = await calculateCollectionOwnerCountAndDistribution( context.store, - entity.id, + event.collectionId, event.caller, currentOwner, );