@@ -711,42 +711,45 @@ impl<Pk: MiniscriptKey> Policy<Pk> {
711
711
// Checks whether the given concrete policy contains a combination of
712
712
// timelocks and heightlocks
713
713
fn check_timelocks_helper ( & self ) -> TimelockInfo {
714
- // timelocks[csv_h, csv_t, cltv_h, cltv_t, combination]
715
- match * self {
716
- Policy :: Unsatisfiable
717
- | Policy :: Trivial
718
- | Policy :: Key ( _)
719
- | Policy :: Sha256 ( _)
720
- | Policy :: Hash256 ( _)
721
- | Policy :: Ripemd160 ( _)
722
- | Policy :: Hash160 ( _) => TimelockInfo :: default ( ) ,
723
- Policy :: After ( t) => TimelockInfo {
724
- csv_with_height : false ,
725
- csv_with_time : false ,
726
- cltv_with_height : absolute:: LockTime :: from ( t) . is_block_height ( ) ,
727
- cltv_with_time : absolute:: LockTime :: from ( t) . is_block_time ( ) ,
728
- contains_combination : false ,
729
- } ,
730
- Policy :: Older ( t) => TimelockInfo {
731
- csv_with_height : t. is_height_locked ( ) ,
732
- csv_with_time : t. is_time_locked ( ) ,
733
- cltv_with_height : false ,
734
- cltv_with_time : false ,
735
- contains_combination : false ,
736
- } ,
737
- Policy :: Threshold ( k, ref subs) => {
738
- let iter = subs. iter ( ) . map ( |sub| sub. check_timelocks_helper ( ) ) ;
739
- TimelockInfo :: combine_threshold ( k, iter)
740
- }
741
- Policy :: And ( ref subs) => {
742
- let iter = subs. iter ( ) . map ( |sub| sub. check_timelocks_helper ( ) ) ;
743
- TimelockInfo :: combine_threshold ( subs. len ( ) , iter)
744
- }
745
- Policy :: Or ( ref subs) => {
746
- let iter = subs. iter ( ) . map ( |( _p, sub) | sub. check_timelocks_helper ( ) ) ;
747
- TimelockInfo :: combine_threshold ( 1 , iter)
748
- }
714
+ use Policy :: * ;
715
+
716
+ let mut infos = vec ! [ ] ;
717
+ for data in Arc :: new ( self ) . post_order_iter ( ) {
718
+ let info_for_child_n = |n| infos[ data. child_indices [ n] ] ;
719
+
720
+ let info = match data. node {
721
+ Policy :: After ( ref t) => TimelockInfo {
722
+ csv_with_height : false ,
723
+ csv_with_time : false ,
724
+ cltv_with_height : absolute:: LockTime :: from ( * t) . is_block_height ( ) ,
725
+ cltv_with_time : absolute:: LockTime :: from ( * t) . is_block_time ( ) ,
726
+ contains_combination : false ,
727
+ } ,
728
+ Policy :: Older ( ref t) => TimelockInfo {
729
+ csv_with_height : t. is_height_locked ( ) ,
730
+ csv_with_time : t. is_time_locked ( ) ,
731
+ cltv_with_height : false ,
732
+ cltv_with_time : false ,
733
+ contains_combination : false ,
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
+ And ( ref subs) => {
740
+ let iter = ( 0 ..subs. len ( ) ) . map ( info_for_child_n) ;
741
+ TimelockInfo :: combine_threshold ( subs. len ( ) , iter)
742
+ }
743
+ Or ( ref subs) => {
744
+ let iter = ( 0 ..subs. len ( ) ) . map ( info_for_child_n) ;
745
+ TimelockInfo :: combine_threshold ( 1 , iter)
746
+ }
747
+ _ => TimelockInfo :: default ( ) ,
748
+ } ;
749
+ infos. push ( info) ;
749
750
}
751
+ // Ok to unwrap, we had to have visited at least one node.
752
+ infos. pop ( ) . unwrap ( )
750
753
}
751
754
752
755
/// This returns whether the given policy is valid or not. It maybe possible that the policy
0 commit comments