Skip to content

Commit f066805

Browse files
committed
fixups to Tr descriptor code from SarcasticNastik
1 parent 4592b44 commit f066805

File tree

1 file changed

+32
-38
lines changed

1 file changed

+32
-38
lines changed

src/descriptor/tr.rs

Lines changed: 32 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// Tapscript
22

33
use super::checksum::{desc_checksum, verify_checksum};
4-
use bitcoin::hashes::_export::_core::fmt::Formatter;
54
use errstr;
65
use expression::{self, FromTree, Tree};
76
use miniscript::{limits::TAPROOT_MAX_NODE_COUNT, Miniscript};
@@ -46,7 +45,7 @@ impl<Pk: MiniscriptKey> TapTree<Pk> {
4645
}
4746

4847
impl<Pk: MiniscriptKey> fmt::Display for TapTree<Pk> {
49-
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
48+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
5049
match self {
5150
TapTree::Tree(ref left, ref right) => write!(f, "{{{},{}}}", *left, *right),
5251
TapTree::Leaf(ref script) => write!(f, "{}", *script),
@@ -57,10 +56,7 @@ impl<Pk: MiniscriptKey> fmt::Display for TapTree<Pk> {
5756
impl<Pk: MiniscriptKey> Tr<Pk> {
5857
/// Create a new [`Tr`] descriptor from internal key and [`TapTree`]
5958
pub fn new(internal_key: Pk, tree: Option<TapTree<Pk>>) -> Result<Self, Error> {
60-
let nodes = match tree {
61-
Some(ref t) => t.taptree_height(),
62-
None => 0,
63-
};
59+
let nodes = tree.as_ref().map(|t| t.taptree_height()).unwrap_or(0);
6460

6561
if nodes <= TAPROOT_MAX_NODE_COUNT {
6662
Ok(Self { internal_key, tree })
@@ -88,43 +84,41 @@ impl<Pk: MiniscriptKey> Tr<Pk> {
8884
}
8985
}
9086

91-
impl<Pk> Tr<Pk>
87+
impl<Pk: MiniscriptKey> FromTree for Tr<Pk>
9288
where
9389
Pk: MiniscriptKey + FromStr,
9490
Pk::Hash: FromStr,
9591
<Pk as FromStr>::Err: ToString,
9692
<<Pk as MiniscriptKey>::Hash as FromStr>::Err: ToString,
9793
{
98-
// Helper function to parse taproot script path
99-
fn tr_script_path(tree: &Tree) -> Result<TapTree<Pk>, Error> {
100-
match tree {
101-
Tree { name, args } if name.len() > 0 && args.len() == 0 => {
102-
let script = Miniscript::<Pk, Tap>::from_str(name)?;
103-
Ok(TapTree::Leaf(Arc::new(script)))
104-
}
105-
Tree { name, args } if name.len() == 0 && args.len() == 2 => {
106-
let left = Self::tr_script_path(&args[0])?;
107-
let right = Self::tr_script_path(&args[1])?;
108-
Ok(TapTree::Tree(Arc::new(left), Arc::new(right)))
109-
}
110-
_ => {
111-
return Err(Error::Unexpected(
112-
"unknown format for script spending paths while parsing taproot descriptor"
113-
.to_string(),
114-
));
94+
fn from_tree(top: &Tree) -> Result<Self, Error> {
95+
// Helper function to parse taproot script path
96+
fn parse_tr_script_spend<Pk: MiniscriptKey>(tree: &Tree) -> Result<TapTree<Pk>, Error>
97+
where
98+
Pk: MiniscriptKey + FromStr,
99+
Pk::Hash: FromStr,
100+
<Pk as FromStr>::Err: ToString,
101+
<<Pk as MiniscriptKey>::Hash as FromStr>::Err: ToString,
102+
{
103+
match tree {
104+
Tree { name, args } if name.len() > 0 && args.len() == 0 => {
105+
let script = Miniscript::<Pk, Tap>::from_str(name)?;
106+
Ok(TapTree::Leaf(Arc::new(script)))
107+
}
108+
Tree { name, args } if name.len() == 0 && args.len() == 2 => {
109+
let left = parse_tr_script_spend(&args[0])?;
110+
let right = parse_tr_script_spend(&args[1])?;
111+
Ok(TapTree::Tree(Arc::new(left), Arc::new(right)))
112+
}
113+
_ => {
114+
return Err(Error::Unexpected(
115+
"unknown format for script spending paths while parsing taproot descriptor"
116+
.to_string(),
117+
));
118+
}
115119
}
116120
}
117-
}
118-
}
119121

120-
impl<Pk: MiniscriptKey> FromTree for Tr<Pk>
121-
where
122-
Pk: MiniscriptKey + FromStr,
123-
Pk::Hash: FromStr,
124-
<Pk as FromStr>::Err: ToString,
125-
<<Pk as MiniscriptKey>::Hash as FromStr>::Err: ToString,
126-
{
127-
fn from_tree(top: &Tree) -> Result<Self, Error> {
128122
if top.name == "tr" {
129123
match top.args.len() {
130124
1 => {
@@ -149,7 +143,7 @@ where
149143
)));
150144
}
151145
let ref tree = top.args[1];
152-
let ret = Tr::tr_script_path(tree)?;
146+
let ret = parse_tr_script_spend(tree)?;
153147
Ok(Tr {
154148
internal_key: expression::terminal(key, Pk::from_str)?,
155149
tree: Some(ret),
@@ -184,7 +178,7 @@ where
184178

185179
fn from_str(s: &str) -> Result<Self, Self::Err> {
186180
let desc_str = verify_checksum(s)?;
187-
let top = parse_tr(desc_str)?;
181+
let top = parse_tr_tree(desc_str)?;
188182
Self::from_tree(&top)
189183
}
190184
}
@@ -197,7 +191,8 @@ impl<Pk: MiniscriptKey> fmt::Display for Tr<Pk> {
197191
}
198192
}
199193

200-
fn parse_tr(s: &str) -> Result<Tree, Error> {
194+
// Helper function to parse string into miniscript tree form
195+
fn parse_tr_tree(s: &str) -> Result<Tree, Error> {
201196
for ch in s.bytes() {
202197
if ch > 0x7f {
203198
return Err(Error::Unprintable(ch));
@@ -242,7 +237,6 @@ fn parse_tr(s: &str) -> Result<Tree, Error> {
242237
} else {
243238
Err(Error::Unexpected("invalid taproot descriptor".to_string()))
244239
};
245-
246240
return ret;
247241
}
248242

0 commit comments

Comments
 (0)