@@ -13,6 +13,7 @@ use sync::Arc;
1313
1414use super :: checksum:: { desc_checksum, verify_checksum} ;
1515use crate :: expression:: { self , FromTree } ;
16+ use crate :: miniscript:: musig_key:: KeyExpr ;
1617use crate :: miniscript:: Miniscript ;
1718use crate :: policy:: semantic:: Policy ;
1819use crate :: policy:: Liftable ;
@@ -39,7 +40,7 @@ pub enum TapTree<Pk: MiniscriptKey> {
3940/// A taproot descriptor
4041pub struct Tr < Pk : MiniscriptKey > {
4142 /// A taproot internal key
42- internal_key : Pk ,
43+ internal_key : KeyExpr < Pk > ,
4344 /// Optional Taproot Tree with spending conditions
4445 tree : Option < TapTree < Pk > > ,
4546 /// Optional spending information associated with the descriptor
@@ -163,9 +164,8 @@ impl<Pk: MiniscriptKey> fmt::Debug for TapTree<Pk> {
163164
164165impl < Pk : MiniscriptKey > Tr < Pk > {
165166 /// Create a new [`Tr`] descriptor from internal key and [`TapTree`]
166- pub fn new ( internal_key : Pk , tree : Option < TapTree < Pk > > ) -> Result < Self , Error > {
167+ pub fn new ( internal_key : KeyExpr < Pk > , tree : Option < TapTree < Pk > > ) -> Result < Self , Error > {
167168 let nodes = tree. as_ref ( ) . map ( |t| t. taptree_height ( ) ) . unwrap_or ( 0 ) ;
168-
169169 if nodes <= TAPROOT_CONTROL_MAX_NODE_COUNT {
170170 Ok ( Self {
171171 internal_key,
@@ -186,7 +186,7 @@ impl<Pk: MiniscriptKey> Tr<Pk> {
186186 }
187187
188188 /// Obtain the internal key of [`Tr`] descriptor
189- pub fn internal_key ( & self ) -> & Pk {
189+ pub fn internal_key ( & self ) -> & KeyExpr < Pk > {
190190 & self . internal_key
191191 }
192192
@@ -226,7 +226,7 @@ impl<Pk: MiniscriptKey> Tr<Pk> {
226226 let secp = secp256k1:: Secp256k1 :: verification_only ( ) ;
227227 // Key spend path with no merkle root
228228 let data = if self . tree . is_none ( ) {
229- TaprootSpendInfo :: new_key_spend ( & secp, self . internal_key . to_x_only_pubkey ( ) , None )
229+ TaprootSpendInfo :: new_key_spend ( & secp, self . internal_key . key_agg ( ) , None )
230230 } else {
231231 let mut builder = TaprootBuilder :: new ( ) ;
232232 for ( depth, ms) in self . iter_scripts ( ) {
@@ -236,7 +236,7 @@ impl<Pk: MiniscriptKey> Tr<Pk> {
236236 . expect ( "Computing spend data on a valid Tree should always succeed" ) ;
237237 }
238238 // Assert builder cannot error here because we have a well formed descriptor
239- match builder. finalize ( & secp, self . internal_key . to_x_only_pubkey ( ) ) {
239+ match builder. finalize ( & secp, self . internal_key . key_agg ( ) ) {
240240 Ok ( data) => data,
241241 Err ( e) => match e {
242242 TaprootBuilderError :: InvalidMerkleTreeDepth ( _) => {
@@ -419,7 +419,7 @@ impl_from_tree!(
419419 key. args. len( )
420420 ) ) ) ;
421421 }
422- Tr :: new( expression:: terminal( key, Pk :: from_str) ?, None )
422+ Tr :: new( expression:: terminal( key, KeyExpr :: < Pk > :: from_str) ?, None )
423423 }
424424 2 => {
425425 let key = & top. args[ 0 ] ;
@@ -431,7 +431,10 @@ impl_from_tree!(
431431 }
432432 let tree = & top. args[ 1 ] ;
433433 let ret = Self :: parse_tr_script_spend( tree) ?;
434- Tr :: new( expression:: terminal( key, Pk :: from_str) ?, Some ( ret) )
434+ Tr :: new(
435+ expression:: terminal( key, KeyExpr :: <Pk >:: from_str) ?,
436+ Some ( ret) ,
437+ )
435438 }
436439 _ => {
437440 return Err ( Error :: Unexpected ( format!(
@@ -567,12 +570,10 @@ impl<Pk: MiniscriptKey> Liftable<Pk> for Tr<Pk> {
567570 match & self . tree {
568571 Some ( root) => Ok ( Policy :: Threshold (
569572 1 ,
570- vec ! [
571- Policy :: KeyHash ( self . internal_key. to_pubkeyhash( ) ) ,
572- root. lift( ) ?,
573- ] ,
573+ vec ! [ self . internal_key. lift( ) ?, root. lift( ) ?] ,
574574 ) ) ,
575- None => Ok ( Policy :: KeyHash ( self . internal_key . to_pubkeyhash ( ) ) ) ,
575+ // None => Ok(Policy::KeyHash(self.internal_key.to_pubkeyhash())),
576+ None => self . internal_key . lift ( ) ,
576577 }
577578 }
578579}
@@ -586,7 +587,7 @@ impl<Pk: MiniscriptKey> ForEachKey<Pk> for Tr<Pk> {
586587 let script_keys_res = self
587588 . iter_scripts ( )
588589 . all ( |( _d, ms) | ms. for_each_key ( & mut pred) ) ;
589- script_keys_res && pred ( & self . internal_key )
590+ script_keys_res && self . internal_key ( ) . for_any_key ( pred )
590591 }
591592}
592593
@@ -602,7 +603,7 @@ where
602603 T : Translator < P , Q , E > ,
603604 {
604605 let translate_desc = Tr {
605- internal_key : translate . pk ( & self . internal_key ) ?,
606+ internal_key : self . internal_key . translate_pk ( translate ) ?,
606607 tree : match & self . tree {
607608 Some ( tree) => Some ( tree. translate_helper ( translate) ?) ,
608609 None => None ,
0 commit comments