Skip to content

Commit 2cfe1f6

Browse files
committed
add esplora_backend example.
1 parent 8d9be31 commit 2cfe1f6

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed

Cargo.toml

+5
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,11 @@ required-features = ["keys-bip39", "key-value-db", "rpc"]
120120
name = "electrum_backend"
121121
path = "examples/electrum_backend.rs"
122122

123+
[[example]]
124+
name = "esplora_backend"
125+
path = "examples/esplora_backend.rs"
126+
required-features = ["use-esplora-ureq"]
127+
123128
[workspace]
124129
members = ["macros"]
125130
[package.metadata.docs.rs]

examples/esplora_backend.rs

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
use std::str::FromStr;
2+
3+
use bdk::{database::MemoryDatabase, blockchain::esplora::EsploraBlockchain, Wallet, KeychainKind, template::Bip84, SyncOptions, wallet::{AddressIndex, export::FullyNodedExport}};
4+
use bitcoin::{Network, util::bip32::{ExtendedPrivKey, self}};
5+
use bdk::blockchain::Blockchain;
6+
7+
pub mod utils;
8+
9+
use crate::utils::tx::build_signed_tx;
10+
11+
fn main() {
12+
let network = Network::Testnet;
13+
14+
let xpriv = "tprv8ZgxMBicQKsPcx5nBGsR63Pe8KnRUqmbJNENAfGftF3yuXoMMoVJJcYeUw5eVkm9WBPjWYt6HMWYJNesB5HaNVBaFc1M6dRjWSYnmewUMYy";
15+
16+
let esplora_url = "http://blockstream.info/testnet/api";
17+
18+
run(&network, esplora_url, xpriv);
19+
}
20+
21+
pub fn load_or_create_wallet(
22+
network: &Network,
23+
xpriv: &ExtendedPrivKey
24+
) -> Wallet<MemoryDatabase> {
25+
let wallet = Wallet::new(
26+
Bip84(*xpriv, KeychainKind::External),
27+
Some(Bip84(*xpriv, KeychainKind::Internal)),
28+
*network,
29+
MemoryDatabase::default()
30+
)
31+
.unwrap();
32+
33+
wallet
34+
}
35+
pub fn run(network: &Network, esplora_url: &str, xpriv: &str) {
36+
let xpriv = bip32::ExtendedPrivKey::from_str(xpriv).unwrap();
37+
38+
let blockchain = EsploraBlockchain::new(esplora_url, 20);
39+
40+
let wallet = load_or_create_wallet(&network, &xpriv);
41+
42+
wallet.sync(&blockchain, SyncOptions::default()).unwrap();
43+
44+
let address = wallet.get_address(AddressIndex::New).unwrap().address;
45+
46+
println!("address: {}", address);
47+
48+
let balance = wallet.get_balance().unwrap();
49+
50+
println!("balance: {}", balance);
51+
52+
if balance > 10500 {
53+
let recipient_address = "mkHS9ne12qx9pS9VojpwU5xtRd4T7X7ZUt";
54+
55+
let amount = 9359;
56+
57+
let tx = build_signed_tx(&wallet, recipient_address, amount);
58+
59+
blockchain.broadcast(&tx).unwrap();
60+
61+
println!("tx id: {}", tx.txid().to_string());
62+
} else {
63+
println!("Insufficient Funds. Fund the wallet with the address above");
64+
}
65+
66+
let export = FullyNodedExport::export_wallet(&wallet, "exported wallet", true)
67+
.map_err(ToString::to_string)
68+
.map_err(bdk::Error::Generic).unwrap();
69+
70+
println!("------\nWallet Backup: {}", export.to_string());
71+
}

0 commit comments

Comments
 (0)