Skip to content

Commit 4131ec4

Browse files
jamillambert+Sharon
authored andcommitted
Add createwalletdescriptor method and test
Nothing to model returned. Add the struct and test. Add the reexports and update the types table. Verify is already `new_no_model`.
1 parent e3d5636 commit 4131ec4

File tree

7 files changed

+71
-4
lines changed

7 files changed

+71
-4
lines changed

client/src/client_sync/v28/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ crate::impl_client_v17__add_multisig_address!();
142142
crate::impl_client_v17__backup_wallet!();
143143
crate::impl_client_v17__bump_fee!();
144144
crate::impl_client_v23__create_wallet!();
145+
crate::impl_client_v28__create_wallet_descriptor!();
145146
crate::impl_client_v17__dump_priv_key!();
146147
crate::impl_client_v17__dump_wallet!();
147148
crate::impl_client_v17__encrypt_wallet!();

client/src/client_sync/v28/wallet.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,16 @@ macro_rules! impl_client_v28__get_hd_keys {
1818
}
1919
};
2020
}
21+
22+
/// Implements Bitcoin Core JSON-RPC API method `createwalletdescriptor`.
23+
#[macro_export]
24+
macro_rules! impl_client_v28__create_wallet_descriptor {
25+
() => {
26+
impl Client {
27+
pub fn create_wallet_descriptor(&self, address_type: &str, hdkey: &str) -> Result<CreateWalletDescriptor> {
28+
let hdkey = serde_json::json!({ "hdkey": hdkey });
29+
self.call("createwalletdescriptor", &[address_type.into(), hdkey.into()])
30+
}
31+
}
32+
};
33+
}

client/src/client_sync/v29/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ crate::impl_client_v17__add_multisig_address!();
142142
crate::impl_client_v17__backup_wallet!();
143143
crate::impl_client_v17__bump_fee!();
144144
crate::impl_client_v23__create_wallet!();
145+
crate::impl_client_v28__create_wallet_descriptor!();
145146
crate::impl_client_v17__dump_priv_key!();
146147
crate::impl_client_v17__dump_wallet!();
147148
crate::impl_client_v17__encrypt_wallet!();

integration_test/tests/wallet.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#![allow(unused_imports)] // Some imports are only used in specific versions.
77

88
use bitcoin::address::{Address, KnownHrp, NetworkChecked};
9+
use bitcoin::bip32::{Xpriv, Xpub};
910
use bitcoin::{secp256k1, Amount, CompressedPublicKey, FeeRate, Network, PrivateKey, PublicKey};
1011
use integration_test::{Node, NodeExt as _, Wallet};
1112
use node::{mtype, AddressType, ImportMultiRequest, ImportMultiScriptPubKey, ImportMultiTimestamp};
@@ -118,6 +119,40 @@ fn wallet__create_wallet__modelled() {
118119
let _ = Node::with_wallet(Wallet::Default, &[]);
119120
}
120121

122+
#[test]
123+
#[cfg(not(feature = "v27_and_below"))]
124+
fn wallet__create_wallet_descriptor() {
125+
let node = Node::with_wallet(Wallet::Default, &[]);
126+
127+
// BIP32 HD xprv/xpub for the creation of a descriptor with a private key that is in the wallet.
128+
let secp = secp256k1::Secp256k1::new();
129+
let seed = [0u8; 32];
130+
let xprv = Xpriv::new_master(Network::Regtest, &seed).unwrap();
131+
let xpub = Xpub::from_priv(&secp, &xprv);
132+
let hdkey = xpub.to_string();
133+
134+
// Import the private key into the wallet.
135+
let privkey = bitcoin::PrivateKey {
136+
compressed: true,
137+
network: Network::Regtest.into(),
138+
inner: xprv.private_key,
139+
};
140+
let wif = privkey.to_wif();
141+
let raw_descriptor = format!("wpkh({})", wif);
142+
let info = node.client.get_descriptor_info(&raw_descriptor).expect("get_descriptor_info");
143+
let descriptor = format!("{}#{}", raw_descriptor, info.checksum);
144+
145+
let import_req = ImportDescriptorsRequest::new(descriptor, 0);
146+
node.client.import_descriptors(&[import_req]).expect("importdescriptors");
147+
148+
let json = node.client.create_wallet_descriptor("bech32", &hdkey)
149+
.expect("createwalletdescriptor");
150+
151+
// Check that a SigWit descriptor was created.
152+
let prefix = &json.descriptors[0][0..4];
153+
assert_eq!(prefix, "wpkh");
154+
}
155+
121156
#[test]
122157
fn wallet__dump_priv_key__modelled() {
123158
// As of Core v23 the default wallet is an native descriptor wallet which does not

types/src/v28/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@
176176
//! | backupwallet | returns nothing | |
177177
//! | bumpfee | version + model | |
178178
//! | createwallet | version + model | |
179-
//! | createwalletdescriptor | version + model | TODO |
179+
//! | createwalletdescriptor | version | |
180180
//! | dumpprivkey | version + model | |
181181
//! | dumpwallet | version + model | |
182182
//! | encryptwallet | version | |
@@ -267,7 +267,7 @@ pub use self::{
267267
SubmitPackage, SubmitPackageError, SubmitPackageTxResult, SubmitPackageTxResultError,
268268
SubmitPackageTxResultFees, SubmitPackageTxResultFeesError,
269269
},
270-
wallet::{GetAddressInfo, GetAddressInfoEmbedded, GetHdKeys, HdKey, HdKeyDescriptor, GetHdKeysError, GetTransaction},
270+
wallet::{GetAddressInfo, GetAddressInfoEmbedded, CreateWalletDescriptor, GetHdKeys, HdKey, HdKeyDescriptor, GetHdKeysError, GetTransaction},
271271
};
272272
#[doc(inline)]
273273
pub use crate::{

types/src/v28/wallet/mod.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,23 @@ pub struct GetAddressInfoEmbedded {
146146
pub labels: Option<Vec<String>>,
147147
}
148148

149+
/// Result of the JSON-RPC method `createwalletdescriptor`.
150+
///
151+
/// > createwalletdescriptor "type" ( {"internal":bool,"hdkey":"str",...} )
152+
/// >
153+
/// > Creates the wallet's descriptor for the given address type. The address type must be one that the wallet does not already have a descriptor for.
154+
/// > Requires wallet passphrase to be set with walletpassphrase call if wallet is encrypted.
155+
/// >
156+
/// > Arguments:
157+
/// > 1. type (string, required) The address type the descriptor will produce. Options are "legacy", "p2sh-segwit", "bech32", and "bech32m".
158+
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
159+
#[serde(deny_unknown_fields)]
160+
pub struct CreateWalletDescriptor {
161+
/// The public descriptors that were added to the wallet.
162+
#[serde(rename = "descs")]
163+
pub descriptors: Vec<String>,
164+
}
165+
149166
/// Result of the JSON-RPC method `gethdkeys`.
150167
///
151168
/// > gethdkeys ( {"active_only":bool,"private":bool,...} )

types/src/v29/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@
177177
//! | backupwallet | returns nothing | |
178178
//! | bumpfee | version + model | |
179179
//! | createwallet | version + model | |
180-
//! | createwalletdescriptor | version + model | TODO |
180+
//! | createwalletdescriptor | version | |
181181
//! | dumpprivkey | version + model | |
182182
//! | dumpwallet | version + model | |
183183
//! | encryptwallet | version | |
@@ -345,6 +345,6 @@ pub use crate::{
345345
v28::{
346346
GetAddressInfo, GetAddressInfoEmbedded, GetNetworkInfo, GetTransaction, Logging,
347347
SubmitPackage, SubmitPackageError, SubmitPackageTxResult, SubmitPackageTxResultError,
348-
SubmitPackageTxResultFees, SubmitPackageTxResultFeesError, GetHdKeys, HdKey, HdKeyDescriptor, GetHdKeysError,
348+
SubmitPackageTxResultFees, SubmitPackageTxResultFeesError, GetHdKeys, HdKey, HdKeyDescriptor, GetHdKeysError, CreateWalletDescriptor,
349349
},
350350
};

0 commit comments

Comments
 (0)