"memchr",
]
+[[package]]
+name = "anyhow"
+version = "1.0.95"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04"
+
[[package]]
name = "arrayvec"
version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
-[[package]]
-name = "base64"
-version = "0.22.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
-
-[[package]]
-name = "base64-compat"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a8d4d2746f89841e49230dd26917df1876050f95abafafbe34f47cb534b88d7"
-dependencies = [
- "byteorder",
-]
-
[[package]]
name = "base64ct"
version = "1.6.0"
dependencies = [
"bdk_core",
"bitcoin 0.32.5",
- "bitcoincore-rpc 0.19.0",
+ "bitcoincore-rpc",
]
[[package]]
checksum = "b272d5a3228799f7c917255fe26e788f6c29dd4a084a342d274a44352bbc0915"
dependencies = [
"bdk_core",
- "electrum-client 0.22.0",
+ "electrum-client",
]
[[package]]
"unicode-normalization",
]
-[[package]]
-name = "bitcoin"
-version = "0.29.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0694ea59225b0c5f3cb405ff3f670e4828358ed26aec49dc352f730f0cb1a8a3"
-dependencies = [
- "bech32 0.9.1",
- "bitcoin_hashes 0.11.0",
- "secp256k1 0.24.3",
- "serde",
-]
-
[[package]]
name = "bitcoin"
version = "0.30.2"
"serde",
]
-[[package]]
-name = "bitcoin_hashes"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90064b8dee6815a6470d60bad07bbbaee885c0e12d04177138fa3291a01b7bc4"
-dependencies = [
- "serde",
-]
-
[[package]]
name = "bitcoin_hashes"
version = "0.12.0"
"libc",
]
-[[package]]
-name = "bitcoincore-rpc"
-version = "0.16.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0261b2bb7617e0c91b452a837bbd1291fd34ad6990cb8e3ffc28239cc045b5ca"
-dependencies = [
- "bitcoincore-rpc-json 0.16.0",
- "jsonrpc 0.12.1",
- "log",
- "serde",
- "serde_json",
-]
-
[[package]]
name = "bitcoincore-rpc"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aedd23ae0fd321affb4bbbc36126c6f49a32818dc6b979395d24da8c9d4e80ee"
dependencies = [
- "bitcoincore-rpc-json 0.19.0",
- "jsonrpc 0.18.0",
+ "bitcoincore-rpc-json",
+ "jsonrpc",
"log",
"serde",
"serde_json",
]
-[[package]]
-name = "bitcoincore-rpc-json"
-version = "0.16.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c231bea28e314879c5aef240f6052e8a72a369e3c9f9b20d9bfbb33ad18029b2"
-dependencies = [
- "bitcoin 0.29.2",
- "serde",
- "serde_json",
-]
-
[[package]]
name = "bitcoincore-rpc-json"
version = "0.19.0"
"serde_json",
]
-[[package]]
-name = "bitcoind"
-version = "0.28.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0716f11ae8033a7fe9c4aa06e9dbd798fb74d13d15bd890fedc10c996bf448a"
-dependencies = [
- "bitcoin_hashes 0.11.0",
- "bitcoincore-rpc 0.16.0",
- "filetime",
- "flate2",
- "log",
- "tar",
- "tempfile",
- "time",
- "ureq",
- "which",
- "zip",
-]
-
[[package]]
name = "bitflags"
version = "1.3.2"
[[package]]
name = "cc"
-version = "1.2.12"
+version = "1.2.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "755717a7de9ec452bf7f3f1a3099085deabd7f2962b861dae91ecd7a365903d2"
+checksum = "c7777341816418c02e033934a09f20dc0ccaf65a5201ef8a450ae0105a573fda"
dependencies = [
"jobserver",
"libc",
[[package]]
name = "cmake"
-version = "0.1.53"
+version = "0.1.54"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e24a03c8b52922d68a1589ad61032f2c1aa5a8158d2aa0d93c6e9534944bbad6"
+checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0"
dependencies = [
"cc",
]
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+[[package]]
+name = "corepc-client"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb85495f0577f4765ea2ece0a69003d38acdddba2ac06bdde180ac2b969a9a63"
+dependencies = [
+ "bitcoin 0.32.5",
+ "corepc-types",
+ "jsonrpc",
+ "log",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "corepc-node"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "887faf7fdf38a5b99b3efb69e18e27fb9de77c812c5c48956a8076c7f9076b99"
+dependencies = [
+ "anyhow",
+ "corepc-client",
+ "log",
+ "serde_json",
+ "tempfile",
+ "which",
+]
+
+[[package]]
+name = "corepc-types"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "282d9bd7fd9d944471a0c0ad44fd1581acd87a79739652c5455ffdae25177db6"
+dependencies = [
+ "bitcoin 0.32.5",
+ "bitcoin-internals 0.3.0",
+ "serde",
+ "serde_json",
+]
+
[[package]]
name = "cpufeatures"
version = "0.2.17"
[[package]]
name = "electrsd"
-version = "0.22.2"
+version = "0.31.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a51f3d3808c1ec7e7e0b434fd9e2be0e5ac973441c9929395ab2b14a952333d9"
+checksum = "eaa7f6661c5890f51f09f54fb225cd37058202cf0ba53dbbd92a4374fe035904"
dependencies = [
- "bitcoin_hashes 0.11.0",
- "bitcoind",
- "electrum-client 0.12.1",
+ "bitcoin_hashes 0.14.0",
+ "corepc-client",
+ "corepc-node",
+ "electrum-client",
"log",
+ "minreq",
"nix 0.25.1",
- "ureq",
+ "which",
"zip",
]
-[[package]]
-name = "electrum-client"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8e1e1e452aef3ee772d19cc6272ef642f22ce0f4a9fb715ffe98010934e2ae1"
-dependencies = [
- "bitcoin 0.29.2",
- "log",
- "serde",
- "serde_json",
-]
-
[[package]]
name = "electrum-client"
version = "0.22.0"
"rustls 0.23.22",
"serde",
"serde_json",
- "webpki-roots 0.25.4",
+ "webpki-roots",
"winapi",
]
"windows-sys 0.28.0",
]
-[[package]]
-name = "filetime"
-version = "0.2.25"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586"
-dependencies = [
- "cfg-if",
- "libc",
- "libredox",
- "windows-sys 0.59.0",
-]
-
[[package]]
name = "flate2"
version = "1.0.35"
"wasm-bindgen",
]
-[[package]]
-name = "jsonrpc"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f8423b78fc94d12ef1a4a9d13c348c9a78766dda0cc18817adf0faf77e670c8"
-dependencies = [
- "base64-compat",
- "serde",
- "serde_derive",
- "serde_json",
-]
-
[[package]]
name = "jsonrpc"
version = "0.18.0"
dependencies = [
"bitflags 2.8.0",
"libc",
- "redox_syscall",
]
[[package]]
"rustls-webpki 0.101.7",
"serde",
"serde_json",
- "webpki-roots 0.25.4",
+ "webpki-roots",
]
[[package]]
"aws-lc-rs",
"log",
"once_cell",
- "ring",
"rustls-pki-types",
"rustls-webpki 0.102.8",
"subtle",
"secp256k1-sys 0.5.2",
]
-[[package]]
-name = "secp256k1"
-version = "0.24.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6b1629c9c557ef9b293568b338dddfc8208c98a18c59d722a9d53f859d9c9b62"
-dependencies = [
- "bitcoin_hashes 0.11.0",
- "secp256k1-sys 0.6.1",
- "serde",
-]
-
[[package]]
name = "secp256k1"
version = "0.27.0"
"cc",
]
-[[package]]
-name = "secp256k1-sys"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "83080e2c2fc1006e625be82e5d1eb6a43b7fd9578b617fcc55814daf286bba4b"
-dependencies = [
- "cc",
-]
-
[[package]]
name = "secp256k1-sys"
version = "0.8.1"
"libc",
]
-[[package]]
-name = "tar"
-version = "0.4.43"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6"
-dependencies = [
- "filetime",
- "libc",
- "xattr",
-]
-
[[package]]
name = "target-lexicon"
version = "0.12.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
-[[package]]
-name = "ureq"
-version = "2.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d"
-dependencies = [
- "base64 0.22.1",
- "flate2",
- "log",
- "once_cell",
- "rustls 0.23.22",
- "rustls-pki-types",
- "url",
- "webpki-roots 0.26.8",
-]
-
[[package]]
name = "url"
version = "2.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1"
-[[package]]
-name = "webpki-roots"
-version = "0.26.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9"
-dependencies = [
- "rustls-pki-types",
-]
-
[[package]]
name = "which"
version = "4.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51"
-[[package]]
-name = "xattr"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e105d177a3871454f754b33bb0ee637ecaaac997446375fd3e5d43a2ed00c909"
-dependencies = [
- "libc",
- "linux-raw-sys",
- "rustix",
-]
-
[[package]]
name = "yoke"
version = "0.7.5"
fd-lock = { version = "=3.0.2", optional = true }
regex = { version = "1", optional = true }
bdk-reserves = {version = "0.29.0", optional = true}
-electrsd = { version= "0.22", features = ["bitcoind_22_0"], optional = true}
+electrsd = { version= "0.31.0", optional = true}
bdk_electrum ={ version = "0.20.1", optional = true}
bdk_esplora ={ version = "0.15.0", features = ["async"], optional = true}
bdk_bitcoind_rpc = {version = "0.17.1", optional = true}
#[error("Create transaction error: {0}")]
CreateTx(#[from] bdk_wallet::error::CreateTxError),
+ #[error("CoreRPC error: {0}")]
+ CoreRPCError(#[from] electrsd::corepc_client::client_sync::Error),
+
#[error("Descriptor error: {0}")]
DescriptorError(#[from] bdk_wallet::descriptor::error::Error),
#[cfg(feature = "regtest-node")]
use {
- crate::commands::NodeSubCommand,
- bdk_wallet::{
- bitcoin::{Address, Amount},
- Error,
- },
- electrsd::bitcoind::bitcoincore_rpc::{Client, RpcApi},
+ crate::{commands::NodeSubCommand, error::BDKCliError as Error},
+ bdk_wallet::bitcoin::{Address, Amount},
+ electrsd::corepc_node::{Client, Node},
serde_json::Value,
std::str::FromStr,
};
#[cfg(feature = "regtest-bitcoin")]
/// A bitcoin core backend. Wallet connected to it via RPC.
Bitcoin {
- bitcoind: Box<electrsd::bitcoind::BitcoinD>,
+ bitcoind: Box<Node>,
},
#[cfg(feature = "regtest-electrum")]
/// An Electrum backend with an underlying bitcoin core
/// Wallet connected to it, via the electrum url.
Electrum {
- bitcoind: Box<electrsd::bitcoind::BitcoinD>,
+ bitcoind: Box<Node>,
electrsd: Box<electrsd::ElectrsD>,
},
/// An Esplora backend with an underlying bitcoin core
/// Wallet connected to it, via the esplora url.
#[cfg(any(feature = "regtest-esplora-ureq", feature = "regtest-esplora-reqwest"))]
Esplora {
- bitcoind: Box<electrsd::bitcoind::BitcoinD>,
+ bitcoind: Box<Node>,
esplorad: Box<electrsd::ElectrsD>,
},
}
pub fn exec_cmd(&self, cmd: NodeSubCommand) -> Result<serde_json::Value, Error> {
let client = self.get_client()?;
match cmd {
- NodeSubCommand::GetInfo => Ok(serde_json::to_value(
- client
- .get_blockchain_info()
- .map_err(|e| Error::Generic(e.to_string()))?,
- )?),
-
- NodeSubCommand::GetNewAddress => Ok(serde_json::to_value(
- client
- .get_new_address(None, None)
- .map_err(|e| Error::Generic(e.to_string()))?,
- )?),
+ NodeSubCommand::GetInfo => Ok(serde_json::to_value(client.get_blockchain_info()?)?),
+ NodeSubCommand::GetNewAddress => Ok(serde_json::to_value(client.new_address()?)?),
NodeSubCommand::Generate { block_num } => {
- let core_addrs = client
- .get_new_address(None, None)
- .map_err(|e| Error::Generic(e.to_string()))?;
- let block_hashes = client
- .generate_to_address(block_num, &core_addrs)
- .map_err(|e| Error::Generic(e.to_string()))?;
+ let core_addrs = client.new_address()?;
+ let block_hashes = client.generate_to_address(block_num as usize, &core_addrs)?;
Ok(serde_json::to_value(block_hashes)?)
}
- NodeSubCommand::GetBalance => Ok(serde_json::to_value(
- client
- .get_balance(None, None)
- .map_err(|e| Error::Generic(e.to_string()))?
- .to_string(),
- )?),
+ NodeSubCommand::GetBalance => Ok(serde_json::to_value(client.get_balance()?)?),
NodeSubCommand::SendToAddress { address, amount } => {
- let address =
- Address::from_str(&address).map_err(|e| Error::Generic(e.to_string()))?;
+ let address = Address::from_str(&address)?.assume_checked();
let amount = Amount::from_sat(amount);
- let txid = client
- .send_to_address(&address, amount, None, None, None, None, None, None)
- .map_err(|e| Error::Generic(e.to_string()))?;
+ let txid = client.send_to_address(&address, amount)?;
Ok(serde_json::to_value(&txid)?)
}
.iter()
.map(|arg| serde_json::Value::from_str(arg))
.collect::<Result<Vec<Value>, _>>()?;
- client
- .call::<Value>(cmd, &args)
- .map_err(|e| Error::Generic(e.to_string()))
+ Ok(client.call::<Value>(cmd, &args)?)
}
}
}
#[cfg(feature = "regtest-bitcoin")]
Self::Bitcoin { bitcoind } => Ok(&bitcoind.client),
#[cfg(feature = "regtest-electrum")]
- Self::Electrum { bitcoind, .. } => Ok(&bitcoind.client),
+ Self::Electrum { bitcoind, .. } => Ok(&bitcoind.client), // question: shouldn't we initialize electrsd with bitcoind?
#[cfg(any(feature = "regtest-esplora-ureq", feature = "regtest-esplora-reqwest"))]
Self::Esplora { bitcoind, .. } => Ok(&bitcoind.client),
}