Skip to content

Commit b614477

Browse files
committed
Re-factor DescriptorXKey to_public method
In an effort to make the code cleaner do some refactorings to the `to_public` method on `DescriptorXKey<bip32::ExtendedPrivKey>`. Re-factor only, no logic changes.
1 parent 6de4abe commit b614477

File tree

1 file changed

+19
-16
lines changed

1 file changed

+19
-16
lines changed

src/descriptor/key.rs

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -160,41 +160,44 @@ impl DescriptorXKey<bip32::ExtendedPrivKey> {
160160
&self,
161161
secp: &Secp256k1<C>,
162162
) -> Result<DescriptorXKey<bip32::ExtendedPubKey>, DescriptorKeyParseError> {
163-
let path_len = (&self.derivation_path).as_ref().len();
164-
let public_suffix_len = (&self.derivation_path)
163+
let unhardened = self
164+
.derivation_path
165165
.into_iter()
166166
.rev()
167167
.take_while(|c| c.is_normal())
168168
.count();
169+
let last_hardened_idx = self.derivation_path.len() - unhardened;
169170

170-
let derivation_path = &self.derivation_path[(path_len - public_suffix_len)..];
171-
let deriv_on_hardened = &self.derivation_path[..(path_len - public_suffix_len)];
171+
let hardened_path = &self.derivation_path[..last_hardened_idx];
172+
let unhardened_path = &self.derivation_path[last_hardened_idx..];
172173

173-
let derived_xprv = self
174+
let xprv = self
174175
.xkey
175-
.derive_priv(&secp, &deriv_on_hardened)
176+
.derive_priv(&secp, &hardened_path)
176177
.map_err(|_| DescriptorKeyParseError("Unable to derive the hardened steps"))?;
177-
let xpub = bip32::ExtendedPubKey::from_priv(&secp, &derived_xprv);
178+
let xpub = bip32::ExtendedPubKey::from_priv(&secp, &xprv);
178179

179180
let origin = match &self.origin {
180-
&Some((fingerprint, ref origin_path)) => Some((
181-
fingerprint,
182-
origin_path
183-
.into_iter()
184-
.chain(deriv_on_hardened.into_iter())
181+
Some((fingerprint, path)) => Some((
182+
*fingerprint,
183+
path.into_iter()
184+
.chain(hardened_path.into_iter())
185185
.cloned()
186186
.collect(),
187187
)),
188-
&None if !deriv_on_hardened.as_ref().is_empty() => {
189-
Some((self.xkey.fingerprint(&secp), deriv_on_hardened.into()))
188+
None => {
189+
if hardened_path.is_empty() {
190+
None
191+
} else {
192+
Some((self.xkey.fingerprint(&secp), hardened_path.into()))
193+
}
190194
}
191-
_ => self.origin.clone(),
192195
};
193196

194197
Ok(DescriptorXKey {
195198
origin,
196199
xkey: xpub,
197-
derivation_path: derivation_path.into(),
200+
derivation_path: unhardened_path.into(),
198201
wildcard: self.wildcard,
199202
})
200203
}

0 commit comments

Comments
 (0)