diff --git a/common/db/dao.ts b/common/db/dao.ts index bd95e8d8..12af4c47 100644 --- a/common/db/dao.ts +++ b/common/db/dao.ts @@ -1,6 +1,10 @@ import { ObjectType, Connection, EntityManager } from 'typeorm' import { ProcessedBlockNumber } from '../../entities/processed-block-number' +import { DevPropertyTransfer } from '../../entities/dev-property-transfer' +import { IgnoreDevPropertyTransfer } from '../../entities/ignore-dev-property-transfer' +import { LockupLockedup } from '../../entities/lockup-lockedup' import { Transaction } from './common' +import { getWalletAddressAndPropertyAddress } from './../utils' export class EventTableAccessor { private readonly _connection: Connection @@ -96,3 +100,66 @@ export async function getEventRecordThenGreaterBlockNumber( return records } + +export async function insertIgnoreDevPropertyTransfer( + transaction: Transaction, + targetRecord: DevPropertyTransfer +): Promise { + const ignore = new IgnoreDevPropertyTransfer() + ignore.event_id = targetRecord.event_id + ignore.block_number = targetRecord.block_number + ignore.log_index = targetRecord.log_index + ignore.transaction_index = targetRecord.transaction_index + ignore.from_address = targetRecord.from_address + ignore.to_address = targetRecord.to_address + ignore.value = targetRecord.value + ignore.is_lockup = targetRecord.is_lockup + ignore.raw_data = targetRecord.raw_data + await transaction.save(ignore) +} + +export class LockedupEventId { + private readonly _con: Connection + private _lockupMinBlockNumber: number + + constructor(con: Connection) { + this._con = con + } + + public async prepare(): Promise { + this._lockupMinBlockNumber = await getMinBlockNumber( + this._con, + LockupLockedup + ) + } + + public async getLockedupEventId( + record: DevPropertyTransfer + ): Promise<[boolean, string]> { + if (record.block_number < this._lockupMinBlockNumber) { + return [false, 'dummy-lockup-id'] + } + + const repository = this._con.getRepository(LockupLockedup) + const [walletAddress, propertyAddress] = getWalletAddressAndPropertyAddress( + record + ) + + const findRecords = await repository.find({ + block_number: record.block_number, + transaction_index: record.transaction_index, + from_address: walletAddress, + property: propertyAddress, + token_value: record.value, + }) + if (findRecords.length === 1) { + return [false, findRecords[0].event_id] + } + + if (findRecords.length === 0) { + return [true, ''] + } + + throw new Error('lockuped_lock has many record.') + } +} diff --git a/common/lockup.ts b/common/lockup.ts index 755bfdfd..1bb745c4 100644 --- a/common/lockup.ts +++ b/common/lockup.ts @@ -8,13 +8,13 @@ import { getEventRecordThenGreaterBlockNumber, getProcessedBlockNumber, setProcessedBlockNumber, - getMinBlockNumber, + insertIgnoreDevPropertyTransfer, + LockedupEventId, } from './db/dao' -import { LockupLockedup } from '../entities/lockup-lockedup' import { DevPropertyTransfer } from '../entities/dev-property-transfer' import { AccountLockup } from '../entities/account-lockup' import { PropertyLockup } from '../entities/property-lockup' -import { EventSaverWarning } from './error' +import { getWalletAddressAndPropertyAddress } from './utils' export abstract class LockupInfoCreator extends TimerBatchBase { async innerExecute(): Promise { @@ -30,46 +30,9 @@ export abstract class LockupInfoCreator extends TimerBatchBase { } } - private async getLockupId( - con: Connection, - record: DevPropertyTransfer - ): Promise { - const repository = con.getRepository(LockupLockedup) - const [ - walletAddress, - propertyAddress, - ] = await this.getAddressFromDevPropertyTransfer(record) - - const findRecords = await repository.find({ - block_number: record.block_number, - transaction_index: record.transaction_index, - from_address: walletAddress, - property: propertyAddress, - token_value: record.value, - }) - if (findRecords.length === 1) { - return findRecords[0].event_id - } - - if (findRecords.length === 0) { - throw new EventSaverWarning('not found lockup_lockuped record.') - } - - throw new Error('get many lockup_lockuped record.') - } - - private async getAddressFromDevPropertyTransfer( - record: DevPropertyTransfer - ): Promise { - if (record.is_lockup) { - return [record.from_address, record.to_address] - } - - return [record.to_address, record.from_address] - } - private async createCurrentLockupRecord(con: Connection): Promise { - const lockupMinBlockNumber = await getMinBlockNumber(con, LockupLockedup) + const eventId = new LockedupEventId(con) + await eventId.prepare() const blockNumber = await getProcessedBlockNumber(con, this.getBatchName()) this.logging.infolog(`start block number:${blockNumber + 1}`) const records = await getEventRecordThenGreaterBlockNumber( @@ -94,7 +57,7 @@ export abstract class LockupInfoCreator extends TimerBatchBase { const [ accountAddress, propertyAddress, - ] = await this.getAddressFromDevPropertyTransfer(record) + ] = getWalletAddressAndPropertyAddress(record) const oldCurrentLockup = await this.getOldRecord( transaction.manager, accountAddress, @@ -102,10 +65,15 @@ export abstract class LockupInfoCreator extends TimerBatchBase { ) maxBlockNumber = Math.max(maxBlockNumber, record.block_number) if (record.is_lockup) { - const lockedupEventId = - record.block_number < lockupMinBlockNumber - ? 'dummy-lockup-id' - : await this.getLockupId(con, record) + const [ + isContinue, + lockedupEventId, + ] = await eventId.getLockedupEventId(record) + if (isContinue) { + await insertIgnoreDevPropertyTransfer(transaction, record) + continue + } + const oldValue = typeof oldCurrentLockup === 'undefined' ? 0 diff --git a/common/utils.ts b/common/utils.ts index d56f55d7..487fe17e 100644 --- a/common/utils.ts +++ b/common/utils.ts @@ -1,3 +1,5 @@ +import { DevPropertyTransfer } from '../entities/dev-property-transfer' + export function getTargetRecordsSeparatedByBlockNumber< T extends { block_number: number } >(records: T[], maxCount: number): T[] { @@ -28,3 +30,13 @@ export function getMaxBlockNumber(records: any[]): number { const maxBlockNumber = Math.max(...tmp) return maxBlockNumber } + +export function getWalletAddressAndPropertyAddress( + record: DevPropertyTransfer +): [string, string] { + if (record.is_lockup) { + return [record.from_address, record.to_address] + } + + return [record.to_address, record.from_address] +} diff --git a/entities/ignore-dev-property-transfer.ts b/entities/ignore-dev-property-transfer.ts new file mode 100644 index 00000000..7dbf243a --- /dev/null +++ b/entities/ignore-dev-property-transfer.ts @@ -0,0 +1,32 @@ +/* eslint-disable new-cap */ +import { Entity, PrimaryColumn, Column, BaseEntity } from 'typeorm' + +@Entity() +export class IgnoreDevPropertyTransfer extends BaseEntity { + @PrimaryColumn() + public event_id!: string + + @Column() + public block_number!: number + + @Column() + public log_index!: number + + @Column() + public transaction_index!: number + + @Column() + public from_address!: string + + @Column() + public to_address!: string + + @Column() + public value!: number + + @Column() + public is_lockup!: boolean + + @Column() + public raw_data!: string +} diff --git a/local_test/db/docker/db/init/9_property_factory_create.sql b/local_test/db/docker/db/init/10_property_factory_create.sql similarity index 100% rename from local_test/db/docker/db/init/9_property_factory_create.sql rename to local_test/db/docker/db/init/10_property_factory_create.sql diff --git a/local_test/db/docker/db/init/10_property_factory_change_author.sql b/local_test/db/docker/db/init/11_property_factory_change_author.sql similarity index 100% rename from local_test/db/docker/db/init/10_property_factory_change_author.sql rename to local_test/db/docker/db/init/11_property_factory_change_author.sql diff --git a/local_test/db/docker/db/init/11_property_authentication.sql b/local_test/db/docker/db/init/12_property_authentication.sql similarity index 100% rename from local_test/db/docker/db/init/11_property_authentication.sql rename to local_test/db/docker/db/init/12_property_authentication.sql diff --git a/local_test/db/docker/db/init/12_property_authentication_deleted.sql b/local_test/db/docker/db/init/13_property_authentication_deleted.sql similarity index 100% rename from local_test/db/docker/db/init/12_property_authentication_deleted.sql rename to local_test/db/docker/db/init/13_property_authentication_deleted.sql diff --git a/local_test/db/docker/db/init/13_property_meta.sql b/local_test/db/docker/db/init/14_property_meta.sql similarity index 100% rename from local_test/db/docker/db/init/13_property_meta.sql rename to local_test/db/docker/db/init/14_property_meta.sql diff --git a/local_test/db/docker/db/init/14_property_balance.sql b/local_test/db/docker/db/init/15_property_balance.sql similarity index 100% rename from local_test/db/docker/db/init/14_property_balance.sql rename to local_test/db/docker/db/init/15_property_balance.sql diff --git a/local_test/db/docker/db/init/15_withdraw_property_transfer.sql b/local_test/db/docker/db/init/16_withdraw_property_transfer.sql similarity index 100% rename from local_test/db/docker/db/init/15_withdraw_property_transfer.sql rename to local_test/db/docker/db/init/16_withdraw_property_transfer.sql diff --git a/local_test/db/docker/db/init/16_system.sql b/local_test/db/docker/db/init/17_system.sql similarity index 100% rename from local_test/db/docker/db/init/16_system.sql rename to local_test/db/docker/db/init/17_system.sql diff --git a/local_test/db/docker/db/init/3_ignore-dev_property_transfer.sql b/local_test/db/docker/db/init/3_ignore-dev_property_transfer.sql new file mode 100644 index 00000000..48b7317e --- /dev/null +++ b/local_test/db/docker/db/init/3_ignore-dev_property_transfer.sql @@ -0,0 +1,29 @@ +DROP TABLE IF EXISTS ignore_dev_property_transfer; + +CREATE TABLE ignore_dev_property_transfer( + event_id TEXT NOT NULL, + block_number INT NOT NULL, + log_index INT NOT NULL, + transaction_index INT NOT NULL, + from_address TEXT NOT NULL, + to_address TEXT NOT NULL, + value NUMERIC NOT NULL, + is_lockup BOOLEAN NOT NULL, + raw_data TEXT NOT NULL, + PRIMARY KEY(event_id) +); + +CREATE INDEX ON ignore_dev_property_transfer( + block_number +); + +COMMENT ON TABLE ignore_dev_property_transfer IS 'Ignore list of transfer events for dev tokens.'; +COMMENT ON COLUMN ignore_dev_property_transfer.event_id IS 'event id'; +COMMENT ON COLUMN ignore_dev_property_transfer.block_number IS 'event block number'; +COMMENT ON COLUMN ignore_dev_property_transfer.log_index IS 'event log index'; +COMMENT ON COLUMN ignore_dev_property_transfer.transaction_index IS 'event transaction index'; +COMMENT ON COLUMN ignore_dev_property_transfer.from_address IS 'from address'; +COMMENT ON COLUMN ignore_dev_property_transfer.to_address IS 'to address'; +COMMENT ON COLUMN ignore_dev_property_transfer.value IS 'value'; +COMMENT ON COLUMN ignore_dev_property_transfer.is_lockup IS 'if it is lockup trahsfer, true'; +COMMENT ON COLUMN ignore_dev_property_transfer.raw_data IS 'event raw data'; diff --git a/local_test/db/docker/db/init/3_account_lockup.sql b/local_test/db/docker/db/init/4_account_lockup.sql similarity index 100% rename from local_test/db/docker/db/init/3_account_lockup.sql rename to local_test/db/docker/db/init/4_account_lockup.sql diff --git a/local_test/db/docker/db/init/4_property_lockup.sql b/local_test/db/docker/db/init/5_property_lockup.sql similarity index 100% rename from local_test/db/docker/db/init/4_property_lockup.sql rename to local_test/db/docker/db/init/5_property_lockup.sql diff --git a/local_test/db/docker/db/init/5_lockup_lockedup.sql b/local_test/db/docker/db/init/6_lockup_lockedup.sql similarity index 100% rename from local_test/db/docker/db/init/5_lockup_lockedup.sql rename to local_test/db/docker/db/init/6_lockup_lockedup.sql diff --git a/local_test/db/docker/db/init/6_market_factory_create.sql b/local_test/db/docker/db/init/7_market_factory_create.sql similarity index 100% rename from local_test/db/docker/db/init/6_market_factory_create.sql rename to local_test/db/docker/db/init/7_market_factory_create.sql diff --git a/local_test/db/docker/db/init/7_metrics_factory_create.sql b/local_test/db/docker/db/init/8_metrics_factory_create.sql similarity index 100% rename from local_test/db/docker/db/init/7_metrics_factory_create.sql rename to local_test/db/docker/db/init/8_metrics_factory_create.sql diff --git a/local_test/db/docker/db/init/8_metrics_factory_destroy.sql b/local_test/db/docker/db/init/9_metrics_factory_destroy.sql similarity index 100% rename from local_test/db/docker/db/init/8_metrics_factory_destroy.sql rename to local_test/db/docker/db/init/9_metrics_factory_destroy.sql