diff --git a/packages/transaction-manager/lib/TxMonitor.ts b/packages/transaction-manager/lib/TxMonitor.ts index 45c621ade6..3de02f2e52 100644 --- a/packages/transaction-manager/lib/TxMonitor.ts +++ b/packages/transaction-manager/lib/TxMonitor.ts @@ -10,6 +10,8 @@ type AttemptWithReceipt = { attempt: Attempt; receipt: TransactionReceipt } export class TxMonitor { private readonly transactionManager: TransactionManager + private locked = false + private pendingBlockPromises: PromiseWithResolvers[] = [] constructor(transactionManager: TransactionManager) { this.transactionManager = transactionManager @@ -17,6 +19,30 @@ export class TxMonitor { } private async onNewBlock(block: LatestBlock) { + if (this.locked) { + const pending = promiseWithResolvers() + this.pendingBlockPromises.push(pending) + try { + await pending.promise + } catch { + // A more recent block came while we were waiting, abort. + return + } + } + + this.locked = true + try { + await this.handleNewBlock(block) + } catch (error) { + console.error("Error in handleNewBlock: ", error) + } + this.locked = false + + this.pendingBlockPromises.pop()?.resolve() + this.pendingBlockPromises.forEach((p) => p.reject()) + } + + private async handleNewBlock(block: LatestBlock) { const transactions = this.transactionManager.transactionRepository.getNotFinalizedTransactions() const promises = transactions.map(async (transaction) => {