67 lines
1.8 KiB
TypeScript
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'],
|
|
})
|