@@ -579,13 +579,13 @@ impl<Pk: MiniscriptKey> Policy<Pk> {
579
579
Hash160 ( ref h) => t. hash160 ( h) . map ( Hash160 ) ?,
580
580
Older ( ref n) => Older ( * n) ,
581
581
After ( ref n) => After ( * n) ,
582
- Threshold ( ref k, ref subs) => Threshold ( * k, ( 0 ..subs. len ( ) ) . map ( child_n) . collect ( ) ) ,
583
582
And ( ref subs) => And ( ( 0 ..subs. len ( ) ) . map ( child_n) . collect ( ) ) ,
584
583
Or ( ref subs) => Or ( subs
585
584
. iter ( )
586
585
. enumerate ( )
587
586
. map ( |( i, ( prob, _) ) | ( * prob, child_n ( i) ) )
588
587
. collect ( ) ) ,
588
+ Threshold ( ref k, ref subs) => Threshold ( * k, ( 0 ..subs. len ( ) ) . map ( child_n) . collect ( ) ) ,
589
589
} ;
590
590
translated. push ( Arc :: new ( new_policy) ) ;
591
591
}
@@ -605,15 +605,15 @@ impl<Pk: MiniscriptKey> Policy<Pk> {
605
605
606
606
let new_policy = match data. node . as_ref ( ) {
607
607
Policy :: Key ( ref k) if k. clone ( ) == * key => Some ( Policy :: Unsatisfiable ) ,
608
- Threshold ( k, ref subs) => {
609
- Some ( Threshold ( * k, ( 0 ..subs. len ( ) ) . map ( child_n) . collect ( ) ) )
610
- }
611
608
And ( ref subs) => Some ( And ( ( 0 ..subs. len ( ) ) . map ( child_n) . collect ( ) ) ) ,
612
609
Or ( ref subs) => Some ( Or ( subs
613
610
. iter ( )
614
611
. enumerate ( )
615
612
. map ( |( i, ( prob, _) ) | ( * prob, child_n ( i) ) )
616
613
. collect ( ) ) ) ,
614
+ Threshold ( k, ref subs) => {
615
+ Some ( Threshold ( * k, ( 0 ..subs. len ( ) ) . map ( child_n) . collect ( ) ) )
616
+ }
617
617
_ => None ,
618
618
} ;
619
619
match new_policy {
@@ -724,10 +724,6 @@ impl<Pk: MiniscriptKey> Policy<Pk> {
724
724
cltv_with_time : false ,
725
725
contains_combination : false ,
726
726
} ,
727
- Threshold ( ref k, subs) => {
728
- let iter = ( 0 ..subs. len ( ) ) . map ( info_for_child_n) ;
729
- TimelockInfo :: combine_threshold ( * k, iter)
730
- }
731
727
And ( ref subs) => {
732
728
let iter = ( 0 ..subs. len ( ) ) . map ( info_for_child_n) ;
733
729
TimelockInfo :: combine_threshold ( subs. len ( ) , iter)
@@ -736,6 +732,10 @@ impl<Pk: MiniscriptKey> Policy<Pk> {
736
732
let iter = ( 0 ..subs. len ( ) ) . map ( info_for_child_n) ;
737
733
TimelockInfo :: combine_threshold ( 1 , iter)
738
734
}
735
+ Threshold ( ref k, subs) => {
736
+ let iter = ( 0 ..subs. len ( ) ) . map ( info_for_child_n) ;
737
+ TimelockInfo :: combine_threshold ( * k, iter)
738
+ }
739
739
_ => TimelockInfo :: default ( ) ,
740
740
} ;
741
741
infos. push ( info) ;
@@ -756,6 +756,20 @@ impl<Pk: MiniscriptKey> Policy<Pk> {
756
756
757
757
for policy in self . pre_order_iter ( ) {
758
758
match * policy {
759
+ After ( n) => {
760
+ if n == absolute:: LockTime :: ZERO . into ( ) {
761
+ return Err ( PolicyError :: ZeroTime ) ;
762
+ } else if n. to_u32 ( ) > 2u32 . pow ( 31 ) {
763
+ return Err ( PolicyError :: TimeTooFar ) ;
764
+ }
765
+ }
766
+ Older ( n) => {
767
+ if n == Sequence :: ZERO {
768
+ return Err ( PolicyError :: ZeroTime ) ;
769
+ } else if n. to_consensus_u32 ( ) > 2u32 . pow ( 31 ) {
770
+ return Err ( PolicyError :: TimeTooFar ) ;
771
+ }
772
+ }
759
773
And ( ref subs) => {
760
774
if subs. len ( ) != 2 {
761
775
return Err ( PolicyError :: NonBinaryArgAnd ) ;
@@ -771,20 +785,6 @@ impl<Pk: MiniscriptKey> Policy<Pk> {
771
785
return Err ( PolicyError :: IncorrectThresh ) ;
772
786
}
773
787
}
774
- After ( n) => {
775
- if n == absolute:: LockTime :: ZERO . into ( ) {
776
- return Err ( PolicyError :: ZeroTime ) ;
777
- } else if n. to_u32 ( ) > 2u32 . pow ( 31 ) {
778
- return Err ( PolicyError :: TimeTooFar ) ;
779
- }
780
- }
781
- Older ( n) => {
782
- if n == Sequence :: ZERO {
783
- return Err ( PolicyError :: ZeroTime ) ;
784
- } else if n. to_consensus_u32 ( ) > 2u32 . pow ( 31 ) {
785
- return Err ( PolicyError :: TimeTooFar ) ;
786
- }
787
- }
788
788
_ => { }
789
789
}
790
790
}
@@ -810,18 +810,6 @@ impl<Pk: MiniscriptKey> Policy<Pk> {
810
810
Sha256 ( _) | Hash256 ( _) | Ripemd160 ( _) | Hash160 ( _) | After ( _) | Older ( _) => {
811
811
( false , true )
812
812
}
813
- Threshold ( k, ref subs) => {
814
- let ( safe_count, non_mall_count) = ( 0 ..subs. len ( ) ) . map ( acc_for_child_n) . fold (
815
- ( 0 , 0 ) ,
816
- |( safe_count, non_mall_count) , ( safe, non_mall) | {
817
- ( safe_count + safe as usize , non_mall_count + non_mall as usize )
818
- } ,
819
- ) ;
820
- (
821
- safe_count >= ( subs. len ( ) - k + 1 ) ,
822
- non_mall_count == subs. len ( ) && safe_count >= ( subs. len ( ) - k) ,
823
- )
824
- }
825
813
And ( ref subs) => {
826
814
let ( atleast_one_safe, all_non_mall) = ( 0 ..subs. len ( ) )
827
815
. map ( acc_for_child_n)
@@ -836,6 +824,18 @@ impl<Pk: MiniscriptKey> Policy<Pk> {
836
824
} ) ;
837
825
( all_safe, atleast_one_safe && all_non_mall)
838
826
}
827
+ Threshold ( k, ref subs) => {
828
+ let ( safe_count, non_mall_count) = ( 0 ..subs. len ( ) ) . map ( acc_for_child_n) . fold (
829
+ ( 0 , 0 ) ,
830
+ |( safe_count, non_mall_count) , ( safe, non_mall) | {
831
+ ( safe_count + safe as usize , non_mall_count + non_mall as usize )
832
+ } ,
833
+ ) ;
834
+ (
835
+ safe_count >= ( subs. len ( ) - k + 1 ) ,
836
+ non_mall_count == subs. len ( ) && safe_count >= ( subs. len ( ) - k) ,
837
+ )
838
+ }
839
839
} ;
840
840
acc. push ( new) ;
841
841
}
0 commit comments