Crate rustywallet_electrum

Crate rustywallet_electrum 

Source
Expand description

§rustywallet-electrum

Electrum protocol client for Bitcoin balance checking and UTXO fetching.

This crate provides an async client for communicating with Electrum servers, allowing you to query blockchain data without rate limits.

§Features

  • Balance checking - Get confirmed and unconfirmed balance for any address
  • Batch queries - Check multiple addresses efficiently in a single request
  • UTXO listing - Get unspent outputs for transaction building
  • Transaction operations - Get raw transactions and broadcast signed ones
  • TLS support - Secure connections to Electrum servers
  • Certificate pinning - Enhanced security with SSL certificate pinning
  • Server discovery - DNS-based server discovery
  • Connection pooling - Efficient connection management
  • Real-time subscriptions - Address and header change notifications

§Quick Start

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 server connection
    let version = client.server_version().await?;
    println!("Connected to: {}", version.server_software);
     
    // Get 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?;
    for (addr, bal) in addresses.iter().zip(balances.iter()) {
        println!("{}: {} sats", addr, bal.confirmed);
    }
     
    Ok(())
}

§Server Discovery

use rustywallet_electrum::discovery::ServerDiscovery;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let discovery = ServerDiscovery::new();
    let best = discovery.best_server().await?;
    println!("Best server: {} ({}ms)", best.hostname, best.latency_ms.unwrap_or(0));
    Ok(())
}

§Connection Pooling

use rustywallet_electrum::{ClientConfig, pool::{ConnectionPool, PoolConfig}};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let config = ClientConfig::ssl("electrum.blockstream.info");
    let pool = ConnectionPool::new(config, PoolConfig::default());
    pool.initialize().await?;
     
    let client = pool.acquire().await?;
    let balance = client.get_balance("1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa").await?;
    // Connection automatically returned to pool when dropped
    Ok(())
}

§Address Support

All Bitcoin address types are supported:

  • P2PKH (1…)
  • P2SH (3…)
  • P2WPKH (bc1q…)
  • P2WSH (bc1q… longer)
  • P2TR (bc1p…)

§Public Servers

Built-in list of public Electrum servers:

  • electrum.blockstream.info:50002 (SSL)
  • electrum1.bluewallet.io:443 (SSL)
  • bitcoin.aranguren.org:50002 (SSL)

§Custom Configuration

use rustywallet_electrum::{ElectrumClient, ClientConfig};
use std::time::Duration;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    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?;
    Ok(())
}

Re-exports§

pub use client::ElectrumClient;
pub use error::ElectrumError;
pub use error::Result;
pub use scripthash::address_to_scripthash;
pub use scripthash::addresses_to_scripthashes;
pub use types::Balance;
pub use types::ClientConfig;
pub use types::ServerVersion;
pub use types::TxHistory;
pub use types::Utxo;
pub use types::DEFAULT_SERVERS;
pub use batch::BatchRequest;
pub use batch::BatchResponse;
pub use batch::GapLimitScanner;
pub use batch::ParallelBatchExecutor;
pub use discovery::DiscoveredServer;
pub use discovery::ServerDiscovery;
pub use discovery::DNS_SEEDS;
pub use pinning::CertFingerprint;
pub use pinning::CertPinStore;
pub use pinning::PinningConfigBuilder;
pub use pool::ConnectionPool;
pub use pool::PoolConfig;
pub use pool::PoolStats;
pub use pool::PooledClient;
pub use subscription::AddressStatusEvent;
pub use subscription::AddressWatcher;
pub use subscription::BlockHeaderEvent;
pub use subscription::ConnectionStatus;
pub use subscription::SubscriptionClient;
pub use subscription::SubscriptionEvent;
pub use subscription::SubscriptionManager;

Modules§

batch
Optimized batch request utilities.
client
Electrum client for blockchain queries.
discovery
Server discovery via DNS seeds.
error
Error types for Electrum client operations.
pinning
SSL certificate pinning for enhanced security.
pool
Connection pooling for Electrum clients.
scripthash
Address to scripthash conversion utilities.
subscription
Real-time subscriptions for Electrum protocol.
transport
Transport layer for Electrum protocol communication.
types
Data types for Electrum protocol responses.