@@ -469,4 +469,38 @@ mod tests {
469
469
} ;
470
470
test. check ( & secp) ;
471
471
}
472
+
473
+ #[ test]
474
+ fn descriptor_wildcard ( ) {
475
+ let secp = secp256k1_zkp:: Secp256k1 :: new ( ) ;
476
+ let params = & elements:: AddressParams :: ELEMENTS ;
477
+
478
+ let xprv = "xprv9s21ZrQH143K28NgQ7bHCF61hy9VzwquBZvpzTwXLsbmQLRJ6iV9k2hUBRt5qzmBaSpeMj5LdcsHaXJvM7iFEivPryRcL8irN7Na9p65UUb" ;
479
+ let xpub = "xpub661MyMwAqRbcEcT9W98HZP2kFzyzQQZkYnrRnrM8uD8kH8kSeFoQHq1x2iihLgC6PXGy5LrjCL66uSNhJ8pwjfx2rMUTLWuRMns2EG9xnjs" ;
480
+ let desc_view_str = format ! ( "ct({}/*,elwpkh({}/*))#wk8ltq6h" , xprv, xpub) ;
481
+ let desc_bare_str = format ! ( "ct({}/*,elwpkh({}/*))#zzac2dpf" , xpub, xpub) ;
482
+ let index = 1 ;
483
+ let conf_addr = "el1qqf6690fpw2y00hv5a84zsydjgztg2089d5xnll4k4cstzn63uvgudd907qpvlvvwd5ym9gx7j0v46elf23kfxunucm6ejjyk0" ;
484
+ let unconf_addr = "ert1qkjhlqqk0kx8x6zdj5r0f8k2avl54gmyn7qjk2k" ;
485
+
486
+ let desc_view = Descriptor :: < DescriptorPublicKey > :: from_str ( & desc_view_str) . unwrap ( ) ;
487
+ let desc_bare = Descriptor :: < DescriptorPublicKey > :: from_str ( & desc_bare_str) . unwrap ( ) ;
488
+ let definite_desc_view = desc_view. at_derivation_index ( index) . unwrap ( ) ;
489
+ let definite_desc_bare = desc_bare. at_derivation_index ( index) . unwrap ( ) ;
490
+ assert_eq ! ( definite_desc_view. address( & secp, params) . unwrap( ) . to_string( ) , conf_addr. to_string( ) ) ;
491
+ assert_eq ! ( definite_desc_bare. address( & secp, params) . unwrap( ) . to_string( ) , conf_addr. to_string( ) ) ;
492
+ assert_eq ! ( definite_desc_view. unconfidential_address( params) . unwrap( ) . to_string( ) , unconf_addr. to_string( ) ) ;
493
+ assert_eq ! ( definite_desc_bare. unconfidential_address( params) . unwrap( ) . to_string( ) , unconf_addr. to_string( ) ) ;
494
+
495
+ // It's not possible to get an address if the blinding key has a wildcard,
496
+ // because the descriptor blinding key is not *definite*,
497
+ // but we can't enforce this with the Descriptor generic.
498
+ let desc_view_str = format ! ( "ct({}/*,elwpkh({}))#ls6mx2ac" , xprv, xpub) ;
499
+ let desc_view = Descriptor :: < DefiniteDescriptorKey > :: from_str ( & desc_view_str) . unwrap ( ) ;
500
+ assert_eq ! ( desc_view. address( & secp, params) . unwrap_err( ) , Error :: Unexpected ( "wildcard blinding key" . into( ) ) ) ;
501
+
502
+ let desc_bare_str = format ! ( "ct({}/*,elwpkh({}))#czkz0hwn" , xpub, xpub) ;
503
+ let desc_bare = Descriptor :: < DefiniteDescriptorKey > :: from_str ( & desc_bare_str) . unwrap ( ) ;
504
+ assert_eq ! ( desc_bare. address( & secp, params) . unwrap_err( ) , Error :: Unexpected ( "wildcard blinding key" . into( ) ) ) ;
505
+ }
472
506
}
0 commit comments