@@ -485,39 +485,6 @@ impl DescriptorPublicKey {
485485        DefiniteDescriptorKey :: new ( definite) 
486486            . expect ( "The key should not contain any wildcards at this point" ) 
487487    } 
488- 
489-     /// Computes the public key corresponding to this descriptor key. 
490- /// When deriving from an XOnlyPublicKey, it adds the default 0x02 y-coordinate 
491- /// and returns the obtained full [`bitcoin::PublicKey`]. All BIP32 derivations 
492- /// always return a compressed key 
493- /// 
494- /// Will return an error if the descriptor key has any hardened derivation steps in its path. To 
495- /// avoid this error you should replace any such public keys first with [`translate_pk`]. 
496- /// 
497- /// [`translate_pk`]: crate::TranslatePk::translate_pk 
498- pub  fn  derive_public_key < C :  Verification > ( 
499-         & self , 
500-         secp :  & Secp256k1 < C > , 
501-     )  -> Result < bitcoin:: PublicKey ,  ConversionError >  { 
502-         match  * self  { 
503-             DescriptorPublicKey :: Single ( ref  pk)  => match  pk. key  { 
504-                 SinglePubKey :: FullKey ( pk)  => Ok ( pk) , 
505-                 SinglePubKey :: XOnly ( xpk)  => Ok ( xpk. to_public_key ( ) ) , 
506-             } , 
507-             DescriptorPublicKey :: XPub ( ref  xpk)  => match  xpk. wildcard  { 
508-                 Wildcard :: Unhardened  | Wildcard :: Hardened  => { 
509-                     unreachable ! ( "we've excluded this error case" ) 
510-                 } 
511-                 Wildcard :: None  => match  xpk. xkey . derive_pub ( secp,  & xpk. derivation_path . as_ref ( ) )  { 
512-                     Ok ( xpub)  => Ok ( bitcoin:: PublicKey :: new ( xpub. public_key ) ) , 
513-                     Err ( bip32:: Error :: CannotDeriveFromHardenedKey )  => { 
514-                         Err ( ConversionError :: HardenedChild ) 
515-                     } 
516-                     Err ( e)  => unreachable ! ( "cryptographically unreachable: {}" ,  e) , 
517-                 } , 
518-             } , 
519-         } 
520-     } 
521488} 
522489
523490impl  FromStr  for  DescriptorSecretKey  { 
@@ -757,17 +724,37 @@ impl MiniscriptKey for DescriptorPublicKey {
757724} 
758725
759726impl  DefiniteDescriptorKey  { 
760-     /// Computes the raw [`bitcoin::PublicKey`] for this descriptor key. 
727+     /// Computes the public key corresponding to this descriptor key. 
728+ /// When deriving from an XOnlyPublicKey, it adds the default 0x02 y-coordinate 
729+ /// and returns the obtained full [`bitcoin::PublicKey`]. All BIP32 derivations 
730+ /// always return a compressed key 
761731/// 
762- /// Will return an error if the key has any hardened derivation steps 
763- /// in its path, but unlike [`DescriptorPublicKey::derive_public_key`]  
764- /// this won't error in case of wildcards, because derived keys are  
765- /// guaranteed to never contain one.  
732+ /// Will return an error if the descriptor  key has any hardened derivation steps in its path. To  
733+ /// avoid this error you should replace any such public keys first with [`translate_pk`].  
734+ /// 
735+ /// [`translate_pk`]: crate::TranslatePk::translate_pk  
766736pub  fn  derive_public_key < C :  Verification > ( 
767737        & self , 
768738        secp :  & Secp256k1 < C > , 
769739    )  -> Result < bitcoin:: PublicKey ,  ConversionError >  { 
770-         self . 0 . derive_public_key ( secp) 
740+         match  self . 0  { 
741+             DescriptorPublicKey :: Single ( ref  pk)  => match  pk. key  { 
742+                 SinglePubKey :: FullKey ( pk)  => Ok ( pk) , 
743+                 SinglePubKey :: XOnly ( xpk)  => Ok ( xpk. to_public_key ( ) ) , 
744+             } , 
745+             DescriptorPublicKey :: XPub ( ref  xpk)  => match  xpk. wildcard  { 
746+                 Wildcard :: Unhardened  | Wildcard :: Hardened  => { 
747+                     unreachable ! ( "we've excluded this error case" ) 
748+                 } 
749+                 Wildcard :: None  => match  xpk. xkey . derive_pub ( secp,  & xpk. derivation_path . as_ref ( ) )  { 
750+                     Ok ( xpub)  => Ok ( bitcoin:: PublicKey :: new ( xpub. public_key ) ) , 
751+                     Err ( bip32:: Error :: CannotDeriveFromHardenedKey )  => { 
752+                         Err ( ConversionError :: HardenedChild ) 
753+                     } 
754+                     Err ( e)  => unreachable ! ( "cryptographically unreachable: {}" ,  e) , 
755+                 } , 
756+             } , 
757+         } 
771758    } 
772759
773760    /// Construct an instance from a descriptor key and a derivation index 
@@ -829,7 +816,7 @@ impl MiniscriptKey for DefiniteDescriptorKey {
829816impl  ToPublicKey  for  DefiniteDescriptorKey  { 
830817    fn  to_public_key ( & self )  -> bitcoin:: PublicKey  { 
831818        let  secp = Secp256k1 :: verification_only ( ) ; 
832-         self . 0 . derive_public_key ( & secp) . unwrap ( ) 
819+         self . derive_public_key ( & secp) . unwrap ( ) 
833820    } 
834821
835822    fn  to_sha256 ( hash :  & sha256:: Hash )  -> sha256:: Hash  { 
0 commit comments