diff --git a/Cargo-minimal.lock b/Cargo-minimal.lock index 5fa115666..2bcf1a58b 100644 --- a/Cargo-minimal.lock +++ b/Cargo-minimal.lock @@ -316,7 +316,7 @@ dependencies = [ [[package]] name = "miniscript" -version = "12.3.2" +version = "12.3.3" dependencies = [ "bech32", "bitcoin", diff --git a/Cargo-recent.lock b/Cargo-recent.lock index d4a312d77..680083661 100644 --- a/Cargo-recent.lock +++ b/Cargo-recent.lock @@ -294,7 +294,7 @@ dependencies = [ [[package]] name = "miniscript" -version = "12.3.2" +version = "12.3.3" dependencies = [ "bech32", "bitcoin", diff --git a/Cargo.toml b/Cargo.toml index 4649502f7..deaab4939 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "miniscript" -version = "12.3.2" +version = "12.3.3" authors = ["Andrew Poelstra , Sanket Kanjalkar "] license = "CC0-1.0" homepage = "https://github.com/rust-bitcoin/rust-miniscript/" diff --git a/src/descriptor/key.rs b/src/descriptor/key.rs index 0ca62fc9f..005ebe852 100644 --- a/src/descriptor/key.rs +++ b/src/descriptor/key.rs @@ -1037,7 +1037,7 @@ impl DefiniteDescriptorKey { /// /// Returns `None` if the key contains a wildcard fn new(key: DescriptorPublicKey) -> Option { - if key.has_wildcard() { + if key.has_wildcard() || key.is_multipath() { None } else { Some(Self(key)) @@ -1071,7 +1071,7 @@ impl FromStr for DefiniteDescriptorKey { fn from_str(s: &str) -> Result { let inner = DescriptorPublicKey::from_str(s)?; DefiniteDescriptorKey::new(inner).ok_or(DescriptorKeyParseError( - "cannot parse key with a wilcard as a DerivedDescriptorKey", + "cannot parse multi-path keys or keys with a wilcard as a DerivedDescriptorKey", )) } } @@ -1150,6 +1150,7 @@ mod test { MiniscriptKey, Wildcard, }; use crate::prelude::*; + use crate::DefiniteDescriptorKey; #[test] fn parse_descriptor_key_errors() { @@ -1497,4 +1498,23 @@ mod test { let public_key = DescriptorPublicKey::from_str(desc).unwrap(); assert_tokens(&public_key, &[Token::String(desc)]); } + + #[test] + fn definite_keys() { + // basic xpub + let desc = "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8" + .parse::() + .unwrap(); + assert!(DefiniteDescriptorKey::new(desc).is_some()); + // xpub with wildcard + let desc = "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8/*" + .parse::() + .unwrap(); + assert!(DefiniteDescriptorKey::new(desc).is_none()); + // multipath xpub + let desc = "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8/<0;1>" + .parse::() + .unwrap(); + assert!(DefiniteDescriptorKey::new(desc).is_none()); + } }