Skip to content

Commit c557dc8

Browse files
committed
bring back latest linking fixes
1 parent 6d12151 commit c557dc8

File tree

6 files changed

+82
-20
lines changed

6 files changed

+82
-20
lines changed

crates/zksync/compilers/src/artifacts/contract.rs

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::artifacts::EraVM;
33
use alloy_json_abi::JsonAbi;
44
use foundry_compilers_artifacts_solc::{
55
Bytecode, CompactBytecode, CompactContractBytecode, CompactContractBytecodeCow,
6-
CompactContractRef, CompactDeployedBytecode, DevDoc, Offsets, StorageLayout, UserDoc,
6+
CompactContractRef, CompactDeployedBytecode, DevDoc, Evm, Offsets, StorageLayout, UserDoc,
77
};
88
use serde::{Deserialize, Serialize};
99
use std::{borrow::Cow, collections::BTreeMap};
@@ -35,9 +35,12 @@ pub struct Contract {
3535
/// The contract factory dependencies.
3636
#[serde(default, skip_serializing_if = "Option::is_none")]
3737
pub factory_dependencies: Option<BTreeMap<String, String>>,
38-
/// EVM-related outputs
38+
/// EraVM-related outputs
3939
#[serde(default, skip_serializing_if = "Option::is_none")]
4040
pub eravm: Option<EraVM>,
41+
/// EVM-related outputs (deprecated)
42+
#[serde(default, skip_serializing_if = "Option::is_none")]
43+
pub evm: Option<Evm>,
4144
/// The contract's unlinked libraries
4245
#[serde(default)]
4346
pub missing_libraries: Vec<String>,
@@ -80,11 +83,21 @@ impl Contract {
8083

8184
/// Get bytecode
8285
pub fn bytecode(&self) -> Option<Bytecode> {
83-
self.eravm.as_ref().and_then(|eravm| eravm.bytecode(self.is_unlinked())).map(|object| {
84-
let mut bytecode: Bytecode = object.into();
85-
bytecode.link_references = self.link_references();
86-
bytecode
87-
})
86+
self.eravm
87+
.as_ref()
88+
.and_then(|eravm| eravm.bytecode(self.is_unlinked()))
89+
.or_else(|| {
90+
self.evm
91+
.as_ref()
92+
.and_then(|evm| evm.bytecode.as_ref())
93+
.map(|bytecode| &bytecode.object)
94+
.cloned()
95+
})
96+
.map(|object| {
97+
let mut bytecode: Bytecode = object.into();
98+
bytecode.link_references = self.link_references();
99+
bytecode
100+
})
88101
}
89102
}
90103

@@ -126,6 +139,8 @@ impl<'a> From<&'a Contract> for CompactContractRef<'a> {
126139
fn from(c: &'a Contract) -> Self {
127140
let (bin, bin_runtime) = if let Some(ref eravm) = c.eravm {
128141
(eravm.bytecode.as_ref(), eravm.bytecode.as_ref())
142+
} else if let Some(ref evm) = c.evm {
143+
(evm.bytecode.as_ref().map(|c| &c.object), evm.bytecode.as_ref().map(|c| &c.object))
129144
} else {
130145
(None, None)
131146
};

crates/zksync/compilers/src/artifacts/mod.rs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! zksolc artifacts to be used in `foundry-compilers`
22
use foundry_compilers_artifacts_solc::{
3-
BytecodeObject, CompactContractRef, FileToContractsMap, SourceFile, SourceFiles,
3+
Bytecode, BytecodeObject, CompactContractRef, FileToContractsMap, SourceFile, SourceFiles,
44
};
55

66
use semver::Version;
@@ -56,6 +56,27 @@ impl CompilerOutput {
5656
}
5757
}
5858

59+
/// Evm zksolc output field (deprecated)
60+
#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
61+
#[serde(rename_all = "camelCase")]
62+
pub struct Evm {
63+
/// The contract EraVM assembly code.
64+
#[serde(default, skip_serializing_if = "Option::is_none")]
65+
pub assembly: Option<String>,
66+
/// The contract EVM legacy assembly code.
67+
#[serde(default, skip_serializing_if = "Option::is_none")]
68+
pub legacy_assembly: Option<serde_json::Value>,
69+
/// The contract bytecode.
70+
/// Is reset by that of EraVM before yielding the compiled project artifacts.
71+
pub bytecode: Option<Bytecode>,
72+
/// The list of function hashes
73+
#[serde(default, skip_serializing_if = "::std::collections::BTreeMap::is_empty")]
74+
pub method_identifiers: BTreeMap<String, String>,
75+
/// The extra EVMLA metadata.
76+
#[serde(default, skip_serializing_if = "Option::is_none")]
77+
pub extra_metadata: Option<ExtraMetadata>,
78+
}
79+
5980
/// `zksolc` eravm output field
6081
#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
6182
#[serde(rename_all = "camelCase")]

crates/zksync/compilers/src/compilers/artifact_output/zk.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ impl ArtifactOutput for ZkArtifactOutput {
126126
devdoc,
127127
storage_layout,
128128
eravm,
129+
evm,
129130
ir_optimized,
130131
hash,
131132
factory_dependencies,
@@ -134,6 +135,7 @@ impl ArtifactOutput for ZkArtifactOutput {
134135

135136
let (bytecode, assembly) = eravm
136137
.map(|eravm| (eravm.bytecode(is_unlinked), eravm.assembly))
138+
.or_else(|| evm.map(|evm| (evm.bytecode.map(|bc| bc.object), evm.assembly)))
137139
.unwrap_or_else(|| (None, None));
138140
let bytecode = bytecode
139141
.map(|object| ZkArtifactBytecode::with_object(object, is_unlinked, missing_libraries));

crates/zksync/compilers/src/compilers/artifact_output/zk/bytecode.rs

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,21 @@ use foundry_compilers_artifacts_solc::{
77
};
88
use serde::{Deserialize, Serialize};
99

10+
/// This will serialize the bytecode data without a `0x` prefix
11+
///
12+
/// Equivalent of solc artifact bytecode's
13+
/// [`serialize_bytecode_without_prefix`](foundry_compilers_artifacts::solc::bytecode::serialize_bytecode_without_prefix)
14+
pub fn serialize_bytes_without_prefix<S>(code: &Bytes, s: S) -> Result<S::Ok, S::Error>
15+
where
16+
S: serde::Serializer,
17+
{
18+
s.serialize_str(&alloy_primitives::hex::encode(code))
19+
}
20+
1021
/// Bytecode compiled by zksolc
1122
#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
1223
pub struct ZkArtifactBytecode {
24+
#[serde(serialize_with = "serialize_bytes_without_prefix")]
1325
object: Bytes,
1426
is_unlinked: bool,
1527

@@ -34,7 +46,8 @@ impl ZkArtifactBytecode {
3446
Self { object, is_unlinked, missing_libraries }
3547
}
3648

37-
fn link_references(&self) -> BTreeMap<String, BTreeMap<String, Vec<Offsets>>> {
49+
/// Get link references
50+
pub fn link_references(&self) -> BTreeMap<String, BTreeMap<String, Vec<Offsets>>> {
3851
Contract::missing_libs_to_link_references(self.missing_libraries.as_slice())
3952
}
4053

@@ -65,3 +78,24 @@ impl From<ZkArtifactBytecode> for CompactDeployedBytecode {
6578
Self { bytecode: Some(bcode.into()), immutable_references: BTreeMap::default() }
6679
}
6780
}
81+
82+
#[cfg(test)]
83+
mod tests {
84+
use super::*;
85+
86+
#[test]
87+
fn serialized_bytecode_is_not_prefixed() {
88+
let object = Bytes::from(vec![0xDEu8, 0xAD, 0xBE, 0xEF]);
89+
let sample = ZkArtifactBytecode { object, is_unlinked: false, missing_libraries: vec![] };
90+
91+
let json_str =
92+
serde_json::to_string(&sample).expect("able to serialize artifact bytecode as json");
93+
94+
let deserialized: serde_json::Value =
95+
serde_json::from_str(&json_str).expect("able to deserialize json");
96+
97+
let bytecode_str = deserialized["object"].as_str().expect(".object to be a string");
98+
99+
assert!(!bytecode_str.starts_with("0x"));
100+
}
101+
}

crates/zksync/compilers/test-data/yul-sample/SimpleStore.yul

Lines changed: 0 additions & 11 deletions
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"abi":null,"bytecode":{"object":"00000001002001900000000c0000c13d000000002101043c000000000010043f000000200100043d0000000701100197000000000202043b0000000802200197000000000112019f000000200010043f0000000001000019000000000001042d000000240000043f0000002001000039000001000010044300000120000004430000000601000041000000130001042e0000001200000432000000130001042e0000001400010430000000000000000000000000000000000000000000000000000000020000000000000000000000000000004000000100000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e0e9492643af2958d06e962a0b194ca36037ef49d6167e028f1f053a54c571","is_unlinked":false,"missing_libraries":[]},"storageLayout":{"storage":[],"types":{}},"userdoc":{},"devdoc":{},"hash":"0100000b7acef21b9ea8b7897d4ebb51ecaec207df8038a10bc61b904c5c9e4b","factoryDependencies":{},"id":0}

0 commit comments

Comments
 (0)