diff --git a/client/src/client_sync/v20/generating.rs b/client/src/client_sync/v20/generating.rs new file mode 100644 index 00000000..4d33e952 --- /dev/null +++ b/client/src/client_sync/v20/generating.rs @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: CC0-1.0 + +//! Macros for implementing JSON-RPC methods on a client. +//! +//! Specifically this is methods found under the `== Generating ==` section of the +//! API docs of Bitcoin Core `v0.20`. +//! +//! All macros require `Client` to be in scope. +//! +//! See or use the `define_jsonrpc_minreq_client!` macro to define a `Client`. + +/// Implements Bitcoin Core JSON-RPC API method `generatetodescriptor` +#[macro_export] +macro_rules! impl_client_v20__generate_to_descriptor { + () => { + impl Client { + pub fn generate_to_descriptor( + &self, + nblocks: usize, + descriptor: &str, + ) -> Result { + self.call("generatetodescriptor", &[nblocks.into(), descriptor.into()]) + } + } + }; +} diff --git a/client/src/client_sync/v20/mod.rs b/client/src/client_sync/v20/mod.rs index 8720c4c8..df8a46bb 100644 --- a/client/src/client_sync/v20/mod.rs +++ b/client/src/client_sync/v20/mod.rs @@ -4,6 +4,8 @@ //! //! We ignore option arguments unless they effect the shape of the returned JSON data. +pub mod generating; + use std::collections::BTreeMap; use std::path::Path; @@ -60,6 +62,7 @@ crate::impl_client_v17__uptime!(); // == Generating == crate::impl_client_v17__generate_to_address!(); +crate::impl_client_v20__generate_to_descriptor!(); crate::impl_client_v17__invalidate_block!(); // == Mining == diff --git a/client/src/client_sync/v21/mod.rs b/client/src/client_sync/v21/mod.rs index fe3eaf5f..011e3142 100644 --- a/client/src/client_sync/v21/mod.rs +++ b/client/src/client_sync/v21/mod.rs @@ -62,6 +62,7 @@ crate::impl_client_v17__uptime!(); // == Generating == crate::impl_client_v17__generate_to_address!(); +crate::impl_client_v20__generate_to_descriptor!(); crate::impl_client_v17__invalidate_block!(); // == Mining == diff --git a/client/src/client_sync/v22/mod.rs b/client/src/client_sync/v22/mod.rs index 792df8f7..57fe9b25 100644 --- a/client/src/client_sync/v22/mod.rs +++ b/client/src/client_sync/v22/mod.rs @@ -62,6 +62,7 @@ crate::impl_client_v17__uptime!(); // == Generating == crate::impl_client_v17__generate_to_address!(); +crate::impl_client_v20__generate_to_descriptor!(); crate::impl_client_v17__invalidate_block!(); // == Mining == diff --git a/client/src/client_sync/v23/mod.rs b/client/src/client_sync/v23/mod.rs index 909a3dfe..1dcee366 100644 --- a/client/src/client_sync/v23/mod.rs +++ b/client/src/client_sync/v23/mod.rs @@ -64,6 +64,7 @@ crate::impl_client_v17__uptime!(); // == Generating == crate::impl_client_v17__generate_to_address!(); +crate::impl_client_v20__generate_to_descriptor!(); crate::impl_client_v17__invalidate_block!(); // == Mining == diff --git a/client/src/client_sync/v24/mod.rs b/client/src/client_sync/v24/mod.rs index 48281b46..6df99d65 100644 --- a/client/src/client_sync/v24/mod.rs +++ b/client/src/client_sync/v24/mod.rs @@ -61,6 +61,7 @@ crate::impl_client_v17__uptime!(); // == Generating == crate::impl_client_v17__generate_to_address!(); +crate::impl_client_v20__generate_to_descriptor!(); crate::impl_client_v17__invalidate_block!(); // == Mining == diff --git a/client/src/client_sync/v25/mod.rs b/client/src/client_sync/v25/mod.rs index 0357e9fa..4b7c310c 100644 --- a/client/src/client_sync/v25/mod.rs +++ b/client/src/client_sync/v25/mod.rs @@ -61,6 +61,7 @@ crate::impl_client_v17__uptime!(); // == Generating == crate::impl_client_v17__generate_to_address!(); +crate::impl_client_v20__generate_to_descriptor!(); crate::impl_client_v17__invalidate_block!(); // == Mining == diff --git a/client/src/client_sync/v26/mod.rs b/client/src/client_sync/v26/mod.rs index 780cd5b6..47b08f28 100644 --- a/client/src/client_sync/v26/mod.rs +++ b/client/src/client_sync/v26/mod.rs @@ -65,6 +65,7 @@ crate::impl_client_v17__uptime!(); // == Generating == crate::impl_client_v17__generate_to_address!(); +crate::impl_client_v20__generate_to_descriptor!(); crate::impl_client_v17__invalidate_block!(); // == Mining == diff --git a/client/src/client_sync/v27/mod.rs b/client/src/client_sync/v27/mod.rs index 1d420efe..59685ca1 100644 --- a/client/src/client_sync/v27/mod.rs +++ b/client/src/client_sync/v27/mod.rs @@ -61,6 +61,7 @@ crate::impl_client_v17__uptime!(); // == Generating == crate::impl_client_v17__generate_to_address!(); +crate::impl_client_v20__generate_to_descriptor!(); crate::impl_client_v17__invalidate_block!(); // == Mining == diff --git a/client/src/client_sync/v28/mod.rs b/client/src/client_sync/v28/mod.rs index 598f009d..e059f3bb 100644 --- a/client/src/client_sync/v28/mod.rs +++ b/client/src/client_sync/v28/mod.rs @@ -63,6 +63,7 @@ crate::impl_client_v17__uptime!(); // == Generating == crate::impl_client_v17__generate_to_address!(); +crate::impl_client_v20__generate_to_descriptor!(); crate::impl_client_v17__invalidate_block!(); // == Mining == diff --git a/client/src/client_sync/v29/mod.rs b/client/src/client_sync/v29/mod.rs index c061fb2f..f1d6648d 100644 --- a/client/src/client_sync/v29/mod.rs +++ b/client/src/client_sync/v29/mod.rs @@ -63,6 +63,7 @@ crate::impl_client_v17__uptime!(); // == Generating == crate::impl_client_v17__generate_to_address!(); +crate::impl_client_v20__generate_to_descriptor!(); crate::impl_client_v17__invalidate_block!(); // == Mining == diff --git a/integration_test/tests/generating.rs b/integration_test/tests/generating.rs index 2fa45938..ef9a13c4 100644 --- a/integration_test/tests/generating.rs +++ b/integration_test/tests/generating.rs @@ -34,6 +34,20 @@ fn generating__generate_to_address__modelled() { let _ = model.unwrap(); } +#[cfg(not(feature = "v19_and_below"))] +#[test] +fn generating__generate_to_descriptor__modelled() { + const NBLOCKS: usize = 1; + + let node = Node::with_wallet(Wallet::Default, &[]); + let address = node.client.new_address().expect("failed to get new address"); + let descriptor = format!("addr({})", address); + + let json: GenerateToDescriptor = node.client.generate_to_descriptor(NBLOCKS, &descriptor).expect("generatetodescriptor"); + let model: Result = json.into_model(); + let _ = model.unwrap(); +} + // This method does not appear in the output of `bitcoin-cli help`. #[test] fn generating__invalidate_block() { diff --git a/types/src/model/generating.rs b/types/src/model/generating.rs index 9e5a15c4..05d86c40 100644 --- a/types/src/model/generating.rs +++ b/types/src/model/generating.rs @@ -33,3 +33,16 @@ impl GenerateToAddress { /// Returns true if 0 blocks were generated. pub fn is_empty(&self) -> bool { self.0.is_empty() } } + +/// Models the result of JSON-RPC method `generatetodescriptor`. +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] +#[serde(deny_unknown_fields)] +pub struct GenerateToDescriptor(pub Vec); + +impl GenerateToDescriptor { + /// Returns the number of blocks generated. + pub fn len(&self) -> usize { self.0.len() } + + /// Returns true if 0 blocks were generated. + pub fn is_empty(&self) -> bool { self.0.is_empty() } +} diff --git a/types/src/model/mod.rs b/types/src/model/mod.rs index 70c9fe68..80150c14 100644 --- a/types/src/model/mod.rs +++ b/types/src/model/mod.rs @@ -30,7 +30,7 @@ pub use self::{ GetRawMempool, GetRawMempoolVerbose, GetTxOut, GetTxOutSetInfo, MempoolEntry, MempoolEntryFees, ReceiveActivity, Softfork, SoftforkType, SpendActivity, VerifyTxOutProof, }, - generating::{Generate, GenerateToAddress}, + generating::{Generate, GenerateToAddress, GenerateToDescriptor}, mining::{ BlockTemplateTransaction, GetBlockTemplate, GetMiningInfo, GetPrioritisedTransactions, NextBlockInfo, PrioritisedTransaction, diff --git a/types/src/v20/generating.rs b/types/src/v20/generating.rs new file mode 100644 index 00000000..5cb08feb --- /dev/null +++ b/types/src/v20/generating.rs @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: CC0-1.0 + +//! The JSON-RPC API for Bitcoin Core `v0.20` - generating. +//! +//! Types for methods found under the `== Generating ==` section of the API docs. + +use bitcoin::hex; +use serde::{Deserialize, Serialize}; + +use crate::model; + +/// Result of JSON-RPC method `generatetodescriptor`. +/// +/// > generatetodescriptor num_blocks "descriptor" ( maxtries ) +/// > +/// > Mine blocks immediately to a specified descriptor (before the RPC call returns) +/// > +/// > Arguments: +/// > 1. num_blocks (numeric, required) How many blocks are generated immediately. +/// > 2. descriptor (string, required) The descriptor to send the newly generated bitcoin to. +/// > 3. maxtries (numeric, optional, default=1000000) How many iterations to try. +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] +#[serde(deny_unknown_fields)] +pub struct GenerateToDescriptor( + /// Hashes of blocks generated. + pub Vec, +); + +impl GenerateToDescriptor { + /// Converts version specific type to a version nonspecific, more strongly typed type. + pub fn into_model(self) -> Result { + let v = self.0.iter().map(|s| s.parse()).collect::, _>>()?; + Ok(model::GenerateToDescriptor(v)) + } +} diff --git a/types/src/v20/mod.rs b/types/src/v20/mod.rs index 64313561..fb3d7d2c 100644 --- a/types/src/v20/mod.rs +++ b/types/src/v20/mod.rs @@ -74,7 +74,7 @@ //! | JSON-RPC Method Name | Returns | Notes | //! |:-----------------------------------|:---------------:|:--------------------------------------:| //! | generatetoaddress | version + model | | -//! | generatetodescriptor | version + model | TODO | +//! | generatetodescriptor | version + model | | //! //! //! @@ -143,12 +143,12 @@ //! //! | JSON-RPC Method Name | Returns | Notes | //! |:-----------------------------------|:---------------:|:--------------------------------------:| -//! | createmultisig | version + model | TODO | +//! | createmultisig | version + model | | //! | deriveaddresses | version + model | | //! | estimatesmartfee | version + model | | //! | getdescriptorinfo | version | | -//! | signmessagewithprivkey | version + model | TODO | -//! | validateaddress | version + model | TODO | +//! | signmessagewithprivkey | version + model | | +//! | validateaddress | version + model | | //! | verifymessage | version | | //! //! @@ -227,6 +227,7 @@ // JSON-RPC types by API section. mod control; +mod generating; mod network; mod util; mod wallet; @@ -234,6 +235,7 @@ mod wallet; #[doc(inline)] pub use self::{ control::Logging, + generating::GenerateToDescriptor, network::{Banned, ListBanned}, util::CreateMultisig, wallet::{GetTransaction, GetTransactionDetail}, diff --git a/types/src/v21/mod.rs b/types/src/v21/mod.rs index 7769edbb..1e75781f 100644 --- a/types/src/v21/mod.rs +++ b/types/src/v21/mod.rs @@ -75,7 +75,7 @@ //! |:-----------------------------------|:---------------:|:--------------------------------------:| //! | generateblock | version + model | TODO | //! | generatetoaddress | version + model | | -//! | generatetodescriptor | version + model | TODO | +//! | generatetodescriptor | version + model | | //! //! //! @@ -144,13 +144,13 @@ //! //! | JSON-RPC Method Name | Returns | Notes | //! |:-----------------------------------|:---------------:|:--------------------------------------:| -//! | createmultisig | version + model | TODO | +//! | createmultisig | version + model | | //! | deriveaddresses | version + model | | //! | estimatesmartfee | version + model | | //! | getdescriptorinfo | version | | //! | getindexinfo | version | TODO | -//! | signmessagewithprivkey | version + model | TODO | -//! | validateaddress | version + model | TODO | +//! | signmessagewithprivkey | version + model | | +//! | validateaddress | version + model | | //! | verifymessage | version | | //! //! @@ -294,5 +294,8 @@ pub use crate::{ MempoolEntry, MempoolEntryError, MempoolEntryFees, MempoolEntryFeesError, PeerInfo, SetWalletFlag, }, - v20::{Banned, CreateMultisig, GetTransaction, GetTransactionDetail, ListBanned, Logging}, + v20::{ + Banned, CreateMultisig, GenerateToDescriptor, GetTransaction, GetTransactionDetail, + ListBanned, Logging, + }, }; diff --git a/types/src/v22/mod.rs b/types/src/v22/mod.rs index 0d6bd8a9..3a2ca2c6 100644 --- a/types/src/v22/mod.rs +++ b/types/src/v22/mod.rs @@ -75,7 +75,7 @@ //! |:-----------------------------------|:---------------:|:--------------------------------------:| //! | generateblock | version + model | TODO | //! | generatetoaddress | version + model | | -//! | generatetodescriptor | version + model | TODO | +//! | generatetodescriptor | version + model | | //! //! //! @@ -153,13 +153,13 @@ //! //! | JSON-RPC Method Name | Returns | Notes | //! |:-----------------------------------|:---------------:|:--------------------------------------:| -//! | createmultisig | version + model | TODO | +//! | createmultisig | version + model | | //! | deriveaddresses | version + model | | //! | estimatesmartfee | version + model | | //! | getdescriptorinfo | version | | //! | getindexinfo | version | TODO | -//! | signmessagewithprivkey | version + model | TODO | -//! | validateaddress | version + model | TODO | +//! | signmessagewithprivkey | version + model | | +//! | validateaddress | version + model | | //! | verifymessage | version | | //! //! @@ -304,7 +304,7 @@ pub use crate::{ MempoolEntry, MempoolEntryError, MempoolEntryFees, MempoolEntryFeesError, PeerInfo, SetWalletFlag, }, - v20::{CreateMultisig, GetTransaction, GetTransactionDetail}, + v20::{CreateMultisig, GenerateToDescriptor, GetTransaction, GetTransactionDetail}, v21::{ Bip9SoftforkInfo, GetBlockchainInfo, GetMempoolEntry, GetNetworkInfo, Softfork, SoftforkType, UnloadWallet, diff --git a/types/src/v23/mod.rs b/types/src/v23/mod.rs index 014c8d67..0bd11e1e 100644 --- a/types/src/v23/mod.rs +++ b/types/src/v23/mod.rs @@ -144,13 +144,13 @@ //! //! | JSON-RPC Method Name | Returns | Notes | //! |:-----------------------------------|:---------------:|:--------------------------------------:| -//! | createmultisig | version + model | TODO | +//! | createmultisig | version + model | | //! | deriveaddresses | version + model | | //! | estimatesmartfee | version + model | | //! | getdescriptorinfo | version | | //! | getindexinfo | version | TODO | -//! | signmessagewithprivkey | version + model | TODO | -//! | validateaddress | version + model | TODO | +//! | signmessagewithprivkey | version + model | | +//! | validateaddress | version + model | | //! | verifymessage | version | | //! //! @@ -304,7 +304,7 @@ pub use crate::{ MempoolEntryError, MempoolEntryFees, MempoolEntryFeesError, PeerInfo, SetWalletFlag, Softfork, SoftforkType, }, - v20::GetTransactionDetail, + v20::{GenerateToDescriptor, GetTransactionDetail}, v21::{GetNetworkInfo, UnloadWallet}, v22::{Banned, GetMempoolInfo, ListBanned, ScriptPubkey}, }; diff --git a/types/src/v24/mod.rs b/types/src/v24/mod.rs index 7c32e0c8..f6e1d736 100644 --- a/types/src/v24/mod.rs +++ b/types/src/v24/mod.rs @@ -145,13 +145,13 @@ //! //! | JSON-RPC Method Name | Returns | Notes | //! |:-----------------------------------|:---------------:|:--------------------------------------:| -//! | createmultisig | version + model | TODO | +//! | createmultisig | version + model | | //! | deriveaddresses | version + model | | //! | estimatesmartfee | version + model | | //! | getdescriptorinfo | version | | //! | getindexinfo | version | TODO | -//! | signmessagewithprivkey | version + model | TODO | -//! | validateaddress | version + model | TODO | +//! | signmessagewithprivkey | version + model | | +//! | validateaddress | version + model | | //! | verifymessage | version | | //! //! @@ -305,6 +305,7 @@ pub use crate::{ MempoolEntryError, MempoolEntryFees, MempoolEntryFeesError, PeerInfo, SetWalletFlag, Softfork, SoftforkType, }, + v20::GenerateToDescriptor, v21::{GetNetworkInfo, UnloadWallet}, v22::{Banned, ListBanned, ScriptPubkey}, v23::{ diff --git a/types/src/v25/mod.rs b/types/src/v25/mod.rs index fb97aa23..b80500e9 100644 --- a/types/src/v25/mod.rs +++ b/types/src/v25/mod.rs @@ -146,13 +146,13 @@ //! //! | JSON-RPC Method Name | Returns | Notes | //! |:-----------------------------------|:---------------:|:--------------------------------------:| -//! | createmultisig | version + model | TODO | +//! | createmultisig | version + model | | //! | deriveaddresses | version + model | | //! | estimatesmartfee | version + model | | //! | getdescriptorinfo | version | | //! | getindexinfo | version | TODO | -//! | signmessagewithprivkey | version + model | TODO | -//! | validateaddress | version + model | TODO | +//! | signmessagewithprivkey | version + model | | +//! | validateaddress | version + model | | //! | verifymessage | version | | //! //! @@ -298,6 +298,7 @@ pub use crate::{ MempoolEntryError, MempoolEntryFees, MempoolEntryFeesError, PeerInfo, SetWalletFlag, Softfork, SoftforkType, }, + v20::GenerateToDescriptor, v21::GetNetworkInfo, v22::{Banned, ListBanned, ScriptPubkey}, v23::{CreateMultisig, DecodeScript, DecodeScriptError, GetBlockchainInfo, SaveMempool}, diff --git a/types/src/v26/mod.rs b/types/src/v26/mod.rs index 7f727c3b..30b07bec 100644 --- a/types/src/v26/mod.rs +++ b/types/src/v26/mod.rs @@ -154,13 +154,13 @@ //! //! | JSON-RPC Method Name | Returns | Notes | //! |:-----------------------------------|:---------------:|:--------------------------------------:| -//! | createmultisig | version + model | TODO | +//! | createmultisig | version + model | | //! | deriveaddresses | version + model | | //! | estimatesmartfee | version + model | | //! | getdescriptorinfo | version | | //! | getindexinfo | version | TODO | -//! | signmessagewithprivkey | version + model | TODO | -//! | validateaddress | version + model | TODO | +//! | signmessagewithprivkey | version + model | | +//! | validateaddress | version + model | | //! | verifymessage | version | | //! //! @@ -318,6 +318,7 @@ pub use crate::{ MempoolEntry, MempoolEntryError, MempoolEntryFees, MempoolEntryFeesError, PeerInfo, SetWalletFlag, Softfork, SoftforkType, }, + v20::GenerateToDescriptor, v21::GetNetworkInfo, v22::{Banned, ListBanned, ScriptPubkey}, v23::{CreateMultisig, DecodeScript, DecodeScriptError, GetBlockchainInfo, SaveMempool}, diff --git a/types/src/v27/mod.rs b/types/src/v27/mod.rs index 80132121..7966fadb 100644 --- a/types/src/v27/mod.rs +++ b/types/src/v27/mod.rs @@ -154,13 +154,13 @@ //! //! | JSON-RPC Method Name | Returns | Notes | //! |:-----------------------------------|:---------------:|:--------------------------------------:| -//! | createmultisig | version + model | TODO | +//! | createmultisig | version + model | | //! | deriveaddresses | version + model | | //! | estimatesmartfee | version + model | | //! | getdescriptorinfo | version | | //! | getindexinfo | version | TODO | -//! | signmessagewithprivkey | version + model | TODO | -//! | validateaddress | version + model | TODO | +//! | signmessagewithprivkey | version + model | | +//! | validateaddress | version + model | | //! | verifymessage | version | | //! //! @@ -295,6 +295,7 @@ pub use crate::{ MempoolEntry, MempoolEntryError, MempoolEntryFees, MempoolEntryFeesError, PeerInfo, SetWalletFlag, Softfork, SoftforkType, }, + v20::GenerateToDescriptor, v21::GetNetworkInfo, v22::{Banned, ListBanned, ScriptPubkey}, v23::{CreateMultisig, DecodeScript, DecodeScriptError, GetBlockchainInfo, SaveMempool}, diff --git a/types/src/v28/mod.rs b/types/src/v28/mod.rs index d2a18770..d1cb2845 100644 --- a/types/src/v28/mod.rs +++ b/types/src/v28/mod.rs @@ -154,13 +154,13 @@ //! //! | JSON-RPC Method Name | Returns | Notes | //! |:-----------------------------------|:---------------:|:--------------------------------------:| -//! | createmultisig | version + model | TODO | +//! | createmultisig | version + model | | //! | deriveaddresses | version + model | | //! | estimatesmartfee | version + model | | //! | getdescriptorinfo | version | | //! | getindexinfo | version | TODO | -//! | signmessagewithprivkey | version + model | TODO | -//! | validateaddress | version + model | TODO | +//! | signmessagewithprivkey | version + model | | +//! | validateaddress | version + model | | //! | verifymessage | version | | //! //! @@ -316,6 +316,7 @@ pub use crate::{ MempoolEntry, MempoolEntryError, MempoolEntryFees, MempoolEntryFeesError, PeerInfo, SetWalletFlag, Softfork, SoftforkType, }, + v20::GenerateToDescriptor, v22::{Banned, ListBanned, ScriptPubkey}, v23::{CreateMultisig, DecodeScript, DecodeScriptError, SaveMempool}, v24::{ diff --git a/types/src/v29/mod.rs b/types/src/v29/mod.rs index 49239674..300cbf2f 100644 --- a/types/src/v29/mod.rs +++ b/types/src/v29/mod.rs @@ -155,13 +155,13 @@ //! //! | JSON-RPC Method Name | Returns | Notes | //! |:-----------------------------------|:---------------:|:--------------------------------------:| -//! | createmultisig | version + model | TODO | +//! | createmultisig | version + model | | //! | deriveaddresses | version + model | TODO | //! | estimatesmartfee | version + model | | //! | getdescriptorinfo | version | | //! | getindexinfo | version | TODO | -//! | signmessagewithprivkey | version + model | TODO | -//! | validateaddress | version + model | TODO | +//! | signmessagewithprivkey | version + model | | +//! | validateaddress | version + model | | //! | verifymessage | version | | //! //! @@ -314,6 +314,7 @@ pub use crate::{ MempoolEntryError, MempoolEntryFees, MempoolEntryFeesError, PeerInfo, SetWalletFlag, Softfork, SoftforkType, }, + v20::GenerateToDescriptor, v22::{Banned, ListBanned, ScriptPubkey}, v23::{CreateMultisig, DecodeScript, DecodeScriptError, SaveMempool}, v24::{