Skip to content

Commit 9290f99

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

File tree

1 file changed

+114
-1
lines changed

1 file changed

+114
-1
lines changed

src/miniscript/mod.rs

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

Comments
 (0)