@@ -22,7 +22,7 @@ use core::{cmp, i64, mem};
22
22
23
23
use bitcoin:: secp256k1:: XOnlyPublicKey ;
24
24
use bitcoin:: util:: taproot:: { ControlBlock , LeafVersion , TapLeafHash } ;
25
- use bitcoin:: { LockTime , Sequence } ;
25
+ use bitcoin:: { absolute , relative , Sequence } ;
26
26
use sync:: Arc ;
27
27
28
28
use crate :: prelude:: * ;
@@ -106,12 +106,12 @@ pub trait Satisfier<Pk: MiniscriptKey + ToPublicKey> {
106
106
}
107
107
108
108
/// Assert whether an relative locktime is satisfied
109
- fn check_older ( & self , _: Sequence ) -> bool {
109
+ fn check_older ( & self , _: relative :: LockTime ) -> bool {
110
110
false
111
111
}
112
112
113
113
/// Assert whether a absolute locktime is satisfied
114
- fn check_after ( & self , _: LockTime ) -> bool {
114
+ fn check_after ( & self , _: absolute :: LockTime ) -> bool {
115
115
false
116
116
}
117
117
}
@@ -120,32 +120,18 @@ pub trait Satisfier<Pk: MiniscriptKey + ToPublicKey> {
120
120
impl < Pk : MiniscriptKey + ToPublicKey > Satisfier < Pk > for ( ) { }
121
121
122
122
impl < Pk : MiniscriptKey + ToPublicKey > Satisfier < Pk > for Sequence {
123
- fn check_older ( & self , n : Sequence ) -> bool {
123
+ fn check_older ( & self , n : relative :: LockTime ) -> bool {
124
124
if !self . is_relative_lock_time ( ) {
125
125
return false ;
126
126
}
127
127
128
- // We need a relative lock time type in rust-bitcoin to clean this up.
129
-
130
- /* If nSequence encodes a relative lock-time, this mask is
131
- * applied to extract that lock-time from the sequence field. */
132
- const SEQUENCE_LOCKTIME_MASK : u32 = 0x0000ffff ;
133
- const SEQUENCE_LOCKTIME_TYPE_FLAG : u32 = 0x00400000 ;
134
-
135
- let mask = SEQUENCE_LOCKTIME_MASK | SEQUENCE_LOCKTIME_TYPE_FLAG ;
136
- let masked_n = n. to_consensus_u32 ( ) & mask;
137
- let masked_seq = self . to_consensus_u32 ( ) & mask;
138
- if masked_n < SEQUENCE_LOCKTIME_TYPE_FLAG && masked_seq >= SEQUENCE_LOCKTIME_TYPE_FLAG {
139
- false
140
- } else {
141
- masked_n <= masked_seq
142
- }
128
+ n. is_satisfied_by ( * self )
143
129
}
144
130
}
145
131
146
- impl < Pk : MiniscriptKey + ToPublicKey > Satisfier < Pk > for LockTime {
147
- fn check_after ( & self , n : LockTime ) -> bool {
148
- use LockTime :: * ;
132
+ impl < Pk : MiniscriptKey + ToPublicKey > Satisfier < Pk > for absolute :: LockTime {
133
+ fn check_after ( & self , n : absolute :: LockTime ) -> bool {
134
+ use absolute :: LockTime :: * ;
149
135
150
136
match ( n, * self ) {
151
137
( Blocks ( n) , Blocks ( lock_time) ) => n <= lock_time,
@@ -265,11 +251,11 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
265
251
( * * self ) . lookup_hash160 ( h)
266
252
}
267
253
268
- fn check_older ( & self , t : Sequence ) -> bool {
254
+ fn check_older ( & self , t : relative :: LockTime ) -> bool {
269
255
( * * self ) . check_older ( t)
270
256
}
271
257
272
- fn check_after ( & self , n : LockTime ) -> bool {
258
+ fn check_after ( & self , n : absolute :: LockTime ) -> bool {
273
259
( * * self ) . check_after ( n)
274
260
}
275
261
}
@@ -327,11 +313,11 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
327
313
( * * self ) . lookup_hash160 ( h)
328
314
}
329
315
330
- fn check_older ( & self , t : Sequence ) -> bool {
316
+ fn check_older ( & self , t : relative :: LockTime ) -> bool {
331
317
( * * self ) . check_older ( t)
332
318
}
333
319
334
- fn check_after ( & self , n : LockTime ) -> bool {
320
+ fn check_after ( & self , n : absolute :: LockTime ) -> bool {
335
321
( * * self ) . check_after ( n)
336
322
}
337
323
}
@@ -465,7 +451,7 @@ macro_rules! impl_tuple_satisfier {
465
451
None
466
452
}
467
453
468
- fn check_older( & self , n: Sequence ) -> bool {
454
+ fn check_older( & self , n: relative :: LockTime ) -> bool {
469
455
let & ( $( ref $ty, ) * ) = self ;
470
456
$(
471
457
if $ty. check_older( n) {
@@ -475,7 +461,7 @@ macro_rules! impl_tuple_satisfier {
475
461
false
476
462
}
477
463
478
- fn check_after( & self , n: LockTime ) -> bool {
464
+ fn check_after( & self , n: absolute :: LockTime ) -> bool {
479
465
let & ( $( ref $ty, ) * ) = self ;
480
466
$(
481
467
if $ty. check_after( n) {
@@ -953,21 +939,31 @@ impl Satisfaction {
953
939
} ,
954
940
has_sig : false ,
955
941
} ,
956
- Terminal :: Older ( t) => Satisfaction {
957
- stack : if stfr. check_older ( t) {
958
- Witness :: empty ( )
959
- } else if root_has_sig {
960
- // If the root terminal has signature, the
961
- // signature covers the nLockTime and nSequence
962
- // values. The sender of the transaction should
963
- // take care that it signs the value such that the
964
- // timelock is not met
965
- Witness :: Impossible
966
- } else {
967
- Witness :: Unavailable
968
- } ,
942
+ Terminal :: Older ( t) => {
943
+ let older = {
944
+ match t. to_relative_lock_time ( ) {
945
+ // https://github.com/bitcoin/bips/blob/master/bip-0112.mediawiki
946
+ // Disable flag set => return true.
947
+ None => true ,
948
+ Some ( lock) => stfr. check_older ( lock) ,
949
+ }
950
+ } ;
951
+ Satisfaction {
952
+ stack : if older {
953
+ Witness :: empty ( )
954
+ } else if root_has_sig {
955
+ // If the root terminal has signature, the
956
+ // signature covers the nLockTime and nSequence
957
+ // values. The sender of the transaction should
958
+ // take care that it signs the value such that the
959
+ // timelock is not met
960
+ Witness :: Impossible
961
+ } else {
962
+ Witness :: Unavailable
963
+ } ,
969
964
970
- has_sig : false ,
965
+ has_sig : false ,
966
+ }
971
967
} ,
972
968
Terminal :: Ripemd160 ( ref h) => Satisfaction {
973
969
stack : Witness :: ripemd160_preimage ( stfr, h) ,
0 commit comments