Skip to content

Commit f8a832c

Browse files
committed
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 7f9c840 commit f8a832c

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)