1- use serde_json:: Value ;
2- use serde_json:: json;
31use crate :: commands:: GenerateDescriptorArgs ;
42use anyhow:: { anyhow, Result } ;
53use bdk_wallet:: bitcoin:: bip32:: Xpriv ;
@@ -8,40 +6,39 @@ use bdk_wallet::bitcoin::Network;
86use bdk_wallet:: descriptor:: Segwitv0 ;
97use bdk_wallet:: keys:: bip39:: { Language , Mnemonic , WordCount } ;
108use bdk_wallet:: keys:: { GeneratableKey , GeneratedKey } ;
9+ use serde_json:: json;
10+ use serde_json:: Value ;
1111
1212use bdk_wallet:: bitcoin:: bip32:: DerivationPath ;
1313use bdk_wallet:: descriptor:: { Descriptor , DescriptorPublicKey } ;
1414
1515use bdk_wallet:: keys:: { DescriptorSecretKey , IntoDescriptorKey } ;
1616use miniscript:: descriptor:: { DescriptorXKey , Wildcard } ;
1717
18- use std:: str:: FromStr ;
19-
20- use miniscript:: Tap ;
18+ use std:: str:: FromStr ;
2119
20+ use miniscript:: Tap ;
2221
2322pub fn generate_descriptor_from_args ( args : GenerateDescriptorArgs ) -> Result < Value , anyhow:: Error > {
2423 match ( args. multipath , args. key . as_ref ( ) ) {
25- ( true , Some ( key) ) => {
26- generate_multipath_descriptor ( & args. network , args. r#type , key)
27- }
28- ( false , Some ( key) ) => {
29- generate_standard_descriptor ( & args. network , args. r#type , key)
30- }
24+ ( true , Some ( key) ) => generate_multipath_descriptor ( & args. network , args. r#type , key) ,
25+ ( false , Some ( key) ) => generate_standard_descriptor ( & args. network , args. r#type , key) ,
3126 ( false , None ) => {
3227 // New default: generate descriptor from fresh mnemonic (for script_type 84 only maybe)
3328 if args. r#type == 84 {
3429 generate_new_bip84_descriptor_with_mnemonic ( args. network )
3530 } else {
36- Err ( anyhow ! ( "Only script type 84 is supported for mnemonic-based generation" ) )
31+ Err ( anyhow ! (
32+ "Only script type 84 is supported for mnemonic-based generation"
33+ ) )
3734 }
3835 }
39- _ => Err ( anyhow ! ( "Invalid arguments: please provide a key or a weak string" ) ) ,
36+ _ => Err ( anyhow ! (
37+ "Invalid arguments: please provide a key or a weak string"
38+ ) ) ,
4039 }
41-
4240}
4341
44-
4542pub fn generate_new_bip84_descriptor_with_mnemonic ( network : Network ) -> Result < serde_json:: Value > {
4643 let secp = Secp256k1 :: new ( ) ;
4744
@@ -50,20 +47,15 @@ pub fn generate_new_bip84_descriptor_with_mnemonic(network: Network) -> Result<s
5047 . map_err ( |e| anyhow ! ( "Mnemonic generation failed: {:?}" , e) ) ?;
5148
5249 let seed = mnemonic. to_seed ( "" ) ;
53- let master_xprv = Xpriv :: new_master ( network, & seed)
50+ let xprv = Xpriv :: new_master ( network, & seed)
5451 . map_err ( |e| anyhow ! ( "Failed to create extended private key: {}" , e) ) ?;
5552
56- // Derive to account level: m/84'/1'/0'
57- let deriv_path = DerivationPath :: from_str ( "m /84h/1h/0h") ? ;
58- let account_xprv = master_xprv . derive_priv ( & secp , & deriv_path ) ? ;
53+ let origin = xprv . fingerprint ( & secp ) ;
54+ let deriv_base = " /84h/1h/0h"; // You might want to dynamically compute this based on args
55+ let xprv_str = xprv . to_string ( ) ;
5956
60- let fingerprint = master_xprv. fingerprint ( & secp) ;
61-
62- let xprv_str = account_xprv. to_string ( ) ;
63-
64- // Build descriptors using proper derivation suffix
65- let external_desc = format ! ( "wpkh([{}{}]{}{})" , fingerprint, deriv_path, xprv_str, "/0/*" ) ;
66- let internal_desc = format ! ( "wpkh([{}{}]{}{})" , fingerprint, deriv_path, xprv_str, "/1/*" ) ;
57+ let external_desc = format ! ( "wpkh([{}{}]{}{})" , origin, deriv_base, xprv_str, "/0/*" ) ;
58+ let internal_desc = format ! ( "wpkh([{}{}]{}{})" , origin, deriv_base, xprv_str, "/1/*" ) ;
6759
6860 let ( desc, keymap) = Descriptor :: < DescriptorPublicKey > :: parse_descriptor ( & secp, & external_desc)
6961 . map_err ( |e| anyhow ! ( "Failed to parse external descriptor: {}" , e) ) ?;
@@ -84,7 +76,6 @@ pub fn generate_new_bip84_descriptor_with_mnemonic(network: Network) -> Result<s
8476 } ) )
8577}
8678
87-
8879fn generate_multipath_descriptor (
8980 _network : & Network ,
9081 script_type : u8 ,
@@ -127,28 +118,26 @@ pub fn generate_bip84_descriptor_from_key(
127118 wildcard : Wildcard :: Unhardened ,
128119 } ;
129120
130-
131121 let desc_secret = DescriptorSecretKey :: XPrv ( desc_xprv) ;
132-
122+
133123 // Use the BDK extract() to get both descriptor and keymap
134- let ( desc_key, keymap, _) = IntoDescriptorKey :: < Segwitv0 > :: into_descriptor_key ( desc_secret. clone ( ) ) ?
135- . extract ( & secp) ?;
136-
124+ let ( desc_key, keymap, _) =
125+ IntoDescriptorKey :: < Segwitv0 > :: into_descriptor_key ( desc_secret. clone ( ) ) ?
126+ . extract ( & secp) ?;
127+
137128 // Create the public descriptor from the public key
138129 let public_descriptor = Descriptor :: new_wpkh ( desc_key. clone ( ) ) ?;
139-
130+
140131 // Here, we need to ensure that `desc_secret` is a valid descriptor type
141132 // for the private descriptor; we must use DescriptorPublicKey
142133 let private_descriptor = Descriptor :: new_wpkh ( desc_key) ?;
143-
134+
144135 // Convert both to string representations
145136 let public_descriptor_str = public_descriptor. to_string ( ) ;
146137 let private_descriptor_str = private_descriptor. to_string_with_secret ( & keymap) ;
147-
138+
148139 Ok ( ( public_descriptor_str, private_descriptor_str) )
149140 } ;
150-
151-
152141
153142 let ( external_pub, external_priv) = make_desc_key ( 0 ) ?;
154143 let ( internal_pub, internal_priv) = make_desc_key ( 1 ) ?;
@@ -187,28 +176,25 @@ pub fn generate_bip86_descriptor_from_key(
187176 wildcard : Wildcard :: Unhardened ,
188177 } ;
189178
190-
191179 let desc_secret = DescriptorSecretKey :: XPrv ( desc_xprv) ;
192-
180+
193181 // Use the BDK extract() to get both descriptor and keymap
194- let ( desc_key, keymap, _) = IntoDescriptorKey :: < Tap > :: into_descriptor_key ( desc_secret . clone ( ) ) ?
195- . extract ( & secp) ?;
196-
182+ let ( desc_key, keymap, _) =
183+ IntoDescriptorKey :: < Tap > :: into_descriptor_key ( desc_secret . clone ( ) ) ? . extract ( & secp) ?;
184+
197185 // Create the public descriptor from the public key
198- let public_descriptor = Descriptor :: new_tr ( desc_key. clone ( ) , None ) ?;
199-
186+ let public_descriptor = Descriptor :: new_tr ( desc_key. clone ( ) , None ) ?;
187+
200188 // Here, we need to ensure that `desc_secret` is a valid descriptor type
201189 // for the private descriptor; we must use DescriptorPublicKey
202- let private_descriptor = Descriptor :: new_tr ( desc_key, None ) ?;
203-
190+ let private_descriptor = Descriptor :: new_tr ( desc_key, None ) ?;
191+
204192 // Convert both to string representations
205193 let public_descriptor_str = public_descriptor. to_string ( ) ;
206194 let private_descriptor_str = private_descriptor. to_string_with_secret ( & keymap) ;
207-
195+
208196 Ok ( ( public_descriptor_str, private_descriptor_str) )
209197 } ;
210-
211-
212198
213199 let ( external_pub, external_priv) = make_desc_key ( 0 ) ?;
214200 let ( internal_pub, internal_priv) = make_desc_key ( 1 ) ?;
@@ -228,7 +214,6 @@ pub fn generate_bip86_descriptor_from_key(
228214 } ) )
229215}
230216
231-
232217pub fn generate_bip49_descriptor_from_key (
233218 network : & Network ,
234219 key : & str ,
@@ -248,28 +233,26 @@ pub fn generate_bip49_descriptor_from_key(
248233 wildcard : Wildcard :: Unhardened ,
249234 } ;
250235
251-
252236 let desc_secret = DescriptorSecretKey :: XPrv ( desc_xprv) ;
253-
237+
254238 // Use the BDK extract() to get both descriptor and keymap
255- let ( desc_key, keymap, _) = IntoDescriptorKey :: < Segwitv0 > :: into_descriptor_key ( desc_secret. clone ( ) ) ?
256- . extract ( & secp) ?;
257-
239+ let ( desc_key, keymap, _) =
240+ IntoDescriptorKey :: < Segwitv0 > :: into_descriptor_key ( desc_secret. clone ( ) ) ?
241+ . extract ( & secp) ?;
242+
258243 // Create the public descriptor from the public key
259244 let public_descriptor = Descriptor :: new_sh_wpkh ( desc_key. clone ( ) ) ?;
260-
245+
261246 // Here, we need to ensure that `desc_secret` is a valid descriptor type
262247 // for the private descriptor; we must use DescriptorPublicKey
263248 let private_descriptor = Descriptor :: new_sh_wpkh ( desc_key) ?;
264-
249+
265250 // Convert both to string representations
266251 let public_descriptor_str = public_descriptor. to_string ( ) ;
267252 let private_descriptor_str = private_descriptor. to_string_with_secret ( & keymap) ;
268-
253+
269254 Ok ( ( public_descriptor_str, private_descriptor_str) )
270255 } ;
271-
272-
273256
274257 let ( external_pub, external_priv) = make_desc_key ( 0 ) ?;
275258 let ( internal_pub, internal_priv) = make_desc_key ( 1 ) ?;
@@ -308,28 +291,26 @@ pub fn generate_bip44_descriptor_from_key(
308291 wildcard : Wildcard :: Unhardened ,
309292 } ;
310293
311-
312294 let desc_secret = DescriptorSecretKey :: XPrv ( desc_xprv) ;
313-
295+
314296 // Use the BDK extract() to get both descriptor and keymap
315- let ( desc_key, keymap, _) = IntoDescriptorKey :: < Segwitv0 > :: into_descriptor_key ( desc_secret. clone ( ) ) ?
316- . extract ( & secp) ?;
317-
297+ let ( desc_key, keymap, _) =
298+ IntoDescriptorKey :: < Segwitv0 > :: into_descriptor_key ( desc_secret. clone ( ) ) ?
299+ . extract ( & secp) ?;
300+
318301 // Create the public descriptor from the public key
319302 let public_descriptor = Descriptor :: new_pkh ( desc_key. clone ( ) ) ?;
320-
303+
321304 // Here, we need to ensure that `desc_secret` is a valid descriptor type
322305 // for the private descriptor; we must use DescriptorPublicKey
323306 let private_descriptor = Descriptor :: new_pkh ( desc_key) ?;
324-
307+
325308 // Convert both to string representations
326309 let public_descriptor_str = public_descriptor. to_string ( ) ;
327310 let private_descriptor_str = private_descriptor. to_string_with_secret ( & keymap) ;
328-
311+
329312 Ok ( ( public_descriptor_str, private_descriptor_str) )
330313 } ;
331-
332-
333314
334315 let ( external_pub, external_priv) = make_desc_key ( 0 ) ?;
335316 let ( internal_pub, internal_priv) = make_desc_key ( 1 ) ?;
0 commit comments