From 2b4dede97db83f453a03cf4a7df6e4a32cf49e23 Mon Sep 17 00:00:00 2001 From: CounterFire2023 <136581895+CounterFire2023@users.noreply.github.com> Date: Fri, 30 Jun 2023 15:37:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=80=9A=E7=94=A8=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/models/UniversalEvent.ts | 83 ++++++++++++++++++++++++++++++++++++ src/monitor.ts | 2 + 2 files changed, 85 insertions(+) create mode 100644 src/models/UniversalEvent.ts diff --git a/src/models/UniversalEvent.ts b/src/models/UniversalEvent.ts new file mode 100644 index 0000000..40fa8a4 --- /dev/null +++ b/src/models/UniversalEvent.ts @@ -0,0 +1,83 @@ +import { Severity, getModelForClass, index, mongoose, modelOptions, prop } from '@typegoose/typegoose' +import { dbconn } from 'decorators/dbconn' +import { BaseModule } from './Base' +import logger from 'logger/logger' +import { sha1 } from 'utils/security.util' + +// 通用的事件存储表 +@dbconn() +@index({ address: 1, chain: 1 }, { unique: false }) +@index({ chain: 1, transactionHash: 1, event: 1, address: 1, eventHash: 1 }, { unique: true }) +@modelOptions({ + schemaOptions: { collection: 'universal_event', timestamps: true }, + options: { allowMixed: Severity.ALLOW }, +}) +export class UniversalEventClass extends BaseModule { + @prop() + public chain: number + @prop({ required: true }) + public address!: string + @prop() + public event: string + @prop({ required: true }) + public transactionHash: string + // 自己计算的, 用于区分批处理的不同的事件 + @prop({ required: true }) + public eventHash: string + + @prop() + public transactionIndex: number + @prop() + public logIndex: number + @prop() + public blockNumber: number + @prop() + public blockHash: string + @prop() + public removed: boolean + @prop() + public eventId: string + @prop() + public blockTime: number + @prop({ type: mongoose.Schema.Types.Mixed }) + public originData: any + @prop({ default: 0 }) + public version: number + + public static async saveEvent(event: any) { + const address = (event.address || event.tokenAddress).toLowerCase() + const transactionHash = event.transactionHash || event.hash + const blockNumber = event.blockHeight || event.blockNumber + const eventHash = sha1(JSON.stringify(event)) + const data = { + chain: event.chain, + address, + blockNumber, + blockHash: event.blockHash, + removed: event.removed, + event: event.event, + transactionHash, + transactionIndex: event.transactionIndex, + eventId: event.id, + logIndex: event.logIndex, + blockTime: event.timestamp, + originData: event, + $inc: { version: 1 }, + } + //chain: 1, transactionHash: 1, event: 1, address: 1, eventHash: 1 + return UniversalEvent.insertOrUpdate( + { + chain: event.chain, + transactionHash, + event: event.event, + address, + eventHash, + }, + data, + ) + } +} + +export const UniversalEvent = getModelForClass(UniversalEventClass, { + existingConnection: UniversalEventClass['db'], +}) diff --git a/src/monitor.ts b/src/monitor.ts index 8814e52..f831a33 100644 --- a/src/monitor.ts +++ b/src/monitor.ts @@ -6,6 +6,7 @@ dotenv.config({ path: envFile }) import { EventSyncSvr } from 'service/event.sync.service' import { NftTransferEvent } from 'models/NftTransferEvent' import { FtTransferEvent } from 'models/FtTransferEvent' +import { UniversalEvent } from 'models/UniversalEvent' import 'common/Extend' @@ -15,6 +16,7 @@ let lock = false let eventProcessers = { NftTransferEvent: NftTransferEvent, FtTransferEvent: FtTransferEvent, + UniversalEvent: UniversalEvent, } const events = require('config/events.json')