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