diff --git a/src/util/taproot.rs b/src/util/taproot.rs index aaa2b0e99c..478803ea15 100644 --- a/src/util/taproot.rs +++ b/src/util/taproot.rs @@ -451,19 +451,18 @@ impl TaprootBuilder { /// Creates a [`TaprootSpendInfo`] with the given internal key. /// - // TODO: in a future breaking API change, this no longer needs to return result + /// Returns the current builder if the builder is not finalized. See [`TaprootBuilder::is_finalized`] pub fn finalize( mut self, secp: &Secp256k1, internal_key: UntweakedPublicKey, - ) -> Result { - match self.branch.pop() { - None => Ok(TaprootSpendInfo::new_key_spend(secp, internal_key, None)), - Some(Some(node)) => { + ) -> Result { + match (self.branch.len(), self.branch.pop()) { + (0, None) => Ok(TaprootSpendInfo::new_key_spend(secp, internal_key, None)), + (1, Some(Some(node))) => { Ok(TaprootSpendInfo::from_node_info(secp, internal_key, node)) } - _ => Err(TaprootBuilderError::IncompleteTree), - + _ => Err(self), } } @@ -1013,8 +1012,6 @@ pub enum TaprootBuilderError { OverCompleteTree, /// Invalid taproot internal key. InvalidInternalKey(secp256k1::Error), - /// Called finalize on an incomplete tree. - IncompleteTree, /// Called finalize on a empty tree. EmptyTree, } @@ -1036,9 +1033,6 @@ impl fmt::Display for TaprootBuilderError { TaprootBuilderError::InvalidInternalKey(ref e) => { write_err!(f, "invalid internal x-only key"; e) } - TaprootBuilderError::IncompleteTree => { - write!(f, "Called finalize on an incomplete tree") - } TaprootBuilderError::EmptyTree => { write!(f, "Called finalize on an empty tree") } @@ -1057,7 +1051,6 @@ impl std::error::Error for TaprootBuilderError { InvalidMerkleTreeDepth(_) | NodeNotInDfsOrder | OverCompleteTree - | IncompleteTree | EmptyTree => None } }