bdk_turso 0.2.4

Turso persistence backend for BDK
Documentation
use bdk_bitcoind_rpc::{
    Emitter, NO_EXPECTED_MEMPOOL_TXS,
    bitcoincore_rpc::{Auth, Client},
};
use bdk_turso::Store;
use bdk_wallet::bitcoin;
use bdk_wallet::{KeychainKind, Wallet};

const DB_PATH: &str = "polar.db";
const NETWORK: bitcoin::Network = bitcoin::Network::Regtest;
const POLAR_RPC_URL: &str = "http://127.0.0.1:18443";
const EXTERNAL_DESC: &str = "wpkh([dae5422f/84'/1'/0'/0]tprv8iPUhjo2Rrs6maF8A3EuTbp8JxxtsuHU4Fwfdk6Qz74G4HqBwy38rpfwKpGyunHdTqxig4kMScbiTFf5h1NmekZfiVNeHEPrwESWMCLU2B8/*)";
const INTERNAL_DESC: &str = "wpkh([dae5422f/84'/1'/0'/1]tprv8iPUhjo2Rrs6oiZHqEo3GdtJhHXy3uyFGPg7VaFehs4PhAGiivUG7XHWsdK6W7G1VygXkuJ1Cau5mV6uiy7EfviZkHcAg7a4yyYoJpV59Ub/*)";

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let rpc_url = std::env::var("POLAR_RPC_URL").unwrap_or_else(|_| POLAR_RPC_URL.to_owned());
    let rpc_user = std::env::var("POLAR_RPC_USER")?;
    let rpc_pass = std::env::var("POLAR_RPC_PASS")?;
    let rpc = Client::new(&rpc_url, Auth::UserPass(rpc_user, rpc_pass))?;

    let mut store = Store::new(DB_PATH).await?;
    let mut wallet = match Wallet::load()
        .descriptor(KeychainKind::External, Some(EXTERNAL_DESC))
        .descriptor(KeychainKind::Internal, Some(INTERNAL_DESC))
        .check_network(NETWORK)
        .load_wallet_async(&mut store)
        .await?
    {
        Some(wallet) => wallet,
        None => {
            Wallet::create(EXTERNAL_DESC, INTERNAL_DESC)
                .network(NETWORK)
                .create_wallet_async(&mut store)
                .await?
        }
    };

    let address = wallet.reveal_next_address(KeychainKind::External);
    wallet.persist_async(&mut store).await?;
    println!("Receive address: {}", address.address);

    let wallet_tip = wallet.latest_checkpoint();
    let mut emitter = Emitter::new(
        &rpc,
        wallet_tip.clone(),
        wallet_tip.height(),
        NO_EXPECTED_MEMPOOL_TXS,
    );
    let mut blocks_synced = 0;
    while let Some(block) = emitter.next_block()? {
        wallet.apply_block_connected_to(
            &block.block,
            block.block_height(),
            block.connected_to(),
        )?;
        blocks_synced += 1;
    }

    wallet.persist_async(&mut store).await?;
    println!("Synced {blocks_synced} blocks from Bitcoin Core RPC");
    println!("Balance: {}", wallet.balance().total());
    Ok(())
}