Skip to content

Commit 2aede02

Browse files
committed
Merge #263: Implement importmulti method and test
ec24420 Format code (GideonBature) 4667b26 Implement importmulti method and test (GideonBature) Pull request description: The JSON-RPC method `importmulti` does return a type. We want to test this to catch any changes in behavior in future Core versions. This PR adds a client function that errors if the return value is anything other than the type it returns, along with an integration test that calls this function. Ref: [#116](#116) ACKs for top commit: tcharding: ACK ec24420 Tree-SHA512: 97294e566586bd51e05042be06ca169272689b131510a239682dc6bade95eb87acbf9d86553cba1e06e3554389402b0525bd925eb5ee2c5ceb71d9a6aa4208eb
2 parents 9dcc9c5 + ec24420 commit 2aede02

File tree

43 files changed

+300
-84
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+300
-84
lines changed

client/src/client_sync/v17/mod.rs

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use std::path::Path;
1818

1919
use bitcoin::address::{Address, NetworkChecked};
2020
use bitcoin::{sign_message, Amount, Block, BlockHash, PublicKey, Txid};
21-
use serde::{Deserialize, Serialize};
21+
use serde::{Deserialize, Serialize, Serializer};
2222

2323
use crate::client_sync::into_json;
2424
use crate::types::v17::*;
@@ -128,6 +128,7 @@ crate::impl_client_v17__get_transaction!();
128128
crate::impl_client_v17__get_unconfirmed_balance!();
129129
crate::impl_client_v17__get_wallet_info!();
130130
crate::impl_client_v17__import_address!();
131+
crate::impl_client_v17__import_multi!();
131132
crate::impl_client_v17__import_privkey!();
132133
crate::impl_client_v17__import_pruned_funds!();
133134
crate::impl_client_v17__import_pubkey!();
@@ -247,3 +248,48 @@ pub enum SetBanCommand {
247248
Add,
248249
Remove,
249250
}
251+
252+
/// Args for the `importmulti` method
253+
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
254+
pub struct ImportMultiRequest {
255+
/// Descriptor to import. If using descriptor, donot also provide address/scriptPubKey, scripts, or pubkeys.
256+
#[serde(skip_serializing_if = "Option::is_none")]
257+
pub desc: Option<String>, // from core v18 onwards.
258+
/// Type of scriptPubKey (string for script, json for address). Should not be provided if using descriptor.
259+
#[serde(rename = "scriptPubKey", skip_serializing_if = "Option::is_none")]
260+
pub script_pub_key: Option<ImportMultiScriptPubKey>,
261+
/// Creation time of the key expressed in UNIX epoch time, or the string "now" to substitute the current synced blockchain time.
262+
pub timestamp: ImportMultiTimestamp,
263+
}
264+
265+
/// `scriptPubKey` can be a string for script or json for address.
266+
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
267+
#[serde(untagged)]
268+
pub enum ImportMultiScriptPubKey {
269+
/// The script.
270+
Script(String),
271+
/// The address.
272+
Address { address: String },
273+
}
274+
275+
/// `timestamp` can be a number (UNIX epoch time) or the string `"now"`
276+
#[derive(Clone, Debug, Deserialize, PartialEq)]
277+
#[serde(untagged)]
278+
pub enum ImportMultiTimestamp {
279+
/// The string "now".
280+
Now,
281+
/// The UNIX timestamp.
282+
Time(u64),
283+
}
284+
285+
impl Serialize for ImportMultiTimestamp {
286+
fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
287+
where
288+
S: Serializer,
289+
{
290+
match self {
291+
ImportMultiTimestamp::Now => serializer.serialize_str("now"),
292+
ImportMultiTimestamp::Time(t) => serializer.serialize_u64(*t),
293+
}
294+
}
295+
}

client/src/client_sync/v17/wallet.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,18 @@ macro_rules! impl_client_v17__import_address {
298298
};
299299
}
300300

301+
/// Implements Bitcoin Core JSON-RPC API method `importmulti`
302+
#[macro_export]
303+
macro_rules! impl_client_v17__import_multi {
304+
() => {
305+
impl Client {
306+
pub fn import_multi(&self, requests: &[ImportMultiRequest]) -> Result<ImportMulti> {
307+
self.call("importmulti", &[into_json(requests)?])
308+
}
309+
}
310+
};
311+
}
312+
301313
/// Implements Bitcoin Core JSON-RPC API method `importprivkey`.
302314
#[macro_export]
303315
macro_rules! impl_client_v17__import_privkey {

client/src/client_sync/v18/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ use crate::types::v18::*;
2323
#[rustfmt::skip] // Keep public re-exports separate.
2424
pub use crate::client_sync::{
2525
v17::{
26-
AddNodeCommand, AddressType, Input, Output, SetBanCommand, TemplateRequest,
27-
TemplateRules, WalletCreateFundedPsbtInput
26+
AddNodeCommand, AddressType, ImportMultiRequest, ImportMultiScriptPubKey, ImportMultiTimestamp, Input, Output, SetBanCommand, TemplateRequest,
27+
TemplateRules, WalletCreateFundedPsbtInput,
2828
},
2929
};
3030

@@ -143,6 +143,7 @@ crate::impl_client_v17__get_transaction!();
143143
crate::impl_client_v17__get_unconfirmed_balance!();
144144
crate::impl_client_v17__get_wallet_info!();
145145
crate::impl_client_v17__import_address!();
146+
crate::impl_client_v17__import_multi!();
146147
crate::impl_client_v17__import_privkey!();
147148
crate::impl_client_v17__import_pruned_funds!();
148149
crate::impl_client_v17__import_pubkey!();

client/src/client_sync/v19/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ use crate::types::v19::*;
1919
#[rustfmt::skip] // Keep public re-exports separate.
2020
pub use crate::client_sync::{
2121
v17::{
22-
AddNodeCommand, AddressType, Input, Output, SetBanCommand, TemplateRequest,
23-
TemplateRules, WalletCreateFundedPsbtInput
22+
AddNodeCommand, AddressType, ImportMultiRequest, ImportMultiScriptPubKey, ImportMultiTimestamp, Input, Output, SetBanCommand, TemplateRequest,
23+
TemplateRules, WalletCreateFundedPsbtInput,
2424
},
2525
};
2626

@@ -139,6 +139,7 @@ crate::impl_client_v17__get_transaction!();
139139
crate::impl_client_v17__get_unconfirmed_balance!();
140140
crate::impl_client_v17__get_wallet_info!();
141141
crate::impl_client_v17__import_address!();
142+
crate::impl_client_v17__import_multi!();
142143
crate::impl_client_v17__import_privkey!();
143144
crate::impl_client_v17__import_pruned_funds!();
144145
crate::impl_client_v17__import_pubkey!();

client/src/client_sync/v20/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ use crate::types::v20::*;
1616
#[rustfmt::skip] // Keep public re-exports separate.
1717
pub use crate::client_sync::{
1818
v17::{
19-
AddressType, AddNodeCommand, Input, Output, SetBanCommand, TemplateRequest, TemplateRules,
20-
WalletCreateFundedPsbtInput
19+
AddressType, AddNodeCommand, ImportMultiRequest, ImportMultiScriptPubKey, ImportMultiTimestamp, Input, Output, SetBanCommand, TemplateRequest, TemplateRules,
20+
WalletCreateFundedPsbtInput,
2121
},
2222
};
2323

@@ -136,6 +136,7 @@ crate::impl_client_v17__get_transaction!();
136136
crate::impl_client_v17__get_unconfirmed_balance!();
137137
crate::impl_client_v17__get_wallet_info!();
138138
crate::impl_client_v17__import_address!();
139+
crate::impl_client_v17__import_multi!();
139140
crate::impl_client_v17__import_privkey!();
140141
crate::impl_client_v17__import_pruned_funds!();
141142
crate::impl_client_v17__import_pubkey!();

client/src/client_sync/v21/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ use crate::types::v21::*;
1818
#[rustfmt::skip] // Keep public re-exports separate.
1919
pub use crate::client_sync::{
2020
v17::{
21-
AddNodeCommand, AddressType, Input, Output, SetBanCommand, TemplateRequest,
22-
TemplateRules, WalletCreateFundedPsbtInput
21+
AddNodeCommand, AddressType, ImportMultiRequest, ImportMultiScriptPubKey, ImportMultiTimestamp, Input, Output, SetBanCommand, TemplateRequest,
22+
TemplateRules, WalletCreateFundedPsbtInput,
2323
},
2424
};
2525

@@ -138,6 +138,7 @@ crate::impl_client_v17__get_transaction!();
138138
crate::impl_client_v17__get_unconfirmed_balance!();
139139
crate::impl_client_v17__get_wallet_info!();
140140
crate::impl_client_v17__import_address!();
141+
crate::impl_client_v17__import_multi!();
141142
crate::impl_client_v17__import_privkey!();
142143
crate::impl_client_v17__import_pruned_funds!();
143144
crate::impl_client_v17__import_pubkey!();

client/src/client_sync/v22/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ use crate::types::v22::*;
1818
#[rustfmt::skip] // Keep public re-exports separate.
1919
pub use crate::client_sync::{
2020
v17::{
21-
AddNodeCommand, AddressType, Input, Output, SetBanCommand, TemplateRequest,
22-
TemplateRules, WalletCreateFundedPsbtInput
21+
AddNodeCommand, AddressType, ImportMultiRequest, ImportMultiScriptPubKey, ImportMultiTimestamp, Input, Output, SetBanCommand, TemplateRequest,
22+
TemplateRules, WalletCreateFundedPsbtInput,
2323
},
2424
};
2525

@@ -138,6 +138,7 @@ crate::impl_client_v17__get_transaction!();
138138
crate::impl_client_v17__get_unconfirmed_balance!();
139139
crate::impl_client_v17__get_wallet_info!();
140140
crate::impl_client_v17__import_address!();
141+
crate::impl_client_v17__import_multi!();
141142
crate::impl_client_v17__import_privkey!();
142143
crate::impl_client_v17__import_pruned_funds!();
143144
crate::impl_client_v17__import_pubkey!();

client/src/client_sync/v23/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ use crate::types::v23::*;
2020
#[rustfmt::skip] // Keep public re-exports separate.
2121
pub use crate::client_sync::{
2222
v17::{
23-
AddNodeCommand, Input, Output, SetBanCommand, TemplateRequest, TemplateRules,
24-
WalletCreateFundedPsbtInput
23+
AddNodeCommand, ImportMultiRequest, ImportMultiScriptPubKey, ImportMultiTimestamp, Input, Output, SetBanCommand, TemplateRequest, TemplateRules,
24+
WalletCreateFundedPsbtInput,
2525
},
2626
};
2727

@@ -140,6 +140,7 @@ crate::impl_client_v17__get_transaction!();
140140
crate::impl_client_v17__get_unconfirmed_balance!();
141141
crate::impl_client_v17__get_wallet_info!();
142142
crate::impl_client_v17__import_address!();
143+
crate::impl_client_v17__import_multi!();
143144
crate::impl_client_v17__import_privkey!();
144145
crate::impl_client_v17__import_pruned_funds!();
145146
crate::impl_client_v17__import_pubkey!();

client/src/client_sync/v24/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ use crate::types::v24::*;
1616
#[rustfmt::skip] // Keep public re-exports separate.
1717
pub use crate::client_sync::{
1818
v17::{
19-
AddNodeCommand, Input, Output, SetBanCommand, TemplateRequest, TemplateRules,
20-
WalletCreateFundedPsbtInput
19+
AddNodeCommand, ImportMultiRequest, ImportMultiScriptPubKey, ImportMultiTimestamp, Input, Output, SetBanCommand, TemplateRequest, TemplateRules,
20+
WalletCreateFundedPsbtInput,
2121
},
2222
v23::AddressType,
2323
};
@@ -137,6 +137,7 @@ crate::impl_client_v17__get_transaction!();
137137
crate::impl_client_v17__get_unconfirmed_balance!();
138138
crate::impl_client_v17__get_wallet_info!();
139139
crate::impl_client_v17__import_address!();
140+
crate::impl_client_v17__import_multi!();
140141
crate::impl_client_v17__import_privkey!();
141142
crate::impl_client_v17__import_pruned_funds!();
142143
crate::impl_client_v17__import_pubkey!();

client/src/client_sync/v25/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ use crate::types::v25::*;
1616
#[rustfmt::skip] // Keep public re-exports separate.
1717
pub use crate::client_sync::{
1818
v17::{
19-
AddNodeCommand, Input, Output, SetBanCommand, TemplateRequest, TemplateRules,
20-
WalletCreateFundedPsbtInput
19+
AddNodeCommand, ImportMultiRequest, ImportMultiScriptPubKey, ImportMultiTimestamp, Input, Output, SetBanCommand, TemplateRequest, TemplateRules,
20+
WalletCreateFundedPsbtInput,
2121
},
2222
v23::AddressType,
2323
};
@@ -137,6 +137,7 @@ crate::impl_client_v17__get_transaction!();
137137
crate::impl_client_v17__get_unconfirmed_balance!();
138138
crate::impl_client_v17__get_wallet_info!();
139139
crate::impl_client_v17__import_address!();
140+
crate::impl_client_v17__import_multi!();
140141
crate::impl_client_v17__import_privkey!();
141142
crate::impl_client_v17__import_pruned_funds!();
142143
crate::impl_client_v17__import_pubkey!();

0 commit comments

Comments
 (0)