@@ -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