Skip to content

Commit 5f8b7e5

Browse files
committed
2 parents 5761ce7 + 3610c1d commit 5f8b7e5

File tree

4 files changed

+46
-9
lines changed

4 files changed

+46
-9
lines changed

examples/htlc.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ fn main() {
3535

3636
assert_eq!(
3737
format!("{}", htlc_descriptor),
38-
"wsh(andor(pk(022222222222222222222222222222222222222222222222222222222222222222),sha256(1111111111111111111111111111111111111111111111111111111111111111),and_v(vc:pk_h(4377a5acd66dc5cb67148a24818d1e51fa183bd2),older(4444))))"
38+
"wsh(andor(pk(022222222222222222222222222222222222222222222222222222222222222222),sha256(1111111111111111111111111111111111111111111111111111111111111111),and_v(v:pkh(4377a5acd66dc5cb67148a24818d1e51fa183bd2),older(4444))))"
3939
);
4040

4141
assert_eq!(

src/descriptor/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,7 @@ mod tests {
565565
fn roundtrip_descriptor(s: &str) {
566566
let desc = Descriptor::<DummyKey>::from_str(&s).unwrap();
567567
let output = desc.to_string();
568-
let normalize_aliases = s.replace("c:pk_k(", "pk(");
568+
let normalize_aliases = s.replace("c:pk_k(", "pk(").replace("c:pk_h(", "pkh(");
569569
assert_eq!(normalize_aliases, output);
570570
}
571571

@@ -574,6 +574,7 @@ mod tests {
574574
roundtrip_descriptor("c:pk_k()");
575575
roundtrip_descriptor("wsh(pk())");
576576
roundtrip_descriptor("wsh(c:pk_k())");
577+
roundtrip_descriptor("c:pk_h()");
577578
}
578579
#[test]
579580
fn parse_descriptor() {

src/miniscript/astelem.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,9 @@ impl<Pk: MiniscriptKey> fmt::Display for Terminal<Pk> {
301301
if let Terminal::PkK(ref pk) = sub.node {
302302
// alias: pk(K) = c:pk_k(K)
303303
return write!(f, "pk({})", pk);
304+
} else if let Terminal::PkH(ref pkh) = sub.node {
305+
// alias: pkh(K) = c:pk_h(K)
306+
return write!(f, "pkh({})", pkh);
304307
}
305308
}
306309

@@ -314,6 +317,8 @@ impl<Pk: MiniscriptKey> fmt::Display for Terminal<Pk> {
314317
Some(('c', ms)) => {
315318
if let Terminal::PkK(ref _pk) = ms.node {
316319
fmt::Write::write_char(f, ':')?;
320+
} else if let Terminal::PkH(ref _pkh) = ms.node {
321+
fmt::Write::write_char(f, ':')?;
317322
}
318323
}
319324
_ => {}
@@ -345,7 +350,7 @@ where
345350
<<Pk as MiniscriptKey>::Hash as str::FromStr>::Err: ToString,
346351
{
347352
fn from_tree(top: &expression::Tree) -> Result<Terminal<Pk>, Error> {
348-
let aliased_wrap;
353+
let mut aliased_wrap;
349354
let frag_name;
350355
let frag_wrap;
351356
let mut name_split = top.name.split(':');
@@ -358,6 +363,9 @@ where
358363
if name == "pk" {
359364
frag_name = "pk_k";
360365
frag_wrap = "c";
366+
} else if name == "pkh" {
367+
frag_name = "pk_h";
368+
frag_wrap = "c";
361369
} else {
362370
frag_name = name;
363371
frag_wrap = "";
@@ -369,7 +377,13 @@ where
369377
}
370378
if name == "pk" {
371379
frag_name = "pk_k";
372-
aliased_wrap = wrap.to_owned() + &"c";
380+
aliased_wrap = wrap.to_owned();
381+
aliased_wrap.push_str("c");
382+
frag_wrap = &aliased_wrap;
383+
} else if name == "pkh" {
384+
frag_name = "pk_h";
385+
aliased_wrap = wrap.to_owned();
386+
aliased_wrap.push_str("c");
373387
frag_wrap = &aliased_wrap;
374388
} else {
375389
frag_name = name;

src/miniscript/mod.rs

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -526,11 +526,7 @@ mod tests {
526526
ty: Type::cast_check(Type::from_pk_h()).unwrap(),
527527
ext: ExtData::cast_check(ExtData::from_pk_h()).unwrap(),
528528
};
529-
string_rtt(
530-
pkh_ms,
531-
"[B/nduesm]c:[K/nduesm]pk_h(DummyKeyHash)",
532-
"c:pk_h()",
533-
);
529+
string_rtt(pkh_ms, "[B/nduesm]c:[K/nduesm]pk_h(DummyKeyHash)", "pkh()");
534530

535531
let pkk_ms: Miniscript<bitcoin::PublicKey> = Miniscript {
536532
node: Terminal::Check(Arc::new(Miniscript {
@@ -605,6 +601,32 @@ mod tests {
605601
"[B/onufsm]t[V/onfsm]v[B/onduesm]c:[K/onduesm]pk_k(PublicKey { compressed: true, key: PublicKey(aa4c32e50fb34a95a372940ae3654b692ea35294748c3dd2c08b29f87ba9288c8294efcb73dc719e45b91c45f084e77aebc07c1ff3ed8f37935130a36304a340) })",
606602
"tv:pk(028c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa)"
607603
);
604+
605+
let pubkey_hash =
606+
hash160::Hash::from_str("f54a5851e9372b87810a8e60cdd2e7cfd80b6e31").unwrap();
607+
let script: Miniscript<bitcoin::PublicKey> = ms_str!("c:pk_h({})", pubkey_hash.to_string());
608+
609+
string_rtt(
610+
script,
611+
"[B/nduesm]c:[K/nduesm]pk_h(f54a5851e9372b87810a8e60cdd2e7cfd80b6e31)",
612+
"pkh(f54a5851e9372b87810a8e60cdd2e7cfd80b6e31)",
613+
);
614+
615+
let script: Miniscript<bitcoin::PublicKey> = ms_str!("pkh({})", pubkey_hash.to_string());
616+
617+
string_rtt(
618+
script,
619+
"[B/nduesm]c:[K/nduesm]pk_h(f54a5851e9372b87810a8e60cdd2e7cfd80b6e31)",
620+
"pkh(f54a5851e9372b87810a8e60cdd2e7cfd80b6e31)",
621+
);
622+
623+
let script: Miniscript<bitcoin::PublicKey> = ms_str!("tv:pkh({})", pubkey_hash.to_string());
624+
625+
string_rtt(
626+
script,
627+
"[B/nufsm]t[V/nfsm]v[B/nduesm]c:[K/nduesm]pk_h(f54a5851e9372b87810a8e60cdd2e7cfd80b6e31)",
628+
"tv:pkh(f54a5851e9372b87810a8e60cdd2e7cfd80b6e31)",
629+
);
608630
}
609631

610632
#[test]

0 commit comments

Comments
 (0)