@@ -20,15 +20,17 @@ use crate::config::{
20
20
MWC_WALLET_DIR ,
21
21
} ;
22
22
use crate :: core:: global;
23
- use crate :: keychain:: Keychain ;
23
+ use crate :: keychain:: { ChildNumber , Keychain } ;
24
24
use crate :: libwallet:: swap:: ethereum:: generate_ethereum_wallet;
25
25
use crate :: libwallet:: { Error , NodeClient , WalletBackend , WalletLCProvider } ;
26
26
use crate :: lifecycle:: seed:: WalletSeed ;
27
27
use crate :: util:: secp:: key:: SecretKey ;
28
28
use crate :: util:: ZeroingString ;
29
29
use crate :: LMDBBackend ;
30
- use mwc_wallet_libwallet:: types:: { FLAG_CONTEXT_CLEARED , FLAG_NEW_WALLET } ;
31
- use mwc_wallet_libwallet:: { Context , TxLogEntryType } ;
30
+ use mwc_wallet_libwallet:: types:: {
31
+ FLAG_CONTEXT_CLEARED , FLAG_NEW_WALLET , FLAG_OUTPUTS_ROOT_KEY_ID_CORRECTION ,
32
+ } ;
33
+ use mwc_wallet_libwallet:: { Context , OutputData , TxLogEntryType } ;
32
34
use mwc_wallet_util:: mwc_util:: logger:: LoggingConfig ;
33
35
use std:: collections:: HashMap ;
34
36
use std:: fs;
@@ -302,6 +304,7 @@ where
302
304
let mask = wallet. set_keychain ( Box :: new ( keychain) , create_mask, use_test_rng) ?;
303
305
304
306
{
307
+ // Cleaning dangling contexts.
305
308
let mut batch = wallet. batch ( mask. as_ref ( ) ) ?;
306
309
if !batch. load_flag ( FLAG_CONTEXT_CLEARED , false ) ? {
307
310
let mut contexts: HashMap < Uuid , Context > = batch
@@ -333,6 +336,31 @@ where
333
336
batch. commit ( ) ?;
334
337
}
335
338
339
+ {
340
+ // Cleaning broken root_key_id from outputs. It is old bug that was fixed on Sept 2024, but the data was never fixed.
341
+ let mut batch = wallet. batch ( mask. as_ref ( ) ) ?;
342
+ if !batch. load_flag ( FLAG_OUTPUTS_ROOT_KEY_ID_CORRECTION , false ) ? {
343
+ let broken_outputs: Vec < OutputData > = batch
344
+ . iter ( )
345
+ . filter ( |o| {
346
+ // We need to fix last element of path if it is not 0
347
+ let path = o. root_key_id . to_path ( ) ;
348
+ let last_id = u32:: from ( path. path [ 3 ] ) ;
349
+ last_id != 0
350
+ } )
351
+ . collect ( ) ;
352
+
353
+ for mut out in broken_outputs {
354
+ let mut path = out. root_key_id . to_path ( ) ;
355
+ path. path [ 3 ] = ChildNumber :: from ( 0 ) ;
356
+ out. root_key_id = path. to_identifier ( ) ;
357
+ batch. save ( out) ?;
358
+ }
359
+ batch. save_flag ( FLAG_OUTPUTS_ROOT_KEY_ID_CORRECTION ) ?;
360
+ }
361
+ batch. commit ( ) ?;
362
+ }
363
+
336
364
self . backend = Some ( Box :: new ( wallet) ) ;
337
365
Ok ( mask)
338
366
}
0 commit comments