Skip to content

Commit a887241

Browse files
test: absolute/relative timelocks in satisfaction
Co-authored-by: Alekos Filini <[email protected]>
1 parent 473932b commit a887241

File tree

1 file changed

+113
-1
lines changed

1 file changed

+113
-1
lines changed

src/miniscript/mod.rs

+113-1
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)