Skip to content

Commit 4c35184

Browse files
committed
Adds importdescriptors
Adds `importdescriptors` rpc. `ImportMultiRescanSince` to Timestamp given it is not being used solely for MultiRescan anymore. Feels like `ImportMultiResult` should also be renamed, given it is now used by both `importmulti` and `importdescriptors`. I haven't found a proper name for it though.
1 parent 400a3c0 commit 4c35184

File tree

2 files changed

+47
-17
lines changed

2 files changed

+47
-17
lines changed

client/src/client.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,17 @@ pub trait RpcApi: Sized {
655655
self.call("importmulti", handle_defaults(&mut args, &[null()]))
656656
}
657657

658+
fn import_descriptors(
659+
&self,
660+
req: json::ImportDescriptors,
661+
) -> Result<Vec<json::ImportMultiResult>> {
662+
let json_request = vec![serde_json::to_value(req)?];
663+
self.call(
664+
"importdescriptors",
665+
handle_defaults(&mut [json_request.into()], &[null()]),
666+
)
667+
}
668+
658669
fn set_label(&self, address: &Address, label: &str) -> Result<()> {
659670
self.call("setlabel", &[address.to_string().into(), label.into()])
660671
}

json/src/lib.rs

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,7 +1115,7 @@ impl<'a> serde::Serialize for ImportMultiRequestScriptPubkey<'a> {
11151115
/// Note: unlike in bitcoind, `timestamp` defaults to 0.
11161116
#[derive(Clone, PartialEq, Eq, Debug, Default, Serialize)]
11171117
pub struct ImportMultiRequest<'a> {
1118-
pub timestamp: ImportMultiRescanSince,
1118+
pub timestamp: Timestamp,
11191119
/// If using descriptor, do not also provide address/scriptPubKey, scripts, or pubkeys.
11201120
#[serde(rename = "desc", skip_serializing_if = "Option::is_none")]
11211121
pub descriptor: Option<&'a str>,
@@ -1148,32 +1148,32 @@ pub struct ImportMultiOptions {
11481148
}
11491149

11501150
#[derive(Clone, PartialEq, Eq, Copy, Debug)]
1151-
pub enum ImportMultiRescanSince {
1151+
pub enum Timestamp {
11521152
Now,
1153-
Timestamp(u64),
1153+
Time(u64),
11541154
}
11551155

1156-
impl serde::Serialize for ImportMultiRescanSince {
1156+
impl serde::Serialize for Timestamp {
11571157
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
11581158
where
11591159
S: serde::Serializer,
11601160
{
11611161
match *self {
1162-
ImportMultiRescanSince::Now => serializer.serialize_str("now"),
1163-
ImportMultiRescanSince::Timestamp(timestamp) => serializer.serialize_u64(timestamp),
1162+
Timestamp::Now => serializer.serialize_str("now"),
1163+
Timestamp::Time(timestamp) => serializer.serialize_u64(timestamp),
11641164
}
11651165
}
11661166
}
11671167

1168-
impl<'de> serde::Deserialize<'de> for ImportMultiRescanSince {
1168+
impl<'de> serde::Deserialize<'de> for Timestamp {
11691169
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
11701170
where
11711171
D: serde::Deserializer<'de>,
11721172
{
11731173
use serde::de;
11741174
struct Visitor;
11751175
impl<'de> de::Visitor<'de> for Visitor {
1176-
type Value = ImportMultiRescanSince;
1176+
type Value = Timestamp;
11771177

11781178
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
11791179
write!(formatter, "unix timestamp or 'now'")
@@ -1183,15 +1183,15 @@ impl<'de> serde::Deserialize<'de> for ImportMultiRescanSince {
11831183
where
11841184
E: de::Error,
11851185
{
1186-
Ok(ImportMultiRescanSince::Timestamp(value))
1186+
Ok(Timestamp::Time(value))
11871187
}
11881188

11891189
fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
11901190
where
11911191
E: de::Error,
11921192
{
11931193
if value == "now" {
1194-
Ok(ImportMultiRescanSince::Now)
1194+
Ok(Timestamp::Now)
11951195
} else {
11961196
Err(de::Error::custom(format!(
11971197
"invalid str '{}', expecting 'now' or unix timestamp",
@@ -1204,21 +1204,21 @@ impl<'de> serde::Deserialize<'de> for ImportMultiRescanSince {
12041204
}
12051205
}
12061206

1207-
impl Default for ImportMultiRescanSince {
1207+
impl Default for Timestamp {
12081208
fn default() -> Self {
1209-
ImportMultiRescanSince::Timestamp(0)
1209+
Timestamp::Time(0)
12101210
}
12111211
}
12121212

1213-
impl From<u64> for ImportMultiRescanSince {
1214-
fn from(timestamp: u64) -> Self {
1215-
ImportMultiRescanSince::Timestamp(timestamp)
1213+
impl From<u64> for Timestamp {
1214+
fn from(t: u64) -> Self {
1215+
Timestamp::Time(t)
12161216
}
12171217
}
12181218

1219-
impl From<Option<u64>> for ImportMultiRescanSince {
1219+
impl From<Option<u64>> for Timestamp {
12201220
fn from(timestamp: Option<u64>) -> Self {
1221-
timestamp.map_or(ImportMultiRescanSince::Now, ImportMultiRescanSince::Timestamp)
1221+
timestamp.map_or(Timestamp::Now, Timestamp::Time)
12221222
}
12231223
}
12241224

@@ -1236,6 +1236,25 @@ pub struct ImportMultiResult {
12361236
pub error: Option<ImportMultiResultError>,
12371237
}
12381238

1239+
/// A import request for importdescriptors.
1240+
#[derive(Clone, PartialEq, Eq, Debug, Default, Serialize)]
1241+
pub struct ImportDescriptors<'a> {
1242+
#[serde(rename = "desc")]
1243+
pub descriptor: &'a str,
1244+
pub timestamp: Timestamp,
1245+
#[serde(skip_serializing_if = "Option::is_none")]
1246+
pub active: Option<bool>,
1247+
#[serde(skip_serializing_if = "Option::is_none")]
1248+
pub range: Option<(usize, usize)>,
1249+
#[serde(skip_serializing_if = "Option::is_none")]
1250+
pub next_index: Option<usize>,
1251+
#[serde(skip_serializing_if = "Option::is_none")]
1252+
pub internal: Option<bool>,
1253+
#[serde(skip_serializing_if = "Option::is_none")]
1254+
pub label: Option<&'a str>,
1255+
1256+
}
1257+
12391258
/// Progress toward rejecting pre-softfork blocks
12401259
#[derive(Clone, PartialEq, Eq, Debug, Deserialize, Serialize)]
12411260
pub struct RejectStatus {

0 commit comments

Comments
 (0)