@@ -1136,8 +1136,11 @@ mod tests {
1136
1136
1137
1137
let schnorr_sig = secp256k1:: schnorr:: Signature :: from_str ( "84526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f0784526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f07" ) . unwrap ( ) ;
1138
1138
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 ) ;
1139
1142
1140
- let wit = tap_ms. satisfy ( s) . unwrap ( ) ;
1143
+ let wit = tap_ms. satisfy ( & s) . unwrap ( ) ;
1141
1144
assert_eq ! ( wit, vec![ schnorr_sig. as_ref( ) . to_vec( ) , vec![ ] , vec![ ] ] ) ;
1142
1145
}
1143
1146
@@ -1171,4 +1174,113 @@ mod tests {
1171
1174
SegwitMs :: parse_insane ( & script) . unwrap_err ( ) ;
1172
1175
SegwitMs :: parse_with_ext ( & script, & ExtParams :: allow_all ( ) ) . unwrap ( ) ;
1173
1176
}
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
+ }
1174
1286
}
0 commit comments