@@ -1251,8 +1251,11 @@ mod tests {
12511251
12521252 let schnorr_sig = secp256k1:: schnorr:: Signature :: from_str ( "84526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f0784526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f07" ) . unwrap ( ) ;
12531253 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 ) ;
12541257
1255- let wit = tap_ms. satisfy ( s) . unwrap ( ) ;
1258+ let wit = tap_ms. satisfy ( & s) . unwrap ( ) ;
12561259 assert_eq ! ( wit, vec![ schnorr_sig. as_ref( ) . to_vec( ) , vec![ ] , vec![ ] ] ) ;
12571260 }
12581261
@@ -1305,4 +1308,114 @@ mod tests {
13051308 t. pk_map . insert ( String :: from ( "A" ) , uncompressed) ;
13061309 ms. translate_pk ( & mut t) . unwrap_err ( ) ;
13071310 }
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+ }
13081421}
0 commit comments