@@ -293,6 +293,8 @@ pub enum LoadError<L> {
293293 Descriptor ( crate :: descriptor:: DescriptorError ) ,
294294 /// Loading data from the persistence backend failed.
295295 Load ( L ) ,
296+ /// Wallet not initialized, persistence backend is empty.
297+ NotInitialized ,
296298 /// Data loaded from persistence is missing network type.
297299 MissingNetwork ,
298300 /// Data loaded from persistence is missing genesis hash.
@@ -307,6 +309,9 @@ where
307309 match self {
308310 LoadError :: Descriptor ( e) => e. fmt ( f) ,
309311 LoadError :: Load ( e) => e. fmt ( f) ,
312+ LoadError :: NotInitialized => {
313+ write ! ( f, "wallet is not initialized, persistence backend is empty" )
314+ }
310315 LoadError :: MissingNetwork => write ! ( f, "loaded data is missing network type" ) ,
311316 LoadError :: MissingGenesis => write ! ( f, "loaded data is missing genesis hash" ) ,
312317 }
@@ -330,6 +335,8 @@ pub enum NewOrLoadError<W, L> {
330335 Write ( W ) ,
331336 /// Loading from the persistence backend failed.
332337 Load ( L ) ,
338+ /// Wallet is not initialized, persistence backend is empty.
339+ NotInitialized ,
333340 /// The loaded genesis hash does not match what was provided.
334341 LoadedGenesisDoesNotMatch {
335342 /// The expected genesis block hash.
@@ -356,6 +363,9 @@ where
356363 NewOrLoadError :: Descriptor ( e) => e. fmt ( f) ,
357364 NewOrLoadError :: Write ( e) => write ! ( f, "failed to write to persistence: {}" , e) ,
358365 NewOrLoadError :: Load ( e) => write ! ( f, "failed to load from persistence: {}" , e) ,
366+ NewOrLoadError :: NotInitialized => {
367+ write ! ( f, "wallet is not initialized, persistence backend is empty" )
368+ }
359369 NewOrLoadError :: LoadedGenesisDoesNotMatch { expected, got } => {
360370 write ! ( f, "loaded genesis hash is not {}, got {:?}" , expected, got)
361371 }
@@ -451,11 +461,26 @@ impl<D> Wallet<D> {
451461 change_descriptor : Option < E > ,
452462 mut db : D ,
453463 ) -> Result < Self , LoadError < D :: LoadError > >
464+ where
465+ D : PersistBackend < ChangeSet > ,
466+ {
467+ let changeset = db
468+ . load_from_persistence ( )
469+ . map_err ( LoadError :: Load ) ?
470+ . ok_or ( LoadError :: NotInitialized ) ?;
471+ Self :: load_from_changeset ( descriptor, change_descriptor, db, changeset)
472+ }
473+
474+ fn load_from_changeset < E : IntoWalletDescriptor > (
475+ descriptor : E ,
476+ change_descriptor : Option < E > ,
477+ db : D ,
478+ changeset : ChangeSet ,
479+ ) -> Result < Self , LoadError < D :: LoadError > >
454480 where
455481 D : PersistBackend < ChangeSet > ,
456482 {
457483 let secp = Secp256k1 :: new ( ) ;
458- let changeset = db. load_from_persistence ( ) . map_err ( LoadError :: Load ) ?;
459484 let network = changeset. network . ok_or ( LoadError :: MissingNetwork ) ?;
460485 let chain =
461486 LocalChain :: from_changeset ( changeset. chain ) . map_err ( |_| LoadError :: MissingGenesis ) ?;
@@ -517,8 +542,43 @@ impl<D> Wallet<D> {
517542 where
518543 D : PersistBackend < ChangeSet > ,
519544 {
520- if db. is_empty ( ) . map_err ( NewOrLoadError :: Load ) ? {
521- return Self :: new_with_genesis_hash (
545+ let changeset = db. load_from_persistence ( ) . map_err ( NewOrLoadError :: Load ) ?;
546+ match changeset {
547+ Some ( changeset) => {
548+ let wallet =
549+ Self :: load_from_changeset ( descriptor, change_descriptor, db, changeset)
550+ . map_err ( |e| match e {
551+ LoadError :: Descriptor ( e) => NewOrLoadError :: Descriptor ( e) ,
552+ LoadError :: Load ( e) => NewOrLoadError :: Load ( e) ,
553+ LoadError :: NotInitialized => NewOrLoadError :: NotInitialized ,
554+ LoadError :: MissingNetwork => {
555+ NewOrLoadError :: LoadedNetworkDoesNotMatch {
556+ expected : network,
557+ got : None ,
558+ }
559+ }
560+ LoadError :: MissingGenesis => {
561+ NewOrLoadError :: LoadedGenesisDoesNotMatch {
562+ expected : genesis_hash,
563+ got : None ,
564+ }
565+ }
566+ } ) ?;
567+ if wallet. network != network {
568+ return Err ( NewOrLoadError :: LoadedNetworkDoesNotMatch {
569+ expected : network,
570+ got : Some ( wallet. network ) ,
571+ } ) ;
572+ }
573+ if wallet. chain . genesis_hash ( ) != genesis_hash {
574+ return Err ( NewOrLoadError :: LoadedGenesisDoesNotMatch {
575+ expected : genesis_hash,
576+ got : Some ( wallet. chain . genesis_hash ( ) ) ,
577+ } ) ;
578+ }
579+ Ok ( wallet)
580+ }
581+ None => Self :: new_with_genesis_hash (
522582 descriptor,
523583 change_descriptor,
524584 db,
@@ -528,34 +588,8 @@ impl<D> Wallet<D> {
528588 . map_err ( |e| match e {
529589 NewError :: Descriptor ( e) => NewOrLoadError :: Descriptor ( e) ,
530590 NewError :: Write ( e) => NewOrLoadError :: Write ( e) ,
531- } ) ;
532- }
533-
534- let wallet = Self :: load ( descriptor, change_descriptor, db) . map_err ( |e| match e {
535- LoadError :: Descriptor ( e) => NewOrLoadError :: Descriptor ( e) ,
536- LoadError :: Load ( e) => NewOrLoadError :: Load ( e) ,
537- LoadError :: MissingNetwork => NewOrLoadError :: LoadedNetworkDoesNotMatch {
538- expected : network,
539- got : None ,
540- } ,
541- LoadError :: MissingGenesis => NewOrLoadError :: LoadedGenesisDoesNotMatch {
542- expected : genesis_hash,
543- got : None ,
544- } ,
545- } ) ?;
546- if wallet. network != network {
547- return Err ( NewOrLoadError :: LoadedNetworkDoesNotMatch {
548- expected : network,
549- got : Some ( wallet. network ) ,
550- } ) ;
551- }
552- if wallet. chain . genesis_hash ( ) != genesis_hash {
553- return Err ( NewOrLoadError :: LoadedGenesisDoesNotMatch {
554- expected : genesis_hash,
555- got : Some ( wallet. chain . genesis_hash ( ) ) ,
556- } ) ;
591+ } ) ,
557592 }
558- Ok ( wallet)
559593 }
560594
561595 /// Get the Bitcoin network the wallet is using.
0 commit comments