@@ -920,8 +920,9 @@ where
920
920
compile_binary ! ( & mut l_comp[ 3 ] , & mut r_comp[ 2 ] , [ lw, rw] , Terminal :: OrI ) ;
921
921
compile_binary ! ( & mut r_comp[ 3 ] , & mut l_comp[ 2 ] , [ rw, lw] , Terminal :: OrI ) ;
922
922
}
923
- Concrete :: Thresh ( k, ref subs) => {
924
- let n = subs. len ( ) ;
923
+ Concrete :: Thresh ( ref thresh) => {
924
+ let k = thresh. k ( ) ;
925
+ let n = thresh. n ( ) ;
925
926
let k_over_n = k as f64 / n as f64 ;
926
927
927
928
let mut sub_ast = Vec :: with_capacity ( n) ;
@@ -931,7 +932,7 @@ where
931
932
let mut best_ws = Vec :: with_capacity ( n) ;
932
933
933
934
let mut min_value = ( 0 , f64:: INFINITY ) ;
934
- for ( i, ast) in subs . iter ( ) . enumerate ( ) {
935
+ for ( i, ast) in thresh . iter ( ) . enumerate ( ) {
935
936
let sp = sat_prob * k_over_n;
936
937
//Expressions must be dissatisfiable
937
938
let dp = Some ( dissat_prob. unwrap_or ( 0 as f64 ) + ( 1.0 - k_over_n) * sat_prob) ;
@@ -949,7 +950,7 @@ where
949
950
}
950
951
sub_ext_data. push ( best_es[ min_value. 0 ] . 0 ) ;
951
952
sub_ast. push ( Arc :: clone ( & best_es[ min_value. 0 ] . 1 . ms ) ) ;
952
- for ( i, _ast) in subs . iter ( ) . enumerate ( ) {
953
+ for ( i, _ast) in thresh . iter ( ) . enumerate ( ) {
953
954
if i != min_value. 0 {
954
955
sub_ext_data. push ( best_ws[ i] . 0 ) ;
955
956
sub_ast. push ( Arc :: clone ( & best_ws[ i] . 1 . ms ) ) ;
@@ -966,7 +967,7 @@ where
966
967
insert_wrap ! ( ast_ext) ;
967
968
}
968
969
969
- let key_vec: Vec < Pk > = subs
970
+ let key_vec: Vec < Pk > = thresh
970
971
. iter ( )
971
972
. filter_map ( |s| {
972
973
if let Concrete :: Key ( ref pk) = s. as_ref ( ) {
@@ -978,16 +979,16 @@ where
978
979
. collect ( ) ;
979
980
980
981
match Ctx :: sig_type ( ) {
981
- SigType :: Schnorr if key_vec. len ( ) == subs . len ( ) => {
982
+ SigType :: Schnorr if key_vec. len ( ) == thresh . n ( ) => {
982
983
insert_wrap ! ( AstElemExt :: terminal( Terminal :: MultiA ( k, key_vec) ) )
983
984
}
984
985
SigType :: Ecdsa
985
- if key_vec. len ( ) == subs . len ( ) && subs . len ( ) <= MAX_PUBKEYS_PER_MULTISIG =>
986
+ if key_vec. len ( ) == thresh . n ( ) && thresh . n ( ) <= MAX_PUBKEYS_PER_MULTISIG =>
986
987
{
987
988
insert_wrap ! ( AstElemExt :: terminal( Terminal :: Multi ( k, key_vec) ) )
988
989
}
989
- _ if k == subs . len ( ) => {
990
- let mut it = subs . iter ( ) ;
990
+ _ if k == thresh . n ( ) => {
991
+ let mut it = thresh . iter ( ) ;
991
992
let mut policy = it. next ( ) . expect ( "No sub policy in thresh() ?" ) . clone ( ) ;
992
993
policy =
993
994
it. fold ( policy, |acc, pol| Concrete :: And ( vec ! [ acc, pol. clone( ) ] ) . into ( ) ) ;
@@ -1157,6 +1158,7 @@ mod tests {
1157
1158
use super :: * ;
1158
1159
use crate :: miniscript:: { Legacy , Segwitv0 , Tap } ;
1159
1160
use crate :: policy:: Liftable ;
1161
+ use crate :: threshold:: Threshold ;
1160
1162
use crate :: { script_num_size, ToPublicKey } ;
1161
1163
1162
1164
type SPolicy = Concrete < String > ;
@@ -1301,19 +1303,19 @@ mod tests {
1301
1303
let policy: BPolicy = Concrete :: Or ( vec ! [
1302
1304
(
1303
1305
127 ,
1304
- Arc :: new( Concrete :: Thresh (
1306
+ Arc :: new( Concrete :: Thresh ( Threshold :: new_unchecked (
1305
1307
3 ,
1306
1308
key_pol[ 0 ..5 ] . iter( ) . map( |p| ( p. clone( ) ) . into( ) ) . collect( ) ,
1307
- ) ) ,
1309
+ ) ) ) ,
1308
1310
) ,
1309
1311
(
1310
1312
1 ,
1311
1313
Arc :: new( Concrete :: And ( vec![
1312
1314
Arc :: new( Concrete :: Older ( Sequence :: from_height( 10000 ) ) ) ,
1313
- Arc :: new( Concrete :: Thresh (
1315
+ Arc :: new( Concrete :: Thresh ( Threshold :: new_unchecked (
1314
1316
2 ,
1315
1317
key_pol[ 5 ..8 ] . iter( ) . map( |p| ( p. clone( ) ) . into( ) ) . collect( ) ,
1316
- ) ) ,
1318
+ ) ) ) ,
1317
1319
] ) ) ,
1318
1320
) ,
1319
1321
] ) ;
@@ -1430,7 +1432,7 @@ mod tests {
1430
1432
. iter ( )
1431
1433
. map ( |pubkey| Arc :: new ( Concrete :: Key ( * pubkey) ) )
1432
1434
. collect ( ) ;
1433
- let big_thresh = Concrete :: Thresh ( * k, pubkeys) ;
1435
+ let big_thresh = Concrete :: Thresh ( Threshold :: new_unchecked ( * k, pubkeys) ) ;
1434
1436
let big_thresh_ms: SegwitMiniScript = big_thresh. compile ( ) . unwrap ( ) ;
1435
1437
if * k == 21 {
1436
1438
// N * (PUSH + pubkey + CHECKSIGVERIFY)
@@ -1466,8 +1468,8 @@ mod tests {
1466
1468
. collect ( ) ;
1467
1469
1468
1470
let thresh_res: Result < SegwitMiniScript , _ > = Concrete :: Or ( vec ! [
1469
- ( 1 , Arc :: new( Concrete :: Thresh ( keys_a. len( ) , keys_a) ) ) ,
1470
- ( 1 , Arc :: new( Concrete :: Thresh ( keys_b. len( ) , keys_b) ) ) ,
1471
+ ( 1 , Arc :: new( Concrete :: Thresh ( Threshold :: new_unchecked ( keys_a. len( ) , keys_a) ) ) ) ,
1472
+ ( 1 , Arc :: new( Concrete :: Thresh ( Threshold :: new_unchecked ( keys_b. len( ) , keys_b) ) ) ) ,
1471
1473
] )
1472
1474
. compile ( ) ;
1473
1475
let script_size = thresh_res. clone ( ) . and_then ( |m| Ok ( m. script_size ( ) ) ) ;
@@ -1484,7 +1486,8 @@ mod tests {
1484
1486
. iter ( )
1485
1487
. map ( |pubkey| Arc :: new ( Concrete :: Key ( * pubkey) ) )
1486
1488
. collect ( ) ;
1487
- let thresh_res: Result < SegwitMiniScript , _ > = Concrete :: Thresh ( keys. len ( ) , keys) . compile ( ) ;
1489
+ let thresh_res: Result < SegwitMiniScript , _ > =
1490
+ Concrete :: Thresh ( Threshold :: new_unchecked ( keys. len ( ) , keys) ) . compile ( ) ;
1488
1491
let n_elements = thresh_res
1489
1492
. clone ( )
1490
1493
. and_then ( |m| Ok ( m. max_satisfaction_witness_elements ( ) ) ) ;
@@ -1505,7 +1508,7 @@ mod tests {
1505
1508
. map ( |pubkey| Arc :: new ( Concrete :: Key ( * pubkey) ) )
1506
1509
. collect ( ) ;
1507
1510
let thresh_res: Result < SegwitMiniScript , _ > =
1508
- Concrete :: Thresh ( keys. len ( ) - 1 , keys) . compile ( ) ;
1511
+ Concrete :: Thresh ( Threshold :: new_unchecked ( keys. len ( ) - 1 , keys) ) . compile ( ) ;
1509
1512
let ops_count = thresh_res. clone ( ) . and_then ( |m| Ok ( m. ext . ops . op_count ( ) ) ) ;
1510
1513
assert_eq ! (
1511
1514
thresh_res,
@@ -1519,7 +1522,8 @@ mod tests {
1519
1522
. iter ( )
1520
1523
. map ( |pubkey| Arc :: new ( Concrete :: Key ( * pubkey) ) )
1521
1524
. collect ( ) ;
1522
- let thresh_res = Concrete :: Thresh ( keys. len ( ) - 1 , keys) . compile :: < Legacy > ( ) ;
1525
+ let thresh_res =
1526
+ Concrete :: Thresh ( Threshold :: new_unchecked ( keys. len ( ) - 1 , keys) ) . compile :: < Legacy > ( ) ;
1523
1527
let ops_count = thresh_res. clone ( ) . and_then ( |m| Ok ( m. ext . ops . op_count ( ) ) ) ;
1524
1528
assert_eq ! (
1525
1529
thresh_res,
0 commit comments