#[cfg(feature = "esplora")]
Esplora,
#[cfg(feature = "rpc")]
- RPC,
+ Rpc,
}
/// Config options wallet operations can take.
#[cfg(any(feature = "electrum", feature = "esplora", feature = "rpc"))]
#[arg(env = "CLIENT_TYPE", short = 'c', long, value_enum, required = true)]
pub client_type: ClientType,
- #[cfg(any(feature = "sqlite",))]
+ #[cfg(feature = "sqlite")]
#[arg(env = "DATABASE_TYPE", short = 'd', long, value_enum, required = true)]
pub database_type: DatabaseType,
/// Sets the server url.
use bdk_wallet::bitcoin::consensus::encode::{serialize, serialize_hex};
use bdk_wallet::bitcoin::script::PushBytesBuf;
use bdk_wallet::bitcoin::Network;
-use bdk_wallet::bitcoin::{secp256k1::Secp256k1, Transaction, Txid};
+#[cfg(any(
+ feature = "electrum",
+ feature = "esplora",
+ feature = "cbf",
+ feature = "rpc"
+))]
+use bdk_wallet::bitcoin::Transaction;
+use bdk_wallet::bitcoin::{secp256k1::Secp256k1, Txid};
use bdk_wallet::bitcoin::{Amount, FeeRate, Psbt, Sequence};
use bdk_wallet::descriptor::Segwitv0;
use bdk_wallet::keys::bip39::WordCount;
use bdk_wallet::keys::{DerivableKey, DescriptorKey, ExtendedKey, GeneratableKey, GeneratedKey};
use bdk_wallet::miniscript::miniscript;
use serde_json::json;
-use std::collections::{BTreeMap, HashSet};
+use std::collections::BTreeMap;
+#[cfg(any(
+ feature = "electrum",
+ feature = "esplora",
+ feature = "cbf",
+ feature = "rpc"
+))]
+use std::collections::HashSet;
use std::convert::TryFrom;
+#[cfg(feature = "repl")]
use std::io::Write;
use std::str::FromStr;
#[cfg(feature = "electrum")]
use crate::utils::BlockchainClient::Electrum;
use bdk_wallet::bitcoin::base64::prelude::*;
+#[cfg(any(
+ feature = "electrum",
+ feature = "esplora",
+ feature = "cbf",
+ feature = "rpc"
+))]
use bdk_wallet::bitcoin::consensus::Decodable;
+#[cfg(any(
+ feature = "electrum",
+ feature = "esplora",
+ feature = "cbf",
+ feature = "rpc"
+))]
use bdk_wallet::bitcoin::hex::FromHex;
#[cfg(feature = "esplora")]
use {crate::utils::BlockchainClient::Esplora, bdk_esplora::EsploraAsyncExt};
hash: genesis_block.block_hash(),
});
let mut emitter =
- Emitter::new(&client, genesis_cp.clone(), genesis_cp.height());
+ Emitter::new(&*client, genesis_cp.clone(), genesis_cp.height());
while let Some(block_event) = emitter.next_block()? {
wallet.apply_block_connected_to(
#[cfg(feature = "rpc")]
RpcClient { client } => {
let wallet_cp = wallet.latest_checkpoint();
- let mut emitter = Emitter::new(&client, wallet_cp.clone(), wallet_cp.height());
+ let mut emitter = Emitter::new(&*client, wallet_cp.clone(), wallet_cp.height());
while let Some(block_event) = emitter.next_block()? {
wallet.apply_block_connected_to(
} => client
.broadcast(&tx)
.await
- .map(|()| tx.compute_txid().clone())
+ .map(|()| tx.compute_txid())
.map_err(|e| Error::Generic(e.to_string()))?,
#[cfg(feature = "rpc")]
RpcClient { client } => client
} => {
let blockchain_client = new_blockchain_client(&wallet_opts)?;
let network = cli_opts.network;
- #[cfg(any(feature = "sqlite"))]
+ #[cfg(feature = "sqlite")]
let result = {
let home_dir = prepare_home_dir(cli_opts.datadir)?;
let wallet_name = &wallet_opts.wallet;
subcommand: WalletSubCommand::OfflineWalletSubCommand(offline_subcommand),
} => {
let network = cli_opts.network;
- #[cfg(any(feature = "sqlite"))]
+ #[cfg(feature = "sqlite")]
let result = {
let home_dir = prepare_home_dir(cli_opts.datadir)?;
let wallet_name = &wallet_opts.wallet;
#[cfg(feature = "repl")]
CliSubCommand::Repl { wallet_opts } => {
let network = cli_opts.network;
- #[cfg(any(feature = "sqlite"))]
+ #[cfg(feature = "sqlite")]
let (mut wallet, mut persister) = {
let wallet_name = &wallet_opts.wallet;
}
let result = respond(network, &mut wallet, &wallet_opts, line).await;
- #[cfg(any(feature = "sqlite"))]
+ #[cfg(feature = "sqlite")]
wallet.persist(&mut persister)?;
match result {
ReplSubCommand::Wallet {
subcommand: WalletSubCommand::OnlineWalletSubCommand(online_subcommand),
} => {
- let blockchain = new_blockchain_client(&wallet_opts).map_err(|e| e.to_string())?;
+ let blockchain = new_blockchain_client(wallet_opts).map_err(|e| e.to_string())?;
let value = handle_online_wallet_subcommand(wallet, blockchain, online_subcommand)
.await
.map_err(|e| e.to_string())?;
use crate::error::BDKCliError as Error;
use std::str::FromStr;
-#[cfg(any(feature = "sqlite"))]
+#[cfg(feature = "sqlite")]
use std::path::{Path, PathBuf};
use crate::commands::WalletOpts;
#[cfg(any(feature = "electrum", feature = "esplora", feature = "rpc"))]
use crate::commands::ClientType;
-#[cfg(any(feature = "sqlite",))]
-use bdk_wallet::{KeychainKind, PersistedWallet, WalletPersister};
-
-#[cfg(feature = "electrum")]
-use bdk_electrum;
use bdk_wallet::Wallet;
-
-#[cfg(feature = "esplora")]
-use bdk_esplora;
+#[cfg(feature = "sqlite")]
+use bdk_wallet::{KeychainKind, PersistedWallet, WalletPersister};
/// Parse the recipient (Address,Amount) argument from cli input.
pub(crate) fn parse_recipient(s: &str) -> Result<(ScriptBuf, u64), String> {
Ok(unchecked_address.assume_checked())
}
-#[cfg(any(feature = "sqlite",))]
+#[cfg(feature = "sqlite")]
/// Prepare bdk-cli home directory
///
/// This function is called to check if [`crate::CliOpts`] datadir is set.
}
/// Prepare wallet database directory.
-#[cfg(any(feature = "sqlite"))]
+#[cfg(feature = "sqlite")]
pub(crate) fn prepare_wallet_db_dir(
wallet_name: &Option<String>,
home_path: &Path,
pub(crate) enum BlockchainClient {
#[cfg(feature = "electrum")]
Electrum {
- client: bdk_electrum::BdkElectrumClient<bdk_electrum::electrum_client::Client>,
+ client: Box<bdk_electrum::BdkElectrumClient<bdk_electrum::electrum_client::Client>>,
batch_size: usize,
},
#[cfg(feature = "esplora")]
Esplora {
- client: bdk_esplora::esplora_client::AsyncClient,
+ client: Box<bdk_esplora::esplora_client::AsyncClient>,
parallel_requests: usize,
},
#[cfg(feature = "rpc")]
RpcClient {
- client: bdk_bitcoind_rpc::bitcoincore_rpc::Client,
+ client: Box<bdk_bitcoind_rpc::bitcoincore_rpc::Client>,
},
// TODO cbf
}
#[cfg(feature = "electrum")]
ClientType::Electrum => {
let client = bdk_electrum::electrum_client::Client::new(url)
- .map(|client| bdk_electrum::BdkElectrumClient::new(client))?;
+ .map(bdk_electrum::BdkElectrumClient::new)?;
BlockchainClient::Electrum {
- client,
+ client: Box::new(client),
batch_size: wallet_opts.batch_size,
}
}
ClientType::Esplora => {
let client = bdk_esplora::esplora_client::Builder::new(url).build_async()?;
BlockchainClient::Esplora {
- client,
+ client: Box::new(client),
parallel_requests: wallet_opts.parallel_requests,
}
}
#[cfg(feature = "rpc")]
- ClientType::RPC => {
+ ClientType::Rpc => {
let auth = match &wallet_opts.cookie {
Some(cookie) => bdk_bitcoind_rpc::bitcoincore_rpc::Auth::CookieFile(cookie.into()),
None => bdk_bitcoind_rpc::bitcoincore_rpc::Auth::UserPass(
};
let client = bdk_bitcoind_rpc::bitcoincore_rpc::Client::new(url, auth)
.map_err(|e| Error::Generic(e.to_string()))?;
- BlockchainClient::RpcClient { client }
+ BlockchainClient::RpcClient {
+ client: Box::new(client),
+ }
}
};
Ok(client)
}
-#[cfg(any(feature = "sqlite",))]
+#[cfg(feature = "sqlite")]
/// Create a new persisted wallet from given wallet configuration options.
pub(crate) fn new_persisted_wallet<P: WalletPersister>(
network: Network,