diff --git a/bdk-ffi/src/descriptor.rs b/bdk-ffi/src/descriptor.rs index 943f992b..c07de859 100644 --- a/bdk-ffi/src/descriptor.rs +++ b/bdk-ffi/src/descriptor.rs @@ -78,8 +78,12 @@ impl Descriptor { fingerprint: String, keychain_kind: KeychainKind, network: Network, - ) -> Self { - let fingerprint = Fingerprint::from_str(fingerprint.as_str()).unwrap(); + ) -> Result { + 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 { @@ -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!() @@ -139,8 +143,12 @@ impl Descriptor { fingerprint: String, keychain_kind: KeychainKind, network: Network, - ) -> Self { - let fingerprint = Fingerprint::from_str(fingerprint.as_str()).unwrap(); + ) -> Result { + 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 { @@ -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!() @@ -200,8 +208,12 @@ impl Descriptor { fingerprint: String, keychain_kind: KeychainKind, network: Network, - ) -> Self { - let fingerprint = Fingerprint::from_str(fingerprint.as_str()).unwrap(); + ) -> Result { + 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 { @@ -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!() @@ -261,8 +273,12 @@ impl Descriptor { fingerprint: String, keychain_kind: KeychainKind, network: Network, - ) -> Self { - let fingerprint = Fingerprint::from_str(fingerprint.as_str()).unwrap(); + ) -> Result { + 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 { @@ -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!() diff --git a/bdk-ffi/src/tests/descriptor.rs b/bdk-ffi/src/tests/descriptor.rs index fcac7a6d..fed07b89 100644 --- a/bdk-ffi/src/tests/descriptor.rs +++ b/bdk-ffi/src/tests/descriptor.rs @@ -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); @@ -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