@ -3927,6 +3927,13 @@ bool CWallet::ApplyMigrationData(MigrationData& data, bilingual_str& error)
}
}
// Get best block locator so that we can copy it to the watchonly and solvables
CBlockLocator best_block_locator ;
if ( ! WalletBatch ( GetDatabase ( ) ) . ReadBestBlock ( best_block_locator ) ) {
error = _ ( " Error: Unable to read wallet's best block locator record " ) ;
return false ;
}
// Check if the transactions in the wallet are still ours. Either they belong here, or they belong in the watchonly wallet.
// We need to go through these in the tx insertion order so that lookups to spends works.
std : : vector < uint256 > txids_to_delete ;
@ -3937,6 +3944,18 @@ bool CWallet::ApplyMigrationData(MigrationData& data, bilingual_str& error)
LOCK ( data . watchonly_wallet - > cs_wallet ) ;
data . watchonly_wallet - > nOrderPosNext = nOrderPosNext ;
watchonly_batch - > WriteOrderPosNext ( data . watchonly_wallet - > nOrderPosNext ) ;
// Write the best block locator to avoid rescanning on reload
if ( ! watchonly_batch - > WriteBestBlock ( best_block_locator ) ) {
error = _ ( " Error: Unable to write watchonly wallet best block locator record " ) ;
return false ;
}
}
if ( data . solvable_wallet ) {
// Write the best block locator to avoid rescanning on reload
if ( ! WalletBatch ( data . solvable_wallet - > GetDatabase ( ) ) . WriteBestBlock ( best_block_locator ) ) {
error = _ ( " Error: Unable to write solvable wallet best block locator record " ) ;
return false ;
}
}
for ( const auto & [ _pos , wtx ] : wtxOrdered ) {
if ( ! IsMine ( * wtx - > tx ) & & ! IsFromMe ( * wtx - > tx ) ) {