Skip to content

Commit 2125b02

Browse files
committed
Add simulaterawtransaction method, model and test
Add the struct, client macro, model, reexports and test.
1 parent 3a9e9be commit 2125b02

File tree

18 files changed

+107
-13
lines changed

18 files changed

+107
-13
lines changed

client/src/client_sync/v24/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ crate::impl_client_v17__set_tx_fee!();
186186
crate::impl_client_v19__set_wallet_flag!();
187187
crate::impl_client_v17__sign_message!();
188188
crate::impl_client_v17__sign_raw_transaction_with_wallet!();
189+
crate::impl_client_v24__simulate_raw_transaction!();
189190
crate::impl_client_v21__unload_wallet!();
190191
crate::impl_client_v21__upgrade_wallet!();
191192
crate::impl_client_v17__wallet_create_funded_psbt!();

client/src/client_sync/v24/wallet.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,18 @@ macro_rules! impl_client_v24__send_all {
3232
}
3333
};
3434
}
35+
36+
/// Implements Bitcoin Core JSON-RPC API method `simulaterawtransaction`.
37+
#[macro_export]
38+
macro_rules! impl_client_v24__simulate_raw_transaction {
39+
() => {
40+
impl Client {
41+
pub fn simulate_raw_transaction(
42+
&self,
43+
rawtxs: &[String],
44+
) -> Result<SimulateRawTransaction> {
45+
self.call("simulaterawtransaction", &[into_json(rawtxs)?])
46+
}
47+
}
48+
};
49+
}

client/src/client_sync/v25/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ crate::impl_client_v17__set_tx_fee!();
185185
crate::impl_client_v19__set_wallet_flag!();
186186
crate::impl_client_v17__sign_message!();
187187
crate::impl_client_v17__sign_raw_transaction_with_wallet!();
188+
crate::impl_client_v24__simulate_raw_transaction!();
188189
crate::impl_client_v21__unload_wallet!();
189190
crate::impl_client_v21__upgrade_wallet!();
190191
crate::impl_client_v17__wallet_create_funded_psbt!();

client/src/client_sync/v26/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ crate::impl_client_v17__set_tx_fee!();
189189
crate::impl_client_v19__set_wallet_flag!();
190190
crate::impl_client_v17__sign_message!();
191191
crate::impl_client_v17__sign_raw_transaction_with_wallet!();
192+
crate::impl_client_v24__simulate_raw_transaction!();
192193
crate::impl_client_v21__unload_wallet!();
193194
crate::impl_client_v21__upgrade_wallet!();
194195
crate::impl_client_v17__wallet_create_funded_psbt!();

client/src/client_sync/v27/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ crate::impl_client_v17__set_tx_fee!();
185185
crate::impl_client_v19__set_wallet_flag!();
186186
crate::impl_client_v17__sign_message!();
187187
crate::impl_client_v17__sign_raw_transaction_with_wallet!();
188+
crate::impl_client_v24__simulate_raw_transaction!();
188189
crate::impl_client_v21__unload_wallet!();
189190
crate::impl_client_v21__upgrade_wallet!();
190191
crate::impl_client_v17__wallet_create_funded_psbt!();

client/src/client_sync/v28/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ crate::impl_client_v17__set_tx_fee!();
187187
crate::impl_client_v19__set_wallet_flag!();
188188
crate::impl_client_v17__sign_message!();
189189
crate::impl_client_v17__sign_raw_transaction_with_wallet!();
190+
crate::impl_client_v24__simulate_raw_transaction!();
190191
crate::impl_client_v21__unload_wallet!();
191192
crate::impl_client_v21__upgrade_wallet!();
192193
crate::impl_client_v17__wallet_create_funded_psbt!();

client/src/client_sync/v29/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ crate::impl_client_v17__set_tx_fee!();
187187
crate::impl_client_v19__set_wallet_flag!();
188188
crate::impl_client_v17__sign_message!();
189189
crate::impl_client_v17__sign_raw_transaction_with_wallet!();
190+
crate::impl_client_v24__simulate_raw_transaction!();
190191
crate::impl_client_v21__unload_wallet!();
191192
crate::impl_client_v21__upgrade_wallet!();
192193
crate::impl_client_v17__wallet_create_funded_psbt!();

integration_test/tests/wallet.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,45 @@ fn wallet__sign_message__modelled() {
737737
let _ = res.expect("SignMessage into model");
738738
}
739739

740+
#[cfg(not(feature = "v23_and_below"))]
741+
#[test]
742+
fn wallet__simulate_raw_transaction() {
743+
let node = Node::with_wallet(Wallet::Default, &[]);
744+
node.fund_wallet();
745+
746+
let address = node.client.new_address().expect("failed to create new address");
747+
let amount = Amount::from_sat(10_000);
748+
749+
let txid1 = node
750+
.client
751+
.send_to_address(&address, amount)
752+
.expect("sendtoaddress")
753+
.txid()
754+
.unwrap();
755+
let raw_tx1 = node.client.get_raw_transaction(txid1).expect("getrawtransaction");
756+
757+
let txid2 = node
758+
.client
759+
.send_to_address(&address, amount)
760+
.expect("sendtoaddress")
761+
.txid()
762+
.unwrap();
763+
let raw_tx2 = node.client.get_raw_transaction(txid2).expect("getrawtransaction");
764+
765+
// Simulate raw transaction with the 2 transactions
766+
let rawtxs = vec![raw_tx1.0, raw_tx2.0];
767+
let json: SimulateRawTransaction = node
768+
.client
769+
.simulate_raw_transaction(&rawtxs)
770+
.expect("simulaterawtransaction");
771+
772+
let model: Result<mtype::SimulateRawTransaction, _> = json.into_model();
773+
let model = model.unwrap();
774+
775+
// Should show a negative balance change since we're sending money
776+
assert!(model.balance_change.is_negative());
777+
}
778+
740779
#[test]
741780
fn wallet__wallet_lock() {
742781
let node = Node::with_wallet(Wallet::Default, &[]);

types/src/model/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,6 @@ pub use self::{
6363
ListTransactions, ListTransactionsItem, ListUnspent, ListUnspentItem, ListWallets,
6464
LoadWallet, PsbtBumpFee, RescanBlockchain, ScriptType, Send, SendAll, SendMany, SendToAddress,
6565
SignMessage, TransactionCategory, UnloadWallet, WalletCreateFundedPsbt,
66-
WalletDisplayAddress, WalletProcessPsbt,
66+
WalletDisplayAddress, WalletProcessPsbt, SimulateRawTransaction
6767
},
6868
};

types/src/model/wallet.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -782,6 +782,15 @@ pub struct SendToAddress {
782782
#[derive(Clone, Debug, PartialEq, Eq)]
783783
pub struct SignMessage(pub sign_message::MessageSignature);
784784

785+
/// Models the result of JSON-RPC method `simulaterawtransaction`.
786+
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
787+
#[serde(deny_unknown_fields)]
788+
pub struct SimulateRawTransaction {
789+
/// The wallet balance change (negative means decrease).
790+
#[serde(default, with = "bitcoin::amount::serde::as_btc")]
791+
pub balance_change: SignedAmount,
792+
}
793+
785794
/// Models the result of JSON-RPC method `unloadwallet`.
786795
///
787796
/// Core version v0.21 onwards.

0 commit comments

Comments
 (0)