@@ -246,9 +246,9 @@ pub enum LoadMismatch {
246246 /// Keychain identifying the descriptor.
247247 keychain : KeychainKind ,
248248 /// The loaded descriptor.
249- loaded : ExtendedDescriptor ,
249+ loaded : Option < ExtendedDescriptor > ,
250250 /// The expected descriptor.
251- expected : ExtendedDescriptor ,
251+ expected : Option < ExtendedDescriptor > ,
252252 } ,
253253}
254254
@@ -401,11 +401,15 @@ impl Wallet {
401401 ) ) ;
402402
403403 let ( change_descriptor, change_signers) = match params. change_descriptor {
404- Some ( desc_fn) => {
405- let ( descriptor, mut keymap) = desc_fn ( & secp, network) ?;
406- keymap. extend ( params. change_descriptor_keymap ) ;
407- let change_signers = Arc :: new ( SignersContainer :: build ( keymap, & descriptor, & secp) ) ;
408- ( Some ( descriptor) , change_signers)
404+ Some ( make_desc) => {
405+ let ( change_descriptor, mut internal_keymap) = make_desc ( & secp, network) ?;
406+ internal_keymap. extend ( params. change_descriptor_keymap ) ;
407+ let change_signers = Arc :: new ( SignersContainer :: build (
408+ internal_keymap,
409+ & change_descriptor,
410+ & secp,
411+ ) ) ;
412+ ( Some ( change_descriptor) , change_signers)
409413 }
410414 None => ( None , Arc :: new ( SignersContainer :: new ( ) ) ) ,
411415 } ;
@@ -442,7 +446,7 @@ impl Wallet {
442446 /// Note that the descriptor secret keys are not persisted to the db. You can either add
443447 /// signers after-the-fact with [`Wallet::add_signer`] or [`Wallet::set_keymap`]. Or you can
444448 /// add keys when building the wallet using [`LoadParams::keymap`] and/or
445- /// [`LoadParams::descriptors `].
449+ /// [`LoadParams::descriptor `].
446450 ///
447451 /// # Synopsis
448452 ///
@@ -467,7 +471,9 @@ impl Wallet {
467471 /// let mut conn = bdk_wallet::rusqlite::Connection::open(file_path)?;
468472 /// let mut wallet = Wallet::load()
469473 /// // check loaded descriptors matches these values and extract private keys
470- /// .descriptors(EXTERNAL_DESC, INTERNAL_DESC)
474+ /// .descriptor(KeychainKind::External, Some(EXTERNAL_DESC))
475+ /// .descriptor(KeychainKind::Internal, Some(INTERNAL_DESC))
476+ /// .extract_keys()
471477 /// // you can also manually add private keys
472478 /// .keymap(KeychainKind::External, external_keymap)
473479 /// .keymap(KeychainKind::Internal, internal_keymap)
@@ -499,42 +505,6 @@ impl Wallet {
499505 let chain = LocalChain :: from_changeset ( changeset. local_chain )
500506 . map_err ( |_| LoadError :: MissingGenesis ) ?;
501507
502- let mut descriptor_keymap = params. descriptor_keymap ;
503- let descriptor = changeset
504- . descriptor
505- . ok_or ( LoadError :: MissingDescriptor ( KeychainKind :: External ) ) ?;
506- check_wallet_descriptor ( & descriptor) . map_err ( LoadError :: Descriptor ) ?;
507-
508- let ( change_descriptor, change_signers) = match changeset. change_descriptor {
509- Some ( change_descriptor) => {
510- check_wallet_descriptor ( & change_descriptor) . map_err ( LoadError :: Descriptor ) ?;
511- let mut change_descriptor_keymap = params. change_descriptor_keymap ;
512-
513- // check params match loaded
514- if let Some ( exp_change_descriptor) = params. check_change_descriptor {
515- let ( exp_change_descriptor, keymap) =
516- ( exp_change_descriptor) ( & secp, network) . map_err ( LoadError :: Descriptor ) ?;
517- change_descriptor_keymap. extend ( keymap) ;
518-
519- if change_descriptor. descriptor_id ( ) != exp_change_descriptor. descriptor_id ( ) {
520- return Err ( LoadError :: Mismatch ( LoadMismatch :: Descriptor {
521- keychain : KeychainKind :: Internal ,
522- loaded : change_descriptor,
523- expected : exp_change_descriptor,
524- } ) ) ;
525- }
526- }
527- let change_signers = Arc :: new ( SignersContainer :: build (
528- change_descriptor_keymap,
529- & change_descriptor,
530- & secp,
531- ) ) ;
532- ( Some ( change_descriptor) , change_signers)
533- }
534- None => ( None , Arc :: new ( SignersContainer :: new ( ) ) ) ,
535- } ;
536-
537- // checks
538508 if let Some ( exp_network) = params. check_network {
539509 if network != exp_network {
540510 return Err ( LoadError :: Mismatch ( LoadMismatch :: Network {
@@ -551,25 +521,88 @@ impl Wallet {
551521 } ) ) ;
552522 }
553523 }
554- if let Some ( exp_descriptor) = params. check_descriptor {
555- let ( exp_descriptor, keymap) =
556- ( exp_descriptor) ( & secp, network) . map_err ( LoadError :: Descriptor ) ?;
557- descriptor_keymap. extend ( keymap) ;
558524
559- if descriptor. descriptor_id ( ) != exp_descriptor. descriptor_id ( ) {
525+ let descriptor = changeset
526+ . descriptor
527+ . ok_or ( LoadError :: MissingDescriptor ( KeychainKind :: External ) ) ?;
528+ check_wallet_descriptor ( & descriptor) . map_err ( LoadError :: Descriptor ) ?;
529+ let mut external_keymap = params. descriptor_keymap ;
530+
531+ if let Some ( expected) = params. check_descriptor {
532+ if let Some ( make_desc) = expected {
533+ let ( exp_desc, keymap) =
534+ make_desc ( & secp, network) . map_err ( LoadError :: Descriptor ) ?;
535+ if descriptor. descriptor_id ( ) != exp_desc. descriptor_id ( ) {
536+ return Err ( LoadError :: Mismatch ( LoadMismatch :: Descriptor {
537+ keychain : KeychainKind :: External ,
538+ loaded : Some ( descriptor) ,
539+ expected : Some ( exp_desc) ,
540+ } ) ) ;
541+ }
542+ if params. extract_keys {
543+ external_keymap. extend ( keymap) ;
544+ }
545+ } else {
560546 return Err ( LoadError :: Mismatch ( LoadMismatch :: Descriptor {
561547 keychain : KeychainKind :: External ,
562- loaded : descriptor,
563- expected : exp_descriptor ,
548+ loaded : Some ( descriptor) ,
549+ expected : None ,
564550 } ) ) ;
565551 }
566552 }
553+ let signers = Arc :: new ( SignersContainer :: build ( external_keymap, & descriptor, & secp) ) ;
554+
555+ let ( mut change_descriptor, mut change_signers) = ( None , Arc :: new ( SignersContainer :: new ( ) ) ) ;
556+ match ( changeset. change_descriptor , params. check_change_descriptor ) {
557+ // empty signer
558+ ( None , None ) => { }
559+ ( None , Some ( expect) ) => {
560+ // expected desc but none loaded
561+ if let Some ( make_desc) = expect {
562+ let ( exp_desc, _) = make_desc ( & secp, network) . map_err ( LoadError :: Descriptor ) ?;
563+ return Err ( LoadError :: Mismatch ( LoadMismatch :: Descriptor {
564+ keychain : KeychainKind :: Internal ,
565+ loaded : None ,
566+ expected : Some ( exp_desc) ,
567+ } ) ) ;
568+ }
569+ }
570+ // nothing expected
571+ ( Some ( desc) , None ) => {
572+ check_wallet_descriptor ( & desc) . map_err ( LoadError :: Descriptor ) ?;
573+ change_descriptor = Some ( desc) ;
574+ }
575+ ( Some ( desc) , Some ( expect) ) => match expect {
576+ // expected none for existing
577+ None => {
578+ return Err ( LoadError :: Mismatch ( LoadMismatch :: Descriptor {
579+ keychain : KeychainKind :: Internal ,
580+ loaded : Some ( desc) ,
581+ expected : None ,
582+ } ) )
583+ }
584+ // parameters must match
585+ Some ( make_desc) => {
586+ let ( exp_desc, keymap) =
587+ make_desc ( & secp, network) . map_err ( LoadError :: Descriptor ) ?;
588+ if desc. descriptor_id ( ) != exp_desc. descriptor_id ( ) {
589+ return Err ( LoadError :: Mismatch ( LoadMismatch :: Descriptor {
590+ keychain : KeychainKind :: Internal ,
591+ loaded : Some ( desc) ,
592+ expected : Some ( exp_desc) ,
593+ } ) ) ;
594+ }
595+ let mut internal_keymap = params. change_descriptor_keymap ;
596+ if params. extract_keys {
597+ internal_keymap. extend ( keymap) ;
598+ }
599+ change_signers =
600+ Arc :: new ( SignersContainer :: build ( internal_keymap, & desc, & secp) ) ;
601+ change_descriptor = Some ( desc) ;
602+ }
603+ } ,
604+ }
567605
568- let signers = Arc :: new ( SignersContainer :: build (
569- descriptor_keymap,
570- & descriptor,
571- & secp,
572- ) ) ;
573606 let index = create_indexer ( descriptor, change_descriptor, params. lookahead )
574607 . map_err ( LoadError :: Descriptor ) ?;
575608
0 commit comments