task-svr/src/models/chain/NftTransferEvent.ts
2024-01-11 15:17:34 +08:00

67 lines
1.8 KiB
TypeScript

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'],
})