diff --git a/package.json b/package.json index f2a5fda..5b98ff5 100644 --- a/package.json +++ b/package.json @@ -61,8 +61,8 @@ "eslint": "^7.27.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^3.4.0", - "prettier": "^2.3.0", "node": "18.14.0", + "prettier": "^2.3.0", "ts-node": "^10.9.1", "ts-node-dev": "^2.0.0", "tsconfig-paths": "^3.9.0", diff --git a/src/models/FtHodler.ts b/src/models/FtHodler.ts new file mode 100644 index 0000000..6ddce41 --- /dev/null +++ b/src/models/FtHodler.ts @@ -0,0 +1,36 @@ +import { getModelForClass, DocumentType, index, modelOptions, prop } from '@typegoose/typegoose' +import { dbconn } from 'decorators/dbconn' +import { BaseModule } from './Base' + +@dbconn() +@index({ address: 1, chain: 1 }, { unique: false }) +@index({ chain: 1, address: 1, user: 1 }, { unique: true }) +@modelOptions({ + schemaOptions: { collection: 'ft_holder', timestamps: true }, +}) +export class FtHolderClass extends BaseModule { + @prop() + public chain: number + @prop({ required: true }) + public address!: string + @prop() + public user: string + @prop({ default: 18 }) + public decimals: number + @prop({ default: '0' }) + public amount: string + @prop({ default: 0 }) + public version: number + + public async incAmount(this: DocumentType, val: string) { + this.amount = (BigInt(this.amount) + BigInt(val)).toString() + } + + public async decAmount(this: DocumentType, val: string) { + this.amount = (BigInt(this.amount) - BigInt(val)).toString() + } +} + +export const FtHolder = getModelForClass(FtHolderClass, { + existingConnection: FtHolderClass['db'], +}) diff --git a/src/models/FtTransferEvent.ts b/src/models/FtTransferEvent.ts index b48c689..6eba408 100644 --- a/src/models/FtTransferEvent.ts +++ b/src/models/FtTransferEvent.ts @@ -1,6 +1,8 @@ import { getModelForClass, index, modelOptions, prop } from '@typegoose/typegoose' import { dbconn } from 'decorators/dbconn' import { BaseModule } from './Base' +import { FtHolder } from './FtHodler' +import { ZERO_ADDRESS } from 'common/Constants' @dbconn() @index({ address: 1, chain: 1 }, { unique: false }) @@ -37,6 +39,8 @@ export class FtTransferEventClass extends BaseModule { public eventId: string @prop() public blockTime: number + @prop({ default: 0 }) + public version: number public static async saveEvent(event: any) { const amount = event.returnValues?.value diff --git a/src/models/NftHolder.ts b/src/models/NftHolder.ts new file mode 100644 index 0000000..f488cb1 --- /dev/null +++ b/src/models/NftHolder.ts @@ -0,0 +1,29 @@ +import { getModelForClass, index, modelOptions, prop } from '@typegoose/typegoose' +import { dbconn } from 'decorators/dbconn' +import { BaseModule } from './Base' + +@dbconn() +@index({ chain: 1, address: 1 }, { unique: false }) +@index({ user: 1 }, { unique: false }) +@index({ chain: 1, address: 1, tokenId: 1 }, { unique: true }) +@modelOptions({ + schemaOptions: { collection: 'nft_holder', timestamps: true }, +}) +export class NftHolderClass extends BaseModule { + @prop() + public chain: number + @prop({ required: true }) + public address!: string + @prop() + public user: string + @prop() + public tokenId: string + @prop({ default: 0 }) + public version: number + @prop() + public lastTxHash: string +} + +export const NftHolder = getModelForClass(NftHolderClass, { + existingConnection: NftHolderClass['db'], +}) diff --git a/src/models/NftTransferEvent.ts b/src/models/NftTransferEvent.ts index 7d53c62..7841c56 100644 --- a/src/models/NftTransferEvent.ts +++ b/src/models/NftTransferEvent.ts @@ -1,6 +1,8 @@ import { getModelForClass, index, modelOptions, prop } from '@typegoose/typegoose' import { dbconn } from 'decorators/dbconn' import { BaseModule } from './Base' +import { NftHolder } from './NftHolder' +import { ZERO_ADDRESS } from 'common/Constants' @dbconn() @index({ address: 1, chain: 1 }, { unique: false }) @@ -65,7 +67,7 @@ export class NftTransferEventClass extends BaseModule { $inc: { version: 1 }, } - return NftTransferEvent.insertOrUpdate( + await NftTransferEvent.insertOrUpdate( { chain: event.chain, transactionHash: event.transactionHash || event.hash, @@ -76,6 +78,17 @@ export class NftTransferEventClass extends BaseModule { }, data, ) + if (from !== to) { + await NftHolder.insertOrUpdate( + { chain: event.chain, address, tokenId }, + { + user: to, + lastTxHash: event.transactionHash || event.hash, + $inc: { version: 1 }, + }, + ) + } + return true } } diff --git a/src/models/ScheduleConfirmEvent.ts b/src/models/ScheduleConfirmEvent.ts deleted file mode 100644 index e61d1e8..0000000 --- a/src/models/ScheduleConfirmEvent.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { getModelForClass, index, modelOptions, prop } from '@typegoose/typegoose' -import { dbconn } from 'decorators/dbconn' -import logger from 'logger/logger' -import { BaseModule } from './Base' - -@dbconn() -@index({ transactionHash: 1 }, { unique: true }) -@modelOptions({ - schemaOptions: { collection: 'schedule_confirm_event', timestamps: true }, -}) -export class ScheduleConfirmEventClass extends BaseModule { - @prop({ required: true }) - public address!: string - @prop() - public event: string - @prop({ required: true }) - public transactionHash: string - @prop() - public blockNumber: number - @prop() - public blockHash: string - @prop() - public removed: boolean - @prop() - public operater: string - @prop({ type: () => [String] }) - public scheduleIds: string[] - @prop() - public blockTime: number - @prop({ default: 0 }) - public version: number - - public static async saveEvent(event: any) { - logger.info(JSON.stringify(event)) - if (event.removed) { - return - } - - const data = { - address: event.address, - blockNumber: event.blockNumber, - removed: event.removed, - operater: event.returnValues.sender, - scheduleIds: event.returnValues.ids, - transactionHash: event.transactionHash, - blockTime: new Date(event.timestamp).getTime(), - $inc: { version: 1 }, - } - - let record = await ScheduleConfirmEvent.insertOrUpdate({ transactionHash: event.transactionHash }, data) - if (record.version === 1) { - logger.log('receive events: ' + JSON.stringify(record.scheduleIds)) - for (let id of record.scheduleIds) { - // await new TaskSvr().parseOneSchedule(id) - } - } - return record - } -} - -export const ScheduleConfirmEvent = getModelForClass(ScheduleConfirmEventClass, { - existingConnection: ScheduleConfirmEventClass['db'], -}) diff --git a/src/models/ScheduleExecutedEvent.ts b/src/models/ScheduleExecutedEvent.ts deleted file mode 100644 index 71b2105..0000000 --- a/src/models/ScheduleExecutedEvent.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { getModelForClass, index, modelOptions, prop } from '@typegoose/typegoose' -import { dbconn } from 'decorators/dbconn' -import { BaseModule } from './Base' - -@dbconn() -@index({ transactionHash: 1, scheduleId: 1 }, { unique: true }) -@modelOptions({ - schemaOptions: { collection: 'schedule_executed_event', timestamps: true }, -}) -export class ScheduleExecutedEventClass extends BaseModule { - @prop({ required: true }) - public address!: string - @prop() - public event: string - @prop({ required: true }) - public transactionHash: string - @prop() - public blockNumber: number - @prop() - public blockHash: string - @prop() - public removed: boolean - @prop() - public operater: string - @prop() - public scheduleId: string - @prop() - public blockTime: number - @prop({ default: 0 }) - public version: number - - public static async saveEvent(event: any) { - if (event.removed) { - return - } - - const data = { - address: event.address, - blockNumber: event.blockNumber, - removed: event.removed, - operater: event.returnValues.sender, - transactionHash: event.transactionHash, - blockTime: new Date(event.timestamp).getTime(), - $inc: { version: 1 }, - } - - let record = await ScheduleExecutedEvent.insertOrUpdate( - { transactionHash: event.transactionHash, scheduleId: event.returnValues.id }, - data, - ) - if (record.version === 1) { - } - return record - } -} - -export const ScheduleExecutedEvent = getModelForClass(ScheduleExecutedEventClass, { - existingConnection: ScheduleExecutedEventClass['db'], -}) diff --git a/src/models/ScheduledAddedEvent.ts b/src/models/ScheduledAddedEvent.ts deleted file mode 100644 index bb684a3..0000000 --- a/src/models/ScheduledAddedEvent.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { getModelForClass, index, modelOptions, prop } from '@typegoose/typegoose' -import { dbconn } from 'decorators/dbconn' -import { BaseModule } from './Base' - -@dbconn() -@index({ transactionHash: 1, scheduleId: 1 }, { unique: true }) -@modelOptions({ - schemaOptions: { collection: 'schedule_added_event', timestamps: true }, -}) -export class ScheduledAddedEventClass extends BaseModule { - @prop({ required: true }) - public address!: string - @prop() - public event: string - @prop({ required: true }) - public transactionHash: string - @prop() - public blockNumber: number - @prop() - public blockHash: string - @prop() - public removed: boolean - @prop() - public operater: string - @prop() - public scheduleId: string - @prop() - public blockTime: number - @prop({ default: 0 }) - public version: number - - public static async saveEvent(event: any) { - if (event.removed) { - return - } - - const data = { - address: event.address, - blockNumber: event.blockNumber, - removed: event.removed, - operater: event.returnValues.sender, - transactionHash: event.transactionHash, - blockTime: new Date(event.timestamp).getTime(), - $inc: { version: 1 }, - } - - return ScheduledAddedEvent.insertOrUpdate( - { transactionHash: event.transactionHash, scheduleId: event.returnValues.id }, - data, - ) - } -} - -export const ScheduledAddedEvent = getModelForClass(ScheduledAddedEventClass, { - existingConnection: ScheduledAddedEventClass['db'], -}) diff --git a/src/schema/index.ts b/src/schema/index.ts index 78e86d4..c8232b9 100644 --- a/src/schema/index.ts +++ b/src/schema/index.ts @@ -1,10 +1,9 @@ import { RequestTask } from 'models/RequestTask' const graphql = require('graphql') -import { BlockChain } from 'chain/BlockChain' import { getFirstToken } from 'service/chain.service' -const { GraphQLSchema, GraphQLObjectType, GraphQLString, GraphQLInt, GraphQLID, GraphQLList, GraphQLNonNull } = graphql +const { GraphQLSchema, GraphQLObjectType, GraphQLString, GraphQLList } = graphql const nftType = new GraphQLObjectType({ name: 'erc721', diff --git a/tsconfig.json b/tsconfig.json index e356cb9..dfab623 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,14 +9,14 @@ "module": "commonjs", "esModuleInterop": true, "resolveJsonModule": true, - "target": "es2019", + "target": "es2020", "moduleResolution": "node", "sourceMap": true, "outDir": "./dist", "baseUrl": "./src", "rootDir": "./src" }, - "lib": ["es2019"], + "lib": ["es2020"], "include": [ "src/**/*.ts", "typings/extend.d.ts"