From d87f0460070317436217123caea0abdb10d5dd8b Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Fri, 8 Nov 2024 16:59:37 -0800 Subject: [PATCH 01/13] Add support for `maxfeerate` and `maxburnamount` to `sendrawtransaction` --- client/src/client.rs | 46 ++++++++++++++++++++++++++++++------ integration_test/src/main.rs | 4 ++-- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/client/src/client.rs b/client/src/client.rs index b4d3f212..02d84978 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -23,7 +23,7 @@ use crate::bitcoin::address::{NetworkChecked, NetworkUnchecked}; use crate::bitcoin::hashes::hex::FromHex; use crate::bitcoin::secp256k1::ecdsa::Signature; use crate::bitcoin::{ - Address, Amount, Block, OutPoint, PrivateKey, PublicKey, Script, Transaction, + Address, Amount, Block, FeeRate, OutPoint, PrivateKey, PublicKey, Script, Transaction, }; use log::Level::{Debug, Trace, Warn}; @@ -1073,8 +1073,40 @@ pub trait RpcApi: Sized { self.call("ping", &[]) } - fn send_raw_transaction(&self, tx: R) -> Result { - self.call("sendrawtransaction", &[tx.raw_hex().into()]) + // Submit a raw transaction to local node and network. + // + // # Arguments + // + // 1. `tx`: Transaction to submit + // 2. `maxfeerate`: Reject transaction whose fee rate is higher than the + // specified value Available in Bitcoin Core 0.19.0 and later. + // 3. `maxburnamount`: Reject transactions with provably unspendable + // outputs (e.g. 'datacarrier' outputs that use the OP_RETURN opcode) + // greater than the specified value, expressed in BTC. If burning funds + // through unspendable outputs is desired, increase this value. This + // check is based on heuristics and does not guarantee spendability of + // outputs. Available in Bitcoin Core 25.0.0 and later. + fn send_raw_transaction( + &self, + tx: R, + maxfeerate: Option, + maxburnamount: Option, + ) -> Result { + #[allow(clippy::let_and_return)] + fn fee_rate_to_btc_per_kvb(fee_rate: FeeRate) -> f64 { + let sat_per_kwu = fee_rate.to_sat_per_kwu() as f64; + let sat_per_kvb = sat_per_kwu * 4.0; + let btc_per_kvb = sat_per_kvb / Amount::ONE_BTC.to_sat() as f64; + btc_per_kvb + } + + let mut args = [ + into_json(tx.raw_hex())?, + opt_into_json(maxfeerate.map(fee_rate_to_btc_per_kvb))?, + opt_into_json(maxburnamount.map(|amount| amount.to_btc()))?, + ]; + + self.call("sendrawtransaction", handle_defaults(&mut args, &[null(), null(), null()])) } fn estimate_smart_fee( @@ -1361,10 +1393,10 @@ mod tests { let client = Client::new("http://localhost/", Auth::None).unwrap(); let tx: bitcoin::Transaction = encode::deserialize(&Vec::::from_hex("0200000001586bd02815cf5faabfec986a4e50d25dbee089bd2758621e61c5fab06c334af0000000006b483045022100e85425f6d7c589972ee061413bcf08dc8c8e589ce37b217535a42af924f0e4d602205c9ba9cb14ef15513c9d946fa1c4b797883e748e8c32171bdf6166583946e35c012103dae30a4d7870cd87b45dd53e6012f71318fdd059c1c2623b8cc73f8af287bb2dfeffffff021dc4260c010000001976a914f602e88b2b5901d8aab15ebe4a97cf92ec6e03b388ac00e1f505000000001976a914687ffeffe8cf4e4c038da46a9b1d37db385a472d88acfd211500").unwrap()).unwrap(); - assert!(client.send_raw_transaction(&tx).is_err()); - assert!(client.send_raw_transaction(&encode::serialize(&tx)).is_err()); - assert!(client.send_raw_transaction("deadbeef").is_err()); - assert!(client.send_raw_transaction("deadbeef".to_owned()).is_err()); + assert!(client.send_raw_transaction(&tx, None, None).is_err()); + assert!(client.send_raw_transaction(&encode::serialize(&tx), None, None).is_err()); + assert!(client.send_raw_transaction("deadbeef", None, None).is_err()); + assert!(client.send_raw_transaction("deadbeef".to_owned(), None, None).is_err()); } fn test_handle_defaults_inner() -> Result<()> { diff --git a/integration_test/src/main.rs b/integration_test/src/main.rs index ecba8323..272229aa 100644 --- a/integration_test/src/main.rs +++ b/integration_test/src/main.rs @@ -632,7 +632,7 @@ fn test_sign_raw_transaction_with_send_raw_transaction(cl: &Client) { }; let res = cl.sign_raw_transaction_with_wallet(&tx, Some(&[input]), None).unwrap(); assert!(res.complete); - let txid = cl.send_raw_transaction(&res.transaction().unwrap()).unwrap(); + let txid = cl.send_raw_transaction(&res.transaction().unwrap(), None, None).unwrap(); let tx = Transaction { version: transaction::Version::ONE, @@ -661,7 +661,7 @@ fn test_sign_raw_transaction_with_send_raw_transaction(cl: &Client) { ) .unwrap(); assert!(res.complete); - let _ = cl.send_raw_transaction(&res.transaction().unwrap()).unwrap(); + let _ = cl.send_raw_transaction(&res.transaction().unwrap(), None, None).unwrap(); } fn test_invalidate_block_reconsider_block(cl: &Client) { From 3d04214644d4d638f5731ec2f5a20e40fdd17b2c Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Mon, 25 Nov 2024 16:07:23 -0800 Subject: [PATCH 02/13] Try adding a test --- integration_test/src/main.rs | 75 +++++++++++++++++++++++++----------- 1 file changed, 52 insertions(+), 23 deletions(-) diff --git a/integration_test/src/main.rs b/integration_test/src/main.rs index 272229aa..ce10b258 100644 --- a/integration_test/src/main.rs +++ b/integration_test/src/main.rs @@ -10,29 +10,28 @@ #![deny(unused)] -#[macro_use] -extern crate lazy_static; - -use std::collections::HashMap; -use std::str::FromStr; - -use bitcoin::absolute::LockTime; -use bitcoin::address::{NetworkChecked, NetworkUnchecked}; -use bitcoincore_rpc::json; -use bitcoincore_rpc::jsonrpc::error::Error as JsonRpcError; -use bitcoincore_rpc::{Auth, Client, Error, RpcApi}; - -use crate::json::BlockStatsFields as BsFields; -use bitcoin::consensus::encode::{deserialize, serialize_hex}; -use bitcoin::hashes::hex::FromHex; -use bitcoin::hashes::Hash; -use bitcoin::{secp256k1, sighash, ScriptBuf}; -use bitcoin::{ - transaction, Address, Amount, CompressedPublicKey, Network, OutPoint, PrivateKey, Sequence, - SignedAmount, Transaction, TxIn, TxOut, Txid, Witness, -}; -use bitcoincore_rpc::bitcoincore_rpc_json::{ - GetBlockTemplateModes, GetBlockTemplateRules, GetZmqNotificationsResult, ScanTxOutRequest, +use { + bitcoin::{ + absolute::LockTime, + address::{NetworkChecked, NetworkUnchecked}, + consensus::encode::{deserialize, serialize_hex}, + hashes::{hex::FromHex, Hash}, + secp256k1, sighash, transaction, Address, Amount, CompressedPublicKey, FeeRate, Network, + OutPoint, PrivateKey, ScriptBuf, Sequence, SignedAmount, Transaction, TxIn, TxOut, Txid, + Witness, + }, + bitcoincore_rpc::{ + bitcoincore_rpc_json::{ + GetBlockTemplateModes, GetBlockTemplateRules, GetZmqNotificationsResult, + ScanTxOutRequest, + }, + json, + jsonrpc::error::Error as JsonRpcError, + Auth, Client, Error, RpcApi, + }, + json::BlockStatsFields as BsFields, + lazy_static::lazy_static, + std::{collections::HashMap, str::FromStr}, }; lazy_static! { @@ -176,6 +175,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(&cl); test_invalidate_block_reconsider_block(&cl); test_key_pool_refill(&cl); test_create_raw_transaction(&cl); @@ -664,6 +664,35 @@ fn test_sign_raw_transaction_with_send_raw_transaction(cl: &Client) { let _ = cl.send_raw_transaction(&res.transaction().unwrap(), None, None).unwrap(); } +fn test_send_raw_transaction(cl: &Client) { + // todo: + // - create transaction with fee that's too high + // - reject transaction if fee is too high + // - accept with maxfeerate set + // - reject transaction with burn + // - accept with maxburnamount set + // - create transaction with high fee? + + let output = [(RANDOM_ADDRESS.to_string(), btc(1))].into(); + + let tx = cl.create_raw_transaction_hex(&[], &output, None, None).unwrap(); + + let options = json::FundRawTransactionOptions { + fee_rate: Some(Amount::from_btc(1.0).unwrap()), + ..json::FundRawTransactionOptions::default() + }; + + let funded = cl.fund_raw_transaction(tx, Some(&options), None).unwrap(); + + cl.send_raw_transaction(&funded.hex, None, None).unwrap_err(); + cl.send_raw_transaction( + &funded.hex, + Some(FeeRate::from_sat_per_vb(100_000_000).unwrap()), + None, + ) + .unwrap_err(); +} + fn test_invalidate_block_reconsider_block(cl: &Client) { let hash = cl.get_best_block_hash().unwrap(); cl.invalidate_block(&hash).unwrap(); From 1746bf81c331320ee4db0f3726ec1cb2c01ec98b Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Mon, 25 Nov 2024 16:12:41 -0800 Subject: [PATCH 03/13] Clean up justfile --- .editorconfig | 4 +--- justfile | 22 +++++----------------- 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/.editorconfig b/.editorconfig index 3178a1e0..76a93c06 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,5 +1,3 @@ -# see https://editorconfig.org for more options, and setup instructions for yours editor - [*] indent_style = space -indent_size = 4 +indent_size = 2 diff --git a/justfile b/justfile index 7e3b26d4..16b40fff 100644 --- a/justfile +++ b/justfile @@ -1,20 +1,8 @@ watch +args='test': cargo watch --clear --exec '{{args}}' -build: - cargo build --workspace --all-targets - -check: - cargo check --workspace --all-targets - -lint: - cargo clippy --workspace --all-targets - -fmt: - cargo fmt --all - -format: - cargo fmt --all --check - -test: - cargo test --workspace --all-targets +ci: + cargo build --all --all-targets + cargo clippy --all --all-targets + cargo fmt --all -- --check + cargo test --all From ba00816dcd4538dbe2db53c608f7a799a24f1123 Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Mon, 25 Nov 2024 16:24:46 -0800 Subject: [PATCH 04/13] Fix test --- client/src/client.rs | 27 ++++++++-------------- integration_test/src/main.rs | 45 ++++++++++++++---------------------- 2 files changed, 26 insertions(+), 46 deletions(-) diff --git a/client/src/client.rs b/client/src/client.rs index 02d84978..1d8136ee 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -23,7 +23,7 @@ use crate::bitcoin::address::{NetworkChecked, NetworkUnchecked}; use crate::bitcoin::hashes::hex::FromHex; use crate::bitcoin::secp256k1::ecdsa::Signature; use crate::bitcoin::{ - Address, Amount, Block, FeeRate, OutPoint, PrivateKey, PublicKey, Script, Transaction, + Address, Amount, Block, OutPoint, PrivateKey, PublicKey, Script, Transaction, }; use log::Level::{Debug, Trace, Warn}; @@ -1075,12 +1075,12 @@ pub trait RpcApi: Sized { // Submit a raw transaction to local node and network. // + // Note that `maxfeerate` is not supported. + // // # Arguments // // 1. `tx`: Transaction to submit - // 2. `maxfeerate`: Reject transaction whose fee rate is higher than the - // specified value Available in Bitcoin Core 0.19.0 and later. - // 3. `maxburnamount`: Reject transactions with provably unspendable + // 2. `maxburnamount`: Reject transactions with provably unspendable // outputs (e.g. 'datacarrier' outputs that use the OP_RETURN opcode) // greater than the specified value, expressed in BTC. If burning funds // through unspendable outputs is desired, increase this value. This @@ -1089,20 +1089,11 @@ pub trait RpcApi: Sized { fn send_raw_transaction( &self, tx: R, - maxfeerate: Option, maxburnamount: Option, ) -> Result { - #[allow(clippy::let_and_return)] - fn fee_rate_to_btc_per_kvb(fee_rate: FeeRate) -> f64 { - let sat_per_kwu = fee_rate.to_sat_per_kwu() as f64; - let sat_per_kvb = sat_per_kwu * 4.0; - let btc_per_kvb = sat_per_kvb / Amount::ONE_BTC.to_sat() as f64; - btc_per_kvb - } - let mut args = [ into_json(tx.raw_hex())?, - opt_into_json(maxfeerate.map(fee_rate_to_btc_per_kvb))?, + null(), opt_into_json(maxburnamount.map(|amount| amount.to_btc()))?, ]; @@ -1393,10 +1384,10 @@ mod tests { let client = Client::new("http://localhost/", Auth::None).unwrap(); let tx: bitcoin::Transaction = encode::deserialize(&Vec::::from_hex("0200000001586bd02815cf5faabfec986a4e50d25dbee089bd2758621e61c5fab06c334af0000000006b483045022100e85425f6d7c589972ee061413bcf08dc8c8e589ce37b217535a42af924f0e4d602205c9ba9cb14ef15513c9d946fa1c4b797883e748e8c32171bdf6166583946e35c012103dae30a4d7870cd87b45dd53e6012f71318fdd059c1c2623b8cc73f8af287bb2dfeffffff021dc4260c010000001976a914f602e88b2b5901d8aab15ebe4a97cf92ec6e03b388ac00e1f505000000001976a914687ffeffe8cf4e4c038da46a9b1d37db385a472d88acfd211500").unwrap()).unwrap(); - assert!(client.send_raw_transaction(&tx, None, None).is_err()); - assert!(client.send_raw_transaction(&encode::serialize(&tx), None, None).is_err()); - assert!(client.send_raw_transaction("deadbeef", None, None).is_err()); - assert!(client.send_raw_transaction("deadbeef".to_owned(), None, None).is_err()); + assert!(client.send_raw_transaction(&tx, None).is_err()); + assert!(client.send_raw_transaction(&encode::serialize(&tx), None).is_err()); + assert!(client.send_raw_transaction("deadbeef", None).is_err()); + assert!(client.send_raw_transaction("deadbeef".to_owned(), None).is_err()); } fn test_handle_defaults_inner() -> Result<()> { diff --git a/integration_test/src/main.rs b/integration_test/src/main.rs index ce10b258..88ddc513 100644 --- a/integration_test/src/main.rs +++ b/integration_test/src/main.rs @@ -16,9 +16,9 @@ use { address::{NetworkChecked, NetworkUnchecked}, consensus::encode::{deserialize, serialize_hex}, hashes::{hex::FromHex, Hash}, - secp256k1, sighash, transaction, Address, Amount, CompressedPublicKey, FeeRate, Network, - OutPoint, PrivateKey, ScriptBuf, Sequence, SignedAmount, Transaction, TxIn, TxOut, Txid, - Witness, + opcodes, script, secp256k1, sighash, transaction, Address, Amount, CompressedPublicKey, + Network, OutPoint, PrivateKey, ScriptBuf, Sequence, SignedAmount, Transaction, TxIn, TxOut, + Txid, Witness, }, bitcoincore_rpc::{ bitcoincore_rpc_json::{ @@ -632,7 +632,7 @@ fn test_sign_raw_transaction_with_send_raw_transaction(cl: &Client) { }; let res = cl.sign_raw_transaction_with_wallet(&tx, Some(&[input]), None).unwrap(); assert!(res.complete); - let txid = cl.send_raw_transaction(&res.transaction().unwrap(), None, None).unwrap(); + let txid = cl.send_raw_transaction(&res.transaction().unwrap(), None).unwrap(); let tx = Transaction { version: transaction::Version::ONE, @@ -661,36 +661,25 @@ fn test_sign_raw_transaction_with_send_raw_transaction(cl: &Client) { ) .unwrap(); assert!(res.complete); - let _ = cl.send_raw_transaction(&res.transaction().unwrap(), None, None).unwrap(); + let _ = cl.send_raw_transaction(&res.transaction().unwrap(), None).unwrap(); } fn test_send_raw_transaction(cl: &Client) { - // todo: - // - create transaction with fee that's too high - // - reject transaction if fee is too high - // - accept with maxfeerate set - // - reject transaction with burn - // - accept with maxburnamount set - // - create transaction with high fee? - - let output = [(RANDOM_ADDRESS.to_string(), btc(1))].into(); - - let tx = cl.create_raw_transaction_hex(&[], &output, None, None).unwrap(); - - let options = json::FundRawTransactionOptions { - fee_rate: Some(Amount::from_btc(1.0).unwrap()), - ..json::FundRawTransactionOptions::default() + let tx = Transaction { + input: Vec::new(), + lock_time: LockTime::ZERO, + output: vec![TxOut { + value: Amount::from_sat(10), + script_pubkey: script::Builder::new() + .push_opcode(opcodes::all::OP_RETURN) + .into_script(), + }], + version: transaction::Version::ONE, }; - let funded = cl.fund_raw_transaction(tx, Some(&options), None).unwrap(); + let tx = cl.fund_raw_transaction(&tx, None, None).unwrap(); - cl.send_raw_transaction(&funded.hex, None, None).unwrap_err(); - cl.send_raw_transaction( - &funded.hex, - Some(FeeRate::from_sat_per_vb(100_000_000).unwrap()), - None, - ) - .unwrap_err(); + cl.send_raw_transaction(&tx.hex, None).unwrap_err(); } fn test_invalidate_block_reconsider_block(cl: &Client) { From cf0c9a65c07ffee4d7a7edcf73886a1912a92b29 Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Mon, 25 Nov 2024 16:26:28 -0800 Subject: [PATCH 05/13] Enhance --- integration_test/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration_test/src/main.rs b/integration_test/src/main.rs index 88ddc513..e234f153 100644 --- a/integration_test/src/main.rs +++ b/integration_test/src/main.rs @@ -677,7 +677,7 @@ fn test_send_raw_transaction(cl: &Client) { version: transaction::Version::ONE, }; - let tx = cl.fund_raw_transaction(&tx, None, None).unwrap(); + let tx = cl.fund_raw_transaction(&tx, None, Some(false)).unwrap(); cl.send_raw_transaction(&tx.hex, None).unwrap_err(); } From 03c1cc555dbea8966dcec65138715bd825ab966f Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Mon, 25 Nov 2024 16:28:31 -0800 Subject: [PATCH 06/13] Enhance --- integration_test/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration_test/src/main.rs b/integration_test/src/main.rs index e234f153..d6daee44 100644 --- a/integration_test/src/main.rs +++ b/integration_test/src/main.rs @@ -677,7 +677,7 @@ fn test_send_raw_transaction(cl: &Client) { version: transaction::Version::ONE, }; - let tx = cl.fund_raw_transaction(&tx, None, Some(false)).unwrap(); + let tx = cl.fund_raw_transaction(&tx, None, Some(true)).unwrap(); cl.send_raw_transaction(&tx.hex, None).unwrap_err(); } From 68ea0dcc04cb8d4061d84f005b80a6fb4e6cbb33 Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Mon, 25 Nov 2024 16:32:45 -0800 Subject: [PATCH 07/13] Enhance --- integration_test/src/main.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/integration_test/src/main.rs b/integration_test/src/main.rs index d6daee44..460af187 100644 --- a/integration_test/src/main.rs +++ b/integration_test/src/main.rs @@ -14,7 +14,10 @@ use { bitcoin::{ absolute::LockTime, address::{NetworkChecked, NetworkUnchecked}, - consensus::encode::{deserialize, serialize_hex}, + consensus::{ + encode::{deserialize, serialize_hex}, + Encodable, + }, hashes::{hex::FromHex, Hash}, opcodes, script, secp256k1, sighash, transaction, Address, Amount, CompressedPublicKey, Network, OutPoint, PrivateKey, ScriptBuf, Sequence, SignedAmount, Transaction, TxIn, TxOut, @@ -677,7 +680,16 @@ fn test_send_raw_transaction(cl: &Client) { version: transaction::Version::ONE, }; - let tx = cl.fund_raw_transaction(&tx, None, Some(true)).unwrap(); + let mut buffer = Vec::new(); + + { + tx.version.consensus_encode(&mut buffer).unwrap(); + tx.input.consensus_encode(&mut buffer).unwrap(); + tx.output.consensus_encode(&mut buffer).unwrap(); + tx.lock_time.consensus_encode(&mut buffer).unwrap(); + } + + let tx = cl.fund_raw_transaction(&buffer, None, None).unwrap(); cl.send_raw_transaction(&tx.hex, None).unwrap_err(); } From d81a5735ddb7ab424f8ae02260df87e0843dfc2b Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Mon, 25 Nov 2024 16:34:45 -0800 Subject: [PATCH 08/13] Enhance --- integration_test/src/main.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/integration_test/src/main.rs b/integration_test/src/main.rs index 460af187..8a48c2a5 100644 --- a/integration_test/src/main.rs +++ b/integration_test/src/main.rs @@ -692,6 +692,8 @@ fn test_send_raw_transaction(cl: &Client) { let tx = cl.fund_raw_transaction(&buffer, None, None).unwrap(); cl.send_raw_transaction(&tx.hex, None).unwrap_err(); + cl.send_raw_transaction(&tx.hex, Some(Amount::from_sat(9))).unwrap_err(); + cl.send_raw_transaction(&tx.hex, Some(Amount::from_sat(10))).unwrap(); } fn test_invalidate_block_reconsider_block(cl: &Client) { From a563bc5e79c38dca9fd72c44682f2c272a465f4b Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Mon, 25 Nov 2024 16:37:09 -0800 Subject: [PATCH 09/13] Revise --- integration_test/src/main.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/integration_test/src/main.rs b/integration_test/src/main.rs index 8a48c2a5..fc51e5be 100644 --- a/integration_test/src/main.rs +++ b/integration_test/src/main.rs @@ -691,9 +691,12 @@ fn test_send_raw_transaction(cl: &Client) { let tx = cl.fund_raw_transaction(&buffer, None, None).unwrap(); - cl.send_raw_transaction(&tx.hex, None).unwrap_err(); - cl.send_raw_transaction(&tx.hex, Some(Amount::from_sat(9))).unwrap_err(); - cl.send_raw_transaction(&tx.hex, Some(Amount::from_sat(10))).unwrap(); + let signed = + cl.sign_raw_transaction_with_wallet(&tx.hex, None, None).unwrap().transaction().unwrap(); + + cl.send_raw_transaction(&signed, None).unwrap_err(); + cl.send_raw_transaction(&signed, Some(Amount::from_sat(9))).unwrap_err(); + cl.send_raw_transaction(&signed, Some(Amount::from_sat(10))).unwrap(); } fn test_invalidate_block_reconsider_block(cl: &Client) { From 7962e61af5bfde3ed9521cb8cc8fbc5f56a5f0dc Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Mon, 25 Nov 2024 16:40:18 -0800 Subject: [PATCH 10/13] Enhance --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index cce86ea6..3278101d 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -56,5 +56,5 @@ jobs: - name: Integration Tests env: - BITCOINVERSION: 0.21.0 + BITCOINVERSION: 24.0.1 run: ./contrib/integration_test.sh From 3d97db9511ab4e0ef61f44fc65f33181eead404f Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Mon, 25 Nov 2024 16:43:43 -0800 Subject: [PATCH 11/13] Modify --- .github/workflows/ci.yaml | 2 +- integration_test/src/main.rs | 53 ++++++++++++++++++++---------------- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 3278101d..d1930823 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -56,5 +56,5 @@ jobs: - name: Integration Tests env: - BITCOINVERSION: 24.0.1 + BITCOINVERSION: 22.0 run: ./contrib/integration_test.sh diff --git a/integration_test/src/main.rs b/integration_test/src/main.rs index fc51e5be..a5d0b0d9 100644 --- a/integration_test/src/main.rs +++ b/integration_test/src/main.rs @@ -668,35 +668,40 @@ fn test_sign_raw_transaction_with_send_raw_transaction(cl: &Client) { } fn test_send_raw_transaction(cl: &Client) { - let tx = Transaction { - input: Vec::new(), - lock_time: LockTime::ZERO, - output: vec![TxOut { - value: Amount::from_sat(10), - script_pubkey: script::Builder::new() - .push_opcode(opcodes::all::OP_RETURN) - .into_script(), - }], - version: transaction::Version::ONE, - }; + if version() > 240000 { + let tx = Transaction { + input: Vec::new(), + lock_time: LockTime::ZERO, + output: vec![TxOut { + value: Amount::from_sat(10), + script_pubkey: script::Builder::new() + .push_opcode(opcodes::all::OP_RETURN) + .into_script(), + }], + version: transaction::Version::ONE, + }; - let mut buffer = Vec::new(); + let mut buffer = Vec::new(); - { - tx.version.consensus_encode(&mut buffer).unwrap(); - tx.input.consensus_encode(&mut buffer).unwrap(); - tx.output.consensus_encode(&mut buffer).unwrap(); - tx.lock_time.consensus_encode(&mut buffer).unwrap(); - } + { + tx.version.consensus_encode(&mut buffer).unwrap(); + tx.input.consensus_encode(&mut buffer).unwrap(); + tx.output.consensus_encode(&mut buffer).unwrap(); + tx.lock_time.consensus_encode(&mut buffer).unwrap(); + } - let tx = cl.fund_raw_transaction(&buffer, None, None).unwrap(); + let tx = cl.fund_raw_transaction(&buffer, None, None).unwrap(); - let signed = - cl.sign_raw_transaction_with_wallet(&tx.hex, None, None).unwrap().transaction().unwrap(); + let signed = cl + .sign_raw_transaction_with_wallet(&tx.hex, None, None) + .unwrap() + .transaction() + .unwrap(); - cl.send_raw_transaction(&signed, None).unwrap_err(); - cl.send_raw_transaction(&signed, Some(Amount::from_sat(9))).unwrap_err(); - cl.send_raw_transaction(&signed, Some(Amount::from_sat(10))).unwrap(); + cl.send_raw_transaction(&signed, None).unwrap_err(); + cl.send_raw_transaction(&signed, Some(Amount::from_sat(9))).unwrap_err(); + cl.send_raw_transaction(&signed, Some(Amount::from_sat(10))).unwrap(); + } } fn test_invalidate_block_reconsider_block(cl: &Client) { From 7920f0e0ba971f64e5259f94c9d8ffaab5b051d4 Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Mon, 25 Nov 2024 16:47:07 -0800 Subject: [PATCH 12/13] Adjust --- client/src/client.rs | 7 ++++++- integration_test/src/main.rs | 9 +++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/client/src/client.rs b/client/src/client.rs index 1d8136ee..d6e82cda 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -280,6 +280,7 @@ pub trait RpcApi: Sized { blank: Option, passphrase: Option<&str>, avoid_reuse: Option, + descriptors: Option, ) -> Result { let mut args = [ wallet.into(), @@ -287,10 +288,14 @@ pub trait RpcApi: Sized { opt_into_json(blank)?, opt_into_json(passphrase)?, opt_into_json(avoid_reuse)?, + opt_into_json(descriptors)?, ]; self.call( "createwallet", - handle_defaults(&mut args, &[false.into(), false.into(), into_json("")?, false.into()]), + handle_defaults( + &mut args, + &[false.into(), false.into(), into_json("")?, false.into(), null()], + ), ) } diff --git a/integration_test/src/main.rs b/integration_test/src/main.rs index a5d0b0d9..64b08f87 100644 --- a/integration_test/src/main.rs +++ b/integration_test/src/main.rs @@ -142,7 +142,7 @@ fn main() { unsafe { VERSION = cl.version().unwrap() }; println!("Version: {}", version()); - cl.create_wallet("testwallet", None, None, None, None).unwrap(); + cl.create_wallet("testwallet", None, None, None, None, Some(false)).unwrap(); test_get_mining_info(&cl); test_get_blockchain_info(&cl); @@ -1192,6 +1192,7 @@ fn test_create_wallet(cl: &Client) { wallet_param.blank, wallet_param.passphrase, wallet_param.avoid_reuse, + None, ) .unwrap(); @@ -1345,7 +1346,7 @@ fn test_getblocktemplate(cl: &Client) { } fn test_unloadwallet(cl: &Client) { - cl.create_wallet("testunloadwallet", None, None, None, None).unwrap(); + cl.create_wallet("testunloadwallet", None, None, None, None, None).unwrap(); let res = new_wallet_client("testunloadwallet").unload_wallet(None).unwrap(); @@ -1361,7 +1362,7 @@ fn test_loadwallet(_: &Client) { let wallet_client = new_wallet_client(wallet_name); assert!(wallet_client.load_wallet(wallet_name).is_err()); - wallet_client.create_wallet(wallet_name, None, None, None, None).unwrap(); + wallet_client.create_wallet(wallet_name, None, None, None, None, None).unwrap(); assert!(wallet_client.load_wallet(wallet_name).is_err()); wallet_client.unload_wallet(None).unwrap(); @@ -1376,7 +1377,7 @@ fn test_backupwallet(_: &Client) { assert!(wallet_client.backup_wallet(None).is_err()); assert!(wallet_client.backup_wallet(Some(&backup_path)).is_err()); - wallet_client.create_wallet("testbackupwallet", None, None, None, None).unwrap(); + wallet_client.create_wallet("testbackupwallet", None, None, None, None, None).unwrap(); assert!(wallet_client.backup_wallet(None).is_err()); assert!(wallet_client.backup_wallet(Some(&backup_path)).is_ok()); } From 6ab6d60d6cea8d72152bd52f2bf88c59d32c1e59 Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Mon, 25 Nov 2024 16:48:33 -0800 Subject: [PATCH 13/13] Modify --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index d1930823..736e38fe 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -56,5 +56,5 @@ jobs: - name: Integration Tests env: - BITCOINVERSION: 22.0 + BITCOINVERSION: '22.0' run: ./contrib/integration_test.sh