import { getModelForClass, index, modelOptions, prop } from '@typegoose/typegoose' import { dbconn } from 'decorators/dbconn' import { BaseModule } from '../Base' @dbconn('chain') @index({ chain: 1, address: 1, tokenId: 1 }, { unique: false }) @index({ chain: 1, address: 1, from: 1, to: 1 }, { unique: false }) @index({ chain: 1, hash: 1, logIndex: 1}, { unique: true }) @modelOptions({ schemaOptions: { collection: 'nft_transfer_event', timestamps: true }, }) export class NftTransferEventClass extends BaseModule { @prop({ required: true }) public address!: string @prop({ required: true }) public chain: string @prop({ required: true }) public logIndex: number @prop() public event: string @prop({ required: true }) public hash: string @prop() public blockNumber: number @prop() public blockHash: string @prop() public removed: boolean @prop() public from: string @prop() public to: string @prop() public tokenId: string @prop() public blockTime: number @prop({ default: 0 }) public version: number public static async saveEvent(event: any) { const tokenId = event.tokenId || event.value if (!tokenId) { return } const logIndex = parseInt(event.logIndex || '0') const from = event.from.toLowerCase() const to = event.to.toLowerCase() const hash = event.hash || event.transactionHash const data = { address: event.address.toLowerCase(), blockNumber: parseInt(event.blockNumber), removed: event.removed, from, to, tokenId, // blockTime: new Date(event.time).getTime(), $inc: { version: 1 }, } return NftTransferEvent.insertOrUpdate({ hash, logIndex, chain: event.chain }, data) } } export const NftTransferEvent = getModelForClass(NftTransferEventClass, { existingConnection: NftTransferEventClass['db'], })