Skip to content

Commit d179959

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 5c0ecd7 commit d179959

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
@@ -159,41 +159,44 @@ impl DescriptorXKey<bip32::ExtendedPrivKey> {
159159
&self,
160160
secp: &Secp256k1<C>,
161161
) -> Result<DescriptorXKey<bip32::ExtendedPubKey>, DescriptorKeyParseError> {
162-
let path_len = (&self.derivation_path).as_ref().len();
163-
let public_suffix_len = (&self.derivation_path)
162+
let unhardened = self
163+
.derivation_path
164164
.into_iter()
165165
.rev()
166166
.take_while(|c| c.is_normal())
167167
.count();
168+
let last_hardened_idx = self.derivation_path.len() - unhardened;
168169

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

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

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

193196
Ok(DescriptorXKey {
194197
origin,
195198
xkey: xpub,
196-
derivation_path: derivation_path.into(),
199+
derivation_path: unhardened_path.into(),
197200
wildcard: self.wildcard,
198201
})
199202
}

0 commit comments

Comments
 (0)