silent-tweak-sdk 0.1.0

Zero-trust BIP352 Silent Payment client SDK — local scan key, verifiable tweaks, delta sync.
Documentation
//! Basic scan example.
//!
//! Shows the minimal usage of `SilentTweakClient` to scan a range of blocks
//! for Silent Payment outputs.
//!
//! ## Run
//!
//! ```bash
//! # Start the server first (see silent-tweak-server README)
//! cargo run -p silent-tweak-server -- --rpc-url http://localhost:18443 \
//!   --rpc-user bitcoin --rpc-pass secret --network regtest
//!
//! # Then run this example:
//! cargo run -p silent-tweak-sdk --example basic_scan
//! ```

use silent_tweak_sdk::{ScanKeys, SilentTweakClient, SilentTweakClientConfig};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    tracing_subscriber::fmt()
        .with_env_filter("silent_tweak_sdk=debug,info")
        .init();

    // Substitute your actual key material here.
    // NEVER hard-code real keys in production!
    let b_scan_bytes =
        hex::decode("0000000000000000000000000000000000000000000000000000000000000001")?;
    let b_spend_bytes =
        hex::decode("0000000000000000000000000000000000000000000000000000000000000002")?;

    let keys = ScanKeys::from_secret_bytes(&b_scan_bytes, &b_spend_bytes)?;

    let cfg = SilentTweakClientConfig {
        server_url: "http://localhost:8080".into(),
        verify_commitments: true,
        use_filters: true,
        ..SilentTweakClientConfig::new("http://localhost:8080")
    };

    let client = SilentTweakClient::new(keys, cfg)?;

    // Query server info.
    let info = client.server_info().await?;
    println!(
        "Server: {} ({}) — blocks {}-{}",
        info.version, info.network, info.first_indexed_height, info.last_indexed_height,
    );

    // Scan a small range.
    let from = info.first_indexed_height;
    let to = from + 99;
    println!("Scanning blocks {from}..{to}...");
    let payments = client.scan_range(from, to).await?;

    if payments.is_empty() {
        println!("No Silent Payment outputs found in this range.");
    } else {
        println!("Found {} payment(s):", payments.len());
        for p in &payments {
            println!(
                "  block={} txid={} pubkey={}",
                p.block_height,
                p.txid,
                p.output.pubkey_hex()
            );
        }
    }

    Ok(())
}