Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 36 additions & 20 deletions bdk-ffi/src/descriptor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,12 @@ impl Descriptor {
fingerprint: String,
keychain_kind: KeychainKind,
network: Network,
) -> Self {
let fingerprint = Fingerprint::from_str(fingerprint.as_str()).unwrap();
) -> Result<Self, DescriptorError> {
let fingerprint = Fingerprint::from_str(fingerprint.as_str()).map_err(|error| {
DescriptorError::Bip32 {
error_message: error.to_string(),
}
})?;
let derivable_key = &public_key.0;

match derivable_key {
Expand All @@ -91,12 +95,12 @@ impl Descriptor {
let (extended_descriptor, key_map, _) =
Bip44Public(derivable_key, fingerprint, keychain_kind)
.build(network)
.unwrap();
.map_err(DescriptorError::from)?;

Self {
Ok(Self {
extended_descriptor,
key_map,
}
})
}
BdkDescriptorPublicKey::MultiXPub(_) => {
unreachable!()
Expand Down Expand Up @@ -139,8 +143,12 @@ impl Descriptor {
fingerprint: String,
keychain_kind: KeychainKind,
network: Network,
) -> Self {
let fingerprint = Fingerprint::from_str(fingerprint.as_str()).unwrap();
) -> Result<Self, DescriptorError> {
let fingerprint = Fingerprint::from_str(fingerprint.as_str()).map_err(|error| {
DescriptorError::Bip32 {
error_message: error.to_string(),
}
})?;
let derivable_key = &public_key.0;

match derivable_key {
Expand All @@ -152,12 +160,12 @@ impl Descriptor {
let (extended_descriptor, key_map, _) =
Bip49Public(derivable_key, fingerprint, keychain_kind)
.build(network)
.unwrap();
.map_err(DescriptorError::from)?;

Self {
Ok(Self {
extended_descriptor,
key_map,
}
})
}
BdkDescriptorPublicKey::MultiXPub(_) => {
unreachable!()
Expand Down Expand Up @@ -200,8 +208,12 @@ impl Descriptor {
fingerprint: String,
keychain_kind: KeychainKind,
network: Network,
) -> Self {
let fingerprint = Fingerprint::from_str(fingerprint.as_str()).unwrap();
) -> Result<Self, DescriptorError> {
let fingerprint = Fingerprint::from_str(fingerprint.as_str()).map_err(|error| {
DescriptorError::Bip32 {
error_message: error.to_string(),
}
})?;
let derivable_key = &public_key.0;

match derivable_key {
Expand All @@ -213,12 +225,12 @@ impl Descriptor {
let (extended_descriptor, key_map, _) =
Bip84Public(derivable_key, fingerprint, keychain_kind)
.build(network)
.unwrap();
.map_err(DescriptorError::from)?;

Self {
Ok(Self {
extended_descriptor,
key_map,
}
})
}
BdkDescriptorPublicKey::MultiXPub(_) => {
unreachable!()
Expand Down Expand Up @@ -261,8 +273,12 @@ impl Descriptor {
fingerprint: String,
keychain_kind: KeychainKind,
network: Network,
) -> Self {
let fingerprint = Fingerprint::from_str(fingerprint.as_str()).unwrap();
) -> Result<Self, DescriptorError> {
let fingerprint = Fingerprint::from_str(fingerprint.as_str()).map_err(|error| {
DescriptorError::Bip32 {
error_message: error.to_string(),
}
})?;
let derivable_key = &public_key.0;

match derivable_key {
Expand All @@ -274,12 +290,12 @@ impl Descriptor {
let (extended_descriptor, key_map, _) =
Bip86Public(derivable_key, fingerprint, keychain_kind)
.build(network)
.unwrap();
.map_err(DescriptorError::from)?;

Self {
Ok(Self {
extended_descriptor,
key_map,
}
})
}
BdkDescriptorPublicKey::MultiXPub(_) => {
unreachable!()
Expand Down
31 changes: 27 additions & 4 deletions bdk-ffi/src/tests/descriptor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,25 +57,29 @@ fn test_descriptor_templates() {
"d1d04177".to_string(),
KeychainKind::External,
Network::Testnet,
);
)
.unwrap();
let template_public_49 = Descriptor::new_bip49_public(
&handmade_public_49,
"d1d04177".to_string(),
KeychainKind::External,
Network::Testnet,
);
)
.unwrap();
let template_public_84 = Descriptor::new_bip84_public(
&handmade_public_84,
"d1d04177".to_string(),
KeychainKind::External,
Network::Testnet,
);
)
.unwrap();
let template_public_86 = Descriptor::new_bip86_public(
&handmade_public_86,
"d1d04177".to_string(),
KeychainKind::External,
Network::Testnet,
);
)
.unwrap();
println!("Template public 49: {}", template_public_49);
println!("Template public 44: {}", template_public_44);
println!("Template public 84: {}", template_public_84);
Expand Down Expand Up @@ -124,6 +128,25 @@ fn test_descriptor_from_string() {
assert_matches!(descriptor2.unwrap_err(), DescriptorError::Key { .. });
}

#[test]
fn test_new_bip84_public_invalid_fingerprint() {
let master: DescriptorSecretKey = get_descriptor_secret_key();
let public_84 = master
.derive(&DerivationPath::new("m/84h/1h/0h".to_string()).unwrap())
.unwrap()
.as_public();

let error = Descriptor::new_bip84_public(
&public_84,
"not-a-fingerprint".to_string(),
KeychainKind::External,
Network::Testnet,
)
.unwrap_err();

assert_matches!(error, DescriptorError::Bip32 { .. });
}

#[test]
fn test_max_weight_to_satisfy() {
// Test P2WPKH descriptor using standard test descriptor
Expand Down
Loading