From 1d861cb610f9a166f057178423d61284200fb37f Mon Sep 17 00:00:00 2001 From: Oleksandr Zarudnyi Date: Fri, 30 Aug 2024 16:44:23 +0200 Subject: [PATCH] feat: add the EraVM disassembler (#140) --- CHANGELOG.md | 6 + Cargo.lock | 115 ++++++------------ LLVM.lock | 2 +- era-compiler-solidity/src/lib.rs | 46 +++++++ era-compiler-solidity/src/zksolc/arguments.rs | 19 ++- era-compiler-solidity/src/zksolc/main.rs | 5 + .../tests/cli/disassembler.rs | 36 ++++++ era-compiler-solidity/tests/cli/mod.rs | 7 ++ .../tests/examples/bytecodes/bytecode.hex | 1 + .../tests/examples/bytecodes/bytecode.zbin | Bin 0 -> 480 bytes 10 files changed, 155 insertions(+), 82 deletions(-) create mode 100644 era-compiler-solidity/tests/cli/disassembler.rs create mode 100644 era-compiler-solidity/tests/examples/bytecodes/bytecode.hex create mode 100644 era-compiler-solidity/tests/examples/bytecodes/bytecode.zbin diff --git a/CHANGELOG.md b/CHANGELOG.md index b111cac1..1b3d98ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # The `zksolc` changelog +## [Unreleased] + +### Added + +- The EraVM disassembler + ## [1.5.3] - 2024-08-27 ### Added diff --git a/Cargo.lock b/Cargo.lock index ef561f80..0bdec83d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -240,9 +240,9 @@ checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" [[package]] name = "cc" -version = "1.1.14" +version = "1.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d2eb3cd3d1bf4529e31c215ee6f93ec5a3d536d9f578f93d9d33ee19562932" +checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6" dependencies = [ "shlex", ] @@ -540,7 +540,7 @@ dependencies = [ [[package]] name = "era-compiler-llvm-context" version = "1.5.0" -source = "git+https://github.com/matter-labs/era-compiler-llvm-context?branch=main#8809df8ecd952972a9cba078b5f368df5c153c58" +source = "git+https://github.com/matter-labs/era-compiler-llvm-context?branch=main#e911bd45071463b26bce141b73c228bba262ba5c" dependencies = [ "anyhow", "era-compiler-common", @@ -623,9 +623,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "ff" @@ -639,9 +639,9 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.24" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf401df4a4e3872c4fe8151134cf483738e74b67fc934d6532c882b3d24a4550" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" dependencies = [ "cfg-if", "libc", @@ -1000,7 +1000,7 @@ dependencies = [ [[package]] name = "inkwell" version = "0.4.0" -source = "git+https://github.com/matter-labs-forks/inkwell?branch=llvm-17#45cd0b68b94e8eee7348f261884a7490bd3af097" +source = "git+https://github.com/matter-labs-forks/inkwell?branch=llvm-17#fd415e819f185f5a4b5ed60cff4e67814b9c9b53" dependencies = [ "either", "inkwell_internals", @@ -1015,11 +1015,11 @@ dependencies = [ [[package]] name = "inkwell_internals" version = "0.9.0" -source = "git+https://github.com/matter-labs-forks/inkwell?branch=llvm-17#45cd0b68b94e8eee7348f261884a7490bd3af097" +source = "git+https://github.com/matter-labs-forks/inkwell?branch=llvm-17#fd415e819f185f5a4b5ed60cff4e67814b9c9b53" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] @@ -1140,7 +1140,7 @@ checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "llvm-sys" version = "170.0.1" -source = "git+https://github.com/matter-labs-forks/llvm-sys.rs?branch=llvm-17.0#475d1dcfceeef4b14e37c8f36b5fde5a0c65e77e" +source = "git+https://github.com/matter-labs-forks/llvm-sys.rs?branch=llvm-17.0#a0eca916803d6123b22d9a67d1e7d2cd07227d26" dependencies = [ "anyhow", "cc", @@ -1393,7 +1393,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] @@ -1597,9 +1597,9 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.1.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ "toml_edit", ] @@ -1838,9 +1838,9 @@ checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "a85d50532239da68e9addb745ba38ff4612a242c1c7ceea689c4bc7c2f43c36f" dependencies = [ "bitflags 2.6.0", "errno", @@ -1939,29 +1939,29 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.208" +version = "1.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff085d2cb684faa248efb494c39b68e522822ac0de72ccf08109abde717cfb2" +checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.208" +version = "1.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24008e81ff7613ed8e5ba0cfaf24e2c2f1e5b8a0495711e44fcd4882fca62bcf" +checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] name = "serde_json" -version = "1.0.125" +version = "1.0.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c8e735a073ccf5be70aa8066aa984eaf2fa000db6c8d0100ae605b366d31ed" +checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" dependencies = [ "itoa", "memchr", @@ -2103,15 +2103,15 @@ dependencies = [ [[package]] name = "stacker" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a5daa25ea337c85ed954c0496e3bdd2c7308cc3b24cf7b50d04876654c579f" +checksum = "799c883d55abdb5e98af1a7b3f23b9b6de8ecada0ecac058672d7635eb48ca7b" dependencies = [ "cc", "cfg-if", "libc", "psm", - "windows-sys 0.36.1", + "windows-sys 0.59.0", ] [[package]] @@ -2163,9 +2163,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.75" +version = "2.0.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6af063034fc1935ede7be0122941bafa9bacb949334d090b77ca98b5817c7d9" +checksum = "578e081a14e0cefc3279b0472138c513f37b41a08d5a3cca9b6e4e8ceb6cd525" dependencies = [ "proc-macro2", "quote", @@ -2250,7 +2250,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] @@ -2323,9 +2323,9 @@ checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" [[package]] name = "toml_edit" -version = "0.21.1" +version = "0.22.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" dependencies = [ "indexmap", "toml_datetime", @@ -2495,7 +2495,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", "wasm-bindgen-shared", ] @@ -2529,7 +2529,7 @@ checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2562,19 +2562,6 @@ dependencies = [ "winsafe", ] -[[package]] -name = "windows-sys" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" -dependencies = [ - "windows_aarch64_msvc 0.36.1", - "windows_i686_gnu 0.36.1", - "windows_i686_msvc 0.36.1", - "windows_x86_64_gnu 0.36.1", - "windows_x86_64_msvc 0.36.1", -] - [[package]] name = "windows-sys" version = "0.48.0" @@ -2645,12 +2632,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_msvc" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" - [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -2663,12 +2644,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_i686_gnu" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" - [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -2687,12 +2662,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_msvc" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" - [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -2705,12 +2674,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_x86_64_gnu" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" - [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -2735,12 +2698,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_msvc" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" - [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -2755,9 +2712,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.5.40" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" dependencies = [ "memchr", ] @@ -2805,7 +2762,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] diff --git a/LLVM.lock b/LLVM.lock index 1cda3580..9b393bc3 100644 --- a/LLVM.lock +++ b/LLVM.lock @@ -1,2 +1,2 @@ url = "https://github.com/matter-labs/era-compiler-llvm" -branch = "v1.5.2" +branch = "main" diff --git a/era-compiler-solidity/src/lib.rs b/era-compiler-solidity/src/lib.rs index 30cefbda..32f86579 100644 --- a/era-compiler-solidity/src/lib.rs +++ b/era-compiler-solidity/src/lib.rs @@ -57,6 +57,7 @@ pub use self::solc::version::Version as SolcVersion; pub use self::solc::Compiler as SolcCompiler; use std::collections::BTreeSet; +use std::io::Write; use std::path::PathBuf; /// The default error compatible with `solc` standard JSON output. @@ -844,3 +845,48 @@ pub fn combined_json_evm( } std::process::exit(era_compiler_common::EXIT_CODE_SUCCESS); } + +/// +/// Runs the disassembler for EraVM bytecode file and prints the output to stdout. +/// +pub fn disassemble_eravm(paths: Vec) -> anyhow::Result<()> { + let target_machine = era_compiler_llvm_context::TargetMachine::new( + era_compiler_common::Target::EraVM, + &era_compiler_llvm_context::OptimizerSettings::cycles(), + &[], + )?; + + let disassemblies: Vec<(String, String)> = paths + .into_iter() + .map(|path| { + let pathbuf = PathBuf::from(path.as_str()); + + let bytecode = match pathbuf.extension().and_then(|extension| extension.to_str()) { + Some("hex") => { + let string = std::fs::read_to_string(pathbuf)?; + let hexadecimal_string = + string.trim().strip_prefix("0x").unwrap_or(string.as_str()); + hex::decode(hexadecimal_string)? + } + Some("zbin") => std::fs::read(pathbuf)?, + Some(extension) => anyhow::bail!( + "Invalid file extension: {extension}. Supported extensions: *.hex, *.zbin" + ), + None => { + anyhow::bail!("Missing file extension. Supported extensions: *.hex, *.zbin") + } + }; + + let disassembly = + era_compiler_llvm_context::eravm_disassemble(&target_machine, bytecode.as_slice())?; + Ok((path, disassembly)) + }) + .collect::>>()?; + + for (path, disassembly) in disassemblies.into_iter() { + writeln!(std::io::stderr(), "File `{path}` disassembly:\n\n")?; + writeln!(std::io::stdout(), "{disassembly}")?; + writeln!(std::io::stderr(), "\n\n")?; + } + std::process::exit(era_compiler_common::EXIT_CODE_SUCCESS); +} diff --git a/era-compiler-solidity/src/zksolc/arguments.rs b/era-compiler-solidity/src/zksolc/arguments.rs index 5c5db0f7..4e2c7d07 100644 --- a/era-compiler-solidity/src/zksolc/arguments.rs +++ b/era-compiler-solidity/src/zksolc/arguments.rs @@ -135,11 +135,17 @@ pub struct Arguments { /// Switch to EraVM assembly mode. /// Only one input EraVM assembly file is allowed. - /// Cannot be used with combined JSON modes. + /// Cannot be used with combined and standard JSON modes. /// Use this mode at your own risk, as EraVM assembly input validation is not implemented. #[structopt(long = "eravm-assembly")] pub eravm_assembly: bool, + /// Specify the bytecode file to disassemble. + /// Two file types are allowed: raw binary bytecode (*.zbin), and hexadecimal string (*.hex). + /// Cannot be used with combined and standard JSON modes. + #[structopt(long = "disassemble")] + pub disassemble: bool, + /// Forcibly switch to EVM legacy assembly pipeline. /// It is useful for older revisions of `solc` 0.8, where Yul was considered highly experimental /// and contained more bugs than today. @@ -256,6 +262,7 @@ impl Arguments { self.yul, self.llvm_ir, self.eravm_assembly, + self.disassemble, self.combined_json.is_some(), self.standard_json.is_some(), ] @@ -264,7 +271,7 @@ impl Arguments { .count(); if modes_count > 1 { messages.push(SolcStandardJsonOutputError::new_error( - "Only one mode is allowed at the same time: Yul, LLVM IR, EraVM assembly, combined JSON, standard JSON.", None, None)); + "Only one mode is allowed at the same time: Yul, LLVM IR, EraVM assembly, disassembler, combined JSON, standard JSON.", None, None)); } if self.yul || self.llvm_ir || self.eravm_assembly { @@ -371,6 +378,14 @@ impl Arguments { } } + if self.disassemble && std::env::args().count() > self.inputs.len() + 2 { + messages.push(SolcStandardJsonOutputError::new_error( + "No other options are allowed in disassembler mode.", + None, + None, + )); + } + if self.combined_json.is_some() && (self.output_assembly || self.output_binary) { messages.push(SolcStandardJsonOutputError::new_error( "Cannot output assembly or binary outside of JSON in combined JSON mode.", diff --git a/era-compiler-solidity/src/zksolc/main.rs b/era-compiler-solidity/src/zksolc/main.rs index 60920a7c..268bfdb0 100644 --- a/era-compiler-solidity/src/zksolc/main.rs +++ b/era-compiler-solidity/src/zksolc/main.rs @@ -181,6 +181,9 @@ fn main_inner( arguments.threads, debug_config, ) + } else if arguments.disassemble { + era_compiler_solidity::disassemble_eravm(arguments.inputs)?; + return Ok(()); } else if let Some(standard_json) = arguments.standard_json { let solc_compiler = match arguments.solc.as_deref() { Some(executable) => Some(era_compiler_solidity::SolcCompiler::new(executable)?), @@ -311,6 +314,8 @@ fn main_inner( arguments.threads, debug_config, ) + } else if arguments.disassemble { + anyhow::bail!("The EVM target does not support disassembling yet."); } else if let Some(standard_json) = arguments.standard_json { let solc_compiler = match arguments.solc.as_deref() { Some(executable) => Some(era_compiler_solidity::SolcCompiler::new(executable)?), diff --git a/era-compiler-solidity/tests/cli/disassembler.rs b/era-compiler-solidity/tests/cli/disassembler.rs new file mode 100644 index 00000000..7083ac91 --- /dev/null +++ b/era-compiler-solidity/tests/cli/disassembler.rs @@ -0,0 +1,36 @@ +use crate::{cli, common}; +use predicates::prelude::*; + +#[test] +fn run_zksolc_with_disassemble_binary() -> anyhow::Result<()> { + let _ = common::setup(); + let args = &[cli::TEST_BINARY_BYTECODE_PATH, "--disassemble"]; + let invalid_args = &["--disassemble", "anyarg"]; + + let result = cli::execute_zksolc(args)?; + let invalid_result = cli::execute_zksolc(invalid_args)?; + + result + .success() + .stderr(predicate::str::contains("disassembly:")); + invalid_result.failure(); + + Ok(()) +} + +#[test] +fn run_zksolc_with_disassemble_hexadecimal() -> anyhow::Result<()> { + let _ = common::setup(); + let args = &[cli::TEST_HEXADECIMAL_BYTECODE_PATH, "--disassemble"]; + let invalid_args = &["--disassemble", "anyarg"]; + + let result = cli::execute_zksolc(args)?; + let invalid_result = cli::execute_zksolc(invalid_args)?; + + result + .success() + .stderr(predicate::str::contains("disassembly:")); + invalid_result.failure(); + + Ok(()) +} diff --git a/era-compiler-solidity/tests/cli/mod.rs b/era-compiler-solidity/tests/cli/mod.rs index f2ef4c85..eba04095 100644 --- a/era-compiler-solidity/tests/cli/mod.rs +++ b/era-compiler-solidity/tests/cli/mod.rs @@ -10,6 +10,7 @@ mod asm; mod basic; mod bin; mod combined_json; +mod disassembler; mod eravm_assembly; mod libraries; mod llvm_ir; @@ -46,6 +47,12 @@ pub const TEST_LLVM_CONTRACT_PATH: &'static str = "tests/examples/contracts/llvm /// The standard JSON contract path pub const TEST_JSON_CONTRACT_PATH: &'static str = "tests/examples/contracts/json/contract.json"; +/// The binary bytecode sample path +pub const TEST_BINARY_BYTECODE_PATH: &'static str = "tests/examples/bytecodes/bytecode.zbin"; + +/// The hexadecimal string bytecode sample path +pub const TEST_HEXADECIMAL_BYTECODE_PATH: &'static str = "tests/examples/bytecodes/bytecode.hex"; + /// Shared library path and address pub const LIBRARY_DEFAULT_PATH: &'static str = "tests/examples/contracts/solidity/MiniMath.sol:MiniMath=0xF9702469Dfb84A9aC171E284F71615bd3D3f1EdC"; diff --git a/era-compiler-solidity/tests/examples/bytecodes/bytecode.hex b/era-compiler-solidity/tests/examples/bytecodes/bytecode.hex new file mode 100644 index 00000000..6531055c --- /dev/null +++ b/era-compiler-solidity/tests/examples/bytecodes/bytecode.hex @@ -0,0 +1 @@ +0x0000008003000039000000400030043f0000000100200190000000140000c13d00000000020100190000000b00200198000000230000613d000000000101043b000000e0011002700000000c0010009c0000001c0000613d0000000d0010009c000000230000c13d0000000001000416000000000001004b000000230000c13d0000002a01000039000000800010043f0000000e01000041000000260001042e0000000001000416000000000001004b000000230000c13d0000002001000039000001000010044300000120000004430000000a01000041000000260001042e0000000001000416000000000001004b000000230000c13d0000006301000039000000800010043f0000000e01000041000000260001042e000000000100001900000027000104300000002500000432000000260001042e0000002700010430000000020000000000000000000000000000004000000100000000000000000000000000000000000000000000000000fffffffc000000000000000000000000000000000000000000000000000000000000000000000000000000005a8ac02d000000000000000000000000000000000000000000000000000000003df4ddf400000000000000000000000000000000000000200000008000000000000000000000000000000000000000000000000000000000000000000000000000000000be4793468c6deb0911ede15bf22980ba7a8e34c859fea5deb3d885d5a52a0eee diff --git a/era-compiler-solidity/tests/examples/bytecodes/bytecode.zbin b/era-compiler-solidity/tests/examples/bytecodes/bytecode.zbin new file mode 100644 index 0000000000000000000000000000000000000000..4f7a6a3dade84aa9cbcdd6ff202023d29bd399da GIT binary patch literal 480 zcmZQzU|?iYV4T3fz#zcDaL^V=GcYkSNCGJ?p!f_REzQ7?2o`5#WU&UzGq8w(X$1x! zh&))|14aR+0wAB8Nq}JvkQRlSr^U#?U_IzGR3#oaQnBN=o{MP30Y<^U6~wYfbxXmv>Qwm+v#i%Mcm VgZjTae#zXr