diff --git a/packages/worker/src/app.service.ts b/packages/worker/src/app.service.ts index 71d82079e..f0fbaa830 100644 --- a/packages/worker/src/app.service.ts +++ b/packages/worker/src/app.service.ts @@ -15,6 +15,7 @@ import { SystemContractService } from "./contract/systemContract.service"; @Injectable() export class AppService implements OnModuleInit, OnModuleDestroy { private readonly logger: Logger; + private isHandlingBlocksRevert = false; public constructor( private readonly counterService: CounterService, @@ -43,6 +44,11 @@ export class AppService implements OnModuleInit, OnModuleDestroy { @OnEvent(BLOCKS_REVERT_DETECTED_EVENT) protected async handleBlocksRevert({ detectedIncorrectBlockNumber }: { detectedIncorrectBlockNumber: number }) { + if (this.isHandlingBlocksRevert) { + return; + } + this.isHandlingBlocksRevert = true; + this.logger.log("Stopping workers before blocks revert"); await this.stopWorkers(); @@ -50,7 +56,9 @@ export class AppService implements OnModuleInit, OnModuleDestroy { await this.blocksRevertService.handleRevert(detectedIncorrectBlockNumber); this.logger.log("Starting workers after blocks revert"); - await this.startWorkers(); + this.startWorkers(); + + this.isHandlingBlocksRevert = false; } private startWorkers() { diff --git a/packages/worker/src/block/block.watcher.ts b/packages/worker/src/block/block.watcher.ts index f491c6554..0ae3f5978 100644 --- a/packages/worker/src/block/block.watcher.ts +++ b/packages/worker/src/block/block.watcher.ts @@ -119,7 +119,7 @@ export class BlockWatcher implements OnModuleInit, OnModuleDestroy { this.logger.debug(`Last block number is set to: ${this.lastBlockchainBlockNumber}`); this.blockchainService.on("block", (blockNumber) => { - this.lastBlockchainBlockNumber = Math.max(this.lastBlockchainBlockNumber, blockNumber); + this.lastBlockchainBlockNumber = blockNumber || this.lastBlockchainBlockNumber; this.blockchainBlocksMetric.set(this.lastBlockchainBlockNumber); this.logger.debug(`Last block number is updated to: ${this.lastBlockchainBlockNumber}`); }); diff --git a/packages/worker/src/contract/systemContract.service.spec.ts b/packages/worker/src/contract/systemContract.service.spec.ts index 8e07ebaa9..6359fddd7 100644 --- a/packages/worker/src/contract/systemContract.service.spec.ts +++ b/packages/worker/src/contract/systemContract.service.spec.ts @@ -45,15 +45,15 @@ describe("SystemContractService", () => { SystemContractService.getSystemContracts().map((contract) => mock
({ address: contract.address })) ); await systemContractService.addSystemContracts(); - expect(addressRepositoryMock.add).toBeCalledTimes(0); + expect(addressRepositoryMock.upsert).toBeCalledTimes(0); }); it("adds all system contracts if none of them exist in the DB", async () => { (addressRepositoryMock.find as jest.Mock).mockResolvedValue([]); await systemContractService.addSystemContracts(); - expect(addressRepositoryMock.add).toBeCalledTimes(systemContracts.length); + expect(addressRepositoryMock.upsert).toBeCalledTimes(systemContracts.length); for (const systemContract of systemContracts) { - expect(addressRepositoryMock.add).toBeCalledWith({ + expect(addressRepositoryMock.upsert).toBeCalledWith({ address: systemContract.address, bytecode: `${systemContract.address}-code`, }); @@ -69,10 +69,10 @@ describe("SystemContractService", () => { existingContractAddresses.map((existingContractAddress) => mock({ address: existingContractAddress })) ); await systemContractService.addSystemContracts(); - expect(addressRepositoryMock.add).toBeCalledTimes(systemContracts.length - existingContractAddresses.length); + expect(addressRepositoryMock.upsert).toBeCalledTimes(systemContracts.length - existingContractAddresses.length); for (const systemContract of systemContracts) { if (!existingContractAddresses.includes(systemContract.address)) { - expect(addressRepositoryMock.add).toBeCalledWith({ + expect(addressRepositoryMock.upsert).toBeCalledWith({ address: systemContract.address, bytecode: `${systemContract.address}-code`, }); @@ -93,10 +93,10 @@ describe("SystemContractService", () => { return `${address}-code`; }); await systemContractService.addSystemContracts(); - expect(addressRepositoryMock.add).toBeCalledTimes(systemContracts.length - notDeployedSystemContracts.length); + expect(addressRepositoryMock.upsert).toBeCalledTimes(systemContracts.length - notDeployedSystemContracts.length); for (const systemContract of systemContracts) { if (!notDeployedSystemContracts.includes(systemContract.address)) { - expect(addressRepositoryMock.add).toBeCalledWith({ + expect(addressRepositoryMock.upsert).toBeCalledWith({ address: systemContract.address, bytecode: `${systemContract.address}-code`, }); diff --git a/packages/worker/src/contract/systemContract.service.ts b/packages/worker/src/contract/systemContract.service.ts index 09a8b9304..d6b10b1c8 100644 --- a/packages/worker/src/contract/systemContract.service.ts +++ b/packages/worker/src/contract/systemContract.service.ts @@ -26,7 +26,7 @@ export class SystemContractService { const bytecode = await this.blockchainService.getCode(contract.address); // some contract might not exist on the environment yet if (bytecode !== "0x") { - await this.addressRepository.add({ + await this.addressRepository.upsert({ address: contract.address, bytecode, });