From 557a79f1368f94bfb9d6da866a49bb46e0d8c231 Mon Sep 17 00:00:00 2001 From: Tuan Phan Anh <38557844+fibonacci998@users.noreply.github.com> Date: Fri, 16 Feb 2024 14:23:00 +0700 Subject: [PATCH] feat: create tx id column in smart contract event (main) (#651) TG-166 #waiting * feat: create tx_id column in smart_contract_event * fix: update query smart_contract_event join event only; remove knex.transaction * feat: add tx_id to smart_contract_event in hasura metadata --- .../tables/public_smart_contract_event.yaml | 5 ++- ...te_tx_id_column_in_smart_contract_event.ts | 45 +++++++++++++++++++ src/common/utils/smart_contract.ts | 2 +- src/models/smart_contract_event.ts | 3 ++ .../crawl_contract_event.service.ts | 2 + test/unit/services/cw20/cw20.spec.ts | 2 +- 6 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 migrations/20240110032646_create_tx_id_column_in_smart_contract_event.ts diff --git a/hasura/metadata/databases/xstaxy/tables/public_smart_contract_event.yaml b/hasura/metadata/databases/xstaxy/tables/public_smart_contract_event.yaml index 4fb8e1f15..fafadc802 100644 --- a/hasura/metadata/databases/xstaxy/tables/public_smart_contract_event.yaml +++ b/hasura/metadata/databases/xstaxy/tables/public_smart_contract_event.yaml @@ -47,12 +47,13 @@ select_permissions: - role: internal_service permission: columns: - - event_id - action + - created_at + - event_id - id - index - smart_contract_id - - created_at + - tx_id - updated_at filter: {} limit: 100 diff --git a/migrations/20240110032646_create_tx_id_column_in_smart_contract_event.ts b/migrations/20240110032646_create_tx_id_column_in_smart_contract_event.ts new file mode 100644 index 000000000..b4319cdcb --- /dev/null +++ b/migrations/20240110032646_create_tx_id_column_in_smart_contract_event.ts @@ -0,0 +1,45 @@ +import { Knex } from 'knex'; + +export async function up(knex: Knex): Promise { + console.log('create tx_id column in smart_contract_event'); + const chunkSizeQuery = 10000; + let startId = 0; + + await knex.schema.alterTable('smart_contract_event', (table) => { + table.integer('tx_id').index(); + }); + let done = false; + while (!done) { + console.log(`update tx_id column in smart_contract_event at id ${startId}`); + const smartContractEvents = await knex.raw( + `select smart_contract_event.id smart_contract_event_id, + event.tx_id transaction_id from smart_contract_event + join event on event.id = smart_contract_event.event_id + where smart_contract_event.id > ${startId} + order by smart_contract_event.id asc + limit ${chunkSizeQuery};` + ); + if (smartContractEvents.rows.length === 0) { + done = true; + break; + } + const stringListUpdates = smartContractEvents.rows + .map( + (update: any) => + `(${update.smart_contract_event_id}, ${update.transaction_id})` + ) + .join(','); + await knex.raw( + `UPDATE smart_contract_event SET tx_id = temp.tx_id from (VALUES ${stringListUpdates}) as temp(id, tx_id) where temp.id = smart_contract_event.id` + ); + startId = + smartContractEvents.rows[smartContractEvents.rows.length - 1] + .smart_contract_event_id; + } +} + +export async function down(knex: Knex): Promise { + await knex.schema.alterTable('smart_contract_event', (table) => { + table.dropColumn('tx_id'); + }); +} diff --git a/src/common/utils/smart_contract.ts b/src/common/utils/smart_contract.ts index 4dc2346f5..5d0ef1dcb 100644 --- a/src/common/utils/smart_contract.ts +++ b/src/common/utils/smart_contract.ts @@ -25,7 +25,7 @@ export async function getContractActivities( const contractActivities: IContractMsgInfo[] = []; const wasmEvents = await Event.query() .alias('event') - .withGraphFetched('[attributes(selectAttribute)]') + .withGraphFetched('[attributes(selectAttribute), transaction]') .modifiers({ selectAttribute(builder) { builder.select('event_id', 'index', 'key', 'value').orderBy([ diff --git a/src/models/smart_contract_event.ts b/src/models/smart_contract_event.ts index bdf66e80a..2d31db495 100644 --- a/src/models/smart_contract_event.ts +++ b/src/models/smart_contract_event.ts @@ -22,6 +22,8 @@ export class SmartContractEvent extends BaseModel { index!: number; + tx_id!: number; + static get tableName() { return 'smart_contract_event'; } @@ -33,6 +35,7 @@ export class SmartContractEvent extends BaseModel { smart_contract_id: { type: 'number' }, event_id: { type: 'number' }, index: { type: 'number' }, + tx_id: { type: 'number' }, }, }; } diff --git a/src/services/crawl-cosmwasm/crawl_contract_event.service.ts b/src/services/crawl-cosmwasm/crawl_contract_event.service.ts index 455d1001d..760941c21 100644 --- a/src/services/crawl-cosmwasm/crawl_contract_event.service.ts +++ b/src/services/crawl-cosmwasm/crawl_contract_event.service.ts @@ -78,6 +78,7 @@ export default class CrawlContractEventService extends BullableService { action: contractEvent.action, event_id: contractEvent.event_id, index: contractEvent.index, + tx_id: contractEvent.tx.id, }); const smartContractId = contractByAddress[contractEvent.contractAddress].id; @@ -88,6 +89,7 @@ export default class CrawlContractEventService extends BullableService { action: contractEvent.action, event_id: contractEvent.event_id, index: contractEvent.index, + tx_id: contractEvent.tx.id, }), attributes: contractEvent.attributes, }) diff --git a/test/unit/services/cw20/cw20.spec.ts b/test/unit/services/cw20/cw20.spec.ts index 53c55a0ec..7b0ed85d5 100644 --- a/test/unit/services/cw20/cw20.spec.ts +++ b/test/unit/services/cw20/cw20.spec.ts @@ -227,7 +227,7 @@ export default class Cw20 { this.cw20UpdateByContractService.getQueueManager().stopAll(); await this.broker.start(); await knex.raw( - 'TRUNCATE TABLE code, cw20_contract, block, transaction, smart_contract_event, block_checkpoint RESTART IDENTITY CASCADE' + 'TRUNCATE TABLE code, cw20_contract, block, transaction, event, event_attribute, smart_contract_event, block_checkpoint RESTART IDENTITY CASCADE' ); await Block.query().insert(this.block); await Transaction.query().insertGraph(this.txInsert);