Skip to content

Commit f20f6cc

Browse files
committed
refactor: descriptor errors instead of panicking on invalid fingerprints
1 parent 97af24a commit f20f6cc

File tree

2 files changed

+63
-24
lines changed

2 files changed

+63
-24
lines changed

bdk-ffi/src/descriptor.rs

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,12 @@ impl Descriptor {
7878
fingerprint: String,
7979
keychain_kind: KeychainKind,
8080
network: Network,
81-
) -> Self {
82-
let fingerprint = Fingerprint::from_str(fingerprint.as_str()).unwrap();
81+
) -> Result<Self, DescriptorError> {
82+
let fingerprint = Fingerprint::from_str(fingerprint.as_str()).map_err(|error| {
83+
DescriptorError::Bip32 {
84+
error_message: error.to_string(),
85+
}
86+
})?;
8387
let derivable_key = &public_key.0;
8488

8589
match derivable_key {
@@ -91,12 +95,12 @@ impl Descriptor {
9195
let (extended_descriptor, key_map, _) =
9296
Bip44Public(derivable_key, fingerprint, keychain_kind)
9397
.build(network)
94-
.unwrap();
98+
.map_err(DescriptorError::from)?;
9599

96-
Self {
100+
Ok(Self {
97101
extended_descriptor,
98102
key_map,
99-
}
103+
})
100104
}
101105
BdkDescriptorPublicKey::MultiXPub(_) => {
102106
unreachable!()
@@ -139,8 +143,12 @@ impl Descriptor {
139143
fingerprint: String,
140144
keychain_kind: KeychainKind,
141145
network: Network,
142-
) -> Self {
143-
let fingerprint = Fingerprint::from_str(fingerprint.as_str()).unwrap();
146+
) -> Result<Self, DescriptorError> {
147+
let fingerprint = Fingerprint::from_str(fingerprint.as_str()).map_err(|error| {
148+
DescriptorError::Bip32 {
149+
error_message: error.to_string(),
150+
}
151+
})?;
144152
let derivable_key = &public_key.0;
145153

146154
match derivable_key {
@@ -152,12 +160,12 @@ impl Descriptor {
152160
let (extended_descriptor, key_map, _) =
153161
Bip49Public(derivable_key, fingerprint, keychain_kind)
154162
.build(network)
155-
.unwrap();
163+
.map_err(DescriptorError::from)?;
156164

157-
Self {
165+
Ok(Self {
158166
extended_descriptor,
159167
key_map,
160-
}
168+
})
161169
}
162170
BdkDescriptorPublicKey::MultiXPub(_) => {
163171
unreachable!()
@@ -200,8 +208,12 @@ impl Descriptor {
200208
fingerprint: String,
201209
keychain_kind: KeychainKind,
202210
network: Network,
203-
) -> Self {
204-
let fingerprint = Fingerprint::from_str(fingerprint.as_str()).unwrap();
211+
) -> Result<Self, DescriptorError> {
212+
let fingerprint = Fingerprint::from_str(fingerprint.as_str()).map_err(|error| {
213+
DescriptorError::Bip32 {
214+
error_message: error.to_string(),
215+
}
216+
})?;
205217
let derivable_key = &public_key.0;
206218

207219
match derivable_key {
@@ -213,12 +225,12 @@ impl Descriptor {
213225
let (extended_descriptor, key_map, _) =
214226
Bip84Public(derivable_key, fingerprint, keychain_kind)
215227
.build(network)
216-
.unwrap();
228+
.map_err(DescriptorError::from)?;
217229

218-
Self {
230+
Ok(Self {
219231
extended_descriptor,
220232
key_map,
221-
}
233+
})
222234
}
223235
BdkDescriptorPublicKey::MultiXPub(_) => {
224236
unreachable!()
@@ -261,8 +273,12 @@ impl Descriptor {
261273
fingerprint: String,
262274
keychain_kind: KeychainKind,
263275
network: Network,
264-
) -> Self {
265-
let fingerprint = Fingerprint::from_str(fingerprint.as_str()).unwrap();
276+
) -> Result<Self, DescriptorError> {
277+
let fingerprint = Fingerprint::from_str(fingerprint.as_str()).map_err(|error| {
278+
DescriptorError::Bip32 {
279+
error_message: error.to_string(),
280+
}
281+
})?;
266282
let derivable_key = &public_key.0;
267283

268284
match derivable_key {
@@ -274,12 +290,12 @@ impl Descriptor {
274290
let (extended_descriptor, key_map, _) =
275291
Bip86Public(derivable_key, fingerprint, keychain_kind)
276292
.build(network)
277-
.unwrap();
293+
.map_err(DescriptorError::from)?;
278294

279-
Self {
295+
Ok(Self {
280296
extended_descriptor,
281297
key_map,
282-
}
298+
})
283299
}
284300
BdkDescriptorPublicKey::MultiXPub(_) => {
285301
unreachable!()

bdk-ffi/src/tests/descriptor.rs

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,25 +57,29 @@ fn test_descriptor_templates() {
5757
"d1d04177".to_string(),
5858
KeychainKind::External,
5959
Network::Testnet,
60-
);
60+
)
61+
.unwrap();
6162
let template_public_49 = Descriptor::new_bip49_public(
6263
&handmade_public_49,
6364
"d1d04177".to_string(),
6465
KeychainKind::External,
6566
Network::Testnet,
66-
);
67+
)
68+
.unwrap();
6769
let template_public_84 = Descriptor::new_bip84_public(
6870
&handmade_public_84,
6971
"d1d04177".to_string(),
7072
KeychainKind::External,
7173
Network::Testnet,
72-
);
74+
)
75+
.unwrap();
7376
let template_public_86 = Descriptor::new_bip86_public(
7477
&handmade_public_86,
7578
"d1d04177".to_string(),
7679
KeychainKind::External,
7780
Network::Testnet,
78-
);
81+
)
82+
.unwrap();
7983
println!("Template public 49: {}", template_public_49);
8084
println!("Template public 44: {}", template_public_44);
8185
println!("Template public 84: {}", template_public_84);
@@ -124,6 +128,25 @@ fn test_descriptor_from_string() {
124128
assert_matches!(descriptor2.unwrap_err(), DescriptorError::Key { .. });
125129
}
126130

131+
#[test]
132+
fn test_new_bip84_public_invalid_fingerprint() {
133+
let master: DescriptorSecretKey = get_descriptor_secret_key();
134+
let public_84 = master
135+
.derive(&DerivationPath::new("m/84h/1h/0h".to_string()).unwrap())
136+
.unwrap()
137+
.as_public();
138+
139+
let error = Descriptor::new_bip84_public(
140+
&public_84,
141+
"not-a-fingerprint".to_string(),
142+
KeychainKind::External,
143+
Network::Testnet,
144+
)
145+
.unwrap_err();
146+
147+
assert_matches!(error, DescriptorError::Bip32 { .. });
148+
}
149+
127150
#[test]
128151
fn test_max_weight_to_satisfy() {
129152
// Test P2WPKH descriptor using standard test descriptor

0 commit comments

Comments
 (0)