From 982214b3d9c507c852473a24b6241f95ecd9876c Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Mon, 26 Dec 2022 10:01:20 -0600 Subject: [PATCH] derive Hash impl --- ethers-solc/src/artifacts/mod.rs | 56 +++++-------------- ethers-solc/src/artifacts/output_selection.rs | 2 +- ethers-solc/src/config.rs | 15 +---- ethers-solc/src/remappings.rs | 2 +- 4 files changed, 16 insertions(+), 59 deletions(-) diff --git a/ethers-solc/src/artifacts/mod.rs b/ethers-solc/src/artifacts/mod.rs index e79352f9..2329d293 100644 --- a/ethers-solc/src/artifacts/mod.rs +++ b/ethers-solc/src/artifacts/mod.rs @@ -9,7 +9,6 @@ use serde::{de::Visitor, Deserialize, Deserializer, Serialize, Serializer}; use std::{ collections::{BTreeMap, HashSet}, fmt, fs, - hash::{Hash, Hasher}, path::{Path, PathBuf}, str::FromStr, }; @@ -284,7 +283,7 @@ impl From for StandardJsonCompilerInput { } } -#[derive(Clone, Debug, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Hash)] #[serde(rename_all = "camelCase")] pub struct Settings { /// Stop compilation after the given stage. @@ -498,37 +497,8 @@ impl Default for Settings { } } -impl Hash for Settings { - fn hash(&self, state: &mut H) { - self.optimizer.enabled.hash(state); - self.optimizer.runs.hash(state); - if let Some(SettingsMetadata { bytecode_hash, cbor_metadata, .. }) = self.metadata { - (bytecode_hash.unwrap_or_default() as u8).hash(state); - cbor_metadata.hash(state); - } - self.output_selection.0.keys().cloned().collect::().hash(state); - (self.evm_version.unwrap_or_default() as u8).hash(state); - self.via_ir.hash(state); - if let Some(DebuggingSettings { revert_strings, debug_info, .. }) = &self.debug { - (revert_strings.unwrap_or_default() as u8).hash(state); - debug_info.hash(state); - } - } -} - -impl PartialEq for Settings { - fn eq(&self, other: &Self) -> bool { - self.optimizer == other.optimizer && - self.metadata == other.metadata && - self.output_selection == other.output_selection && - self.evm_version == other.evm_version && - self.via_ir == other.via_ir && - self.debug == other.debug - } -} - /// A wrapper type for all libraries in the form of `::` -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default, Hash)] #[serde(transparent)] pub struct Libraries { /// All libraries, `(file path -> (Lib name -> Address)) @@ -621,7 +591,7 @@ impl AsMut>> for Libraries { } } -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Hash)] pub struct Optimizer { #[serde(default, skip_serializing_if = "Option::is_none")] pub enabled: Option, @@ -654,7 +624,7 @@ impl Default for Optimizer { } } -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Default, Hash)] #[serde(rename_all = "camelCase")] pub struct OptimizerDetails { /// The peephole optimizer is always on if no details are given, @@ -694,7 +664,7 @@ pub struct OptimizerDetails { pub yul_details: Option, } -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Default, Hash)] #[serde(rename_all = "camelCase")] pub struct YulDetails { /// Improve allocation of stack slots for variables, can free up stack slots early. @@ -707,7 +677,7 @@ pub struct YulDetails { pub optimizer_steps: Option, } -#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize, Hash)] pub enum EvmVersion { Homestead, TangerineWhistle, @@ -791,7 +761,7 @@ impl FromStr for EvmVersion { } /// Debugging settings for solc -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Hash)] #[serde(rename_all = "camelCase")] pub struct DebuggingSettings { #[serde( @@ -816,7 +786,7 @@ pub struct DebuggingSettings { } /// How to treat revert (and require) reason strings. -#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize, Hash)] pub enum RevertStrings { /// "default" does not inject compiler-generated revert strings and keeps user-supplied ones. Default, @@ -863,7 +833,7 @@ impl Default for RevertStrings { } } -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Hash)] pub struct SettingsMetadata { /// Use only literal content and not URLs (false by default) #[serde(default, rename = "useLiteralContent", skip_serializing_if = "Option::is_none")] @@ -898,7 +868,7 @@ impl From for SettingsMetadata { /// Determines the hash method for the metadata hash that is appended to the bytecode. /// /// Solc's default is `Ipfs`, see . -#[derive(Clone, Debug, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, Copy, PartialEq, Eq, Serialize, Deserialize, Hash)] pub enum BytecodeHash { Ipfs, None, @@ -1049,7 +1019,7 @@ pub struct MetadataSource { } /// Model checker settings for solc -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Hash)] pub struct ModelCheckerSettings { #[serde(default, skip_serializing_if = "BTreeMap::is_empty")] pub contracts: BTreeMap>, @@ -1066,7 +1036,7 @@ pub struct ModelCheckerSettings { } /// Which model checker engine to run. -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Hash)] pub enum ModelCheckerEngine { Default, All, @@ -1107,7 +1077,7 @@ impl Default for ModelCheckerEngine { } /// Which model checker targets to check. -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Hash)] #[serde(rename_all = "camelCase")] pub enum ModelCheckerTarget { Assert, diff --git a/ethers-solc/src/artifacts/output_selection.rs b/ethers-solc/src/artifacts/output_selection.rs index b6017d91..a745d7b1 100644 --- a/ethers-solc/src/artifacts/output_selection.rs +++ b/ethers-solc/src/artifacts/output_selection.rs @@ -68,7 +68,7 @@ pub type FileOutputSelection = BTreeMap>; /// } /// } /// ``` -#[derive(Debug, Clone, Eq, PartialEq, Default, Deserialize)] +#[derive(Debug, Clone, Eq, PartialEq, Default, Deserialize, Hash)] #[serde(transparent)] pub struct OutputSelection(pub BTreeMap); diff --git a/ethers-solc/src/config.rs b/ethers-solc/src/config.rs index 0f7a70e0..93a041c5 100644 --- a/ethers-solc/src/config.rs +++ b/ethers-solc/src/config.rs @@ -11,7 +11,6 @@ use std::{ collections::{BTreeSet, HashSet}, fmt::{self, Formatter}, fs, - hash::{Hash, Hasher}, ops::{Deref, DerefMut}, path::{Component, Path, PathBuf}, }; @@ -720,7 +719,7 @@ impl ProjectPathsConfigBuilder { } /// The config to use when compiling the contracts -#[derive(Clone, Debug, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Hash)] pub struct SolcConfig { /// How the file was compiled pub settings: Settings, @@ -746,18 +745,6 @@ impl From for Settings { } } -impl Hash for SolcConfig { - fn hash(&self, state: &mut H) { - self.settings.hash(state); - } -} - -impl PartialEq for SolcConfig { - fn eq(&self, other: &Self) -> bool { - self.settings == other.settings - } -} - #[derive(Default)] pub struct SolcConfigBuilder { settings: Option, diff --git a/ethers-solc/src/remappings.rs b/ethers-solc/src/remappings.rs index 0006d603..4d7c6f6a 100644 --- a/ethers-solc/src/remappings.rs +++ b/ethers-solc/src/remappings.rs @@ -44,7 +44,7 @@ const JS_LIB_DIR: &str = "node_modules"; /// contracts-ethereum-package ./MyContract.sol /// /// [Source](https://ethereum.stackexchange.com/questions/74448/what-are-remappings-and-how-do-they-work-in-solidity) -#[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord)] +#[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Hash)] pub struct Remapping { pub name: String, pub path: String,