diff --git a/indexer/packages/kafka/__tests__/batch-kafka-producer.test.ts b/indexer/packages/kafka/__tests__/batch-kafka-producer.test.ts index f62b28423b..4da777c134 100644 --- a/indexer/packages/kafka/__tests__/batch-kafka-producer.test.ts +++ b/indexer/packages/kafka/__tests__/batch-kafka-producer.test.ts @@ -1,16 +1,18 @@ import { KafkaTopics } from '../src'; import { BatchKafkaProducer, ProducerMessage } from '../src/batch-kafka-producer'; import { producer } from '../src/producer'; +import { IHeaders } from 'kafkajs'; import _ from 'lodash'; interface TestMessage { key?: string, value: string, + headers?: IHeaders, } function testMessage2ProducerMessage(data: TestMessage): ProducerMessage { const key: Buffer | undefined = data.key === undefined ? undefined : Buffer.from(data.key); - return { key, value: Buffer.from(data.value) }; + return { key, value: Buffer.from(data.value), headers: data.headers }; } function testMessage2ProducerMessages(data: TestMessage[]): ProducerMessage[] { @@ -35,9 +37,9 @@ describe('batch-kafka-producer', () => { [ 'will send key if key is not undefined', 5, - [{ key: '1', value: 'a' }, { key: '2', value: 'b' }, { key: '3', value: 'c' }], + [{ key: '1', value: 'a' }, { key: '2', value: 'b' }, { key: '3', value: 'c', headers: { timestamp: 'value' } }], [[{ key: '1', value: 'a' }, { key: '2', value: 'b' }]], - [{ key: '3', value: 'c' }], + [{ key: '3', value: 'c', headers: { timestamp: 'value' } }], ], [ 'will not send message until the batch size is reached', @@ -104,7 +106,9 @@ describe('batch-kafka-producer', () => { for (const msg of messages) { const key: Buffer | undefined = msg.key === undefined ? undefined : Buffer.from(msg.key); - batchProducer.addMessageAndMaybeFlush({ value: Buffer.from(msg.value), key }); + batchProducer.addMessageAndMaybeFlush( + { value: Buffer.from(msg.value), key, headers: msg.headers }, + ); } expect(producerSendMock.mock.calls).toHaveLength(expectedMessagesPerCall.length); diff --git a/indexer/packages/kafka/src/batch-kafka-producer.ts b/indexer/packages/kafka/src/batch-kafka-producer.ts index 6885e29ae9..0ae478680e 100644 --- a/indexer/packages/kafka/src/batch-kafka-producer.ts +++ b/indexer/packages/kafka/src/batch-kafka-producer.ts @@ -1,5 +1,5 @@ import { logger } from '@dydxprotocol-indexer/base'; -import { Producer, RecordMetadata } from 'kafkajs'; +import { IHeaders, Producer, RecordMetadata } from 'kafkajs'; import _ from 'lodash'; import { KafkaTopics } from './types'; @@ -10,6 +10,7 @@ import { KafkaTopics } from './types'; export type ProducerMessage = { key?: Buffer, value: Buffer, + headers?: IHeaders, }; /** @@ -52,7 +53,7 @@ export class BatchKafkaProducer { if (this.currentSize + msgBuffer.byteLength + keyByteLength > this.maxBatchSizeBytes) { this.sendBatch(); } - this.producerMessages.push({ key: message.key, value: msgBuffer }); + this.producerMessages.push({ key: message.key, value: msgBuffer, headers: message.headers }); this.currentSize += msgBuffer.byteLength; this.currentSize += keyByteLength; } diff --git a/indexer/services/bazooka/src/vulcan-helpers.ts b/indexer/services/bazooka/src/vulcan-helpers.ts index eacbaedb37..e76ed7cbb1 100644 --- a/indexer/services/bazooka/src/vulcan-helpers.ts +++ b/indexer/services/bazooka/src/vulcan-helpers.ts @@ -22,6 +22,7 @@ import { } from '@dydxprotocol-indexer/v4-protos'; import { Long } from '@dydxprotocol-indexer/v4-protos/build/codegen/helpers'; import Big from 'big.js'; +import { IHeaders } from 'kafkajs'; import _ from 'lodash'; import config from './config'; @@ -30,6 +31,7 @@ import { ZERO } from './constants'; interface VulcanMessage { key: Buffer, value: OffChainUpdateV1, + headers?: IHeaders, } type IndexerOrderIdMap = { [orderUuid: string]: IndexerOrderId }; @@ -129,6 +131,7 @@ export async function sendStatefulOrderMessages() { return { key: message.key, value: Buffer.from(Uint8Array.from(OffChainUpdateV1.encode(message.value).finish())), + headers: message.headers, }; }); diff --git a/indexer/services/ender/__tests__/handlers/stateful-order/conditional-order-triggered-handler.test.ts b/indexer/services/ender/__tests__/handlers/stateful-order/conditional-order-triggered-handler.test.ts index e9a02dc164..d01e01def6 100644 --- a/indexer/services/ender/__tests__/handlers/stateful-order/conditional-order-triggered-handler.test.ts +++ b/indexer/services/ender/__tests__/handlers/stateful-order/conditional-order-triggered-handler.test.ts @@ -143,6 +143,7 @@ describe('conditionalOrderTriggeredHandler', () => { producerSendMock, orderId: conditionalOrderId, offchainUpdate: expectedOffchainUpdate, + headers: { message_received_timestamp: kafkaMessage.timestamp, event_type: 'ConditionalOrderTriggered' }, }); }); diff --git a/indexer/services/ender/__tests__/handlers/stateful-order/stateful-order-placement-handler.test.ts b/indexer/services/ender/__tests__/handlers/stateful-order/stateful-order-placement-handler.test.ts index dd0ca482c4..52e0056dc4 100644 --- a/indexer/services/ender/__tests__/handlers/stateful-order/stateful-order-placement-handler.test.ts +++ b/indexer/services/ender/__tests__/handlers/stateful-order/stateful-order-placement-handler.test.ts @@ -180,6 +180,7 @@ describe('statefulOrderPlacementHandler', () => { producerSendMock, orderId: defaultOrder.orderId!, offchainUpdate: expectedOffchainUpdate, + headers: { message_received_timestamp: kafkaMessage.timestamp, event_type: 'StatefulOrderPlacement' }, }); }); diff --git a/indexer/services/ender/__tests__/handlers/stateful-order/stateful-order-removal-handler.test.ts b/indexer/services/ender/__tests__/handlers/stateful-order/stateful-order-removal-handler.test.ts index 68aa0b226b..353808dba0 100644 --- a/indexer/services/ender/__tests__/handlers/stateful-order/stateful-order-removal-handler.test.ts +++ b/indexer/services/ender/__tests__/handlers/stateful-order/stateful-order-removal-handler.test.ts @@ -21,7 +21,10 @@ import { DydxIndexerSubtypes } from '../../../src/lib/types'; import { defaultDateTime, defaultHeight, - defaultOrderId, defaultPreviousHeight, defaultTime, defaultTxHash, + defaultOrderId, + defaultPreviousHeight, + defaultTime, + defaultTxHash, } from '../../helpers/constants'; import { createKafkaMessageFromStatefulOrderEvent } from '../../helpers/kafka-helpers'; import { updateBlockCache } from '../../../src/caches/block-cache'; @@ -130,6 +133,7 @@ describe('statefulOrderRemovalHandler', () => { producerSendMock, orderId: defaultOrderId, offchainUpdate: expectedOffchainUpdate, + headers: { message_received_timestamp: kafkaMessage.timestamp, event_type: 'StatefulOrderRemoval' }, }); }); diff --git a/indexer/services/ender/__tests__/helpers/indexer-proto-helpers.ts b/indexer/services/ender/__tests__/helpers/indexer-proto-helpers.ts index 6dc900c143..c19b4424ec 100644 --- a/indexer/services/ender/__tests__/helpers/indexer-proto-helpers.ts +++ b/indexer/services/ender/__tests__/helpers/indexer-proto-helpers.ts @@ -51,7 +51,7 @@ import { PerpetualMarketCreateEventV1, DeleveragingEventV1, } from '@dydxprotocol-indexer/v4-protos'; -import { Message, ProducerRecord } from 'kafkajs'; +import { IHeaders, Message, ProducerRecord } from 'kafkajs'; import _ from 'lodash'; import { @@ -318,10 +318,12 @@ export function expectVulcanKafkaMessage({ producerSendMock, orderId, offchainUpdate, + headers, }: { producerSendMock: jest.SpyInstance, orderId: IndexerOrderId, offchainUpdate: OffChainUpdateV1, + headers?: IHeaders, }): void { expect(producerSendMock.mock.calls.length).toBeGreaterThanOrEqual(1); expect(producerSendMock.mock.calls[0].length).toBeGreaterThanOrEqual(1); @@ -339,7 +341,6 @@ export function expectVulcanKafkaMessage({ vulcanProducerRecord.messages, (message: Message): VulcanMessage => { expect(Buffer.isBuffer(message.value)); - const messageValueBinary: Uint8Array = new Uint8Array( // Can assume Buffer, since we check above that it is a buffer message.value as Buffer, @@ -348,6 +349,7 @@ export function expectVulcanKafkaMessage({ return { key: message.key as Buffer, value: OffChainUpdateV1.decode(messageValueBinary), + headers: message.headers, }; }, ); @@ -355,6 +357,7 @@ export function expectVulcanKafkaMessage({ expect(vulcanMessages).toContainEqual({ key: getOrderIdHash(orderId), value: offchainUpdate, + headers, }); } diff --git a/indexer/services/ender/__tests__/lib/block-processor.test.ts b/indexer/services/ender/__tests__/lib/block-processor.test.ts index d0ea660cdb..6f8c18a6f3 100644 --- a/indexer/services/ender/__tests__/lib/block-processor.test.ts +++ b/indexer/services/ender/__tests__/lib/block-processor.test.ts @@ -121,6 +121,7 @@ describe('block-processor', () => { const blockProcessor: BlockProcessor = new BlockProcessor( block, txId, + defaultDateTime.toString(), ); blockProcessor.batchedHandlers = batchedHandlers; blockProcessor.syncHandlers = syncHandlers; @@ -149,6 +150,7 @@ describe('block-processor', () => { const blockProcessor: BlockProcessor = new BlockProcessor( block, txId, + defaultDateTime.toString(), ); blockProcessor.batchedHandlers = batchedHandlers; blockProcessor.syncHandlers = syncHandlers; diff --git a/indexer/services/ender/src/handlers/handler.ts b/indexer/services/ender/src/handlers/handler.ts index 51362c9965..664a6f52c5 100644 --- a/indexer/services/ender/src/handlers/handler.ts +++ b/indexer/services/ender/src/handlers/handler.ts @@ -18,6 +18,7 @@ import { OffChainUpdateV1, SubaccountId, } from '@dydxprotocol-indexer/v4-protos'; +import { IHeaders } from 'kafkajs'; import { DateTime } from 'luxon'; import * as pg from 'pg'; @@ -33,6 +34,7 @@ export type HandlerInitializer = new ( indexerTendermintEvent: IndexerTendermintEvent, txId: number, event: EventMessage, + messageReceivedTimestamp?: string, ) => Handler; /** @@ -49,6 +51,7 @@ export abstract class Handler { blockEventIndex: number; event: T; abstract eventType: string; + messageReceivedTimestamp?: string; constructor( block: IndexerTendermintBlock, @@ -56,6 +59,7 @@ export abstract class Handler { indexerTendermintEvent: IndexerTendermintEvent, txId: number, event: T, + messageReceivedTimestamp?: string, ) { this.block = block; this.blockEventIndex = blockEventIndex; @@ -63,6 +67,7 @@ export abstract class Handler { this.timestamp = DateTime.fromJSDate(block.time!); this.txId = txId; this.event = event; + this.messageReceivedTimestamp = messageReceivedTimestamp; } /** @@ -178,6 +183,7 @@ export abstract class Handler { protected generateConsolidatedVulcanKafkaEvent( key: Buffer, offChainUpdate: OffChainUpdateV1, + headers?: IHeaders, ): ConsolidatedKafkaEvent { stats.increment(`${config.SERVICE_NAME}.create_vulcan_kafka_event`, 1); @@ -186,6 +192,7 @@ export abstract class Handler { message: { key, value: offChainUpdate, + headers, }, }; } diff --git a/indexer/services/ender/src/handlers/stateful-order/conditional-order-triggered-handler.ts b/indexer/services/ender/src/handlers/stateful-order/conditional-order-triggered-handler.ts index 0cab1392da..f6969c7f0f 100644 --- a/indexer/services/ender/src/handlers/stateful-order/conditional-order-triggered-handler.ts +++ b/indexer/services/ender/src/handlers/stateful-order/conditional-order-triggered-handler.ts @@ -54,6 +54,10 @@ export class ConditionalOrderTriggeredHandler extends this.generateConsolidatedVulcanKafkaEvent( getOrderIdHash(order.orderId!), offChainUpdate, + { + message_received_timestamp: this.messageReceivedTimestamp, + event_type: 'ConditionalOrderTriggered', + }, ), ]; } diff --git a/indexer/services/ender/src/handlers/stateful-order/stateful-order-placement-handler.ts b/indexer/services/ender/src/handlers/stateful-order/stateful-order-placement-handler.ts index a2ea67f578..31a5104123 100644 --- a/indexer/services/ender/src/handlers/stateful-order/stateful-order-placement-handler.ts +++ b/indexer/services/ender/src/handlers/stateful-order/stateful-order-placement-handler.ts @@ -54,6 +54,10 @@ export class StatefulOrderPlacementHandler extends kafakEvents.push(this.generateConsolidatedVulcanKafkaEvent( getOrderIdHash(order.orderId!), offChainUpdate, + { + message_received_timestamp: this.messageReceivedTimestamp, + event_type: 'StatefulOrderPlacement', + }, )); return kafakEvents; diff --git a/indexer/services/ender/src/handlers/stateful-order/stateful-order-removal-handler.ts b/indexer/services/ender/src/handlers/stateful-order/stateful-order-removal-handler.ts index 5a162c850a..02715d1021 100644 --- a/indexer/services/ender/src/handlers/stateful-order/stateful-order-removal-handler.ts +++ b/indexer/services/ender/src/handlers/stateful-order/stateful-order-removal-handler.ts @@ -42,6 +42,10 @@ export class StatefulOrderRemovalHandler extends this.generateConsolidatedVulcanKafkaEvent( getOrderIdHash(orderIdProto), offChainUpdate, + { + message_received_timestamp: this.messageReceivedTimestamp, + event_type: 'StatefulOrderRemoval', + }, ), ]; } diff --git a/indexer/services/ender/src/lib/block-processor.ts b/indexer/services/ender/src/lib/block-processor.ts index 655e85d6b2..5a6e4cb7e6 100644 --- a/indexer/services/ender/src/lib/block-processor.ts +++ b/indexer/services/ender/src/lib/block-processor.ts @@ -77,13 +77,16 @@ export class BlockProcessor { txId: number; batchedHandlers: BatchedHandlers; syncHandlers: SyncHandlers; + messageReceivedTimestamp: string; constructor( block: IndexerTendermintBlock, txId: number, + messageReceivedTimestamp: string, ) { this.block = block; this.txId = txId; + this.messageReceivedTimestamp = messageReceivedTimestamp; this.sqlBlock = { ...this.block, events: new Array(this.block.events.length), @@ -205,6 +208,7 @@ export class BlockProcessor { const handlers: Handler[] = validator.createHandlers( eventProto.indexerTendermintEvent, this.txId, + this.messageReceivedTimestamp, ); _.map(handlers, (handler: Handler) => { diff --git a/indexer/services/ender/src/lib/kafka-publisher.ts b/indexer/services/ender/src/lib/kafka-publisher.ts index e1d7b018f4..8be583c0cc 100644 --- a/indexer/services/ender/src/lib/kafka-publisher.ts +++ b/indexer/services/ender/src/lib/kafka-publisher.ts @@ -247,6 +247,7 @@ export class KafkaPublisher { return { key: message.key, value: Buffer.from(Uint8Array.from(OffChainUpdateV1.encode(message.value).finish())), + headers: message.headers, }; }), }); diff --git a/indexer/services/ender/src/lib/on-message.ts b/indexer/services/ender/src/lib/on-message.ts index 4187b6aead..99eec93054 100644 --- a/indexer/services/ender/src/lib/on-message.ts +++ b/indexer/services/ender/src/lib/on-message.ts @@ -83,6 +83,7 @@ export async function onMessage(message: KafkaMessage): Promise { const blockProcessor: BlockProcessor = new BlockProcessor( indexerTendermintBlock, txId, + message.timestamp, ); const kafkaPublisher: KafkaPublisher = await blockProcessor.process(); diff --git a/indexer/services/ender/src/lib/types.ts b/indexer/services/ender/src/lib/types.ts index b0c8857332..be228f14ce 100644 --- a/indexer/services/ender/src/lib/types.ts +++ b/indexer/services/ender/src/lib/types.ts @@ -33,6 +33,7 @@ import { DeleveragingEventV1, TradingRewardsEventV1, } from '@dydxprotocol-indexer/v4-protos'; +import { IHeaders } from 'kafkajs'; import Long from 'long'; // Type sourced from protocol: @@ -217,6 +218,7 @@ export interface AnnotatedSubaccountMessage extends SubaccountMessage { export interface VulcanMessage { key: Buffer, value: OffChainUpdateV1, + headers?: IHeaders, } export type ConsolidatedKafkaEvent = { diff --git a/indexer/services/ender/src/validators/asset-validator.ts b/indexer/services/ender/src/validators/asset-validator.ts index 0bf140e322..cf2186c0e6 100644 --- a/indexer/services/ender/src/validators/asset-validator.ts +++ b/indexer/services/ender/src/validators/asset-validator.ts @@ -10,6 +10,7 @@ export class AssetValidator extends Validator { public createHandlers( indexerTendermintEvent: IndexerTendermintEvent, txId: number, + _: string, ): Handler[] { const handler: Handler = new AssetCreationHandler( this.block, diff --git a/indexer/services/ender/src/validators/deleveraging-validator.ts b/indexer/services/ender/src/validators/deleveraging-validator.ts index 931e7e153c..6336f76310 100644 --- a/indexer/services/ender/src/validators/deleveraging-validator.ts +++ b/indexer/services/ender/src/validators/deleveraging-validator.ts @@ -38,6 +38,7 @@ export class DeleveragingValidator extends Validator { public createHandlers( indexerTendermintEvent: IndexerTendermintEvent, txId: number, + _: string, ): Handler[] { return [ new DeleveragingHandler( diff --git a/indexer/services/ender/src/validators/funding-validator.ts b/indexer/services/ender/src/validators/funding-validator.ts index 3de03e61e1..4e18df610a 100644 --- a/indexer/services/ender/src/validators/funding-validator.ts +++ b/indexer/services/ender/src/validators/funding-validator.ts @@ -42,6 +42,7 @@ export class FundingValidator extends Validator { public createHandlers( indexerTendermintEvent: IndexerTendermintEvent, txId: number, + _: string, ): Handler[] { const handler: Handler = new FundingHandler( this.block, diff --git a/indexer/services/ender/src/validators/liquidity-tier-validator.ts b/indexer/services/ender/src/validators/liquidity-tier-validator.ts index a41d53df71..33256bd425 100644 --- a/indexer/services/ender/src/validators/liquidity-tier-validator.ts +++ b/indexer/services/ender/src/validators/liquidity-tier-validator.ts @@ -34,6 +34,7 @@ export class LiquidityTierValidator extends Validator[] { const handler: Handler = new LiquidityTierHandler( this.block, diff --git a/indexer/services/ender/src/validators/market-validator.ts b/indexer/services/ender/src/validators/market-validator.ts index fef4dbd787..ff5218ad90 100644 --- a/indexer/services/ender/src/validators/market-validator.ts +++ b/indexer/services/ender/src/validators/market-validator.ts @@ -104,6 +104,7 @@ export class MarketValidator extends Validator { public createHandlers( indexerTendermintEvent: IndexerTendermintEvent, txId: number, + __: string, ): Handler[] { const Initializer: HandlerInitializer | undefined = this.getHandlerInitializer(); diff --git a/indexer/services/ender/src/validators/order-fill-validator.ts b/indexer/services/ender/src/validators/order-fill-validator.ts index d25eb6421d..c8a42b5bf7 100644 --- a/indexer/services/ender/src/validators/order-fill-validator.ts +++ b/indexer/services/ender/src/validators/order-fill-validator.ts @@ -93,6 +93,7 @@ export class OrderFillValidator extends Validator { public createHandlers( indexerTendermintEvent: IndexerTendermintEvent, txId: number, + __: string, ): Handler[] { const orderFillEventsWithLiquidity: OrderFillEventWithLiquidity[] = [ { diff --git a/indexer/services/ender/src/validators/perpetual-market-validator.ts b/indexer/services/ender/src/validators/perpetual-market-validator.ts index 93531c835b..b599aae739 100644 --- a/indexer/services/ender/src/validators/perpetual-market-validator.ts +++ b/indexer/services/ender/src/validators/perpetual-market-validator.ts @@ -38,6 +38,7 @@ export class PerpetualMarketValidator extends Validator[] { const handler: Handler = new PerpetualMarketCreationHandler( this.block, diff --git a/indexer/services/ender/src/validators/stateful-order-validator.ts b/indexer/services/ender/src/validators/stateful-order-validator.ts index 066b7fbb20..8507fb6ca7 100644 --- a/indexer/services/ender/src/validators/stateful-order-validator.ts +++ b/indexer/services/ender/src/validators/stateful-order-validator.ts @@ -211,6 +211,7 @@ export class StatefulOrderValidator extends Validator { public createHandlers( indexerTendermintEvent: IndexerTendermintEvent, txId: number, + messageReceivedTimestamp: string, ): Handler[] { const Initializer: HandlerInitializer | undefined = this.getHandlerInitializer(); @@ -227,6 +228,7 @@ export class StatefulOrderValidator extends Validator { indexerTendermintEvent, txId, this.event, + messageReceivedTimestamp, ); return [handler]; diff --git a/indexer/services/ender/src/validators/subaccount-update-validator.ts b/indexer/services/ender/src/validators/subaccount-update-validator.ts index a747a43716..df37b60c37 100644 --- a/indexer/services/ender/src/validators/subaccount-update-validator.ts +++ b/indexer/services/ender/src/validators/subaccount-update-validator.ts @@ -19,6 +19,7 @@ export class SubaccountUpdateValidator extends Validator[] { return [ new SubaccountUpdateHandler( diff --git a/indexer/services/ender/src/validators/trading-rewards-validator.ts b/indexer/services/ender/src/validators/trading-rewards-validator.ts index 96ce7b2433..fe51832c0f 100644 --- a/indexer/services/ender/src/validators/trading-rewards-validator.ts +++ b/indexer/services/ender/src/validators/trading-rewards-validator.ts @@ -36,6 +36,7 @@ export class TradingRewardsValidator extends Validator { public createHandlers( indexerTendermintEvent: IndexerTendermintEvent, txId: number, + __: string, ): Handler[] { return [ new TradingRewardsHandler( diff --git a/indexer/services/ender/src/validators/transfer-validator.ts b/indexer/services/ender/src/validators/transfer-validator.ts index 1529403579..330cab294e 100644 --- a/indexer/services/ender/src/validators/transfer-validator.ts +++ b/indexer/services/ender/src/validators/transfer-validator.ts @@ -46,6 +46,7 @@ export class TransferValidator extends Validator { public createHandlers( indexerTendermintEvent: IndexerTendermintEvent, txId: number, + _: string, ): Handler[] { return [ new TransferHandler( diff --git a/indexer/services/ender/src/validators/update-clob-pair-validator.ts b/indexer/services/ender/src/validators/update-clob-pair-validator.ts index 315075da3f..7c7761bb13 100644 --- a/indexer/services/ender/src/validators/update-clob-pair-validator.ts +++ b/indexer/services/ender/src/validators/update-clob-pair-validator.ts @@ -20,6 +20,7 @@ export class UpdateClobPairValidator extends Validator { public createHandlers( indexerTendermintEvent: IndexerTendermintEvent, txId: number, + _: string, ): Handler[] { const handler: Handler = new UpdateClobPairHandler( this.block, diff --git a/indexer/services/ender/src/validators/update-perpetual-validator.ts b/indexer/services/ender/src/validators/update-perpetual-validator.ts index b0511d7e48..25caf65123 100644 --- a/indexer/services/ender/src/validators/update-perpetual-validator.ts +++ b/indexer/services/ender/src/validators/update-perpetual-validator.ts @@ -18,6 +18,7 @@ export class UpdatePerpetualValidator extends Validator public createHandlers( indexerTendermintEvent: IndexerTendermintEvent, txId: number, + _: string, ): Handler[] { const handler: Handler = new UpdatePerpetualHandler( this.block, diff --git a/indexer/services/ender/src/validators/validator.ts b/indexer/services/ender/src/validators/validator.ts index 3db9fe9b5a..f9c0a53662 100644 --- a/indexer/services/ender/src/validators/validator.ts +++ b/indexer/services/ender/src/validators/validator.ts @@ -56,5 +56,6 @@ export abstract class Validator { public abstract createHandlers( indexerTendermintEvent: IndexerTendermintEvent, txId: number, + messageReceivedTimestamp: string, ): Handler[]; }