17
17
use std:: collections:: { BTreeMap , HashSet } ;
18
18
use std:: ops:: Deref ;
19
19
20
- use bitcoin:: { secp256k1, XOnlyPublicKey , PublicKey } ;
21
20
use bitcoin:: util:: bip32:: { ChildNumber , DerivationPath , ExtendedPubKey , Fingerprint , KeySource } ;
22
21
use bitcoin:: util:: { psbt, taproot} ;
22
+ use bitcoin:: { secp256k1, PublicKey , XOnlyPublicKey } ;
23
23
use bitcoin:: { Network , Script , TxOut } ;
24
24
25
25
use miniscript:: descriptor:: { DescriptorType , InnerXKey , SinglePubKey } ;
@@ -327,7 +327,11 @@ pub(crate) trait DescriptorMeta {
327
327
tap_key_origins : & TapKeyOrigins ,
328
328
secp : & ' s SecpCtx ,
329
329
) -> Option < DerivedDescriptor < ' s > > ;
330
- fn derive_from_psbt_key_origins < ' s > ( & self , key_origins : BTreeMap < Fingerprint , ( & DerivationPath , SinglePubKey ) > , secp : & ' s SecpCtx ) -> Option < DerivedDescriptor < ' s > > ;
330
+ fn derive_from_psbt_key_origins < ' s > (
331
+ & self ,
332
+ key_origins : BTreeMap < Fingerprint , ( & DerivationPath , SinglePubKey ) > ,
333
+ secp : & ' s SecpCtx ,
334
+ ) -> Option < DerivedDescriptor < ' s > > ;
331
335
fn derive_from_psbt_input < ' s > (
332
336
& self ,
333
337
psbt_input : & psbt:: Input ,
@@ -396,10 +400,20 @@ impl DescriptorMeta for ExtendedDescriptor {
396
400
Ok ( answer)
397
401
}
398
402
399
- fn derive_from_psbt_key_origins < ' s > ( & self , key_origins : BTreeMap < Fingerprint , ( & DerivationPath , SinglePubKey ) > , secp : & ' s SecpCtx ) -> Option < DerivedDescriptor < ' s > > {
403
+ fn derive_from_psbt_key_origins < ' s > (
404
+ & self ,
405
+ key_origins : BTreeMap < Fingerprint , ( & DerivationPath , SinglePubKey ) > ,
406
+ secp : & ' s SecpCtx ,
407
+ ) -> Option < DerivedDescriptor < ' s > > {
400
408
// Ensure that deriving `xpub` with `path` yields `expected`
401
- let verify_key = |xpub : & DescriptorXKey < ExtendedPubKey > , path : & DerivationPath , expected : & SinglePubKey | {
402
- let derived = xpub. xkey . derive_pub ( secp, path) . expect ( "The path should never contain hardened derivation steps" ) . public_key ;
409
+ let verify_key = |xpub : & DescriptorXKey < ExtendedPubKey > ,
410
+ path : & DerivationPath ,
411
+ expected : & SinglePubKey | {
412
+ let derived = xpub
413
+ . xkey
414
+ . derive_pub ( secp, path)
415
+ . expect ( "The path should never contain hardened derivation steps" )
416
+ . public_key ;
403
417
404
418
match expected {
405
419
SinglePubKey :: FullKey ( pk) if & PublicKey :: new ( derived) == pk => true ,
@@ -421,10 +435,12 @@ impl DescriptorMeta for ExtendedDescriptor {
421
435
let derive_path = key_origins
422
436
. get_key_value ( & root_fingerprint)
423
437
. and_then ( |( fingerprint, ( path, expected) ) | {
424
- xpub. matches ( & ( * fingerprint, ( * path) . clone ( ) ) , secp) . zip ( Some ( ( path, expected) ) )
438
+ xpub. matches ( & ( * fingerprint, ( * path) . clone ( ) ) , secp)
439
+ . zip ( Some ( ( path, expected) ) )
425
440
} )
426
441
. and_then ( |( prefix, ( full_path, expected) ) | {
427
- let derive_path = full_path. into_iter ( )
442
+ let derive_path = full_path
443
+ . into_iter ( )
428
444
. skip ( prefix. into_iter ( ) . count ( ) )
429
445
. cloned ( )
430
446
. collect :: < DerivationPath > ( ) ;
@@ -433,10 +449,18 @@ impl DescriptorMeta for ExtendedDescriptor {
433
449
// an empty path for fixed descriptors. To verify the key we also need the normal steps
434
450
// that come before the wildcard, so we take them directly from `xpub` and then append
435
451
// the final index
436
- if verify_key ( xpub, & xpub. derivation_path . extend ( derive_path. clone ( ) ) , expected) {
452
+ if verify_key (
453
+ xpub,
454
+ & xpub. derivation_path . extend ( derive_path. clone ( ) ) ,
455
+ expected,
456
+ ) {
437
457
Some ( derive_path)
438
458
} else {
439
- log:: debug!( "Key `{}` derived with {} yields an unexpected key" , root_fingerprint, derive_path) ;
459
+ log:: debug!(
460
+ "Key `{}` derived with {} yields an unexpected key" ,
461
+ root_fingerprint,
462
+ derive_path
463
+ ) ;
440
464
None
441
465
}
442
466
} ) ;
@@ -472,7 +496,10 @@ impl DescriptorMeta for ExtendedDescriptor {
472
496
let key_origins = hd_keypaths
473
497
. iter ( )
474
498
. map ( |( pk, ( fingerprint, path) ) | {
475
- ( * fingerprint, ( path, SinglePubKey :: FullKey ( PublicKey :: new ( * pk) ) ) )
499
+ (
500
+ * fingerprint,
501
+ ( path, SinglePubKey :: FullKey ( PublicKey :: new ( * pk) ) ) ,
502
+ )
476
503
} )
477
504
. collect ( ) ;
478
505
self . derive_from_psbt_key_origins ( key_origins, secp)
@@ -486,9 +513,7 @@ impl DescriptorMeta for ExtendedDescriptor {
486
513
// "Convert" a tap_key_origins map to the format required by `derive_from_psbt_key_origins`
487
514
let key_origins = tap_key_origins
488
515
. iter ( )
489
- . map ( |( pk, ( _, ( fingerprint, path) ) ) | {
490
- ( * fingerprint, ( path, SinglePubKey :: XOnly ( * pk) ) )
491
- } )
516
+ . map ( |( pk, ( _, ( fingerprint, path) ) ) | ( * fingerprint, ( path, SinglePubKey :: XOnly ( * pk) ) ) )
492
517
. collect ( ) ;
493
518
self . derive_from_psbt_key_origins ( key_origins, secp)
494
519
}
0 commit comments