diff --git a/client/src/client_sync/v17/mod.rs b/client/src/client_sync/v17/mod.rs index f0383b68..7bebbfac 100644 --- a/client/src/client_sync/v17/mod.rs +++ b/client/src/client_sync/v17/mod.rs @@ -108,6 +108,7 @@ crate::impl_client_v17__validate_address!(); crate::impl_client_v17__verify_message!(); // == Wallet == +crate::impl_client_v17__abandon_transaction!(); crate::impl_client_v17__add_multisig_address!(); crate::impl_client_v17__bump_fee!(); crate::impl_client_v17__create_wallet!(); diff --git a/client/src/client_sync/v17/wallet.rs b/client/src/client_sync/v17/wallet.rs index 8c20e300..45e54314 100644 --- a/client/src/client_sync/v17/wallet.rs +++ b/client/src/client_sync/v17/wallet.rs @@ -9,6 +9,22 @@ //! //! See or use the `define_jsonrpc_minreq_client!` macro to define a `Client`. +/// Implements Bitcoin Core JSON-RPC API method `abandontransaction`. +#[macro_export] +macro_rules! impl_client_v17__abandon_transaction { + () => { + impl Client { + pub fn abandon_transaction(&self, txid: Txid) -> Result<()> { + match self.call("abandontransaction", &[into_json(txid)?]) { + 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 `addmultisigaddress`. #[macro_export] macro_rules! impl_client_v17__add_multisig_address { diff --git a/client/src/client_sync/v18/mod.rs b/client/src/client_sync/v18/mod.rs index d699c280..f2883039 100644 --- a/client/src/client_sync/v18/mod.rs +++ b/client/src/client_sync/v18/mod.rs @@ -116,6 +116,7 @@ crate::impl_client_v17__validate_address!(); crate::impl_client_v17__verify_message!(); // == Wallet == +crate::impl_client_v17__abandon_transaction!(); crate::impl_client_v17__add_multisig_address!(); crate::impl_client_v17__bump_fee!(); crate::impl_client_v17__create_wallet!(); diff --git a/client/src/client_sync/v19/mod.rs b/client/src/client_sync/v19/mod.rs index 99461064..c495b361 100644 --- a/client/src/client_sync/v19/mod.rs +++ b/client/src/client_sync/v19/mod.rs @@ -114,6 +114,7 @@ crate::impl_client_v17__validate_address!(); crate::impl_client_v17__verify_message!(); // == Wallet == +crate::impl_client_v17__abandon_transaction!(); crate::impl_client_v17__add_multisig_address!(); crate::impl_client_v17__bump_fee!(); crate::impl_client_v17__create_wallet!(); diff --git a/client/src/client_sync/v20/mod.rs b/client/src/client_sync/v20/mod.rs index c6df7c5d..2b478225 100644 --- a/client/src/client_sync/v20/mod.rs +++ b/client/src/client_sync/v20/mod.rs @@ -111,6 +111,7 @@ crate::impl_client_v17__validate_address!(); crate::impl_client_v17__verify_message!(); // == Wallet == +crate::impl_client_v17__abandon_transaction!(); crate::impl_client_v17__add_multisig_address!(); crate::impl_client_v17__bump_fee!(); crate::impl_client_v17__create_wallet!(); diff --git a/client/src/client_sync/v21/mod.rs b/client/src/client_sync/v21/mod.rs index 88daa26a..cadc0199 100644 --- a/client/src/client_sync/v21/mod.rs +++ b/client/src/client_sync/v21/mod.rs @@ -113,6 +113,7 @@ crate::impl_client_v17__validate_address!(); crate::impl_client_v17__verify_message!(); // == Wallet == +crate::impl_client_v17__abandon_transaction!(); crate::impl_client_v17__add_multisig_address!(); crate::impl_client_v17__bump_fee!(); crate::impl_client_v17__create_wallet!(); diff --git a/client/src/client_sync/v22/mod.rs b/client/src/client_sync/v22/mod.rs index 9c5fe406..3dc6a2d8 100644 --- a/client/src/client_sync/v22/mod.rs +++ b/client/src/client_sync/v22/mod.rs @@ -113,6 +113,7 @@ crate::impl_client_v17__validate_address!(); crate::impl_client_v17__verify_message!(); // == Wallet == +crate::impl_client_v17__abandon_transaction!(); crate::impl_client_v17__add_multisig_address!(); crate::impl_client_v17__bump_fee!(); crate::impl_client_v17__create_wallet!(); diff --git a/client/src/client_sync/v23/mod.rs b/client/src/client_sync/v23/mod.rs index 7d4d619e..8aa6fe24 100644 --- a/client/src/client_sync/v23/mod.rs +++ b/client/src/client_sync/v23/mod.rs @@ -115,6 +115,7 @@ crate::impl_client_v17__validate_address!(); crate::impl_client_v17__verify_message!(); // == Wallet == +crate::impl_client_v17__abandon_transaction!(); crate::impl_client_v17__add_multisig_address!(); crate::impl_client_v17__bump_fee!(); crate::impl_client_v23__create_wallet!(); diff --git a/client/src/client_sync/v24/mod.rs b/client/src/client_sync/v24/mod.rs index 031ee231..202d2523 100644 --- a/client/src/client_sync/v24/mod.rs +++ b/client/src/client_sync/v24/mod.rs @@ -112,6 +112,7 @@ crate::impl_client_v17__validate_address!(); crate::impl_client_v17__verify_message!(); // == Wallet == +crate::impl_client_v17__abandon_transaction!(); crate::impl_client_v17__add_multisig_address!(); crate::impl_client_v17__bump_fee!(); crate::impl_client_v23__create_wallet!(); diff --git a/client/src/client_sync/v25/mod.rs b/client/src/client_sync/v25/mod.rs index d6dc99e1..4cea55f6 100644 --- a/client/src/client_sync/v25/mod.rs +++ b/client/src/client_sync/v25/mod.rs @@ -112,6 +112,7 @@ crate::impl_client_v17__validate_address!(); crate::impl_client_v17__verify_message!(); // == Wallet == +crate::impl_client_v17__abandon_transaction!(); crate::impl_client_v17__add_multisig_address!(); crate::impl_client_v17__bump_fee!(); crate::impl_client_v23__create_wallet!(); diff --git a/client/src/client_sync/v26/mod.rs b/client/src/client_sync/v26/mod.rs index 1e50d10e..1eafad39 100644 --- a/client/src/client_sync/v26/mod.rs +++ b/client/src/client_sync/v26/mod.rs @@ -118,6 +118,7 @@ crate::impl_client_v17__validate_address!(); crate::impl_client_v17__verify_message!(); // == Wallet == +crate::impl_client_v17__abandon_transaction!(); crate::impl_client_v17__add_multisig_address!(); crate::impl_client_v17__bump_fee!(); crate::impl_client_v23__create_wallet!(); diff --git a/client/src/client_sync/v27/mod.rs b/client/src/client_sync/v27/mod.rs index d0b4b37e..1cba687c 100644 --- a/client/src/client_sync/v27/mod.rs +++ b/client/src/client_sync/v27/mod.rs @@ -114,6 +114,7 @@ crate::impl_client_v17__validate_address!(); crate::impl_client_v17__verify_message!(); // == Wallet == +crate::impl_client_v17__abandon_transaction!(); crate::impl_client_v17__add_multisig_address!(); crate::impl_client_v17__bump_fee!(); crate::impl_client_v23__create_wallet!(); diff --git a/client/src/client_sync/v28/mod.rs b/client/src/client_sync/v28/mod.rs index 275b8614..c5b89dd1 100644 --- a/client/src/client_sync/v28/mod.rs +++ b/client/src/client_sync/v28/mod.rs @@ -116,6 +116,7 @@ crate::impl_client_v17__validate_address!(); crate::impl_client_v17__verify_message!(); // == Wallet == +crate::impl_client_v17__abandon_transaction!(); crate::impl_client_v17__add_multisig_address!(); crate::impl_client_v17__bump_fee!(); crate::impl_client_v23__create_wallet!(); diff --git a/client/src/client_sync/v29/mod.rs b/client/src/client_sync/v29/mod.rs index 9c32a8ca..6e645c07 100644 --- a/client/src/client_sync/v29/mod.rs +++ b/client/src/client_sync/v29/mod.rs @@ -116,6 +116,7 @@ crate::impl_client_v17__validate_address!(); crate::impl_client_v17__verify_message!(); // == Wallet == +crate::impl_client_v17__abandon_transaction!(); crate::impl_client_v17__add_multisig_address!(); crate::impl_client_v17__bump_fee!(); crate::impl_client_v23__create_wallet!(); diff --git a/integration_test/tests/wallet.rs b/integration_test/tests/wallet.rs index 10066c0f..64880451 100644 --- a/integration_test/tests/wallet.rs +++ b/integration_test/tests/wallet.rs @@ -11,6 +11,31 @@ use integration_test::{Node, NodeExt as _, Wallet}; use node::{mtype,AddressType}; use node::vtype::*; // All the version specific types. +#[test] +fn wallet__abandon_transaction() { + let node = Node::with_wallet(Wallet::Default, &[]); + + let mining_addr = node.client.new_address().expect("newaddress"); + let json = node.client.generate_to_address(101, &mining_addr).expect("generatetoaddress"); + let block_hashes = json.into_model(); + + let block_hash = block_hashes.expect("blockhash").0[0]; + + let dest_addr = node.client.new_address().expect("newaddress"); + let amount = bitcoin::Amount::from_sat(1_000_000); + + let txid = node + .client + .send_to_address_rbf(&dest_addr, amount) + .expect("sendtoaddressrbf") + .txid() + .expect("txid"); + + node.client.invalidate_block(block_hash).expect("invalidateblock"); + + node.client.abandon_transaction(txid).expect("abandontransaction"); +} + #[test] #[cfg(feature = "TODO")] fn wallet__add_multisig_address__modelled() {