Merge bitcoindevkit/bdk#596: Bump MSRV to 1.56
cca69481eb7edb28532a4ed78185248d410050ac Bump MSRV to 1.56 (Alekos Filini) Pull request description: ### Description Following the discussion in #331, bump the MSRV to `1.56`. We already have other PRs bumping it to at least `1.51` (#593), but I'm felling like we are always lagging behind and our CI breaks regularly. As @LLFourn suggested, this PR makes a relatively large bump, hoping this buys us enough time to finish splitting up BDK, which will allow us to have a lower MSRV for the "core" crate. ### Checklists #### All Submissions: * [x] I've signed all my commits * [x] I followed the [contribution guidelines](https://github.com/bitcoindevkit/bdk/blob/master/CONTRIBUTING.md) * [x] I ran `cargo fmt` and `cargo clippy` before committing #### New Features: * [x] I've updated `CHANGELOG.md` ACKs for top commit: notmandatory: ACK cca69481eb7edb28532a4ed78185248d410050ac Tree-SHA512: bc6572dc94e1c4cbb6d21f6e06a9730af5763fb4811311a61a6a6ec850b5a65664a21e4a7070a3ebcd702529fbba97b2e9a43c1277b9b9f092e194f16a39bc1a
This commit is contained in:
commit
2f325328c5
4
.github/workflows/cont_integration.yml
vendored
4
.github/workflows/cont_integration.yml
vendored
@ -10,9 +10,9 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
rust:
|
rust:
|
||||||
- version: 1.56.0 # STABLE
|
- version: 1.60.0 # STABLE
|
||||||
clippy: true
|
clippy: true
|
||||||
- version: 1.46.0 # MSRV
|
- version: 1.56.0 # MSRV
|
||||||
features:
|
features:
|
||||||
- default
|
- default
|
||||||
- minimal
|
- minimal
|
||||||
|
@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
- added `OldestFirstCoinSelection` impl to `CoinSelectionAlgorithm`
|
- added `OldestFirstCoinSelection` impl to `CoinSelectionAlgorithm`
|
||||||
|
- New MSRV set to `1.56`
|
||||||
|
|
||||||
|
|
||||||
## [v0.18.0] - [v0.17.0]
|
## [v0.18.0] - [v0.17.0]
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
<a href="https://github.com/bitcoindevkit/bdk/actions?query=workflow%3ACI"><img alt="CI Status" src="https://github.com/bitcoindevkit/bdk/workflows/CI/badge.svg"></a>
|
<a href="https://github.com/bitcoindevkit/bdk/actions?query=workflow%3ACI"><img alt="CI Status" src="https://github.com/bitcoindevkit/bdk/workflows/CI/badge.svg"></a>
|
||||||
<a href="https://codecov.io/gh/bitcoindevkit/bdk"><img src="https://codecov.io/gh/bitcoindevkit/bdk/branch/master/graph/badge.svg"/></a>
|
<a href="https://codecov.io/gh/bitcoindevkit/bdk"><img src="https://codecov.io/gh/bitcoindevkit/bdk/branch/master/graph/badge.svg"/></a>
|
||||||
<a href="https://docs.rs/bdk"><img alt="API Docs" src="https://img.shields.io/badge/docs.rs-bdk-green"/></a>
|
<a href="https://docs.rs/bdk"><img alt="API Docs" src="https://img.shields.io/badge/docs.rs-bdk-green"/></a>
|
||||||
<a href="https://blog.rust-lang.org/2020/08/27/Rust-1.46.0.html"><img alt="Rustc Version 1.46+" src="https://img.shields.io/badge/rustc-1.46%2B-lightgrey.svg"/></a>
|
<a href="https://blog.rust-lang.org/2020/08/27/Rust-1.56.0.html"><img alt="Rustc Version 1.56+" src="https://img.shields.io/badge/rustc-1.56%2B-lightgrey.svg"/></a>
|
||||||
<a href="https://discord.gg/d7NkDKm"><img alt="Chat on Discord" src="https://img.shields.io/discord/753336465005608961?logo=discord"></a>
|
<a href="https://discord.gg/d7NkDKm"><img alt="Chat on Discord" src="https://img.shields.io/discord/753336465005608961?logo=discord"></a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -85,7 +85,7 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
|
|
||||||
let network = matches
|
let network = matches
|
||||||
.value_of("network")
|
.value_of("network")
|
||||||
.map(|n| Network::from_str(n))
|
.map(Network::from_str)
|
||||||
.transpose()
|
.transpose()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.unwrap_or(Network::Testnet);
|
.unwrap_or(Network::Testnet);
|
||||||
|
@ -34,6 +34,14 @@
|
|||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
macro_rules! impl_from {
|
macro_rules! impl_from {
|
||||||
|
( boxed $from:ty, $to:ty, $variant:ident, $( $cfg:tt )* ) => {
|
||||||
|
$( $cfg )*
|
||||||
|
impl From<$from> for $to {
|
||||||
|
fn from(inner: $from) -> Self {
|
||||||
|
<$to>::$variant(Box::new(inner))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
( $from:ty, $to:ty, $variant:ident, $( $cfg:tt )* ) => {
|
( $from:ty, $to:ty, $variant:ident, $( $cfg:tt )* ) => {
|
||||||
$( $cfg )*
|
$( $cfg )*
|
||||||
impl From<$from> for $to {
|
impl From<$from> for $to {
|
||||||
@ -68,19 +76,19 @@ pub enum AnyBlockchain {
|
|||||||
#[cfg(feature = "electrum")]
|
#[cfg(feature = "electrum")]
|
||||||
#[cfg_attr(docsrs, doc(cfg(feature = "electrum")))]
|
#[cfg_attr(docsrs, doc(cfg(feature = "electrum")))]
|
||||||
/// Electrum client
|
/// Electrum client
|
||||||
Electrum(electrum::ElectrumBlockchain),
|
Electrum(Box<electrum::ElectrumBlockchain>),
|
||||||
#[cfg(feature = "esplora")]
|
#[cfg(feature = "esplora")]
|
||||||
#[cfg_attr(docsrs, doc(cfg(feature = "esplora")))]
|
#[cfg_attr(docsrs, doc(cfg(feature = "esplora")))]
|
||||||
/// Esplora client
|
/// Esplora client
|
||||||
Esplora(esplora::EsploraBlockchain),
|
Esplora(Box<esplora::EsploraBlockchain>),
|
||||||
#[cfg(feature = "compact_filters")]
|
#[cfg(feature = "compact_filters")]
|
||||||
#[cfg_attr(docsrs, doc(cfg(feature = "compact_filters")))]
|
#[cfg_attr(docsrs, doc(cfg(feature = "compact_filters")))]
|
||||||
/// Compact filters client
|
/// Compact filters client
|
||||||
CompactFilters(compact_filters::CompactFiltersBlockchain),
|
CompactFilters(Box<compact_filters::CompactFiltersBlockchain>),
|
||||||
#[cfg(feature = "rpc")]
|
#[cfg(feature = "rpc")]
|
||||||
#[cfg_attr(docsrs, doc(cfg(feature = "rpc")))]
|
#[cfg_attr(docsrs, doc(cfg(feature = "rpc")))]
|
||||||
/// RPC client
|
/// RPC client
|
||||||
Rpc(rpc::RpcBlockchain),
|
Rpc(Box<rpc::RpcBlockchain>),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[maybe_async]
|
#[maybe_async]
|
||||||
@ -141,10 +149,10 @@ impl WalletSync for AnyBlockchain {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl_from!(electrum::ElectrumBlockchain, AnyBlockchain, Electrum, #[cfg(feature = "electrum")]);
|
impl_from!(boxed electrum::ElectrumBlockchain, AnyBlockchain, Electrum, #[cfg(feature = "electrum")]);
|
||||||
impl_from!(esplora::EsploraBlockchain, AnyBlockchain, Esplora, #[cfg(feature = "esplora")]);
|
impl_from!(boxed esplora::EsploraBlockchain, AnyBlockchain, Esplora, #[cfg(feature = "esplora")]);
|
||||||
impl_from!(compact_filters::CompactFiltersBlockchain, AnyBlockchain, CompactFilters, #[cfg(feature = "compact_filters")]);
|
impl_from!(boxed compact_filters::CompactFiltersBlockchain, AnyBlockchain, CompactFilters, #[cfg(feature = "compact_filters")]);
|
||||||
impl_from!(rpc::RpcBlockchain, AnyBlockchain, Rpc, #[cfg(feature = "rpc")]);
|
impl_from!(boxed rpc::RpcBlockchain, AnyBlockchain, Rpc, #[cfg(feature = "rpc")]);
|
||||||
|
|
||||||
/// Type that can contain any of the blockchain configurations defined by the library
|
/// Type that can contain any of the blockchain configurations defined by the library
|
||||||
///
|
///
|
||||||
@ -207,19 +215,19 @@ impl ConfigurableBlockchain for AnyBlockchain {
|
|||||||
Ok(match config {
|
Ok(match config {
|
||||||
#[cfg(feature = "electrum")]
|
#[cfg(feature = "electrum")]
|
||||||
AnyBlockchainConfig::Electrum(inner) => {
|
AnyBlockchainConfig::Electrum(inner) => {
|
||||||
AnyBlockchain::Electrum(electrum::ElectrumBlockchain::from_config(inner)?)
|
AnyBlockchain::Electrum(Box::new(electrum::ElectrumBlockchain::from_config(inner)?))
|
||||||
}
|
}
|
||||||
#[cfg(feature = "esplora")]
|
#[cfg(feature = "esplora")]
|
||||||
AnyBlockchainConfig::Esplora(inner) => {
|
AnyBlockchainConfig::Esplora(inner) => {
|
||||||
AnyBlockchain::Esplora(esplora::EsploraBlockchain::from_config(inner)?)
|
AnyBlockchain::Esplora(Box::new(esplora::EsploraBlockchain::from_config(inner)?))
|
||||||
}
|
}
|
||||||
#[cfg(feature = "compact_filters")]
|
#[cfg(feature = "compact_filters")]
|
||||||
AnyBlockchainConfig::CompactFilters(inner) => AnyBlockchain::CompactFilters(
|
AnyBlockchainConfig::CompactFilters(inner) => AnyBlockchain::CompactFilters(Box::new(
|
||||||
compact_filters::CompactFiltersBlockchain::from_config(inner)?,
|
compact_filters::CompactFiltersBlockchain::from_config(inner)?,
|
||||||
),
|
)),
|
||||||
#[cfg(feature = "rpc")]
|
#[cfg(feature = "rpc")]
|
||||||
AnyBlockchainConfig::Rpc(inner) => {
|
AnyBlockchainConfig::Rpc(inner) => {
|
||||||
AnyBlockchain::Rpc(rpc::RpcBlockchain::from_config(inner)?)
|
AnyBlockchain::Rpc(Box::new(rpc::RpcBlockchain::from_config(inner)?))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -94,8 +94,7 @@ impl Mempool {
|
|||||||
TxIdentifier::Wtxid(wtxid) => self.0.read().unwrap().wtxids.get(&wtxid).cloned(),
|
TxIdentifier::Wtxid(wtxid) => self.0.read().unwrap().wtxids.get(&wtxid).cloned(),
|
||||||
};
|
};
|
||||||
|
|
||||||
txid.map(|txid| self.0.read().unwrap().txs.get(&txid).cloned())
|
txid.and_then(|txid| self.0.read().unwrap().txs.get(&txid).cloned())
|
||||||
.flatten()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return whether or not the mempool contains a transaction with a given txid
|
/// Return whether or not the mempool contains a transaction with a given txid
|
||||||
@ -111,6 +110,7 @@ impl Mempool {
|
|||||||
|
|
||||||
/// A Bitcoin peer
|
/// A Bitcoin peer
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
#[allow(dead_code)]
|
||||||
pub struct Peer {
|
pub struct Peer {
|
||||||
writer: Arc<Mutex<TcpStream>>,
|
writer: Arc<Mutex<TcpStream>>,
|
||||||
responses: Arc<RwLock<ResponsesMap>>,
|
responses: Arc<RwLock<ResponsesMap>>,
|
||||||
|
@ -54,8 +54,6 @@ use std::str::FromStr;
|
|||||||
pub struct RpcBlockchain {
|
pub struct RpcBlockchain {
|
||||||
/// Rpc client to the node, includes the wallet name
|
/// Rpc client to the node, includes the wallet name
|
||||||
client: Client,
|
client: Client,
|
||||||
/// Network used
|
|
||||||
network: Network,
|
|
||||||
/// Blockchain capabilities, cached here at startup
|
/// Blockchain capabilities, cached here at startup
|
||||||
capabilities: HashSet<Capability>,
|
capabilities: HashSet<Capability>,
|
||||||
/// Skip this many blocks of the blockchain at the first rescan, if None the rescan is done from the genesis block
|
/// Skip this many blocks of the blockchain at the first rescan, if None the rescan is done from the genesis block
|
||||||
@ -417,7 +415,6 @@ impl ConfigurableBlockchain for RpcBlockchain {
|
|||||||
|
|
||||||
Ok(RpcBlockchain {
|
Ok(RpcBlockchain {
|
||||||
client,
|
client,
|
||||||
network,
|
|
||||||
capabilities,
|
capabilities,
|
||||||
_storage_address: storage_address,
|
_storage_address: storage_address,
|
||||||
skip_blocks: config.skip_blocks,
|
skip_blocks: config.skip_blocks,
|
||||||
|
@ -200,8 +200,7 @@ pub(crate) trait DatabaseUtils: Database {
|
|||||||
D: FnOnce() -> Result<Option<Transaction>, Error>,
|
D: FnOnce() -> Result<Option<Transaction>, Error>,
|
||||||
{
|
{
|
||||||
self.get_tx(txid, true)?
|
self.get_tx(txid, true)?
|
||||||
.map(|t| t.transaction)
|
.and_then(|t| t.transaction)
|
||||||
.flatten()
|
|
||||||
.map_or_else(default, |t| Ok(Some(t)))
|
.map_or_else(default, |t| Ok(Some(t)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -357,7 +357,8 @@ impl Satisfaction {
|
|||||||
// we map each of the combinations of elements into a tuple of ([chosen items], [conditions]). unfortunately, those items have potentially more than one
|
// we map each of the combinations of elements into a tuple of ([chosen items], [conditions]). unfortunately, those items have potentially more than one
|
||||||
// condition (think about ORs), so we also use `mix` to expand those, i.e. [[0], [1, 2]] becomes [[0, 1], [0, 2]]. This is necessary to make sure that we
|
// condition (think about ORs), so we also use `mix` to expand those, i.e. [[0], [1, 2]] becomes [[0, 1], [0, 2]]. This is necessary to make sure that we
|
||||||
// consider every possible options and check whether or not they are compatible.
|
// consider every possible options and check whether or not they are compatible.
|
||||||
.map(|i_vec| {
|
// since this step can turn one item of the iterator into multiple ones, we use `flat_map()` to expand them out
|
||||||
|
.flat_map(|i_vec| {
|
||||||
mix(i_vec
|
mix(i_vec
|
||||||
.iter()
|
.iter()
|
||||||
.map(|i| {
|
.map(|i| {
|
||||||
@ -371,9 +372,6 @@ impl Satisfaction {
|
|||||||
.map(|x| (i_vec.clone(), x))
|
.map(|x| (i_vec.clone(), x))
|
||||||
.collect::<Vec<(Vec<usize>, Vec<Condition>)>>()
|
.collect::<Vec<(Vec<usize>, Vec<Condition>)>>()
|
||||||
})
|
})
|
||||||
// .inspect(|x: &Vec<(Vec<usize>, Vec<Condition>)>| println!("fetch {:?}", x))
|
|
||||||
// since the previous step can turn one item of the iterator into multiple ones, we call flatten to expand them out
|
|
||||||
.flatten()
|
|
||||||
// .inspect(|x| println!("flat {:?}", x))
|
// .inspect(|x| println!("flat {:?}", x))
|
||||||
// try to fold all the conditions for this specific combination of indexes/options. if they are not compatible, try_fold will be Err
|
// try to fold all the conditions for this specific combination of indexes/options. if they are not compatible, try_fold will be Err
|
||||||
.map(|(key, val)| {
|
.map(|(key, val)| {
|
||||||
|
@ -101,7 +101,7 @@ impl FromStr for FullyNodedExport {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn remove_checksum(s: String) -> String {
|
fn remove_checksum(s: String) -> String {
|
||||||
s.splitn(2, '#').next().map(String::from).unwrap()
|
s.split_once('#').map(|(a, _)| String::from(a)).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FullyNodedExport {
|
impl FullyNodedExport {
|
||||||
|
@ -1603,9 +1603,9 @@ where
|
|||||||
pub fn descriptor_checksum(&self, keychain: KeychainKind) -> String {
|
pub fn descriptor_checksum(&self, keychain: KeychainKind) -> String {
|
||||||
self.get_descriptor_for_keychain(keychain)
|
self.get_descriptor_for_keychain(keychain)
|
||||||
.to_string()
|
.to_string()
|
||||||
.splitn(2, '#')
|
.split_once('#')
|
||||||
.next()
|
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
.0
|
||||||
.to_string()
|
.to_string()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -479,6 +479,7 @@ pub struct SignOptions {
|
|||||||
pub allow_all_sighashes: bool,
|
pub allow_all_sighashes: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(clippy::derivable_impls)]
|
||||||
impl Default for SignOptions {
|
impl Default for SignOptions {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
SignOptions {
|
SignOptions {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user