Skip to content

Commit 8ebfb17

Browse files
committed
upgrading to bdk_wallet v2.2 and signing with psbt
1 parent 02031dc commit 8ebfb17

File tree

5 files changed

+86
-24
lines changed

5 files changed

+86
-24
lines changed

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
name = "bdk-reserves"
33
version = "2.2.0"
44
authors = ["Richard Ulrich <[email protected]>"]
5-
edition = "2018"
5+
edition = "2024"
66
description = "Proof of reserves for bitcoin dev kit"
77
keywords = ["proof", "reserves", "bitcoin", "psbt"]
88
readme = "README.md"
@@ -11,6 +11,7 @@ repository = "https://github.com/bitcoindevkit/bdk-reserves"
1111

1212
[dependencies]
1313
bdk_wallet = { version = "2.2.0", default-features = false, features = ["std"] }
14+
bdk_coin_select = "0.4"
1415
bitcoinconsensus = "0.19.0-3"
1516
log = "^0.4"
1617

src/reserves.rs

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use bdk_wallet::bitcoin::blockdata::script::{Builder, Script, ScriptBuf};
2323
use bdk_wallet::bitcoin::blockdata::transaction::{OutPoint, TxIn, TxOut};
2424
use bdk_wallet::bitcoin::consensus::encode::serialize;
2525
use bdk_wallet::bitcoin::hash_types::Txid;
26-
use bdk_wallet::bitcoin::hashes::{hash160, sha256d, Hash};
26+
use bdk_wallet::bitcoin::hashes::{Hash, hash160, sha256d};
2727
use bdk_wallet::bitcoin::psbt::ExtractTxError;
2828
use bdk_wallet::bitcoin::psbt::{Input, Psbt};
2929
use bdk_wallet::bitcoin::sighash::EcdsaSighashType;
@@ -335,13 +335,23 @@ fn challenge_txin(message: &str) -> TxIn {
335335
#[cfg(test)]
336336
mod test {
337337
use super::*;
338+
use bdk_coin_select::{Candidate, NoBnbSolution, metrics::LowestFee};
338339
use bdk_tx::Signer;
339-
use bdk_wallet::bitcoin::{Address, Network, Witness};
340+
use bdk_tx::{
341+
ChangePolicyType, Output, PsbtParams, ScriptSource, Selector, SelectorParams,
342+
filter_unspendable_now, group_by_spk, selection_algorithm_lowest_fee_bnb,
343+
};
344+
use bdk_wallet::bitcoin::{Address, FeeRate, Network, Witness};
340345
use bdk_wallet::descriptor::Descriptor;
341346
use bdk_wallet::test_utils::get_funded_wallet_single;
342347
use secp256k1::Secp256k1;
343348
use std::str::FromStr;
344349

350+
/// Select all UTXOs
351+
pub fn selection_algorithm_leave() -> impl FnMut(&mut Selector) -> Result<(), NoBnbSolution> {
352+
move |_selector| Ok(())
353+
}
354+
345355
#[test]
346356
fn test_proof() {
347357
let descriptor = "wpkh(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW)";
@@ -357,10 +367,41 @@ mod test {
357367
assert_eq!(psbt_b64, expected);
358368

359369
let secp = Secp256k1::new();
360-
let (_, keymap) = Descriptor::parse_descriptor(&secp, descriptor).unwrap();
370+
let (desc, keymap) = Descriptor::parse_descriptor(&secp, descriptor).unwrap();
361371
let signer = Signer(keymap.into_iter().collect());
362372
psbt.sign(&signer, &secp).unwrap();
363373

374+
/*
375+
let selection = wallet
376+
.all_candidates()
377+
//.regroup(group_by_spk())
378+
//.filter(filter_unspendable_now(tip_height, tip_time))
379+
.into_selection(
380+
selection_algorithm_leave(),
381+
SelectorParams::new(
382+
FeeRate::from_sat_per_vb_unchecked(10),
383+
vec![],
384+
ScriptSource::from_descriptor(desc),
385+
ChangePolicyType::NoDust,
386+
wallet.change_weight(),
387+
),
388+
)?;
389+
let finalizer = selection.into_finalizer();
390+
assert!(
391+
finalizer.finalize(&mut psbt).is_finalized(),
392+
"must finalize"
393+
);
394+
*/
395+
396+
397+
let signopts = bdk_wallet::SignOptions {
398+
trust_witness_utxo: true,
399+
//remove_partial_sigs: false,
400+
..Default::default()
401+
};
402+
let finalized = wallet.finalize_psbt(&mut psbt, signopts).unwrap();
403+
404+
364405
let spendable = wallet.verify_proof(&psbt, message, None).unwrap();
365406
assert_eq!(spendable, Amount::from_sat(50_000));
366407

tests/mempool.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
mod regtestenv;
22
use bdk_electrum::electrum_client::{Client, ElectrumApi};
3-
use bdk_electrum::{electrum_client, BdkElectrumClient};
3+
use bdk_electrum::{BdkElectrumClient, electrum_client};
44
use bdk_reserves::reserves::*;
55
use bdk_tx::Signer;
66
use bdk_wallet::bitcoin::{Amount, FeeRate, Network};

tests/multi_sig.rs

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
mod regtestenv;
22
use bdk_reserves::reserves::*;
3+
use bdk_tx::Signer;
4+
use bdk_wallet::bitcoin::Network;
35
use bdk_wallet::bitcoin::key::{PrivateKey, PublicKey};
46
use bdk_wallet::bitcoin::psbt::Psbt;
57
use bdk_wallet::bitcoin::secp256k1::Secp256k1;
6-
use bdk_wallet::bitcoin::Network;
8+
use bdk_wallet::descriptor::DescriptorPublicKey;
9+
use bdk_wallet::keys::{SinglePriv, SinglePub, SinglePubKey};
10+
use bdk_wallet::miniscript::descriptor::{DescriptorSecretKey, KeyMap};
711
use bdk_wallet::{KeychainKind, Wallet};
812
use regtestenv::RegTestEnv;
913
use rstest::rstest;
@@ -79,6 +83,10 @@ fn test_proof_multisig(
7983
let mut wallet1 = construct_multisig_wallet(&signer2, &pubkeys, &script_type)?;
8084
let mut wallet2 = construct_multisig_wallet(&signer3, &pubkeys, &script_type)?;
8185
let mut wallets = [&mut wallet0, &mut wallet1, &mut wallet2];
86+
let signer1 = signer_from_priv(signer1, pubkeys[0]);
87+
let signer2 = signer_from_priv(signer2, pubkeys[1]);
88+
let signer3 = signer_from_priv(signer3, pubkeys[2]);
89+
let signers = [&signer1, &signer2, &signer3];
8290

8391
wallets
8492
.iter_mut()
@@ -98,8 +106,7 @@ fn test_proof_multisig(
98106
});
99107

100108
let regtestenv = RegTestEnv::new();
101-
/*
102-
regtestenv.generate(&mut wallets);
109+
regtestenv.generate(&mut wallets, &signers);
103110

104111
wallets.iter().enumerate().for_each(|(i, wallet)| {
105112
let balance = wallet.balance();
@@ -131,31 +138,28 @@ fn test_proof_multisig(
131138
})
132139
};
133140

134-
let signopts = SignOptions {
135-
trust_witness_utxo: true,
136-
//remove_partial_sigs: false,
137-
..Default::default()
138-
};
139-
let finalized = wallets[0].sign(&mut psbt, signopts.clone())?;
141+
psbt.sign(signers[0], &secp).unwrap();
140142
assert_eq!(count_signatures(&psbt), (num_inp - 1, 1, 0));
141-
assert!(!finalized);
142143

143-
let finalized = wallets[1].sign(&mut psbt, signopts.clone())?;
144+
psbt.sign(signers[1], &secp).unwrap();
144145
assert_eq!(
145146
count_signatures(&psbt),
146147
(0, num_inp.pow(count_mult.0), (num_inp - 1) * count_mult.1)
147148
);
148-
assert!(finalized);
149149

150150
// 2 signatures are enough. Just checking what happens...
151-
let finalized = wallets[2].sign(&mut psbt, signopts.clone())?;
151+
psbt.sign(signers[2], &secp).unwrap();
152152
assert_eq!(
153153
count_signatures(&psbt),
154154
(0, num_inp.pow(count_mult.0), (num_inp - 1) * count_mult.1)
155155
);
156-
assert!(finalized);
157156

158-
let finalized = wallets[0].finalize_psbt(&mut psbt, signopts)?;
157+
let signopts = bdk_wallet::SignOptions {
158+
trust_witness_utxo: true,
159+
//remove_partial_sigs: false,
160+
..Default::default()
161+
};
162+
let finalized = wallets[0].finalize_psbt(&mut psbt, signopts).unwrap();
159163
assert_eq!(
160164
count_signatures(&psbt),
161165
(0, num_inp.pow(count_mult.0), (num_inp - 1) * count_mult.1)
@@ -170,7 +174,23 @@ fn test_proof_multisig(
170174
spendable,
171175
balance.confirmed,
172176
);
173-
*/
174177

175178
Ok(())
176179
}
180+
181+
fn signer_from_priv(prvk: PrivateKey, pubk: PublicKey) -> Signer {
182+
let mut keymap = KeyMap::new();
183+
184+
let pubk = DescriptorPublicKey::Single(SinglePub {
185+
origin: None,
186+
key: SinglePubKey::FullKey(pubk),
187+
});
188+
let prvk = DescriptorSecretKey::Single(SinglePriv {
189+
//let prvk = KeyMap::V::Single(SinglePriv {
190+
origin: None,
191+
key: prvk,
192+
});
193+
keymap.insert(pubk, prvk);
194+
195+
Signer(keymap)
196+
}

tests/regtestenv.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
use bdk_electrum::electrum_client::Client;
2-
use bdk_electrum::{electrum_client, BdkElectrumClient};
2+
use bdk_electrum::{BdkElectrumClient, electrum_client};
33
use bdk_tx::Signer;
44
use bdk_wallet::bitcoin::{Amount, FeeRate};
55
use bdk_wallet::{KeychainKind, Wallet};
6-
use electrsd::corepc_node::client::bitcoin::{Address, Network};
6+
use electrsd::ElectrsD;
77
use electrsd::corepc_node::Node;
8+
use electrsd::corepc_node::client::bitcoin::{Address, Network};
89
use electrsd::electrum_client::ElectrumApi;
9-
use electrsd::ElectrsD;
1010
use secp256k1::Secp256k1;
1111
use std::str::FromStr;
1212
use std::time::Duration;

0 commit comments

Comments
 (0)