@@ -25,11 +25,9 @@ use std::{cmp, i64, mem};
25
25
use bitcoin;
26
26
use bitcoin:: hashes:: { hash160, ripemd160, sha256, sha256d} ;
27
27
use bitcoin:: secp256k1:: XOnlyPublicKey ;
28
+ use bitcoin:: timelock;
28
29
use bitcoin:: util:: taproot:: { ControlBlock , LeafVersion , TapLeafHash } ;
29
30
30
- use crate :: miniscript:: limits:: {
31
- LOCKTIME_THRESHOLD , SEQUENCE_LOCKTIME_DISABLE_FLAG , SEQUENCE_LOCKTIME_TYPE_FLAG ,
32
- } ;
33
31
use crate :: util:: witness_size;
34
32
use crate :: { Miniscript , MiniscriptKey , ScriptContext , Terminal , ToPublicKey } ;
35
33
@@ -110,56 +108,36 @@ pub trait Satisfier<Pk: MiniscriptKey + ToPublicKey> {
110
108
}
111
109
112
110
/// Assert whether an relative locktime is satisfied
113
- fn check_older ( & self , _: u32 ) -> bool {
111
+ fn check_older ( & self , _: timelock :: Rel ) -> bool {
114
112
false
115
113
}
116
114
117
115
/// Assert whether a absolute locktime is satisfied
118
- fn check_after ( & self , _: u32 ) -> bool {
116
+ fn check_after ( & self , _: timelock :: Abs ) -> bool {
119
117
false
120
118
}
121
119
}
122
120
123
121
// Allow use of `()` as a "no conditions available" satisfier
124
122
impl < Pk : MiniscriptKey + ToPublicKey > Satisfier < Pk > for ( ) { }
125
123
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 ( ) {
133
127
return true ;
134
128
}
135
129
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 ;
147
132
}
133
+
134
+ n. value ( ) <= self . value ( )
148
135
}
149
136
}
150
137
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 )
163
141
}
164
142
}
165
143
@@ -273,11 +251,11 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
273
251
( * * self ) . lookup_hash160 ( h)
274
252
}
275
253
276
- fn check_older ( & self , t : u32 ) -> bool {
254
+ fn check_older ( & self , t : timelock :: Rel ) -> bool {
277
255
( * * self ) . check_older ( t)
278
256
}
279
257
280
- fn check_after ( & self , t : u32 ) -> bool {
258
+ fn check_after ( & self , t : timelock :: Abs ) -> bool {
281
259
( * * self ) . check_after ( t)
282
260
}
283
261
}
@@ -335,11 +313,11 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
335
313
( * * self ) . lookup_hash160 ( h)
336
314
}
337
315
338
- fn check_older ( & self , t : u32 ) -> bool {
316
+ fn check_older ( & self , t : timelock :: Rel ) -> bool {
339
317
( * * self ) . check_older ( t)
340
318
}
341
319
342
- fn check_after ( & self , t : u32 ) -> bool {
320
+ fn check_after ( & self , t : timelock :: Abs ) -> bool {
343
321
( * * self ) . check_after ( t)
344
322
}
345
323
}
@@ -473,7 +451,7 @@ macro_rules! impl_tuple_satisfier {
473
451
None
474
452
}
475
453
476
- fn check_older( & self , n: u32 ) -> bool {
454
+ fn check_older( & self , n: timelock :: Rel ) -> bool {
477
455
let & ( $( ref $ty, ) * ) = self ;
478
456
$(
479
457
if $ty. check_older( n) {
@@ -483,7 +461,7 @@ macro_rules! impl_tuple_satisfier {
483
461
false
484
462
}
485
463
486
- fn check_after( & self , n: u32 ) -> bool {
464
+ fn check_after( & self , n: timelock :: Abs ) -> bool {
487
465
let & ( $( ref $ty, ) * ) = self ;
488
466
$(
489
467
if $ty. check_after( n) {
0 commit comments