@@ -26,6 +26,7 @@ use bitcoin::blockdata::{opcodes, script};
26
26
use sync:: Arc ;
27
27
28
28
use crate :: miniscript:: context:: SigType ;
29
+ use crate :: miniscript:: musig_key:: KeyExpr ;
29
30
use crate :: miniscript:: types:: { self , Property } ;
30
31
use crate :: miniscript:: ScriptContext ;
31
32
use crate :: prelude:: * ;
@@ -80,7 +81,7 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> Terminal<Pk, Ctx> {
80
81
Pk :: RawPkHash : ' a ,
81
82
{
82
83
match * self {
83
- Terminal :: PkK ( ref p) => pred ( p ) ,
84
+ Terminal :: PkK ( ref p) => p . for_each_key ( pred ) ,
84
85
Terminal :: PkH ( ref p) => pred ( p) ,
85
86
Terminal :: RawPkH ( ..)
86
87
| Terminal :: After ( ..)
@@ -112,9 +113,8 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> Terminal<Pk, Ctx> {
112
113
&& c. real_for_each_key ( pred)
113
114
}
114
115
Terminal :: Thresh ( _, ref subs) => subs. iter ( ) . all ( |sub| sub. real_for_each_key ( pred) ) ,
115
- Terminal :: Multi ( _, ref keys) | Terminal :: MultiA ( _, ref keys) => {
116
- keys. iter ( ) . all ( |key| pred ( key) )
117
- }
116
+ Terminal :: Multi ( _, ref keys) => keys. iter ( ) . all ( |key| pred ( key) ) ,
117
+ Terminal :: MultiA ( _, ref keys) => keys. iter ( ) . all ( |key| key. for_each_key ( & mut * pred) ) ,
118
118
}
119
119
}
120
120
@@ -125,7 +125,7 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> Terminal<Pk, Ctx> {
125
125
T : Translator < Pk , Q , E > ,
126
126
{
127
127
let frag: Terminal < Q , CtxQ > = match * self {
128
- Terminal :: PkK ( ref p) => Terminal :: PkK ( t . pk ( p ) ?) ,
128
+ Terminal :: PkK ( ref p) => Terminal :: PkK ( p . translate_pk ( t ) ?) ,
129
129
Terminal :: PkH ( ref p) => Terminal :: PkH ( t. pk ( p) ?) ,
130
130
Terminal :: RawPkH ( ref p) => Terminal :: RawPkH ( t. pkh ( p) ?) ,
131
131
Terminal :: After ( n) => Terminal :: After ( n) ,
@@ -186,7 +186,8 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> Terminal<Pk, Ctx> {
186
186
Terminal :: Multi ( k, keys?)
187
187
}
188
188
Terminal :: MultiA ( k, ref keys) => {
189
- let keys: Result < Vec < Q > , _ > = keys. iter ( ) . map ( |k| t. pk ( k) ) . collect ( ) ;
189
+ let keys: Result < Vec < KeyExpr < Q > > , _ > =
190
+ keys. iter ( ) . map ( |k| k. translate_pk ( t) ) . collect ( ) ;
190
191
Terminal :: MultiA ( k, keys?)
191
192
}
192
193
} ;
@@ -455,7 +456,7 @@ impl_from_tree!(
455
456
}
456
457
let mut unwrapped = match ( frag_name, top. args. len( ) ) {
457
458
( "pk_k" , 1 ) => {
458
- expression:: terminal ( & top. args [ 0 ] , |x| Pk :: from_str ( x ) . map ( Terminal :: PkK ) )
459
+ expression:: unary ( top, Terminal :: PkK )
459
460
}
460
461
( "pk_h" , 1 ) => expression:: terminal( & top. args[ 0 ] , |x| Pk :: from_str( x) . map( Terminal :: PkH ) ) ,
461
462
( "after" , 1 ) => expression:: terminal( & top. args[ 0 ] , |x| {
@@ -522,15 +523,18 @@ impl_from_tree!(
522
523
return Err ( errstr( "higher threshold than there were keys in multi" ) ) ;
523
524
}
524
525
525
- let pks: Result <Vec <Pk >, _> = top. args[ 1 ..]
526
- . iter( )
527
- . map( |sub| expression:: terminal( sub, Pk :: from_str) )
528
- . collect( ) ;
529
-
530
526
if frag_name == "multi" {
527
+ let pks: Result <Vec <Pk >, _> = top. args[ 1 ..]
528
+ . iter( )
529
+ . map( |sub| expression:: terminal( sub, Pk :: from_str) )
530
+ . collect( ) ;
531
531
pks. map( |pks| Terminal :: Multi ( k, pks) )
532
532
} else {
533
533
// must be multi_a
534
+ let pks: Result <Vec <KeyExpr <Pk >>, _> = top. args[ 1 ..]
535
+ . iter( )
536
+ . map( |sub| expression:: terminal( sub, KeyExpr :: <Pk >:: from_str) )
537
+ . collect( ) ;
534
538
pks. map( |pks| Terminal :: MultiA ( k, pks) )
535
539
}
536
540
}
@@ -734,7 +738,7 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> Terminal<Pk, Ctx> {
734
738
builder = builder. push_ms_key :: < _ , Ctx > ( & keys[ 0 ] ) ;
735
739
builder = builder. push_opcode ( opcodes:: all:: OP_CHECKSIG ) ;
736
740
for pk in keys. iter ( ) . skip ( 1 ) {
737
- builder = builder. push_ms_key :: < _ , Ctx > ( pk) ;
741
+ builder = builder. push_ms_key :: < _ , Ctx > ( & pk) ;
738
742
builder = builder. push_opcode ( opcodes:: all:: OP_CHECKSIGADD ) ;
739
743
}
740
744
builder
@@ -793,7 +797,10 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> Terminal<Pk, Ctx> {
793
797
script_num_size ( k)
794
798
+ 1
795
799
+ script_num_size ( pks. len ( ) )
796
- + pks. iter ( ) . map ( |pk| Ctx :: pk_len ( pk) ) . sum :: < usize > ( )
800
+ + pks
801
+ . iter ( )
802
+ . map ( |pk| Ctx :: pk_len ( & KeyExpr :: SingleKey ( pk. clone ( ) ) ) )
803
+ . sum :: < usize > ( )
797
804
}
798
805
Terminal :: MultiA ( k, ref pks) => {
799
806
script_num_size ( k)
0 commit comments