From 38f81a2f54a8d29eac65aba9b255e32e6aab2c42 Mon Sep 17 00:00:00 2001 From: Melisa Guevara Date: Wed, 16 Oct 2024 11:34:31 -0300 Subject: [PATCH] fix(bundles): fix range start block and bundle id when assigning events (#69) --- .../indexer-database/src/entities/Bundle.ts | 12 +++++++++--- .../src/entities/evm/ProposedRootBundle.ts | 5 +++++ .../src/entities/evm/RootBundleCanceled.ts | 5 +++++ .../src/entities/evm/RootBundleDisputed.ts | 5 +++++ .../indexer/src/database/BundleRepository.ts | 18 +++++++++--------- packages/indexer/src/services/bundles.ts | 19 +++++++++++++------ 6 files changed, 46 insertions(+), 18 deletions(-) diff --git a/packages/indexer-database/src/entities/Bundle.ts b/packages/indexer-database/src/entities/Bundle.ts index a6e7549c..9bb26337 100644 --- a/packages/indexer-database/src/entities/Bundle.ts +++ b/packages/indexer-database/src/entities/Bundle.ts @@ -35,7 +35,9 @@ export class Bundle { @Column() slowRelayRoot: string; - @OneToOne(() => ProposedRootBundle, { nullable: false }) + @OneToOne(() => ProposedRootBundle, (proposal) => proposal.bundle, { + nullable: false, + }) @JoinColumn({ foreignKeyConstraintName: "FK_bundle_rootBundleProposeId", }) @@ -44,7 +46,9 @@ export class Bundle { @Column({ nullable: false }) proposalId: number; - @OneToOne(() => RootBundleCanceled, { nullable: true }) + @OneToOne(() => RootBundleCanceled, (cancelation) => cancelation.bundle, { + nullable: true, + }) @JoinColumn({ foreignKeyConstraintName: "FK_bundle_rootBundleCanceledId", }) @@ -53,7 +57,9 @@ export class Bundle { @Column({ nullable: true }) cancelationId: number; - @OneToOne(() => RootBundleDisputed, { nullable: true }) + @OneToOne(() => RootBundleDisputed, (dispute) => dispute.bundle, { + nullable: true, + }) @JoinColumn({ foreignKeyConstraintName: "FK_bundle_rootBundleDisputedId", }) diff --git a/packages/indexer-database/src/entities/evm/ProposedRootBundle.ts b/packages/indexer-database/src/entities/evm/ProposedRootBundle.ts index 135dbd91..8f20e1c6 100644 --- a/packages/indexer-database/src/entities/evm/ProposedRootBundle.ts +++ b/packages/indexer-database/src/entities/evm/ProposedRootBundle.ts @@ -2,9 +2,11 @@ import { Column, CreateDateColumn, Entity, + OneToOne, PrimaryGeneratedColumn, Unique, } from "typeorm"; +import { Bundle } from "../Bundle"; @Entity({ schema: "evm" }) @Unique("UK_proposedRootBundle_txHash", ["transactionHash"]) @@ -36,6 +38,9 @@ export class ProposedRootBundle { @Column() proposer: string; + @OneToOne(() => Bundle, (bundle) => bundle.proposal) + bundle: Bundle; + @Column() transactionHash: string; diff --git a/packages/indexer-database/src/entities/evm/RootBundleCanceled.ts b/packages/indexer-database/src/entities/evm/RootBundleCanceled.ts index f6ea9492..1ad5fa68 100644 --- a/packages/indexer-database/src/entities/evm/RootBundleCanceled.ts +++ b/packages/indexer-database/src/entities/evm/RootBundleCanceled.ts @@ -2,9 +2,11 @@ import { Column, CreateDateColumn, Entity, + OneToOne, PrimaryGeneratedColumn, Unique, } from "typeorm"; +import { Bundle } from "../Bundle"; @Entity({ schema: "evm" }) @Unique("UK_rootBundleCanceled_txHash", ["transactionHash"]) @@ -18,6 +20,9 @@ export class RootBundleCanceled { @Column() requestTime: Date; + @OneToOne(() => Bundle, (bundle) => bundle.cancelation) + bundle: Bundle; + @Column() transactionHash: string; diff --git a/packages/indexer-database/src/entities/evm/RootBundleDisputed.ts b/packages/indexer-database/src/entities/evm/RootBundleDisputed.ts index 728bd476..ab4e1dd5 100644 --- a/packages/indexer-database/src/entities/evm/RootBundleDisputed.ts +++ b/packages/indexer-database/src/entities/evm/RootBundleDisputed.ts @@ -2,9 +2,11 @@ import { Column, CreateDateColumn, Entity, + OneToOne, PrimaryGeneratedColumn, Unique, } from "typeorm"; +import { Bundle } from "../Bundle"; @Entity({ schema: "evm" }) @Unique("UK_rootBundleDisputed_txHash", ["transactionHash"]) @@ -18,6 +20,9 @@ export class RootBundleDisputed { @Column() requestTime: Date; + @OneToOne(() => Bundle, (bundle) => bundle.dispute) + bundle: Bundle; + @Column() transactionHash: string; diff --git a/packages/indexer/src/database/BundleRepository.ts b/packages/indexer/src/database/BundleRepository.ts index eb662e18..c72cb56a 100644 --- a/packages/indexer/src/database/BundleRepository.ts +++ b/packages/indexer/src/database/BundleRepository.ts @@ -48,14 +48,14 @@ export class BundleRepository extends utils.BaseRepository { ); // Find all canceled events that haven't been associated with a bundle. return canceledRootBundleRepository - .createQueryBuilder("drb") + .createQueryBuilder("crb") .select([ - "drb.id", - "drb.blockNumber", - "drb.logIndex", - "drb.transactionIndex", + "crb.id", + "crb.blockNumber", + "crb.logIndex", + "crb.transactionIndex", ]) - .leftJoin("bundle", "b", "b.cancelationId = drb.id") + .leftJoin("crb.bundle", "b") .where("b.cancelationId IS NULL") .getMany(); } @@ -80,7 +80,7 @@ export class BundleRepository extends utils.BaseRepository { "drb.logIndex", "drb.transactionIndex", ]) - .leftJoin("bundle", "b", "b.disputeId = drb.id") + .leftJoin("drb.bundle", "b") .where("b.disputeId IS NULL") .getMany(); } @@ -108,7 +108,7 @@ export class BundleRepository extends utils.BaseRepository { "prb.relayerRefundRoot", "prb.slowRelayRoot", ]) - .leftJoin("bundle", "b", "b.proposalId = prb.id") + .leftJoin("prb.bundle", "b") .where("b.proposalId IS NULL") .getMany(); } @@ -177,7 +177,7 @@ export class BundleRepository extends utils.BaseRepository { return this.postgres .getRepository(entities.ProposedRootBundle) .createQueryBuilder("prb") - .leftJoin(entities.Bundle, "b", "b.proposalId = prb.id") + .leftJoinAndSelect("prb.bundle", "b") .where( // Proposal is in the past "(prb.blockNumber < :blockNumber OR " + diff --git a/packages/indexer/src/services/bundles.ts b/packages/indexer/src/services/bundles.ts index 102ea6fc..9b9d7913 100644 --- a/packages/indexer/src/services/bundles.ts +++ b/packages/indexer/src/services/bundles.ts @@ -113,7 +113,7 @@ async function assignDisputeEventToBundle( return undefined; } return { - bundleId: proposedBundle.id, + bundleId: proposedBundle.bundle.id, eventId: id, }; }, @@ -156,7 +156,7 @@ async function assignCanceledEventToBundle( return undefined; } return { - bundleId: proposedBundle.id, + bundleId: proposedBundle.bundle.id, eventId: id, }; }, @@ -201,7 +201,7 @@ async function assignExecutionsToBundle( ); } return { - bundleId: proposedBundle.id, + bundleId: proposedBundle.bundle.id, executionId: id, }; }, @@ -268,14 +268,17 @@ async function assignBundleRangesToProposal( // matches the previous. For the case that the current bundle adds a new chain // to the proposal, the corresponding previous event index should resolve undefined // and therefore the start block should be 0. - const startBlock = + const previousEndBlock = previousEvent.bundleEvaluationBlockNumbers[idx] ?? 0; return [ ...acc, { bundleId: bundle.id, chainId, - startBlock, + startBlock: + previousEndBlock !== endBlock + ? previousEndBlock + 1 + : previousEndBlock, // Bundle range doesn't change for disabled chains endBlock, }, ]; @@ -285,7 +288,11 @@ async function assignBundleRangesToProposal( }), ); const insertResults = await dbRepository.associateBlockRangeWithBundle( - rangeSegments.filter((segment) => segment !== undefined).flat(), + rangeSegments + .filter( + (segment): segment is BlockRangeInsertType[] => segment !== undefined, + ) + .flat(), ); logResultOfAssignment( logger,