@@ -220,8 +220,8 @@ impl_from_str!(
220
220
( "slip77" , _) => return Err ( Error :: BadDescriptor (
221
221
"slip77() must have exactly one argument" . to_owned( )
222
222
) ) ,
223
- _ => expression:: terminal( keyexpr, DescriptorPublicKey :: from_str ) . map( Key :: Bare )
224
- . or_else( |_| expression:: terminal( keyexpr, |s : & str | DescriptorSecretKey :: from_str_inner ( s , true ) ) . map( Key :: View ) ) ?,
223
+ _ => expression:: terminal( keyexpr, |s : & str | DescriptorSecretKey :: from_str_inner ( s , true ) ) . map( Key :: View )
224
+ . or_else( |_| expression:: terminal( keyexpr, DescriptorPublicKey :: from_str ) . map( Key :: Bare ) ) ?,
225
225
} ,
226
226
descriptor: crate :: Descriptor :: from_tree( & top. args[ 1 ] ) ?,
227
227
} )
@@ -432,7 +432,7 @@ mod tests {
432
432
) ,
433
433
(
434
434
"ct(L3jXxwef3fpB7hcrFozcWgHeJCPSAFiZ1Ji2YJMPxceaGvy3PC1q,elwpkh(03774eec7a3d550d18e9f89414152025b3b0ad6a342b19481f702d843cff06dfc4))#gcy6hcfz" ,
435
- "unexpected «Error while parsing xkey. »" ,
435
+ "unexpected «Key too short (<66 char), doesn't match any format »" ,
436
436
) ,
437
437
] ;
438
438
@@ -504,6 +504,19 @@ mod tests {
504
504
}
505
505
}
506
506
507
+ #[ test]
508
+ fn view_xonly_pubkey_descriptor ( ) {
509
+ // View keys are 64 hex chars, but also x-only public keys are 64 hex chars
510
+ let view_key = "ab16855a17319477d4283fe5c29cc7d047f81e8ffb199e20d9be1bc31a751c4c" ;
511
+ // This view key can also be interpreted as a public key
512
+ let _public_key = DescriptorPublicKey :: from_str ( view_key) . unwrap ( ) ;
513
+ // But since compressed public keys are disallowed, it must be interpreted as a view key
514
+ let pk = "021a8fb6bd5a653b021b98a2a785725b8ddacfe3687bc043aa7f4d25d3a48d40b5" ;
515
+ let desc_str = format ! ( "ct({view_key},elwpkh({pk}))#n9uc7tzt" ) ;
516
+ let desc = Descriptor :: < DefiniteDescriptorKey > :: from_str ( & desc_str) . unwrap ( ) ;
517
+ assert ! ( matches!( desc. key, Key :: View ( _) ) ) ;
518
+ }
519
+
507
520
#[ test]
508
521
fn descriptor_wildcard ( ) {
509
522
let secp = secp256k1_zkp:: Secp256k1 :: new ( ) ;
0 commit comments