@@ -1230,8 +1230,11 @@ mod tests {
12301230
12311231 let schnorr_sig = secp256k1:: schnorr:: Signature :: from_str ( "84526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f0784526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f07" ) . unwrap ( ) ;
12321232 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 ) ;
12331236
1234- let wit = tap_ms. satisfy ( s) . unwrap ( ) ;
1237+ let wit = tap_ms. satisfy ( & s) . unwrap ( ) ;
12351238 assert_eq ! ( wit, vec![ schnorr_sig. as_ref( ) . to_vec( ) , vec![ ] , vec![ ] ] ) ;
12361239 }
12371240
@@ -1284,4 +1287,114 @@ mod tests {
12841287 t. pk_map . insert ( String :: from ( "A" ) , uncompressed) ;
12851288 ms. translate_pk ( & mut t) . unwrap_err ( ) ;
12861289 }
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+ }
12871400}
0 commit comments