|
9 | 9 | use bdk::blockchain::{Blockchain, ElectrumBlockchain};
|
10 | 10 | use bdk::database::MemoryDatabase;
|
11 | 11 | use bdk::wallet::AddressIndex;
|
12 |
| -use bdk::SyncOptions; |
| 12 | +use bdk::{descriptor, SyncOptions}; |
13 | 13 | use bdk::{FeeRate, SignOptions, Wallet};
|
| 14 | +use bitcoin::secp256k1::Secp256k1; |
14 | 15 | use bitcoin::{Address, Network};
|
15 | 16 | use electrum_client::Client;
|
| 17 | +use miniscript::descriptor::DescriptorSecretKey; |
16 | 18 | use std::error::Error;
|
17 | 19 | use std::str::FromStr;
|
18 | 20 |
|
| 21 | +/// This example shows how to sign and broadcast the transaction for a PSBT (Partially Signed |
| 22 | +/// Bitcoin Transaction) for a single key, witness public key hash (WPKH) based descriptor wallet. |
| 23 | +/// The electrum protocol is used to sync blockchain data from the testnet bitcoin network and |
| 24 | +/// wallet data is stored in an ephemeral in-memory database. The process steps are: |
| 25 | +/// 1. Create a "signing" wallet and a "watch-only" wallet based on the same private keys. |
| 26 | +/// 2. Deposit testnet funds into the watch only wallet. |
| 27 | +/// 3. Sync the watch only wallet and create a spending transaction to return all funds to the testnet faucet. |
| 28 | +/// 4. Sync the signing wallet and sign and finalize the PSBT created by the watch only wallet. |
| 29 | +/// 5. Broadcast the transactions from the finalized PSBT. |
19 | 30 | fn main() -> Result<(), Box<dyn Error>> {
|
20 |
| - // test keys created with `bdk-cli key generate` and `bdk-cli key derive` commands |
21 |
| - let signing_external_descriptor = "wpkh([e9824965/84'/1'/0']tprv8fvem7qWxY3SGCQczQpRpqTKg455wf1zgixn6MZ4ze8gRfHjov5gXBQTadNfDgqs9ERbZZ3Bi1PNYrCCusFLucT39K525MWLpeURjHwUsfX/0/*)"; |
22 |
| - let signing_internal_descriptor = "wpkh([e9824965/84'/1'/0']tprv8fvem7qWxY3SGCQczQpRpqTKg455wf1zgixn6MZ4ze8gRfHjov5gXBQTadNfDgqs9ERbZZ3Bi1PNYrCCusFLucT39K525MWLpeURjHwUsfX/1/*)"; |
| 31 | + // test key created with `bdk-cli key generate` and `bdk-cli key derive` commands |
| 32 | + let external_secret_xkey = DescriptorSecretKey::from_str("[e9824965/84'/1'/0']tprv8fvem7qWxY3SGCQczQpRpqTKg455wf1zgixn6MZ4ze8gRfHjov5gXBQTadNfDgqs9ERbZZ3Bi1PNYrCCusFLucT39K525MWLpeURjHwUsfX/0/*").unwrap(); |
| 33 | + let internal_secret_xkey = DescriptorSecretKey::from_str("[e9824965/84'/1'/0']tprv8fvem7qWxY3SGCQczQpRpqTKg455wf1zgixn6MZ4ze8gRfHjov5gXBQTadNfDgqs9ERbZZ3Bi1PNYrCCusFLucT39K525MWLpeURjHwUsfX/1/*").unwrap(); |
23 | 34 |
|
24 |
| - let watch_only_external_descriptor = "wpkh([e9824965/84'/1'/0']tpubDCcguXsm6uj79fSQt4V2EF7SF5b26zCuG2ZZNsbNQuw5G9YWSJuGhg2KknQBywRq4VGTu41zYTCh3QeVFyBdbsymgRX9Mrts94SW7obEdqs/0/*)"; |
25 |
| - let watch_only_internal_descriptor = "wpkh([e9824965/84'/1'/0']tpubDCcguXsm6uj79fSQt4V2EF7SF5b26zCuG2ZZNsbNQuw5G9YWSJuGhg2KknQBywRq4VGTu41zYTCh3QeVFyBdbsymgRX9Mrts94SW7obEdqs/1/*)"; |
| 35 | + let secp = Secp256k1::new(); |
| 36 | + let external_public_xkey = external_secret_xkey.as_public(&secp).unwrap(); |
| 37 | + let internal_public_xkey = internal_secret_xkey.as_public(&secp).unwrap(); |
| 38 | + |
| 39 | + let signing_external_descriptor = descriptor!(wpkh(external_secret_xkey)).unwrap(); |
| 40 | + let signing_internal_descriptor = descriptor!(wpkh(internal_secret_xkey)).unwrap(); |
| 41 | + |
| 42 | + let watch_only_external_descriptor = descriptor!(wpkh(external_public_xkey)).unwrap(); |
| 43 | + let watch_only_internal_descriptor = descriptor!(wpkh(internal_public_xkey)).unwrap(); |
26 | 44 |
|
27 | 45 | // create client for Blockstream's testnet electrum server
|
28 | 46 | let blockchain =
|
|
0 commit comments