diff --git a/state-recovery/appcore/logic/src/main/kotlin/linea/staterecovery/StateSynchronizerService.kt b/state-recovery/appcore/logic/src/main/kotlin/linea/staterecovery/StateSynchronizerService.kt index 9ab28c260..b6e359eb1 100644 --- a/state-recovery/appcore/logic/src/main/kotlin/linea/staterecovery/StateSynchronizerService.kt +++ b/state-recovery/appcore/logic/src/main/kotlin/linea/staterecovery/StateSynchronizerService.kt @@ -121,31 +121,43 @@ class StateSynchronizerService( private fun updateNodeWithBlobsAndVerifyState( dataSubmissions: List, dataFinalizedV3: DataFinalizedV3 - ): SafeFuture { + ): SafeFuture { return blobDecompressor .decompress( startBlockNumber = dataFinalizedV3.startBlockNumber, blobs = dataSubmissions.flatMap { it.blobs } ) .thenCompose(this::filterOutBlocksAlreadyImportedAndBeyondStopSync) - .thenCompose { decompressedBlocks: List -> - val blockInterval = CommonDomainFunctions.blockIntervalString( - decompressedBlocks.first().header.blockNumber, - decompressedBlocks.last().header.blockNumber - ) - log.debug("importing blocks={} from finalization={}", blockInterval, dataFinalizedV3.intervalString()) - blockImporterAndStateVerifier - .importBlocks(decompressedBlocks) - .thenCompose { importResult -> - log.debug("imported blocks={}", dataFinalizedV3.intervalString()) - assertStateMatches(importResult, dataFinalizedV3) - } - .thenApply { - BlockNumberAndHash( - number = decompressedBlocks.last().header.blockNumber, - hash = decompressedBlocks.last().header.blockHash - ) - } + + .thenCompose { decompressedBlocksToImport: List -> + if (decompressedBlocksToImport.isEmpty()) { + log.info( + "stopping recovery synch: imported all blocks up to debugForceSyncStopBlockNumber={} finalization={}", + debugForceSyncStopBlockNumber, + dataFinalizedV3.intervalString() + ) + this.stop() + SafeFuture.completedFuture(null) + } else { + importBlocksAndAssertStateroot(decompressedBlocksToImport, dataFinalizedV3) + } + } + } + + private fun importBlocksAndAssertStateroot( + decompressedBlocksToImport: List, + dataFinalizedV3: DataFinalizedV3 + ): SafeFuture { + val blockInterval = CommonDomainFunctions.blockIntervalString( + decompressedBlocksToImport.first().header.blockNumber, + decompressedBlocksToImport.last().header.blockNumber + ) + log.debug("importing blocks={} from finalization={}", blockInterval, dataFinalizedV3.intervalString()) + return blockImporterAndStateVerifier + .importBlocks(decompressedBlocksToImport) + .thenCompose { importResult -> + log.debug("imported blocks={}", dataFinalizedV3.intervalString()) + assertStateMatches(importResult, dataFinalizedV3) } }