@@ -1125,8 +1125,11 @@ mod tests {
1125
1125
1126
1126
let schnorr_sig = secp256k1:: schnorr:: Signature :: from_str ( "84526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f0784526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f07" ) . unwrap ( ) ;
1127
1127
let s = SimpleSatisfier ( schnorr_sig) ;
1128
+ let template = tap_ms. build_template ( & s) ;
1129
+ assert_eq ! ( template. absolute_timelock, None ) ;
1130
+ assert_eq ! ( template. relative_timelock, None ) ;
1128
1131
1129
- let wit = tap_ms. satisfy ( s) . unwrap ( ) ;
1132
+ let wit = tap_ms. satisfy ( & s) . unwrap ( ) ;
1130
1133
assert_eq ! ( wit, vec![ schnorr_sig. as_ref( ) . to_vec( ) , vec![ ] , vec![ ] ] ) ;
1131
1134
}
1132
1135
@@ -1179,4 +1182,114 @@ mod tests {
1179
1182
t. pk_map . insert ( String :: from ( "A" ) , uncompressed) ;
1180
1183
ms. translate_pk ( & mut t) . unwrap_err ( ) ;
1181
1184
}
1185
+
1186
+ #[ test]
1187
+ fn template_timelocks ( ) {
1188
+ use crate :: AbsLockTime ;
1189
+ let key_present = bitcoin:: PublicKey :: from_str (
1190
+ "0327a6ed0e71b451c79327aa9e4a6bb26ffb1c0056abc02c25e783f6096b79bb4f" ,
1191
+ )
1192
+ . unwrap ( ) ;
1193
+ let key_missing = bitcoin:: PublicKey :: from_str (
1194
+ "03e4d788718644a59030b1d234d8bb8fff28314720b9a1a237874b74b089c638da" ,
1195
+ )
1196
+ . unwrap ( ) ;
1197
+
1198
+ // ms, absolute_timelock, relative_timelock
1199
+ let test_cases = vec ! [
1200
+ (
1201
+ format!( "t:or_c(pk({}),v:pkh({}))" , key_present, key_missing) ,
1202
+ None ,
1203
+ None ,
1204
+ ) ,
1205
+ (
1206
+ format!(
1207
+ "thresh(2,pk({}),s:pk({}),snl:after(1))" ,
1208
+ key_present, key_missing
1209
+ ) ,
1210
+ Some ( AbsLockTime :: from_consensus( 1 ) ) ,
1211
+ None ,
1212
+ ) ,
1213
+ (
1214
+ format!(
1215
+ "or_d(pk({}),and_v(v:pk({}),older(12960)))" ,
1216
+ key_present, key_missing
1217
+ ) ,
1218
+ None ,
1219
+ None ,
1220
+ ) ,
1221
+ (
1222
+ format!(
1223
+ "or_d(pk({}),and_v(v:pk({}),older(12960)))" ,
1224
+ key_missing, key_present
1225
+ ) ,
1226
+ None ,
1227
+ Some ( bitcoin:: Sequence ( 12960 ) ) ,
1228
+ ) ,
1229
+ (
1230
+ format!(
1231
+ "thresh(3,pk({}),s:pk({}),snl:older(10),snl:after(11))" ,
1232
+ key_present, key_missing
1233
+ ) ,
1234
+ Some ( AbsLockTime :: from_consensus( 11 ) ) ,
1235
+ Some ( bitcoin:: Sequence ( 10 ) ) ,
1236
+ ) ,
1237
+ (
1238
+ format!( "and_v(v:and_v(v:pk({}),older(10)),older(20))" , key_present) ,
1239
+ None ,
1240
+ Some ( bitcoin:: Sequence ( 20 ) ) ,
1241
+ ) ,
1242
+ (
1243
+ format!(
1244
+ "andor(pk({}),older(10),and_v(v:pk({}),older(20)))" ,
1245
+ key_present, key_missing
1246
+ ) ,
1247
+ None ,
1248
+ Some ( bitcoin:: Sequence ( 10 ) ) ,
1249
+ ) ,
1250
+ ] ;
1251
+
1252
+ // Test satisfaction code
1253
+ struct SimpleSatisfier ( secp256k1:: schnorr:: Signature , bitcoin:: PublicKey ) ;
1254
+
1255
+ // a simple satisfier that always outputs the same signature
1256
+ impl Satisfier < bitcoin:: PublicKey > for SimpleSatisfier {
1257
+ fn lookup_tap_leaf_script_sig (
1258
+ & self ,
1259
+ pk : & bitcoin:: PublicKey ,
1260
+ _h : & TapLeafHash ,
1261
+ ) -> Option < bitcoin:: taproot:: Signature > {
1262
+ if pk == & self . 1 {
1263
+ Some ( bitcoin:: taproot:: Signature {
1264
+ sig : self . 0 ,
1265
+ hash_ty : bitcoin:: sighash:: TapSighashType :: Default ,
1266
+ } )
1267
+ } else {
1268
+ None
1269
+ }
1270
+ }
1271
+
1272
+ fn check_older ( & self , _: bitcoin:: Sequence ) -> bool {
1273
+ true
1274
+ }
1275
+
1276
+ fn check_after ( & self , _: bitcoin:: absolute:: LockTime ) -> bool {
1277
+ true
1278
+ }
1279
+ }
1280
+
1281
+ let schnorr_sig = secp256k1:: schnorr:: Signature :: from_str ( "84526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f0784526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f07" ) . unwrap ( ) ;
1282
+ let s = SimpleSatisfier ( schnorr_sig, key_present) ;
1283
+
1284
+ for ( ms_str, absolute_timelock, relative_timelock) in test_cases {
1285
+ let ms = Miniscript :: < bitcoin:: PublicKey , Tap > :: from_str ( & ms_str) . unwrap ( ) ;
1286
+ let template = ms. build_template ( & s) ;
1287
+ match template. stack {
1288
+ crate :: miniscript:: satisfy:: Witness :: Stack ( _) => { }
1289
+ _ => panic ! ( "All testcases should be possible" ) ,
1290
+ }
1291
+ assert_eq ! ( template. absolute_timelock, absolute_timelock, "{}" , ms_str) ;
1292
+ assert_eq ! ( template. relative_timelock, relative_timelock, "{}" , ms_str) ;
1293
+ }
1294
+ }
1182
1295
}
0 commit comments