Skip to content

add ignore list table #229

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions common/db/dao.ts
Original file line number Diff line number Diff line change
@@ -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<Entity> {
private readonly _connection: Connection
Expand Down Expand Up @@ -96,3 +100,66 @@ export async function getEventRecordThenGreaterBlockNumber<Entity>(

return records
}

export async function insertIgnoreDevPropertyTransfer(
transaction: Transaction,
targetRecord: DevPropertyTransfer
): Promise<void> {
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<void> {
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.')
}
}
62 changes: 15 additions & 47 deletions common/lockup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<void> {
Expand All @@ -30,46 +30,9 @@ export abstract class LockupInfoCreator extends TimerBatchBase {
}
}

private async getLockupId(
con: Connection,
record: DevPropertyTransfer
): Promise<string> {
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<string[]> {
if (record.is_lockup) {
return [record.from_address, record.to_address]
}

return [record.to_address, record.from_address]
}

private async createCurrentLockupRecord(con: Connection): Promise<void> {
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(
Expand All @@ -94,18 +57,23 @@ export abstract class LockupInfoCreator extends TimerBatchBase {
const [
accountAddress,
propertyAddress,
] = await this.getAddressFromDevPropertyTransfer(record)
] = getWalletAddressAndPropertyAddress(record)
const oldCurrentLockup = await this.getOldRecord(
transaction.manager,
accountAddress,
propertyAddress
)
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
Expand Down
12 changes: 12 additions & 0 deletions common/utils.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { DevPropertyTransfer } from '../entities/dev-property-transfer'

export function getTargetRecordsSeparatedByBlockNumber<
T extends { block_number: number }
>(records: T[], maxCount: number): T[] {
Expand Down Expand Up @@ -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]
}
32 changes: 32 additions & 0 deletions entities/ignore-dev-property-transfer.ts
Original file line number Diff line number Diff line change
@@ -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
}
29 changes: 29 additions & 0 deletions local_test/db/docker/db/init/3_ignore-dev_property_transfer.sql
Original file line number Diff line number Diff line change
@@ -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';