diff --git a/client/src/client_sync/v17/blockchain.rs b/client/src/client_sync/v17/blockchain.rs index 6b0103fc..f5cff7b6 100644 --- a/client/src/client_sync/v17/blockchain.rs +++ b/client/src/client_sync/v17/blockchain.rs @@ -302,6 +302,22 @@ macro_rules! impl_client_v17__pruneblockchain { }; } +/// Implements Bitcoin Core JSON-RPC API method `savemempool` +#[macro_export] +macro_rules! impl_client_v17__savemempool { + () => { + impl Client { + pub fn save_mempool(&self) -> Result<()> { + match self.call("savemempool", &[]) { + Ok(serde_json::Value::Null) => Ok(()), + Ok(res) => Err(Error::Returned(res.to_string())), + Err(err) => Err(err.into()), + } + } + } + }; +} + /// Implements Bitcoin Core JSON-RPC API method `verifytxoutproof` #[macro_export] macro_rules! impl_client_v17__verifytxoutproof { diff --git a/client/src/client_sync/v17/mod.rs b/client/src/client_sync/v17/mod.rs index 648aac47..1fd8d5d6 100644 --- a/client/src/client_sync/v17/mod.rs +++ b/client/src/client_sync/v17/mod.rs @@ -49,6 +49,7 @@ crate::impl_client_v17__gettxoutproof!(); crate::impl_client_v17__gettxoutsetinfo!(); crate::impl_client_v17__preciousblock!(); crate::impl_client_v17__pruneblockchain!(); +crate::impl_client_v17__savemempool!(); crate::impl_client_v17__verifytxoutproof!(); // == Control == diff --git a/client/src/client_sync/v18/mod.rs b/client/src/client_sync/v18/mod.rs index 1e579d61..f52c9b39 100644 --- a/client/src/client_sync/v18/mod.rs +++ b/client/src/client_sync/v18/mod.rs @@ -43,6 +43,7 @@ crate::impl_client_v17__gettxoutproof!(); crate::impl_client_v17__gettxoutsetinfo!(); crate::impl_client_v17__preciousblock!(); crate::impl_client_v17__pruneblockchain!(); +crate::impl_client_v17__savemempool!(); crate::impl_client_v17__verifytxoutproof!(); // == Control == diff --git a/client/src/client_sync/v19/mod.rs b/client/src/client_sync/v19/mod.rs index 4e7b9bfa..555e6fca 100644 --- a/client/src/client_sync/v19/mod.rs +++ b/client/src/client_sync/v19/mod.rs @@ -44,6 +44,7 @@ crate::impl_client_v17__gettxoutproof!(); crate::impl_client_v17__gettxoutsetinfo!(); crate::impl_client_v17__preciousblock!(); crate::impl_client_v17__pruneblockchain!(); +crate::impl_client_v17__savemempool!(); crate::impl_client_v17__verifytxoutproof!(); // == Control == diff --git a/client/src/client_sync/v20.rs b/client/src/client_sync/v20.rs index e97bcf0c..1b77dc23 100644 --- a/client/src/client_sync/v20.rs +++ b/client/src/client_sync/v20.rs @@ -41,6 +41,7 @@ crate::impl_client_v17__gettxoutproof!(); crate::impl_client_v17__gettxoutsetinfo!(); crate::impl_client_v17__preciousblock!(); crate::impl_client_v17__pruneblockchain!(); +crate::impl_client_v17__savemempool!(); crate::impl_client_v17__verifytxoutproof!(); // == Control == diff --git a/client/src/client_sync/v21/mod.rs b/client/src/client_sync/v21/mod.rs index cc8ab23c..b916a649 100644 --- a/client/src/client_sync/v21/mod.rs +++ b/client/src/client_sync/v21/mod.rs @@ -43,6 +43,7 @@ crate::impl_client_v17__gettxoutproof!(); crate::impl_client_v17__gettxoutsetinfo!(); crate::impl_client_v17__preciousblock!(); crate::impl_client_v17__pruneblockchain!(); +crate::impl_client_v17__savemempool!(); crate::impl_client_v17__verifytxoutproof!(); // == Control == diff --git a/client/src/client_sync/v22/mod.rs b/client/src/client_sync/v22/mod.rs index da71156c..2ba8cf39 100644 --- a/client/src/client_sync/v22/mod.rs +++ b/client/src/client_sync/v22/mod.rs @@ -44,6 +44,7 @@ crate::impl_client_v17__gettxoutproof!(); crate::impl_client_v17__gettxoutsetinfo!(); crate::impl_client_v17__preciousblock!(); crate::impl_client_v17__pruneblockchain!(); +crate::impl_client_v17__savemempool!(); crate::impl_client_v17__verifytxoutproof!(); // == Control == diff --git a/client/src/client_sync/v23/blockchain.rs b/client/src/client_sync/v23/blockchain.rs new file mode 100644 index 00000000..0d7c004a --- /dev/null +++ b/client/src/client_sync/v23/blockchain.rs @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: CC0-1.0 + +//! Macros for implementing JSON-RPC methods on a client. +//! +//! Specifically this is methods found under the `== Blockchain ==` section of the +//! API docs of Bitcoin Core `v0.23`. +//! +//! 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 `savemempool` +#[macro_export] +macro_rules! impl_client_v23__savemempool { + () => { + impl Client { + pub fn save_mempool(&self) -> Result { self.call("savemempool", &[]) } + } + }; +} diff --git a/client/src/client_sync/v23/mod.rs b/client/src/client_sync/v23/mod.rs index af53cd84..c0cb301d 100644 --- a/client/src/client_sync/v23/mod.rs +++ b/client/src/client_sync/v23/mod.rs @@ -4,6 +4,7 @@ //! //! We ignore option arguments unless they effect the shape of the returned JSON data. +pub mod blockchain; pub mod wallet; use std::collections::BTreeMap; @@ -44,6 +45,7 @@ crate::impl_client_v17__gettxoutproof!(); crate::impl_client_v17__gettxoutsetinfo!(); crate::impl_client_v17__preciousblock!(); crate::impl_client_v17__pruneblockchain!(); +crate::impl_client_v23__savemempool!(); crate::impl_client_v17__verifytxoutproof!(); // == Control == diff --git a/client/src/client_sync/v24.rs b/client/src/client_sync/v24.rs index cd3bdd46..2f95529e 100644 --- a/client/src/client_sync/v24.rs +++ b/client/src/client_sync/v24.rs @@ -41,6 +41,7 @@ crate::impl_client_v17__gettxoutproof!(); crate::impl_client_v17__gettxoutsetinfo!(); crate::impl_client_v17__preciousblock!(); crate::impl_client_v17__pruneblockchain!(); +crate::impl_client_v23__savemempool!(); crate::impl_client_v17__verifytxoutproof!(); // == Control == diff --git a/client/src/client_sync/v25.rs b/client/src/client_sync/v25.rs index 62e72d2a..0f49f1c5 100644 --- a/client/src/client_sync/v25.rs +++ b/client/src/client_sync/v25.rs @@ -41,6 +41,7 @@ crate::impl_client_v17__gettxoutproof!(); crate::impl_client_v17__gettxoutsetinfo!(); crate::impl_client_v17__preciousblock!(); crate::impl_client_v17__pruneblockchain!(); +crate::impl_client_v23__savemempool!(); crate::impl_client_v17__verifytxoutproof!(); // == Control == diff --git a/client/src/client_sync/v26/mod.rs b/client/src/client_sync/v26/mod.rs index 80d473e7..89e3c063 100644 --- a/client/src/client_sync/v26/mod.rs +++ b/client/src/client_sync/v26/mod.rs @@ -45,6 +45,7 @@ crate::impl_client_v17__gettxoutproof!(); crate::impl_client_v26__gettxoutsetinfo!(); crate::impl_client_v17__preciousblock!(); crate::impl_client_v17__pruneblockchain!(); +crate::impl_client_v23__savemempool!(); crate::impl_client_v17__verifytxoutproof!(); // == Control == diff --git a/client/src/client_sync/v27.rs b/client/src/client_sync/v27.rs index 1bdd9162..402561d5 100644 --- a/client/src/client_sync/v27.rs +++ b/client/src/client_sync/v27.rs @@ -41,6 +41,7 @@ crate::impl_client_v17__gettxoutproof!(); crate::impl_client_v26__gettxoutsetinfo!(); crate::impl_client_v17__preciousblock!(); crate::impl_client_v17__pruneblockchain!(); +crate::impl_client_v23__savemempool!(); crate::impl_client_v17__verifytxoutproof!(); // == Control == diff --git a/client/src/client_sync/v28/mod.rs b/client/src/client_sync/v28/mod.rs index 60019816..6ae9bb99 100644 --- a/client/src/client_sync/v28/mod.rs +++ b/client/src/client_sync/v28/mod.rs @@ -43,6 +43,7 @@ crate::impl_client_v17__gettxoutproof!(); crate::impl_client_v26__gettxoutsetinfo!(); crate::impl_client_v17__preciousblock!(); crate::impl_client_v17__pruneblockchain!(); +crate::impl_client_v23__savemempool!(); crate::impl_client_v17__verifytxoutproof!(); // == Control == diff --git a/integration_test/tests/blockchain.rs b/integration_test/tests/blockchain.rs index d245c061..36f8c329 100644 --- a/integration_test/tests/blockchain.rs +++ b/integration_test/tests/blockchain.rs @@ -276,6 +276,37 @@ fn blockchain__prune_blockchain() { let _: Result = node.client.prune_blockchain(target_height); } +#[test] +fn blockchain__savemempool() { + let node = Node::with_wallet(Wallet::Default, &[]); + node.fund_wallet(); + let (_addr, _txid) = node.create_mempool_transaction(); + + #[cfg(any( + feature = "0_17_2", + feature = "0_18_1", + feature = "0_19_1", + feature = "0_20_2", + feature = "0_21_2", + feature = "22_1" + ))] + { + node.client.save_mempool().expect("savemempool"); + } + + #[cfg(not(any( + feature = "0_17_2", + feature = "0_18_1", + feature = "0_19_1", + feature = "0_20_2", + feature = "0_21_2", + feature = "22_1" + )))] + { + let _: Result = node.client.save_mempool(); + } +} + #[test] fn blockchain__verify_tx_out_proof__modelled() { let node = Node::with_wallet(Wallet::Default, &[]); diff --git a/types/src/v23/blockchain.rs b/types/src/v23/blockchain.rs new file mode 100644 index 00000000..284df8dd --- /dev/null +++ b/types/src/v23/blockchain.rs @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: CC0-1.0 + +//! The JSON-RPC API for Bitcoin Core `v23` - blockchain. +//! +//! Types for methods found under the `== Blockchain ==` section of the API docs. +use serde::{Deserialize, Serialize}; + +/// Result of JSON-RPC method `savemempool`. +/// +/// > savemempool +/// +/// > Dumps the mempool to disk. It will fail until the previous dump is fully loaded. +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] +pub struct SaveMempool { + /// The directory and file where the mempool was saved. + pub filename: String, +} diff --git a/types/src/v23/mod.rs b/types/src/v23/mod.rs index 97ead9f5..59c497e9 100644 --- a/types/src/v23/mod.rs +++ b/types/src/v23/mod.rs @@ -49,7 +49,7 @@ //! | gettxoutsetinfo | version + model | | //! | preciousblock | returns nothing | | //! | pruneblockchain | returns numeric | | -//! | savemempool | returns nothing | | +//! | savemempool | version | | //! | scantxoutset | omitted | API marked as experimental | //! | verifychain | returns boolean | | //! | verifytxoutproof | version + model | | @@ -236,11 +236,15 @@ //! // JSON-RPC types by API section. +mod blockchain; mod raw_transactions; #[doc(inline)] -pub use self::raw_transactions::{ - DecodePsbt, DecodePsbtError, GlobalXpub, Proprietary, PsbtInput, PsbtOutput, +pub use self::{ + blockchain::SaveMempool, + raw_transactions::{ + DecodePsbt, DecodePsbtError, GlobalXpub, Proprietary, PsbtInput, PsbtOutput, + }, }; #[doc(inline)] pub use crate::{ diff --git a/types/src/v24/mod.rs b/types/src/v24/mod.rs index c690f7ba..41b51ad4 100644 --- a/types/src/v24/mod.rs +++ b/types/src/v24/mod.rs @@ -50,7 +50,7 @@ //! | gettxspendingprevout | version + model | TODO | //! | preciousblock | returns nothing | | //! | pruneblockchain | returns numeric | | -//! | savemempool | returns nothing | | +//! | savemempool | version | | //! | scantxoutset | omitted | API marked as experimental | //! | verifychain | returns boolean | | //! | verifytxoutproof | version + model | | @@ -294,4 +294,5 @@ pub use crate::{ }, v21::UnloadWallet, v22::{GetTxOut, GetTxOutError, Logging, ScriptPubkey}, + v23::SaveMempool, }; diff --git a/types/src/v25/mod.rs b/types/src/v25/mod.rs index 62d3594c..f5b37edc 100644 --- a/types/src/v25/mod.rs +++ b/types/src/v25/mod.rs @@ -50,7 +50,7 @@ //! | gettxspendingprevout | version + model | TODO | //! | preciousblock | returns nothing | | //! | pruneblockchain | returns numeric | | -//! | savemempool | returns nothing | | +//! | savemempool | version | | //! | scanblocks | version + model | TODO | //! | scantxoutset | omitted | API marked as experimental | //! | verifychain | returns boolean | | @@ -290,6 +290,7 @@ pub use crate::{ SoftforkType, }, v22::{GetTxOut, GetTxOutError, Logging, ScriptPubkey}, + v23::SaveMempool, v24::{ DecodePsbt, DecodePsbtError, GlobalXpub, Proprietary, PsbtInput, PsbtOutput, TaprootBip32Deriv, TaprootLeaf, TaprootScript, TaprootScriptPathSig, diff --git a/types/src/v26/mod.rs b/types/src/v26/mod.rs index 731243a3..50e8eac5 100644 --- a/types/src/v26/mod.rs +++ b/types/src/v26/mod.rs @@ -54,7 +54,7 @@ //! | loadtxoutset | version + model | TODO | //! | preciousblock | returns nothing | | //! | pruneblockchain | returns numeric | | -//! | savemempool | returns nothing | | +//! | savemempool | version | | //! | scanblocks | version + model | TODO | //! | scantxoutset | omitted | API marked as experimental | //! | verifychain | returns boolean | | @@ -310,6 +310,7 @@ pub use crate::{ SoftforkType, }, v22::{GetTxOut, GetTxOutError, Logging, ScriptPubkey}, + v23::SaveMempool, v24::{ DecodePsbt, DecodePsbtError, GlobalXpub, Proprietary, PsbtInput, PsbtOutput, TaprootBip32Deriv, TaprootLeaf, TaprootScript, TaprootScriptPathSig, diff --git a/types/src/v27/mod.rs b/types/src/v27/mod.rs index 06069cf1..05f09815 100644 --- a/types/src/v27/mod.rs +++ b/types/src/v27/mod.rs @@ -54,7 +54,7 @@ //! | loadtxoutset | version + model | TODO | //! | preciousblock | returns nothing | | //! | pruneblockchain | returns numeric | | -//! | savemempool | returns nothing | | +//! | savemempool | version | | //! | scanblocks | version + model | TODO | //! | scantxoutset | omitted | API marked as experimental | //! | verifychain | returns boolean | | @@ -294,6 +294,7 @@ pub use crate::{ SoftforkType, }, v22::{GetTxOut, GetTxOutError, Logging, ScriptPubkey}, + v23::SaveMempool, v24::{ DecodePsbt, DecodePsbtError, GlobalXpub, Proprietary, PsbtInput, PsbtOutput, TaprootBip32Deriv, TaprootLeaf, TaprootScript, TaprootScriptPathSig, diff --git a/types/src/v28/mod.rs b/types/src/v28/mod.rs index 5f77ab59..e03707f1 100644 --- a/types/src/v28/mod.rs +++ b/types/src/v28/mod.rs @@ -54,7 +54,7 @@ //! | loadtxoutset | version + model | TODO | //! | preciousblock | returns nothing | | //! | pruneblockchain | returns numeric | | -//! | savemempool | returns nothing | | +//! | savemempool | version | | //! | scanblocks | version + model | TODO | //! | scantxoutset | omitted | API marked as experimental | //! | verifychain | returns boolean | | @@ -300,6 +300,7 @@ pub use crate::{ MempoolEntryError, MempoolEntryFees, MempoolEntryFeesError, Softfork, SoftforkType, }, v22::{GetTxOut, GetTxOutError, Logging, ScriptPubkey}, + v23::SaveMempool, v24::{ DecodePsbt, DecodePsbtError, GlobalXpub, Proprietary, PsbtInput, PsbtOutput, TaprootBip32Deriv, TaprootLeaf, TaprootScript, TaprootScriptPathSig, diff --git a/verify/src/method/v23.rs b/verify/src/method/v23.rs index 8bec6cd4..2bce91f6 100644 --- a/verify/src/method/v23.rs +++ b/verify/src/method/v23.rs @@ -34,7 +34,7 @@ pub const METHODS: &[Method] = &[ Method::new_modelled("gettxoutsetinfo", "GetTxOutSetInfo", "get_tx_out_set_info"), Method::new_nothing("preciousblock", "precious_block"), Method::new_no_model("pruneblockchain", "PruneBlockchain", "prune_blockchain"), - Method::new_nothing("savemempool", "save_mempool"), + Method::new_no_model("savemempool", "SaveMempool", "save_mempool"), Method::new_modelled("scantxoutset", "ScanTxOutSet", "scan_tx_out_set"), Method::new_bool("verifychain", "verify_chain"), Method::new_modelled("verifytxoutproof", "VerifyTxOutProof", "verify_tx_out_proof"), diff --git a/verify/src/method/v24.rs b/verify/src/method/v24.rs index 51818cda..86c361e9 100644 --- a/verify/src/method/v24.rs +++ b/verify/src/method/v24.rs @@ -35,7 +35,7 @@ pub const METHODS: &[Method] = &[ Method::new_modelled("gettxspendingprevout", "GetTxSpendingPrevout", "get_tx_spending_prevout"), Method::new_nothing("preciousblock", "precious_block"), Method::new_no_model("pruneblockchain", "PruneBlockchain", "prune_blockchain"), - Method::new_nothing("savemempool", "save_mempool"), + Method::new_no_model("savemempool", "SaveMempool", "save_mempool"), Method::new_modelled("scantxoutset", "ScanTxOutSet", "scan_tx_out_set"), Method::new_bool("verifychain", "verify_chain"), Method::new_modelled("verifytxoutproof", "VerifyTxOutProof", "verify_tx_out_proof"), diff --git a/verify/src/method/v25.rs b/verify/src/method/v25.rs index af1fce51..92b0ad9b 100644 --- a/verify/src/method/v25.rs +++ b/verify/src/method/v25.rs @@ -35,7 +35,7 @@ pub const METHODS: &[Method] = &[ Method::new_modelled("gettxspendingprevout", "GetTxSpendingPrevout", "get_tx_spending_prevout"), Method::new_nothing("preciousblock", "precious_block"), Method::new_no_model("pruneblockchain", "PruneBlockchain", "prune_blockchain"), - Method::new_nothing("savemempool", "save_mempool"), + Method::new_no_model("savemempool", "SaveMempool", "save_mempool"), Method::new_modelled("scanblocks", "ScanBlocks", "scan_blocks"), Method::new_modelled("scantxoutset", "ScanTxOutSet", "scan_tx_out_set"), Method::new_bool("verifychain", "verify_chain"), diff --git a/verify/src/method/v26.rs b/verify/src/method/v26.rs index 0a80a580..cfa16150 100644 --- a/verify/src/method/v26.rs +++ b/verify/src/method/v26.rs @@ -39,7 +39,7 @@ pub const METHODS: &[Method] = &[ Method::new_no_model("loadtxoutset", "LoadTxOutSet", "load_tx_out_set"), Method::new_nothing("preciousblock", "precious_block"), Method::new_no_model("pruneblockchain", "PruneBlockchain", "prune_blockchain"), - Method::new_nothing("savemempool", "save_mempool"), + Method::new_no_model("savemempool", "SaveMempool", "save_mempool"), Method::new_modelled("scanblocks", "ScanBlocks", "scan_blocks"), Method::new_modelled("scantxoutset", "ScanTxOutSet", "scan_tx_out_set"), Method::new_bool("verifychain", "verify_chain"), diff --git a/verify/src/method/v27.rs b/verify/src/method/v27.rs index 2d786164..4a0e0baf 100644 --- a/verify/src/method/v27.rs +++ b/verify/src/method/v27.rs @@ -39,7 +39,7 @@ pub const METHODS: &[Method] = &[ Method::new_no_model("loadtxoutset", "LoadTxOutSet", "load_tx_out_set"), Method::new_nothing("preciousblock", "precious_block"), Method::new_no_model("pruneblockchain", "PruneBlockchain", "prune_blockchain"), - Method::new_nothing("savemempool", "save_mempool"), + Method::new_no_model("savemempool", "SaveMempool", "save_mempool"), Method::new_modelled("scanblocks", "ScanBlocks", "scan_blocks"), Method::new_modelled("scantxoutset", "ScanTxOutSet", "scan_tx_out_set"), Method::new_bool("verifychain", "verify_chain"), diff --git a/verify/src/method/v28.rs b/verify/src/method/v28.rs index d65194bb..9b8a3e4d 100644 --- a/verify/src/method/v28.rs +++ b/verify/src/method/v28.rs @@ -39,7 +39,7 @@ pub const METHODS: &[Method] = &[ Method::new_no_model("loadtxoutset", "LoadTxOutSet", "load_tx_out_set"), Method::new_nothing("preciousblock", "precious_block"), Method::new_no_model("pruneblockchain", "PruneBlockchain", "prune_blockchain"), - Method::new_nothing("savemempool", "save_mempool"), + Method::new_no_model("savemempool", "SaveMempool", "save_mempool"), Method::new_modelled("scanblocks", "ScanBlocks", "scan_blocks"), Method::new_modelled("scantxoutset", "ScanTxOutSet", "scan_tx_out_set"), Method::new_bool("verifychain", "verify_chain"),