@@ -246,9 +246,9 @@ pub enum LoadMismatch {
246
246
/// Keychain identifying the descriptor.
247
247
keychain : KeychainKind ,
248
248
/// The loaded descriptor.
249
- loaded : ExtendedDescriptor ,
249
+ loaded : Option < ExtendedDescriptor > ,
250
250
/// The expected descriptor.
251
- expected : ExtendedDescriptor ,
251
+ expected : Option < ExtendedDescriptor > ,
252
252
} ,
253
253
}
254
254
@@ -401,11 +401,15 @@ impl Wallet {
401
401
) ) ;
402
402
403
403
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)
409
413
}
410
414
None => ( None , Arc :: new ( SignersContainer :: new ( ) ) ) ,
411
415
} ;
@@ -442,7 +446,7 @@ impl Wallet {
442
446
/// Note that the descriptor secret keys are not persisted to the db. You can either add
443
447
/// signers after-the-fact with [`Wallet::add_signer`] or [`Wallet::set_keymap`]. Or you can
444
448
/// add keys when building the wallet using [`LoadParams::keymap`] and/or
445
- /// [`LoadParams::descriptors `].
449
+ /// [`LoadParams::descriptor `].
446
450
///
447
451
/// # Synopsis
448
452
///
@@ -467,7 +471,9 @@ impl Wallet {
467
471
/// let mut conn = bdk_wallet::rusqlite::Connection::open(file_path)?;
468
472
/// let mut wallet = Wallet::load()
469
473
/// // 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()
471
477
/// // you can also manually add private keys
472
478
/// .keymap(KeychainKind::External, external_keymap)
473
479
/// .keymap(KeychainKind::Internal, internal_keymap)
@@ -499,42 +505,6 @@ impl Wallet {
499
505
let chain = LocalChain :: from_changeset ( changeset. local_chain )
500
506
. map_err ( |_| LoadError :: MissingGenesis ) ?;
501
507
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
538
508
if let Some ( exp_network) = params. check_network {
539
509
if network != exp_network {
540
510
return Err ( LoadError :: Mismatch ( LoadMismatch :: Network {
@@ -551,25 +521,88 @@ impl Wallet {
551
521
} ) ) ;
552
522
}
553
523
}
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) ;
558
524
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 {
560
546
return Err ( LoadError :: Mismatch ( LoadMismatch :: Descriptor {
561
547
keychain : KeychainKind :: External ,
562
- loaded : descriptor,
563
- expected : exp_descriptor ,
548
+ loaded : Some ( descriptor) ,
549
+ expected : None ,
564
550
} ) ) ;
565
551
}
566
552
}
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
+ }
567
605
568
- let signers = Arc :: new ( SignersContainer :: build (
569
- descriptor_keymap,
570
- & descriptor,
571
- & secp,
572
- ) ) ;
573
606
let index = create_indexer ( descriptor, change_descriptor, params. lookahead )
574
607
. map_err ( LoadError :: Descriptor ) ?;
575
608
0 commit comments