@@ -13,6 +13,7 @@ use sync::Arc;
13
13
14
14
use super :: checksum:: { desc_checksum, verify_checksum} ;
15
15
use crate :: expression:: { self , FromTree } ;
16
+ use crate :: miniscript:: musig_key:: KeyExpr ;
16
17
use crate :: miniscript:: Miniscript ;
17
18
use crate :: policy:: semantic:: Policy ;
18
19
use crate :: policy:: Liftable ;
@@ -39,7 +40,7 @@ pub enum TapTree<Pk: MiniscriptKey> {
39
40
/// A taproot descriptor
40
41
pub struct Tr < Pk : MiniscriptKey > {
41
42
/// A taproot internal key
42
- internal_key : Pk ,
43
+ internal_key : KeyExpr < Pk > ,
43
44
/// Optional Taproot Tree with spending conditions
44
45
tree : Option < TapTree < Pk > > ,
45
46
/// Optional spending information associated with the descriptor
@@ -163,9 +164,8 @@ impl<Pk: MiniscriptKey> fmt::Debug for TapTree<Pk> {
163
164
164
165
impl < Pk : MiniscriptKey > Tr < Pk > {
165
166
/// 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 > {
167
168
let nodes = tree. as_ref ( ) . map ( |t| t. taptree_height ( ) ) . unwrap_or ( 0 ) ;
168
-
169
169
if nodes <= TAPROOT_CONTROL_MAX_NODE_COUNT {
170
170
Ok ( Self {
171
171
internal_key,
@@ -186,7 +186,7 @@ impl<Pk: MiniscriptKey> Tr<Pk> {
186
186
}
187
187
188
188
/// Obtain the internal key of [`Tr`] descriptor
189
- pub fn internal_key ( & self ) -> & Pk {
189
+ pub fn internal_key ( & self ) -> & KeyExpr < Pk > {
190
190
& self . internal_key
191
191
}
192
192
@@ -226,7 +226,7 @@ impl<Pk: MiniscriptKey> Tr<Pk> {
226
226
let secp = secp256k1:: Secp256k1 :: verification_only ( ) ;
227
227
// Key spend path with no merkle root
228
228
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 )
230
230
} else {
231
231
let mut builder = TaprootBuilder :: new ( ) ;
232
232
for ( depth, ms) in self . iter_scripts ( ) {
@@ -236,7 +236,7 @@ impl<Pk: MiniscriptKey> Tr<Pk> {
236
236
. expect ( "Computing spend data on a valid Tree should always succeed" ) ;
237
237
}
238
238
// 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 ( ) ) {
240
240
Ok ( data) => data,
241
241
Err ( e) => match e {
242
242
TaprootBuilderError :: InvalidMerkleTreeDepth ( _) => {
@@ -419,7 +419,7 @@ impl_from_tree!(
419
419
key. args. len( )
420
420
) ) ) ;
421
421
}
422
- Tr :: new( expression:: terminal( key, Pk :: from_str) ?, None )
422
+ Tr :: new( expression:: terminal( key, KeyExpr :: < Pk > :: from_str) ?, None )
423
423
}
424
424
2 => {
425
425
let key = & top. args[ 0 ] ;
@@ -431,7 +431,10 @@ impl_from_tree!(
431
431
}
432
432
let tree = & top. args[ 1 ] ;
433
433
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
+ )
435
438
}
436
439
_ => {
437
440
return Err ( Error :: Unexpected ( format!(
@@ -567,12 +570,10 @@ impl<Pk: MiniscriptKey> Liftable<Pk> for Tr<Pk> {
567
570
match & self . tree {
568
571
Some ( root) => Ok ( Policy :: Threshold (
569
572
1 ,
570
- vec ! [
571
- Policy :: KeyHash ( self . internal_key. to_pubkeyhash( ) ) ,
572
- root. lift( ) ?,
573
- ] ,
573
+ vec ! [ self . internal_key. lift( ) ?, root. lift( ) ?] ,
574
574
) ) ,
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 ( ) ,
576
577
}
577
578
}
578
579
}
@@ -586,7 +587,7 @@ impl<Pk: MiniscriptKey> ForEachKey<Pk> for Tr<Pk> {
586
587
let script_keys_res = self
587
588
. iter_scripts ( )
588
589
. 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 )
590
591
}
591
592
}
592
593
@@ -602,7 +603,7 @@ where
602
603
T : Translator < P , Q , E > ,
603
604
{
604
605
let translate_desc = Tr {
605
- internal_key : translate . pk ( & self . internal_key ) ?,
606
+ internal_key : self . internal_key . translate_pk ( translate ) ?,
606
607
tree : match & self . tree {
607
608
Some ( tree) => Some ( tree. translate_helper ( translate) ?) ,
608
609
None => None ,
0 commit comments