Skip to content

Commit a358076

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

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
@@ -1230,8 +1230,11 @@ mod tests {
12301230

12311231
let schnorr_sig = secp256k1::schnorr::Signature::from_str("84526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f0784526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f07").unwrap();
12321232
let s = SimpleSatisfier(schnorr_sig);
1233+
let template = tap_ms.build_template(&s);
1234+
assert_eq!(template.absolute_timelock, None);
1235+
assert_eq!(template.relative_timelock, None);
12331236

1234-
let wit = tap_ms.satisfy(s).unwrap();
1237+
let wit = tap_ms.satisfy(&s).unwrap();
12351238
assert_eq!(wit, vec![schnorr_sig.as_ref().to_vec(), vec![], vec![]]);
12361239
}
12371240

@@ -1284,4 +1287,114 @@ mod tests {
12841287
t.pk_map.insert(String::from("A"), uncompressed);
12851288
ms.translate_pk(&mut t).unwrap_err();
12861289
}
1290+
1291+
#[test]
1292+
fn template_timelocks() {
1293+
use crate::AbsLockTime;
1294+
let key_present = bitcoin::PublicKey::from_str(
1295+
"0327a6ed0e71b451c79327aa9e4a6bb26ffb1c0056abc02c25e783f6096b79bb4f",
1296+
)
1297+
.unwrap();
1298+
let key_missing = bitcoin::PublicKey::from_str(
1299+
"03e4d788718644a59030b1d234d8bb8fff28314720b9a1a237874b74b089c638da",
1300+
)
1301+
.unwrap();
1302+
1303+
// ms, absolute_timelock, relative_timelock
1304+
let test_cases = vec![
1305+
(
1306+
format!("t:or_c(pk({}),v:pkh({}))", key_present, key_missing),
1307+
None,
1308+
None,
1309+
),
1310+
(
1311+
format!(
1312+
"thresh(2,pk({}),s:pk({}),snl:after(1))",
1313+
key_present, key_missing
1314+
),
1315+
Some(AbsLockTime::from_consensus(1)),
1316+
None,
1317+
),
1318+
(
1319+
format!(
1320+
"or_d(pk({}),and_v(v:pk({}),older(12960)))",
1321+
key_present, key_missing
1322+
),
1323+
None,
1324+
None,
1325+
),
1326+
(
1327+
format!(
1328+
"or_d(pk({}),and_v(v:pk({}),older(12960)))",
1329+
key_missing, key_present
1330+
),
1331+
None,
1332+
Some(bitcoin::Sequence(12960)),
1333+
),
1334+
(
1335+
format!(
1336+
"thresh(3,pk({}),s:pk({}),snl:older(10),snl:after(11))",
1337+
key_present, key_missing
1338+
),
1339+
Some(AbsLockTime::from_consensus(11)),
1340+
Some(bitcoin::Sequence(10)),
1341+
),
1342+
(
1343+
format!("and_v(v:and_v(v:pk({}),older(10)),older(20))", key_present),
1344+
None,
1345+
Some(bitcoin::Sequence(20)),
1346+
),
1347+
(
1348+
format!(
1349+
"andor(pk({}),older(10),and_v(v:pk({}),older(20)))",
1350+
key_present, key_missing
1351+
),
1352+
None,
1353+
Some(bitcoin::Sequence(10)),
1354+
),
1355+
];
1356+
1357+
// Test satisfaction code
1358+
struct SimpleSatisfier(secp256k1::schnorr::Signature, bitcoin::PublicKey);
1359+
1360+
// a simple satisfier that always outputs the same signature
1361+
impl Satisfier<bitcoin::PublicKey> for SimpleSatisfier {
1362+
fn lookup_tap_leaf_script_sig(
1363+
&self,
1364+
pk: &bitcoin::PublicKey,
1365+
_h: &TapLeafHash,
1366+
) -> Option<bitcoin::taproot::Signature> {
1367+
if pk == &self.1 {
1368+
Some(bitcoin::taproot::Signature {
1369+
sig: self.0,
1370+
hash_ty: bitcoin::sighash::TapSighashType::Default,
1371+
})
1372+
} else {
1373+
None
1374+
}
1375+
}
1376+
1377+
fn check_older(&self, _: bitcoin::Sequence) -> bool {
1378+
true
1379+
}
1380+
1381+
fn check_after(&self, _: bitcoin::absolute::LockTime) -> bool {
1382+
true
1383+
}
1384+
}
1385+
1386+
let schnorr_sig = secp256k1::schnorr::Signature::from_str("84526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f0784526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f07").unwrap();
1387+
let s = SimpleSatisfier(schnorr_sig, key_present);
1388+
1389+
for (ms_str, absolute_timelock, relative_timelock) in test_cases {
1390+
let ms = Miniscript::<bitcoin::PublicKey, Tap>::from_str(&ms_str).unwrap();
1391+
let template = ms.build_template(&s);
1392+
match template.stack {
1393+
crate::miniscript::satisfy::Witness::Stack(_) => {}
1394+
_ => panic!("All testcases should be possible"),
1395+
}
1396+
assert_eq!(template.absolute_timelock, absolute_timelock, "{}", ms_str);
1397+
assert_eq!(template.relative_timelock, relative_timelock, "{}", ms_str);
1398+
}
1399+
}
12871400
}

0 commit comments

Comments
 (0)