Skip to content

Commit 67b03b6

Browse files
committed
Implement scantxoutset method and test
1 parent 71a6018 commit 67b03b6

File tree

35 files changed

+572
-26
lines changed

35 files changed

+572
-26
lines changed

client/src/client_sync/v17/blockchain.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,30 @@ macro_rules! impl_client_v17__savemempool {
318318
};
319319
}
320320

321+
/// Implements Bitcoin Core JSON-RPC API method `scantxoutset`
322+
#[macro_export]
323+
macro_rules! impl_client_v17__scantxoutset {
324+
() => {
325+
impl Client {
326+
pub fn scan_tx_out_set(
327+
&self,
328+
action: ScanAction,
329+
scan_objects: &[ScanObject],
330+
) -> Result<ScanTxOutSet> {
331+
let params = match action {
332+
ScanAction::Start => {
333+
vec![into_json(action)?, into_json(scan_objects)?]
334+
}
335+
ScanAction::Abort | ScanAction::Status => {
336+
vec![into_json(action)?]
337+
}
338+
};
339+
self.call("scantxoutset", &params)
340+
}
341+
}
342+
};
343+
}
344+
321345
/// Implements Bitcoin Core JSON-RPC API method `verifychain`
322346
#[macro_export]
323347
macro_rules! impl_client_v17__verifychain {

client/src/client_sync/v17/mod.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ crate::impl_client_v17__gettxoutsetinfo!();
4747
crate::impl_client_v17__preciousblock!();
4848
crate::impl_client_v17__pruneblockchain!();
4949
crate::impl_client_v17__savemempool!();
50+
crate::impl_client_v17__scantxoutset!();
5051
crate::impl_client_v17__verifychain!();
5152
crate::impl_client_v17__verifytxoutproof!();
5253

@@ -206,3 +207,24 @@ pub struct WalletCreateFundedPsbtInput {
206207
txid: Txid,
207208
vout: u32,
208209
}
210+
211+
/// Args for the `scantxoutset`
212+
///
213+
/// Represents the action for the `scantxoutset` RPC call.
214+
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
215+
#[serde(rename_all = "lowercase")]
216+
pub enum ScanAction {
217+
Start,
218+
Abort,
219+
Status,
220+
}
221+
222+
/// Represents a scan object for scantxoutset (descriptor string or object).
223+
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
224+
#[serde(untagged)]
225+
pub enum ScanObject {
226+
/// Plain descriptor string
227+
Descriptor(String),
228+
/// Object containing descriptor and optional range
229+
WithDesc { desc: String },
230+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// SPDX-License-Identifier: CC0-1.0
2+
3+
//! Macros for implementing JSON-RPC methods on a client.
4+
//!
5+
//! Specifically this is methods found under the `== Blockchain ==` section of the
6+
//! API docs of Bitcoin Core `v0.18`.
7+
//!
8+
//! All macros require `Client` to be in scope.
9+
//!
10+
//! See or use the `define_jsonrpc_minreq_client!` macro to define a `Client`.
11+
12+
/// Implements Bitcoin Core JSON-RPC API method `scantxoutset`
13+
#[macro_export]
14+
macro_rules! impl_client_v18__scantxoutset {
15+
() => {
16+
impl Client {
17+
pub fn scan_tx_out_set(
18+
&self,
19+
action: ScanAction,
20+
scan_objects: &[ScanObject],
21+
) -> Result<ScanTxOutSet> {
22+
let params = match action {
23+
ScanAction::Start => {
24+
vec![into_json(action)?, into_json(scan_objects)?]
25+
}
26+
ScanAction::Abort | ScanAction::Status => {
27+
vec![into_json(action)?]
28+
}
29+
};
30+
self.call("scantxoutset", &params)
31+
}
32+
}
33+
};
34+
}

client/src/client_sync/v18/mod.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
//!
55
//! We ignore option arguments unless they effect the shape of the returned JSON data.
66
7+
pub mod blockchain;
78
pub mod control;
89
pub mod network;
910
pub mod raw_transactions;
@@ -19,7 +20,10 @@ use crate::types::v18::*;
1920

2021
#[rustfmt::skip] // Keep public re-exports separate.
2122
pub use crate::client_sync::{
22-
v17::{AddressType, Input, Output, TemplateRequest, TemplateRules, WalletCreateFundedPsbtInput},
23+
v17::{
24+
AddressType, Input, Output, ScanAction, ScanObject, TemplateRequest,
25+
TemplateRules, WalletCreateFundedPsbtInput
26+
},
2327
};
2428

2529
// This publicly re-exports `Client`.
@@ -48,6 +52,7 @@ crate::impl_client_v17__gettxoutsetinfo!();
4852
crate::impl_client_v17__preciousblock!();
4953
crate::impl_client_v17__pruneblockchain!();
5054
crate::impl_client_v17__savemempool!();
55+
crate::impl_client_v18__scantxoutset!();
5156
crate::impl_client_v17__verifychain!();
5257
crate::impl_client_v17__verifytxoutproof!();
5358

client/src/client_sync/v19/blockchain.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,27 @@ macro_rules! impl_client_v19__getblockfilter {
2020
}
2121
};
2222
}
23+
24+
/// Implements Bitcoin Core JSON-RPC API method `scantxoutset`
25+
#[macro_export]
26+
macro_rules! impl_client_v19__scantxoutset {
27+
() => {
28+
impl Client {
29+
pub fn scan_tx_out_set(
30+
&self,
31+
action: ScanAction,
32+
scan_objects: &[ScanObject],
33+
) -> Result<ScanTxOutSet> {
34+
let params = match action {
35+
ScanAction::Start => {
36+
vec![into_json(action)?, into_json(scan_objects)?]
37+
}
38+
ScanAction::Abort | ScanAction::Status => {
39+
vec![into_json(action)?]
40+
}
41+
};
42+
self.call("scantxoutset", &params)
43+
}
44+
}
45+
};
46+
}

client/src/client_sync/v19/mod.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@ use crate::types::v19::*;
1818

1919
#[rustfmt::skip] // Keep public re-exports separate.
2020
pub use crate::client_sync::{
21-
v17::{AddressType, Input, Output, TemplateRequest, TemplateRules, WalletCreateFundedPsbtInput},
21+
v17::{
22+
AddressType, Input, Output, ScanAction, ScanObject, TemplateRequest,
23+
TemplateRules, WalletCreateFundedPsbtInput
24+
},
2225
};
2326

2427
crate::define_jsonrpc_minreq_client!("v19");
@@ -47,6 +50,7 @@ crate::impl_client_v17__gettxoutsetinfo!();
4750
crate::impl_client_v17__preciousblock!();
4851
crate::impl_client_v17__pruneblockchain!();
4952
crate::impl_client_v17__savemempool!();
53+
crate::impl_client_v19__scantxoutset!();
5054
crate::impl_client_v17__verifychain!();
5155
crate::impl_client_v17__verifytxoutproof!();
5256

client/src/client_sync/v20.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ use crate::types::v20::*;
1515

1616
#[rustfmt::skip] // Keep public re-exports separate.
1717
pub use crate::client_sync::{
18-
v17::{AddressType, Input, Output, TemplateRequest, TemplateRules, WalletCreateFundedPsbtInput},
18+
v17::{
19+
AddressType, Input, Output, ScanAction, ScanObject, TemplateRequest,
20+
TemplateRules, WalletCreateFundedPsbtInput
21+
},
1922
};
2023

2124
crate::define_jsonrpc_minreq_client!("v20");
@@ -44,6 +47,7 @@ crate::impl_client_v17__gettxoutsetinfo!();
4447
crate::impl_client_v17__preciousblock!();
4548
crate::impl_client_v17__pruneblockchain!();
4649
crate::impl_client_v17__savemempool!();
50+
crate::impl_client_v19__scantxoutset!();
4751
crate::impl_client_v17__verifychain!();
4852
crate::impl_client_v17__verifytxoutproof!();
4953

client/src/client_sync/v21/mod.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ use crate::types::v21::*;
1717

1818
#[rustfmt::skip] // Keep public re-exports separate.
1919
pub use crate::client_sync::{
20-
v17::{AddressType, Input, Output, TemplateRequest, TemplateRules, WalletCreateFundedPsbtInput},
20+
v17::{
21+
AddressType, Input, Output, ScanAction, ScanObject, TemplateRequest,
22+
TemplateRules, WalletCreateFundedPsbtInput
23+
},
2124
};
2225

2326
crate::define_jsonrpc_minreq_client!("v21");
@@ -46,6 +49,7 @@ crate::impl_client_v17__gettxoutsetinfo!();
4649
crate::impl_client_v17__preciousblock!();
4750
crate::impl_client_v17__pruneblockchain!();
4851
crate::impl_client_v17__savemempool!();
52+
crate::impl_client_v19__scantxoutset!();
4953
crate::impl_client_v17__verifychain!();
5054
crate::impl_client_v17__verifytxoutproof!();
5155

client/src/client_sync/v22/mod.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@ use crate::types::v22::*;
1818

1919
#[rustfmt::skip] // Keep public re-exports separate.
2020
pub use crate::client_sync::{
21-
v17::{AddressType, Input, Output, TemplateRequest, TemplateRules, WalletCreateFundedPsbtInput},
21+
v17::{
22+
AddressType, Input, Output, ScanAction, ScanObject, TemplateRequest,
23+
TemplateRules, WalletCreateFundedPsbtInput
24+
},
2225
};
2326

2427
crate::define_jsonrpc_minreq_client!("v22");
@@ -47,6 +50,7 @@ crate::impl_client_v17__gettxoutsetinfo!();
4750
crate::impl_client_v17__preciousblock!();
4851
crate::impl_client_v17__pruneblockchain!();
4952
crate::impl_client_v17__savemempool!();
53+
crate::impl_client_v19__scantxoutset!();
5054
crate::impl_client_v17__verifychain!();
5155
crate::impl_client_v17__verifytxoutproof!();
5256

client/src/client_sync/v23/mod.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ use crate::types::v23::*;
1919

2020
#[rustfmt::skip] // Keep public re-exports separate.
2121
pub use crate::client_sync::{
22-
v17::{Input, Output, TemplateRequest, TemplateRules, WalletCreateFundedPsbtInput},
22+
v17::{
23+
Input, Output, ScanAction, ScanObject, TemplateRequest,
24+
TemplateRules, WalletCreateFundedPsbtInput
25+
},
2326
};
2427

2528
crate::define_jsonrpc_minreq_client!("v23");
@@ -48,6 +51,7 @@ crate::impl_client_v17__gettxoutsetinfo!();
4851
crate::impl_client_v17__preciousblock!();
4952
crate::impl_client_v17__pruneblockchain!();
5053
crate::impl_client_v23__savemempool!();
54+
crate::impl_client_v19__scantxoutset!();
5155
crate::impl_client_v17__verifychain!();
5256
crate::impl_client_v17__verifytxoutproof!();
5357

client/src/client_sync/v24.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ use crate::types::v24::*;
1515

1616
#[rustfmt::skip] // Keep public re-exports separate.
1717
pub use crate::client_sync::{
18-
v17::{Input, Output, TemplateRequest, TemplateRules, WalletCreateFundedPsbtInput},
18+
v17::{
19+
Input, Output, ScanAction, ScanObject, TemplateRequest, TemplateRules,
20+
WalletCreateFundedPsbtInput
21+
},
1922
v23::AddressType,
2023
};
2124

@@ -45,6 +48,7 @@ crate::impl_client_v17__gettxoutsetinfo!();
4548
crate::impl_client_v17__preciousblock!();
4649
crate::impl_client_v17__pruneblockchain!();
4750
crate::impl_client_v23__savemempool!();
51+
crate::impl_client_v19__scantxoutset!();
4852
crate::impl_client_v17__verifychain!();
4953
crate::impl_client_v17__verifytxoutproof!();
5054

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// SPDX-License-Identifier: CC0-1.0
2+
3+
//! Macros for implementing JSON-RPC methods on a client.
4+
//!
5+
//! Specifically this is methods found under the `== Blockchain ==` section of the
6+
//! API docs of Bitcoin Core `v25`.
7+
//!
8+
//! All macros require `Client` to be in scope.
9+
//!
10+
//! See or use the `define_jsonrpc_minreq_client!` macro to define a `Client`.
11+
12+
/// Implements Bitcoin Core JSON-RPC API method `scantxoutset`
13+
#[macro_export]
14+
macro_rules! impl_client_v25__scantxoutset {
15+
() => {
16+
impl Client {
17+
pub fn scan_tx_out_set(
18+
&self,
19+
action: ScanAction,
20+
scan_objects: &[ScanObject],
21+
) -> Result<ScanTxOutSet> {
22+
let params = match action {
23+
ScanAction::Start => {
24+
vec![into_json(action)?, into_json(scan_objects)?]
25+
}
26+
ScanAction::Abort | ScanAction::Status => {
27+
vec![into_json(action)?]
28+
}
29+
};
30+
self.call("scantxoutset", &params)
31+
}
32+
}
33+
};
34+
}

client/src/client_sync/v25.rs renamed to client/src/client_sync/v25/mod.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
//!
55
//! We ignore option arguments unless they effect the shape of the returned JSON data.
66
7+
pub mod blockchain;
8+
79
use std::collections::BTreeMap;
810
use std::path::Path;
911

@@ -15,7 +17,10 @@ use crate::types::v25::*;
1517

1618
#[rustfmt::skip] // Keep public re-exports separate.
1719
pub use crate::client_sync::{
18-
v17::{Input, Output, TemplateRequest, TemplateRules, WalletCreateFundedPsbtInput},
20+
v17::{
21+
Input, Output, ScanAction, ScanObject, TemplateRequest, TemplateRules,
22+
WalletCreateFundedPsbtInput
23+
},
1924
v23::AddressType,
2025
};
2126

@@ -45,6 +50,7 @@ crate::impl_client_v17__gettxoutsetinfo!();
4550
crate::impl_client_v17__preciousblock!();
4651
crate::impl_client_v17__pruneblockchain!();
4752
crate::impl_client_v23__savemempool!();
53+
crate::impl_client_v25__scantxoutset!();
4854
crate::impl_client_v17__verifychain!();
4955
crate::impl_client_v17__verifytxoutproof!();
5056

client/src/client_sync/v26/mod.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ use crate::types::v26::*;
1919

2020
#[rustfmt::skip] // Keep public re-exports separate.
2121
pub use crate::client_sync::{
22-
v17::{Input, Output, TemplateRequest, TemplateRules, WalletCreateFundedPsbtInput},
22+
v17::{
23+
Input, Output, ScanAction, ScanObject, TemplateRequest,
24+
TemplateRules, WalletCreateFundedPsbtInput
25+
},
2326
v23::AddressType,
2427
};
2528

@@ -49,6 +52,7 @@ crate::impl_client_v26__gettxoutsetinfo!();
4952
crate::impl_client_v17__preciousblock!();
5053
crate::impl_client_v17__pruneblockchain!();
5154
crate::impl_client_v23__savemempool!();
55+
crate::impl_client_v25__scantxoutset!();
5256
crate::impl_client_v17__verifychain!();
5357
crate::impl_client_v17__verifytxoutproof!();
5458

client/src/client_sync/v27.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ use crate::types::v27::*;
1515

1616
#[rustfmt::skip] // Keep public re-exports separate.
1717
pub use crate::client_sync::{
18-
v17::{Input, Output, TemplateRequest, TemplateRules, WalletCreateFundedPsbtInput},
18+
v17::{
19+
Input, Output, ScanAction, ScanObject, TemplateRequest, TemplateRules,
20+
WalletCreateFundedPsbtInput
21+
},
1922
v23::AddressType,
2023
};
2124

@@ -45,6 +48,7 @@ crate::impl_client_v26__gettxoutsetinfo!();
4548
crate::impl_client_v17__preciousblock!();
4649
crate::impl_client_v17__pruneblockchain!();
4750
crate::impl_client_v23__savemempool!();
51+
crate::impl_client_v25__scantxoutset!();
4852
crate::impl_client_v17__verifychain!();
4953
crate::impl_client_v17__verifytxoutproof!();
5054

0 commit comments

Comments
 (0)