Skip to content

Commit 6c0846c

Browse files
committed
Depend on bitcoin v0.32.0-rc1
Test the latest bitcoin release candidate. Includes bumping the version numbers so we can use this branch to test crates further up the stack.
1 parent 984c758 commit 6c0846c

File tree

41 files changed

+428
-271
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+428
-271
lines changed

Cargo.toml

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,55 @@ members = [
2323

2424
[workspace.package]
2525
authors = ["Bitcoin Dev Kit Developers"]
26+
27+
[patch.crates-io.electrsd]
28+
git = "https://github.com/tcharding/electrsd"
29+
branch = "test-bitcoin"
30+
31+
[patch.crates-io.esplora-client]
32+
git = "https://github.com/tcharding/rust-esplora-client"
33+
branch = "test-bitcoin"
34+
35+
[patch.crates-io.electrum-client]
36+
git = "https://github.com/tcharding/rust-electrum-client"
37+
branch = "test-bitcoin"
38+
39+
[patch.crates-io.hwi]
40+
git = "https://github.com/tcharding/rust-hwi"
41+
branch = "test-bitcoin"
42+
43+
[patch.crates-io.miniscript]
44+
git = "https://github.com/tcharding/rust-miniscript"
45+
branch = "test-bitcoin"
46+
47+
[patch.crates-io.bitcoind]
48+
git = "https://github.com/tcharding/bitcoind/"
49+
branch = "test-bitcoin"
50+
51+
[patch.crates-io.bitcoincore-rpc]
52+
git = "https://github.com/tcharding/rust-bitcoincore-rpc"
53+
branch = "test-bitcoin"
54+
55+
[patch.crates-io.base58ck]
56+
git = "https://github.com/rust-bitcoin/rust-bitcoin"
57+
branch = "rc1-fixes"
58+
59+
[patch.crates-io.bitcoin]
60+
git = "https://github.com/rust-bitcoin/rust-bitcoin"
61+
branch = "rc1-fixes"
62+
63+
[patch.crates-io.bitcoin_hashes]
64+
git = "https://github.com/rust-bitcoin/rust-bitcoin"
65+
branch = "rc1-fixes"
66+
67+
[patch.crates-io.bitcoin-internals]
68+
git = "https://github.com/rust-bitcoin/rust-bitcoin"
69+
branch = "rc1-fixes"
70+
71+
[patch.crates-io.bitcoin-io]
72+
git = "https://github.com/rust-bitcoin/rust-bitcoin"
73+
branch = "rc1-fixes"
74+
75+
[patch.crates-io.bitcoin-units]
76+
git = "https://github.com/rust-bitcoin/rust-bitcoin"
77+
branch = "rc1-fixes"

crates/bdk/Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ rust-version = "1.63"
1414

1515
[dependencies]
1616
rand = "^0.8"
17-
miniscript = { version = "11.0.0", features = ["serde"], default-features = false }
18-
bitcoin = { version = "0.31.0", features = ["serde", "base64", "rand-std"], default-features = false }
17+
miniscript = { version = "12.0.0", features = ["serde"], default-features = false }
18+
bitcoin = { version = "0.32.0-rc1", features = ["serde", "base64", "rand-std"], default-features = false }
1919
serde = { version = "^1.0", features = ["derive"] }
2020
serde_json = { version = "^1.0" }
21-
bdk_chain = { path = "../chain", version = "0.11.0", features = ["miniscript", "serde"], default-features = false }
21+
bdk_chain = { path = "../chain", features = ["miniscript", "serde"], default-features = false }
2222

2323
# Optional dependencies
2424
bip39 = { version = "2.0", optional = true }

crates/bdk/src/descriptor/dsl.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -702,10 +702,10 @@ macro_rules! fragment {
702702
$crate::keys::make_pkh($key, &secp)
703703
});
704704
( after ( $value:expr ) ) => ({
705-
$crate::impl_leaf_opcode_value!(After, $crate::miniscript::AbsLockTime::from_consensus($value))
705+
$crate::impl_leaf_opcode_value!(After, $crate::miniscript::AbsLockTime::from_consensus($value).expect("TODO: Handle error"))
706706
});
707707
( older ( $value:expr ) ) => ({
708-
$crate::impl_leaf_opcode_value!(Older, $crate::bitcoin::Sequence($value)) // TODO!!
708+
$crate::impl_leaf_opcode_value!(Older, $crate::miniscript::RelLockTime::from_consensus($value).expect("TODO: Handle error"))
709709
});
710710
( sha256 ( $hash:expr ) ) => ({
711711
$crate::impl_leaf_opcode_value!(Sha256, $hash)
@@ -768,7 +768,11 @@ macro_rules! fragment {
768768
( multi_vec ( $thresh:expr, $keys:expr ) ) => ({
769769
let secp = $crate::bitcoin::secp256k1::Secp256k1::new();
770770

771-
$crate::keys::make_multi($thresh, $crate::miniscript::Terminal::Multi, $keys, &secp)
771+
let fun = |k, pks| {
772+
let thresh = $crate::miniscript::Threshold::new(k, pks).expect("TODO: Handle this error");
773+
$crate::miniscript::Terminal::Multi(thresh)
774+
};
775+
$crate::keys::make_multi($thresh, fun, $keys, &secp)
772776
});
773777
( multi ( $thresh:expr $(, $key:expr )+ ) ) => ({
774778
$crate::group_multi_keys!( $( $key ),* )
@@ -777,7 +781,11 @@ macro_rules! fragment {
777781
( multi_a_vec ( $thresh:expr, $keys:expr ) ) => ({
778782
let secp = $crate::bitcoin::secp256k1::Secp256k1::new();
779783

780-
$crate::keys::make_multi($thresh, $crate::miniscript::Terminal::MultiA, $keys, &secp)
784+
let fun = |k, pks| {
785+
let thresh = $crate::miniscript::Threshold::new(k, pks).expect("TODO: Handle this error");
786+
$crate::miniscript::Terminal::MultiA(thresh)
787+
};
788+
$crate::keys::make_multi($thresh, fun, $keys, &secp)
781789
});
782790
( multi_a ( $thresh:expr $(, $key:expr )+ ) ) => ({
783791
$crate::group_multi_keys!( $( $key ),* )

crates/bdk/src/descriptor/error.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ pub enum Error {
3737
/// Error during base58 decoding
3838
Base58(bitcoin::base58::Error),
3939
/// Key-related error
40-
Pk(bitcoin::key::Error),
40+
Pk(bitcoin::key::ParsePublicKeyError),
4141
/// Miniscript error
4242
Miniscript(miniscript::Error),
4343
/// Hex decoding error
@@ -98,8 +98,8 @@ impl From<bitcoin::base58::Error> for Error {
9898
}
9999
}
100100

101-
impl From<bitcoin::key::Error> for Error {
102-
fn from(err: bitcoin::key::Error) -> Self {
101+
impl From<bitcoin::key::ParsePublicKeyError> for Error {
102+
fn from(err: bitcoin::key::ParsePublicKeyError) -> Self {
103103
Error::Pk(err)
104104
}
105105
}

crates/bdk/src/descriptor/mod.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ impl IntoWalletDescriptor for DescriptorTemplateOut {
229229
let pk = match pk {
230230
DescriptorPublicKey::XPub(ref xpub) => {
231231
let mut xpub = xpub.clone();
232-
xpub.xkey.network = self.network;
232+
xpub.xkey.network = self.network.into();
233233

234234
DescriptorPublicKey::XPub(xpub)
235235
}
@@ -264,11 +264,11 @@ impl IntoWalletDescriptor for DescriptorTemplateOut {
264264
.map(|(mut k, mut v)| {
265265
match (&mut k, &mut v) {
266266
(DescriptorPublicKey::XPub(xpub), DescriptorSecretKey::XPrv(xprv)) => {
267-
xpub.xkey.network = network;
268-
xprv.xkey.network = network;
267+
xpub.xkey.network = network.into();
268+
xprv.xkey.network = network.into();
269269
}
270270
(_, DescriptorSecretKey::Single(key)) => {
271-
key.key.network = network;
271+
key.key.network = network.into();
272272
}
273273
_ => {}
274274
}
@@ -606,7 +606,7 @@ mod test {
606606
use assert_matches::assert_matches;
607607
use bitcoin::hex::FromHex;
608608
use bitcoin::secp256k1::Secp256k1;
609-
use bitcoin::ScriptBuf;
609+
use bitcoin::{NetworkKind, ScriptBuf};
610610
use bitcoin::{bip32, Psbt};
611611

612612
use super::*;
@@ -743,7 +743,7 @@ mod test {
743743
.unwrap();
744744

745745
let mut xprv_testnet = xprv;
746-
xprv_testnet.network = Network::Testnet;
746+
xprv_testnet.network = NetworkKind::Test;
747747

748748
let xpub_testnet = bip32::Xpub::from_priv(&secp, &xprv_testnet);
749749
let desc_pubkey = DescriptorPublicKey::XPub(DescriptorXKey {

crates/bdk/src/descriptor/policy.rs

Lines changed: 79 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,9 @@ use miniscript::descriptor::{
5454
DescriptorPublicKey, ShInner, SinglePub, SinglePubKey, SortedMultiVec, WshInner,
5555
};
5656
use miniscript::hash256;
57+
use miniscript::miniscript::limits::{MAX_PUBKEYS_IN_CHECKSIGADD, MAX_PUBKEYS_PER_MULTISIG};
5758
use miniscript::{
58-
Descriptor, Miniscript, Satisfier, ScriptContext, SigType, Terminal, ToPublicKey,
59+
Descriptor, Miniscript, Satisfier, ScriptContext, SigType, Terminal, Threshold, ToPublicKey,
5960
};
6061

6162
use crate::descriptor::ExtractPolicy;
@@ -586,30 +587,29 @@ impl Policy {
586587
Ok(Some(policy))
587588
}
588589

589-
fn make_multisig<Ctx: ScriptContext + 'static>(
590-
keys: &[DescriptorPublicKey],
590+
fn make_multi<Ctx: ScriptContext + 'static>(
591+
threshold: &Threshold<DescriptorPublicKey, MAX_PUBKEYS_PER_MULTISIG>,
591592
signers: &SignersContainer,
592593
build_sat: BuildSatisfaction,
593-
threshold: usize,
594594
sorted: bool,
595595
secp: &SecpCtx,
596596
) -> Result<Option<Policy>, PolicyError> {
597-
if threshold == 0 {
597+
if threshold.k() == 0 {
598598
return Ok(None);
599599
}
600600

601-
let parsed_keys = keys.iter().map(|k| PkOrF::from_key(k, secp)).collect();
601+
let parsed_keys = threshold.iter().map(|k| PkOrF::from_key(k, secp)).collect();
602602

603603
let mut contribution = Satisfaction::Partial {
604-
n: keys.len(),
605-
m: threshold,
604+
n: threshold.n(),
605+
m: threshold.k(),
606606
items: vec![],
607607
conditions: Default::default(),
608608
sorted: Some(sorted),
609609
};
610610
let mut satisfaction = contribution.clone();
611611

612-
for (index, key) in keys.iter().enumerate() {
612+
for (index, key) in threshold.iter().enumerate() {
613613
if signers.find(signer_id(key, secp)).is_some() {
614614
contribution.add(
615615
&Satisfaction::Complete {
@@ -635,7 +635,64 @@ impl Policy {
635635

636636
let mut policy: Policy = SatisfiableItem::Multisig {
637637
keys: parsed_keys,
638-
threshold,
638+
threshold: threshold.k(),
639+
}
640+
.into();
641+
policy.contribution = contribution;
642+
policy.satisfaction = satisfaction;
643+
644+
Ok(Some(policy))
645+
}
646+
647+
fn make_multi_a<Ctx: ScriptContext + 'static>(
648+
threshold: &Threshold<DescriptorPublicKey, MAX_PUBKEYS_IN_CHECKSIGADD>,
649+
signers: &SignersContainer,
650+
build_sat: BuildSatisfaction,
651+
sorted: bool,
652+
secp: &SecpCtx,
653+
) -> Result<Option<Policy>, PolicyError> {
654+
if threshold.k() == 0 {
655+
return Ok(None);
656+
}
657+
658+
let parsed_keys = threshold.iter().map(|k| PkOrF::from_key(k, secp)).collect();
659+
660+
let mut contribution = Satisfaction::Partial {
661+
n: threshold.n(),
662+
m: threshold.k(),
663+
items: vec![],
664+
conditions: Default::default(),
665+
sorted: Some(sorted),
666+
};
667+
let mut satisfaction = contribution.clone();
668+
669+
for (index, key) in threshold.iter().enumerate() {
670+
if signers.find(signer_id(key, secp)).is_some() {
671+
contribution.add(
672+
&Satisfaction::Complete {
673+
condition: Default::default(),
674+
},
675+
index,
676+
)?;
677+
}
678+
679+
if let Some(psbt) = build_sat.psbt() {
680+
if Ctx::find_signature(psbt, key, secp) {
681+
satisfaction.add(
682+
&Satisfaction::Complete {
683+
condition: Default::default(),
684+
},
685+
index,
686+
)?;
687+
}
688+
}
689+
}
690+
satisfaction.finalize();
691+
contribution.finalize();
692+
693+
let mut policy: Policy = SatisfiableItem::Multisig {
694+
keys: parsed_keys,
695+
threshold: threshold.k(),
639696
}
640697
.into();
641698
policy.contribution = contribution;
@@ -952,11 +1009,11 @@ impl<Ctx: ScriptContext + 'static> ExtractPolicy for Miniscript<DescriptorPublic
9521009
Some(policy)
9531010
}
9541011
Terminal::Older(value) => {
955-
let mut policy: Policy = SatisfiableItem::RelativeTimelock { value: *value }.into();
1012+
let mut policy: Policy = SatisfiableItem::RelativeTimelock { value: ((*value).into()) }.into();
9561013
policy.contribution = Satisfaction::Complete {
9571014
condition: Condition {
9581015
timelock: None,
959-
csv: Some(*value),
1016+
csv: Some(Sequence::from(*value)),
9601017
},
9611018
};
9621019
if let BuildSatisfaction::PsbtTimelocks {
@@ -966,9 +1023,9 @@ impl<Ctx: ScriptContext + 'static> ExtractPolicy for Miniscript<DescriptorPublic
9661023
} = build_sat
9671024
{
9681025
let older = Older::new(Some(current_height), Some(input_max_height), false);
969-
let older_sat = Satisfier::<bitcoin::PublicKey>::check_older(&older, *value);
1026+
let older_sat = Satisfier::<bitcoin::PublicKey>::check_older(&older, (*value).into());
9701027
let inputs_sat = psbt_inputs_sat(psbt)
971-
.all(|sat| Satisfier::<bitcoin::PublicKey>::check_older(&sat, *value));
1028+
.all(|sat| Satisfier::<bitcoin::PublicKey>::check_older(&sat, (*value).into()));
9721029
if older_sat && inputs_sat {
9731030
policy.satisfaction = policy.contribution.clone();
9741031
}
@@ -986,8 +1043,11 @@ impl<Ctx: ScriptContext + 'static> ExtractPolicy for Miniscript<DescriptorPublic
9861043
Terminal::Hash160(hash) => {
9871044
Some(SatisfiableItem::Hash160Preimage { hash: *hash }.into())
9881045
}
989-
Terminal::Multi(k, pks) | Terminal::MultiA(k, pks) => {
990-
Policy::make_multisig::<Ctx>(pks, signers, build_sat, *k, false, secp)?
1046+
Terminal::Multi(ref thresh) => {
1047+
Policy::make_multi::<Ctx>(thresh, signers, build_sat, false, secp)?
1048+
}
1049+
Terminal::MultiA(ref thresh) => {
1050+
Policy::make_multi_a::<Ctx>(thresh, signers, build_sat, false, secp)?
9911051
}
9921052
// Identities
9931053
Terminal::Alt(inner)
@@ -1087,11 +1147,11 @@ impl ExtractPolicy for Descriptor<DescriptorPublicKey> {
10871147
build_sat: BuildSatisfaction,
10881148
secp: &SecpCtx,
10891149
) -> Result<Option<Policy>, Error> {
1090-
Ok(Policy::make_multisig::<Ctx>(
1091-
keys.pks.as_ref(),
1150+
let thresh = Threshold::new(keys.k(), keys.pks().to_vec()).expect("TODO: Handle this error");
1151+
Ok(Policy::make_multi::<Ctx>(
1152+
&thresh,
10921153
signers,
10931154
build_sat,
1094-
keys.k,
10951155
true,
10961156
secp,
10971157
)?)

crates/bdk/src/descriptor/template.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,7 @@ mod test {
559559
use crate::descriptor::{DescriptorError, DescriptorMeta};
560560
use crate::keys::ValidNetworks;
561561
use assert_matches::assert_matches;
562+
use bitcoin::NetworkKind;
562563
use miniscript::descriptor::{DescriptorPublicKey, KeyMap};
563564
use miniscript::Descriptor;
564565

@@ -568,7 +569,7 @@ mod test {
568569
use bitcoin::bip32::ChildNumber::{self, Hardened};
569570

570571
let xprvkey = bitcoin::bip32::Xpriv::from_str("xprv9s21ZrQH143K2fpbqApQL69a4oKdGVnVN52R82Ft7d1pSqgKmajF62acJo3aMszZb6qQ22QsVECSFxvf9uyxFUvFYQMq3QbtwtRSMjLAhMf").unwrap();
571-
assert_eq!(Network::Bitcoin, xprvkey.network);
572+
assert_eq!(NetworkKind::Main, xprvkey.network);
572573
let xdesc = Bip44(xprvkey, KeychainKind::Internal)
573574
.build(Network::Bitcoin)
574575
.unwrap();
@@ -582,7 +583,7 @@ mod test {
582583
}
583584

584585
let tprvkey = bitcoin::bip32::Xpriv::from_str("tprv8ZgxMBicQKsPcx5nBGsR63Pe8KnRUqmbJNENAfGftF3yuXoMMoVJJcYeUw5eVkm9WBPjWYt6HMWYJNesB5HaNVBaFc1M6dRjWSYnmewUMYy").unwrap();
585-
assert_eq!(Network::Testnet, tprvkey.network);
586+
assert_eq!(NetworkKind::Test, tprvkey.network);
586587
let tdesc = Bip44(tprvkey, KeychainKind::Internal)
587588
.build(Network::Testnet)
588589
.unwrap();

0 commit comments

Comments
 (0)