Skip to content

Commit 837f024

Browse files
committed
feat: create example_wallet_electrum with redb
There is dependency problem with bdk_redb using bdk_wallet !!! Fixing version of wallet to use the one used by bdk_redb for now.
1 parent 4d3116a commit 837f024

2 files changed

Lines changed: 111 additions & 0 deletions

File tree

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[package]
2+
name = "example_wallet_electrum_redb"
3+
version = "0.1.0"
4+
edition = "2024"
5+
authors.workspace = true
6+
7+
[dependencies]
8+
anyhow = "1.0.98"
9+
bdk_electrum = "0.23.0"
10+
bdk_redb = { git = "https://github.com/110CodingP/bdk_redb" }
11+
bdk_wallet = { version = "2.0.0" }
12+
13+
[lints]
14+
workspace = true
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
use bdk_redb::Store;
2+
use bdk_wallet::Wallet;
3+
use std::io::Write;
4+
5+
use bdk_electrum::electrum_client;
6+
use bdk_electrum::BdkElectrumClient;
7+
use bdk_wallet::bitcoin::Amount;
8+
use bdk_wallet::bitcoin::Network;
9+
use bdk_wallet::chain::collections::HashSet;
10+
use bdk_wallet::{KeychainKind, SignOptions};
11+
12+
const SEND_AMOUNT: Amount = Amount::from_sat(5000);
13+
const STOP_GAP: usize = 50;
14+
const BATCH_SIZE: usize = 5;
15+
16+
const NETWORK: Network = Network::Testnet;
17+
const EXTERNAL_DESC: &str = "wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7h6Eziw3SpThFfczTDh5rW2krkqffa11UpX3XkeTTB2FvzZKWXqPY54Y6Rq4AQ5R8L/84'/1'/0'/0/*)";
18+
const INTERNAL_DESC: &str = "wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7h6Eziw3SpThFfczTDh5rW2krkqffa11UpX3XkeTTB2FvzZKWXqPY54Y6Rq4AQ5R8L/84'/1'/0'/1/*)";
19+
const ELECTRUM_URL: &str = "ssl://electrum.blockstream.info:60002";
20+
21+
fn main() -> Result<(), anyhow::Error> {
22+
let db_path = "bdk-electrum-example.db";
23+
let wallet_name = "wallet1";
24+
25+
let mut store = Store::new(db_path, wallet_name.to_string())?;
26+
27+
let wallet_opt = Wallet::load()
28+
.descriptor(KeychainKind::External, Some(EXTERNAL_DESC))
29+
.descriptor(KeychainKind::Internal, Some(INTERNAL_DESC))
30+
.extract_keys()
31+
.check_network(NETWORK)
32+
.load_wallet(&mut store)?;
33+
let mut wallet = match wallet_opt {
34+
Some(wallet) => wallet,
35+
None => Wallet::create(EXTERNAL_DESC, INTERNAL_DESC)
36+
.network(NETWORK)
37+
.create_wallet(&mut store)?,
38+
};
39+
40+
let address = wallet.next_unused_address(KeychainKind::External);
41+
wallet.persist(&mut store)?;
42+
println!("Generated Address: {}", address);
43+
44+
let balance = wallet.balance();
45+
println!("Wallet balance before syncing: {}", balance.total());
46+
47+
print!("Syncing...");
48+
let client = BdkElectrumClient::new(electrum_client::Client::new(ELECTRUM_URL)?);
49+
50+
// Populate the electrum client's transaction cache so it doesn't redownload transaction we
51+
// already have.
52+
client.populate_tx_cache(wallet.tx_graph().full_txs().map(|tx_node| tx_node.tx));
53+
54+
let request = wallet.start_full_scan().inspect({
55+
let mut stdout = std::io::stdout();
56+
let mut once = HashSet::<KeychainKind>::new();
57+
move |k, spk_i, _| {
58+
if once.insert(k) {
59+
print!("\nScanning keychain [{:?}]", k);
60+
}
61+
print!(" {:<3}", spk_i);
62+
stdout.flush().expect("must flush");
63+
}
64+
});
65+
66+
let update = client.full_scan(request, STOP_GAP, BATCH_SIZE, false)?;
67+
68+
println!();
69+
70+
wallet.apply_update(update)?;
71+
wallet.persist(&mut store)?;
72+
73+
let balance = wallet.balance();
74+
println!("Wallet balance after syncing: {}", balance.total());
75+
76+
if balance.total() < SEND_AMOUNT {
77+
println!(
78+
"Please send at least {} to the receiving address",
79+
SEND_AMOUNT
80+
);
81+
std::process::exit(0);
82+
}
83+
84+
let mut tx_builder = wallet.build_tx();
85+
tx_builder.add_recipient(address.script_pubkey(), SEND_AMOUNT);
86+
87+
let mut psbt = tx_builder.finish()?;
88+
let finalized = wallet.sign(&mut psbt, SignOptions::default())?;
89+
assert!(finalized);
90+
91+
let tx = psbt.extract_tx()?;
92+
client.transaction_broadcast(&tx)?;
93+
println!("Tx broadcasted! Txid: {}", tx.compute_txid());
94+
95+
Ok(())
96+
}
97+

0 commit comments

Comments
 (0)