From 257d190d071dc536a05a39937517c482e51c3c19 Mon Sep 17 00:00:00 2001 From: onchainguy-btc <1436535+onchainguy-btc@users.noreply.github.com> Date: Sun, 20 Oct 2024 22:35:29 +0200 Subject: [PATCH 1/6] Raw tx options --- client/src/client.rs | 18 +++++++++++++ integration_test/src/main.rs | 52 ++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/client/src/client.rs b/client/src/client.rs index 2f809a79..3cf9eaf4 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -1080,6 +1080,24 @@ pub trait RpcApi: Sized { self.call("sendrawtransaction", &[tx.raw_hex().into()]) } + fn send_raw_transaction_with_options(&self, tx: R, maxfeerate: Option, maxburnamount: Option) -> Result { + let mut params = serde_json::json!({ + "hexstring": tx.raw_hex() + }); + + // Add maxfeerate if it's provided + if let Some(fee_rate) = maxfeerate { + params["maxfeerate"] = serde_json::json!(fee_rate); + } + + // Add maxburnamount if it's provided + if let Some(burn_amount) = maxburnamount { + params["maxburnamount"] = serde_json::json!(burn_amount); + } + + self.call("sendrawtransaction", &[params.into()]) + } + fn estimate_smart_fee( &self, conf_target: u16, diff --git a/integration_test/src/main.rs b/integration_test/src/main.rs index c3236bb9..11d6ad23 100644 --- a/integration_test/src/main.rs +++ b/integration_test/src/main.rs @@ -176,6 +176,7 @@ fn main() { test_lock_unspent_unlock_unspent(&cl); test_get_block_filter(&cl); test_sign_raw_transaction_with_send_raw_transaction(&cl); + test_send_raw_transaction_with_options(&cl); test_invalidate_block_reconsider_block(&cl); test_key_pool_refill(&cl); test_create_raw_transaction(&cl); @@ -640,6 +641,57 @@ fn test_sign_raw_transaction_with_send_raw_transaction(cl: &Client) { let _ = cl.send_raw_transaction(&res.transaction().unwrap()).unwrap(); } +fn test_send_raw_transaction_with_options(cl: &Client) { + let sk = PrivateKey { + network: Network::Regtest.into(), + inner: secp256k1::SecretKey::new(&mut secp256k1::rand::thread_rng()), + compressed: true, + }; + let pk = CompressedPublicKey::from_private_key(&SECP, &sk).unwrap(); + let addr = Address::p2wpkh(&pk, Network::Regtest); + + let options = json::ListUnspentQueryOptions { + minimum_amount: Some(btc(2)), + ..Default::default() + }; + let unspent = cl.list_unspent(Some(6), None, None, None, Some(options)).unwrap(); + let unspent = unspent.into_iter().nth(0).unwrap(); + + let tx = Transaction { + version: transaction::Version::ONE, + lock_time: LockTime::ZERO, + input: vec![TxIn { + previous_output: OutPoint { + txid: unspent.txid, + vout: unspent.vout, + }, + sequence: Sequence::MAX, + script_sig: ScriptBuf::new(), + witness: Witness::new(), + }], + output: vec![TxOut { + value: (unspent.amount - *FEE), + script_pubkey: addr.script_pubkey(), + }], + }; + + let signed_tx = cl.sign_raw_transaction_with_wallet(&tx, None, None) + .unwrap() + .transaction() + .unwrap(); + + let tx_hex = serialize_hex(&signed_tx); + + let maxfeerate = Some(0.01); + let maxburnamount = Some(0.0); + + let txid = cl.send_raw_transaction_with_options(tx_hex, maxfeerate, maxburnamount).unwrap(); + + assert!(!txid.to_string().is_empty(), "Transaction ID should not be empty"); + + println!("Transaction sent successfully with txid: {}", txid); +} + fn test_invalidate_block_reconsider_block(cl: &Client) { let hash = cl.get_best_block_hash().unwrap(); cl.invalidate_block(&hash).unwrap(); From 18fc0e3b44b32b4285f507aa30a04ff338e2ada5 Mon Sep 17 00:00:00 2001 From: onchainguy-btc <1436535+onchainguy-btc@users.noreply.github.com> Date: Sun, 20 Oct 2024 23:23:46 +0200 Subject: [PATCH 2/6] Cleanup --- client/src/client.rs | 4 +--- integration_test/src/main.rs | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/client/src/client.rs b/client/src/client.rs index 3cf9eaf4..0f9fae4c 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -1080,17 +1080,15 @@ pub trait RpcApi: Sized { self.call("sendrawtransaction", &[tx.raw_hex().into()]) } - fn send_raw_transaction_with_options(&self, tx: R, maxfeerate: Option, maxburnamount: Option) -> Result { + fn send_raw_transaction_advanced(&self, tx: R, maxfeerate: Option, maxburnamount: Option) -> Result { let mut params = serde_json::json!({ "hexstring": tx.raw_hex() }); - // Add maxfeerate if it's provided if let Some(fee_rate) = maxfeerate { params["maxfeerate"] = serde_json::json!(fee_rate); } - // Add maxburnamount if it's provided if let Some(burn_amount) = maxburnamount { params["maxburnamount"] = serde_json::json!(burn_amount); } diff --git a/integration_test/src/main.rs b/integration_test/src/main.rs index 11d6ad23..c2e839bf 100644 --- a/integration_test/src/main.rs +++ b/integration_test/src/main.rs @@ -683,7 +683,7 @@ fn test_send_raw_transaction_with_options(cl: &Client) { let tx_hex = serialize_hex(&signed_tx); let maxfeerate = Some(0.01); - let maxburnamount = Some(0.0); + let maxburnamount = Some(0.02); let txid = cl.send_raw_transaction_with_options(tx_hex, maxfeerate, maxburnamount).unwrap(); From 3e724484cef36c4ba082dd0a08a016b2ed5e244c Mon Sep 17 00:00:00 2001 From: onchainguy-btc <1436535+onchainguy-btc@users.noreply.github.com> Date: Sun, 20 Oct 2024 23:51:46 +0200 Subject: [PATCH 3/6] Debugging --- client/src/client.rs | 17 ++++++++++------- integration_test/src/main.rs | 6 +++--- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/client/src/client.rs b/client/src/client.rs index 0f9fae4c..dea86c3a 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -1080,20 +1080,23 @@ pub trait RpcApi: Sized { self.call("sendrawtransaction", &[tx.raw_hex().into()]) } - fn send_raw_transaction_advanced(&self, tx: R, maxfeerate: Option, maxburnamount: Option) -> Result { - let mut params = serde_json::json!({ - "hexstring": tx.raw_hex() - }); + fn send_raw_transaction_advanced( + &self, + tx: R, + maxfeerate: Option, + maxburnamount: Option, + ) -> Result { + let mut params = vec![serde_json::json!(tx.raw_hex())]; if let Some(fee_rate) = maxfeerate { - params["maxfeerate"] = serde_json::json!(fee_rate); + params.push(serde_json::json!(fee_rate)); } if let Some(burn_amount) = maxburnamount { - params["maxburnamount"] = serde_json::json!(burn_amount); + params.push(serde_json::json!(burn_amount)); } - self.call("sendrawtransaction", &[params.into()]) + self.call("sendrawtransaction", ¶ms) } fn estimate_smart_fee( diff --git a/integration_test/src/main.rs b/integration_test/src/main.rs index c2e839bf..939e332c 100644 --- a/integration_test/src/main.rs +++ b/integration_test/src/main.rs @@ -176,7 +176,7 @@ fn main() { test_lock_unspent_unlock_unspent(&cl); test_get_block_filter(&cl); test_sign_raw_transaction_with_send_raw_transaction(&cl); - test_send_raw_transaction_with_options(&cl); + test_send_raw_transaction_advanced(&cl); test_invalidate_block_reconsider_block(&cl); test_key_pool_refill(&cl); test_create_raw_transaction(&cl); @@ -641,7 +641,7 @@ fn test_sign_raw_transaction_with_send_raw_transaction(cl: &Client) { let _ = cl.send_raw_transaction(&res.transaction().unwrap()).unwrap(); } -fn test_send_raw_transaction_with_options(cl: &Client) { +fn test_send_raw_transaction_advanced(cl: &Client) { let sk = PrivateKey { network: Network::Regtest.into(), inner: secp256k1::SecretKey::new(&mut secp256k1::rand::thread_rng()), @@ -685,7 +685,7 @@ fn test_send_raw_transaction_with_options(cl: &Client) { let maxfeerate = Some(0.01); let maxburnamount = Some(0.02); - let txid = cl.send_raw_transaction_with_options(tx_hex, maxfeerate, maxburnamount).unwrap(); + let txid = cl.send_raw_transaction_advanced(tx_hex, maxfeerate, maxburnamount).unwrap(); assert!(!txid.to_string().is_empty(), "Transaction ID should not be empty"); From 3a3088023847869462e1282e29436aa3d1f17c9a Mon Sep 17 00:00:00 2001 From: onchainguy-btc <1436535+onchainguy-btc@users.noreply.github.com> Date: Mon, 21 Oct 2024 00:19:08 +0200 Subject: [PATCH 4/6] Debugging --- client/src/client.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/client/src/client.rs b/client/src/client.rs index dea86c3a..6efd7147 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -1086,17 +1086,19 @@ pub trait RpcApi: Sized { maxfeerate: Option, maxburnamount: Option, ) -> Result { - let mut params = vec![serde_json::json!(tx.raw_hex())]; + let mut params = serde_json::json!({ + "hexstring": tx.raw_hex() + }); if let Some(fee_rate) = maxfeerate { - params.push(serde_json::json!(fee_rate)); + params["maxfeerate"] = serde_json::json!(fee_rate); } if let Some(burn_amount) = maxburnamount { - params.push(serde_json::json!(burn_amount)); + params["maxburnamount"] = serde_json::json!(burn_amount); } - self.call("sendrawtransaction", ¶ms) + self.call("sendrawtransaction", &[params.into()]) } fn estimate_smart_fee( From 15f36f354d85384dfd6ebc85affab57a2706e8b1 Mon Sep 17 00:00:00 2001 From: onchainguy-btc <1436535+onchainguy-btc@users.noreply.github.com> Date: Mon, 21 Oct 2024 00:22:01 +0200 Subject: [PATCH 5/6] Debugging --- client/src/client.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/client.rs b/client/src/client.rs index 6efd7147..78c0a03a 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -1087,9 +1087,9 @@ pub trait RpcApi: Sized { maxburnamount: Option, ) -> Result { let mut params = serde_json::json!({ - "hexstring": tx.raw_hex() - }); - + "hexstring": tx.raw_hex() + }); + if let Some(fee_rate) = maxfeerate { params["maxfeerate"] = serde_json::json!(fee_rate); } @@ -1098,7 +1098,7 @@ pub trait RpcApi: Sized { params["maxburnamount"] = serde_json::json!(burn_amount); } - self.call("sendrawtransaction", &[params.into()]) + self.call("sendrawtransaction", &[serde_json::json!({"-named": true}), params.into()]) } fn estimate_smart_fee( From fe13a18d86c4947e9def9049865524f16851da8b Mon Sep 17 00:00:00 2001 From: onchainguy-btc <1436535+onchainguy-btc@users.noreply.github.com> Date: Mon, 21 Oct 2024 00:26:15 +0200 Subject: [PATCH 6/6] Debugging --- client/src/client.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/client/src/client.rs b/client/src/client.rs index 78c0a03a..08f62f2b 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -1086,19 +1086,19 @@ pub trait RpcApi: Sized { maxfeerate: Option, maxburnamount: Option, ) -> Result { - let mut params = serde_json::json!({ - "hexstring": tx.raw_hex() - }); - + let mut params = vec![serde_json::json!(tx.raw_hex())]; + if let Some(fee_rate) = maxfeerate { - params["maxfeerate"] = serde_json::json!(fee_rate); + params.push(serde_json::json!(fee_rate)); + } else { + params.push(serde_json::Value::Null); } if let Some(burn_amount) = maxburnamount { - params["maxburnamount"] = serde_json::json!(burn_amount); + params.push(serde_json::json!(burn_amount)); } - self.call("sendrawtransaction", &[serde_json::json!({"-named": true}), params.into()]) + self.call("sendrawtransaction", ¶ms) } fn estimate_smart_fee(