Skip to content

Commit 0ffd43d

Browse files
committed
make substitute_raw_pkh() recursive
1 parent fbc3262 commit 0ffd43d

File tree

1 file changed

+64
-15
lines changed

1 file changed

+64
-15
lines changed

src/miniscript/mod.rs

+64-15
Original file line numberDiff line numberDiff line change
@@ -582,22 +582,71 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> Miniscript<Pk, Ctx> {
582582

583583
/// Substitutes raw public keys hashes with the public keys as provided by map.
584584
pub fn substitute_raw_pkh(&self, pk_map: &BTreeMap<hash160::Hash, Pk>) -> Miniscript<Pk, Ctx> {
585-
let mut translated = vec![];
586-
for data in Arc::new(self.clone()).post_order_iter() {
587-
let new_term = if let Terminal::RawPkH(ref p) = data.node.node {
588-
match pk_map.get(p) {
589-
Some(pk) => Terminal::PkH(pk.clone()),
590-
None => Terminal::RawPkH(*p),
591-
}
592-
} else {
593-
data.node.node.clone()
594-
};
595-
596-
let new_ms = Miniscript::from_ast(new_term).expect("typeck");
597-
translated.push(Arc::new(new_ms));
598-
}
585+
let new_term = match &self.node {
586+
Terminal::RawPkH(ref p) => match pk_map.get(p) {
587+
Some(pk) => Terminal::PkH(pk.clone()),
588+
None => Terminal::RawPkH(*p),
589+
},
590+
Terminal::Alt(sub) => Terminal::Alt(Arc::new(sub.substitute_raw_pkh(pk_map))),
591+
Terminal::Swap(sub) => Terminal::Swap(Arc::new(sub.substitute_raw_pkh(pk_map))),
592+
Terminal::Check(sub) => Terminal::Check(Arc::new(sub.substitute_raw_pkh(pk_map))),
593+
Terminal::DupIf(sub) => Terminal::DupIf(Arc::new(sub.substitute_raw_pkh(pk_map))),
594+
Terminal::Verify(sub) => Terminal::Verify(Arc::new(sub.substitute_raw_pkh(pk_map))),
595+
Terminal::NonZero(sub) => Terminal::NonZero(Arc::new(sub.substitute_raw_pkh(pk_map))),
596+
Terminal::ZeroNotEqual(sub) => {
597+
Terminal::ZeroNotEqual(Arc::new(sub.substitute_raw_pkh(pk_map)))
598+
}
599+
Terminal::AndV(left, right) => Terminal::AndV(
600+
Arc::new(left.substitute_raw_pkh(pk_map)),
601+
Arc::new(right.substitute_raw_pkh(pk_map)),
602+
),
603+
Terminal::AndB(left, right) => Terminal::AndB(
604+
Arc::new(left.substitute_raw_pkh(pk_map)),
605+
Arc::new(right.substitute_raw_pkh(pk_map)),
606+
),
607+
Terminal::OrB(left, right) => Terminal::OrB(
608+
Arc::new(left.substitute_raw_pkh(pk_map)),
609+
Arc::new(right.substitute_raw_pkh(pk_map)),
610+
),
611+
Terminal::OrD(left, right) => Terminal::OrD(
612+
Arc::new(left.substitute_raw_pkh(pk_map)),
613+
Arc::new(right.substitute_raw_pkh(pk_map)),
614+
),
615+
Terminal::OrC(left, right) => Terminal::OrC(
616+
Arc::new(left.substitute_raw_pkh(pk_map)),
617+
Arc::new(right.substitute_raw_pkh(pk_map)),
618+
),
619+
Terminal::OrI(left, right) => Terminal::OrI(
620+
Arc::new(left.substitute_raw_pkh(pk_map)),
621+
Arc::new(right.substitute_raw_pkh(pk_map)),
622+
),
623+
Terminal::AndOr(a, b, c) => Terminal::AndOr(
624+
Arc::new(a.substitute_raw_pkh(pk_map)),
625+
Arc::new(b.substitute_raw_pkh(pk_map)),
626+
Arc::new(c.substitute_raw_pkh(pk_map)),
627+
),
628+
Terminal::Thresh(t) => {
629+
let new_subs = t
630+
.iter()
631+
.map(|sub| Arc::new(sub.substitute_raw_pkh(pk_map)))
632+
.collect();
633+
Terminal::Thresh(crate::Threshold::new(t.k(), new_subs).expect(""))
634+
}
635+
// Multi doesn't contain any RawPkH to substitute
636+
Terminal::Multi(t) => Terminal::Multi(t.clone()),
637+
Terminal::MultiA(t) => Terminal::MultiA(t.clone()),
638+
Terminal::True | Terminal::False | Terminal::PkK(_) | Terminal::PkH(_) => {
639+
self.node.clone()
640+
}
641+
Terminal::After(n) => Terminal::After(*n), // No substitution needed
642+
Terminal::Older(n) => Terminal::Older(*n), // No substitution needed
643+
Terminal::Sha256(hash) => Terminal::Sha256(hash.clone()), // No substitution needed
644+
Terminal::Hash256(hash) => Terminal::Hash256(hash.clone()), // No substitution needed
645+
Terminal::Ripemd160(hash) => Terminal::Ripemd160(hash.clone()), // No substitution needed
646+
Terminal::Hash160(hash) => Terminal::Hash160(hash.clone()), // No s
647+
};
599648

600-
Arc::try_unwrap(translated.pop().unwrap()).unwrap()
649+
Miniscript::from_ast(new_term).expect("typeck")
601650
}
602651
}
603652

0 commit comments

Comments
 (0)