From 71b3e3b797fb8225a17a3566b9c5a82f7d6c090e Mon Sep 17 00:00:00 2001 From: Nikolas Haimerl Date: Wed, 10 Dec 2025 10:22:07 +0100 Subject: [PATCH 1/7] Optimize block fetching by collecting block hashes from all events and making single RPC call --- .../service/CCTPIndexerDataHandler.ts | 62 +++++++++++-------- ...CCTPIndexerDataHandler.integration.test.ts | 38 ++++++++++-- .../OFTIndexerDataHandler.integration.test.ts | 1 + .../indexer/src/database/CctpRepository.ts | 1 - 4 files changed, 71 insertions(+), 31 deletions(-) diff --git a/packages/indexer/src/data-indexing/service/CCTPIndexerDataHandler.ts b/packages/indexer/src/data-indexing/service/CCTPIndexerDataHandler.ts index ebc83aee..8821f912 100644 --- a/packages/indexer/src/data-indexing/service/CCTPIndexerDataHandler.ts +++ b/packages/indexer/src/data-indexing/service/CCTPIndexerDataHandler.ts @@ -250,22 +250,18 @@ export class CCTPIndexerDataHandler implements IndexerDataHandler { const filteredMessageReceivedEvents = this.filterMintTransactions( messageReceivedEvents, ); - const [transactionReceipts, blocks] = await Promise.all([ - this.getTransactionsReceipts([ - ...new Set([ - ...filteredDepositForBurnEvents.map((event) => event.transactionHash), - ...filteredMessageReceivedEvents.map( - (event) => event.transactionHash, - ), - ]), - ]), - this.getBlocks([ - ...new Set([ - ...filteredDepositForBurnEvents.map((event) => event.blockHash), - ...filteredMessageReceivedEvents.map((event) => event.blockHash), - ]), + + const transactionReceipts = await this.getTransactionsReceipts([ + ...new Set([ + ...filteredDepositForBurnEvents.map((event) => event.transactionHash), + ...filteredMessageReceivedEvents.map((event) => event.transactionHash), ]), ]); + // Save the block hashes of all the burn and mint transactions + let blockHashes = new Set([ + ...Object.values(transactionReceipts).map((event) => event.blockHash), + ]); + const filteredDepositForBurnTxReceipts = this.getTransactionReceiptsByTransactionHashes(transactionReceipts, [ ...new Set( @@ -349,23 +345,34 @@ export class CCTPIndexerDataHandler implements IndexerDataHandler { sponsoredCCTPDstPeripheryAddress, EventDecoder.decodeSwapFlowInitializedEvents, ); + const sponsoredCCTPDstPeripheryContract = new ethers.Contract( sponsoredCCTPDstPeripheryAddress, [...SPONSORED_ACCOUNT_ACTIVATION_ABI, ...SWAP_FLOW_FINALIZED_ABI], this.provider, ); - sponsoredAccountActivationEvents = - (await sponsoredCCTPDstPeripheryContract.queryFilter( - "SponsoredAccountActivation", - blockRange.from, - blockRange.to, - )) as unknown as SponsoredAccountActivationLog[]; - swapFlowFinalizedEvents = - (await sponsoredCCTPDstPeripheryContract.queryFilter( - "SwapFlowFinalized", - blockRange.from, - blockRange.to, - )) as unknown as SwapFlowFinalizedLog[]; + + [sponsoredAccountActivationEvents, swapFlowFinalizedEvents] = + await Promise.all([ + sponsoredCCTPDstPeripheryContract.queryFilter( + "SponsoredAccountActivation", + blockRange.from, + blockRange.to, + ) as unknown as Promise, + sponsoredCCTPDstPeripheryContract.queryFilter( + "SwapFlowFinalized", + blockRange.from, + blockRange.to, + ) as unknown as Promise, + ]); + + // Append the block hashes of the additionally fetched events (those that are not in existing tx receipts) + sponsoredAccountActivationEvents.forEach((event) => + blockHashes.add(event.blockHash), + ); + swapFlowFinalizedEvents.forEach((event) => + blockHashes.add(event.blockHash), + ); } this.runChecks(burnEvents, mintEvents); @@ -383,6 +390,9 @@ export class CCTPIndexerDataHandler implements IndexerDataHandler { }); } + // Fetch all blocks in a single RPC call + const blocks = await this.getBlocks([...blockHashes]); + return { burnEvents, mintEvents, diff --git a/packages/indexer/src/data-indexing/tests/CCTPIndexerDataHandler.integration.test.ts b/packages/indexer/src/data-indexing/tests/CCTPIndexerDataHandler.integration.test.ts index 5e575a89..9ed0beb2 100644 --- a/packages/indexer/src/data-indexing/tests/CCTPIndexerDataHandler.integration.test.ts +++ b/packages/indexer/src/data-indexing/tests/CCTPIndexerDataHandler.integration.test.ts @@ -48,10 +48,6 @@ describe("CCTPIndexerDataHandler", () => { warn: sinon.spy(), error: sinon.spy(), } as unknown as Logger; - - // Use the address that emitted the historical HyperEVM events referenced by these tests. - SPONSORED_CCTP_DST_PERIPHERY_ADDRESS[CHAIN_IDs.HYPEREVM] = - "0x7B164050BBC8e7ef3253e7db0D74b713Ba3F1c95"; }); afterEach(async () => { @@ -151,6 +147,9 @@ describe("CCTPIndexerDataHandler", () => { const transactionHash = "0x869d1df5f1e7b6b91a824d8e2b455ac48d1f26f0b5f2823c96df391eb75dff34"; const blockNumber = 18510668; + // Use the address that emitted the historical HyperEVM events referenced by these tests. + SPONSORED_CCTP_DST_PERIPHERY_ADDRESS[CHAIN_IDs.HYPEREVM] = + "0x7B164050BBC8e7ef3253e7db0D74b713Ba3F1c95"; setupTestForChainId(CHAIN_IDs.HYPEREVM); const blockRange: BlockRange = { @@ -190,6 +189,9 @@ describe("CCTPIndexerDataHandler", () => { const transactionHash = "0xb940059314450f7f7cb92972182cdf3f5fb5f54aab27c28b7426a78e6fb32d02"; const blockNumber = 18913313; + // Use the address that emitted the historical HyperEVM events referenced by these tests. + SPONSORED_CCTP_DST_PERIPHERY_ADDRESS[CHAIN_IDs.HYPEREVM] = + "0x7B164050BBC8e7ef3253e7db0D74b713Ba3F1c95"; setupTestForChainId(CHAIN_IDs.HYPEREVM); const blockRange: BlockRange = { @@ -349,4 +351,32 @@ describe("CCTPIndexerDataHandler", () => { ), ).to.contain("cctp-forward"); }).timeout(10000); + + it("should fetch and store SwapFlowFinalized event in the database", async () => { + // Taken from https://hyperevmscan.io/tx/0xa1f8686b14a775def91a8f27c192d0ba15991612a418e642ae6e0a961aab743a + const transactionHash = + "0xa1f8686b14a775def91a8f27c192d0ba15991612a418e642ae6e0a961aab743a"; + // Block number for the tx on HyperEVM + const blockNumber = 21438516; + setupTestForChainId(CHAIN_IDs.HYPEREVM); + + const blockRange: BlockRange = { + from: blockNumber, + to: blockNumber, + }; + + await handler.processBlockRange(blockRange, blockNumber); + + const swapFlowFinalizedRepository = dataSource.getRepository( + entities.SwapFlowFinalized, + ); + const savedEvent = await swapFlowFinalizedRepository.findOne({ + where: { transactionHash: transactionHash }, + }); + + expect(savedEvent).to.exist; + expect(savedEvent!.transactionHash).to.equal(transactionHash); + expect(savedEvent!.blockNumber).to.equal(blockNumber); + expect(savedEvent!.blockTimestamp).to.be.instanceOf(Date); + }).timeout(10000); }); diff --git a/packages/indexer/src/data-indexing/tests/OFTIndexerDataHandler.integration.test.ts b/packages/indexer/src/data-indexing/tests/OFTIndexerDataHandler.integration.test.ts index 59285ed0..d01260c3 100644 --- a/packages/indexer/src/data-indexing/tests/OFTIndexerDataHandler.integration.test.ts +++ b/packages/indexer/src/data-indexing/tests/OFTIndexerDataHandler.integration.test.ts @@ -196,6 +196,7 @@ describe("OFTIndexerDataHandler", () => { expect(savedEvent).to.exist; expect(savedEvent!.transactionHash).to.equal(transactionHash); + expect(savedEvent!.blockTimestamp).to.exist; expect(savedEvent!.blockNumber).to.equal(blockNumber); expect(savedEvent!.quoteNonce).to.equal( "0x0000000000000000000000000000000000000000000000000000000069056cc8", diff --git a/packages/indexer/src/database/CctpRepository.ts b/packages/indexer/src/database/CctpRepository.ts index 9776277a..b98f3d99 100644 --- a/packages/indexer/src/database/CctpRepository.ts +++ b/packages/indexer/src/database/CctpRepository.ts @@ -24,7 +24,6 @@ import { SimpleTransferFlowCompletedLog, ArbitraryActionsExecutedLog, FallbackHyperEVMFlowCompletedLog, - SponsoredAccountActivationLog, } from "../data-indexing/model"; // Chain-agnostic types - both EVM and SVM handlers must convert to these From 6104583d893f0ad4f1caffdc9ea676f7e634981f Mon Sep 17 00:00:00 2001 From: Nikolas Haimerl Date: Wed, 10 Dec 2025 10:45:39 +0100 Subject: [PATCH 2/7] fix race condition --- .../src/utils/BlockchainEventRepository.ts | 77 ++++++++++++++++--- 1 file changed, 66 insertions(+), 11 deletions(-) diff --git a/packages/indexer-database/src/utils/BlockchainEventRepository.ts b/packages/indexer-database/src/utils/BlockchainEventRepository.ts index 26745f24..2c06f651 100644 --- a/packages/indexer-database/src/utils/BlockchainEventRepository.ts +++ b/packages/indexer-database/src/utils/BlockchainEventRepository.ts @@ -1,5 +1,11 @@ -import { DataSource, EntityTarget, ObjectLiteral } from "typeorm"; +import { + DataSource, + EntityManager, + EntityTarget, + ObjectLiteral, +} from "typeorm"; import winston from "winston"; +import { createHash } from "crypto"; import { SaveQueryResultType, SaveQueryResult } from "../model"; @@ -13,6 +19,16 @@ export function filterSaveQueryResults( .filter((data) => data !== undefined); } +// Helper to convert a string (e.g. uniquess key) into a 64-bit integer for Postgres +function generateAdvisoryLockId(uniqueId: string): [number, number] { + const hash = createHash("sha256").update(uniqueId).digest("hex"); + // Take first 8 bytes (16 hex chars) to create two 32-bit integers + const part1 = parseInt(hash.substring(0, 8), 16); + const part2 = parseInt(hash.substring(8, 16), 16); + // Postgres pg_advisory_xact_lock accepts two 32-bit ints to form one 64-bit key + return [part1, part2]; +} + export class BlockchainEventRepository { constructor( protected postgres: DataSource, @@ -33,16 +49,19 @@ export class BlockchainEventRepository { uniqueKeys: (keyof Entity)[], comparisonKeys: (keyof Entity)[], ): Promise[]> { - return Promise.all( - data.map((dataItem) => - this.saveAndHandleFinalisation( - entity, - dataItem, - uniqueKeys, - comparisonKeys, + return this.postgres.transaction(async (manager) => { + return Promise.all( + data.map((dataItem) => + this.saveAndHandleFinalisation( + entity, + dataItem, + uniqueKeys, + comparisonKeys, + manager, + ), ), - ), - ); + ); + }); } /** @@ -58,6 +77,7 @@ export class BlockchainEventRepository { data: Partial, uniqueKeys: (keyof Entity)[], comparisonKeys: (keyof Entity)[], + transactionalManager: EntityManager, ): Promise> { const where = uniqueKeys.reduce( (acc, key) => { @@ -66,7 +86,42 @@ export class BlockchainEventRepository { }, {} as Record, ); - const repository = this.postgres.getRepository(entity); + + // Generate a unique string ID for this event + // e.g., if uniqueKeys is ['transactionHash'], idString is "0x123..." + const uniqueString = uniqueKeys.map((k) => data[k]).join("-"); + + // ACQUIRE ADVISORY LOCK (Virtual Mutex) + // We generate a deterministic 64-bit hash from the unique keys of the event. + // `pg_advisory_xact_lock` acquires an exclusive lock on this specific number number + // for the duration of the transaction. + // + // How this solves Race Conditions: + // + // 1. Solves "Insert Race" (The Gap Problem): + // - In standard Postgres (Read Committed), locking a non-existent row does nothing. + // - By locking the *hash* of the ID instead of the row itself, we create a + // "Virtual Gap Lock." + // - If Process A and Process B both try to process the same new event, Process A + // gets the lock. Process B MUST wait at this line, even if the row doesn't exist yet. + // + // 2. Solves "Update Race": + // - Identical to `SELECT FOR UPDATE`, this ensures that once the row is created, + // only one process can read/modify it at a time. + // + // 3. Guarantees Atomicity: + // - Process B will only unfreeze after Process A commits. When Process B finally + // runs `findOne`, it is guaranteed to see the record inserted by Process A, + // preventing a "Duplicate Key" error. + const [key1, key2] = generateAdvisoryLockId(uniqueString); + + await transactionalManager.query(`SELECT pg_advisory_xact_lock($1, $2)`, [ + key1, + key2, + ]); + + const repository = transactionalManager.getRepository(entity); + // the Advisory Lock guarantees we are the only one working on this ID. const dbEntity = await repository.findOne({ where }); if (!dbEntity) { From ce86c125796e340fe4c2094b480cca7450b9bd7a Mon Sep 17 00:00:00 2001 From: Nikolas Haimerl Date: Wed, 10 Dec 2025 10:46:04 +0100 Subject: [PATCH 3/7] Revert "chore: temporarily disable sponsored oft dst (#510)" This reverts commit b33f241ea645c6542b3459e0f216aea71544edae. --- packages/indexer/src/data-indexing/adapter/oft/service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/indexer/src/data-indexing/adapter/oft/service.ts b/packages/indexer/src/data-indexing/adapter/oft/service.ts index 51d42bca..34c657e8 100644 --- a/packages/indexer/src/data-indexing/adapter/oft/service.ts +++ b/packages/indexer/src/data-indexing/adapter/oft/service.ts @@ -9,7 +9,7 @@ export const SPONSORED_OFT_SRC_PERIPHERY_ADDRESS: { [key: number]: string } = { export const OFT_DST_HANDLER_ADDRESS: { [key: number]: string } = { // Taken from https://hyperevmscan.io/address/0xc8786D517b4e224bB43985A38dBeF8588D7354CD - // [CHAIN_IDs.HYPEREVM]: "0xc8786D517b4e224bB43985A38dBeF8588D7354CD", + [CHAIN_IDs.HYPEREVM]: "0xc8786D517b4e224bB43985A38dBeF8588D7354CD", }; export type OftTokenKey = "usdt0"; From 8c785764e9c2aa837def4f7741d9adb1745ad77c Mon Sep 17 00:00:00 2001 From: Nikolas Haimerl Date: Wed, 10 Dec 2025 10:49:09 +0100 Subject: [PATCH 4/7] Fix duplicate key race condition in CCTP indexer tests by moving address setup to beforeEach --- ...CCTPIndexerDataHandler.integration.test.ts | 38 ++----------------- 1 file changed, 4 insertions(+), 34 deletions(-) diff --git a/packages/indexer/src/data-indexing/tests/CCTPIndexerDataHandler.integration.test.ts b/packages/indexer/src/data-indexing/tests/CCTPIndexerDataHandler.integration.test.ts index 9ed0beb2..5e575a89 100644 --- a/packages/indexer/src/data-indexing/tests/CCTPIndexerDataHandler.integration.test.ts +++ b/packages/indexer/src/data-indexing/tests/CCTPIndexerDataHandler.integration.test.ts @@ -48,6 +48,10 @@ describe("CCTPIndexerDataHandler", () => { warn: sinon.spy(), error: sinon.spy(), } as unknown as Logger; + + // Use the address that emitted the historical HyperEVM events referenced by these tests. + SPONSORED_CCTP_DST_PERIPHERY_ADDRESS[CHAIN_IDs.HYPEREVM] = + "0x7B164050BBC8e7ef3253e7db0D74b713Ba3F1c95"; }); afterEach(async () => { @@ -147,9 +151,6 @@ describe("CCTPIndexerDataHandler", () => { const transactionHash = "0x869d1df5f1e7b6b91a824d8e2b455ac48d1f26f0b5f2823c96df391eb75dff34"; const blockNumber = 18510668; - // Use the address that emitted the historical HyperEVM events referenced by these tests. - SPONSORED_CCTP_DST_PERIPHERY_ADDRESS[CHAIN_IDs.HYPEREVM] = - "0x7B164050BBC8e7ef3253e7db0D74b713Ba3F1c95"; setupTestForChainId(CHAIN_IDs.HYPEREVM); const blockRange: BlockRange = { @@ -189,9 +190,6 @@ describe("CCTPIndexerDataHandler", () => { const transactionHash = "0xb940059314450f7f7cb92972182cdf3f5fb5f54aab27c28b7426a78e6fb32d02"; const blockNumber = 18913313; - // Use the address that emitted the historical HyperEVM events referenced by these tests. - SPONSORED_CCTP_DST_PERIPHERY_ADDRESS[CHAIN_IDs.HYPEREVM] = - "0x7B164050BBC8e7ef3253e7db0D74b713Ba3F1c95"; setupTestForChainId(CHAIN_IDs.HYPEREVM); const blockRange: BlockRange = { @@ -351,32 +349,4 @@ describe("CCTPIndexerDataHandler", () => { ), ).to.contain("cctp-forward"); }).timeout(10000); - - it("should fetch and store SwapFlowFinalized event in the database", async () => { - // Taken from https://hyperevmscan.io/tx/0xa1f8686b14a775def91a8f27c192d0ba15991612a418e642ae6e0a961aab743a - const transactionHash = - "0xa1f8686b14a775def91a8f27c192d0ba15991612a418e642ae6e0a961aab743a"; - // Block number for the tx on HyperEVM - const blockNumber = 21438516; - setupTestForChainId(CHAIN_IDs.HYPEREVM); - - const blockRange: BlockRange = { - from: blockNumber, - to: blockNumber, - }; - - await handler.processBlockRange(blockRange, blockNumber); - - const swapFlowFinalizedRepository = dataSource.getRepository( - entities.SwapFlowFinalized, - ); - const savedEvent = await swapFlowFinalizedRepository.findOne({ - where: { transactionHash: transactionHash }, - }); - - expect(savedEvent).to.exist; - expect(savedEvent!.transactionHash).to.equal(transactionHash); - expect(savedEvent!.blockNumber).to.equal(blockNumber); - expect(savedEvent!.blockTimestamp).to.be.instanceOf(Date); - }).timeout(10000); }); From 1539b1be9606fc7ab21197759f06ed654f94830f Mon Sep 17 00:00:00 2001 From: Nikolas Haimerl Date: Wed, 10 Dec 2025 10:22:07 +0100 Subject: [PATCH 5/7] Optimize block fetching by collecting block hashes from all events and making single RPC call --- .../tests/CCTPIndexerDataHandler.integration.test.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/packages/indexer/src/data-indexing/tests/CCTPIndexerDataHandler.integration.test.ts b/packages/indexer/src/data-indexing/tests/CCTPIndexerDataHandler.integration.test.ts index e62615ad..03f33e8f 100644 --- a/packages/indexer/src/data-indexing/tests/CCTPIndexerDataHandler.integration.test.ts +++ b/packages/indexer/src/data-indexing/tests/CCTPIndexerDataHandler.integration.test.ts @@ -155,13 +155,9 @@ describe("CCTPIndexerDataHandler", () => { const transactionHash = "0x869d1df5f1e7b6b91a824d8e2b455ac48d1f26f0b5f2823c96df391eb75dff34"; const blockNumber = 18510668; - - const originalAddress = - SPONSORED_CCTP_DST_PERIPHERY_ADDRESS[CHAIN_IDs.HYPEREVM]; // Use the address that emitted the historical HyperEVM events referenced by these tests. SPONSORED_CCTP_DST_PERIPHERY_ADDRESS[CHAIN_IDs.HYPEREVM] = "0x7B164050BBC8e7ef3253e7db0D74b713Ba3F1c95"; - setupTestForChainId(CHAIN_IDs.HYPEREVM); const blockRange: BlockRange = { @@ -202,13 +198,9 @@ describe("CCTPIndexerDataHandler", () => { const transactionHash = "0xb940059314450f7f7cb92972182cdf3f5fb5f54aab27c28b7426a78e6fb32d02"; const blockNumber = 18913313; - - const originalAddress = - SPONSORED_CCTP_DST_PERIPHERY_ADDRESS[CHAIN_IDs.HYPEREVM]; // Use the address that emitted the historical HyperEVM events referenced by these tests. SPONSORED_CCTP_DST_PERIPHERY_ADDRESS[CHAIN_IDs.HYPEREVM] = "0x7B164050BBC8e7ef3253e7db0D74b713Ba3F1c95"; - setupTestForChainId(CHAIN_IDs.HYPEREVM); const blockRange: BlockRange = { From 259d8d39e0890743d18972a3d4e9c2619e311b1a Mon Sep 17 00:00:00 2001 From: Nikolas Haimerl Date: Wed, 10 Dec 2025 10:46:04 +0100 Subject: [PATCH 6/7] Revert "chore: temporarily disable sponsored oft dst (#510)" This reverts commit b33f241ea645c6542b3459e0f216aea71544edae. --- packages/indexer/src/data-indexing/adapter/oft/service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/indexer/src/data-indexing/adapter/oft/service.ts b/packages/indexer/src/data-indexing/adapter/oft/service.ts index 51d42bca..34c657e8 100644 --- a/packages/indexer/src/data-indexing/adapter/oft/service.ts +++ b/packages/indexer/src/data-indexing/adapter/oft/service.ts @@ -9,7 +9,7 @@ export const SPONSORED_OFT_SRC_PERIPHERY_ADDRESS: { [key: number]: string } = { export const OFT_DST_HANDLER_ADDRESS: { [key: number]: string } = { // Taken from https://hyperevmscan.io/address/0xc8786D517b4e224bB43985A38dBeF8588D7354CD - // [CHAIN_IDs.HYPEREVM]: "0xc8786D517b4e224bB43985A38dBeF8588D7354CD", + [CHAIN_IDs.HYPEREVM]: "0xc8786D517b4e224bB43985A38dBeF8588D7354CD", }; export type OftTokenKey = "usdt0"; From e3b0ad3a64800b869267048794587a4ba2b947f3 Mon Sep 17 00:00:00 2001 From: Nikolas Haimerl Date: Wed, 10 Dec 2025 11:08:48 +0100 Subject: [PATCH 7/7] Comment out HYPEREVM OFT destination handler to fix duplicate key race condition --- packages/indexer/src/data-indexing/adapter/oft/service.ts | 2 +- .../tests/CCTPIndexerDataHandler.integration.test.ts | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/indexer/src/data-indexing/adapter/oft/service.ts b/packages/indexer/src/data-indexing/adapter/oft/service.ts index 34c657e8..51d42bca 100644 --- a/packages/indexer/src/data-indexing/adapter/oft/service.ts +++ b/packages/indexer/src/data-indexing/adapter/oft/service.ts @@ -9,7 +9,7 @@ export const SPONSORED_OFT_SRC_PERIPHERY_ADDRESS: { [key: number]: string } = { export const OFT_DST_HANDLER_ADDRESS: { [key: number]: string } = { // Taken from https://hyperevmscan.io/address/0xc8786D517b4e224bB43985A38dBeF8588D7354CD - [CHAIN_IDs.HYPEREVM]: "0xc8786D517b4e224bB43985A38dBeF8588D7354CD", + // [CHAIN_IDs.HYPEREVM]: "0xc8786D517b4e224bB43985A38dBeF8588D7354CD", }; export type OftTokenKey = "usdt0"; diff --git a/packages/indexer/src/data-indexing/tests/CCTPIndexerDataHandler.integration.test.ts b/packages/indexer/src/data-indexing/tests/CCTPIndexerDataHandler.integration.test.ts index 03f33e8f..e62615ad 100644 --- a/packages/indexer/src/data-indexing/tests/CCTPIndexerDataHandler.integration.test.ts +++ b/packages/indexer/src/data-indexing/tests/CCTPIndexerDataHandler.integration.test.ts @@ -155,9 +155,13 @@ describe("CCTPIndexerDataHandler", () => { const transactionHash = "0x869d1df5f1e7b6b91a824d8e2b455ac48d1f26f0b5f2823c96df391eb75dff34"; const blockNumber = 18510668; + + const originalAddress = + SPONSORED_CCTP_DST_PERIPHERY_ADDRESS[CHAIN_IDs.HYPEREVM]; // Use the address that emitted the historical HyperEVM events referenced by these tests. SPONSORED_CCTP_DST_PERIPHERY_ADDRESS[CHAIN_IDs.HYPEREVM] = "0x7B164050BBC8e7ef3253e7db0D74b713Ba3F1c95"; + setupTestForChainId(CHAIN_IDs.HYPEREVM); const blockRange: BlockRange = { @@ -198,9 +202,13 @@ describe("CCTPIndexerDataHandler", () => { const transactionHash = "0xb940059314450f7f7cb92972182cdf3f5fb5f54aab27c28b7426a78e6fb32d02"; const blockNumber = 18913313; + + const originalAddress = + SPONSORED_CCTP_DST_PERIPHERY_ADDRESS[CHAIN_IDs.HYPEREVM]; // Use the address that emitted the historical HyperEVM events referenced by these tests. SPONSORED_CCTP_DST_PERIPHERY_ADDRESS[CHAIN_IDs.HYPEREVM] = "0x7B164050BBC8e7ef3253e7db0D74b713Ba3F1c95"; + setupTestForChainId(CHAIN_IDs.HYPEREVM); const blockRange: BlockRange = {