Skip to content

Commit f01bab1

Browse files
committed
refactor: migrate to external-key signing
1 parent 43702e7 commit f01bab1

13 files changed

Lines changed: 648 additions & 204 deletions

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@ let change_descriptor = "wpkh(tprv8ZgxMBicQKsPdcAqYBpzAFwU5yxBUo88ggoBqu1qPcHUfS
9292
let mut wallet = match Wallet::load()
9393
.descriptor(KeychainKind::External, Some(descriptor))
9494
.descriptor(KeychainKind::Internal, Some(change_descriptor))
95-
.extract_keys()
9695
.check_network(network)
9796
.load_wallet(&mut conn)?
9897
{

examples/bitcoind_rpc.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ fn main() -> anyhow::Result<()> {
9797
let wallet_opt = Wallet::load()
9898
.descriptor(KeychainKind::External, Some(args.descriptor.clone()))
9999
.descriptor(KeychainKind::Internal, args.change_descriptor.clone())
100-
.extract_keys()
101100
.check_network(args.network)
102101
.load_wallet(&mut db)?;
103102
let mut wallet = match wallet_opt {

examples/electrum.rs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
use bdk_electrum::electrum_client;
22
use bdk_electrum::BdkElectrumClient;
3+
use bdk_wallet::bitcoin::secp256k1::Secp256k1;
34
use bdk_wallet::bitcoin::Amount;
45
use bdk_wallet::bitcoin::FeeRate;
56
use bdk_wallet::bitcoin::Network;
67
use bdk_wallet::chain::collections::HashSet;
8+
use bdk_wallet::descriptor::IntoWalletDescriptor;
9+
use bdk_wallet::miniscript::descriptor::KeyMapWrapper;
710
use bdk_wallet::psbt::PsbtUtils;
811
use bdk_wallet::rusqlite::Connection;
912
use bdk_wallet::Wallet;
@@ -23,16 +26,22 @@ const INTERNAL_DESC: &str = "wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7
2326
const ELECTRUM_URL: &str = "ssl://mempool.space:40002";
2427

2528
fn main() -> Result<(), anyhow::Error> {
29+
let secp = Secp256k1::new();
30+
let (external_descriptor, mut external_keymap) =
31+
EXTERNAL_DESC.into_wallet_descriptor(&secp, NETWORK.into())?;
32+
let (internal_descriptor, internal_keymap) =
33+
INTERNAL_DESC.into_wallet_descriptor(&secp, NETWORK.into())?;
34+
external_keymap.extend(internal_keymap);
35+
let signer = KeyMapWrapper::from(external_keymap);
2636
let mut db = Connection::open(DB_PATH)?;
2737
let wallet_opt = Wallet::load()
28-
.descriptor(KeychainKind::External, Some(EXTERNAL_DESC))
29-
.descriptor(KeychainKind::Internal, Some(INTERNAL_DESC))
30-
.extract_keys()
38+
.descriptor(KeychainKind::External, Some(external_descriptor.clone()))
39+
.descriptor(KeychainKind::Internal, Some(internal_descriptor.clone()))
3140
.check_network(NETWORK)
3241
.load_wallet(&mut db)?;
3342
let mut wallet = match wallet_opt {
3443
Some(wallet) => wallet,
35-
None => Wallet::create(EXTERNAL_DESC, INTERNAL_DESC)
44+
None => Wallet::create(external_descriptor, internal_descriptor)
3645
.network(NETWORK)
3746
.create_wallet(&mut db)?,
3847
};
@@ -89,7 +98,10 @@ fn main() -> Result<(), anyhow::Error> {
8998
tx_builder.fee_rate(target_fee_rate);
9099

91100
let mut psbt = tx_builder.finish()?;
92-
let finalized = wallet.sign(&mut psbt, SignOptions::default())?;
101+
wallet
102+
.sign_psbt(&mut psbt, &signer)
103+
.map_err(|(_, e)| anyhow::anyhow!("{e:?}"))?;
104+
let finalized = wallet.finalize_psbt(&mut psbt, SignOptions::default())?;
93105
assert!(finalized);
94106
let original_fee = psbt.fee_amount().unwrap();
95107
let tx_feerate = psbt.fee_rate().unwrap();
@@ -124,7 +136,10 @@ fn main() -> Result<(), anyhow::Error> {
124136
let mut builder = wallet.build_fee_bump(txid).expect("failed to bump tx");
125137
builder.fee_rate(feerate);
126138
let mut bumped_psbt = builder.finish().unwrap();
127-
let finalize_btx = wallet.sign(&mut bumped_psbt, SignOptions::default())?;
139+
wallet
140+
.sign_psbt(&mut bumped_psbt, &signer)
141+
.map_err(|(_, e)| anyhow::anyhow!("{e:?}"))?;
142+
let finalize_btx = wallet.finalize_psbt(&mut bumped_psbt, SignOptions::default())?;
128143
assert!(finalize_btx);
129144
let new_fee = bumped_psbt.fee_amount().unwrap();
130145
let bumped_tx = bumped_psbt.extract_tx()?;

examples/esplora_async.rs

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use bdk_esplora::{esplora_client, EsploraAsyncExt};
22
use bdk_wallet::{
3-
bitcoin::{Amount, FeeRate, Network},
3+
bitcoin::{secp256k1::Secp256k1, Amount, FeeRate, Network},
4+
descriptor::IntoWalletDescriptor,
5+
miniscript::descriptor::KeyMapWrapper,
46
psbt::PsbtUtils,
57
rusqlite::Connection,
68
KeychainKind, SignOptions, Wallet,
@@ -20,16 +22,22 @@ const ESPLORA_URL: &str = "https://mempool.space/testnet4/api";
2022

2123
#[tokio::main]
2224
async fn main() -> Result<(), anyhow::Error> {
25+
let secp = Secp256k1::new();
26+
let (external_descriptor, mut external_keymap) =
27+
EXTERNAL_DESC.into_wallet_descriptor(&secp, NETWORK.into())?;
28+
let (internal_descriptor, internal_keymap) =
29+
INTERNAL_DESC.into_wallet_descriptor(&secp, NETWORK.into())?;
30+
external_keymap.extend(internal_keymap);
31+
let signer = KeyMapWrapper::from(external_keymap);
2332
let mut db = Connection::open(DB_PATH)?;
2433
let wallet_opt = Wallet::load()
25-
.descriptor(KeychainKind::External, Some(EXTERNAL_DESC))
26-
.descriptor(KeychainKind::Internal, Some(INTERNAL_DESC))
27-
.extract_keys()
34+
.descriptor(KeychainKind::External, Some(external_descriptor.clone()))
35+
.descriptor(KeychainKind::Internal, Some(internal_descriptor.clone()))
2836
.check_network(NETWORK)
2937
.load_wallet(&mut db)?;
3038
let mut wallet = match wallet_opt {
3139
Some(wallet) => wallet,
32-
None => Wallet::create(EXTERNAL_DESC, INTERNAL_DESC)
40+
None => Wallet::create(external_descriptor, internal_descriptor)
3341
.network(NETWORK)
3442
.create_wallet(&mut db)?,
3543
};
@@ -83,7 +91,10 @@ async fn main() -> Result<(), anyhow::Error> {
8391
tx_builder.fee_rate(target_fee_rate);
8492

8593
let mut psbt = tx_builder.finish()?;
86-
let finalized = wallet.sign(&mut psbt, SignOptions::default())?;
94+
wallet
95+
.sign_psbt(&mut psbt, &signer)
96+
.map_err(|(_, e)| anyhow::anyhow!("{e:?}"))?;
97+
let finalized = wallet.finalize_psbt(&mut psbt, SignOptions::default())?;
8798
assert!(finalized);
8899
let original_fee = psbt.fee_amount().unwrap();
89100
let tx_feerate = psbt.fee_rate().unwrap();
@@ -117,7 +128,10 @@ async fn main() -> Result<(), anyhow::Error> {
117128
let mut builder = wallet.build_fee_bump(txid).expect("failed to bump tx");
118129
builder.fee_rate(feerate);
119130
let mut bumped_psbt = builder.finish().unwrap();
120-
let finalize_btx = wallet.sign(&mut bumped_psbt, SignOptions::default())?;
131+
wallet
132+
.sign_psbt(&mut bumped_psbt, &signer)
133+
.map_err(|(_, e)| anyhow::anyhow!("{e:?}"))?;
134+
let finalize_btx = wallet.finalize_psbt(&mut bumped_psbt, SignOptions::default())?;
121135
assert!(finalize_btx);
122136
let new_fee = bumped_psbt.fee_amount().unwrap();
123137
let bumped_tx = bumped_psbt.extract_tx()?;

examples/esplora_blocking.rs

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
use bdk_esplora::{esplora_client, EsploraExt};
22
use bdk_wallet::rusqlite::Connection;
33
use bdk_wallet::{
4-
bitcoin::{Amount, FeeRate, Network},
4+
bitcoin::{secp256k1::Secp256k1, Amount, FeeRate, Network},
5+
descriptor::IntoWalletDescriptor,
6+
miniscript::descriptor::KeyMapWrapper,
57
psbt::PsbtUtils,
68
KeychainKind, SignOptions, Wallet,
79
};
@@ -20,16 +22,22 @@ const INTERNAL_DESC: &str = "wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7
2022
const ESPLORA_URL: &str = "https://mempool.space/testnet4/api";
2123

2224
fn main() -> Result<(), anyhow::Error> {
25+
let secp = Secp256k1::new();
26+
let (external_descriptor, mut external_keymap) =
27+
EXTERNAL_DESC.into_wallet_descriptor(&secp, NETWORK.into())?;
28+
let (internal_descriptor, internal_keymap) =
29+
INTERNAL_DESC.into_wallet_descriptor(&secp, NETWORK.into())?;
30+
external_keymap.extend(internal_keymap);
31+
let signer = KeyMapWrapper::from(external_keymap);
2332
let mut db = Connection::open(DB_PATH)?;
2433
let wallet_opt = Wallet::load()
25-
.descriptor(KeychainKind::External, Some(EXTERNAL_DESC))
26-
.descriptor(KeychainKind::Internal, Some(INTERNAL_DESC))
27-
.extract_keys()
34+
.descriptor(KeychainKind::External, Some(external_descriptor.clone()))
35+
.descriptor(KeychainKind::Internal, Some(internal_descriptor.clone()))
2836
.check_network(NETWORK)
2937
.load_wallet(&mut db)?;
3038
let mut wallet = match wallet_opt {
3139
Some(wallet) => wallet,
32-
None => Wallet::create(EXTERNAL_DESC, INTERNAL_DESC)
40+
None => Wallet::create(external_descriptor, internal_descriptor)
3341
.network(NETWORK)
3442
.create_wallet(&mut db)?,
3543
};
@@ -78,7 +86,10 @@ fn main() -> Result<(), anyhow::Error> {
7886
tx_builder.fee_rate(target_fee_rate);
7987

8088
let mut psbt = tx_builder.finish()?;
81-
let finalized = wallet.sign(&mut psbt, SignOptions::default())?;
89+
wallet
90+
.sign_psbt(&mut psbt, &signer)
91+
.map_err(|(_, e)| anyhow::anyhow!("{e:?}"))?;
92+
let finalized = wallet.finalize_psbt(&mut psbt, SignOptions::default())?;
8293
assert!(finalized);
8394
let original_fee = psbt.fee_amount().unwrap();
8495
let tx_feerate = psbt.fee_rate().unwrap();
@@ -113,7 +124,10 @@ fn main() -> Result<(), anyhow::Error> {
113124
let mut builder = wallet.build_fee_bump(txid).unwrap();
114125
builder.fee_rate(feerate);
115126
let mut new_psbt = builder.finish().unwrap();
116-
let finalize_tx = wallet.sign(&mut new_psbt, SignOptions::default())?;
127+
wallet
128+
.sign_psbt(&mut new_psbt, &signer)
129+
.map_err(|(_, e)| anyhow::anyhow!("{e:?}"))?;
130+
let finalize_tx = wallet.finalize_psbt(&mut new_psbt, SignOptions::default())?;
117131
assert!(finalize_tx);
118132
let new_fee = new_psbt.fee_amount().unwrap();
119133
let bumped_tx = new_psbt.extract_tx()?;

0 commit comments

Comments
 (0)