@@ -469,4 +469,38 @@ mod tests {
469469 } ;
470470 test. check ( & secp) ;
471471 }
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+ }
472506}
0 commit comments