@@ -236,36 +236,41 @@ class ErgoWalletActor(settings: ErgoSettings,
236236 val newState = state.copy(offChainRegistry = newOffChainRegistry)
237237 context.become(loadedWallet(newState))
238238
239- case ScanInputBlock (inputBlockId, txs ) =>
239+ case ScanInputBlock (inputBlockId) =>
240240 if (state.inputBlockIds.contains(inputBlockId)) {
241241 log.warn(s " Ignoring duplicate ScanInputBlock for $inputBlockId" )
242242 } else {
243- val dustLimit = settings.walletSettings.dustLimit
244-
245- // Process all transactions atomically and record the net diff for rollback support
246- val (finalRegistry, allAdded, allRemovedOffChain, allRemovedOnChain) =
247- txs.foldLeft(
248- (state.offChainRegistry, Seq .empty[TrackedBox ], Seq .empty[TrackedBox ], Seq .empty[Balance ])
249- ) { case ((registry, addedAcc, removedOffAcc, removedOnAcc), tx) =>
250- val newWalletBoxes = WalletScanLogic .extractWalletOutputs(tx, None , state.walletVars, dustLimit)
251- val inputs = WalletScanLogic .extractInputBoxes(tx)
252- val (newRegistry, removedOff, removedOn) =
253- registry.updateOnTransactionWithDiff(newWalletBoxes, inputs, state.walletVars.externalScans)
254- (newRegistry, addedAcc ++ newWalletBoxes, removedOffAcc ++ removedOff, removedOnAcc ++ removedOn)
255- }
243+ historyReader.getInputBlockTransactions(inputBlockId) match {
244+ case Some (txs) =>
245+ val dustLimit = settings.walletSettings.dustLimit
246+
247+ // Process all transactions atomically and record the net diff for rollback support
248+ val (finalRegistry, allAdded, allRemovedOffChain, allRemovedOnChain) =
249+ txs.foldLeft(
250+ (state.offChainRegistry, Seq .empty[TrackedBox ], Seq .empty[TrackedBox ], Seq .empty[Balance ])
251+ ) { case ((registry, addedAcc, removedOffAcc, removedOnAcc), tx) =>
252+ val newWalletBoxes = WalletScanLogic .extractWalletOutputs(tx, None , state.walletVars, dustLimit)
253+ val inputs = WalletScanLogic .extractInputBoxes(tx)
254+ val (newRegistry, removedOff, removedOn) =
255+ registry.updateOnTransactionWithDiff(newWalletBoxes, inputs, state.walletVars.externalScans)
256+ (newRegistry, addedAcc ++ newWalletBoxes, removedOffAcc ++ removedOff, removedOnAcc ++ removedOn)
257+ }
256258
257- val diff = InputBlockDiff (allAdded, allRemovedOffChain, allRemovedOnChain)
258- val registryWithDiff = finalRegistry.copy(
259- inputBlockDiffs = finalRegistry.inputBlockDiffs + (inputBlockId -> diff)
260- )
261-
262- val newInputBlockIds = state.inputBlockIds :+ inputBlockId
263- val baseState = state.copy(
264- offChainRegistry = registryWithDiff,
265- inputBlockIds = newInputBlockIds
266- )
267- val newState = ergoWalletService.updateUtxoState(baseState, historyReader)
268- context.become(loadedWallet(newState))
259+ val diff = InputBlockDiff (allAdded, allRemovedOffChain, allRemovedOnChain)
260+ val registryWithDiff = finalRegistry.copy(
261+ inputBlockDiffs = finalRegistry.inputBlockDiffs + (inputBlockId -> diff)
262+ )
263+
264+ val newInputBlockIds = state.inputBlockIds :+ inputBlockId
265+ val baseState = state.copy(
266+ offChainRegistry = registryWithDiff,
267+ inputBlockIds = newInputBlockIds
268+ )
269+ val newState = ergoWalletService.updateUtxoState(baseState, historyReader)
270+ context.become(loadedWallet(newState))
271+ case None =>
272+ log.warn(s " No transactions found for input block $inputBlockId" )
273+ }
269274 }
270275
271276 case RollbackInputBlock (inputBlockId) =>
@@ -274,11 +279,12 @@ class ErgoWalletActor(settings: ErgoSettings,
274279 // we must rollback the target block AND all blocks that were added after it.
275280 val keepIndex = state.inputBlockIds.indexOf(inputBlockId)
276281 val (newInputBlockIds, newRegistry) = if (keepIndex >= 0 ) {
277- val blocksToRollback = state.inputBlockIds.drop(keepIndex)
282+ val rolledBackIds = state.inputBlockIds.drop(keepIndex)
278283 // Rollback in reverse chronological order (last block first) to maintain consistency
279- val rolledBackRegistry = blocksToRollback .reverse.foldLeft(state.offChainRegistry) { (reg, blockId) =>
284+ val rolledBackRegistry = rolledBackIds .reverse.foldLeft(state.offChainRegistry) { (reg, blockId) =>
280285 reg.rollbackInputBlock(blockId)
281286 }
287+ log.info(s " Rolled back input blocks: ${rolledBackIds.mkString(" , " )}" )
282288 (state.inputBlockIds.take(keepIndex), rolledBackRegistry)
283289 } else {
284290 // Block not found, nothing to rollback
0 commit comments