Skip to content

Commit 2929f15

Browse files
committed
Added derive_xprv & derive_xpub methods to ExtendedPrivKey
1 parent 1fc7f2d commit 2929f15

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

src/bdk.udl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ interface DerivationPath {
1111
interface ExtendedPrivKey {
1212
[Throws=BdkError]
1313
constructor(Network network, string mnemonic, string? password);
14+
ExtendedPrivKey derive_xprv([ByRef] DerivationPath? derivation_path);
15+
ExtendedPubKey derive_xpub([ByRef] DerivationPath? derivation_path);
1416
string to_string();
1517
};
1618

src/lib.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,44 @@ impl ExtendedPrivKey {
326326
})
327327
}
328328

329+
fn derive_xprv(
330+
&self,
331+
derivation_path: &Option<DerivationPath>,
332+
) -> Arc<ExtendedPrivKey> {
333+
let secp = Secp256k1::new();
334+
if let Some(derivation_path) = derivation_path {
335+
let path = derivation_path.derivation_path.lock().unwrap().clone();
336+
let derived_xprv = self.xprv.lock().unwrap().derive_priv(&secp, &path).unwrap();
337+
Arc::new(ExtendedPrivKey {
338+
xprv: Mutex::new(derived_xprv),
339+
})
340+
} else {
341+
Arc::new (ExtendedPrivKey {
342+
xprv: Mutex::new(self.xprv.lock().unwrap().to_owned())
343+
})
344+
}
345+
}
346+
347+
fn derive_xpub(
348+
&self,
349+
derivation_path: &Option<&DerivationPath>,
350+
) -> Arc<ExtendedPubKey> {
351+
let secp = Secp256k1::new();
352+
if let Some(derivation_path) = derivation_path {
353+
let path = derivation_path.derivation_path.lock().unwrap().clone();
354+
let derived_xprv = self.xprv.lock().unwrap().derive_priv(&secp, &path).unwrap();
355+
let derived_xpub = BdkExtendedPubKey::from_private(&secp, &derived_xprv);
356+
Arc::new(ExtendedPubKey {
357+
xpub: Mutex::new(derived_xpub)
358+
})
359+
} else {
360+
let derived_xpub = BdkExtendedPubKey::from_private(&secp, &self.xprv.lock().unwrap().clone());
361+
Arc::new(ExtendedPubKey {
362+
xpub: Mutex::new(derived_xpub)
363+
})
364+
}
365+
}
366+
329367
fn to_string(&self) -> String {
330368
self.xprv.lock().unwrap().to_string()
331369
}

0 commit comments

Comments
 (0)