@@ -25,11 +25,9 @@ use std::{cmp, i64, mem};
2525use bitcoin;
2626use bitcoin:: hashes:: { hash160, ripemd160, sha256, sha256d} ;
2727use bitcoin:: secp256k1:: XOnlyPublicKey ;
28+ use bitcoin:: timelock;
2829use bitcoin:: util:: taproot:: { ControlBlock , LeafVersion , TapLeafHash } ;
2930
30- use crate :: miniscript:: limits:: {
31- LOCKTIME_THRESHOLD , SEQUENCE_LOCKTIME_DISABLE_FLAG , SEQUENCE_LOCKTIME_TYPE_FLAG ,
32- } ;
3331use crate :: util:: witness_size;
3432use crate :: { Miniscript , MiniscriptKey , ScriptContext , Terminal , ToPublicKey } ;
3533
@@ -110,56 +108,36 @@ pub trait Satisfier<Pk: MiniscriptKey + ToPublicKey> {
110108 }
111109
112110 /// Assert whether an relative locktime is satisfied
113- fn check_older ( & self , _: u32 ) -> bool {
111+ fn check_older ( & self , _: timelock :: Rel ) -> bool {
114112 false
115113 }
116114
117115 /// Assert whether a absolute locktime is satisfied
118- fn check_after ( & self , _: u32 ) -> bool {
116+ fn check_after ( & self , _: timelock :: Abs ) -> bool {
119117 false
120118 }
121119}
122120
123121// Allow use of `()` as a "no conditions available" satisfier
124122impl < Pk : MiniscriptKey + ToPublicKey > Satisfier < Pk > for ( ) { }
125123
126- /// Newtype around `u32` which implements `Satisfier` using `n` as an
127- /// relative locktime
128- pub struct Older ( pub u32 ) ;
129-
130- impl < Pk : MiniscriptKey + ToPublicKey > Satisfier < Pk > for Older {
131- fn check_older ( & self , n : u32 ) -> bool {
132- if self . 0 & SEQUENCE_LOCKTIME_DISABLE_FLAG != 0 {
124+ impl < Pk : MiniscriptKey + ToPublicKey > Satisfier < Pk > for timelock:: Rel {
125+ fn check_older ( & self , n : timelock:: Rel ) -> bool {
126+ if self . is_disabled ( ) {
133127 return true ;
134128 }
135129
136- /* If nSequence encodes a relative lock-time, this mask is
137- * applied to extract that lock-time from the sequence field. */
138- const SEQUENCE_LOCKTIME_MASK : u32 = 0x0000ffff ;
139-
140- let mask = SEQUENCE_LOCKTIME_MASK | SEQUENCE_LOCKTIME_TYPE_FLAG ;
141- let masked_n = n & mask;
142- let masked_seq = self . 0 & mask;
143- if masked_n < SEQUENCE_LOCKTIME_TYPE_FLAG && masked_seq >= SEQUENCE_LOCKTIME_TYPE_FLAG {
144- false
145- } else {
146- masked_n <= masked_seq
130+ if !self . is_same_type ( n) {
131+ return false ;
147132 }
133+
134+ n. value ( ) <= self . value ( )
148135 }
149136}
150137
151- /// Newtype around `u32` which implements `Satisfier` using `n` as an
152- /// absolute locktime
153- pub struct After ( pub u32 ) ;
154-
155- impl < Pk : MiniscriptKey + ToPublicKey > Satisfier < Pk > for After {
156- fn check_after ( & self , n : u32 ) -> bool {
157- // if n > self.0; we will be returning false anyways
158- if n < LOCKTIME_THRESHOLD && self . 0 >= LOCKTIME_THRESHOLD {
159- false
160- } else {
161- n <= self . 0
162- }
138+ impl < Pk : MiniscriptKey + ToPublicKey > Satisfier < Pk > for timelock:: Abs {
139+ fn check_after ( & self , n : timelock:: Abs ) -> bool {
140+ n. is_expired ( self . to_u32 ( ) ) . ok ( ) . unwrap_or ( false )
163141 }
164142}
165143
@@ -273,11 +251,11 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
273251 ( * * self ) . lookup_hash160 ( h)
274252 }
275253
276- fn check_older ( & self , t : u32 ) -> bool {
254+ fn check_older ( & self , t : timelock :: Rel ) -> bool {
277255 ( * * self ) . check_older ( t)
278256 }
279257
280- fn check_after ( & self , t : u32 ) -> bool {
258+ fn check_after ( & self , t : timelock :: Abs ) -> bool {
281259 ( * * self ) . check_after ( t)
282260 }
283261}
@@ -335,11 +313,11 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
335313 ( * * self ) . lookup_hash160 ( h)
336314 }
337315
338- fn check_older ( & self , t : u32 ) -> bool {
316+ fn check_older ( & self , t : timelock :: Rel ) -> bool {
339317 ( * * self ) . check_older ( t)
340318 }
341319
342- fn check_after ( & self , t : u32 ) -> bool {
320+ fn check_after ( & self , t : timelock :: Abs ) -> bool {
343321 ( * * self ) . check_after ( t)
344322 }
345323}
@@ -473,7 +451,7 @@ macro_rules! impl_tuple_satisfier {
473451 None
474452 }
475453
476- fn check_older( & self , n: u32 ) -> bool {
454+ fn check_older( & self , n: timelock :: Rel ) -> bool {
477455 let & ( $( ref $ty, ) * ) = self ;
478456 $(
479457 if $ty. check_older( n) {
@@ -483,7 +461,7 @@ macro_rules! impl_tuple_satisfier {
483461 false
484462 }
485463
486- fn check_after( & self , n: u32 ) -> bool {
464+ fn check_after( & self , n: timelock :: Abs ) -> bool {
487465 let & ( $( ref $ty, ) * ) = self ;
488466 $(
489467 if $ty. check_after( n) {
0 commit comments