@@ -22,6 +22,7 @@ use std::convert::From;
22
22
use std:: marker:: PhantomData ;
23
23
use std:: { cmp, error, f64, fmt, mem} ;
24
24
25
+ use crate :: miniscript:: context:: SigType ;
25
26
use crate :: miniscript:: limits:: MAX_PUBKEYS_PER_MULTISIG ;
26
27
use crate :: miniscript:: types:: { self , ErrorKind , ExtData , Property , Type } ;
27
28
use crate :: miniscript:: ScriptContext ;
@@ -993,18 +994,23 @@ where
993
994
} )
994
995
. collect ( ) ;
995
996
996
- if key_vec. len ( ) == subs. len ( ) && subs. len ( ) <= MAX_PUBKEYS_PER_MULTISIG {
997
- insert_wrap ! ( AstElemExt :: terminal( Terminal :: Multi ( k, key_vec) ) ) ;
998
- }
999
- // Not a threshold, it's always more optimal to translate it to and()s as we save the
1000
- // resulting threshold check (N EQUAL) in any case.
1001
- else if k == subs. len ( ) {
1002
- let mut policy = subs. first ( ) . expect ( "No sub policy in thresh() ?" ) . clone ( ) ;
1003
- for sub in & subs[ 1 ..] {
1004
- policy = Concrete :: And ( vec ! [ sub. clone( ) , policy] ) ;
997
+ match Ctx :: sig_type ( ) {
998
+ SigType :: Schnorr if key_vec. len ( ) == subs. len ( ) => {
999
+ insert_wrap ! ( AstElemExt :: terminal( Terminal :: MultiA ( k, key_vec) ) )
1000
+ }
1001
+ SigType :: Ecdsa
1002
+ if key_vec. len ( ) == subs. len ( ) && subs. len ( ) <= MAX_PUBKEYS_PER_MULTISIG =>
1003
+ {
1004
+ insert_wrap ! ( AstElemExt :: terminal( Terminal :: Multi ( k, key_vec) ) )
1005
1005
}
1006
+ _ if k == subs. len ( ) => {
1007
+ let mut it = subs. iter ( ) ;
1008
+ let mut policy = it. next ( ) . expect ( "No sub policy in thresh() ?" ) . clone ( ) ;
1009
+ policy = it. fold ( policy, |acc, pol| Concrete :: And ( vec ! [ acc, pol. clone( ) ] ) ) ;
1006
1010
1007
- ret = best_compilations ( policy_cache, & policy, sat_prob, dissat_prob) ?;
1011
+ ret = best_compilations ( policy_cache, & policy, sat_prob, dissat_prob) ?;
1012
+ }
1013
+ _ => { }
1008
1014
}
1009
1015
1010
1016
// FIXME: Should we also optimize thresh(1, subs) ?
@@ -1555,6 +1561,17 @@ mod tests {
1555
1561
) )
1556
1562
) ;
1557
1563
}
1564
+
1565
+ #[ test]
1566
+ fn compile_tr_thresh ( ) {
1567
+ for k in 1 ..4 {
1568
+ let small_thresh: Concrete < String > =
1569
+ policy_str ! ( "{}" , & format!( "thresh({},pk(B),pk(C),pk(D))" , k) ) ;
1570
+ let small_thresh_ms: Miniscript < String , Tap > = small_thresh. compile ( ) . unwrap ( ) ;
1571
+ let small_thresh_ms_expected: Miniscript < String , Tap > = ms_str ! ( "multi_a({},B,C,D)" , k) ;
1572
+ assert_eq ! ( small_thresh_ms, small_thresh_ms_expected) ;
1573
+ }
1574
+ }
1558
1575
}
1559
1576
1560
1577
#[ cfg( all( test, feature = "unstable" ) ) ]
0 commit comments