@@ -1230,8 +1230,11 @@ mod tests {
1230
1230
1231
1231
let schnorr_sig = secp256k1:: schnorr:: Signature :: from_str ( "84526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f0784526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f07" ) . unwrap ( ) ;
1232
1232
let s = SimpleSatisfier ( schnorr_sig) ;
1233
+ let template = tap_ms. build_template ( & s) ;
1234
+ assert_eq ! ( template. absolute_timelock, None ) ;
1235
+ assert_eq ! ( template. relative_timelock, None ) ;
1233
1236
1234
- let wit = tap_ms. satisfy ( s) . unwrap ( ) ;
1237
+ let wit = tap_ms. satisfy ( & s) . unwrap ( ) ;
1235
1238
assert_eq ! ( wit, vec![ schnorr_sig. as_ref( ) . to_vec( ) , vec![ ] , vec![ ] ] ) ;
1236
1239
}
1237
1240
@@ -1284,4 +1287,114 @@ mod tests {
1284
1287
t. pk_map . insert ( String :: from ( "A" ) , uncompressed) ;
1285
1288
ms. translate_pk ( & mut t) . unwrap_err ( ) ;
1286
1289
}
1290
+
1291
+ #[ test]
1292
+ fn template_timelocks ( ) {
1293
+ use crate :: AbsLockTime ;
1294
+ let key_present = bitcoin:: PublicKey :: from_str (
1295
+ "0327a6ed0e71b451c79327aa9e4a6bb26ffb1c0056abc02c25e783f6096b79bb4f" ,
1296
+ )
1297
+ . unwrap ( ) ;
1298
+ let key_missing = bitcoin:: PublicKey :: from_str (
1299
+ "03e4d788718644a59030b1d234d8bb8fff28314720b9a1a237874b74b089c638da" ,
1300
+ )
1301
+ . unwrap ( ) ;
1302
+
1303
+ // ms, absolute_timelock, relative_timelock
1304
+ let test_cases = vec ! [
1305
+ (
1306
+ format!( "t:or_c(pk({}),v:pkh({}))" , key_present, key_missing) ,
1307
+ None ,
1308
+ None ,
1309
+ ) ,
1310
+ (
1311
+ format!(
1312
+ "thresh(2,pk({}),s:pk({}),snl:after(1))" ,
1313
+ key_present, key_missing
1314
+ ) ,
1315
+ Some ( AbsLockTime :: from_consensus( 1 ) ) ,
1316
+ None ,
1317
+ ) ,
1318
+ (
1319
+ format!(
1320
+ "or_d(pk({}),and_v(v:pk({}),older(12960)))" ,
1321
+ key_present, key_missing
1322
+ ) ,
1323
+ None ,
1324
+ None ,
1325
+ ) ,
1326
+ (
1327
+ format!(
1328
+ "or_d(pk({}),and_v(v:pk({}),older(12960)))" ,
1329
+ key_missing, key_present
1330
+ ) ,
1331
+ None ,
1332
+ Some ( bitcoin:: Sequence ( 12960 ) ) ,
1333
+ ) ,
1334
+ (
1335
+ format!(
1336
+ "thresh(3,pk({}),s:pk({}),snl:older(10),snl:after(11))" ,
1337
+ key_present, key_missing
1338
+ ) ,
1339
+ Some ( AbsLockTime :: from_consensus( 11 ) ) ,
1340
+ Some ( bitcoin:: Sequence ( 10 ) ) ,
1341
+ ) ,
1342
+ (
1343
+ format!( "and_v(v:and_v(v:pk({}),older(10)),older(20))" , key_present) ,
1344
+ None ,
1345
+ Some ( bitcoin:: Sequence ( 20 ) ) ,
1346
+ ) ,
1347
+ (
1348
+ format!(
1349
+ "andor(pk({}),older(10),and_v(v:pk({}),older(20)))" ,
1350
+ key_present, key_missing
1351
+ ) ,
1352
+ None ,
1353
+ Some ( bitcoin:: Sequence ( 10 ) ) ,
1354
+ ) ,
1355
+ ] ;
1356
+
1357
+ // Test satisfaction code
1358
+ struct SimpleSatisfier ( secp256k1:: schnorr:: Signature , bitcoin:: PublicKey ) ;
1359
+
1360
+ // a simple satisfier that always outputs the same signature
1361
+ impl Satisfier < bitcoin:: PublicKey > for SimpleSatisfier {
1362
+ fn lookup_tap_leaf_script_sig (
1363
+ & self ,
1364
+ pk : & bitcoin:: PublicKey ,
1365
+ _h : & TapLeafHash ,
1366
+ ) -> Option < bitcoin:: taproot:: Signature > {
1367
+ if pk == & self . 1 {
1368
+ Some ( bitcoin:: taproot:: Signature {
1369
+ sig : self . 0 ,
1370
+ hash_ty : bitcoin:: sighash:: TapSighashType :: Default ,
1371
+ } )
1372
+ } else {
1373
+ None
1374
+ }
1375
+ }
1376
+
1377
+ fn check_older ( & self , _: bitcoin:: Sequence ) -> bool {
1378
+ true
1379
+ }
1380
+
1381
+ fn check_after ( & self , _: bitcoin:: absolute:: LockTime ) -> bool {
1382
+ true
1383
+ }
1384
+ }
1385
+
1386
+ let schnorr_sig = secp256k1:: schnorr:: Signature :: from_str ( "84526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f0784526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f07" ) . unwrap ( ) ;
1387
+ let s = SimpleSatisfier ( schnorr_sig, key_present) ;
1388
+
1389
+ for ( ms_str, absolute_timelock, relative_timelock) in test_cases {
1390
+ let ms = Miniscript :: < bitcoin:: PublicKey , Tap > :: from_str ( & ms_str) . unwrap ( ) ;
1391
+ let template = ms. build_template ( & s) ;
1392
+ match template. stack {
1393
+ crate :: miniscript:: satisfy:: Witness :: Stack ( _) => { }
1394
+ _ => panic ! ( "All testcases should be possible" ) ,
1395
+ }
1396
+ assert_eq ! ( template. absolute_timelock, absolute_timelock, "{}" , ms_str) ;
1397
+ assert_eq ! ( template. relative_timelock, relative_timelock, "{}" , ms_str) ;
1398
+ }
1399
+ }
1287
1400
}
0 commit comments