Skip to content

Address all TODO in v23 #301

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Jul 22, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions client/src/client_sync/v23/blockchain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,34 @@
//!
//! See or use the `define_jsonrpc_minreq_client!` macro to define a `Client`.

/// Implements Bitcoin Core JSON-RPC API method `getblockfrompeer`
#[macro_export]
macro_rules! impl_client_v23__get_block_from_peer {
() => {
impl Client {
pub fn get_block_from_peer(&self, blockhash: BlockHash, peer_id: u32) -> Result<()> {
match self.call("getblockfrompeer", &[into_json(blockhash)?, into_json(peer_id)?]) {
Ok(serde_json::Value::Object(ref map)) if map.is_empty() => Ok(()),
Ok(res) => Err(Error::Returned(res.to_string())),
Err(err) => Err(err.into()),
}
}
}
};
}

/// Implements Bitcoin Core JSON-RPC API method `getdeploymentinfo`.
#[macro_export]
macro_rules! impl_client_v23__get_deployment_info {
() => {
impl Client {
pub fn get_deployment_info(&self, blockhash: &BlockHash) -> Result<GetDeploymentInfo> {
self.call("getdeploymentinfo", &[into_json(blockhash)?])
}
}
};
}

/// Implements Bitcoin Core JSON-RPC API method `savemempool`
#[macro_export]
macro_rules! impl_client_v23__save_mempool {
Expand Down
4 changes: 4 additions & 0 deletions client/src/client_sync/v23/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,13 @@ crate::impl_client_v17__get_block!();
crate::impl_client_v17__get_blockchain_info!();
crate::impl_client_v17__get_block_count!();
crate::impl_client_v19__get_block_filter!();
crate::impl_client_v23__get_block_from_peer!();
crate::impl_client_v17__get_block_hash!();
crate::impl_client_v17__get_block_header!();
crate::impl_client_v17__get_block_stats!();
crate::impl_client_v17__get_chain_tips!();
crate::impl_client_v17__get_chain_tx_stats!();
crate::impl_client_v23__get_deployment_info!();
crate::impl_client_v17__get_difficulty!();
crate::impl_client_v17__get_mempool_ancestors!();
crate::impl_client_v17__get_mempool_descendants!();
Expand Down Expand Up @@ -168,9 +170,11 @@ crate::impl_client_v18__list_wallet_dir!();
crate::impl_client_v17__list_wallets!();
crate::impl_client_v22__load_wallet!();
crate::impl_client_v17__lock_unspent!();
crate::impl_client_v23__new_keypool!();
crate::impl_client_v21__psbt_bump_fee!();
crate::impl_client_v17__remove_pruned_funds!();
crate::impl_client_v17__rescan_blockchain!();
crate::impl_client_v23__restore_wallet!();
crate::impl_client_v21__send!();
crate::impl_client_v17__send_many!();
crate::impl_client_v17__send_to_address!();
Expand Down
41 changes: 41 additions & 0 deletions client/src/client_sync/v23/wallet.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,44 @@ macro_rules! impl_client_v23__create_wallet {
}
};
}

/// Implements Bitcoin Core JSON-RPC API method `newkeypool`.
#[macro_export]
macro_rules! impl_client_v23__new_keypool {
() => {
impl Client {
/// Calls `newkeypool` for the loaded wallet.
///
/// > newkeypool
/// >
/// > Entirely clears and refills the keypool.
/// > Requires wallet passphrase to be set if wallet is encrypted.
pub fn new_keypool(&self) -> Result<()> {
match self.call("newkeypool", &[]) {
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 `restorewallet`.
#[macro_export]
macro_rules! impl_client_v23__restore_wallet {
() => {
impl Client {
/// Calls `restorewallet` with required and optional arguments.
///
/// > restorewallet "wallet_name" "backup_file" ( load_on_startup )
pub fn restore_wallet(
&self,
wallet_name: &str,
backup_file: &Path,
) -> Result<RestoreWallet> {
self.call("restorewallet", &[wallet_name.into(), into_json(backup_file)?])
}
}
};
}
4 changes: 4 additions & 0 deletions client/src/client_sync/v24/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,13 @@ crate::impl_client_v17__get_block!();
crate::impl_client_v17__get_blockchain_info!();
crate::impl_client_v17__get_block_count!();
crate::impl_client_v19__get_block_filter!();
crate::impl_client_v23__get_block_from_peer!();
crate::impl_client_v17__get_block_hash!();
crate::impl_client_v17__get_block_header!();
crate::impl_client_v17__get_block_stats!();
crate::impl_client_v17__get_chain_tips!();
crate::impl_client_v17__get_chain_tx_stats!();
crate::impl_client_v23__get_deployment_info!();
crate::impl_client_v17__get_difficulty!();
crate::impl_client_v17__get_mempool_ancestors!();
crate::impl_client_v17__get_mempool_descendants!();
Expand Down Expand Up @@ -165,9 +167,11 @@ crate::impl_client_v18__list_wallet_dir!();
crate::impl_client_v17__list_wallets!();
crate::impl_client_v22__load_wallet!();
crate::impl_client_v17__lock_unspent!();
crate::impl_client_v23__new_keypool!();
crate::impl_client_v21__psbt_bump_fee!();
crate::impl_client_v17__remove_pruned_funds!();
crate::impl_client_v17__rescan_blockchain!();
crate::impl_client_v23__restore_wallet!();
crate::impl_client_v21__send!();
crate::impl_client_v17__send_many!();
crate::impl_client_v17__send_to_address!();
Expand Down
4 changes: 4 additions & 0 deletions client/src/client_sync/v25/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,13 @@ crate::impl_client_v17__get_block!();
crate::impl_client_v17__get_blockchain_info!();
crate::impl_client_v17__get_block_count!();
crate::impl_client_v19__get_block_filter!();
crate::impl_client_v23__get_block_from_peer!();
crate::impl_client_v17__get_block_hash!();
crate::impl_client_v17__get_block_header!();
crate::impl_client_v17__get_block_stats!();
crate::impl_client_v17__get_chain_tips!();
crate::impl_client_v17__get_chain_tx_stats!();
crate::impl_client_v23__get_deployment_info!();
crate::impl_client_v17__get_difficulty!();
crate::impl_client_v17__get_mempool_ancestors!();
crate::impl_client_v17__get_mempool_descendants!();
Expand Down Expand Up @@ -167,9 +169,11 @@ crate::impl_client_v18__list_wallet_dir!();
crate::impl_client_v17__list_wallets!();
crate::impl_client_v22__load_wallet!();
crate::impl_client_v17__lock_unspent!();
crate::impl_client_v23__new_keypool!();
crate::impl_client_v21__psbt_bump_fee!();
crate::impl_client_v17__remove_pruned_funds!();
crate::impl_client_v17__rescan_blockchain!();
crate::impl_client_v23__restore_wallet!();
crate::impl_client_v21__send!();
crate::impl_client_v17__send_many!();
crate::impl_client_v17__send_to_address!();
Expand Down
4 changes: 4 additions & 0 deletions client/src/client_sync/v26/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,13 @@ crate::impl_client_v17__get_block!();
crate::impl_client_v17__get_blockchain_info!();
crate::impl_client_v17__get_block_count!();
crate::impl_client_v19__get_block_filter!();
crate::impl_client_v23__get_block_from_peer!();
crate::impl_client_v17__get_block_hash!();
crate::impl_client_v17__get_block_header!();
crate::impl_client_v17__get_block_stats!();
crate::impl_client_v17__get_chain_tips!();
crate::impl_client_v17__get_chain_tx_stats!();
crate::impl_client_v23__get_deployment_info!();
crate::impl_client_v17__get_difficulty!();
crate::impl_client_v17__get_mempool_ancestors!();
crate::impl_client_v17__get_mempool_descendants!();
Expand Down Expand Up @@ -171,9 +173,11 @@ crate::impl_client_v18__list_wallet_dir!();
crate::impl_client_v17__list_wallets!();
crate::impl_client_v22__load_wallet!();
crate::impl_client_v17__lock_unspent!();
crate::impl_client_v23__new_keypool!();
crate::impl_client_v21__psbt_bump_fee!();
crate::impl_client_v17__remove_pruned_funds!();
crate::impl_client_v17__rescan_blockchain!();
crate::impl_client_v23__restore_wallet!();
crate::impl_client_v21__send!();
crate::impl_client_v17__send_many!();
crate::impl_client_v17__send_to_address!();
Expand Down
4 changes: 4 additions & 0 deletions client/src/client_sync/v27/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,13 @@ crate::impl_client_v17__get_block!();
crate::impl_client_v17__get_blockchain_info!();
crate::impl_client_v17__get_block_count!();
crate::impl_client_v19__get_block_filter!();
crate::impl_client_v23__get_block_from_peer!();
crate::impl_client_v17__get_block_hash!();
crate::impl_client_v17__get_block_header!();
crate::impl_client_v17__get_block_stats!();
crate::impl_client_v17__get_chain_tips!();
crate::impl_client_v17__get_chain_tx_stats!();
crate::impl_client_v23__get_deployment_info!();
crate::impl_client_v17__get_difficulty!();
crate::impl_client_v17__get_mempool_ancestors!();
crate::impl_client_v17__get_mempool_descendants!();
Expand Down Expand Up @@ -167,9 +169,11 @@ crate::impl_client_v18__list_wallet_dir!();
crate::impl_client_v17__list_wallets!();
crate::impl_client_v22__load_wallet!();
crate::impl_client_v17__lock_unspent!();
crate::impl_client_v23__new_keypool!();
crate::impl_client_v21__psbt_bump_fee!();
crate::impl_client_v17__remove_pruned_funds!();
crate::impl_client_v17__rescan_blockchain!();
crate::impl_client_v23__restore_wallet!();
crate::impl_client_v21__send!();
crate::impl_client_v17__send_many!();
crate::impl_client_v17__send_to_address!();
Expand Down
4 changes: 4 additions & 0 deletions client/src/client_sync/v28/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,13 @@ crate::impl_client_v17__get_block!();
crate::impl_client_v17__get_blockchain_info!();
crate::impl_client_v17__get_block_count!();
crate::impl_client_v19__get_block_filter!();
crate::impl_client_v23__get_block_from_peer!();
crate::impl_client_v17__get_block_hash!();
crate::impl_client_v17__get_block_header!();
crate::impl_client_v17__get_block_stats!();
crate::impl_client_v17__get_chain_tips!();
crate::impl_client_v17__get_chain_tx_stats!();
crate::impl_client_v23__get_deployment_info!();
crate::impl_client_v17__get_difficulty!();
crate::impl_client_v17__get_mempool_ancestors!();
crate::impl_client_v17__get_mempool_descendants!();
Expand Down Expand Up @@ -169,9 +171,11 @@ crate::impl_client_v18__list_wallet_dir!();
crate::impl_client_v17__list_wallets!();
crate::impl_client_v22__load_wallet!();
crate::impl_client_v17__lock_unspent!();
crate::impl_client_v23__new_keypool!();
crate::impl_client_v21__psbt_bump_fee!();
crate::impl_client_v17__remove_pruned_funds!();
crate::impl_client_v17__rescan_blockchain!();
crate::impl_client_v23__restore_wallet!();
crate::impl_client_v21__send!();
crate::impl_client_v17__send_many!();
crate::impl_client_v17__send_to_address!();
Expand Down
4 changes: 4 additions & 0 deletions client/src/client_sync/v29/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,13 @@ crate::impl_client_v17__get_block!();
crate::impl_client_v17__get_blockchain_info!();
crate::impl_client_v17__get_block_count!();
crate::impl_client_v19__get_block_filter!();
crate::impl_client_v23__get_block_from_peer!();
crate::impl_client_v17__get_block_hash!();
crate::impl_client_v17__get_block_header!();
crate::impl_client_v17__get_block_stats!();
crate::impl_client_v17__get_chain_tips!();
crate::impl_client_v17__get_chain_tx_stats!();
crate::impl_client_v23__get_deployment_info!();
crate::impl_client_v29__get_descriptor_activity!();
crate::impl_client_v17__get_difficulty!();
crate::impl_client_v17__get_mempool_ancestors!();
Expand Down Expand Up @@ -169,9 +171,11 @@ crate::impl_client_v18__list_wallet_dir!();
crate::impl_client_v17__list_wallets!();
crate::impl_client_v22__load_wallet!();
crate::impl_client_v17__lock_unspent!();
crate::impl_client_v23__new_keypool!();
crate::impl_client_v21__psbt_bump_fee!();
crate::impl_client_v17__remove_pruned_funds!();
crate::impl_client_v17__rescan_blockchain!();
crate::impl_client_v23__restore_wallet!();
crate::impl_client_v21__send!();
crate::impl_client_v17__send_many!();
crate::impl_client_v17__send_to_address!();
Expand Down
42 changes: 42 additions & 0 deletions integration_test/tests/blockchain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,37 @@ fn blockchain__get_block_filter__modelled() {
model.unwrap();
}

#[test]
#[cfg(not(feature = "v22_and_below"))]
fn blockchain__get_block_from_peer() {
use bitcoin::hashes::Hash;
let (node1, _node2, _node3) = integration_test::three_node_network();

let now = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.expect("Time went backwards")
.as_secs() as u32;

// Create a dummy header and submit it
let mut header = bitcoin::block::Header {
version: bitcoin::block::Version::from_consensus(0x20000000),
prev_blockhash: node1.client.best_block_hash().expect("best_block_hash failed"),
merkle_root: bitcoin::TxMerkleNode::all_zeros(),
time: now,
bits: bitcoin::CompactTarget::from_consensus(0x207fffff),
nonce: 0,
};
let target = header.target();
while header.validate_pow(target).is_err() {
header.nonce += 1;
}
node1.client.submit_header(&header).expect("submit_header failed");

let hash = header.block_hash();
let peer_id = node1.client.get_peer_info().expect("getpeerinfo").0[0].id;
let _: () = node1.client.get_block_from_peer(hash, peer_id).expect("getblockfrompeer");
}

#[test]
fn blockchain__get_block_hash__modelled() {
let node = Node::with_wallet(Wallet::None, &[]);
Expand Down Expand Up @@ -147,6 +178,17 @@ fn blockchain__get_chain_tx_stats__modelled() {
model.unwrap();
}

#[test]
#[cfg(not(feature = "v22_and_below"))]
fn blockchain__get_deployment_info__modelled() {
let node = Node::with_wallet(Wallet::None, &[]);
let block_hash = node.client.best_block_hash().expect("best_block_hash failed");

let json: GetDeploymentInfo = node.client.get_deployment_info(&block_hash).expect("getdeploymentinfo");
let model: Result<mtype::GetDeploymentInfo, GetDeploymentInfoError> = json.into_model();
model.unwrap();
}

#[test]
#[cfg(not(feature = "v28_and_below"))]
fn blockchain__get_descriptor_activity__modelled() {
Expand Down
26 changes: 26 additions & 0 deletions integration_test/tests/wallet.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,13 +66,26 @@ fn wallet__add_multisig_address__modelled() {

#[test]
fn wallet__backup_wallet() {
backup_and_restore_wallet()
}

fn backup_and_restore_wallet() {
let node = Node::with_wallet(Wallet::Default, &[]);
let file_path = integration_test::random_tmp_file();

let _: () = node.client.backup_wallet(&file_path).expect("backupwallet");
assert!(file_path.exists(), "Backup file should exist at destination");
assert!(file_path.is_file(), "Backup destination should be a file");

// Restore wallet only available for v23 and above.
#[cfg(not(feature = "v22_and_below"))]
{
let wallet_name = "test_wallet";
let node2 = Node::with_wallet(Wallet::None, &[]);
let restored_wallet: RestoreWallet = node2.client.restore_wallet(wallet_name, &file_path).expect("restorewallet");
assert_eq!(restored_wallet.name, wallet_name);
}

fs::remove_file(&file_path).expect("removefile");
}

Expand Down Expand Up @@ -560,6 +573,14 @@ fn wallet__lock_unspent() {
assert!(json.0);
}

#[cfg(not(feature = "v22_and_below"))]
#[test]
fn wallet__new_keypool() {
let node = Node::with_wallet(Wallet::None, &["-deprecatedrpc=create_bdb"]);
node.client.create_legacy_wallet("legacy_wallet").expect("createlegacywallet");
let _: () = node.client.new_keypool().expect("newkeypool");
}

#[cfg(not(feature = "v20_and_below"))]
#[test]
fn wallet__psbt_bump_fee__modelled() {
Expand Down Expand Up @@ -595,6 +616,11 @@ fn wallet__remove_pruned_funds() {
let _: () = node.client.remove_pruned_funds(txid).expect("removeprunedfunds");
}

// This is tested in `backup_and_restore_wallet()`, called by wallet__backup_wallet()
#[cfg(not(feature = "v22_and_below"))]
#[test]
fn wallet__restore_wallet() {}

// This is tested in raw_transactions.rs `create_sign_send()`.
#[test]
fn wallet__sign_raw_transaction_with_wallet__modelled() {}
Expand Down
Loading