diff --git a/.github/workflows/cont_integration.yml b/.github/workflows/cont_integration.yml index badcd2e6..091ba157 100644 --- a/.github/workflows/cont_integration.yml +++ b/.github/workflows/cont_integration.yml @@ -10,9 +10,9 @@ jobs: strategy: matrix: rust: - - version: 1.56.0 # STABLE + - version: 1.60.0 # STABLE clippy: true - - version: 1.46.0 # MSRV + - version: 1.56.0 # MSRV features: - default - minimal diff --git a/CHANGELOG.md b/CHANGELOG.md index 6506d12d..5cb9f31c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] - added `OldestFirstCoinSelection` impl to `CoinSelectionAlgorithm` +- New MSRV set to `1.56` ## [v0.18.0] - [v0.17.0] diff --git a/README.md b/README.md index 8f2c7e74..10ae41c0 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ CI Status API Docs - Rustc Version 1.46+ + Rustc Version 1.56+ Chat on Discord

diff --git a/examples/compiler.rs b/examples/compiler.rs index c3a3cb4f..8be87e81 100644 --- a/examples/compiler.rs +++ b/examples/compiler.rs @@ -85,7 +85,7 @@ fn main() -> Result<(), Box> { let network = matches .value_of("network") - .map(|n| Network::from_str(n)) + .map(Network::from_str) .transpose() .unwrap() .unwrap_or(Network::Testnet); diff --git a/src/blockchain/any.rs b/src/blockchain/any.rs index 91f448b3..b6698462 100644 --- a/src/blockchain/any.rs +++ b/src/blockchain/any.rs @@ -34,6 +34,14 @@ use super::*; 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 )* ) => { $( $cfg )* impl From<$from> for $to { @@ -68,19 +76,19 @@ pub enum AnyBlockchain { #[cfg(feature = "electrum")] #[cfg_attr(docsrs, doc(cfg(feature = "electrum")))] /// Electrum client - Electrum(electrum::ElectrumBlockchain), + Electrum(Box), #[cfg(feature = "esplora")] #[cfg_attr(docsrs, doc(cfg(feature = "esplora")))] /// Esplora client - Esplora(esplora::EsploraBlockchain), + Esplora(Box), #[cfg(feature = "compact_filters")] #[cfg_attr(docsrs, doc(cfg(feature = "compact_filters")))] /// Compact filters client - CompactFilters(compact_filters::CompactFiltersBlockchain), + CompactFilters(Box), #[cfg(feature = "rpc")] #[cfg_attr(docsrs, doc(cfg(feature = "rpc")))] /// RPC client - Rpc(rpc::RpcBlockchain), + Rpc(Box), } #[maybe_async] @@ -141,10 +149,10 @@ impl WalletSync for AnyBlockchain { } } -impl_from!(electrum::ElectrumBlockchain, AnyBlockchain, Electrum, #[cfg(feature = "electrum")]); -impl_from!(esplora::EsploraBlockchain, AnyBlockchain, Esplora, #[cfg(feature = "esplora")]); -impl_from!(compact_filters::CompactFiltersBlockchain, AnyBlockchain, CompactFilters, #[cfg(feature = "compact_filters")]); -impl_from!(rpc::RpcBlockchain, AnyBlockchain, Rpc, #[cfg(feature = "rpc")]); +impl_from!(boxed electrum::ElectrumBlockchain, AnyBlockchain, Electrum, #[cfg(feature = "electrum")]); +impl_from!(boxed esplora::EsploraBlockchain, AnyBlockchain, Esplora, #[cfg(feature = "esplora")]); +impl_from!(boxed compact_filters::CompactFiltersBlockchain, AnyBlockchain, CompactFilters, #[cfg(feature = "compact_filters")]); +impl_from!(boxed rpc::RpcBlockchain, AnyBlockchain, Rpc, #[cfg(feature = "rpc")]); /// Type that can contain any of the blockchain configurations defined by the library /// @@ -207,19 +215,19 @@ impl ConfigurableBlockchain for AnyBlockchain { Ok(match config { #[cfg(feature = "electrum")] AnyBlockchainConfig::Electrum(inner) => { - AnyBlockchain::Electrum(electrum::ElectrumBlockchain::from_config(inner)?) + AnyBlockchain::Electrum(Box::new(electrum::ElectrumBlockchain::from_config(inner)?)) } #[cfg(feature = "esplora")] AnyBlockchainConfig::Esplora(inner) => { - AnyBlockchain::Esplora(esplora::EsploraBlockchain::from_config(inner)?) + AnyBlockchain::Esplora(Box::new(esplora::EsploraBlockchain::from_config(inner)?)) } #[cfg(feature = "compact_filters")] - AnyBlockchainConfig::CompactFilters(inner) => AnyBlockchain::CompactFilters( + AnyBlockchainConfig::CompactFilters(inner) => AnyBlockchain::CompactFilters(Box::new( compact_filters::CompactFiltersBlockchain::from_config(inner)?, - ), + )), #[cfg(feature = "rpc")] AnyBlockchainConfig::Rpc(inner) => { - AnyBlockchain::Rpc(rpc::RpcBlockchain::from_config(inner)?) + AnyBlockchain::Rpc(Box::new(rpc::RpcBlockchain::from_config(inner)?)) } }) } diff --git a/src/blockchain/compact_filters/peer.rs b/src/blockchain/compact_filters/peer.rs index f415d285..a8d65aa9 100644 --- a/src/blockchain/compact_filters/peer.rs +++ b/src/blockchain/compact_filters/peer.rs @@ -94,8 +94,7 @@ impl Mempool { TxIdentifier::Wtxid(wtxid) => self.0.read().unwrap().wtxids.get(&wtxid).cloned(), }; - txid.map(|txid| self.0.read().unwrap().txs.get(&txid).cloned()) - .flatten() + txid.and_then(|txid| self.0.read().unwrap().txs.get(&txid).cloned()) } /// Return whether or not the mempool contains a transaction with a given txid @@ -111,6 +110,7 @@ impl Mempool { /// A Bitcoin peer #[derive(Debug)] +#[allow(dead_code)] pub struct Peer { writer: Arc>, responses: Arc>, diff --git a/src/blockchain/rpc.rs b/src/blockchain/rpc.rs index e8da3451..78d166e3 100644 --- a/src/blockchain/rpc.rs +++ b/src/blockchain/rpc.rs @@ -54,8 +54,6 @@ use std::str::FromStr; pub struct RpcBlockchain { /// Rpc client to the node, includes the wallet name client: Client, - /// Network used - network: Network, /// Blockchain capabilities, cached here at startup capabilities: HashSet, /// 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 { client, - network, capabilities, _storage_address: storage_address, skip_blocks: config.skip_blocks, diff --git a/src/database/mod.rs b/src/database/mod.rs index 8141ede4..e31d3a1e 100644 --- a/src/database/mod.rs +++ b/src/database/mod.rs @@ -200,8 +200,7 @@ pub(crate) trait DatabaseUtils: Database { D: FnOnce() -> Result, Error>, { self.get_tx(txid, true)? - .map(|t| t.transaction) - .flatten() + .and_then(|t| t.transaction) .map_or_else(default, |t| Ok(Some(t))) } diff --git a/src/descriptor/policy.rs b/src/descriptor/policy.rs index d89368de..8716a86c 100644 --- a/src/descriptor/policy.rs +++ b/src/descriptor/policy.rs @@ -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 // 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. - .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 .iter() .map(|i| { @@ -371,9 +372,6 @@ impl Satisfaction { .map(|x| (i_vec.clone(), x)) .collect::, Vec)>>() }) - // .inspect(|x: &Vec<(Vec, Vec)>| 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)) // 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)| { diff --git a/src/wallet/export.rs b/src/wallet/export.rs index 026083e0..9c753211 100644 --- a/src/wallet/export.rs +++ b/src/wallet/export.rs @@ -101,7 +101,7 @@ impl FromStr for FullyNodedExport { } 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 { diff --git a/src/wallet/mod.rs b/src/wallet/mod.rs index 016c0cac..75669559 100644 --- a/src/wallet/mod.rs +++ b/src/wallet/mod.rs @@ -1603,9 +1603,9 @@ where pub fn descriptor_checksum(&self, keychain: KeychainKind) -> String { self.get_descriptor_for_keychain(keychain) .to_string() - .splitn(2, '#') - .next() + .split_once('#') .unwrap() + .0 .to_string() } } diff --git a/src/wallet/signer.rs b/src/wallet/signer.rs index 15cec186..d1db87d3 100644 --- a/src/wallet/signer.rs +++ b/src/wallet/signer.rs @@ -479,6 +479,7 @@ pub struct SignOptions { pub allow_all_sighashes: bool, } +#[allow(clippy::derivable_impls)] impl Default for SignOptions { fn default() -> Self { SignOptions {