@@ -871,7 +871,7 @@ where
871
871
let rw = subs[ 1 ] . 0 as f64 / total;
872
872
873
873
//and-or
874
- if let ( Concrete :: And ( x) , _) = ( & subs[ 0 ] . 1 , & subs[ 1 ] . 1 ) {
874
+ if let ( Concrete :: And ( x) , _) = ( & subs[ 0 ] . 1 . as_ref ( ) , & subs[ 1 ] . 1 ) {
875
875
let mut a1 = best_compilations (
876
876
policy_cache,
877
877
& x[ 0 ] ,
@@ -894,7 +894,7 @@ where
894
894
compile_tern ! ( & mut a1, & mut b2, & mut c, [ lw, rw] ) ;
895
895
compile_tern ! ( & mut b1, & mut a2, & mut c, [ lw, rw] ) ;
896
896
} ;
897
- if let ( _, Concrete :: And ( x) ) = ( & subs[ 0 ] . 1 , & subs[ 1 ] . 1 ) {
897
+ if let ( _, Concrete :: And ( x) ) = ( & subs[ 0 ] . 1 , & subs[ 1 ] . 1 . as_ref ( ) ) {
898
898
let mut a1 = best_compilations (
899
899
policy_cache,
900
900
& x[ 0 ] ,
@@ -1005,7 +1005,7 @@ where
1005
1005
let key_vec: Vec < Pk > = subs
1006
1006
. iter ( )
1007
1007
. filter_map ( |s| {
1008
- if let Concrete :: Key ( ref pk) = * s {
1008
+ if let Concrete :: Key ( ref pk) = s . as_ref ( ) {
1009
1009
Some ( pk. clone ( ) )
1010
1010
} else {
1011
1011
None
@@ -1025,7 +1025,9 @@ where
1025
1025
_ if k == subs. len ( ) => {
1026
1026
let mut it = subs. iter ( ) ;
1027
1027
let mut policy = it. next ( ) . expect ( "No sub policy in thresh() ?" ) . clone ( ) ;
1028
- policy = it. fold ( policy, |acc, pol| Concrete :: And ( vec ! [ acc, pol. clone( ) ] ) ) ;
1028
+ policy = it. fold ( policy, |acc, pol| {
1029
+ Arc :: new ( Concrete :: And ( vec ! [ acc, pol. clone( ) ] ) )
1030
+ } ) ;
1029
1031
1030
1032
ret = best_compilations ( policy_cache, & policy, sat_prob, dissat_prob) ?;
1031
1033
}
@@ -1239,8 +1241,11 @@ mod tests {
1239
1241
fn compile_timelocks ( ) {
1240
1242
// artificially create a policy that is problematic and try to compile
1241
1243
let pol: SPolicy = Concrete :: And ( vec ! [
1242
- Concrete :: Key ( "A" . to_string( ) ) ,
1243
- Concrete :: And ( vec![ Concrete :: after( 9 ) , Concrete :: after( 1000_000_000 ) ] ) ,
1244
+ Arc :: new( Concrete :: Key ( "A" . to_string( ) ) ) ,
1245
+ Arc :: new( Concrete :: And ( vec![
1246
+ Arc :: new( Concrete :: after( 9 ) ) ,
1247
+ Arc :: new( Concrete :: after( 1000_000_000 ) ) ,
1248
+ ] ) ) ,
1244
1249
] ) ;
1245
1250
assert ! ( pol. compile:: <Segwitv0 >( ) . is_err( ) ) ;
1246
1251
@@ -1310,7 +1315,7 @@ mod tests {
1310
1315
#[ test]
1311
1316
fn compile_misc ( ) {
1312
1317
let ( keys, sig) = pubkeys_and_a_sig ( 10 ) ;
1313
- let key_pol: Vec < BPolicy > = keys. iter ( ) . map ( |k| Concrete :: Key ( * k) ) . collect ( ) ;
1318
+ let key_pol: Vec < Arc < BPolicy > > = keys. iter ( ) . map ( |k| Arc :: new ( Concrete :: Key ( * k) ) ) . collect ( ) ;
1314
1319
1315
1320
let policy: BPolicy = Concrete :: Key ( keys[ 0 ] . clone ( ) ) ;
1316
1321
let ms: SegwitMiniScript = policy. compile ( ) . unwrap ( ) ;
@@ -1346,13 +1351,16 @@ mod tests {
1346
1351
1347
1352
// Liquid policy
1348
1353
let policy: BPolicy = Concrete :: Or ( vec ! [
1349
- ( 127 , Concrete :: Threshold ( 3 , key_pol[ 0 ..5 ] . to_owned( ) ) ) ,
1354
+ (
1355
+ 127 ,
1356
+ Arc :: new( Concrete :: Threshold ( 3 , key_pol[ 0 ..5 ] . to_owned( ) ) ) ,
1357
+ ) ,
1350
1358
(
1351
1359
1 ,
1352
- Concrete :: And ( vec![
1353
- Concrete :: Older ( Sequence :: from_height( 10000 ) ) ,
1354
- Concrete :: Threshold ( 2 , key_pol[ 5 ..8 ] . to_owned( ) ) ,
1355
- ] ) ,
1360
+ Arc :: new ( Concrete :: And ( vec![
1361
+ Arc :: new ( Concrete :: Older ( Sequence :: from_height( 10000 ) ) ) ,
1362
+ Concrete :: Threshold ( 2 , key_pol[ 5 ..8 ] . to_owned( ) ) . into ( ) ,
1363
+ ] ) ) ,
1356
1364
) ,
1357
1365
] ) ;
1358
1366
@@ -1471,8 +1479,10 @@ mod tests {
1471
1479
// and to a ms thresh otherwise.
1472
1480
// k = 1 (or 2) does not compile, see https://github.com/rust-bitcoin/rust-miniscript/issues/114
1473
1481
for k in & [ 10 , 15 , 21 ] {
1474
- let pubkeys: Vec < Concrete < bitcoin:: PublicKey > > =
1475
- keys. iter ( ) . map ( |pubkey| Concrete :: Key ( * pubkey) ) . collect ( ) ;
1482
+ let pubkeys: Vec < Arc < Concrete < bitcoin:: PublicKey > > > = keys
1483
+ . iter ( )
1484
+ . map ( |pubkey| Concrete :: Key ( * pubkey) . into ( ) )
1485
+ . collect ( ) ;
1476
1486
let big_thresh = Concrete :: Threshold ( * k, pubkeys) ;
1477
1487
let big_thresh_ms: SegwitMiniScript = big_thresh. compile ( ) . unwrap ( ) ;
1478
1488
if * k == 21 {
@@ -1499,18 +1509,18 @@ mod tests {
1499
1509
// or(thresh(52, [pubkey; 52]), thresh(52, [pubkey; 52])) results in a 3642-bytes long
1500
1510
// witness script with only 54 stack elements
1501
1511
let ( keys, _) = pubkeys_and_a_sig ( 104 ) ;
1502
- let keys_a: Vec < Concrete < bitcoin:: PublicKey > > = keys[ ..keys. len ( ) / 2 ]
1512
+ let keys_a: Vec < Arc < Concrete < bitcoin:: PublicKey > > > = keys[ ..keys. len ( ) / 2 ]
1503
1513
. iter ( )
1504
- . map ( |pubkey| Concrete :: Key ( * pubkey) )
1514
+ . map ( |pubkey| Concrete :: Key ( * pubkey) . into ( ) )
1505
1515
. collect ( ) ;
1506
- let keys_b: Vec < Concrete < bitcoin:: PublicKey > > = keys[ keys. len ( ) / 2 ..]
1516
+ let keys_b: Vec < Arc < Concrete < bitcoin:: PublicKey > > > = keys[ keys. len ( ) / 2 ..]
1507
1517
. iter ( )
1508
- . map ( |pubkey| Concrete :: Key ( * pubkey) )
1518
+ . map ( |pubkey| Concrete :: Key ( * pubkey) . into ( ) )
1509
1519
. collect ( ) ;
1510
1520
1511
1521
let thresh_res: Result < SegwitMiniScript , _ > = Concrete :: Or ( vec ! [
1512
- ( 1 , Concrete :: Threshold ( keys_a. len( ) , keys_a) ) ,
1513
- ( 1 , Concrete :: Threshold ( keys_b. len( ) , keys_b) ) ,
1522
+ ( 1 , Concrete :: Threshold ( keys_a. len( ) , keys_a. into ( ) ) . into ( ) ) ,
1523
+ ( 1 , Concrete :: Threshold ( keys_b. len( ) , keys_b. into ( ) ) . into ( ) ) ,
1514
1524
] )
1515
1525
. compile ( ) ;
1516
1526
let script_size = thresh_res. clone ( ) . and_then ( |m| Ok ( m. script_size ( ) ) ) ;
@@ -1523,8 +1533,10 @@ mod tests {
1523
1533
1524
1534
// Hit the maximum witness stack elements limit
1525
1535
let ( keys, _) = pubkeys_and_a_sig ( 100 ) ;
1526
- let keys: Vec < Concrete < bitcoin:: PublicKey > > =
1527
- keys. iter ( ) . map ( |pubkey| Concrete :: Key ( * pubkey) ) . collect ( ) ;
1536
+ let keys: Vec < Arc < Concrete < bitcoin:: PublicKey > > > = keys
1537
+ . iter ( )
1538
+ . map ( |pubkey| Concrete :: Key ( * pubkey) . into ( ) )
1539
+ . collect ( ) ;
1528
1540
let thresh_res: Result < SegwitMiniScript , _ > =
1529
1541
Concrete :: Threshold ( keys. len ( ) , keys) . compile ( ) ;
1530
1542
let n_elements = thresh_res
@@ -1542,8 +1554,10 @@ mod tests {
1542
1554
fn shared_limits ( ) {
1543
1555
// Test the maximum number of OPs with a 67-of-68 multisig
1544
1556
let ( keys, _) = pubkeys_and_a_sig ( 68 ) ;
1545
- let keys: Vec < Concrete < bitcoin:: PublicKey > > =
1546
- keys. iter ( ) . map ( |pubkey| Concrete :: Key ( * pubkey) ) . collect ( ) ;
1557
+ let keys: Vec < Arc < Concrete < bitcoin:: PublicKey > > > = keys
1558
+ . iter ( )
1559
+ . map ( |pubkey| Concrete :: Key ( * pubkey) . into ( ) )
1560
+ . collect ( ) ;
1547
1561
let thresh_res: Result < SegwitMiniScript , _ > =
1548
1562
Concrete :: Threshold ( keys. len ( ) - 1 , keys) . compile ( ) ;
1549
1563
let ops_count = thresh_res. clone ( ) . and_then ( |m| Ok ( m. ext . ops . op_count ( ) ) ) ;
@@ -1555,8 +1569,10 @@ mod tests {
1555
1569
) ;
1556
1570
// For legacy too..
1557
1571
let ( keys, _) = pubkeys_and_a_sig ( 68 ) ;
1558
- let keys: Vec < Concrete < bitcoin:: PublicKey > > =
1559
- keys. iter ( ) . map ( |pubkey| Concrete :: Key ( * pubkey) ) . collect ( ) ;
1572
+ let keys: Vec < Arc < Concrete < bitcoin:: PublicKey > > > = keys
1573
+ . iter ( )
1574
+ . map ( |pubkey| Concrete :: Key ( * pubkey) . into ( ) )
1575
+ . collect ( ) ;
1560
1576
let thresh_res = Concrete :: Threshold ( keys. len ( ) - 1 , keys) . compile :: < Legacy > ( ) ;
1561
1577
let ops_count = thresh_res. clone ( ) . and_then ( |m| Ok ( m. ext . ops . op_count ( ) ) ) ;
1562
1578
assert_eq ! (
@@ -1568,7 +1584,7 @@ mod tests {
1568
1584
1569
1585
// Test that we refuse to compile policies with duplicated keys
1570
1586
let ( keys, _) = pubkeys_and_a_sig ( 1 ) ;
1571
- let key = Concrete :: Key ( keys[ 0 ] ) ;
1587
+ let key = Arc :: new ( Concrete :: Key ( keys[ 0 ] ) ) ;
1572
1588
let res = Concrete :: Or ( vec ! [ ( 1 , key. clone( ) ) , ( 1 , key. clone( ) ) ] ) . compile :: < Segwitv0 > ( ) ;
1573
1589
assert_eq ! (
1574
1590
res,
@@ -1577,7 +1593,7 @@ mod tests {
1577
1593
) )
1578
1594
) ;
1579
1595
// Same for legacy
1580
- let res = Concrete :: Or ( vec ! [ ( 1 , key. clone( ) ) , ( 1 , key) ] ) . compile :: < Legacy > ( ) ;
1596
+ let res = Concrete :: Or ( vec ! [ ( 1 , key. clone( ) ) , ( 1 , key. clone ( ) ) ] ) . compile :: < Legacy > ( ) ;
1581
1597
assert_eq ! (
1582
1598
res,
1583
1599
Err ( CompilerError :: PolicyError (
0 commit comments