From 2c28fa47e7bebab87587181cd2868d09b724ed0a Mon Sep 17 00:00:00 2001 From: Leo Date: Thu, 13 Oct 2022 23:57:03 +0200 Subject: [PATCH] Add option to disable CBOR metadata in bytecode. (#1782) --- ethers-solc/src/artifacts/mod.rs | 42 +++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/ethers-solc/src/artifacts/mod.rs b/ethers-solc/src/artifacts/mod.rs index 2e65f0c6..a53555d7 100644 --- a/ethers-solc/src/artifacts/mod.rs +++ b/ethers-solc/src/artifacts/mod.rs @@ -106,6 +106,8 @@ impl CompilerInput { once_cell::sync::Lazy::new(|| VersionReq::parse("<0.8.10").unwrap()); static PRE_V0_7_5: once_cell::sync::Lazy = once_cell::sync::Lazy::new(|| VersionReq::parse("<0.7.5").unwrap()); + static PRE_V0_8_18: once_cell::sync::Lazy = + once_cell::sync::Lazy::new(|| VersionReq::parse("<0.8.18").unwrap()); if PRE_V0_6_0.matches(version) { if let Some(ref mut meta) = self.settings.metadata { @@ -133,6 +135,13 @@ impl CompilerInput { self.settings.via_ir.take(); } + if PRE_V0_8_18.matches(version) { + // introduced in 0.8.18 + if let Some(ref mut meta) = self.settings.metadata { + meta.cbor_metadata = None; + } + } + self } @@ -838,11 +847,19 @@ pub struct SettingsMetadata { with = "serde_helpers::display_from_str_opt" )] pub bytecode_hash: Option, + #[serde(default, rename = "appendCBOR", skip_serializing_if = "Option::is_none")] + pub cbor_metadata: Option, +} + +impl SettingsMetadata { + pub fn new(hash: BytecodeHash, cbor: bool) -> Self { + Self { use_literal_content: None, bytecode_hash: Some(hash), cbor_metadata: Some(cbor) } + } } impl From for SettingsMetadata { fn from(hash: BytecodeHash) -> Self { - Self { use_literal_content: None, bytecode_hash: Some(hash) } + Self { use_literal_content: None, bytecode_hash: Some(hash), cbor_metadata: None } } } @@ -2069,6 +2086,29 @@ mod tests { assert!(i.settings.metadata.unwrap().bytecode_hash.is_none()); } + #[test] + fn can_sanitize_cbor_metadata() { + let version: Version = "0.8.18".parse().unwrap(); + + let settings = Settings { + metadata: Some(SettingsMetadata::new(BytecodeHash::Ipfs, true)), + ..Default::default() + }; + + let input = CompilerInput { + language: "Solidity".to_string(), + sources: Default::default(), + settings, + }; + + let i = input.clone().sanitized(&version); + assert_eq!(i.settings.metadata.unwrap().cbor_metadata, Some(true)); + + let version: Version = "0.8.0".parse().unwrap(); + let i = input.sanitized(&version); + assert!(i.settings.metadata.unwrap().cbor_metadata.is_none()); + } + #[test] fn can_parse_libraries() { let libraries = ["./src/lib/LibraryContract.sol:Library:0xaddress".to_string()];