Skip to content

Commit 16bad63

Browse files
committed
feat: add electrum example showing basic syncing
Also shows how to build `KeychainKind`-based wallets using the new `KeyRing`.
1 parent e856c89 commit 16bad63

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ path = "."
2525
[dev-dependencies]
2626
anyhow = "1"
2727
tempfile = "3.21.0"
28+
bdk_electrum = {version = "0.23.1"}
2829

2930
[[example]]
3031
name = "keyring"
@@ -37,3 +38,6 @@ required-features = ["rusqlite"]
3738
[[example]]
3839
name = "default_keychain"
3940
required-features = ["rusqlite"]
41+
42+
[[example]]
43+
name = "electrum_example"

examples/electrum_example.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
use bdk_wallet::KeychainKind;
2+
use bitcoin::Network;
3+
use multi_keychain_wallet::multi_keychain::{KeyRing, Wallet};
4+
5+
use bdk_electrum::{electrum_client::Client, BdkElectrumClient};
6+
7+
const STOP_GAP: usize = 50;
8+
const BATCH_SIZE: usize = 5;
9+
const EXTERNAL_DESCRIPTOR: &str = "tr(tprv8ZgxMBicQKsPdrjwWCyXqqJ4YqcyG4DmKtjjsRt29v1PtD3r3PuFJAjWytzcvSTKnZAGAkPSmnrdnuHWxCAwy3i1iPhrtKAfXRH7dVCNGp6/86'/1'/0'/0/*)#g9xn7wf9";
10+
const INTERNAL_DESCRIPTOR: &str = "tr(tprv8ZgxMBicQKsPdrjwWCyXqqJ4YqcyG4DmKtjjsRt29v1PtD3r3PuFJAjWytzcvSTKnZAGAkPSmnrdnuHWxCAwy3i1iPhrtKAfXRH7dVCNGp6/86'/1'/0'/1/*)#e3rjrmea";
11+
12+
fn main() {
13+
// Construct wallet
14+
let mut keyring =
15+
KeyRing::<KeychainKind>::new(Network::Signet, KeychainKind::External, EXTERNAL_DESCRIPTOR);
16+
keyring.add_descriptor(KeychainKind::Internal, INTERNAL_DESCRIPTOR, false);
17+
18+
let mut wallet = Wallet::new(keyring);
19+
20+
let balance = wallet.balance();
21+
println!("Balance before syncing: {} sats", balance.total().to_sat());
22+
23+
// Reveal address
24+
let address = wallet.reveal_next_default_address_unwrap();
25+
println!("Address revealed: {}", address.address);
26+
27+
let client = BdkElectrumClient::new(Client::new("ssl://mempool.space:60602").unwrap());
28+
29+
// Perform sync
30+
let sync_request = wallet.start_sync_with_revealed_spks();
31+
let update = client.sync(sync_request, BATCH_SIZE, true).unwrap();
32+
33+
wallet.apply_update(update);
34+
35+
let balance = wallet.balance();
36+
println!("Balance after sync: {} sats", balance.total().to_sat());
37+
38+
// Perform full scan
39+
let full_scan_request = wallet.start_full_scan();
40+
let update = client
41+
.full_scan(full_scan_request, STOP_GAP, BATCH_SIZE, true)
42+
.unwrap();
43+
44+
wallet.apply_update(update);
45+
46+
let balance = wallet.balance();
47+
println!("Balance after full scan: {} sats", balance.total().to_sat());
48+
}

0 commit comments

Comments
 (0)