Skip to content

Commit a88e4f4

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

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
@@ -21,6 +21,7 @@ path = "."
2121
[dev-dependencies]
2222
anyhow = "1"
2323
tempfile = "3.21.0"
24+
bdk_electrum = {version = "0.23.1"}
2425

2526
[[example]]
2627
name = "keyring"
@@ -33,3 +34,6 @@ required-features = ["rusqlite"]
3334
[[example]]
3435
name = "default_keychain"
3536
required-features = ["rusqlite"]
37+
38+
[[example]]
39+
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)