| Crates.io | rustywallet-electrum |
| lib.rs | rustywallet-electrum |
| version | 0.2.0 |
| created_at | 2026-01-02 09:22:43.27492+00 |
| updated_at | 2026-01-02 23:34:09.319797+00 |
| description | Electrum protocol client for Bitcoin balance checking and UTXO fetching |
| homepage | |
| repository | https://github.com/nirvagold/rustywallet |
| max_upload_size | |
| id | 2018211 |
| size | 133,320 |
Electrum protocol client for Bitcoin balance checking and UTXO fetching.
use rustywallet_electrum::{ElectrumClient, ClientConfig};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Connect to a public Electrum server
let client = ElectrumClient::new("electrum.blockstream.info").await?;
// Check balance for an address
let balance = client.get_balance("1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa").await?;
println!("Confirmed: {} sats", balance.confirmed);
println!("Unconfirmed: {} sats", balance.unconfirmed);
// Batch check multiple addresses
let addresses = vec![
"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
"3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy",
];
let balances = client.get_balances(&addresses).await?;
Ok(())
}
Find the best server automatically:
use rustywallet_electrum::discovery::ServerDiscovery;
let discovery = ServerDiscovery::new();
let best = discovery.best_server().await?;
println!("Best server: {} ({}ms)", best.hostname, best.latency_ms.unwrap_or(0));
let client = ElectrumClient::with_config(best.to_ssl_config()).await?;
Manage multiple connections efficiently:
use rustywallet_electrum::{ClientConfig, pool::{ConnectionPool, PoolConfig}};
let config = ClientConfig::ssl("electrum.blockstream.info");
let pool = ConnectionPool::new(config, PoolConfig::default());
pool.initialize().await?;
// Acquire connection from pool
let client = pool.acquire().await?;
let balance = client.get_balance("1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa").await?;
// Connection automatically returned when dropped
Efficiently query multiple addresses:
use rustywallet_electrum::BatchRequest;
let response = BatchRequest::new(&client)
.balances(["addr1", "addr2", "addr3"])
.utxos(["addr1", "addr2"])
.execute()
.await?;
println!("Total confirmed: {} sats", response.total_confirmed());
println!("Funded addresses: {:?}", response.funded_addresses());
Monitor addresses for changes:
use rustywallet_electrum::{SubscriptionClient, ClientConfig};
let client = SubscriptionClient::new(ClientConfig::default()).await?;
// Subscribe to address
let status = client.subscribe_address("1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa").await?;
// Subscribe to new blocks
let header = client.subscribe_headers().await?;
println!("Current height: {}", header.height);
// Listen for events
let mut rx = client.subscribe();
while let Ok(event) = rx.recv().await {
match event {
SubscriptionEvent::AddressStatus(e) => println!("Address {} changed", e.address),
SubscriptionEvent::BlockHeader(e) => println!("New block: {}", e.height),
_ => {}
}
}
Enhanced security with certificate pinning:
use rustywallet_electrum::pinning::{CertFingerprint, PinningConfigBuilder};
let tls_config = PinningConfigBuilder::new()
.pin_hex("electrum.blockstream.info", "abc123...")?
.allow_unpinned(false)
.build();
All Bitcoin address types are supported:
use rustywallet_electrum::ClientConfig;
use std::time::Duration;
let config = ClientConfig::ssl("electrum.blockstream.info")
.with_port(50002)
.with_timeout(Duration::from_secs(60))
.with_retry(5, Duration::from_secs(2));
let client = ElectrumClient::with_config(config).await?;
Built-in list of public Electrum servers:
electrum.blockstream.info:50002 (SSL)electrum1.bluewallet.io:443 (SSL)bitcoin.aranguren.org:50002 (SSL)get_balance(address) - Get balance for single addressget_balances(addresses) - Batch balance checklist_unspent(address) - List UTXOs for addressget_transaction(txid) - Get raw transactionbroadcast(raw_tx) - Broadcast signed transactionget_history(address) - Get transaction historyserver_version() - Get server versionping() - Check connectionget_block_height() - Get current block heightestimate_fee(blocks) - Estimate fee rateServerDiscovery::new() - Create discovery servicebest_server() - Find lowest latency serverreachable_servers() - Get all reachable serversConnectionPool::new() - Create connection poolacquire() - Get connection from poolstats() - Get pool statisticssubscribe_address(address) - Subscribe to address changessubscribe_headers() - Subscribe to new blockssubscribe() - Get event receiverBatchRequest::new() - Create batch builderGapLimitScanner - Scan with gap limitMIT