Skip to content

Commit 337f25d

Browse files
committed
fixes error with default generation
1 parent 4638293 commit 337f25d

File tree

2 files changed

+51
-71
lines changed

2 files changed

+51
-71
lines changed

src/commands.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,6 @@ pub struct GenerateDescriptorArgs {
143143
pub key: Option<String>, // Positional argument (tprv/tpub/xprv/xpub)
144144
}
145145

146-
147146
#[derive(Debug, Clone, PartialEq, ValueEnum)]
148147
pub enum ScriptType {
149148
Bip44,

src/descriptor_handler.rs

Lines changed: 51 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use serde_json::Value;
2-
use serde_json::json;
31
use crate::commands::GenerateDescriptorArgs;
42
use anyhow::{anyhow, Result};
53
use bdk_wallet::bitcoin::bip32::Xpriv;
@@ -8,40 +6,39 @@ use bdk_wallet::bitcoin::Network;
86
use bdk_wallet::descriptor::Segwitv0;
97
use bdk_wallet::keys::bip39::{Language, Mnemonic, WordCount};
108
use bdk_wallet::keys::{GeneratableKey, GeneratedKey};
9+
use serde_json::json;
10+
use serde_json::Value;
1111

1212
use bdk_wallet::bitcoin::bip32::DerivationPath;
1313
use bdk_wallet::descriptor::{Descriptor, DescriptorPublicKey};
1414

1515
use bdk_wallet::keys::{DescriptorSecretKey, IntoDescriptorKey};
1616
use 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

2322
pub 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-
4542
pub 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-
8879
fn 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-
232217
pub 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

Comments
 (0)