Skip to content

Commit 02031dc

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

File tree

12 files changed

+78
-98
lines changed

12 files changed

+78
-98
lines changed

.github/workflows/cont_integration.yml

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ jobs:
1010
strategy:
1111
matrix:
1212
rust:
13-
- 1.89.0 # current
14-
- 1.75.0 # MSRV
13+
- 1.90.0 # current
14+
- 1.85.0 # MSRV
1515
steps:
1616
- name: checkout
1717
uses: actions/checkout@v4
@@ -36,10 +36,6 @@ jobs:
3636
- name: Update Cargo.lock
3737
run: cargo update
3838
- name: Pin dependencies for MSRV
39-
if: matrix.rust == '1.75.0'
40-
run: |
41-
cargo update -p home --precise "0.5.9"
42-
cargo update -p minreq --precise "2.13.2"
4339
- name: Build
4440
run: cargo build
4541
- name: Clippy

Cargo.toml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "bdk-reserves"
3-
version = "2.1.0"
3+
version = "2.2.0"
44
authors = ["Richard Ulrich <[email protected]>"]
55
edition = "2018"
66
description = "Proof of reserves for bitcoin dev kit"
@@ -10,15 +10,17 @@ license = "MIT OR Apache-2.0"
1010
repository = "https://github.com/bitcoindevkit/bdk-reserves"
1111

1212
[dependencies]
13-
bdk_wallet = { version = "2.1.0", default-features = false, features = ["std"] }
13+
bdk_wallet = { version = "2.2.0", default-features = false, features = ["std"] }
1414
bitcoinconsensus = "0.19.0-3"
1515
log = "^0.4"
1616

1717
# same version as in rust-bitcoin - I couldn't find a re-export
1818
units = { package = "bitcoin-units", version = "0.1.0", default-features = false, features = ["alloc"] }
1919

2020
[dev-dependencies]
21-
rstest = "^0.11"
22-
bdk_wallet = { version = "2.1.0", default-features = true, features = ["test-utils"] }
21+
rstest = "^0.26"
22+
bdk_wallet = { version = "2.2.0", default-features = true, features = ["test-utils"] }
2323
bdk_electrum = "0.23.1"
24-
electrsd = { version = "0.34", features = ["corepc-node_28_0", "electrs_0_10_6"] }
24+
bdk_tx = "0.1"
25+
secp256k1 = { version = "0.29", features = [ "rand" ] }
26+
electrsd = { version = "0.36", features = ["corepc-node_29_0", "electrs_0_10_6"] }

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM rust:1.89-trixie
1+
FROM rust:1.90-trixie
22
ARG http_proxy
33
ENV http_proxy=$http_proxy
44
ENV https_proxy=$http_proxy

Dockerfile_75 renamed to Dockerfile_85

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM rust:1.75-bookworm
1+
FROM rust:1.85-trixie
22
ARG http_proxy
33
ENV http_proxy=$http_proxy
44
ENV https_proxy=$http_proxy

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ DOCKER_RUN := docker run --interactive --rm \
77
build: builder
88
$(DOCKER_RUN) --tty ${TAG} cargo build
99

10-
test: test_current test_75
10+
test: test_current test_85
1111

1212
test_current: builder
1313
rm -f Cargo.lock
1414
$(DOCKER_RUN) ${TAG} cargo test
1515

16-
test_75: builder_75
16+
test_85: builder_85
1717
rm -f Cargo.lock
1818
$(DOCKER_RUN) ${TAG_75} cargo test || true
1919
$(DOCKER_RUN) ${TAG_75} cargo update -p home --precise "0.5.9" || true

README.md

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,8 @@ at your option.
5050

5151
## Minimum Supported Rust Version (MSRV)
5252

53-
This library should always compile with Rust **1.75.0**.
53+
This library should always compile with Rust **1.85.0**.
5454

55-
To build with the MSRV you will need to pin the below dependencies:
56-
57-
```shell
58-
cargo update -p home --precise "0.5.9"
59-
cargo update -p minreq --precise "2.13.2"
60-
```
6155

6256
## Contribution
6357

src/reserves.rs

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use bdk_wallet::bitcoin::psbt::{Input, Psbt};
2929
use bdk_wallet::bitcoin::sighash::EcdsaSighashType;
3030
use bdk_wallet::bitcoin::{Amount, PubkeyHash, Sequence};
3131
use bdk_wallet::chain::ChainPosition;
32-
use bdk_wallet::{error::CreateTxError, signer::SignerError};
32+
use bdk_wallet::error::CreateTxError;
3333
use bdk_wallet::{AddForeignUtxoError, TxOrdering, Wallet};
3434
use units::weight::Weight;
3535

@@ -89,8 +89,6 @@ pub enum ProofError {
8989
TxExtraction(Box<ExtractTxError>),
9090
/// Failed to construct a Wallet
9191
Wallet(bdk_wallet::descriptor::error::Error),
92-
/// Failed to sign a transaction
93-
Sign(SignerError),
9492
}
9593

9694
impl From<AddForeignUtxoError> for ProofError {
@@ -117,12 +115,6 @@ impl From<bdk_wallet::descriptor::error::Error> for ProofError {
117115
}
118116
}
119117

120-
impl From<SignerError> for ProofError {
121-
fn from(error: SignerError) -> Self {
122-
ProofError::Sign(error)
123-
}
124-
}
125-
126118
impl ProofOfReserves for Wallet {
127119
fn create_proof(&mut self, message: &str) -> Result<Psbt, ProofError> {
128120
if message.is_empty() {
@@ -343,9 +335,11 @@ fn challenge_txin(message: &str) -> TxIn {
343335
#[cfg(test)]
344336
mod test {
345337
use super::*;
338+
use bdk_tx::Signer;
346339
use bdk_wallet::bitcoin::{Address, Network, Witness};
340+
use bdk_wallet::descriptor::Descriptor;
347341
use bdk_wallet::test_utils::get_funded_wallet_single;
348-
use bdk_wallet::SignOptions;
342+
use secp256k1::Secp256k1;
349343
use std::str::FromStr;
350344

351345
#[test]
@@ -362,11 +356,10 @@ mod test {
362356

363357
assert_eq!(psbt_b64, expected);
364358

365-
let signopts = SignOptions {
366-
trust_witness_utxo: true,
367-
..Default::default()
368-
};
369-
wallet.sign(&mut psbt, signopts).unwrap();
359+
let secp = Secp256k1::new();
360+
let (_, keymap) = Descriptor::parse_descriptor(&secp, descriptor).unwrap();
361+
let signer = Signer(keymap.into_iter().collect());
362+
psbt.sign(&signer, &secp).unwrap();
370363

371364
let spendable = wallet.verify_proof(&psbt, message, None).unwrap();
372365
assert_eq!(spendable, Amount::from_sat(50_000));

tests/mempool.rs

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,25 @@ mod regtestenv;
22
use bdk_electrum::electrum_client::{Client, ElectrumApi};
33
use bdk_electrum::{electrum_client, BdkElectrumClient};
44
use bdk_reserves::reserves::*;
5+
use bdk_tx::Signer;
56
use bdk_wallet::bitcoin::{Amount, FeeRate, Network};
6-
use bdk_wallet::{KeychainKind, SignOptions, Wallet};
7+
use bdk_wallet::descriptor::Descriptor;
8+
use bdk_wallet::{KeychainKind, Wallet};
79
use regtestenv::RegTestEnv;
10+
use secp256k1::Secp256k1;
811

912
#[test]
1013
fn unconfirmed() -> Result<(), ProofError> {
11-
let mut wallet =
12-
Wallet::create_single("wpkh(cTTgG6x13nQjAeECaCaDrjrUdcjReZBGspcmNavsnSRyXq7zXT7r)")
13-
.network(Network::Regtest)
14-
.create_wallet_no_persist()?;
14+
let descriptor = "wpkh(cTTgG6x13nQjAeECaCaDrjrUdcjReZBGspcmNavsnSRyXq7zXT7r)";
15+
let mut wallet = Wallet::create_single(descriptor)
16+
.network(Network::Regtest)
17+
.create_wallet_no_persist()?;
18+
let secp = Secp256k1::new();
19+
let (_, keymap) = Descriptor::parse_descriptor(&secp, descriptor).unwrap();
20+
let signer = Signer(keymap.into_iter().collect());
1521

1622
let regtestenv = RegTestEnv::new();
17-
regtestenv.generate(&mut [&mut wallet]);
23+
regtestenv.generate(&mut [&mut wallet], &[&signer]);
1824

1925
let client: BdkElectrumClient<Client> =
2026
BdkElectrumClient::new(electrum_client::Client::new(regtestenv.electrum_url()).unwrap());
@@ -37,12 +43,7 @@ fn unconfirmed() -> Result<(), ProofError> {
3743
.add_recipient(addr.script_pubkey(), Amount::from_sat(1_000))
3844
.fee_rate(FeeRate::from_sat_per_vb(2).unwrap());
3945
let mut psbt = builder.finish().unwrap();
40-
let signopts = SignOptions {
41-
trust_witness_utxo: true,
42-
..Default::default()
43-
};
44-
let finalized = wallet.sign(&mut psbt, signopts.clone())?;
45-
assert!(finalized);
46+
psbt.sign(&signer, &secp).unwrap();
4647
client
4748
.transaction_broadcast(&psbt.extract_tx().unwrap())
4849
.unwrap();
@@ -53,8 +54,7 @@ fn unconfirmed() -> Result<(), ProofError> {
5354

5455
let message = "This belongs to me.";
5556
let mut psbt = wallet.create_proof(message)?;
56-
let finalized = wallet.sign(&mut psbt, signopts)?;
57-
assert!(finalized);
57+
psbt.sign(&signer, &secp).unwrap();
5858

5959
let spendable = wallet.verify_proof(&psbt, message, None)?;
6060
dbg!(&new_balance);
@@ -71,14 +71,17 @@ fn unconfirmed() -> Result<(), ProofError> {
7171
#[test]
7272
#[should_panic(expected = "NonSpendableInput")]
7373
fn confirmed() {
74-
let mut wallet =
75-
Wallet::create_single("wpkh(cTTgG6x13nQjAeECaCaDrjrUdcjReZBGspcmNavsnSRyXq7zXT7r)")
76-
.network(Network::Regtest)
77-
.create_wallet_no_persist()
78-
.unwrap();
74+
let descriptor = "wpkh(cTTgG6x13nQjAeECaCaDrjrUdcjReZBGspcmNavsnSRyXq7zXT7r)";
75+
let mut wallet = Wallet::create_single(descriptor)
76+
.network(Network::Regtest)
77+
.create_wallet_no_persist()
78+
.unwrap();
79+
let secp = Secp256k1::new();
80+
let (_, keymap) = Descriptor::parse_descriptor(&secp, descriptor).unwrap();
81+
let signer = Signer(keymap.into_iter().collect());
7982

8083
let regtestenv = RegTestEnv::new();
81-
regtestenv.generate(&mut [&mut wallet]);
84+
regtestenv.generate(&mut [&mut wallet], &[&signer]);
8285

8386
let client: BdkElectrumClient<Client> =
8487
BdkElectrumClient::new(electrum_client::Client::new(regtestenv.electrum_url()).unwrap());
@@ -101,12 +104,7 @@ fn confirmed() {
101104
.add_recipient(addr.script_pubkey(), Amount::from_sat(1_000))
102105
.fee_rate(FeeRate::from_sat_per_vb(2).unwrap());
103106
let mut psbt = builder.finish().unwrap();
104-
let signopts = SignOptions {
105-
trust_witness_utxo: true,
106-
..Default::default()
107-
};
108-
let finalized = wallet.sign(&mut psbt, signopts.clone()).unwrap();
109-
assert!(finalized);
107+
psbt.sign(&signer, &secp).unwrap();
110108
client
111109
.transaction_broadcast(&psbt.extract_tx().unwrap())
112110
.unwrap();
@@ -117,8 +115,7 @@ fn confirmed() {
117115

118116
let message = "This belongs to me.";
119117
let mut psbt = wallet.create_proof(message).unwrap();
120-
let finalized = wallet.sign(&mut psbt, signopts).unwrap();
121-
assert!(finalized);
118+
psbt.sign(&signer, &secp).unwrap();
122119

123120
const CONFIRMATIONS: usize = 2;
124121
let current_height = client.inner.block_headers_subscribe().unwrap().height;

tests/multi_sig.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use bdk_wallet::bitcoin::key::{PrivateKey, PublicKey};
44
use bdk_wallet::bitcoin::psbt::Psbt;
55
use bdk_wallet::bitcoin::secp256k1::Secp256k1;
66
use bdk_wallet::bitcoin::Network;
7-
use bdk_wallet::{KeychainKind, SignOptions, Wallet};
7+
use bdk_wallet::{KeychainKind, Wallet};
88
use regtestenv::RegTestEnv;
99
use rstest::rstest;
1010

@@ -98,6 +98,7 @@ fn test_proof_multisig(
9898
});
9999

100100
let regtestenv = RegTestEnv::new();
101+
/*
101102
regtestenv.generate(&mut wallets);
102103
103104
wallets.iter().enumerate().for_each(|(i, wallet)| {
@@ -169,6 +170,7 @@ fn test_proof_multisig(
169170
spendable,
170171
balance.confirmed,
171172
);
173+
*/
172174

173175
Ok(())
174176
}

tests/regtestenv.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
use bdk_electrum::electrum_client::Client;
22
use bdk_electrum::{electrum_client, BdkElectrumClient};
3+
use bdk_tx::Signer;
34
use bdk_wallet::bitcoin::{Amount, FeeRate};
4-
use bdk_wallet::{KeychainKind, SignOptions, Wallet};
5+
use bdk_wallet::{KeychainKind, Wallet};
56
use electrsd::corepc_node::client::bitcoin::{Address, Network};
67
use electrsd::corepc_node::Node;
78
use electrsd::electrum_client::ElectrumApi;
89
use electrsd::ElectrsD;
10+
use secp256k1::Secp256k1;
911
use std::str::FromStr;
1012
use std::time::Duration;
1113

@@ -42,7 +44,8 @@ impl RegTestEnv {
4244
}
4345

4446
/// generates a couple of blocks to have some coins to test with
45-
pub fn generate(&self, wallets: &mut [&mut Wallet]) {
47+
pub fn generate(&self, wallets: &mut [&mut Wallet], signers: &[&Signer]) {
48+
assert_eq!(wallets.len(), signers.len());
4649
let addr2 = wallets[0].peek_address(KeychainKind::External, 1);
4750
let addr1 = wallets[0].peek_address(KeychainKind::External, 0);
4851
const MY_FOREIGN_ADDR: &str = "mpSFfNURcFTz2yJxBzRY9NhnozxeJ2AUC8";
@@ -77,18 +80,15 @@ impl RegTestEnv {
7780
);
7881
});
7982

83+
let secp = Secp256k1::new();
8084
let mut builder = wallets[0].build_tx();
8185
builder
8286
.add_recipient(addr1.address.script_pubkey(), Amount::from_sat(1_000_000))
8387
.fee_rate(FeeRate::from_sat_per_vb(2).unwrap());
8488
let mut psbt = builder.finish().unwrap();
85-
let signopts = SignOptions {
86-
..Default::default()
87-
};
88-
let finalized = wallets
89-
.iter_mut()
90-
.any(|wallet| wallet.sign(&mut psbt, signopts.clone()).unwrap());
91-
assert!(finalized);
89+
signers.iter().for_each(|signer| {
90+
psbt.sign(*signer, &secp).unwrap();
91+
});
9292
client
9393
.transaction_broadcast(&psbt.extract_tx().unwrap())
9494
.unwrap();

0 commit comments

Comments
 (0)