diff --git a/src/miniscript/astelem.rs b/src/miniscript/astelem.rs index 62dddf633..7be6704b5 100644 --- a/src/miniscript/astelem.rs +++ b/src/miniscript/astelem.rs @@ -21,8 +21,8 @@ use crate::miniscript::ScriptContext; use crate::prelude::*; use crate::util::MsKeyBuilder; use crate::{ - errstr, expression, script_num_size, AbsLockTime, Error, ForEachKey, Miniscript, MiniscriptKey, - Terminal, ToPublicKey, TranslateErr, TranslatePk, Translator, + errstr, expression, script_num_size, AbsLockTime, Error, Miniscript, MiniscriptKey, Terminal, + ToPublicKey, TranslateErr, TranslatePk, Translator, }; impl Terminal { @@ -64,44 +64,6 @@ where } impl Terminal { - pub(super) fn real_for_each_key<'a, F: FnMut(&'a Pk) -> bool>(&'a self, pred: &mut F) -> bool { - match *self { - Terminal::PkK(ref p) => pred(p), - Terminal::PkH(ref p) => pred(p), - Terminal::RawPkH(..) - | Terminal::After(..) - | Terminal::Older(..) - | Terminal::Sha256(..) - | Terminal::Hash256(..) - | Terminal::Ripemd160(..) - | Terminal::Hash160(..) - | Terminal::True - | Terminal::False => true, - Terminal::Alt(ref sub) - | Terminal::Swap(ref sub) - | Terminal::Check(ref sub) - | Terminal::DupIf(ref sub) - | Terminal::Verify(ref sub) - | Terminal::NonZero(ref sub) - | Terminal::ZeroNotEqual(ref sub) => sub.real_for_each_key(pred), - Terminal::AndV(ref left, ref right) - | Terminal::AndB(ref left, ref right) - | Terminal::OrB(ref left, ref right) - | Terminal::OrD(ref left, ref right) - | Terminal::OrC(ref left, ref right) - | Terminal::OrI(ref left, ref right) => { - left.real_for_each_key(&mut *pred) && right.real_for_each_key(pred) - } - Terminal::AndOr(ref a, ref b, ref c) => { - a.real_for_each_key(&mut *pred) - && b.real_for_each_key(&mut *pred) - && c.real_for_each_key(pred) - } - Terminal::Thresh(_, ref subs) => subs.iter().all(|sub| sub.real_for_each_key(pred)), - Terminal::Multi(_, ref keys) | Terminal::MultiA(_, ref keys) => keys.iter().all(pred), - } - } - pub(super) fn real_translate_pk( &self, t: &mut T, @@ -250,12 +212,6 @@ impl Terminal { } } -impl ForEachKey for Terminal { - fn for_each_key<'a, F: FnMut(&'a Pk) -> bool>(&'a self, mut pred: F) -> bool { - self.real_for_each_key(&mut pred) - } -} - impl fmt::Debug for Terminal { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.write_str("[")?; diff --git a/src/miniscript/mod.rs b/src/miniscript/mod.rs index c31199d6b..afe829a0e 100644 --- a/src/miniscript/mod.rs +++ b/src/miniscript/mod.rs @@ -22,6 +22,7 @@ use bitcoin::taproot::{LeafVersion, TapLeafHash}; use self::analyzable::ExtParams; pub use self::context::{BareCtx, Legacy, Segwitv0, Tap}; +use crate::iter::TreeLike; use crate::prelude::*; use crate::TranslateErr; @@ -296,7 +297,27 @@ impl Miniscript { impl ForEachKey for Miniscript { fn for_each_key<'a, F: FnMut(&'a Pk) -> bool>(&'a self, mut pred: F) -> bool { - self.real_for_each_key(&mut pred) + for ms in self.pre_order_iter() { + match ms.node { + Terminal::PkK(ref p) => { + if !pred(p) { + return false; + } + } + Terminal::PkH(ref p) => { + if !pred(p) { + return false; + } + } + Terminal::Multi(_, ref keys) | Terminal::MultiA(_, ref keys) => { + if !keys.iter().all(&mut pred) { + return false; + } + } + _ => {} + } + } + true } } @@ -319,10 +340,6 @@ where } impl Miniscript { - fn real_for_each_key<'a, F: FnMut(&'a Pk) -> bool>(&'a self, pred: &mut F) -> bool { - self.node.real_for_each_key(pred) - } - pub(super) fn real_translate_pk( &self, t: &mut T,