Skip to content

Commit 525dcf5

Browse files
danielabrozzoniafilini
authored andcommitted
test: absolute/relative timelocks in satisfaction
Co-authored-by: Alekos Filini <alekos.filini@gmail.com>
1 parent 79292cd commit 525dcf5

File tree

1 file changed

+114
-1
lines changed

1 file changed

+114
-1
lines changed

src/miniscript/mod.rs

Lines changed: 114 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1251,8 +1251,11 @@ mod tests {
12511251

12521252
let schnorr_sig = secp256k1::schnorr::Signature::from_str("84526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f0784526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f07").unwrap();
12531253
let s = SimpleSatisfier(schnorr_sig);
1254+
let template = tap_ms.build_template(&s);
1255+
assert_eq!(template.absolute_timelock, None);
1256+
assert_eq!(template.relative_timelock, None);
12541257

1255-
let wit = tap_ms.satisfy(s).unwrap();
1258+
let wit = tap_ms.satisfy(&s).unwrap();
12561259
assert_eq!(wit, vec![schnorr_sig.as_ref().to_vec(), vec![], vec![]]);
12571260
}
12581261

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

0 commit comments

Comments
 (0)