# Optional dependencies
sled = { version = "0.34", optional = true }
-electrum-client = { version = "0.3.0-beta.1", optional = true }
+electrum-client = { version = "0.4.0-beta.1", optional = true }
reqwest = { version = "0.10", optional = true, features = ["json"] }
futures = { version = "0.3", optional = true }
clap = { version = "2.33", optional = true }
//!
//! ```no_run
//! # use bdk::blockchain::electrum::ElectrumBlockchain;
-//! let client = electrum_client::Client::new("ssl://electrum.blockstream.info:50002", None)?;
+//! let client = electrum_client::Client::new("ssl://electrum.blockstream.info:50002")?;
//! let blockchain = ElectrumBlockchain::from(client);
//! # Ok::<(), bdk::Error>(())
//! ```
use bitcoin::{BlockHeader, Script, Transaction, Txid};
-use electrum_client::{Client, ElectrumApi};
+use electrum_client::{Client, ConfigBuilder, ElectrumApi, Socks5Config};
use self::utils::{ELSGetHistoryRes, ElectrumLikeSync};
use super::*;
#[cfg(feature = "test-electrum")]
#[bdk_blockchain_tests(crate)]
fn local_electrs() -> ElectrumBlockchain {
- ElectrumBlockchain::from(Client::new(&testutils::get_electrum_url(), None).unwrap())
+ ElectrumBlockchain::from(Client::new(&testutils::get_electrum_url()).unwrap())
}
impl std::convert::From<Client> for ElectrumBlockchain {
}
impl ElectrumLikeSync for Client {
- fn els_batch_script_get_history<'s, I: IntoIterator<Item = &'s Script>>(
+ fn els_batch_script_get_history<'s, I: IntoIterator<Item = &'s Script> + Clone>(
&self,
scripts: I,
) -> Result<Vec<Vec<ELSGetHistoryRes>>, Error> {
.map_err(Error::Electrum)
}
- fn els_batch_transaction_get<'s, I: IntoIterator<Item = &'s Txid>>(
+ fn els_batch_transaction_get<'s, I: IntoIterator<Item = &'s Txid> + Clone>(
&self,
txids: I,
) -> Result<Vec<Transaction>, Error> {
self.batch_transaction_get(txids).map_err(Error::Electrum)
}
- fn els_batch_block_header<I: IntoIterator<Item = u32>>(
+ fn els_batch_block_header<I: IntoIterator<Item = u32> + Clone>(
&self,
heights: I,
) -> Result<Vec<BlockHeader>, Error> {
pub struct ElectrumBlockchainConfig {
pub url: String,
pub socks5: Option<String>,
+ pub retry: u8,
+ pub timeout: u8,
}
impl ConfigurableBlockchain for ElectrumBlockchain {
type Config = ElectrumBlockchainConfig;
fn from_config(config: &Self::Config) -> Result<Self, Error> {
- Ok(ElectrumBlockchain(Client::new(
+ let socks5 = config.socks5.as_ref().map(Socks5Config::new);
+ let electrum_config = ConfigBuilder::new()
+ .retry(config.retry)
+ .socks5(socks5)?
+ .timeout(config.timeout)?
+ .build();
+
+ Ok(ElectrumBlockchain(Client::from_config(
config.url.as_str(),
- config.socks5.as_deref(),
+ electrum_config,
)?))
}
}
/// Implements the synchronization logic for an Electrum-like client.
#[maybe_async]
pub trait ElectrumLikeSync {
- fn els_batch_script_get_history<'s, I: IntoIterator<Item = &'s Script>>(
+ fn els_batch_script_get_history<'s, I: IntoIterator<Item = &'s Script> + Clone>(
&self,
scripts: I,
) -> Result<Vec<Vec<ELSGetHistoryRes>>, Error>;
- fn els_batch_transaction_get<'s, I: IntoIterator<Item = &'s Txid>>(
+ fn els_batch_transaction_get<'s, I: IntoIterator<Item = &'s Txid> + Clone>(
&self,
txids: I,
) -> Result<Vec<Transaction>, Error>;
- fn els_batch_block_header<I: IntoIterator<Item = u32>>(
+ fn els_batch_block_header<I: IntoIterator<Item = u32> + Clone>(
&self,
heights: I,
) -> Result<Vec<BlockHeader>, Error>;