Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: bump MSRV to 1.81 #790

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
rust: [
"stable",
"nightly",
"1.79", # MSRV
"1.81", # MSRV
]
flags: [
# No features
Expand All @@ -35,10 +35,10 @@ jobs:
include:
# MSRV features
- os: "ubuntu-latest"
rust: "1.79" # MSRV
rust: "1.81" # MSRV
flags: "--features json"
- os: "windows-latest"
rust: "1.79" # MSRV
rust: "1.81" # MSRV
flags: "--features json"
# All features
- os: "ubuntu-latest"
Expand All @@ -57,10 +57,10 @@ jobs:
cache-on-failure: true
# Only run tests on latest stable and above
- name: build
if: ${{ matrix.rust == '1.79' }} # MSRV
if: ${{ matrix.rust == '1.81' }} # MSRV
run: cargo build --workspace ${{ matrix.flags }}
- name: test
if: ${{ matrix.rust != '1.79' }} # MSRV
if: ${{ matrix.rust != '1.81' }} # MSRV
run: cargo test --workspace ${{ matrix.flags }}

miri:
Expand Down
4 changes: 1 addition & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ resolver = "2"
[workspace.package]
version = "0.8.9"
edition = "2021"
rust-version = "1.79"
rust-version = "1.81"
authors = ["Alloy Contributors"]
license = "MIT OR Apache-2.0"
homepage = "https://github.com/alloy-rs/core"
Expand Down Expand Up @@ -64,8 +64,6 @@ cfg-if = "1.0.0"
derive_more = { version = "1.0", default-features = false }
hex-literal = "0.4"
paste = "1.0"
num_enum = "0.7"
thiserror = "1.0"

# crypto
digest = "0.10"
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ When updating this, also update:
- .github/workflows/ci.yml
-->

The current MSRV (minimum supported rust version) is 1.79.
The current MSRV (minimum supported rust version) is 1.81.

Alloy will keep a rolling MSRV policy of **at least** two versions behind the
latest stable release (so if the latest stable release is 1.58, we would
Expand Down
2 changes: 1 addition & 1 deletion clippy.toml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
msrv = "1.79"
msrv = "1.81"
3 changes: 1 addition & 2 deletions crates/dyn-abi/src/coerce.rs
Original file line number Diff line number Diff line change
Expand Up @@ -256,8 +256,7 @@ enum Error {
EmptyHexStringWithoutPrefix,
}

#[cfg(feature = "std")]
impl std::error::Error for Error {}
impl core::error::Error for Error {}

impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
Expand Down
4 changes: 2 additions & 2 deletions crates/primitives/src/postgres.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ pub enum ToSqlError {
Overflow(usize, Type),
}

impl std::error::Error for ToSqlError {}
impl core::error::Error for ToSqlError {}

/// Convert to Postgres types.
///
Expand Down Expand Up @@ -225,7 +225,7 @@ pub enum FromSqlError {
ParseError(Type),
}

impl std::error::Error for FromSqlError {}
impl core::error::Error for FromSqlError {}

impl<'a, const BITS: usize, const LIMBS: usize> FromSql<'a> for Signed<BITS, LIMBS> {
fn accepts(ty: &Type) -> bool {
Expand Down
3 changes: 1 addition & 2 deletions crates/primitives/src/signed/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,7 @@ impl fmt::Display for ParseSignedError {
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct BigIntConversionError;

#[cfg(feature = "std")]
impl std::error::Error for BigIntConversionError {}
impl core::error::Error for BigIntConversionError {}

impl fmt::Display for BigIntConversionError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
Expand Down
3 changes: 1 addition & 2 deletions crates/sol-type-parser/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@ pub type Result<T, E = Error> = core::result::Result<T, E>;
#[derive(Clone, PartialEq, Eq)]
pub struct Error(Repr);

#[cfg(feature = "std")]
impl std::error::Error for Error {}
impl core::error::Error for Error {}

impl fmt::Debug for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
Expand Down
3 changes: 1 addition & 2 deletions crates/sol-type-parser/src/input.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,7 @@ impl fmt::Display for CustomError {
}
}

#[cfg(feature = "std")]
impl std::error::Error for CustomError {}
impl core::error::Error for CustomError {}

pub type Input<'a> = winnow::Stateful<&'a str, RecursionCheck>;

Expand Down
20 changes: 14 additions & 6 deletions crates/sol-types/src/abi/encoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,12 @@ impl Encoder {
}
}

/// Return a reference to the encoded words.
#[inline]
pub fn words(&self) -> &[Word] {
&self.buf
}

/// Finish the encoding process, returning the encoded words.
///
/// Use `into_bytes` instead to flatten the words into bytes.
Expand All @@ -53,16 +59,18 @@ impl Encoder {
self.buf
}

/// Return a reference to the encoded bytes.
#[inline]
pub fn bytes(&self) -> &[u8] {
// SAFETY: `#[repr(transparent)] FixedBytes<N>([u8; N])`
unsafe { &*(self.words() as *const [Word] as *const [[u8; 32]]) }.as_flattened()
}

/// Finish the encoding process, returning the encoded bytes.
#[inline]
pub fn into_bytes(self) -> Vec<u8> {
// TODO: remove once `Vec::into_flattened` is stabilized.
// unsafe { mem::transmute::<Vec<_>, Vec<[u8; 32]>>(self.buf) }.into_flattened()

// SAFETY: `#[repr(transparent)] FixedBytes<N>([u8; N])`
crate::impl_core::into_flattened::<u8, 32>(unsafe {
mem::transmute::<Vec<Word>, Vec<[u8; 32]>>(self.buf)
})
unsafe { mem::transmute::<Vec<Word>, Vec<[u8; 32]>>(self.finish()) }.into_flattened()
}

/// Determine the current suffix offset.
Expand Down
40 changes: 0 additions & 40 deletions crates/sol-types/src/impl_core.rs
Original file line number Diff line number Diff line change
@@ -1,16 +1,7 @@
//! Modified implementations of unstable libcore functions.

use alloc::vec::Vec;
use core::mem::{self, MaybeUninit};

trait Ext {
const IS_ZST: bool;
}

impl<T> Ext for T {
const IS_ZST: bool = mem::size_of::<Self>() == 0;
}

/// [`core::array::try_from_fn`]
#[inline]
pub(crate) fn try_from_fn<F, T, E, const N: usize>(mut cb: F) -> Result<[T; N], E>
Expand Down Expand Up @@ -88,34 +79,3 @@ pub(crate) unsafe fn array_assume_init<T, const N: usize>(array: [MaybeUninit<T>
unsafe fn transpose<T, const N: usize>(array: [MaybeUninit<T>; N]) -> MaybeUninit<[T; N]> {
mem::transmute_copy::<[MaybeUninit<T>; N], MaybeUninit<[T; N]>>(&mem::ManuallyDrop::new(&array))
}

// TODO(MSRV-1.80): remove
/// [`Vec::into_flattened`].
#[inline]
pub(crate) fn into_flattened<T, const N: usize>(vec: Vec<[T; N]>) -> Vec<T> {
let (ptr, len, cap) = into_raw_parts(vec);
let (new_len, new_cap) = if T::IS_ZST {
(len.checked_mul(N).expect("vec len overflow"), usize::MAX)
} else {
// SAFETY:
// - `cap * N` cannot overflow because the allocation is already in
// the address space.
// - Each `[T; N]` has `N` valid elements, so there are `len * N`
// valid elements in the allocation.
unsafe { (len.checked_mul(N).unwrap_unchecked(), cap.checked_mul(N).unwrap_unchecked()) }
};
// SAFETY:
// - `ptr` was allocated by `self`
// - `ptr` is well-aligned because `[T; N]` has the same alignment as `T`.
// - `new_cap` refers to the same sized allocation as `cap` because
// `new_cap * size_of::<T>()` == `cap * size_of::<[T; N]>()`
// - `len` <= `cap`, so `len * N` <= `cap * N`.
unsafe { Vec::from_raw_parts(ptr.cast(), new_len, new_cap) }
}

/// [`Vec::into_raw_parts`]
#[inline(always)]
fn into_raw_parts<T>(vec: Vec<T>) -> (*mut T, usize, usize) {
let mut me = mem::ManuallyDrop::new(vec);
(me.as_mut_ptr(), me.len(), me.capacity())
}
6 changes: 2 additions & 4 deletions crates/sol-types/src/types/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -103,8 +103,7 @@ impl fmt::Display for Revert {
}
}

#[cfg(feature = "std")]
impl std::error::Error for Revert {}
impl core::error::Error for Revert {}

impl AsRef<str> for Revert {
#[inline]
Expand Down Expand Up @@ -264,8 +263,7 @@ impl fmt::Display for Panic {
}
}

#[cfg(feature = "std")]
impl std::error::Error for Panic {}
impl core::error::Error for Panic {}

impl SolError for Panic {
type Parameters<'a> = (crate::sol_data::Uint<256>,);
Expand Down
8 changes: 2 additions & 6 deletions crates/sol-types/src/types/interface/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@ use crate::{alloc::string::ToString, Error, Panic, Result, Revert, SolError};
use alloc::{string::String, vec::Vec};
use core::{convert::Infallible, fmt, iter::FusedIterator, marker::PhantomData};

#[cfg(feature = "std")]
use std::error::Error as StdError;

mod event;
pub use event::SolEventInterface;

Expand Down Expand Up @@ -211,10 +208,9 @@ impl<T: fmt::Display> fmt::Display for ContractError<T> {
}
}

#[cfg(feature = "std")]
impl<T: StdError + 'static> StdError for ContractError<T> {
impl<T: core::error::Error + 'static> core::error::Error for ContractError<T> {
#[inline]
fn source(&self) -> Option<&(dyn StdError + 'static)> {
fn source(&self) -> Option<&(dyn core::error::Error + 'static)> {
match self {
Self::CustomError(error) => Some(error),
Self::Panic(panic) => Some(panic),
Expand Down
2 changes: 1 addition & 1 deletion crates/syn-solidity/tests/contracts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ impl Drop for GitPatcher<'_> {
}
}

fn parse_file(path: &Path) -> Result<File, Box<dyn std::error::Error>> {
fn parse_file(path: &Path) -> Result<File, Box<dyn core::error::Error>> {
let solidity = fs::read_to_string(path)?;
syn::parse_str(&solidity).map_err(Into::into)
}
Expand Down