diff --git a/client/src/client_sync/v17/mod.rs b/client/src/client_sync/v17/mod.rs index 05625e01..196a9030 100644 --- a/client/src/client_sync/v17/mod.rs +++ b/client/src/client_sync/v17/mod.rs @@ -76,6 +76,7 @@ crate::impl_client_v17__getaddednodeinfo!(); crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); crate::impl_client_v17__getpeerinfo!(); +crate::impl_client_v17__setban!(); // == Rawtransactions == crate::impl_client_v17__combinepsbt!(); @@ -224,3 +225,11 @@ pub enum AddNodeCommand { Remove, OneTry, } + +/// Args for the `setban` method +#[derive(Clone, Copy, Debug, Deserialize, Serialize)] +#[serde(rename_all = "lowercase")] +pub enum SetBanCommand { + Add, + Remove, +} diff --git a/client/src/client_sync/v17/network.rs b/client/src/client_sync/v17/network.rs index 31de06ad..c072da40 100644 --- a/client/src/client_sync/v17/network.rs +++ b/client/src/client_sync/v17/network.rs @@ -74,3 +74,19 @@ macro_rules! impl_client_v17__getpeerinfo { } }; } + +/// Implements Bitcoin Core JSON-RPC API method `setban` +#[macro_export] +macro_rules! impl_client_v17__setban { + () => { + impl Client { + pub fn set_ban(&self, subnet: &str, command: SetBanCommand) -> Result<()> { + match self.call("setban", &[into_json(subnet)?, into_json(command)?]) { + Ok(serde_json::Value::Null) => Ok(()), + Ok(res) => Err(Error::Returned(res.to_string())), + Err(err) => Err(err.into()), + } + } + } + }; +} diff --git a/client/src/client_sync/v18/mod.rs b/client/src/client_sync/v18/mod.rs index 0c1da0fe..36543c3c 100644 --- a/client/src/client_sync/v18/mod.rs +++ b/client/src/client_sync/v18/mod.rs @@ -20,8 +20,8 @@ use crate::types::v18::*; #[rustfmt::skip] // Keep public re-exports separate. pub use crate::client_sync::{ v17::{ - AddNodeCommand, AddressType, Input, Output, TemplateRequest, TemplateRules, - WalletCreateFundedPsbtInput + AddNodeCommand, AddressType, Input, Output, SetBanCommand, TemplateRequest, + TemplateRules, WalletCreateFundedPsbtInput }, }; @@ -81,6 +81,7 @@ crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); crate::impl_client_v18__getnodeaddresses!(); crate::impl_client_v17__getpeerinfo!(); +crate::impl_client_v17__setban!(); // == Rawtransactions == crate::impl_client_v18__analyzepsbt!(); diff --git a/client/src/client_sync/v19/mod.rs b/client/src/client_sync/v19/mod.rs index e6dcc57f..1fa6ed2e 100644 --- a/client/src/client_sync/v19/mod.rs +++ b/client/src/client_sync/v19/mod.rs @@ -19,8 +19,8 @@ use crate::types::v19::*; #[rustfmt::skip] // Keep public re-exports separate. pub use crate::client_sync::{ v17::{ - AddNodeCommand, AddressType, Input, Output, TemplateRequest, TemplateRules, - WalletCreateFundedPsbtInput + AddNodeCommand, AddressType, Input, Output, SetBanCommand, TemplateRequest, + TemplateRules, WalletCreateFundedPsbtInput }, }; @@ -79,6 +79,7 @@ crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); crate::impl_client_v18__getnodeaddresses!(); crate::impl_client_v17__getpeerinfo!(); +crate::impl_client_v17__setban!(); // == Rawtransactions == crate::impl_client_v18__analyzepsbt!(); diff --git a/client/src/client_sync/v20.rs b/client/src/client_sync/v20.rs index d472e531..6007af54 100644 --- a/client/src/client_sync/v20.rs +++ b/client/src/client_sync/v20.rs @@ -15,7 +15,10 @@ use crate::types::v20::*; #[rustfmt::skip] // Keep public re-exports separate. pub use crate::client_sync::{ - v17::{AddressType, AddNodeCommand, Input, Output, TemplateRequest, TemplateRules, WalletCreateFundedPsbtInput}, + v17::{ + AddressType, AddNodeCommand, Input, Output, SetBanCommand, TemplateRequest, TemplateRules, + WalletCreateFundedPsbtInput + }, }; crate::define_jsonrpc_minreq_client!("v20"); @@ -73,6 +76,7 @@ crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); crate::impl_client_v18__getnodeaddresses!(); crate::impl_client_v17__getpeerinfo!(); +crate::impl_client_v17__setban!(); // == Rawtransactions == crate::impl_client_v18__analyzepsbt!(); diff --git a/client/src/client_sync/v21/mod.rs b/client/src/client_sync/v21/mod.rs index 2fd7e8a1..87d72a92 100644 --- a/client/src/client_sync/v21/mod.rs +++ b/client/src/client_sync/v21/mod.rs @@ -18,8 +18,8 @@ use crate::types::v21::*; #[rustfmt::skip] // Keep public re-exports separate. pub use crate::client_sync::{ v17::{ - AddNodeCommand, AddressType, Input, Output, TemplateRequest, TemplateRules, - WalletCreateFundedPsbtInput + AddNodeCommand, AddressType, Input, Output, SetBanCommand, TemplateRequest, + TemplateRules, WalletCreateFundedPsbtInput }, }; @@ -78,6 +78,7 @@ crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); crate::impl_client_v18__getnodeaddresses!(); crate::impl_client_v17__getpeerinfo!(); +crate::impl_client_v17__setban!(); // == Rawtransactions == crate::impl_client_v18__analyzepsbt!(); diff --git a/client/src/client_sync/v22/mod.rs b/client/src/client_sync/v22/mod.rs index 306f4911..281ff903 100644 --- a/client/src/client_sync/v22/mod.rs +++ b/client/src/client_sync/v22/mod.rs @@ -18,8 +18,8 @@ use crate::types::v22::*; #[rustfmt::skip] // Keep public re-exports separate. pub use crate::client_sync::{ v17::{ - AddNodeCommand, AddressType, Input, Output, TemplateRequest, TemplateRules, - WalletCreateFundedPsbtInput + AddNodeCommand, AddressType, Input, Output, SetBanCommand, TemplateRequest, + TemplateRules, WalletCreateFundedPsbtInput }, }; @@ -78,6 +78,7 @@ crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); crate::impl_client_v18__getnodeaddresses!(); crate::impl_client_v17__getpeerinfo!(); +crate::impl_client_v17__setban!(); // == Rawtransactions == crate::impl_client_v18__analyzepsbt!(); diff --git a/client/src/client_sync/v23/mod.rs b/client/src/client_sync/v23/mod.rs index e06da8a5..dc1ca56a 100644 --- a/client/src/client_sync/v23/mod.rs +++ b/client/src/client_sync/v23/mod.rs @@ -19,7 +19,10 @@ use crate::types::v23::*; #[rustfmt::skip] // Keep public re-exports separate. pub use crate::client_sync::{ - v17::{AddNodeCommand, Input, Output, TemplateRequest, TemplateRules, WalletCreateFundedPsbtInput}, + v17::{ + AddNodeCommand, Input, Output, SetBanCommand, TemplateRequest, TemplateRules, + WalletCreateFundedPsbtInput + }, }; crate::define_jsonrpc_minreq_client!("v23"); @@ -77,6 +80,7 @@ crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); crate::impl_client_v18__getnodeaddresses!(); crate::impl_client_v17__getpeerinfo!(); +crate::impl_client_v17__setban!(); // == Rawtransactions == crate::impl_client_v18__analyzepsbt!(); diff --git a/client/src/client_sync/v24.rs b/client/src/client_sync/v24.rs index 91458b5e..3827e125 100644 --- a/client/src/client_sync/v24.rs +++ b/client/src/client_sync/v24.rs @@ -15,7 +15,10 @@ use crate::types::v24::*; #[rustfmt::skip] // Keep public re-exports separate. pub use crate::client_sync::{ - v17::{AddNodeCommand, Input, Output, TemplateRequest, TemplateRules, WalletCreateFundedPsbtInput}, + v17::{ + AddNodeCommand, Input, Output, SetBanCommand, TemplateRequest, TemplateRules, + WalletCreateFundedPsbtInput + }, v23::AddressType, }; @@ -74,6 +77,7 @@ crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); crate::impl_client_v18__getnodeaddresses!(); crate::impl_client_v17__getpeerinfo!(); +crate::impl_client_v17__setban!(); // == Rawtransactions == crate::impl_client_v18__analyzepsbt!(); diff --git a/client/src/client_sync/v25.rs b/client/src/client_sync/v25.rs index 02f72b9d..879ac405 100644 --- a/client/src/client_sync/v25.rs +++ b/client/src/client_sync/v25.rs @@ -15,7 +15,10 @@ use crate::types::v25::*; #[rustfmt::skip] // Keep public re-exports separate. pub use crate::client_sync::{ - v17::{AddNodeCommand, Input, Output, TemplateRequest, TemplateRules, WalletCreateFundedPsbtInput}, + v17::{ + AddNodeCommand, Input, Output, SetBanCommand, TemplateRequest, TemplateRules, + WalletCreateFundedPsbtInput + }, v23::AddressType, }; @@ -74,6 +77,7 @@ crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); crate::impl_client_v18__getnodeaddresses!(); crate::impl_client_v17__getpeerinfo!(); +crate::impl_client_v17__setban!(); // == Rawtransactions == crate::impl_client_v18__analyzepsbt!(); diff --git a/client/src/client_sync/v26/mod.rs b/client/src/client_sync/v26/mod.rs index 51e258a2..bb6d66e3 100644 --- a/client/src/client_sync/v26/mod.rs +++ b/client/src/client_sync/v26/mod.rs @@ -19,7 +19,10 @@ use crate::types::v26::*; #[rustfmt::skip] // Keep public re-exports separate. pub use crate::client_sync::{ - v17::{AddNodeCommand, Input, Output, TemplateRequest, TemplateRules, WalletCreateFundedPsbtInput}, + v17::{ + AddNodeCommand, Input, Output, SetBanCommand, TemplateRequest, TemplateRules, + WalletCreateFundedPsbtInput + }, v23::AddressType, }; @@ -79,6 +82,7 @@ crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); crate::impl_client_v18__getnodeaddresses!(); crate::impl_client_v17__getpeerinfo!(); +crate::impl_client_v17__setban!(); // == Rawtransactions == crate::impl_client_v18__analyzepsbt!(); diff --git a/client/src/client_sync/v27.rs b/client/src/client_sync/v27.rs index 9e9c3a61..8c810564 100644 --- a/client/src/client_sync/v27.rs +++ b/client/src/client_sync/v27.rs @@ -15,7 +15,10 @@ use crate::types::v27::*; #[rustfmt::skip] // Keep public re-exports separate. pub use crate::client_sync::{ - v17::{AddNodeCommand, Input, Output, TemplateRequest, TemplateRules, WalletCreateFundedPsbtInput}, + v17::{ + AddNodeCommand, Input, Output, SetBanCommand, TemplateRequest, TemplateRules, + WalletCreateFundedPsbtInput + }, v23::AddressType, }; @@ -75,6 +78,7 @@ crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); crate::impl_client_v18__getnodeaddresses!(); crate::impl_client_v17__getpeerinfo!(); +crate::impl_client_v17__setban!(); // == Rawtransactions == crate::impl_client_v18__analyzepsbt!(); diff --git a/client/src/client_sync/v28/mod.rs b/client/src/client_sync/v28/mod.rs index 4d45df60..8d74e402 100644 --- a/client/src/client_sync/v28/mod.rs +++ b/client/src/client_sync/v28/mod.rs @@ -17,7 +17,10 @@ use crate::types::v28::*; #[rustfmt::skip] // Keep public re-exports separate. pub use crate::client_sync::{ - v17::{AddNodeCommand, Input, Output, TemplateRequest, TemplateRules, WalletCreateFundedPsbtInput}, + v17::{ + AddNodeCommand, Input, Output, SetBanCommand, TemplateRequest, TemplateRules, + WalletCreateFundedPsbtInput + }, v23::AddressType, }; @@ -77,6 +80,7 @@ crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); crate::impl_client_v18__getnodeaddresses!(); crate::impl_client_v17__getpeerinfo!(); +crate::impl_client_v17__setban!(); // == Rawtransactions == crate::impl_client_v18__analyzepsbt!(); diff --git a/client/src/client_sync/v29/mod.rs b/client/src/client_sync/v29/mod.rs index 7698914b..aa88de07 100644 --- a/client/src/client_sync/v29/mod.rs +++ b/client/src/client_sync/v29/mod.rs @@ -19,7 +19,7 @@ use crate::types::v29::*; #[rustfmt::skip] // Keep public re-exports separate. pub use crate::client_sync::{ - v17::{AddNodeCommand, Input, Output, WalletCreateFundedPsbtInput}, + v17::{AddNodeCommand, Input, Output, SetBanCommand, WalletCreateFundedPsbtInput}, v23::AddressType, }; @@ -80,6 +80,7 @@ crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); crate::impl_client_v18__getnodeaddresses!(); crate::impl_client_v17__getpeerinfo!(); +crate::impl_client_v17__setban!(); // == Rawtransactions == crate::impl_client_v18__analyzepsbt!(); diff --git a/integration_test/tests/network.rs b/integration_test/tests/network.rs index 06f550c3..2fbcddcb 100644 --- a/integration_test/tests/network.rs +++ b/integration_test/tests/network.rs @@ -6,7 +6,7 @@ use integration_test::{Node, NodeExt as _, Wallet}; use node::vtype::*; // All the version specific types. -use node::{AddNodeCommand, mtype}; +use node::{AddNodeCommand, mtype, SetBanCommand}; #[test] fn network__add_node() { @@ -102,3 +102,12 @@ fn get_peer_info_three_node_network() { assert!(node2.peers_connected() >= 1); assert!(node3.peers_connected() >= 1); } + +#[test] +fn network__set_ban() { + let node = Node::with_wallet(Wallet::None, &[]); + let dummy_subnet = "192.0.2.3"; + + node.client.set_ban(dummy_subnet, SetBanCommand::Add).expect("setban add"); + node.client.set_ban(dummy_subnet, SetBanCommand::Remove).expect("setban remove"); +}