@@ -1251,8 +1251,11 @@ mod tests {
1251
1251
1252
1252
let schnorr_sig = secp256k1:: schnorr:: Signature :: from_str ( "84526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f0784526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f07" ) . unwrap ( ) ;
1253
1253
let s = SimpleSatisfier ( schnorr_sig) ;
1254
+ let template = tap_ms. build_template ( & s) ;
1255
+ assert_eq ! ( template. absolute_timelock, None ) ;
1256
+ assert_eq ! ( template. relative_timelock, None ) ;
1254
1257
1255
- let wit = tap_ms. satisfy ( s) . unwrap ( ) ;
1258
+ let wit = tap_ms. satisfy ( & s) . unwrap ( ) ;
1256
1259
assert_eq ! ( wit, vec![ schnorr_sig. as_ref( ) . to_vec( ) , vec![ ] , vec![ ] ] ) ;
1257
1260
}
1258
1261
@@ -1305,4 +1308,114 @@ mod tests {
1305
1308
t. pk_map . insert ( String :: from ( "A" ) , uncompressed) ;
1306
1309
ms. translate_pk ( & mut t) . unwrap_err ( ) ;
1307
1310
}
1311
+
1312
+ #[ test]
1313
+ fn template_timelocks ( ) {
1314
+ use crate :: AbsLockTime ;
1315
+ let key_present = bitcoin:: PublicKey :: from_str (
1316
+ "0327a6ed0e71b451c79327aa9e4a6bb26ffb1c0056abc02c25e783f6096b79bb4f" ,
1317
+ )
1318
+ . unwrap ( ) ;
1319
+ let key_missing = bitcoin:: PublicKey :: from_str (
1320
+ "03e4d788718644a59030b1d234d8bb8fff28314720b9a1a237874b74b089c638da" ,
1321
+ )
1322
+ . unwrap ( ) ;
1323
+
1324
+ // ms, absolute_timelock, relative_timelock
1325
+ let test_cases = vec ! [
1326
+ (
1327
+ format!( "t:or_c(pk({}),v:pkh({}))" , key_present, key_missing) ,
1328
+ None ,
1329
+ None ,
1330
+ ) ,
1331
+ (
1332
+ format!(
1333
+ "thresh(2,pk({}),s:pk({}),snl:after(1))" ,
1334
+ key_present, key_missing
1335
+ ) ,
1336
+ Some ( AbsLockTime :: from_consensus( 1 ) ) ,
1337
+ None ,
1338
+ ) ,
1339
+ (
1340
+ format!(
1341
+ "or_d(pk({}),and_v(v:pk({}),older(12960)))" ,
1342
+ key_present, key_missing
1343
+ ) ,
1344
+ None ,
1345
+ None ,
1346
+ ) ,
1347
+ (
1348
+ format!(
1349
+ "or_d(pk({}),and_v(v:pk({}),older(12960)))" ,
1350
+ key_missing, key_present
1351
+ ) ,
1352
+ None ,
1353
+ Some ( bitcoin:: Sequence ( 12960 ) ) ,
1354
+ ) ,
1355
+ (
1356
+ format!(
1357
+ "thresh(3,pk({}),s:pk({}),snl:older(10),snl:after(11))" ,
1358
+ key_present, key_missing
1359
+ ) ,
1360
+ Some ( AbsLockTime :: from_consensus( 11 ) ) ,
1361
+ Some ( bitcoin:: Sequence ( 10 ) ) ,
1362
+ ) ,
1363
+ (
1364
+ format!( "and_v(v:and_v(v:pk({}),older(10)),older(20))" , key_present) ,
1365
+ None ,
1366
+ Some ( bitcoin:: Sequence ( 20 ) ) ,
1367
+ ) ,
1368
+ (
1369
+ format!(
1370
+ "andor(pk({}),older(10),and_v(v:pk({}),older(20)))" ,
1371
+ key_present, key_missing
1372
+ ) ,
1373
+ None ,
1374
+ Some ( bitcoin:: Sequence ( 10 ) ) ,
1375
+ ) ,
1376
+ ] ;
1377
+
1378
+ // Test satisfaction code
1379
+ struct SimpleSatisfier ( secp256k1:: schnorr:: Signature , bitcoin:: PublicKey ) ;
1380
+
1381
+ // a simple satisfier that always outputs the same signature
1382
+ impl Satisfier < bitcoin:: PublicKey > for SimpleSatisfier {
1383
+ fn lookup_tap_leaf_script_sig (
1384
+ & self ,
1385
+ pk : & bitcoin:: PublicKey ,
1386
+ _h : & TapLeafHash ,
1387
+ ) -> Option < bitcoin:: taproot:: Signature > {
1388
+ if pk == & self . 1 {
1389
+ Some ( bitcoin:: taproot:: Signature {
1390
+ sig : self . 0 ,
1391
+ hash_ty : bitcoin:: sighash:: TapSighashType :: Default ,
1392
+ } )
1393
+ } else {
1394
+ None
1395
+ }
1396
+ }
1397
+
1398
+ fn check_older ( & self , _: bitcoin:: Sequence ) -> bool {
1399
+ true
1400
+ }
1401
+
1402
+ fn check_after ( & self , _: bitcoin:: absolute:: LockTime ) -> bool {
1403
+ true
1404
+ }
1405
+ }
1406
+
1407
+ let schnorr_sig = secp256k1:: schnorr:: Signature :: from_str ( "84526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f0784526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f07" ) . unwrap ( ) ;
1408
+ let s = SimpleSatisfier ( schnorr_sig, key_present) ;
1409
+
1410
+ for ( ms_str, absolute_timelock, relative_timelock) in test_cases {
1411
+ let ms = Miniscript :: < bitcoin:: PublicKey , Tap > :: from_str ( & ms_str) . unwrap ( ) ;
1412
+ let template = ms. build_template ( & s) ;
1413
+ match template. stack {
1414
+ crate :: miniscript:: satisfy:: Witness :: Stack ( _) => { }
1415
+ _ => panic ! ( "All testcases should be possible" ) ,
1416
+ }
1417
+ assert_eq ! ( template. absolute_timelock, absolute_timelock, "{}" , ms_str) ;
1418
+ assert_eq ! ( template. relative_timelock, relative_timelock, "{}" , ms_str) ;
1419
+ }
1420
+ }
1308
1421
}
0 commit comments