From 1652bc05935839edc4fed0af01d420791f66b9c7 Mon Sep 17 00:00:00 2001 From: RDMStreet Date: Sat, 6 Apr 2024 01:46:44 +0800 Subject: [PATCH 1/7] Remove data index --- db/migrations/1712051797737-Data.js | 11 +++++++++++ schema.graphql | 2 +- src/model/generated/historyElement.model.ts | 1 - 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 db/migrations/1712051797737-Data.js diff --git a/db/migrations/1712051797737-Data.js b/db/migrations/1712051797737-Data.js new file mode 100644 index 0000000..28aa80c --- /dev/null +++ b/db/migrations/1712051797737-Data.js @@ -0,0 +1,11 @@ +module.exports = class Data1712051797737 { + name = 'Data1712051797737' + + async up(db) { + await db.query(`DROP INDEX "public"."IDX_1ba28b188c45fa806f1cb9c039"`) + } + + async down(db) { + await db.query(`CREATE INDEX "IDX_1ba28b188c45fa806f1cb9c039" ON "history_element" ("data") `) + } +} diff --git a/schema.graphql b/schema.graphql index 05df118..d4bfc24 100644 --- a/schema.graphql +++ b/schema.graphql @@ -114,7 +114,7 @@ type HistoryElement @entity { networkFee: String execution: ExecutionResult! timestamp: Int! @index - data: JSON @index + data: JSON dataTo: String @index dataFrom: String @index calls: [HistoryElementCall!]! @derivedFrom(field: "historyElement") diff --git a/src/model/generated/historyElement.model.ts b/src/model/generated/historyElement.model.ts index d72241b..6163adf 100644 --- a/src/model/generated/historyElement.model.ts +++ b/src/model/generated/historyElement.model.ts @@ -49,7 +49,6 @@ export class HistoryElement { @Column_("int4", {nullable: false}) timestamp!: number - @Index_() @Column_("jsonb", {nullable: true}) data!: unknown | undefined | null From d9ae50c73e63696daf00c7191f6689272205dde2 Mon Sep 17 00:00:00 2001 From: RDMStreet Date: Sat, 6 Apr 2024 01:49:19 +0800 Subject: [PATCH 2/7] Bridge --- src/consts.ts | 10 ++- src/handlers/events/bridge.ts | 163 ++++++++++++++++++++++++++++++++++ src/processor.ts | 14 +++ src/utils/history.ts | 2 +- 4 files changed, 187 insertions(+), 2 deletions(-) create mode 100644 src/handlers/events/bridge.ts diff --git a/src/consts.ts b/src/consts.ts index 3aa25b6..3b852b0 100644 --- a/src/consts.ts +++ b/src/consts.ts @@ -99,7 +99,15 @@ export const eventNames = [ 'OrderBook.LimitOrderCanceled', 'OrderBook.MarketOrderExecuted', 'OrderBook.LimitOrderConvertedToMarketOrder', - 'OrderBook.LimitOrderIsSplitIntoMarketOrderAndLimitOrder' + 'OrderBook.LimitOrderIsSplitIntoMarketOrderAndLimitOrder', + 'XcmPallet.Attempted', + 'SubstrateBridgeOutboundChannel.MessageAccepted', + 'SubstrateDispatch.MessageDispatched', + 'BridgeProxy.RequestStatusUpdate', + 'ParachainBridgeApp.Minted', + 'ParachainBridgeApp.Burned', + 'system.ExtrinsicSuccess', + 'system.ExtrinsicFailed' ] as const export const versionsWithStringAssetId = ['1', '1Stage', '1Test', '2', '2Stage', '2Test', '3', '3Stage', '3Test', '4', '4Stage', '4Test', '5', '5Stage', '5Test', '6', '6Stage', '6Test', '7', '7Stage', '7Test', '8', '8Stage', '8Test', '9', '9Stage', '9Test', '10', '10Stage', '10Test', '11', '11Stage', '11Test', '12', '12Stage', '12Test', '13', '13Stage', '13Test', '14', '14Stage', '14Test', '15', '15Stage', '15Test', '16', '16Stage', '16Test', '17', '17Stage', '17Test', '18', '18Stage', '18Test', '19', '19Stage', '19Test', '20', '20Stage', '20Test', '21', '21Stage', '21Test', '22', '22Stage', '22Test', '23', '23Stage', '23Test', '24', '24Stage', '24Test', '25', '25Stage', '25Test', '26', '26Stage', '26Test', '27', '27Stage', '27Test', '28', '28Stage', '28Test', '29', '29Stage', '29Test', '30', '30Stage', '30Test', '31', '31Stage', '31Test', '32', '32Stage', '32Test', '33', '33Stage', '33Test'] as const \ No newline at end of file diff --git a/src/handlers/events/bridge.ts b/src/handlers/events/bridge.ts new file mode 100644 index 0000000..b84ffa4 --- /dev/null +++ b/src/handlers/events/bridge.ts @@ -0,0 +1,163 @@ +import { BlockContext, Event } from '../../types' +import { getEventData } from '../../utils/entities' +import { events } from '../../types/generated/merged' +import { createEventHistoryElement } from '../../utils/history' +import { logStartProcessingEvent } from '../../utils/logs' + + +export async function xcmPalletAttemptedHandler( + ctx: BlockContext, + event: Event<'XcmPallet.Attempted'> +): Promise { + ctx.log.info('start indexing XcmPallet.Attempted') + await logStartProcessingEvent(ctx, event) + + // const type = events.xcmPallet.attempted + // const data = getEventData(ctx, type, event) +} + +export async function messageAcceptedHandler( + ctx: BlockContext, + event: Event<'SubstrateBridgeOutboundChannel.MessageAccepted'> +): Promise { + await logStartProcessingEvent(ctx, event) + + const type = events.substrateBridgeOutboundChannel.messageAccepted + const data = getEventData(ctx, type, event) + + const networkId = 'networkId' in data ? data.networkId : data[0] + const batchNonce = 'batchNonce' in data ? data.batchNonce.toString() : null + const messageNonce = 'messageNonce' in data ? data.messageNonce.toString() : null + + const historyData = { + networkId: networkId.__kind, + batchNonce, + messageNonce + } + + await createEventHistoryElement(ctx, event, undefined, historyData) +} + + + +export async function systemExtrinsicFailedHandler( + ctx: BlockContext, + event: Event<'system.ExtrinsicFailed'> +): Promise { + await logStartProcessingEvent(ctx, event) + + const type = events.system.extrinsicFailed + const data = getEventData(ctx, type, event) + + const dispatchError = 'dispatchError' in data ? data.dispatchError : data[0] + const dispatchInfo = 'dispatchInfo' in data ? data.dispatchInfo : data[1] + + const classInfo = dispatchInfo?.class + const paysFee = dispatchInfo?.paysFee + const weight = dispatchInfo?.weight + + const proofSize = typeof weight === 'object' ? weight.proofSize.toString() : null + const refTime = typeof weight === 'object' ? weight.refTime.toString() : null + + const historyData: Record = { + dispatchError, + classInfo, + paysFee, + proofSize, + refTime + } + + if (typeof weight !== 'object') historyData.weight = weight.toString() + + await createEventHistoryElement(ctx, event, undefined, historyData) +} + +export async function systemExtrinsicSuccessHandler( + ctx: BlockContext, + event: Event<'system.ExtrinsicSuccess'> +): Promise { + await logStartProcessingEvent(ctx, event) + + const type = events.system.extrinsicSuccess + const data = getEventData(ctx, type, event) + + const dispatchInfo = 'dispatchInfo' in data ? data.dispatchInfo : data + + const classInfo = dispatchInfo?.class + const paysFee = dispatchInfo?.paysFee + const weight = dispatchInfo?.weight + + const proofSize = typeof weight === 'object' ? weight.proofSize.toString() : null + const refTime = typeof weight === 'object' ? weight.refTime.toString() : null + + const historyData: Record = { + classInfo, + paysFee, + proofSize, + refTime + } + + if (typeof weight !== 'object') historyData.weight = weight.toString() + + await createEventHistoryElement(ctx, event, undefined, historyData) +} + +export async function messageDispatchedHandler( + ctx: BlockContext, + event: Event<'SubstrateDispatch.MessageDispatched'> +): Promise { + await logStartProcessingEvent(ctx, event) + + const type = events.substrateDispatch.messageDispatched + const data = getEventData(ctx, type, event) + + const messageId = data[0] + const result = data[1] + + const sender = 'sender' in messageId ? messageId.sender.value : null + const receiver = 'receiver' in messageId ? messageId.receiver.value : null + const batchNonce = 'batchNonce' in messageId ? messageId.batchNonce?.toString() ?? null : null + const messageNonce = 'messageNonce' in messageId ? messageId.messageNonce?.toString() : null + const direction = 'direction' in messageId ? messageId.direction?.toString() : null + + const historyData: Record = { + sender, + receiver, + batchNonce, + messageNonce, + result, + direction + } + + await createEventHistoryElement(ctx, event, undefined, historyData) +} + +export async function requestStatusUpdateHandler( + ctx: BlockContext, + event: Event<'BridgeProxy.RequestStatusUpdate'> +): Promise { + logStartProcessingEvent(ctx, event) + + // const type = events.bridgeProxy.requestStatusUpdate + // const data = getEventData(ctx, type, event) +} + +export async function mintedHandler( + ctx: BlockContext, + event: Event<'ParachainBridgeApp.Minted'> +): Promise { + await logStartProcessingEvent(ctx, event) + + // const type = events.parachainBridgeApp.minted + // const data = getEventData(ctx, type, event) +} + +export async function burnedHandler( + ctx: BlockContext, + event: Event<'ParachainBridgeApp.Burned'> +): Promise { + await logStartProcessingEvent(ctx, event) + + // const type = events.parachainBridgeApp.burned + // const data = getEventData(ctx, type, event) +} diff --git a/src/processor.ts b/src/processor.ts index d63090c..d9083cf 100644 --- a/src/processor.ts +++ b/src/processor.ts @@ -47,6 +47,14 @@ import { orderBookMarketOrderExecutedEventHandler, orderBookStatusChangedEventHandler } from './handlers/events/orderBook' +import { + xcmPalletAttemptedHandler, + messageAcceptedHandler, + messageDispatchedHandler, + requestStatusUpdateHandler, + mintedHandler, + burnedHandler +} from './handlers/events/bridge' import { orderBookCancelLimitOrderCallHandler } from './handlers/calls/orderBook/cancelLimitOrder' import { getSortedItems } from './utils/processor' import { bandRelayCallHandler } from './handlers/calls/band/relay' @@ -251,6 +259,12 @@ processor.run(new TypeormDatabase({ supportHotBlocks: true }), async (ctx) => { if (event.name === 'OrderBook.MarketOrderExecuted') await orderBookMarketOrderExecutedEventHandler(blockContext, event) if (event.name === 'OrderBook.LimitOrderConvertedToMarketOrder') await orderBookLimitOrderConvertedToMarketOrderEventHandler(blockContext, event) if (event.name === 'OrderBook.LimitOrderIsSplitIntoMarketOrderAndLimitOrder') await orderBookLimitOrderIsSplitIntoMarketOrderAndLimitOrderEventHandler(blockContext, event) + if (event.name === 'XcmPallet.Attempted') await xcmPalletAttemptedHandler(blockContext, event) + if (event.name === 'SubstrateBridgeOutboundChannel.MessageAccepted') await messageAcceptedHandler(blockContext, event) + if (event.name === 'SubstrateDispatch.MessageDispatched') await messageDispatchedHandler(blockContext, event) + if (event.name === 'BridgeProxy.RequestStatusUpdate') await requestStatusUpdateHandler(blockContext, event) + if (event.name === 'ParachainBridgeApp.Minted') await mintedHandler(blockContext, event) + if (event.name === 'ParachainBridgeApp.Burned') await burnedHandler(blockContext, event) } } } diff --git a/src/utils/history.ts b/src/utils/history.ts index 423a40a..91024e0 100644 --- a/src/utils/history.ts +++ b/src/utils/history.ts @@ -232,7 +232,7 @@ export const createCallHistoryElement = async ( export const createEventHistoryElement = async ( ctx: BlockContext, event: Event, - address: Address, + address?: Address, data?: {}, calls?: HistoryElementCall[] ) => { From d47b8e0f963a04d40d66b963f35a6116e2f33301 Mon Sep 17 00:00:00 2001 From: RDMStreet Date: Sat, 6 Apr 2024 01:52:03 +0800 Subject: [PATCH 3/7] Format fix --- src/handlers/events/bridge.ts | 38 +++++++++++++++++------------------ 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/handlers/events/bridge.ts b/src/handlers/events/bridge.ts index b84ffa4..73fdb0d 100644 --- a/src/handlers/events/bridge.ts +++ b/src/handlers/events/bridge.ts @@ -12,7 +12,7 @@ export async function xcmPalletAttemptedHandler( ctx.log.info('start indexing XcmPallet.Attempted') await logStartProcessingEvent(ctx, event) - // const type = events.xcmPallet.attempted + // const type = events.xcmPallet.attempted // const data = getEventData(ctx, type, event) } @@ -49,25 +49,25 @@ export async function systemExtrinsicFailedHandler( const type = events.system.extrinsicFailed const data = getEventData(ctx, type, event) - const dispatchError = 'dispatchError' in data ? data.dispatchError : data[0] - const dispatchInfo = 'dispatchInfo' in data ? data.dispatchInfo : data[1] + const dispatchError = 'dispatchError' in data ? data.dispatchError : data[0] + const dispatchInfo = 'dispatchInfo' in data ? data.dispatchInfo : data[1] - const classInfo = dispatchInfo?.class - const paysFee = dispatchInfo?.paysFee - const weight = dispatchInfo?.weight + const classInfo = dispatchInfo?.class + const paysFee = dispatchInfo?.paysFee + const weight = dispatchInfo?.weight - const proofSize = typeof weight === 'object' ? weight.proofSize.toString() : null - const refTime = typeof weight === 'object' ? weight.refTime.toString() : null + const proofSize = typeof weight === 'object' ? weight.proofSize.toString() : null + const refTime = typeof weight === 'object' ? weight.refTime.toString() : null - const historyData: Record = { - dispatchError, - classInfo, - paysFee, - proofSize, - refTime - } + const historyData: Record = { + dispatchError, + classInfo, + paysFee, + proofSize, + refTime + } - if (typeof weight !== 'object') historyData.weight = weight.toString() + if (typeof weight !== 'object') historyData.weight = weight.toString() await createEventHistoryElement(ctx, event, undefined, historyData) } @@ -138,7 +138,7 @@ export async function requestStatusUpdateHandler( ): Promise { logStartProcessingEvent(ctx, event) - // const type = events.bridgeProxy.requestStatusUpdate + // const type = events.bridgeProxy.requestStatusUpdate // const data = getEventData(ctx, type, event) } @@ -148,7 +148,7 @@ export async function mintedHandler( ): Promise { await logStartProcessingEvent(ctx, event) - // const type = events.parachainBridgeApp.minted + // const type = events.parachainBridgeApp.minted // const data = getEventData(ctx, type, event) } @@ -158,6 +158,6 @@ export async function burnedHandler( ): Promise { await logStartProcessingEvent(ctx, event) - // const type = events.parachainBridgeApp.burned + // const type = events.parachainBridgeApp.burned // const data = getEventData(ctx, type, event) } From 5596bc5ffcbfe68647cc094a5aa66fb41369f0e0 Mon Sep 17 00:00:00 2001 From: RDMStreet Date: Mon, 15 Apr 2024 16:47:20 +0700 Subject: [PATCH 4/7] Fix execution result --- src/utils/history.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/utils/history.ts b/src/utils/history.ts index 91024e0..f1938a9 100644 --- a/src/utils/history.ts +++ b/src/utils/history.ts @@ -172,6 +172,10 @@ export const createHistoryElement = async ( success, error, }) + } else { + historyElement.execution = new ExecutionResult({ + success: true, + }) } if (data) { From a106e7a5880167453f3a4485db7d2ace33cce3dd Mon Sep 17 00:00:00 2001 From: RDMStreet Date: Thu, 6 Jun 2024 16:50:01 +0300 Subject: [PATCH 5/7] Formatting fix --- src/processor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/processor.ts b/src/processor.ts index ed14ecf..bd16102 100644 --- a/src/processor.ts +++ b/src/processor.ts @@ -272,7 +272,7 @@ processor.run(new TypeormDatabase({ supportHotBlocks: false }), async (ctx) => { if (event.name === 'Kensetsu.DebtPayment') await vaultDebtPaymentEvent(blockContext, event) if (event.name === 'Kensetsu.Liquidated') await vaultLiquidatedEvent(blockContext, event) if (event.name === 'Kensetsu.CDPClosed') await vaultClosedEvent(blockContext, event) - if (event.name === 'XcmPallet.Attempted') await xcmPalletAttemptedHandler(blockContext, event) + if (event.name === 'XcmPallet.Attempted') await xcmPalletAttemptedHandler(blockContext, event) if (event.name === 'SubstrateBridgeOutboundChannel.MessageAccepted') await messageAcceptedHandler(blockContext, event) if (event.name === 'SubstrateDispatch.MessageDispatched') await messageDispatchedHandler(blockContext, event) if (event.name === 'BridgeProxy.RequestStatusUpdate') await requestStatusUpdateHandler(blockContext, event) From df857e90b1b7addfafe3a7689f2a5e727cd20f0c Mon Sep 17 00:00:00 2001 From: RDMStreet Date: Thu, 6 Jun 2024 16:50:34 +0300 Subject: [PATCH 6/7] Formatting fix 2 --- src/consts.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/consts.ts b/src/consts.ts index d4ddb88..3650001 100644 --- a/src/consts.ts +++ b/src/consts.ts @@ -112,7 +112,7 @@ export const eventNames = [ 'Kensetsu.DebtPayment', 'Kensetsu.Liquidated', 'Kensetsu.CDPClosed', - 'XcmPallet.Attempted', + 'XcmPallet.Attempted', 'SubstrateBridgeOutboundChannel.MessageAccepted', 'SubstrateDispatch.MessageDispatched', 'BridgeProxy.RequestStatusUpdate', From 4e528c41007560191d97f82c7924e8e5ba58fd3a Mon Sep 17 00:00:00 2001 From: RDMStreet Date: Tue, 18 Jun 2024 12:28:45 +0300 Subject: [PATCH 7/7] Remove duplicate migration --- db/migrations/1714035126926-Data.js | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 db/migrations/1714035126926-Data.js diff --git a/db/migrations/1714035126926-Data.js b/db/migrations/1714035126926-Data.js deleted file mode 100644 index a5d1999..0000000 --- a/db/migrations/1714035126926-Data.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = class Data1714035126926 { - name = 'Data1714035126926' - - async up(db) { - await db.query(`DROP INDEX "public"."IDX_1ba28b188c45fa806f1cb9c039"`) - } - - async down(db) { - await db.query(`CREATE INDEX "IDX_1ba28b188c45fa806f1cb9c039" ON "history_element" ("data") `) - } -}