From b63be997fa397e63f513768afa1d488c71feac21 Mon Sep 17 00:00:00 2001 From: Alexander Liteplo Date: Thu, 18 Dec 2025 18:11:56 -0800 Subject: [PATCH 1/3] adding start and end block filters to Deposits api --- packages/indexer-api/src/dtos/deposits.dto.ts | 2 ++ packages/indexer-api/src/services/deposits.ts | 33 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/packages/indexer-api/src/dtos/deposits.dto.ts b/packages/indexer-api/src/dtos/deposits.dto.ts index 54c2b11c..ed50353a 100644 --- a/packages/indexer-api/src/dtos/deposits.dto.ts +++ b/packages/indexer-api/src/dtos/deposits.dto.ts @@ -38,6 +38,8 @@ export const DepositsParams = s.object({ integratorId: s.optional(s.string()), status: s.optional(s.enums(Object.values(entities.RelayStatus))), depositType: s.optional(DepositType), // Filter by deposit type: "across" (V3FundsDeposited), "cctp" (DepositForBurn), or "oft" (OFTSent) + startBlock: s.optional(stringToInt), + endBlock: s.optional(stringToInt), // some kind of pagination options, skip could be the start point skip: s.optional(stringToInt), // pagination limit, how many to return after the start, note we convert string to number diff --git a/packages/indexer-api/src/services/deposits.ts b/packages/indexer-api/src/services/deposits.ts index ff759f58..3bacd412 100644 --- a/packages/indexer-api/src/services/deposits.ts +++ b/packages/indexer-api/src/services/deposits.ts @@ -301,6 +301,39 @@ export class DepositsService { oftSentQueryBuilder.andWhere("1 = 0"); } + if (params.startBlock) { + fundsDepositedQueryBuilder.andWhere( + "deposit.blockNumber >= :startBlock", + { + startBlock: params.startBlock, + }, + ); + depositForBurnQueryBuilder.andWhere( + "depositForBurn.blockNumber >= :startBlock", + { + startBlock: params.startBlock, + }, + ); + oftSentQueryBuilder.andWhere("oftSent.blockNumber >= :startBlock", { + startBlock: params.startBlock, + }); + } + + if (params.endBlock) { + fundsDepositedQueryBuilder.andWhere("deposit.blockNumber <= :endBlock", { + endBlock: params.endBlock, + }); + depositForBurnQueryBuilder.andWhere( + "depositForBurn.blockNumber <= :endBlock", + { + endBlock: params.endBlock, + }, + ); + oftSentQueryBuilder.andWhere("oftSent.blockNumber <= :endBlock", { + endBlock: params.endBlock, + }); + } + // Calculate upper bound for fetching records from each query // We fetch more than needed to ensure we have enough after sorting const skip = params.skip || 0; From 6308a060e43ca24592788db653dc04bc6157a6e2 Mon Sep 17 00:00:00 2001 From: Alexander Liteplo Date: Fri, 19 Dec 2025 11:37:41 -0800 Subject: [PATCH 2/3] adding indexes and generating migratio n script --- .../src/entities/evm/DepositForBurn.ts | 1 + .../src/entities/evm/OftSent.ts | 1 + .../src/entities/evm/V3FundsDeposited.ts | 4 +++ ...172349662-AddOriginChainAndBlockIndexes.ts | 31 +++++++++++++++++++ 4 files changed, 37 insertions(+) create mode 100644 packages/indexer-database/src/migrations/1766172349662-AddOriginChainAndBlockIndexes.ts diff --git a/packages/indexer-database/src/entities/evm/DepositForBurn.ts b/packages/indexer-database/src/entities/evm/DepositForBurn.ts index 3122bc38..6219df73 100644 --- a/packages/indexer-database/src/entities/evm/DepositForBurn.ts +++ b/packages/indexer-database/src/entities/evm/DepositForBurn.ts @@ -19,6 +19,7 @@ import { CctpFinalizerJob } from "../CctpFinalizerJob"; ]) @Index("IX_depositForBurn_finalised", ["finalised"]) @Index("IX_depositForBurn_deletedAt", ["deletedAt"]) +@Index("IX_depositForBurn_chainId_blockNumber", ["chainId", "blockNumber"]) export class DepositForBurn { @PrimaryGeneratedColumn() id: number; diff --git a/packages/indexer-database/src/entities/evm/OftSent.ts b/packages/indexer-database/src/entities/evm/OftSent.ts index c7e2fd32..3c364aa7 100644 --- a/packages/indexer-database/src/entities/evm/OftSent.ts +++ b/packages/indexer-database/src/entities/evm/OftSent.ts @@ -16,6 +16,7 @@ import { ]) @Index("IX_oftSent_finalised", ["finalised"]) @Index("IX_oftSent_deletedAt", ["deletedAt"]) +@Index("IX_oftSent_chainId_blockNumber", ["chainId", "blockNumber"]) export class OFTSent { @PrimaryGeneratedColumn() id: number; diff --git a/packages/indexer-database/src/entities/evm/V3FundsDeposited.ts b/packages/indexer-database/src/entities/evm/V3FundsDeposited.ts index d3a4ca75..fc7a7e76 100644 --- a/packages/indexer-database/src/entities/evm/V3FundsDeposited.ts +++ b/packages/indexer-database/src/entities/evm/V3FundsDeposited.ts @@ -36,6 +36,10 @@ import { RelayHashInfo } from "../RelayHashInfo"; "originChainId", "depositId", ]) +@Index("IX_v3FundsDeposited_originChainId_blockNumber", [ + "originChainId", + "blockNumber", +]) @Index("IX_v3FundsDeposited_internalHash", ["internalHash"]) export class V3FundsDeposited { @PrimaryGeneratedColumn() diff --git a/packages/indexer-database/src/migrations/1766172349662-AddOriginChainAndBlockIndexes.ts b/packages/indexer-database/src/migrations/1766172349662-AddOriginChainAndBlockIndexes.ts new file mode 100644 index 00000000..4f6759a1 --- /dev/null +++ b/packages/indexer-database/src/migrations/1766172349662-AddOriginChainAndBlockIndexes.ts @@ -0,0 +1,31 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class AddOriginChainAndBlockIndexes1766172349662 + implements MigrationInterface +{ + name = "AddOriginChainAndBlockIndexes1766172349662"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE INDEX "IX_v3FundsDeposited_originChainId_blockNumber" ON "evm"."v3_funds_deposited" ("originChainId", "blockNumber") `, + ); + await queryRunner.query( + `CREATE INDEX "IX_depositForBurn_chainId_blockNumber" ON "evm"."deposit_for_burn" ("chainId", "blockNumber") `, + ); + await queryRunner.query( + `CREATE INDEX "IX_oftSent_chainId_blockNumber" ON "evm"."oft_sent" ("chainId", "blockNumber") `, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `DROP INDEX "evm"."IX_oftSent_chainId_blockNumber"`, + ); + await queryRunner.query( + `DROP INDEX "evm"."IX_depositForBurn_chainId_blockNumber"`, + ); + await queryRunner.query( + `DROP INDEX "evm"."IX_v3FundsDeposited_originChainId_blockNumber"`, + ); + } +} From a6abf3471dd254dbe021bf63a232e2ba8eb7153a Mon Sep 17 00:00:00 2001 From: Alexander Liteplo Date: Fri, 19 Dec 2025 16:58:55 -0800 Subject: [PATCH 3/3] adding return fillBlockNumber field to be returned by deposits API --- packages/indexer-api/src/dtos/deposits.dto.ts | 1 + packages/indexer-api/src/tests/deposits.test.ts | 5 +++++ packages/indexer-api/src/utils/fields.ts | 3 +++ 3 files changed, 9 insertions(+) diff --git a/packages/indexer-api/src/dtos/deposits.dto.ts b/packages/indexer-api/src/dtos/deposits.dto.ts index ed50353a..8aef5243 100644 --- a/packages/indexer-api/src/dtos/deposits.dto.ts +++ b/packages/indexer-api/src/dtos/deposits.dto.ts @@ -158,6 +158,7 @@ export type DepositReturnType = { // from fill relayer?: string; + fillBlockNumber?: number; fillBlockTimestamp?: Date; fillTx?: string | null; // Renamed from fillTransactionHash diff --git a/packages/indexer-api/src/tests/deposits.test.ts b/packages/indexer-api/src/tests/deposits.test.ts index 122585d6..dd84786c 100644 --- a/packages/indexer-api/src/tests/deposits.test.ts +++ b/packages/indexer-api/src/tests/deposits.test.ts @@ -245,6 +245,9 @@ describe("Deposits Service Tests", () => { swapData.swapTokenAmount, ); expect(queriedDeposit?.relayer).to.equal(filledRelayData.relayer); + expect(queriedDeposit?.fillBlockNumber).to.equal( + filledRelayData.blockNumber, + ); expect(queriedDeposit?.status).to.equal(relayHashInfoData.status); }); @@ -478,6 +481,7 @@ describe("Deposits Service Tests", () => { expect(cctpDeposit?.inputAmount).to.equal("1000000"); expect(cctpDeposit?.depositor).to.equal("0xdepositor"); expect(cctpDeposit?.recipient).to.equal("0xrecipient"); + expect(cctpDeposit?.fillBlockNumber).to.equal(2000); }); it("should return OFTSent deposits with OFTReceived", async () => { @@ -528,5 +532,6 @@ describe("Deposits Service Tests", () => { expect(oftDeposit?.depositor).to.equal("0xfrom"); expect(oftDeposit?.inputAmount).to.equal("3000000"); expect(oftDeposit?.outputAmount).to.equal("2900000"); + expect(oftDeposit?.fillBlockNumber).to.equal(4000); }); }); diff --git a/packages/indexer-api/src/utils/fields.ts b/packages/indexer-api/src/utils/fields.ts index f8cd833c..15ac1623 100644 --- a/packages/indexer-api/src/utils/fields.ts +++ b/packages/indexer-api/src/utils/fields.ts @@ -46,6 +46,7 @@ export const RelayHashInfoFields = [ export const FilledRelayFields = [ `fill.relayer::varchar as "relayer"`, + `fill."blockNumber"::integer as "fillBlockNumber"`, `fill."blockTimestamp"::timestamp as "fillBlockTimestamp"`, `fill."transactionHash"::varchar as "fillTx"`, // Renamed field ]; @@ -102,6 +103,7 @@ export const DepositForBurnRelayHashInfoFields = [ export const DepositForBurnFilledRelayFields = [ `NULL::varchar as "relayer"`, + `"mintAndWithdraw"."blockNumber"::integer as "fillBlockNumber"`, `"mintAndWithdraw"."blockTimestamp"::timestamp as "fillBlockTimestamp"`, `"mintAndWithdraw"."transactionHash"::varchar as "fillTx"`, ]; @@ -159,6 +161,7 @@ export const OftSentRelayHashInfoFields = [ export const OftSentFilledRelayFields = [ `NULL::varchar as "relayer"`, + `"oftReceived"."blockNumber"::integer as "fillBlockNumber"`, `"oftReceived"."blockTimestamp"::timestamp as "fillBlockTimestamp"`, `"oftReceived"."transactionHash"::varchar as "fillTx"`, ];