@@ -1136,8 +1136,11 @@ mod tests {
11361136
11371137 let schnorr_sig = secp256k1:: schnorr:: Signature :: from_str ( "84526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f0784526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f07" ) . unwrap ( ) ;
11381138 let s = SimpleSatisfier ( schnorr_sig) ;
1139+ let template = tap_ms. build_template ( & s) ;
1140+ assert_eq ! ( template. absolute_timelock, None ) ;
1141+ assert_eq ! ( template. relative_timelock, None ) ;
11391142
1140- let wit = tap_ms. satisfy ( s) . unwrap ( ) ;
1143+ let wit = tap_ms. satisfy ( & s) . unwrap ( ) ;
11411144 assert_eq ! ( wit, vec![ schnorr_sig. as_ref( ) . to_vec( ) , vec![ ] , vec![ ] ] ) ;
11421145 }
11431146
@@ -1171,4 +1174,113 @@ mod tests {
11711174 SegwitMs :: parse_insane ( & script) . unwrap_err ( ) ;
11721175 SegwitMs :: parse_with_ext ( & script, & ExtParams :: allow_all ( ) ) . unwrap ( ) ;
11731176 }
1177+
1178+ #[ test]
1179+ fn template_timelocks ( ) {
1180+ let key_present = bitcoin:: PublicKey :: from_str (
1181+ "0327a6ed0e71b451c79327aa9e4a6bb26ffb1c0056abc02c25e783f6096b79bb4f" ,
1182+ )
1183+ . unwrap ( ) ;
1184+ let key_missing = bitcoin:: PublicKey :: from_str (
1185+ "03e4d788718644a59030b1d234d8bb8fff28314720b9a1a237874b74b089c638da" ,
1186+ )
1187+ . unwrap ( ) ;
1188+
1189+ // ms, absolute_timelock, relative_timelock
1190+ let test_cases = vec ! [
1191+ (
1192+ format!( "t:or_c(pk({}),v:pkh({}))" , key_present, key_missing) ,
1193+ None ,
1194+ None ,
1195+ ) ,
1196+ (
1197+ format!(
1198+ "thresh(2,pk({}),s:pk({}),snl:after(1))" ,
1199+ key_present, key_missing
1200+ ) ,
1201+ Some ( bitcoin:: PackedLockTime ( 1 ) ) ,
1202+ None ,
1203+ ) ,
1204+ (
1205+ format!(
1206+ "or_d(pk({}),and_v(v:pk({}),older(12960)))" ,
1207+ key_present, key_missing
1208+ ) ,
1209+ None ,
1210+ None ,
1211+ ) ,
1212+ (
1213+ format!(
1214+ "or_d(pk({}),and_v(v:pk({}),older(12960)))" ,
1215+ key_missing, key_present
1216+ ) ,
1217+ None ,
1218+ Some ( bitcoin:: Sequence ( 12960 ) ) ,
1219+ ) ,
1220+ (
1221+ format!(
1222+ "thresh(3,pk({}),s:pk({}),snl:older(10),snl:after(11))" ,
1223+ key_present, key_missing
1224+ ) ,
1225+ Some ( bitcoin:: PackedLockTime ( 11 ) ) ,
1226+ Some ( bitcoin:: Sequence ( 10 ) ) ,
1227+ ) ,
1228+ (
1229+ format!( "and_v(v:and_v(v:pk({}),older(10)),older(20))" , key_present) ,
1230+ None ,
1231+ Some ( bitcoin:: Sequence ( 20 ) ) ,
1232+ ) ,
1233+ (
1234+ format!(
1235+ "andor(pk({}),older(10),and_v(v:pk({}),older(20)))" ,
1236+ key_present, key_missing
1237+ ) ,
1238+ None ,
1239+ Some ( bitcoin:: Sequence ( 10 ) ) ,
1240+ ) ,
1241+ ] ;
1242+
1243+ // Test satisfaction code
1244+ struct SimpleSatisfier ( secp256k1:: schnorr:: Signature , bitcoin:: PublicKey ) ;
1245+
1246+ // a simple satisfier that always outputs the same signature
1247+ impl Satisfier < bitcoin:: PublicKey > for SimpleSatisfier {
1248+ fn lookup_tap_leaf_script_sig (
1249+ & self ,
1250+ pk : & bitcoin:: PublicKey ,
1251+ _h : & TapLeafHash ,
1252+ ) -> Option < bitcoin:: SchnorrSig > {
1253+ if pk == & self . 1 {
1254+ Some ( bitcoin:: SchnorrSig {
1255+ sig : self . 0 ,
1256+ hash_ty : bitcoin:: SchnorrSighashType :: Default ,
1257+ } )
1258+ } else {
1259+ None
1260+ }
1261+ }
1262+
1263+ fn check_older ( & self , _: bitcoin:: Sequence ) -> bool {
1264+ true
1265+ }
1266+
1267+ fn check_after ( & self , _: bitcoin:: LockTime ) -> bool {
1268+ true
1269+ }
1270+ }
1271+
1272+ let schnorr_sig = secp256k1:: schnorr:: Signature :: from_str ( "84526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f0784526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f07" ) . unwrap ( ) ;
1273+ let s = SimpleSatisfier ( schnorr_sig, key_present) ;
1274+
1275+ for ( ms_str, absolute_timelock, relative_timelock) in test_cases {
1276+ let ms = Miniscript :: < bitcoin:: PublicKey , Tap > :: from_str ( & ms_str) . unwrap ( ) ;
1277+ let template = ms. build_template ( & s) ;
1278+ match template. stack {
1279+ crate :: miniscript:: satisfy:: Witness :: Stack ( _) => { }
1280+ _ => panic ! ( "Should be possible" ) ,
1281+ }
1282+ assert_eq ! ( template. absolute_timelock, absolute_timelock, "{}" , ms_str) ;
1283+ assert_eq ! ( template. relative_timelock, relative_timelock, "{}" , ms_str) ;
1284+ }
1285+ }
11741286}
0 commit comments