Skip to content

Commit e906f76

Browse files
authored
fix: actualize output selection options (#196)
Added `irOptimizedAst` and `transientStorageLayout` outputs. Also made some patterns exhaustive to make it easier next time
1 parent 6b66a6b commit e906f76

File tree

8 files changed

+109
-25
lines changed

8 files changed

+109
-25
lines changed

crates/artifacts/solc/src/configurable.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ pub struct ConfigurableContractArtifact {
3939
#[serde(default, skip_serializing_if = "Option::is_none")]
4040
pub storage_layout: Option<StorageLayout>,
4141
#[serde(default, skip_serializing_if = "Option::is_none")]
42+
pub transient_storage_layout: Option<StorageLayout>,
43+
#[serde(default, skip_serializing_if = "Option::is_none")]
4244
pub userdoc: Option<UserDoc>,
4345
#[serde(default, skip_serializing_if = "Option::is_none")]
4446
pub devdoc: Option<DevDoc>,
@@ -47,6 +49,8 @@ pub struct ConfigurableContractArtifact {
4749
#[serde(default, skip_serializing_if = "Option::is_none")]
4850
pub ir_optimized: Option<String>,
4951
#[serde(default, skip_serializing_if = "Option::is_none")]
52+
pub ir_optimized_ast: Option<serde_json::Value>,
53+
#[serde(default, skip_serializing_if = "Option::is_none")]
5054
pub ewasm: Option<Ewasm>,
5155
#[serde(default, skip_serializing_if = "Option::is_none")]
5256
pub ast: Option<Ast>,

crates/artifacts/solc/src/contract.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ pub struct Contract {
3232
pub ir: Option<String>,
3333
#[serde(default, skip_serializing_if = "StorageLayout::is_empty")]
3434
pub storage_layout: StorageLayout,
35+
#[serde(default, skip_serializing_if = "StorageLayout::is_empty")]
36+
pub transient_storage_layout: StorageLayout,
3537
/// EVM-related outputs
3638
#[serde(default, skip_serializing_if = "Option::is_none")]
3739
pub evm: Option<Evm>,
@@ -40,6 +42,8 @@ pub struct Contract {
4042
pub ewasm: Option<Ewasm>,
4143
#[serde(default, skip_serializing_if = "Option::is_none")]
4244
pub ir_optimized: Option<String>,
45+
#[serde(default, skip_serializing_if = "Option::is_none")]
46+
pub ir_optimized_ast: Option<serde_json::Value>,
4347
}
4448

4549
impl<'a> From<&'a Contract> for CompactContractBytecodeCow<'a> {

crates/artifacts/solc/src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -836,6 +836,10 @@ impl EvmVersion {
836836
// <https://soliditylang.org/blog/2024/01/26/solidity-0.8.24-release-announcement/>
837837
Some(Self::Shanghai)
838838
}
839+
Self::Prague if *version == Version::new(0, 8, 27) => {
840+
// Prague was not set as default EVM version in 0.8.27.
841+
Some(Self::Cancun)
842+
}
839843
_ => Some(default),
840844
}
841845
}

crates/artifacts/solc/src/output_selection.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,9 @@ pub enum ContractOutputSelection {
219219
Metadata,
220220
Ir,
221221
IrOptimized,
222+
IrOptimizedAst,
222223
StorageLayout,
224+
TransientStorageLayout,
223225
Evm(EvmOutputSelection),
224226
Ewasm(EwasmOutputSelection),
225227
}
@@ -268,7 +270,9 @@ impl fmt::Display for ContractOutputSelection {
268270
Self::Metadata => f.write_str("metadata"),
269271
Self::Ir => f.write_str("ir"),
270272
Self::IrOptimized => f.write_str("irOptimized"),
273+
Self::IrOptimizedAst => f.write_str("irOptimizedAst"),
271274
Self::StorageLayout => f.write_str("storageLayout"),
275+
Self::TransientStorageLayout => f.write_str("transientStorageLayout"),
272276
Self::Evm(e) => e.fmt(f),
273277
Self::Ewasm(e) => e.fmt(f),
274278
}
@@ -286,7 +290,11 @@ impl FromStr for ContractOutputSelection {
286290
"metadata" => Ok(Self::Metadata),
287291
"ir" => Ok(Self::Ir),
288292
"ir-optimized" | "irOptimized" | "iroptimized" => Ok(Self::IrOptimized),
293+
"irOptimizedAst" | "ir-optimized-ast" | "iroptimizedast" => Ok(Self::IrOptimizedAst),
289294
"storage-layout" | "storagelayout" | "storageLayout" => Ok(Self::StorageLayout),
295+
"transient-storage-layout" | "transientstoragelayout" | "transientStorageLayout" => {
296+
Ok(Self::TransientStorageLayout)
297+
}
290298
s => EvmOutputSelection::from_str(s)
291299
.map(ContractOutputSelection::Evm)
292300
.or_else(|_| EwasmOutputSelection::from_str(s).map(ContractOutputSelection::Ewasm))

crates/artifacts/vyper/src/output.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,10 @@ impl From<VyperContract> for solc_artifacts::Contract {
8080
devdoc: Default::default(),
8181
ir: None,
8282
storage_layout: Default::default(),
83+
transient_storage_layout: Default::default(),
8384
ewasm: None,
8485
ir_optimized: None,
86+
ir_optimized_ast: None,
8587
}
8688
}
8789
}

crates/compilers/src/artifact_output/configurable.rs

Lines changed: 71 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -77,54 +77,88 @@ impl ConfigurableArtifacts {
7777

7878
/// Returns the `Settings` this configuration corresponds to
7979
pub fn solc_settings(&self) -> Settings {
80-
SolcConfig::builder().additional_outputs(self.output_selection()).build().into()
80+
SolcConfig::builder()
81+
.additional_outputs(self.output_selection())
82+
.ast(self.additional_values.ast)
83+
.build()
8184
}
8285

8386
/// Returns the output selection corresponding to this configuration
8487
pub fn output_selection(&self) -> Vec<ContractOutputSelection> {
8588
let mut selection = ContractOutputSelection::basic();
8689

87-
if self.additional_values.ir || self.additional_files.ir {
90+
let ExtraOutputValues {
91+
// handled above
92+
ast: _,
93+
userdoc,
94+
devdoc,
95+
method_identifiers,
96+
storage_layout,
97+
transient_storage_layout,
98+
assembly,
99+
gas_estimates,
100+
metadata,
101+
ir,
102+
ir_optimized,
103+
ir_optimized_ast,
104+
ewasm,
105+
function_debug_data,
106+
generated_sources,
107+
source_map,
108+
opcodes,
109+
__non_exhaustive,
110+
} = self.additional_values;
111+
112+
if ir || self.additional_files.ir {
88113
selection.push(ContractOutputSelection::Ir);
89114
}
90-
if self.additional_values.ir_optimized || self.additional_files.ir_optimized {
115+
if ir_optimized || self.additional_files.ir_optimized {
91116
selection.push(ContractOutputSelection::IrOptimized);
92117
}
93-
if self.additional_values.metadata || self.additional_files.metadata {
118+
if metadata || self.additional_files.metadata {
94119
selection.push(ContractOutputSelection::Metadata);
95120
}
96-
if self.additional_values.storage_layout {
121+
if storage_layout {
97122
selection.push(ContractOutputSelection::StorageLayout);
98123
}
99-
if self.additional_values.devdoc {
124+
if devdoc {
100125
selection.push(ContractOutputSelection::DevDoc);
101126
}
102-
if self.additional_values.userdoc {
127+
if userdoc {
103128
selection.push(ContractOutputSelection::UserDoc);
104129
}
105-
if self.additional_values.gas_estimates {
130+
if gas_estimates {
106131
selection.push(EvmOutputSelection::GasEstimates.into());
107132
}
108-
if self.additional_values.assembly || self.additional_files.assembly {
133+
if assembly || self.additional_files.assembly {
109134
selection.push(EvmOutputSelection::Assembly.into());
110135
}
111-
if self.additional_values.ewasm || self.additional_files.ewasm {
136+
if ewasm || self.additional_files.ewasm {
112137
selection.push(EwasmOutputSelection::All.into());
113138
}
114-
if self.additional_values.function_debug_data {
139+
if function_debug_data {
115140
selection.push(BytecodeOutputSelection::FunctionDebugData.into());
116141
}
117-
if self.additional_values.method_identifiers {
142+
if method_identifiers {
118143
selection.push(EvmOutputSelection::MethodIdentifiers.into());
119144
}
120-
if self.additional_values.generated_sources {
145+
if generated_sources {
121146
selection.push(
122147
EvmOutputSelection::ByteCode(BytecodeOutputSelection::GeneratedSources).into(),
123148
);
124149
}
125-
if self.additional_values.source_map {
150+
if source_map {
126151
selection.push(EvmOutputSelection::ByteCode(BytecodeOutputSelection::SourceMap).into());
127152
}
153+
if ir_optimized_ast {
154+
selection.push(ContractOutputSelection::IrOptimizedAst);
155+
}
156+
if opcodes {
157+
selection.push(EvmOutputSelection::ByteCode(BytecodeOutputSelection::Opcodes).into());
158+
}
159+
if transient_storage_layout {
160+
selection.push(ContractOutputSelection::TransientStorageLayout);
161+
}
128162
selection
129163
}
130164
}
@@ -165,6 +199,7 @@ impl ArtifactOutput for ConfigurableArtifacts {
165199
let mut artifact_metadata = None;
166200
let mut artifact_ir = None;
167201
let mut artifact_ir_optimized = None;
202+
let mut artifact_ir_optimized_ast = None;
168203
let mut artifact_ewasm = None;
169204
let mut artifact_bytecode = None;
170205
let mut artifact_deployed_bytecode = None;
@@ -173,6 +208,7 @@ impl ArtifactOutput for ConfigurableArtifacts {
173208
let mut artifact_method_identifiers = None;
174209
let mut artifact_assembly = None;
175210
let mut artifact_storage_layout = None;
211+
let mut artifact_transient_storage_layout = None;
176212
let mut generated_sources = None;
177213
let mut opcodes = None;
178214

@@ -183,9 +219,11 @@ impl ArtifactOutput for ConfigurableArtifacts {
183219
devdoc,
184220
ir,
185221
storage_layout,
222+
transient_storage_layout,
186223
evm,
187224
ewasm,
188225
ir_optimized,
226+
ir_optimized_ast,
189227
} = contract;
190228

191229
if self.additional_values.metadata {
@@ -209,9 +247,15 @@ impl ArtifactOutput for ConfigurableArtifacts {
209247
if self.additional_values.ir_optimized {
210248
artifact_ir_optimized = ir_optimized;
211249
}
250+
if self.additional_values.ir_optimized_ast {
251+
artifact_ir_optimized_ast = ir_optimized_ast;
252+
}
212253
if self.additional_values.storage_layout {
213254
artifact_storage_layout = Some(storage_layout);
214255
}
256+
if self.additional_values.transient_storage_layout {
257+
artifact_transient_storage_layout = Some(transient_storage_layout);
258+
}
215259

216260
if let Some(evm) = evm {
217261
let Evm {
@@ -260,10 +304,12 @@ impl ArtifactOutput for ConfigurableArtifacts {
260304
raw_metadata: artifact_raw_metadata,
261305
metadata: artifact_metadata,
262306
storage_layout: artifact_storage_layout,
307+
transient_storage_layout: artifact_transient_storage_layout,
263308
userdoc: artifact_userdoc,
264309
devdoc: artifact_devdoc,
265310
ir: artifact_ir,
266311
ir_optimized: artifact_ir_optimized,
312+
ir_optimized_ast: artifact_ir_optimized_ast,
267313
ewasm: artifact_ewasm,
268314
id: source_file.as_ref().map(|s| s.id),
269315
ast: source_file.and_then(|s| s.ast.clone()),
@@ -376,12 +422,13 @@ pub struct ExtraOutputValues {
376422
pub devdoc: bool,
377423
pub method_identifiers: bool,
378424
pub storage_layout: bool,
425+
pub transient_storage_layout: bool,
379426
pub assembly: bool,
380427
pub gas_estimates: bool,
381-
pub compact_format: bool,
382428
pub metadata: bool,
383429
pub ir: bool,
384430
pub ir_optimized: bool,
431+
pub ir_optimized_ast: bool,
385432
pub ewasm: bool,
386433
pub function_debug_data: bool,
387434
pub generated_sources: bool,
@@ -409,12 +456,13 @@ impl ExtraOutputValues {
409456
devdoc: true,
410457
method_identifiers: true,
411458
storage_layout: true,
459+
transient_storage_layout: true,
412460
assembly: true,
413461
gas_estimates: true,
414-
compact_format: true,
415462
metadata: true,
416463
ir: true,
417464
ir_optimized: true,
465+
ir_optimized_ast: true,
418466
ewasm: true,
419467
function_debug_data: true,
420468
generated_sources: true,
@@ -484,7 +532,13 @@ impl ExtraOutputValues {
484532
ContractOutputSelection::Ewasm(_) => {
485533
config.ewasm = true;
486534
}
487-
_ => {}
535+
ContractOutputSelection::IrOptimizedAst => {
536+
config.ir_optimized_ast = true;
537+
}
538+
ContractOutputSelection::TransientStorageLayout => {
539+
config.transient_storage_layout = true;
540+
}
541+
ContractOutputSelection::Abi => {}
488542
}
489543
}
490544

crates/compilers/src/config.rs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -925,6 +925,9 @@ pub struct SolcConfigBuilder {
925925

926926
/// additionally selected outputs that should be included in the `Contract` that solc creates.
927927
output_selection: Vec<ContractOutputSelection>,
928+
929+
/// whether to include the AST in the output
930+
ast: bool,
928931
}
929932

930933
impl SolcConfigBuilder {
@@ -953,14 +956,20 @@ impl SolcConfigBuilder {
953956
self
954957
}
955958

956-
/// Creates the solc config
957-
///
958-
/// If no solc version is configured then it will be determined by calling `solc --version`.
959-
pub fn build(self) -> SolcConfig {
960-
let Self { settings, output_selection } = self;
959+
pub fn ast(mut self, yes: bool) -> Self {
960+
self.ast = yes;
961+
self
962+
}
963+
964+
/// Creates the solc settings
965+
pub fn build(self) -> Settings {
966+
let Self { settings, output_selection, ast } = self;
961967
let mut settings = settings.unwrap_or_default();
962968
settings.push_all(output_selection);
963-
SolcConfig { settings }
969+
if ast {
970+
settings = settings.with_ast();
971+
}
972+
settings
964973
}
965974
}
966975

crates/core/src/utils.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,7 @@ pub const SHANGHAI_SOLC: Version = Version::new(0, 8, 20);
8686
pub const CANCUN_SOLC: Version = Version::new(0, 8, 24);
8787

8888
/// Prague support
89-
/// <https://github.com/ethereum/solidity/pull/15152>
90-
/// Was merged between 0.8.26 and 0.8.27, so we are expecting it to be available in 0.8.27
89+
/// <https://soliditylang.org/blog/2024/09/04/solidity-0.8.27-release-announcement>
9190
pub const PRAGUE_SOLC: Version = Version::new(0, 8, 27);
9291

9392
// `--base-path` was introduced in 0.6.9 <https://github.com/ethereum/solidity/releases/tag/v0.6.9>

0 commit comments

Comments
 (0)