diff --git a/blockchain-watcher/src/domain/actions/evm/HandleEvmLogs.ts b/blockchain-watcher/src/domain/actions/evm/HandleEvmLogs.ts index 6dce6404..f340527d 100644 --- a/blockchain-watcher/src/domain/actions/evm/HandleEvmLogs.ts +++ b/blockchain-watcher/src/domain/actions/evm/HandleEvmLogs.ts @@ -9,13 +9,13 @@ import { ethers } from "ethers"; export class HandleEvmLogs { cfg: HandleEvmConfig; mapper: (log: EvmLog, parsedArgs: ReadonlyArray) => T; - target: (parsed: T[]) => Promise; + target: (parsed: T[], chain: string) => Promise; statsRepo: StatRepository; constructor( cfg: HandleEvmConfig, mapper: (log: EvmLog, args: ReadonlyArray) => T, - target: (parsed: T[]) => Promise, + target: (parsed: T[], chain: string) => Promise, statsRepo: StatRepository ) { this.cfg = this.normalizeCfg(cfg); @@ -39,7 +39,7 @@ export class HandleEvmLogs { return logMap; }); - await this.target(mappedItems); + await this.target(mappedItems, this.cfg.chain); // TODO: return a result specifying failures if any return mappedItems; } diff --git a/blockchain-watcher/src/domain/actions/evm/HandleEvmTransactions.ts b/blockchain-watcher/src/domain/actions/evm/HandleEvmTransactions.ts index 988515bd..ff35d7e1 100644 --- a/blockchain-watcher/src/domain/actions/evm/HandleEvmTransactions.ts +++ b/blockchain-watcher/src/domain/actions/evm/HandleEvmTransactions.ts @@ -9,13 +9,13 @@ import { StatRepository } from "../../repositories"; export class HandleEvmTransactions { cfg: HandleEvmConfig; mapper: (log: EvmTransaction) => T; - target: (parsed: T[]) => Promise; + target: (parsed: T[], chain: string) => Promise; statsRepo: StatRepository; constructor( cfg: HandleEvmConfig, mapper: (log: EvmTransaction) => T, - target: (parsed: T[]) => Promise, + target: (parsed: T[], chain: string) => Promise, statsRepo: StatRepository ) { this.cfg = this.normalizeCfg(cfg); @@ -36,7 +36,7 @@ export class HandleEvmTransactions { } }) as T[]; - await this.target(filterItems); + await this.target(filterItems, this.cfg.chain); return filterItems; } diff --git a/blockchain-watcher/src/domain/actions/solana/HandleSolanaTransactions.ts b/blockchain-watcher/src/domain/actions/solana/HandleSolanaTransactions.ts index a7f4bf37..e4fd1ef2 100644 --- a/blockchain-watcher/src/domain/actions/solana/HandleSolanaTransactions.ts +++ b/blockchain-watcher/src/domain/actions/solana/HandleSolanaTransactions.ts @@ -8,14 +8,14 @@ import winston from "winston"; export class HandleSolanaTransactions { cfg: HandleSolanaTxConfig; mapper: (txs: solana.Transaction, args: { programId: string }) => Promise; - target?: (parsed: T[]) => Promise; + target?: (parsed: T[], chain: string) => Promise; logger: winston.Logger = winston.child({ module: "HandleSolanaTransaction" }); statsRepo?: StatRepository; constructor( cfg: HandleSolanaTxConfig, mapper: (tx: solana.Transaction) => Promise, - target?: (parsed: T[]) => Promise, + target?: (parsed: T[], chain: string) => Promise, statsRepo?: StatRepository ) { this.cfg = cfg; @@ -46,7 +46,7 @@ export class HandleSolanaTransactions { } if (this.target) { - await this.target(mappedItems); + await this.target(mappedItems, this.cfg.chain); } else { this.logger.warn(`No target for ${this.cfg.programId} txs`); } diff --git a/blockchain-watcher/src/domain/actions/sui/HandleSuiTransactions.ts b/blockchain-watcher/src/domain/actions/sui/HandleSuiTransactions.ts index fdc7dd68..ac805660 100644 --- a/blockchain-watcher/src/domain/actions/sui/HandleSuiTransactions.ts +++ b/blockchain-watcher/src/domain/actions/sui/HandleSuiTransactions.ts @@ -2,11 +2,14 @@ import { TransactionFoundEvent } from "../../entities"; import { SuiTransactionBlockReceipt } from "../../entities/sui"; import { StatRepository } from "../../repositories"; +const COMMITMENT = "immediate"; +const SUI_CHAIN = "sui"; + export class HandleSuiTransactions { constructor( private readonly cfg: HandleSuiTransactionsOptions, private readonly mapper: (tx: SuiTransactionBlockReceipt) => TransactionFoundEvent, - private readonly target: (parsed: TransactionFoundEvent[]) => Promise, + private readonly target: (parsed: TransactionFoundEvent[], chain: string) => Promise, private readonly statsRepo: StatRepository ) {} @@ -21,7 +24,7 @@ export class HandleSuiTransactions { } } - await this.target(items); + await this.target(items, SUI_CHAIN); return items; } @@ -37,8 +40,8 @@ export class HandleSuiTransactions { const labels = { job: this.cfg.id, - chain: "sui", - commitment: "immediate", + chain: SUI_CHAIN, + commitment: COMMITMENT, }; this.statsRepo.count(this.cfg.metricName, labels); } diff --git a/blockchain-watcher/src/infrastructure/repositories/SnsEventRepository.ts b/blockchain-watcher/src/infrastructure/repositories/SnsEventRepository.ts index b6186db6..31d4ce0c 100644 --- a/blockchain-watcher/src/infrastructure/repositories/SnsEventRepository.ts +++ b/blockchain-watcher/src/infrastructure/repositories/SnsEventRepository.ts @@ -22,9 +22,9 @@ export class SnsEventRepository { this.logger.info(`Created for topic ${cfg.topicArn}`); } - async publish(events: LogFoundEvent[]): Promise { + async publish(events: LogFoundEvent[], chain: string): Promise { if (!events.length) { - this.logger.debug("[publish] No events to publish, continuing..."); + this.logger.debug(`[publish][${chain}] No events to publish, continuing...`); return { status: "success", }; @@ -63,7 +63,7 @@ export class SnsEventRepository { for (const result of results) { if (result.status !== "fulfilled") { - this.logger.error(`[publish] ${result.reason}`); + this.logger.error(`[publish][${chain}] ${result.reason}`); errors.push(result.reason); } } @@ -82,18 +82,18 @@ export class SnsEventRepository { }; } - this.logger.info(`[publish] Published ${events.length} events to SNS`); + this.logger.info(`[publish][${chain}] Published ${events.length} events to SNS`); return { status: "success", }; } - async asTarget(): Promise<(events: LogFoundEvent[]) => Promise> { - return async (events: LogFoundEvent[]) => { - const result = await this.publish(events); + async asTarget(): Promise<(events: LogFoundEvent[], chain: string) => Promise> { + return async (events: LogFoundEvent[], chain: string) => { + const result = await this.publish(events, chain); if (result.status === "error") { this.logger.error( - `[asTarget] Error publishing events to SNS: ${result.reason ?? result.reasons}` + `[asTarget][${chain}] Error publishing events to SNS: ${result.reason ?? result.reasons}` ); throw new Error(`Error publishing events to SNS: ${result.reason}`); } diff --git a/blockchain-watcher/src/infrastructure/repositories/StaticJobRepository.ts b/blockchain-watcher/src/infrastructure/repositories/StaticJobRepository.ts index 9c59a0ba..4603e58e 100644 --- a/blockchain-watcher/src/infrastructure/repositories/StaticJobRepository.ts +++ b/blockchain-watcher/src/infrastructure/repositories/StaticJobRepository.ts @@ -41,7 +41,8 @@ export class StaticJobRepository implements JobRepository { private handlers: Map Promise> = new Map(); private mappers: Map = new Map(); - private targets: Map Promise<(items: any[]) => Promise>> = new Map(); + private targets: Map Promise<(items: any[], chain: string) => Promise>> = + new Map(); private blockRepoProvider: (chain: string) => EvmBlockRepository; private metadataRepo: MetadataRepository; private statsRepo: StatRepository; @@ -209,7 +210,7 @@ export class StaticJobRepository implements JobRepository { this.handlers.set("HandleSuiTransactions", handleSuiTx); } - private async getTarget(target: string): Promise<(items: any[]) => Promise> { + private async getTarget(target: string): Promise<(items: any[], chain: string) => Promise> { const maybeTarget = this.targets.get(this.dryRun ? "dummy" : target); if (!maybeTarget) { throw new Error(`Target ${target} not found`); diff --git a/blockchain-watcher/test/infrastructure/repositories/SnsEventRepository.test.ts b/blockchain-watcher/test/infrastructure/repositories/SnsEventRepository.test.ts index d60df9f4..786cc710 100644 --- a/blockchain-watcher/test/infrastructure/repositories/SnsEventRepository.test.ts +++ b/blockchain-watcher/test/infrastructure/repositories/SnsEventRepository.test.ts @@ -10,7 +10,7 @@ describe("SnsEventRepository", () => { it("should not call sns client when no events given", async () => { givenSnsEventRepository(); - const result = await snsEventRepository.publish([]); + const result = await snsEventRepository.publish([], "sui"); expect(result).toEqual({ status: "success" }); expect(snsClient.send).not.toHaveBeenCalled(); @@ -19,17 +19,20 @@ describe("SnsEventRepository", () => { it("should publish", async () => { givenSnsEventRepository(); - const result = await snsEventRepository.publish([ - { - chainId: 1, - address: "0x123456", - txHash: "0x123", - blockHeight: 123n, - blockTime: 0, - name: "LogMessagePublished", - attributes: {}, - }, - ]); + const result = await snsEventRepository.publish( + [ + { + chainId: 1, + address: "0x123456", + txHash: "0x123", + blockHeight: 123n, + blockTime: 0, + name: "LogMessagePublished", + attributes: {}, + }, + ], + "sui" + ); expect(result).toEqual({ status: "success" }); expect(snsClient.send).toHaveBeenCalledTimes(1);