@@ -1125,8 +1125,11 @@ mod tests {
11251125
11261126 let schnorr_sig = secp256k1:: schnorr:: Signature :: from_str ( "84526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f0784526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f07" ) . unwrap ( ) ;
11271127 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 ) ;
11281131
1129- let wit = tap_ms. satisfy ( s) . unwrap ( ) ;
1132+ let wit = tap_ms. satisfy ( & s) . unwrap ( ) ;
11301133 assert_eq ! ( wit, vec![ schnorr_sig. as_ref( ) . to_vec( ) , vec![ ] , vec![ ] ] ) ;
11311134 }
11321135
@@ -1179,4 +1182,114 @@ mod tests {
11791182 t. pk_map . insert ( String :: from ( "A" ) , uncompressed) ;
11801183 ms. translate_pk ( & mut t) . unwrap_err ( ) ;
11811184 }
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+ }
11821295}
0 commit comments