diff --git a/.github/workflows/sanitizers.yml b/.github/workflows/sanitizers.yml
index c34670e9..82496c7e 100644
--- a/.github/workflows/sanitizers.yml
+++ b/.github/workflows/sanitizers.yml
@@ -30,8 +30,13 @@ on:
mode:
required: false
type: string
- default: 'Y+M3B3 0.8.26'
- description: 'Mode filter for the era-compiler-tester. For example: Y+M3B3 0.8.26'
+ default: 'Y+M3B3 0.8.28'
+ description: 'Mode filter for the era-compiler-tester. For example: Y+M3B3 0.8.28'
+ target:
+ required: false
+ type: string
+ default: 'eravm'
+ description: 'Target filter for the era-compiler-tester. Possible values are: `eravm` or `evm`'
jobs:
run-with-sanitizers:
@@ -88,6 +93,7 @@ jobs:
run: |
set -x
./target/${TARGET}/debug/compiler-tester \
+ --target "${{ inputs.target }}" \
--zksolc "./target-zksolc/${TARGET}/debug/zksolc" \
--zkvyper "./target-zkvyper/${TARGET}/debug/zkvyper" \
--path '${{ inputs.path }}' \
diff --git a/.github/workflows/secrets-scanner.yaml b/.github/workflows/secrets-scanner.yaml
new file mode 100644
index 00000000..205477f5
--- /dev/null
+++ b/.github/workflows/secrets-scanner.yaml
@@ -0,0 +1,19 @@
+name: Leaked Secrets Scan
+on:
+ pull_request:
+ merge_group:
+jobs:
+ TruffleHog:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ with:
+ fetch-depth: 0
+ - name: TruffleHog OSS
+ uses: trufflesecurity/trufflehog@7e78ca385fb82c19568c7a4b341c97d57d9aa5e1 # v3.82.2
+ with:
+ path: ./
+ base: ${{ github.event.repository.default_branch }}
+ head: HEAD
+ extra_args: --debug --only-verified
diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml
index 4095cd04..310bd15d 100644
--- a/.github/workflows/tests.yaml
+++ b/.github/workflows/tests.yaml
@@ -36,11 +36,6 @@ concurrency:
jobs:
- # Check for secrets leak in the repository
- secrets-scanner:
- uses: matter-labs/era-compiler-ci/.github/workflows/secrets-scanner.yaml@v1
- secrets: inherit
-
# Check for cargo issues
cargo-check:
runs-on: matterlabs-ci-runner-high-performance
@@ -133,7 +128,6 @@ jobs:
runs-on: ubuntu-latest
if: always()
needs:
- - secrets-scanner
- cargo-check
- integration-tests
- benchmarks
diff --git a/.gitignore b/.gitignore
index b79c463a..12dcfdf4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,29 +1,28 @@
+# IDE
+/.idea/
+/.vscode/
+
+# MacOS
+/**/.DS_Store
+
+# Backup files generated by rustfmt
+/**/*.rs.bk
+
# Compiled files and executables
/target*/
-# These are backup files generated by rustfmt
-**/*.rs.bk
+# Dependency locks
+# /Cargo.lock
+# /LLVM.lock
-# The LLVM framework source
+# LLVM framework source
/llvm/
# External compilers
-/solc-bin*/*
-/vyper-bin/*
+/solc-bin*/
+/vyper-bin*/
-# The debug, trace, benchmark artifacts
+# Debug and benchmark artifacts
/debug/
-/trace/
-/**/*.json
-/**/*.txt
-
-# The dependency locks
-# /Cargo.lock
-# /LLVM.lock
-
-# IDE
-/.idea/
-/.vscode/
-
-# MacOS
-/**/.DS_Store
+/*.json
+/*.txt
\ No newline at end of file
diff --git a/.gitmodules b/.gitmodules
index dc4a4a44..72622394 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,12 +1,12 @@
[submodule "tests"]
- path = tests
- url = https://github.com/matter-labs/era-compiler-tests
- branch = main
+ path = tests
+ url = https://github.com/matter-labs/era-compiler-tests
+ branch = main
[submodule "solidity"]
- path = solidity
- url = https://github.com/ethereum/solidity
- branch = develop
+ path = solidity
+ url = https://github.com/ethereum/solidity
+ branch = develop
[submodule "era-contracts"]
- path = era-contracts
- url = https://github.com/lambdaclass/era-contracts
- branch = evm-equivalence-yul-new
+ path = era-contracts
+ url = https://github.com/matter-labs/era-contracts
+ branch = stable/evm-emulator
diff --git a/Cargo.lock b/Cargo.lock
index aa2695a1..e2781d99 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4,9 +4,9 @@ version = 3
[[package]]
name = "addr2line"
-version = "0.24.1"
+version = "0.24.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375"
+checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
dependencies = [
"gimli",
]
@@ -40,9 +40,9 @@ dependencies = [
[[package]]
name = "allocator-api2"
-version = "0.2.18"
+version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f"
+checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
[[package]]
name = "alloy-eip2930"
@@ -56,9 +56,9 @@ dependencies = [
[[package]]
name = "alloy-eip7702"
-version = "0.1.0"
+version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37d319bb544ca6caeab58c39cea8921c55d924d4f68f2c60f24f914673f9a74a"
+checksum = "ea59dc42102bc9a1905dc57901edc6dd48b9f38115df86c7d252acba70d71d04"
dependencies = [
"alloy-primitives",
"alloy-rlp",
@@ -67,9 +67,9 @@ dependencies = [
[[package]]
name = "alloy-eips"
-version = "0.3.3"
+version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c35df7b972b06f1b2f4e8b7a53328522fa788054a9d3e556faf2411c5a51d5a"
+checksum = "f923dd5fca5f67a43d81ed3ebad0880bd41f6dd0ada930030353ac356c54cd0f"
dependencies = [
"alloy-eip2930",
"alloy-eip7702",
@@ -83,31 +83,35 @@ dependencies = [
[[package]]
name = "alloy-primitives"
-version = "0.8.3"
+version = "0.8.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "411aff151f2a73124ee473708e82ed51b2535f68928b6a1caa8bc1246ae6f7cd"
+checksum = "788bb18e8f61d5d9340b52143f27771daf7e1dccbaf2741621d2493f9debf52e"
dependencies = [
"alloy-rlp",
"bytes",
"cfg-if",
"const-hex",
"derive_more 1.0.0",
- "hex-literal",
+ "foldhash",
+ "indexmap",
"itoa",
"k256",
"keccak-asm",
+ "paste",
"proptest",
"rand",
"ruint",
+ "rustc-hash",
"serde",
+ "sha3 0.10.8",
"tiny-keccak",
]
[[package]]
name = "alloy-rlp"
-version = "0.3.8"
+version = "0.3.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26154390b1d205a4a7ac7352aa2eb4f81f391399d4e2f546fb81a2f8bb383f62"
+checksum = "f542548a609dca89fcd72b3b9f355928cf844d4363c5eed9c5273a3dd225e097"
dependencies = [
"alloy-rlp-derive",
"arrayvec 0.7.6",
@@ -116,26 +120,84 @@ dependencies = [
[[package]]
name = "alloy-rlp-derive"
-version = "0.3.8"
+version = "0.3.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d0f2d905ebd295e7effec65e5f6868d153936130ae718352771de3e7d03c75c"
+checksum = "5a833d97bf8a5f0f878daf2c8451fff7de7f9de38baa5a45d936ec718d81255a"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.95",
]
[[package]]
-name = "anyhow"
-version = "1.0.88"
+name = "android-tzdata"
+version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e1496f8fb1fbf272686b8d37f523dab3e4a7443300055e74cdaa449f3114356"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
[[package]]
-name = "arbitrary"
-version = "1.3.2"
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "anstream"
+version = "0.6.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b"
+dependencies = [
+ "anstyle",
+ "anstyle-parse",
+ "anstyle-query",
+ "anstyle-wincon",
+ "colorchoice",
+ "is_terminal_polyfill",
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle"
+version = "1.0.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9"
+
+[[package]]
+name = "anstyle-parse"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9"
+dependencies = [
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle-query"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c"
+dependencies = [
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "anstyle-wincon"
+version = "3.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125"
+dependencies = [
+ "anstyle",
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.89"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110"
+checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6"
[[package]]
name = "ark-ff"
@@ -263,9 +325,9 @@ dependencies = [
[[package]]
name = "arrayref"
-version = "0.3.8"
+version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a"
+checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb"
[[package]]
name = "arrayvec"
@@ -297,14 +359,14 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.95",
]
[[package]]
name = "autocfg"
-version = "1.3.0"
+version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
+checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
[[package]]
name = "backtrace"
@@ -345,6 +407,12 @@ version = "0.21.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
+[[package]]
+name = "base64"
+version = "0.22.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
+
[[package]]
name = "base64ct"
version = "1.6.0"
@@ -356,10 +424,13 @@ name = "benchmark-analyzer"
version = "1.5.0"
dependencies = [
"anyhow",
+ "chrono",
+ "clap",
"colored",
+ "era-compiler-common",
+ "regex",
"serde",
"serde_json",
- "structopt",
]
[[package]]
@@ -481,6 +552,12 @@ dependencies = [
"zeroize",
]
+[[package]]
+name = "boolinator"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cfa8873f51c92e232f9bac4065cddef41b714152812bfc5f7672ba16d6ef8cd9"
+
[[package]]
name = "bumpalo"
version = "3.16.0"
@@ -501,9 +578,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]]
name = "bytes"
-version = "1.7.1"
+version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50"
+checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b"
[[package]]
name = "c-kzg"
@@ -522,12 +599,10 @@ dependencies = [
[[package]]
name = "cc"
-version = "1.1.18"
+version = "1.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b62ac837cdb5cb22e10a256099b4fc502b1dfe560cb282963a974d7abd80e476"
+checksum = "a012a0df96dd6d06ba9a1b29d6402d1a5d77c6befd2566afdc26e10603dc93d7"
dependencies = [
- "jobserver",
- "libc",
"shlex",
]
@@ -537,6 +612,27 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+[[package]]
+name = "cfg_aliases"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
+
+[[package]]
+name = "chrono"
+version = "0.4.38"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "serde",
+ "wasm-bindgen",
+ "windows-targets 0.52.6",
+]
+
[[package]]
name = "cid"
version = "0.5.1"
@@ -550,15 +646,50 @@ dependencies = [
[[package]]
name = "clap"
-version = "2.34.0"
+version = "4.5.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
+checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f"
dependencies = [
- "bitflags 1.3.2",
- "textwrap",
- "unicode-width",
+ "clap_builder",
+ "clap_derive",
+]
+
+[[package]]
+name = "clap_builder"
+version = "4.5.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec"
+dependencies = [
+ "anstream",
+ "anstyle",
+ "clap_lex",
+ "strsim",
+]
+
+[[package]]
+name = "clap_derive"
+version = "4.5.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
]
+[[package]]
+name = "clap_lex"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6"
+
+[[package]]
+name = "colorchoice"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
+
[[package]]
name = "colored"
version = "2.1.0"
@@ -576,12 +707,15 @@ dependencies = [
"anyhow",
"benchmark-analyzer",
"bincode",
+ "chrono",
+ "clap",
"colored",
"era-compiler-common",
"era-compiler-downloader",
"era-compiler-llvm-context",
"era-compiler-solidity",
"era-compiler-vyper",
+ "era-solc",
"evm",
"glob",
"hex",
@@ -592,7 +726,7 @@ dependencies = [
"once_cell",
"rayon",
"regex",
- "reqwest",
+ "reqwest 0.11.27",
"revm",
"rlp",
"ron",
@@ -602,34 +736,18 @@ dependencies = [
"serde_yaml",
"sha3 0.10.8",
"solidity-adapter",
- "structopt",
"web3",
"which",
- "zkevm_opcode_defs 0.150.0 (git+https://github.com/matter-labs/era-zkevm_opcode_defs?branch=v1.5.0)",
+ "zkevm_opcode_defs",
"zkevm_tester",
"zksync_vm2",
]
-[[package]]
-name = "compiler-tester-fuzz"
-version = "1.5.0"
-dependencies = [
- "anyhow",
- "compiler-tester",
- "era-compiler-common",
- "era-compiler-llvm-context",
- "era-compiler-solidity",
- "libfuzzer-sys",
- "semver 1.0.23",
- "solidity-adapter",
- "zkevm_tester",
-]
-
[[package]]
name = "const-hex"
-version = "1.12.0"
+version = "1.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6"
+checksum = "4b0485bab839b018a8f1723fc5391819fea5f8f0f32288ef8a735fd096b6160c"
dependencies = [
"cfg-if",
"cpufeatures",
@@ -677,35 +795,35 @@ name = "coverage-watcher"
version = "1.5.0"
dependencies = [
"anyhow",
+ "clap",
"era-compiler-common",
"serde",
"serde_yaml",
- "structopt",
]
[[package]]
name = "cpufeatures"
-version = "0.2.14"
+version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0"
+checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3"
dependencies = [
"libc",
]
[[package]]
name = "crossbeam-channel"
-version = "0.5.13"
+version = "0.5.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2"
+checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471"
dependencies = [
"crossbeam-utils",
]
[[package]]
name = "crossbeam-deque"
-version = "0.8.5"
+version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d"
+checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
dependencies = [
"crossbeam-epoch",
"crossbeam-utils",
@@ -722,9 +840,9 @@ dependencies = [
[[package]]
name = "crossbeam-utils"
-version = "0.8.20"
+version = "0.8.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
+checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
[[package]]
name = "crunchy"
@@ -812,7 +930,7 @@ dependencies = [
"proc-macro2",
"quote",
"rustc_version 0.4.1",
- "syn 2.0.77",
+ "syn 2.0.95",
]
[[package]]
@@ -832,7 +950,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.95",
"unicode-xid",
]
@@ -857,6 +975,17 @@ dependencies = [
"subtle",
]
+[[package]]
+name = "displaydoc"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+]
+
[[package]]
name = "dyn-clone"
version = "1.0.17"
@@ -905,9 +1034,9 @@ dependencies = [
[[package]]
name = "encoding_rs"
-version = "0.8.34"
+version = "0.8.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59"
+checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
dependencies = [
"cfg-if",
]
@@ -921,7 +1050,7 @@ dependencies = [
"once_cell",
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.95",
]
[[package]]
@@ -932,7 +1061,7 @@ checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.95",
]
[[package]]
@@ -944,7 +1073,7 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
[[package]]
name = "era-compiler-common"
version = "1.5.0"
-source = "git+https://github.com/matter-labs/era-compiler-common?branch=main#666de17f795f20530423bb88c912efe45d5a092e"
+source = "git+https://github.com/matter-labs/era-compiler-common?branch=main#10ea52ee6a27ae3392c25647f5f70fb60e3ce2a6"
dependencies = [
"anyhow",
"base58",
@@ -959,13 +1088,13 @@ dependencies = [
[[package]]
name = "era-compiler-downloader"
-version = "0.1.0"
-source = "git+https://github.com/matter-labs/era-compiler-common?branch=main#666de17f795f20530423bb88c912efe45d5a092e"
+version = "1.5.0"
+source = "git+https://github.com/matter-labs/era-compiler-common?branch=main#10ea52ee6a27ae3392c25647f5f70fb60e3ce2a6"
dependencies = [
"anyhow",
"colored",
"openssl",
- "reqwest",
+ "reqwest 0.11.27",
"serde",
"serde_json",
]
@@ -973,7 +1102,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#7c1ba758b7f68c9391c16db766f69df47834f4ea"
+source = "git+https://github.com/matter-labs/era-compiler-llvm-context?branch=main#564e41b4d9e0b6a3a0d2f875c6dd891477cef70c"
dependencies = [
"anyhow",
"era-compiler-common",
@@ -982,17 +1111,19 @@ dependencies = [
"num",
"semver 1.0.23",
"serde",
- "zkevm_opcode_defs 0.150.0 (git+https://github.com/matter-labs/era-zkevm_opcode_defs?branch=v1.5.0)",
+ "zkevm_opcode_defs",
]
[[package]]
name = "era-compiler-solidity"
-version = "1.5.4"
-source = "git+https://github.com/matter-labs/era-compiler-solidity?branch=main#62830743e1dbdeea99798e35d700f6a792c151f1"
+version = "1.5.9"
+source = "git+https://github.com/matter-labs/era-compiler-solidity?branch=main#2333c0e275e4a83f494990ae3ce7484c643a908d"
dependencies = [
"anyhow",
+ "clap",
"era-compiler-common",
"era-compiler-llvm-context",
+ "era-solc",
"era-yul",
"hex",
"inkwell",
@@ -1001,25 +1132,23 @@ dependencies = [
"num",
"num_cpus",
"path-slash",
- "rand",
"rayon",
- "regex",
"rusty_pool",
"semver 1.0.23",
"serde",
"serde_json",
- "sha3 0.10.8",
- "structopt",
- "thiserror",
- "which",
+ "thiserror 1.0.64",
+ "zkevm_opcode_defs",
]
[[package]]
name = "era-compiler-vyper"
-version = "1.5.5"
-source = "git+https://github.com/matter-labs/era-compiler-vyper?branch=main#f353939d6b056a5f456af7ed5ec6e6d785031d15"
+version = "1.5.9"
+source = "git+https://github.com/matter-labs/era-compiler-vyper?branch=main#51f8baf7514e2482145d1b2f1e37615fb50bb2ca"
dependencies = [
"anyhow",
+ "boolinator",
+ "clap",
"era-compiler-common",
"era-compiler-llvm-context",
"hex",
@@ -1032,30 +1161,46 @@ dependencies = [
"semver 1.0.23",
"serde",
"serde_json",
- "structopt",
"which",
- "zkevm_opcode_defs 0.150.0 (git+https://github.com/matter-labs/era-zkevm_opcode_defs?branch=v1.5.0)",
+ "zkevm_opcode_defs",
+]
+
+[[package]]
+name = "era-solc"
+version = "1.5.9"
+source = "git+https://github.com/matter-labs/era-compiler-solidity?branch=main#2333c0e275e4a83f494990ae3ce7484c643a908d"
+dependencies = [
+ "anyhow",
+ "boolinator",
+ "era-compiler-common",
+ "hex",
+ "num",
+ "rayon",
+ "semver 1.0.23",
+ "serde",
+ "serde_json",
+ "which",
]
[[package]]
name = "era-yul"
-version = "1.5.4"
-source = "git+https://github.com/matter-labs/era-compiler-solidity?branch=main#62830743e1dbdeea99798e35d700f6a792c151f1"
+version = "1.5.9"
+source = "git+https://github.com/matter-labs/era-compiler-solidity?branch=main#2333c0e275e4a83f494990ae3ce7484c643a908d"
dependencies = [
"anyhow",
"regex",
"serde",
- "thiserror",
+ "thiserror 1.0.64",
]
[[package]]
name = "errno"
-version = "0.3.9"
+version = "0.3.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
+checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d"
dependencies = [
"libc",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -1071,7 +1216,7 @@ dependencies = [
"serde",
"serde_json",
"sha3 0.10.8",
- "thiserror",
+ "thiserror 1.0.64",
"uint",
]
@@ -1128,9 +1273,9 @@ dependencies = [
[[package]]
name = "fastrand"
-version = "2.1.1"
+version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6"
+checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
[[package]]
name = "fastrlp"
@@ -1143,6 +1288,17 @@ dependencies = [
"bytes",
]
+[[package]]
+name = "fastrlp"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4"
+dependencies = [
+ "arrayvec 0.7.6",
+ "auto_impl",
+ "bytes",
+]
+
[[package]]
name = "ff"
version = "0.13.0"
@@ -1183,6 +1339,12 @@ version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+[[package]]
+name = "foldhash"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f"
+
[[package]]
name = "foreign-types"
version = "0.3.2"
@@ -1215,9 +1377,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
[[package]]
name = "futures"
-version = "0.3.30"
+version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0"
+checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876"
dependencies = [
"futures-channel",
"futures-core",
@@ -1230,9 +1392,9 @@ dependencies = [
[[package]]
name = "futures-channel"
-version = "0.3.30"
+version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78"
+checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
dependencies = [
"futures-core",
"futures-sink",
@@ -1240,15 +1402,15 @@ dependencies = [
[[package]]
name = "futures-core"
-version = "0.3.30"
+version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
+checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
[[package]]
name = "futures-executor"
-version = "0.3.30"
+version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d"
+checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f"
dependencies = [
"futures-core",
"futures-task",
@@ -1257,32 +1419,32 @@ dependencies = [
[[package]]
name = "futures-io"
-version = "0.3.30"
+version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1"
+checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6"
[[package]]
name = "futures-macro"
-version = "0.3.30"
+version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
+checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.95",
]
[[package]]
name = "futures-sink"
-version = "0.3.30"
+version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5"
+checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7"
[[package]]
name = "futures-task"
-version = "0.3.30"
+version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
+checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
[[package]]
name = "futures-timer"
@@ -1292,9 +1454,9 @@ checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24"
[[package]]
name = "futures-util"
-version = "0.3.30"
+version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
+checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
dependencies = [
"futures-channel",
"futures-core",
@@ -1326,15 +1488,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
dependencies = [
"cfg-if",
+ "js-sys",
"libc",
"wasi",
+ "wasm-bindgen",
]
[[package]]
name = "gimli"
-version = "0.31.0"
+version = "0.31.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64"
+checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
[[package]]
name = "glob"
@@ -1364,7 +1528,7 @@ dependencies = [
"futures-core",
"futures-sink",
"futures-util",
- "http",
+ "http 0.2.12",
"indexmap",
"slab",
"tokio",
@@ -1383,37 +1547,16 @@ dependencies = [
]
[[package]]
-name = "headers"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270"
-dependencies = [
- "base64",
- "bytes",
- "headers-core",
- "http",
- "httpdate",
- "mime",
- "sha1",
-]
-
-[[package]]
-name = "headers-core"
-version = "0.2.0"
+name = "hashbrown"
+version = "0.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429"
-dependencies = [
- "http",
-]
+checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
[[package]]
name = "heck"
-version = "0.3.3"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c"
-dependencies = [
- "unicode-segmentation",
-]
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
[[package]]
name = "hermit-abi"
@@ -1427,12 +1570,6 @@ version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
-[[package]]
-name = "hex-literal"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46"
-
[[package]]
name = "hmac"
version = "0.12.1"
@@ -1444,11 +1581,11 @@ dependencies = [
[[package]]
name = "home"
-version = "0.5.9"
+version = "0.5.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5"
+checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf"
dependencies = [
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -1462,6 +1599,17 @@ dependencies = [
"itoa",
]
+[[package]]
+name = "http"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
[[package]]
name = "http-body"
version = "0.4.6"
@@ -1469,15 +1617,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2"
dependencies = [
"bytes",
- "http",
+ "http 0.2.12",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "http-body"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
+dependencies = [
+ "bytes",
+ "http 1.2.0",
+]
+
+[[package]]
+name = "http-body-util"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f"
+dependencies = [
+ "bytes",
+ "futures-util",
+ "http 1.2.0",
+ "http-body 1.0.1",
"pin-project-lite",
]
[[package]]
name = "httparse"
-version = "1.9.4"
+version = "1.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9"
+checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946"
[[package]]
name = "httpdate"
@@ -1487,17 +1658,17 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
[[package]]
name = "hyper"
-version = "0.14.30"
+version = "0.14.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9"
+checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7"
dependencies = [
"bytes",
"futures-channel",
"futures-core",
"futures-util",
"h2",
- "http",
- "http-body",
+ "http 0.2.12",
+ "http-body 0.4.6",
"httparse",
"httpdate",
"itoa",
@@ -1509,18 +1680,41 @@ dependencies = [
"want",
]
+[[package]]
+name = "hyper"
+version = "1.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-util",
+ "http 1.2.0",
+ "http-body 1.0.1",
+ "httparse",
+ "itoa",
+ "pin-project-lite",
+ "smallvec",
+ "tokio",
+ "want",
+]
+
[[package]]
name = "hyper-rustls"
-version = "0.24.2"
+version = "0.27.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590"
+checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2"
dependencies = [
"futures-util",
- "http",
- "hyper",
+ "http 1.2.0",
+ "hyper 1.5.2",
+ "hyper-util",
"rustls",
+ "rustls-pki-types",
"tokio",
"tokio-rustls",
+ "tower-service",
+ "webpki-roots",
]
[[package]]
@@ -1530,84 +1724,245 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905"
dependencies = [
"bytes",
- "hyper",
+ "hyper 0.14.32",
"native-tls",
"tokio",
"tokio-native-tls",
]
[[package]]
-name = "idna"
-version = "0.4.0"
+name = "hyper-util"
+version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c"
+checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4"
dependencies = [
- "unicode-bidi",
- "unicode-normalization",
+ "bytes",
+ "futures-channel",
+ "futures-util",
+ "http 1.2.0",
+ "http-body 1.0.1",
+ "hyper 1.5.2",
+ "pin-project-lite",
+ "socket2",
+ "tokio",
+ "tower-service",
+ "tracing",
]
[[package]]
-name = "idna"
-version = "0.5.0"
+name = "iana-time-zone"
+version = "0.1.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
dependencies = [
- "unicode-bidi",
- "unicode-normalization",
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core",
]
[[package]]
-name = "impl-codec"
-version = "0.6.0"
+name = "iana-time-zone-haiku"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
dependencies = [
- "parity-scale-codec",
+ "cc",
]
[[package]]
-name = "impl-rlp"
-version = "0.3.0"
+name = "icu_collections"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808"
+checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526"
dependencies = [
- "rlp",
+ "displaydoc",
+ "yoke",
+ "zerofrom",
+ "zerovec",
]
[[package]]
-name = "impl-serde"
-version = "0.4.0"
+name = "icu_locid"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd"
+checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637"
dependencies = [
- "serde",
+ "displaydoc",
+ "litemap",
+ "tinystr",
+ "writeable",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_locid_transform"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e"
+dependencies = [
+ "displaydoc",
+ "icu_locid",
+ "icu_locid_transform_data",
+ "icu_provider",
+ "tinystr",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_locid_transform_data"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e"
+
+[[package]]
+name = "icu_normalizer"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f"
+dependencies = [
+ "displaydoc",
+ "icu_collections",
+ "icu_normalizer_data",
+ "icu_properties",
+ "icu_provider",
+ "smallvec",
+ "utf16_iter",
+ "utf8_iter",
+ "write16",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_normalizer_data"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516"
+
+[[package]]
+name = "icu_properties"
+version = "1.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5"
+dependencies = [
+ "displaydoc",
+ "icu_collections",
+ "icu_locid_transform",
+ "icu_properties_data",
+ "icu_provider",
+ "tinystr",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_properties_data"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569"
+
+[[package]]
+name = "icu_provider"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9"
+dependencies = [
+ "displaydoc",
+ "icu_locid",
+ "icu_provider_macros",
+ "stable_deref_trait",
+ "tinystr",
+ "writeable",
+ "yoke",
+ "zerofrom",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_provider_macros"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+]
+
+[[package]]
+name = "idna"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e"
+dependencies = [
+ "idna_adapter",
+ "smallvec",
+ "utf8_iter",
+]
+
+[[package]]
+name = "idna_adapter"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71"
+dependencies = [
+ "icu_normalizer",
+ "icu_properties",
+]
+
+[[package]]
+name = "impl-codec"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f"
+dependencies = [
+ "parity-scale-codec",
+]
+
+[[package]]
+name = "impl-rlp"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808"
+dependencies = [
+ "rlp",
+]
+
+[[package]]
+name = "impl-serde"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd"
+dependencies = [
+ "serde",
]
[[package]]
name = "impl-trait-for-tuples"
-version = "0.2.2"
+version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb"
+checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9"
dependencies = [
"proc-macro2",
"quote",
- "syn 1.0.109",
+ "syn 2.0.95",
]
[[package]]
name = "indexmap"
-version = "2.5.0"
+version = "2.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5"
+checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f"
dependencies = [
"equivalent",
- "hashbrown",
+ "hashbrown 0.15.2",
]
[[package]]
name = "inkwell"
version = "0.4.0"
-source = "git+https://github.com/matter-labs-forks/inkwell?branch=llvm-17#fd415e819f185f5a4b5ed60cff4e67814b9c9b53"
+source = "git+https://github.com/matter-labs-forks/inkwell?branch=llvm-17#c5d783f52b755f5382e99e3f1179039b9435e3cc"
dependencies = [
"either",
"inkwell_internals",
@@ -1616,17 +1971,17 @@ dependencies = [
"once_cell",
"parking_lot",
"serde",
- "thiserror",
+ "thiserror 1.0.64",
]
[[package]]
name = "inkwell_internals"
version = "0.9.0"
-source = "git+https://github.com/matter-labs-forks/inkwell?branch=llvm-17#fd415e819f185f5a4b5ed60cff4e67814b9c9b53"
+source = "git+https://github.com/matter-labs-forks/inkwell?branch=llvm-17#c5d783f52b755f5382e99e3f1179039b9435e3cc"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.95",
]
[[package]]
@@ -1654,9 +2009,15 @@ dependencies = [
[[package]]
name = "ipnet"
-version = "2.10.0"
+version = "2.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708"
+
+[[package]]
+name = "is_terminal_polyfill"
+version = "1.70.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4"
+checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
[[package]]
name = "itertools"
@@ -1678,25 +2039,17 @@ dependencies = [
[[package]]
name = "itoa"
-version = "1.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
-
-[[package]]
-name = "jobserver"
-version = "0.1.32"
+version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0"
-dependencies = [
- "libc",
-]
+checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
[[package]]
name = "js-sys"
-version = "0.3.70"
+version = "0.3.76"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a"
+checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7"
dependencies = [
+ "once_cell",
"wasm-bindgen",
]
@@ -1717,9 +2070,9 @@ dependencies = [
[[package]]
name = "k256"
-version = "0.13.3"
+version = "0.13.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b"
+checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b"
dependencies = [
"cfg-if",
"ecdsa",
@@ -1759,26 +2112,15 @@ dependencies = [
[[package]]
name = "libc"
-version = "0.2.158"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439"
-
-[[package]]
-name = "libfuzzer-sys"
-version = "0.4.7"
+version = "0.2.169"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7"
-dependencies = [
- "arbitrary",
- "cc",
- "once_cell",
-]
+checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a"
[[package]]
name = "libm"
-version = "0.2.8"
+version = "0.2.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058"
+checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa"
[[package]]
name = "libmimalloc-sys"
@@ -1803,14 +2145,20 @@ dependencies = [
[[package]]
name = "linux-raw-sys"
-version = "0.4.14"
+version = "0.4.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
+
+[[package]]
+name = "litemap"
+version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
+checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104"
[[package]]
name = "llvm-sys"
version = "170.0.1"
-source = "git+https://github.com/matter-labs-forks/llvm-sys.rs?branch=llvm-17.0#a0eca916803d6123b22d9a67d1e7d2cd07227d26"
+source = "git+https://github.com/matter-labs-forks/llvm-sys.rs?branch=llvm-17.0#b65826dfdb19676637dbddb9f01bcc52ae2c4308"
dependencies = [
"anyhow",
"cc",
@@ -1865,20 +2213,19 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
[[package]]
name = "miniz_oxide"
-version = "0.8.0"
+version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1"
+checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394"
dependencies = [
"adler2",
]
[[package]]
name = "mio"
-version = "1.0.2"
+version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec"
+checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
dependencies = [
- "hermit-abi",
"libc",
"wasi",
"windows-sys 0.52.0",
@@ -2038,23 +2385,23 @@ dependencies = [
"proc-macro-crate 1.3.1",
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.95",
]
[[package]]
name = "object"
-version = "0.36.4"
+version = "0.36.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a"
+checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
dependencies = [
"memchr",
]
[[package]]
name = "once_cell"
-version = "1.19.0"
+version = "1.20.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
+checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
[[package]]
name = "opaque-debug"
@@ -2064,9 +2411,9 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
[[package]]
name = "openssl"
-version = "0.10.66"
+version = "0.10.68"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1"
+checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5"
dependencies = [
"bitflags 2.6.0",
"cfg-if",
@@ -2085,7 +2432,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.95",
]
[[package]]
@@ -2096,18 +2443,18 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
[[package]]
name = "openssl-src"
-version = "300.3.2+3.3.2"
+version = "300.4.1+3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a211a18d945ef7e648cc6e0058f4c548ee46aab922ea203e0d30e966ea23647b"
+checksum = "faa4eac4138c62414b5622d1b31c5c304f34b406b013c079c2bbc652fdd6678c"
dependencies = [
"cc",
]
[[package]]
name = "openssl-sys"
-version = "0.9.103"
+version = "0.9.104"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6"
+checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741"
dependencies = [
"cc",
"libc",
@@ -2206,40 +2553,40 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
[[package]]
name = "pest"
-version = "2.7.12"
+version = "2.7.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c73c26c01b8c87956cea613c907c9d6ecffd8d18a2a5908e5de0adfaa185cea"
+checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc"
dependencies = [
"memchr",
- "thiserror",
+ "thiserror 2.0.10",
"ucd-trie",
]
[[package]]
name = "pin-project"
-version = "1.1.5"
+version = "1.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3"
+checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916"
dependencies = [
"pin-project-internal",
]
[[package]]
name = "pin-project-internal"
-version = "1.1.5"
+version = "1.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
+checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.95",
]
[[package]]
name = "pin-project-lite"
-version = "0.2.14"
+version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
+checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
[[package]]
name = "pin-utils"
@@ -2259,9 +2606,9 @@ dependencies = [
[[package]]
name = "pkg-config"
-version = "0.3.30"
+version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
+checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2"
[[package]]
name = "ppv-lite86"
@@ -2310,38 +2657,14 @@ version = "3.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b"
dependencies = [
- "toml_edit 0.22.20",
-]
-
-[[package]]
-name = "proc-macro-error"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
-dependencies = [
- "proc-macro-error-attr",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
- "version_check",
-]
-
-[[package]]
-name = "proc-macro-error-attr"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
-dependencies = [
- "proc-macro2",
- "quote",
- "version_check",
+ "toml_edit 0.22.22",
]
[[package]]
name = "proc-macro2"
-version = "1.0.86"
+version = "1.0.92"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
+checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
dependencies = [
"unicode-ident",
]
@@ -2368,9 +2691,9 @@ dependencies = [
[[package]]
name = "psm"
-version = "0.1.23"
+version = "0.1.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa37f80ca58604976033fae9515a8a2989fc13797d953f7c04fb8fa36a11f205"
+checksum = "200b9ff220857e53e184257720a14553b2f4aa02577d2ed9842d45d4b9654810"
dependencies = [
"cc",
]
@@ -2390,11 +2713,63 @@ dependencies = [
"byteorder",
]
+[[package]]
+name = "quinn"
+version = "0.11.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef"
+dependencies = [
+ "bytes",
+ "pin-project-lite",
+ "quinn-proto",
+ "quinn-udp",
+ "rustc-hash",
+ "rustls",
+ "socket2",
+ "thiserror 2.0.10",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "quinn-proto"
+version = "0.11.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d"
+dependencies = [
+ "bytes",
+ "getrandom",
+ "rand",
+ "ring",
+ "rustc-hash",
+ "rustls",
+ "rustls-pki-types",
+ "slab",
+ "thiserror 2.0.10",
+ "tinyvec",
+ "tracing",
+ "web-time",
+]
+
+[[package]]
+name = "quinn-udp"
+version = "0.5.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904"
+dependencies = [
+ "cfg_aliases",
+ "libc",
+ "once_cell",
+ "socket2",
+ "tracing",
+ "windows-sys 0.59.0",
+]
+
[[package]]
name = "quote"
-version = "1.0.37"
+version = "1.0.38"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
+checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc"
dependencies = [
"proc-macro2",
]
@@ -2466,18 +2841,18 @@ dependencies = [
[[package]]
name = "redox_syscall"
-version = "0.5.4"
+version = "0.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0884ad60e090bf1345b93da0a5de8923c93884cd03f40dfcfddd3b4bee661853"
+checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834"
dependencies = [
"bitflags 2.6.0",
]
[[package]]
name = "regex"
-version = "1.10.6"
+version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619"
+checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8"
dependencies = [
"aho-corasick",
"memchr",
@@ -2487,9 +2862,9 @@ dependencies = [
[[package]]
name = "regex-automata"
-version = "0.4.7"
+version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df"
+checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
dependencies = [
"aho-corasick",
"memchr",
@@ -2504,9 +2879,9 @@ checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a"
[[package]]
name = "regex-syntax"
-version = "0.8.4"
+version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
+checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
[[package]]
name = "reqwest"
@@ -2514,16 +2889,15 @@ version = "0.11.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62"
dependencies = [
- "base64",
+ "base64 0.21.7",
"bytes",
"encoding_rs",
"futures-core",
"futures-util",
"h2",
- "http",
- "http-body",
- "hyper",
- "hyper-rustls",
+ "http 0.2.12",
+ "http-body 0.4.6",
+ "hyper 0.14.32",
"hyper-tls",
"ipnet",
"js-sys",
@@ -2533,23 +2907,63 @@ dependencies = [
"once_cell",
"percent-encoding",
"pin-project-lite",
- "rustls",
- "rustls-pemfile",
+ "rustls-pemfile 1.0.4",
"serde",
"serde_json",
"serde_urlencoded",
- "sync_wrapper",
+ "sync_wrapper 0.1.2",
"system-configuration",
"tokio",
"tokio-native-tls",
+ "tower-service",
+ "url",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+ "winreg",
+]
+
+[[package]]
+name = "reqwest"
+version = "0.12.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da"
+dependencies = [
+ "base64 0.22.1",
+ "bytes",
+ "futures-core",
+ "futures-util",
+ "http 1.2.0",
+ "http-body 1.0.1",
+ "http-body-util",
+ "hyper 1.5.2",
+ "hyper-rustls",
+ "hyper-util",
+ "ipnet",
+ "js-sys",
+ "log",
+ "mime",
+ "once_cell",
+ "percent-encoding",
+ "pin-project-lite",
+ "quinn",
+ "rustls",
+ "rustls-pemfile 2.2.0",
+ "rustls-pki-types",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "sync_wrapper 1.0.2",
+ "tokio",
"tokio-rustls",
+ "tower",
"tower-service",
"url",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
"webpki-roots",
- "winreg",
+ "windows-registry",
]
[[package]]
@@ -2607,7 +3021,7 @@ dependencies = [
"cfg-if",
"dyn-clone",
"enumn",
- "hashbrown",
+ "hashbrown 0.14.5",
"hex",
"serde",
]
@@ -2662,7 +3076,7 @@ version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94"
dependencies = [
- "base64",
+ "base64 0.21.7",
"bitflags 2.6.0",
"serde",
"serde_derive",
@@ -2670,16 +3084,18 @@ dependencies = [
[[package]]
name = "ruint"
-version = "1.12.3"
+version = "1.12.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286"
+checksum = "f5ef8fb1dd8de3870cb8400d51b4c2023854bbafd5431a3ac7e7317243e22d2f"
dependencies = [
"alloy-rlp",
"ark-ff 0.3.0",
"ark-ff 0.4.2",
"bytes",
- "fastrlp",
+ "fastrlp 0.3.1",
+ "fastrlp 0.4.0",
"num-bigint",
+ "num-integer",
"num-traits",
"parity-scale-codec",
"primitive-types",
@@ -2704,6 +3120,12 @@ version = "0.1.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
+[[package]]
+name = "rustc-hash"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497"
+
[[package]]
name = "rustc-hex"
version = "2.1.0"
@@ -2730,27 +3152,29 @@ dependencies = [
[[package]]
name = "rustix"
-version = "0.38.37"
+version = "0.38.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811"
+checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6"
dependencies = [
"bitflags 2.6.0",
"errno",
"libc",
"linux-raw-sys",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
]
[[package]]
name = "rustls"
-version = "0.21.12"
+version = "0.23.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e"
+checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b"
dependencies = [
- "log",
+ "once_cell",
"ring",
+ "rustls-pki-types",
"rustls-webpki",
- "sct",
+ "subtle",
+ "zeroize",
]
[[package]]
@@ -2759,16 +3183,35 @@ version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c"
dependencies = [
- "base64",
+ "base64 0.21.7",
+]
+
+[[package]]
+name = "rustls-pemfile"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50"
+dependencies = [
+ "rustls-pki-types",
+]
+
+[[package]]
+name = "rustls-pki-types"
+version = "1.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37"
+dependencies = [
+ "web-time",
]
[[package]]
name = "rustls-webpki"
-version = "0.101.7"
+version = "0.102.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765"
+checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9"
dependencies = [
"ring",
+ "rustls-pki-types",
"untrusted",
]
@@ -2804,34 +3247,34 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
[[package]]
name = "scale-info"
-version = "2.11.3"
+version = "2.11.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eca070c12893629e2cc820a9761bedf6ce1dcddc9852984d1dc734b8bd9bd024"
+checksum = "346a3b32eba2640d17a9cb5927056b08f3de90f65b72fe09402c2ad07d684d0b"
dependencies = [
"bitvec",
"cfg-if",
- "derive_more 0.99.18",
+ "derive_more 1.0.0",
"parity-scale-codec",
"scale-info-derive",
]
[[package]]
name = "scale-info-derive"
-version = "2.11.3"
+version = "2.11.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62"
+checksum = "c6630024bf739e2179b91fb424b28898baf819414262c5d376677dbff1fe7ebf"
dependencies = [
"proc-macro-crate 3.2.0",
"proc-macro2",
"quote",
- "syn 1.0.109",
+ "syn 2.0.95",
]
[[package]]
name = "schannel"
-version = "0.1.24"
+version = "0.1.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b"
+checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d"
dependencies = [
"windows-sys 0.59.0",
]
@@ -2842,16 +3285,6 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
-[[package]]
-name = "sct"
-version = "0.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414"
-dependencies = [
- "ring",
- "untrusted",
-]
-
[[package]]
name = "sec1"
version = "0.7.3"
@@ -2868,11 +3301,11 @@ dependencies = [
[[package]]
name = "secp256k1"
-version = "0.27.0"
+version = "0.28.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f"
+checksum = "d24b59d129cdadea20aea4fb2352fa053712e5d713eee47d700cd4b2bc002f10"
dependencies = [
- "secp256k1-sys 0.8.1",
+ "secp256k1-sys 0.9.2",
]
[[package]]
@@ -2887,9 +3320,9 @@ dependencies = [
[[package]]
name = "secp256k1-sys"
-version = "0.8.1"
+version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e"
+checksum = "e5d1746aae42c19d583c3c1a8c646bfad910498e2051c551a7f2e3c0c9fbb7eb"
dependencies = [
"cc",
]
@@ -2918,9 +3351,9 @@ dependencies = [
[[package]]
name = "security-framework-sys"
-version = "2.11.1"
+version = "2.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf"
+checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32"
dependencies = [
"core-foundation-sys",
"libc",
@@ -2946,9 +3379,9 @@ dependencies = [
[[package]]
name = "semver-parser"
-version = "0.10.2"
+version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7"
+checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2"
dependencies = [
"pest",
]
@@ -2979,7 +3412,7 @@ checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.95",
]
[[package]]
@@ -3043,17 +3476,6 @@ dependencies = [
"opaque-debug",
]
-[[package]]
-name = "sha1"
-version = "0.10.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
-dependencies = [
- "cfg-if",
- "cpufeatures",
- "digest 0.10.7",
-]
-
[[package]]
name = "sha2"
version = "0.9.9"
@@ -3143,9 +3565,9 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
[[package]]
name = "socket2"
-version = "0.5.7"
+version = "0.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c"
+checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8"
dependencies = [
"libc",
"windows-sys 0.52.0",
@@ -3156,6 +3578,7 @@ name = "solidity-adapter"
version = "1.5.0"
dependencies = [
"anyhow",
+ "clap",
"colored",
"era-compiler-common",
"md5",
@@ -3163,7 +3586,6 @@ dependencies = [
"semver 1.0.23",
"serde",
"serde_yaml",
- "structopt",
"web3",
]
@@ -3183,6 +3605,12 @@ dependencies = [
"der",
]
+[[package]]
+name = "stable_deref_trait"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
+
[[package]]
name = "stacker"
version = "0.1.17"
@@ -3203,28 +3631,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
[[package]]
-name = "structopt"
-version = "0.3.26"
+name = "strsim"
+version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10"
-dependencies = [
- "clap",
- "lazy_static",
- "structopt-derive",
-]
-
-[[package]]
-name = "structopt-derive"
-version = "0.4.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0"
-dependencies = [
- "heck",
- "proc-macro-error",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
+checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]]
name = "substrate-bn"
@@ -3258,9 +3668,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.77"
+version = "2.0.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed"
+checksum = "46f71c0377baf4ef1cc3e3402ded576dccc315800fbc62dfc7fe04b009773b4a"
dependencies = [
"proc-macro2",
"quote",
@@ -3273,6 +3683,26 @@ version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
+[[package]]
+name = "sync_wrapper"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
+dependencies = [
+ "futures-core",
+]
+
+[[package]]
+name = "synstructure"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+]
+
[[package]]
name = "system-configuration"
version = "0.5.1"
@@ -3302,44 +3732,56 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
[[package]]
name = "tempfile"
-version = "3.12.0"
+version = "3.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64"
+checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704"
dependencies = [
"cfg-if",
"fastrand",
+ "getrandom",
"once_cell",
"rustix",
"windows-sys 0.59.0",
]
[[package]]
-name = "textwrap"
-version = "0.11.0"
+name = "thiserror"
+version = "1.0.64"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
+checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84"
dependencies = [
- "unicode-width",
+ "thiserror-impl 1.0.64",
]
[[package]]
name = "thiserror"
-version = "1.0.63"
+version = "2.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724"
+checksum = "a3ac7f54ca534db81081ef1c1e7f6ea8a3ef428d2fc069097c079443d24124d3"
dependencies = [
- "thiserror-impl",
+ "thiserror-impl 2.0.10",
]
[[package]]
name = "thiserror-impl"
-version = "1.0.63"
+version = "1.0.64"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261"
+checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.95",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "2.0.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e9465d30713b56a37ede7185763c3492a91be2f5fa68d958c44e41ab9248beb"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
]
[[package]]
@@ -3360,11 +3802,21 @@ dependencies = [
"crunchy",
]
+[[package]]
+name = "tinystr"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f"
+dependencies = [
+ "displaydoc",
+ "zerovec",
+]
+
[[package]]
name = "tinyvec"
-version = "1.8.0"
+version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938"
+checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8"
dependencies = [
"tinyvec_macros",
]
@@ -3377,9 +3829,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
-version = "1.40.0"
+version = "1.43.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998"
+checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e"
dependencies = [
"backtrace",
"bytes",
@@ -3402,9 +3854,9 @@ dependencies = [
[[package]]
name = "tokio-rustls"
-version = "0.24.1"
+version = "0.26.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
+checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37"
dependencies = [
"rustls",
"tokio",
@@ -3412,9 +3864,9 @@ dependencies = [
[[package]]
name = "tokio-util"
-version = "0.7.12"
+version = "0.7.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a"
+checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078"
dependencies = [
"bytes",
"futures-core",
@@ -3442,15 +3894,36 @@ dependencies = [
[[package]]
name = "toml_edit"
-version = "0.22.20"
+version = "0.22.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d"
+checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5"
dependencies = [
"indexmap",
"toml_datetime",
- "winnow 0.6.18",
+ "winnow 0.6.22",
+]
+
+[[package]]
+name = "tower"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9"
+dependencies = [
+ "futures-core",
+ "futures-util",
+ "pin-project-lite",
+ "sync_wrapper 1.0.2",
+ "tokio",
+ "tower-layer",
+ "tower-service",
]
+[[package]]
+name = "tower-layer"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
+
[[package]]
name = "tower-service"
version = "0.3.3"
@@ -3459,9 +3932,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
[[package]]
name = "tracing"
-version = "0.1.40"
+version = "0.1.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
+checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0"
dependencies = [
"pin-project-lite",
"tracing-attributes",
@@ -3470,20 +3943,20 @@ dependencies = [
[[package]]
name = "tracing-attributes"
-version = "0.1.27"
+version = "0.1.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
+checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.95",
]
[[package]]
name = "tracing-core"
-version = "0.1.32"
+version = "0.1.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
+checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c"
dependencies = [
"once_cell",
]
@@ -3502,9 +3975,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
[[package]]
name = "ucd-trie"
-version = "0.1.6"
+version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9"
+checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971"
[[package]]
name = "uint"
@@ -3524,44 +3997,17 @@ version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94"
-[[package]]
-name = "unicode-bidi"
-version = "0.3.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75"
-
[[package]]
name = "unicode-ident"
-version = "1.0.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe"
-
-[[package]]
-name = "unicode-normalization"
-version = "0.1.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5"
-dependencies = [
- "tinyvec",
-]
-
-[[package]]
-name = "unicode-segmentation"
-version = "1.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202"
-
-[[package]]
-name = "unicode-width"
-version = "0.1.13"
+version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d"
+checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
[[package]]
name = "unicode-xid"
-version = "0.2.5"
+version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "229730647fbc343e3a80e463c1db7f78f3855d3f3739bee0dda773c9a037c90a"
+checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
[[package]]
name = "unsafe-libyaml"
@@ -3589,15 +4035,33 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
[[package]]
name = "url"
-version = "2.5.2"
+version = "2.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c"
+checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60"
dependencies = [
"form_urlencoded",
- "idna 0.5.0",
+ "idna",
"percent-encoding",
]
+[[package]]
+name = "utf16_iter"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246"
+
+[[package]]
+name = "utf8_iter"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
+
+[[package]]
+name = "utf8parse"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
+
[[package]]
name = "valuable"
version = "0.1.0"
@@ -3648,9 +4112,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "wasm-bindgen"
-version = "0.2.93"
+version = "0.2.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5"
+checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396"
dependencies = [
"cfg-if",
"once_cell",
@@ -3659,36 +4123,36 @@ dependencies = [
[[package]]
name = "wasm-bindgen-backend"
-version = "0.2.93"
+version = "0.2.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b"
+checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79"
dependencies = [
"bumpalo",
"log",
- "once_cell",
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.95",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-futures"
-version = "0.4.43"
+version = "0.4.49"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed"
+checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2"
dependencies = [
"cfg-if",
"js-sys",
+ "once_cell",
"wasm-bindgen",
"web-sys",
]
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.93"
+version = "0.2.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf"
+checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -3696,58 +4160,66 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.93"
+version = "0.2.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836"
+checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.95",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.93"
+version = "0.2.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484"
+checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6"
[[package]]
name = "web-sys"
-version = "0.3.70"
+version = "0.3.76"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0"
+checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc"
dependencies = [
"js-sys",
"wasm-bindgen",
]
[[package]]
-name = "web3"
-version = "0.19.0"
+name = "web-time"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5388522c899d1e1c96a4c307e3797e0f697ba7c77dd8e0e625ecba9dd0342937"
+checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "web3"
+version = "0.20.0"
+source = "git+https://github.com/jacques-kigo/rust-web3?branch=master#61c8dd5c23f89cc5f7cc365c894b69500fba8993"
dependencies = [
"arrayvec 0.7.6",
- "base64",
+ "base64 0.22.1",
"bytes",
"derive_more 0.99.18",
"ethabi",
"ethereum-types",
"futures",
"futures-timer",
- "headers",
"hex",
- "idna 0.4.0",
+ "idna",
"jsonrpc-core",
"log",
"once_cell",
"parking_lot",
"pin-project",
- "reqwest",
+ "reqwest 0.12.12",
"rlp",
- "secp256k1 0.27.0",
+ "secp256k1 0.28.2",
"serde",
"serde_json",
"tiny-keccak",
@@ -3756,9 +4228,12 @@ dependencies = [
[[package]]
name = "webpki-roots"
-version = "0.25.4"
+version = "0.26.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1"
+checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e"
+dependencies = [
+ "rustls-pki-types",
+]
[[package]]
name = "which"
@@ -3772,6 +4247,45 @@ dependencies = [
"winsafe",
]
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-registry"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0"
+dependencies = [
+ "windows-result",
+ "windows-strings",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-result"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e"
+dependencies = [
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-strings"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10"
+dependencies = [
+ "windows-result",
+ "windows-targets 0.52.6",
+]
+
[[package]]
name = "windows-sys"
version = "0.48.0"
@@ -3931,9 +4445,9 @@ dependencies = [
[[package]]
name = "winnow"
-version = "0.6.18"
+version = "0.6.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f"
+checksum = "39281189af81c07ec09db316b302a3e67bf9bd7cbf6c820b50e35fee9c2fa980"
dependencies = [
"memchr",
]
@@ -3954,6 +4468,18 @@ version = "0.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904"
+[[package]]
+name = "write16"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936"
+
+[[package]]
+name = "writeable"
+version = "0.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51"
+
[[package]]
name = "wyz"
version = "0.5.1"
@@ -3963,6 +4489,30 @@ dependencies = [
"tap",
]
+[[package]]
+name = "yoke"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40"
+dependencies = [
+ "serde",
+ "stable_deref_trait",
+ "yoke-derive",
+ "zerofrom",
+]
+
+[[package]]
+name = "yoke-derive"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "synstructure",
+]
+
[[package]]
name = "zerocopy"
version = "0.7.35"
@@ -3981,7 +4531,28 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.95",
+]
+
+[[package]]
+name = "zerofrom"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e"
+dependencies = [
+ "zerofrom-derive",
+]
+
+[[package]]
+name = "zerofrom-derive"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "synstructure",
]
[[package]]
@@ -4001,13 +4572,36 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.95",
+]
+
+[[package]]
+name = "zerovec"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079"
+dependencies = [
+ "yoke",
+ "zerofrom",
+ "zerovec-derive",
+]
+
+[[package]]
+name = "zerovec-derive"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
]
[[package]]
name = "zk_evm"
-version = "0.150.0"
-source = "git+https://github.com/matter-labs/era-zk_evm?branch=v1.5.0#9ddd65ce2910049bae402aff0230e6e1bfed578a"
+version = "0.150.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c14bda6c101389145cd01fac900f1392876bc0284d98faf7f376237baa2cb19d"
dependencies = [
"anyhow",
"lazy_static",
@@ -4020,38 +4614,22 @@ dependencies = [
[[package]]
name = "zk_evm_abstractions"
-version = "0.150.0"
+version = "0.150.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc313cea4ac9ef6b855264b1425cbe9de30dd8f009559dabcb6b2896122da5db"
+checksum = "a008f2442fc6a508bdd1f902380242cb6ff11b8b27acdac2677c6d9f75cbb004"
dependencies = [
"anyhow",
"num_enum",
"serde",
"static_assertions",
- "zkevm_opcode_defs 0.150.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zkevm_opcode_defs",
]
[[package]]
name = "zkevm_opcode_defs"
-version = "0.150.0"
+version = "0.150.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3328c012d444bdbfadb754a72c01a56879eb66584efc71eac457e89e7843608"
-dependencies = [
- "bitflags 2.6.0",
- "blake2",
- "ethereum-types",
- "k256",
- "lazy_static",
- "p256",
- "serde",
- "sha2 0.10.8",
- "sha3 0.10.8",
-]
-
-[[package]]
-name = "zkevm_opcode_defs"
-version = "0.150.0"
-source = "git+https://github.com/matter-labs/era-zkevm_opcode_defs?branch=v1.5.0#cf5f9c18c580f845b32fc2a4d565a77380fd15bc"
+checksum = "762b5f1c1b283c5388995a85d40a05aef1c14f50eb904998b7e9364739f5b899"
dependencies = [
"bitflags 2.6.0",
"blake2",
@@ -4067,7 +4645,7 @@ dependencies = [
[[package]]
name = "zkevm_tester"
version = "1.5.0"
-source = "git+https://github.com/matter-labs/era-zkevm_tester?branch=v1.5.0#5e79ef0c9d3a47c826c388b49245baf68264c946"
+source = "git+https://github.com/matter-labs/era-zkevm_tester?branch=v1.5.0#393e31814c6838378d84e9932f1b378c1da5b5fe"
dependencies = [
"anyhow",
"ethabi",
@@ -4085,20 +4663,20 @@ dependencies = [
[[package]]
name = "zksync_vm2"
-version = "0.1.0"
-source = "git+https://github.com/matter-labs/vm2#cd6136c42ec56856e0abcf2a98d1a9e120161482"
+version = "0.2.1"
+source = "git+https://github.com/matter-labs/vm2#457d8a7eea9093af9440662e33e598c13ba41633"
dependencies = [
"enum_dispatch",
"primitive-types",
"zk_evm_abstractions",
- "zkevm_opcode_defs 0.150.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zkevm_opcode_defs",
"zksync_vm2_interface",
]
[[package]]
name = "zksync_vm2_interface"
-version = "0.1.0"
-source = "git+https://github.com/matter-labs/vm2#cd6136c42ec56856e0abcf2a98d1a9e120161482"
+version = "0.2.1"
+source = "git+https://github.com/matter-labs/vm2#457d8a7eea9093af9440662e33e598c13ba41633"
dependencies = [
"primitive-types",
]
diff --git a/Cargo.toml b/Cargo.toml
index 7a574496..02fe53d6 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -4,6 +4,6 @@ members = [
"solidity_adapter",
"coverage_watcher",
"benchmark_analyzer",
- "fuzzer"
+ # "fuzzer"
]
resolver = "2"
diff --git a/README.md b/README.md
index 4e8c1a05..2eabfa22 100644
--- a/README.md
+++ b/README.md
@@ -18,6 +18,8 @@ By default, the Tester SHOULD run the entire Collection in all possible combinat
but it MAY omit some subset of the combinations for the sake of saving time, e.g. when only front-end changes have been
made, and there is no point in running tests in all LLVM optimization modes.
+
+
## Building
@@ -105,16 +107,16 @@ made, and there is no point in running tests in all LLVM optimization modes.
-5. Build zksolc and zkvyper compilers.
+5. Build compiler executables.
* Build [zksolc](https://github.com/matter-labs/era-compiler-solidity) and [zkvyper](https://github.com/matter-labs/era-compiler-vyper) compilers and add the binaries to `$PATH`, or use the `--zksolc` or `--zkvyper` options to specify their paths.
-6. Build era-compiler-tester.
+6. Build the main application.
- * Build the Tester with `cargo`:
+ * Build era-compiler-tester with `cargo`:
```shell
cargo build --release
```
@@ -123,6 +125,8 @@ made, and there is no point in running tests in all LLVM optimization modes.
When the build succeeds, you can run the tests using [the examples below](#usage).
+
+
## GitHub Actions
The `era-compiler-tester` is integrated into the GitHub Actions workflows of the following projects:
@@ -130,14 +134,16 @@ The `era-compiler-tester` is integrated into the GitHub Actions workflows of the
* [era-compiler-llvm](https://github.com/matter-labs/era-compiler-llvm)
* [era-solidity](https://github.com/matter-labs/era-solidity/)
-To allow testing custom FE and VM changes in the Pull Requests (PRs) of these repositories, two additional tags are supported:
-* `era-solidity-test`
+To allow testing custom FE and VM changes in Pull Requests (PRs) of these repositories, two additional tags are supported:
* `era-compiler-llvm-test`
+* `era-solidity-test`
If these tags exist, the tester from these tags will be used by the workflows instead of the default `main` branch.
When testing is done, these tags should be removed.
+
+
## What is supported
### Languages
@@ -169,7 +175,7 @@ When testing is done, these tags should be removed.
- [0.4.10; latest] for compiling Solidity via EVM assembly
- [0.3.3, 0.3.9] for compiling Vyper via LLL IR
-### Compiler pipelines
+### Compiler codegens
Currently only relevant for the Solidity compiler, where you can choose the IR:
@@ -181,6 +187,7 @@ Currently only relevant for the Solidity compiler, where you can choose the IR:
Most of the specifiers support wildcards `*` (any), `^` ('3' and 'z').
With no mode argument, iterates over all option combinations (approximately 800).
+
## Usage
Each command assumes you are at the root of the `compiler-tester` repository.
@@ -220,6 +227,8 @@ cargo run --release --bin compiler-tester -- -DT \
--zksolc '../era-compiler-solidity/target/release/zksolc'
```
+Modes are insensitive to spaces, therefore options such as `'Y+M3B3 0.8.26'` and `'Y + M3B3 0.8.26'` are equivalent.
+
### Example 2
Run all simple Yul tests. This currently runs about three hundred tests and takes about eight minutes.
@@ -251,10 +260,7 @@ cargo run --release --bin compiler-tester -- \
--zkvyper '../era-compiler-vyper/target/release/zkvyper'
```
-## Tracing
-If you run the tester with `-T` flag, JSON trace files will be written to the `./trace/` directory.
-The trace files can be used with our [custom ZKsync EraVM assembly tracer](https://staging-scan-v2.zksync.dev/tools/debugger) for debugging and research purposes.
## Benchmarking
@@ -291,10 +297,44 @@ cargo run --release --bin benchmark-analyzer -- --reference reference.json --can
After you make any changes in LLVM, you only need to repeat steps 2-3 to update the working branch benchmark data.
+### Comparing results
+
+By default, benchmark analyzer compares tests from groups with the same name, which means that every test should be compiled with the same codegen and optimizations.
+To compare two groups with different names, use the options `--query-reference` and `--query-candidate`. Then, use benchmark analyzer:
+
+```shell
+cargo run --release --bin benchmark-analyzer -- --reference reference.json --candidate candidate.json --query-reference "M0B0" --query-candidate "M3B3"
+```
+
+The queries are regular expressions, and the group name, codegen, and
+optimization options are matched against it.
+
+
+
+### Report formats
+
+Use the parameter `--benchmark-format` of compiler tester to select the output format: `json` (default), `csv`, or `json-lnt`.
+
+If `json-lnt` format is selected:
+
+1. The benchmark report will consist of multiple files. They will be placed in the directory provided via the `--output` argument.
+2. It is mandatory to pass a JSON file with additional information using `--benchmark-context`. Here is a minimal example:
+
+```json
+{
+ "machine": "some_machine",
+ "target": "some_target",
+ "toolchain": "some_solc_type"
+}
+```
+
+
## Troubleshooting
- Unset any LLVM-related environment variables you may have set, especially `LLVM_SYS__PREFIX` (see e.g. [https://crates.io/crates/llvm-sys](https://crates.io/crates/llvm-sys) and [https://llvm.org/docs/GettingStarted.html#local-llvm-configuration](https://llvm.org/docs/GettingStarted.html#local-llvm-configuration)). To make sure: `set | grep LLVM`.
+
+
## License
The Era Compiler Tester is distributed under the terms of either
@@ -304,10 +344,14 @@ The Era Compiler Tester is distributed under the terms of either
at your option.
+
+
## Resources
[ZKsync Era compiler toolchain documentation](https://docs.zksync.io/zk-stack/components/compiler/toolchain)
+
+
## Official Links
- [Website](https://zksync.io/)
@@ -316,6 +360,8 @@ at your option.
- [Twitter for Devs](https://twitter.com/ZKsyncDevs)
- [Discord](https://join.zksync.dev/)
+
+
## Disclaimer
ZKsync Era has been through extensive testing and audits, and although it is live, it is still in alpha state and
diff --git a/benchmark_analyzer/Cargo.toml b/benchmark_analyzer/Cargo.toml
index c10c048e..1ee1078b 100644
--- a/benchmark_analyzer/Cargo.toml
+++ b/benchmark_analyzer/Cargo.toml
@@ -3,6 +3,7 @@ name = "benchmark-analyzer"
version = "1.5.0"
authors = [
"Oleksandr Zarudnyi ",
+ "Igor Zhirkov ",
]
license = "MIT OR Apache-2.0"
edition = "2021"
@@ -13,9 +14,13 @@ name = "benchmark-analyzer"
path = "src/benchmark_analyzer/main.rs"
[dependencies]
-structopt = { version = "0.3", default-features = false }
-anyhow = "1.0"
-colored = "2.1"
+clap = { version = "=4.5.21", features = ["derive"] }
+anyhow = "=1.0.89"
+colored = "=2.1.0"
+regex = "=1.11.0"
-serde = { version = "1.0", features = [ "derive" ] }
-serde_json = "1.0"
+serde = { version = "=1.0.210", features = [ "derive" ] }
+serde_json = "=1.0.128"
+chrono = { version = "=0.4.38", features = [ "serde", "clock" ] }
+
+era-compiler-common = { git = "https://github.com/matter-labs/era-compiler-common", branch = "main" }
diff --git a/benchmark_analyzer/src/analysis/evm_interpreter/mod.rs b/benchmark_analyzer/src/analysis/evm_interpreter/mod.rs
new file mode 100644
index 00000000..83e39a43
--- /dev/null
+++ b/benchmark_analyzer/src/analysis/evm_interpreter/mod.rs
@@ -0,0 +1,59 @@
+//!
+//! Collects definitions related to the analysis of EVM interpreter tests.
+//!
+
+use std::collections::BTreeMap;
+
+use crate::model::benchmark::test::codegen::versioned::executable::run::Run;
+use crate::model::benchmark::test::metadata::Metadata as TestMetadata;
+use crate::model::evm_interpreter::OPCODES;
+use crate::results::group::Group;
+
+const OPTIMIZE_FOR_CYCLES: &str = "+M3B3";
+
+///
+/// Returns `true` if the group collects measurements of EVM Interpreter tests
+/// compiled for maximum performance.
+///
+pub fn is_evm_interpreter_cycles_tests_group(group: &Group<'_>) -> bool {
+ matches!(
+ group,
+ Group::EVMInterpreter {
+ optimizations: OPTIMIZE_FOR_CYCLES,
+ ..
+ }
+ )
+}
+
+///
+/// Returns the EVM interpreter ergs/gas ratio for every EVM bytecode.
+///
+pub fn opcode_cost_ratios<'a>(
+ group: &BTreeMap<&'a str, (&'a TestMetadata, &'a Run)>,
+) -> Vec<(String, f64)> {
+ let mut results = Vec::new();
+
+ for evm_opcode in OPCODES.into_iter() {
+ // Case name corresponds to the EVM bytecode
+ // Collect three last #fallback's to get the gas and ergs measurements
+ let runs = group
+ .values()
+ .filter_map(|(metadata, run)| match &metadata.selector.case {
+ Some(case) if case == evm_opcode => match &metadata.selector.input {
+ Some(input) if input.is_fallback() => Some(*run),
+ _ => None,
+ },
+ _ => None,
+ })
+ .collect::>();
+ let [_skip, full, template]: [&'a Run; 3] = runs
+ .try_into()
+ .unwrap_or_else(|_| panic!("Failed to extract three #fallback tests from the EVM interpreter tests attributed to the opcode {evm_opcode}"));
+
+ let ergs_difference = full.ergs as i64 - template.ergs as i64;
+ let gas_difference = full.gas as i64 - template.gas as i64;
+ let ergs_gas_ratio = (ergs_difference as f64) / (gas_difference as f64);
+ results.push((evm_opcode.to_owned(), ergs_gas_ratio));
+ }
+ results
+}
diff --git a/benchmark_analyzer/src/analysis/mod.rs b/benchmark_analyzer/src/analysis/mod.rs
new file mode 100644
index 00000000..0dc7024b
--- /dev/null
+++ b/benchmark_analyzer/src/analysis/mod.rs
@@ -0,0 +1,277 @@
+//!
+//! Provides tools for collecting and comparing benchmark results.
+//!
+
+pub mod evm_interpreter;
+
+use std::collections::BTreeMap;
+
+use evm_interpreter::is_evm_interpreter_cycles_tests_group;
+use evm_interpreter::opcode_cost_ratios;
+
+use crate::model::benchmark::test::codegen::versioned::executable::run::Run;
+use crate::model::benchmark::test::metadata::Metadata as TestMetadata;
+use crate::model::benchmark::Benchmark;
+use crate::results::group::Group;
+use crate::results::Results;
+use crate::util::btreemap::cross_join_filter_map;
+use crate::util::btreemap::intersect_keys;
+use crate::util::btreemap::intersect_map;
+
+type GroupRuns<'a> = BTreeMap<&'a str, (&'a TestMetadata, &'a Run)>;
+
+///
+/// Collects measurements from a benchmark into groups.
+/// Groups may intersect.
+///
+fn collect_runs(benchmark: &Benchmark) -> BTreeMap, GroupRuns> {
+ let mut result: BTreeMap, GroupRuns> = BTreeMap::new();
+
+ for (test_identifier, test) in &benchmark.tests {
+ for (codegen, codegen_group) in &test.codegen_groups {
+ for versioned_group in codegen_group.versioned_groups.values() {
+ for (mode, executable) in &versioned_group.executables {
+ for tag in test
+ .metadata
+ .tags
+ .iter()
+ .map(Some)
+ .chain(std::iter::once(None))
+ {
+ let tag = tag.map(|t| t.as_str());
+ result
+ .entry(Group::from_tag(tag, Some(codegen), Some(mode)))
+ .or_default()
+ .insert(test_identifier.as_str(), (&test.metadata, &executable.run));
+ }
+ }
+ }
+ }
+ }
+
+ result
+}
+
+///
+/// Compare two benchmark runs [reference] and [candidate] by groups.
+/// Every resulting group is either:
+/// - a result of comparison of a group from [reference] with a group from [candidate] sharing the same name
+/// - or a result of comparing two distinct groups from [reference] and
+/// [candidate] for which [custom_group_comparisons] returned `true`.
+///
+pub fn compare<'a>(
+ reference: &'a Benchmark,
+ candidate: &'a Benchmark,
+ custom_group_comparisons: impl Fn(&Group, &Group) -> bool,
+) -> Vec<(Group<'a>, Results<'a>)> {
+ let groups = {
+ let reference_runs: BTreeMap, GroupRuns<'a>> = collect_runs(reference);
+ let candidate_runs: BTreeMap, GroupRuns<'a>> = collect_runs(candidate);
+
+ let comparisons: Vec<(Group<'a>, GroupRuns<'a>, GroupRuns<'a>)> =
+ cross_join_filter_map(&reference_runs, &candidate_runs, |g1, g2| {
+ if custom_group_comparisons(g1, g2) {
+ Some(Group::new_comparison(g1, g2))
+ } else {
+ None
+ }
+ });
+
+ intersect_keys(reference_runs, candidate_runs).chain(comparisons)
+ };
+
+ let results: Vec<(Group<'_>, Results<'_>)> = groups
+ .map(|(group_name, reference_tests, candidate_tests)| {
+ let ratios = if is_evm_interpreter_cycles_tests_group(&group_name) {
+ Some((
+ opcode_cost_ratios(&reference_tests),
+ opcode_cost_ratios(&candidate_tests),
+ ))
+ } else {
+ None
+ };
+
+ let runs: Vec<(&TestMetadata, &Run, &Run)> = intersect_map(
+ reference_tests,
+ candidate_tests,
+ |_id, (metadata, run_reference), (_, run_candidate)| {
+ (metadata, run_reference, run_candidate)
+ },
+ )
+ .collect();
+ let results = {
+ let mut runs = compare_runs(runs);
+
+ if let Some((reference_ratios, candidate_ratios)) = ratios {
+ runs.set_evm_interpreter_ratios(reference_ratios, candidate_ratios);
+ }
+ runs
+ };
+ (group_name, results)
+ })
+ .collect();
+
+ results
+}
+
+///
+/// Compare two sets of measurements.
+/// The parameter `[run]` is a vector of triples where each element contains:
+/// - metadata for a test,
+/// - measurement in the first set,
+/// - measurement in the second set.
+///
+fn compare_runs<'a>(runs: Vec<(&'a TestMetadata, &'a Run, &'a Run)>) -> Results<'a> {
+ let elements_number = runs.len();
+
+ let mut size_factors = Vec::with_capacity(elements_number);
+ let mut size_min = 1.0;
+ let mut size_max = 1.0;
+ let mut size_negatives: Vec<(f64, &TestMetadata)> = Vec::with_capacity(elements_number);
+ let mut size_positives: Vec<(f64, &TestMetadata)> = Vec::with_capacity(elements_number);
+ let mut size_total_reference: u64 = 0;
+ let mut size_total_candidate: u64 = 0;
+
+ let mut cycles_factors = Vec::with_capacity(elements_number);
+ let mut cycles_min = 1.0;
+ let mut cycles_max = 1.0;
+ let mut cycles_negatives: Vec<(f64, &TestMetadata)> = Vec::with_capacity(elements_number);
+ let mut cycles_positives: Vec<(f64, &TestMetadata)> = Vec::with_capacity(elements_number);
+ let mut cycles_total_reference: u64 = 0;
+ let mut cycles_total_candidate: u64 = 0;
+
+ let mut ergs_factors = Vec::with_capacity(elements_number);
+ let mut ergs_min = 1.0;
+ let mut ergs_max = 1.0;
+ let mut ergs_negatives: Vec<(f64, &TestMetadata)> = Vec::with_capacity(elements_number);
+ let mut ergs_positives: Vec<(f64, &TestMetadata)> = Vec::with_capacity(elements_number);
+ let mut ergs_total_reference: u64 = 0;
+ let mut ergs_total_candidate: u64 = 0;
+
+ let mut gas_factors = Vec::with_capacity(elements_number);
+ let mut gas_min = 1.0;
+ let mut gas_max = 1.0;
+ let mut gas_negatives = Vec::with_capacity(elements_number);
+ let mut gas_positives = Vec::with_capacity(elements_number);
+ let mut gas_total_reference: u64 = 0;
+ let mut gas_total_candidate: u64 = 0;
+
+ for (metadata, reference, candidate) in runs {
+ let file_path = &metadata.selector.path;
+ // FIXME: ad-hoc patch
+ if file_path.contains(crate::model::evm_interpreter::TEST_PATH) {
+ if let Some(input) = &metadata.selector.input {
+ if input.is_deployer() {
+ continue;
+ }
+ }
+ }
+
+ cycles_total_reference += reference.cycles as u64;
+ cycles_total_candidate += candidate.cycles as u64;
+ let cycles_factor = (candidate.cycles as f64) / (reference.cycles as f64);
+ if cycles_factor > 1.0 {
+ cycles_negatives.push((cycles_factor, metadata));
+ }
+ if cycles_factor < 1.0 {
+ cycles_positives.push((cycles_factor, metadata));
+ }
+ if cycles_factor < cycles_min {
+ cycles_min = cycles_factor;
+ }
+ if cycles_factor > cycles_max {
+ cycles_max = cycles_factor;
+ }
+ cycles_factors.push(cycles_factor);
+
+ ergs_total_reference += reference.ergs;
+ ergs_total_candidate += candidate.ergs;
+ let ergs_factor = (candidate.ergs as f64) / (reference.ergs as f64);
+ if ergs_factor > 1.0 {
+ ergs_negatives.push((ergs_factor, metadata));
+ }
+ if ergs_factor < 1.0 {
+ ergs_positives.push((ergs_factor, metadata));
+ }
+ if ergs_factor < ergs_min {
+ ergs_min = ergs_factor;
+ }
+ if ergs_factor > ergs_max {
+ ergs_max = ergs_factor;
+ }
+ ergs_factors.push(ergs_factor);
+
+ gas_total_reference += reference.gas;
+ gas_total_candidate += candidate.gas;
+ let gas_factor = (candidate.gas as f64) / (reference.gas as f64);
+ if gas_factor > 1.0 {
+ gas_negatives.push((gas_factor, metadata));
+ }
+ if gas_factor < 1.0 {
+ gas_positives.push((gas_factor, metadata));
+ }
+ if gas_factor < gas_min {
+ gas_min = gas_factor;
+ }
+ if gas_factor > gas_max {
+ gas_max = gas_factor;
+ }
+ gas_factors.push(gas_factor);
+
+ let reference_size = match reference.size {
+ Some(size) => size,
+ None => continue,
+ };
+ let candidate_size = match candidate.size {
+ Some(size) => size,
+ None => continue,
+ };
+ size_total_reference += reference_size as u64;
+ size_total_candidate += candidate_size as u64;
+ let size_factor = (candidate_size as f64) / (reference_size as f64);
+ if size_factor > 1.0 {
+ size_negatives.push((size_factor, metadata));
+ }
+ if size_factor < 1.0 {
+ size_positives.push((size_factor, metadata));
+ }
+ if size_factor < size_min {
+ size_min = size_factor;
+ }
+ if size_factor > size_max {
+ size_max = size_factor;
+ }
+ size_factors.push(size_factor);
+ }
+
+ let size_total = (size_total_candidate as f64) / (size_total_reference as f64);
+
+ let cycles_total = (cycles_total_candidate as f64) / (cycles_total_reference as f64);
+
+ let ergs_total = (ergs_total_candidate as f64) / (ergs_total_reference as f64);
+
+ let gas_total = (gas_total_candidate as f64) / (gas_total_reference as f64);
+
+ Results::new(
+ size_min,
+ size_max,
+ size_total,
+ size_negatives,
+ size_positives,
+ cycles_min,
+ cycles_max,
+ cycles_total,
+ cycles_negatives,
+ cycles_positives,
+ ergs_min,
+ ergs_max,
+ ergs_total,
+ ergs_negatives,
+ ergs_positives,
+ gas_min,
+ gas_max,
+ gas_total,
+ gas_negatives,
+ gas_positives,
+ )
+}
diff --git a/benchmark_analyzer/src/benchmark/group/mod.rs b/benchmark_analyzer/src/benchmark/group/mod.rs
deleted file mode 100644
index 78dca30d..00000000
--- a/benchmark_analyzer/src/benchmark/group/mod.rs
+++ /dev/null
@@ -1,179 +0,0 @@
-//!
-//! The benchmark group representation.
-//!
-
-pub mod element;
-pub mod results;
-
-use std::collections::BTreeMap;
-
-use serde::Deserialize;
-use serde::Serialize;
-
-use crate::benchmark::Benchmark;
-
-use self::element::Element;
-use self::results::Results;
-
-///
-/// The benchmark group representation.
-///
-#[derive(Debug, Default, Serialize, Deserialize, Clone)]
-pub struct Group {
- /// The group elements.
- pub elements: BTreeMap,
-}
-
-impl Group {
- ///
- /// Compares two benchmark groups.
- ///
- pub fn compare<'a>(reference: &'a Self, candidate: &'a Self) -> Results<'a> {
- let elements_number = reference.elements.len();
-
- let mut size_factors = Vec::with_capacity(elements_number);
- let mut size_min = 1.0;
- let mut size_max = 1.0;
- let mut size_negatives = Vec::with_capacity(elements_number);
- let mut size_positives = Vec::with_capacity(elements_number);
- let mut size_total_reference: u64 = 0;
- let mut size_total_candidate: u64 = 0;
-
- let mut cycles_factors = Vec::with_capacity(elements_number);
- let mut cycles_min = 1.0;
- let mut cycles_max = 1.0;
- let mut cycles_negatives = Vec::with_capacity(elements_number);
- let mut cycles_positives = Vec::with_capacity(elements_number);
- let mut cycles_total_reference: u64 = 0;
- let mut cycles_total_candidate: u64 = 0;
-
- let mut ergs_factors = Vec::with_capacity(elements_number);
- let mut ergs_min = 1.0;
- let mut ergs_max = 1.0;
- let mut ergs_negatives = Vec::with_capacity(elements_number);
- let mut ergs_positives = Vec::with_capacity(elements_number);
- let mut ergs_total_reference: u64 = 0;
- let mut ergs_total_candidate: u64 = 0;
-
- for (path, reference) in reference.elements.iter() {
- if path.contains("tests/solidity/complex/interpreter/test.json")
- && path.contains("#deployer")
- {
- continue;
- }
- let candidate = match candidate.elements.get(path.as_str()) {
- Some(candidate) => candidate,
- None => continue,
- };
-
- cycles_total_reference += reference.cycles as u64;
- cycles_total_candidate += candidate.cycles as u64;
- let cycles_factor = (candidate.cycles as f64) / (reference.cycles as f64);
- if cycles_factor > 1.0 {
- cycles_negatives.push((cycles_factor, path.as_str()));
- }
- if cycles_factor < 1.0 {
- cycles_positives.push((cycles_factor, path.as_str()));
- }
- if cycles_factor < cycles_min {
- cycles_min = cycles_factor;
- }
- if cycles_factor > cycles_max {
- cycles_max = cycles_factor;
- }
- cycles_factors.push(cycles_factor);
-
- ergs_total_reference += reference.ergs;
- ergs_total_candidate += candidate.ergs;
- let ergs_factor = (candidate.ergs as f64) / (reference.ergs as f64);
- if ergs_factor > 1.0 {
- ergs_negatives.push((ergs_factor, path.as_str()));
- }
- if ergs_factor < 1.0 {
- ergs_positives.push((ergs_factor, path.as_str()));
- }
- if ergs_factor < ergs_min {
- ergs_min = ergs_factor;
- }
- if ergs_factor > ergs_max {
- ergs_max = ergs_factor;
- }
- ergs_factors.push(ergs_factor);
-
- let reference_size = match reference.size {
- Some(size) => size,
- None => continue,
- };
- let candidate_size = match candidate.size {
- Some(size) => size,
- None => continue,
- };
- size_total_reference += reference_size as u64;
- size_total_candidate += candidate_size as u64;
- let size_factor = (candidate_size as f64) / (reference_size as f64);
- if size_factor > 1.0 {
- size_negatives.push((size_factor, path.as_str()));
- }
- if size_factor < 1.0 {
- size_positives.push((size_factor, path.as_str()));
- }
- if size_factor < size_min {
- size_min = size_factor;
- }
- if size_factor > size_max {
- size_max = size_factor;
- }
- size_factors.push(size_factor);
- }
-
- let size_total = (size_total_candidate as f64) / (size_total_reference as f64);
-
- let cycles_total = (cycles_total_candidate as f64) / (cycles_total_reference as f64);
-
- let ergs_total = (ergs_total_candidate as f64) / (ergs_total_reference as f64);
-
- Results::new(
- size_min,
- size_max,
- size_total,
- size_negatives,
- size_positives,
- cycles_min,
- cycles_max,
- cycles_total,
- cycles_negatives,
- cycles_positives,
- ergs_min,
- ergs_max,
- ergs_total,
- ergs_negatives,
- ergs_positives,
- )
- }
-
- ///
- /// Returns the EVM interpreter ergs/gas ratio.
- ///
- pub fn evm_interpreter_ratios(&self) -> Vec<(String, f64)> {
- let mut results = Vec::with_capacity(Benchmark::EVM_OPCODES.len());
- for evm_opcode in Benchmark::EVM_OPCODES.into_iter() {
- let name_substring = format!("test.json::{evm_opcode}[");
- let [full, template]: [Element; 2] = self
- .elements
- .iter()
- .filter(|element| element.0.contains(name_substring.as_str()))
- .rev()
- .take(2)
- .map(|element| (element.1.to_owned()))
- .collect::>()
- .try_into()
- .expect("Always valid");
-
- let ergs_difference = full.ergs - template.ergs;
- let gas_difference = full.gas - template.gas;
- let ergs_gas_ratio = (ergs_difference as f64) / (gas_difference as f64);
- results.push((evm_opcode.to_owned(), ergs_gas_ratio));
- }
- results
- }
-}
diff --git a/benchmark_analyzer/src/benchmark/mod.rs b/benchmark_analyzer/src/benchmark/mod.rs
deleted file mode 100644
index ad724502..00000000
--- a/benchmark_analyzer/src/benchmark/mod.rs
+++ /dev/null
@@ -1,225 +0,0 @@
-//!
-//! The benchmark representation.
-//!
-
-pub mod group;
-
-use std::collections::BTreeMap;
-use std::path::PathBuf;
-
-use serde::Deserialize;
-use serde::Serialize;
-
-use self::group::results::Results;
-use self::group::Group;
-
-///
-/// The benchmark representation.
-///
-#[derive(Debug, Default, Serialize, Deserialize)]
-pub struct Benchmark {
- /// The benchmark groups.
- pub groups: BTreeMap,
-}
-
-impl Benchmark {
- /// The EVM interpreter group identifier.
- pub const EVM_INTERPRETER_GROUP_NAME: &'static str = "EVMInterpreter";
-
- /// The EVM interpreter cycles group identifier.
- pub const EVM_INTERPRETER_GROUP_NAME_CYCLES: &'static str = "EVMInterpreter M3B3";
-
- /// The EVM opcodes to test.
- pub const EVM_OPCODES: [&'static str; 135] = [
- "ADD",
- "MUL",
- "SUB",
- "DIV",
- "SDIV",
- "MOD",
- "SMOD",
- "ADDMOD",
- "MULMOD",
- "EXP",
- "SIGNEXTEND",
- "LT",
- "GT",
- "SLT",
- "SGT",
- "EQ",
- "ISZERO",
- "AND",
- "OR",
- "XOR",
- "NOT",
- "BYTE",
- "SHL",
- "SHR",
- "SAR",
- "SGT",
- "SHA3",
- "ADDRESS",
- "BALANCE",
- "ORIGIN",
- "CALLER",
- "CALLVALUE",
- "CALLDATALOAD",
- "CALLDATASIZE",
- "CALLDATACOPY",
- "CODESIZE",
- "CODECOPY",
- "GASPRICE",
- "EXTCODESIZE",
- "EXTCODECOPY",
- "RETURNDATASIZE",
- "RETURNDATACOPY",
- "EXTCODEHASH",
- "BLOCKHASH",
- "COINBASE",
- "TIMESTAMP",
- "NUMBER",
- "PREVRANDAO",
- "GASLIMIT",
- "CHAINID",
- "SELFBALANCE",
- "BASEFEE",
- "POP",
- "MLOAD",
- "MSTORE",
- "MSTORE8",
- "SLOAD",
- "SSTORE",
- "JUMP",
- "JUMPI",
- "PC",
- "MSIZE",
- "GAS",
- "JUMPDEST",
- "PUSH0",
- "PUSH1",
- "PUSH2",
- "PUSH4",
- "PUSH5",
- "PUSH6",
- "PUSH7",
- "PUSH8",
- "PUSH9",
- "PUSH10",
- "PUSH11",
- "PUSH12",
- "PUSH13",
- "PUSH14",
- "PUSH15",
- "PUSH16",
- "PUSH17",
- "PUSH18",
- "PUSH19",
- "PUSH20",
- "PUSH21",
- "PUSH22",
- "PUSH23",
- "PUSH24",
- "PUSH25",
- "PUSH26",
- "PUSH27",
- "PUSH28",
- "PUSH29",
- "PUSH30",
- "PUSH31",
- "PUSH32",
- "DUP1",
- "DUP2",
- "DUP3",
- "DUP4",
- "DUP5",
- "DUP6",
- "DUP7",
- "DUP8",
- "DUP9",
- "DUP10",
- "DUP11",
- "DUP12",
- "DUP13",
- "DUP14",
- "DUP15",
- "DUP16",
- "SWAP1",
- "SWAP2",
- "SWAP3",
- "SWAP4",
- "SWAP5",
- "SWAP6",
- "SWAP7",
- "SWAP8",
- "SWAP9",
- "SWAP10",
- "SWAP11",
- "SWAP12",
- "SWAP13",
- "SWAP14",
- "SWAP15",
- "SWAP16",
- "CALL",
- "STATICCALL",
- "DELEGATECALL",
- "CREATE",
- "CREATE2",
- "RETURN",
- "REVERT",
- ];
-
- ///
- /// Compares two benchmarks.
- ///
- pub fn compare<'a>(reference: &'a Self, candidate: &'a Self) -> BTreeMap<&'a str, Results<'a>> {
- let mut results = BTreeMap::new();
-
- for (group_name, reference_group) in reference.groups.iter() {
- let candidate_group = match candidate.groups.get(group_name) {
- Some(candidate_group) => candidate_group,
- None => continue,
- };
-
- let mut group_results = Group::compare(reference_group, candidate_group);
- if group_name.starts_with(Self::EVM_INTERPRETER_GROUP_NAME_CYCLES) {
- if let (Some(reference_ratios), Some(candidate_ratios)) = (
- reference
- .groups
- .get(group_name.as_str())
- .map(|group| group.evm_interpreter_ratios()),
- candidate
- .groups
- .get(group_name.as_str())
- .map(|group| group.evm_interpreter_ratios()),
- ) {
- group_results.set_evm_interpreter_ratios(reference_ratios, candidate_ratios);
- }
- }
- results.insert(group_name.as_str(), group_results);
- }
-
- results
- }
-
- ///
- /// Writes the benchmark to a file.
- ///
- pub fn write_to_file(self, path: PathBuf) -> anyhow::Result<()> {
- let contents = serde_json::to_string(&self).expect("Always valid");
- std::fs::write(path.as_path(), contents)
- .map_err(|error| anyhow::anyhow!("Benchmark file {:?} reading: {}", path, error))?;
- Ok(())
- }
-}
-
-impl TryFrom for Benchmark {
- type Error = anyhow::Error;
-
- fn try_from(path: PathBuf) -> Result {
- let text = std::fs::read_to_string(path.as_path())
- .map_err(|error| anyhow::anyhow!("Benchmark file {:?} reading: {}", path, error))?;
- let json: Self = serde_json::from_str(text.as_str())
- .map_err(|error| anyhow::anyhow!("Benchmark file {:?} parsing: {}", path, error))?;
- Ok(json)
- }
-}
diff --git a/benchmark_analyzer/src/benchmark_analyzer/arguments.rs b/benchmark_analyzer/src/benchmark_analyzer/arguments.rs
index ffc96623..3fffc116 100644
--- a/benchmark_analyzer/src/benchmark_analyzer/arguments.rs
+++ b/benchmark_analyzer/src/benchmark_analyzer/arguments.rs
@@ -4,39 +4,35 @@
use std::path::PathBuf;
-use structopt::StructOpt;
+use clap::Parser;
///
/// The benchmark analyzer arguments.
///
-#[derive(Debug, StructOpt)]
-#[structopt(
- name = "benchmark-analyzer",
- about = "ZKsync toolchain benchmark analyzer"
-)]
+#[derive(Debug, Parser)]
+#[command(about, long_about = None)]
pub struct Arguments {
/// The reference build benchmark.
- #[structopt(long = "reference", default_value = "reference.json")]
+ #[structopt(long, default_value = "reference.json")]
pub reference: PathBuf,
/// The candidate build benchmark.
- #[structopt(long = "candidate", default_value = "candidate.json")]
+ #[structopt(long, default_value = "candidate.json")]
pub candidate: PathBuf,
/// The output file. If unset, the result is printed to `stdout`.
- #[structopt(short = "o", long = "output-file")]
- pub output_path: Option,
+ #[structopt(short = 'o', long)]
+ pub output_file: Option,
/// Maximum number of results displayed in a group.
- #[structopt(long = "group-max", default_value = "100")]
+ #[structopt(long, default_value_t = 100)]
pub group_max: usize,
-}
-impl Arguments {
- ///
- /// A shortcut constructor.
- ///
- pub fn new() -> Self {
- Self::from_args()
- }
+ /// Regular expression to select reference group for the comparison.
+ #[structopt(long)]
+ pub query_reference: Option,
+
+ /// Regular expression to select candidate group for the comparison.
+ #[structopt(long)]
+ pub query_candidate: Option,
}
diff --git a/benchmark_analyzer/src/benchmark_analyzer/main.rs b/benchmark_analyzer/src/benchmark_analyzer/main.rs
index e0a0d8a6..572f9a3e 100644
--- a/benchmark_analyzer/src/benchmark_analyzer/main.rs
+++ b/benchmark_analyzer/src/benchmark_analyzer/main.rs
@@ -6,26 +6,58 @@ pub(crate) mod arguments;
use std::io::Write;
+use clap::Parser;
+
use self::arguments::Arguments;
+use benchmark_analyzer::ResultsGroup;
///
/// The application entry point.
///
fn main() -> anyhow::Result<()> {
- let arguments = Arguments::new();
+ let arguments = Arguments::try_parse()?;
+
+ let reference_benchmark = benchmark_analyzer::Benchmark::try_from(arguments.reference)?;
+ let candidate_benchmark = benchmark_analyzer::Benchmark::try_from(arguments.candidate)?;
+
+ let groups_results = if let (Some(reference_query), Some(candidate_query)) =
+ (arguments.query_reference, arguments.query_candidate)
+ {
+ // If the user provides regular expressions to select groups for
+ // comparison, the analyzer will compare all groups with the same names,
+ // plus all pairs of groups matching regular expressions
+ // [regex_reference] and [regex_candidate].
- let reference = benchmark_analyzer::Benchmark::try_from(arguments.reference)?;
- let candidate = benchmark_analyzer::Benchmark::try_from(arguments.candidate)?;
+ let regex_reference =
+ regex::Regex::new(&reference_query).expect("Invalid reference query regexp");
+ let regex_candidate =
+ regex::Regex::new(&candidate_query).expect("Invalid candidate query regexp");
- let groups_results = benchmark_analyzer::Benchmark::compare(&reference, &candidate);
+ benchmark_analyzer::analysis::compare(
+ &reference_benchmark,
+ &candidate_benchmark,
+ |g1: &ResultsGroup<'_>, g2: &ResultsGroup<'_>| {
+ g1.regex_matches(®ex_reference) && g2.regex_matches(®ex_candidate)
+ },
+ )
+ } else {
+ // If the user did not provide regular expressions to select groups for
+ // comparison, the analyzer will compare only the groups with the same
+ // names.
+ benchmark_analyzer::analysis::compare(
+ &reference_benchmark,
+ &candidate_benchmark,
+ |_: &ResultsGroup<'_>, _: &ResultsGroup<'_>| false,
+ )
+ };
- match arguments.output_path {
+ match arguments.output_file {
Some(output_path) => {
let mut file = std::fs::File::create(output_path)?;
for (group_name, mut results) in groups_results.into_iter() {
results.sort_worst();
- results.print_worst_results(arguments.group_max, group_name);
- results.write_all(&mut file, group_name)?;
+ results.print_worst_results(arguments.group_max, &group_name.to_string());
+ results.write_all(&mut file, &group_name.to_string())?;
writeln!(file)?;
println!();
println!();
@@ -35,8 +67,8 @@ fn main() -> anyhow::Result<()> {
let mut stdout = std::io::stdout();
for (group_name, mut results) in groups_results.into_iter() {
results.sort_worst();
- results.print_worst_results(arguments.group_max, group_name);
- results.write_all(&mut stdout, group_name)?;
+ results.print_worst_results(arguments.group_max, &group_name.to_string());
+ results.write_all(&mut stdout, &group_name.to_string())?;
writeln!(stdout)?;
println!();
println!();
diff --git a/benchmark_analyzer/src/lib.rs b/benchmark_analyzer/src/lib.rs
index f01677a8..622f4eb5 100644
--- a/benchmark_analyzer/src/lib.rs
+++ b/benchmark_analyzer/src/lib.rs
@@ -2,13 +2,34 @@
//! The benchmark analyzer library.
//!
-pub(crate) mod benchmark;
+pub mod analysis;
+pub mod model;
+pub mod output;
+pub mod results;
+pub mod util;
-pub use self::benchmark::group::element::Element as BenchmarkElement;
-pub use self::benchmark::group::Group as BenchmarkGroup;
-pub use self::benchmark::Benchmark;
+pub use crate::output::format::csv::Csv as CsvSerializer;
+pub use crate::output::format::json::lnt::JsonLNT as JsonLNTSerializer;
+pub use crate::output::format::json::native::Json as JsonNativeSerializer;
-///
-/// The all elements group name.
-///
-pub const BENCHMARK_ALL_GROUP_NAME: &str = "All";
+pub use crate::model::benchmark::test::codegen::versioned::executable::run::Run;
+pub use crate::model::benchmark::test::codegen::versioned::executable::Executable;
+pub use crate::model::benchmark::test::codegen::versioned::VersionedGroup;
+pub use crate::model::benchmark::test::codegen::CodegenGroup;
+pub use crate::model::benchmark::test::input::Input;
+pub use crate::model::benchmark::test::selector::Selector as TestSelector;
+pub use crate::model::benchmark::test::Test;
+pub use crate::model::benchmark::write_to_file;
+pub use crate::model::benchmark::Benchmark;
+pub use crate::model::context::validate_context;
+pub use crate::model::context::Context as BenchmarkContext;
+
+// Metadata for various parts of the model
+pub use crate::model::benchmark::metadata::BenchmarkVersion;
+pub use crate::model::benchmark::metadata::Metadata as BenchmarkMetadata;
+pub use crate::model::benchmark::test::codegen::versioned::executable::metadata::Metadata as ExecutableMetadata;
+pub use crate::model::benchmark::test::metadata::Metadata as TestMetadata;
+
+pub use crate::results::group::Group as ResultsGroup;
+
+pub use crate::model::evm_interpreter::GROUP_NAME as TEST_GROUP_EVM_INTERPRETER;
diff --git a/benchmark_analyzer/src/model/benchmark/metadata.rs b/benchmark_analyzer/src/model/benchmark/metadata.rs
new file mode 100644
index 00000000..93695e63
--- /dev/null
+++ b/benchmark_analyzer/src/model/benchmark/metadata.rs
@@ -0,0 +1,36 @@
+//!
+//! Information associated with the benchmark run.
+//!
+
+use chrono::DateTime;
+use chrono::Utc;
+use serde::Deserialize;
+use serde::Serialize;
+
+use crate::model::context::Context;
+
+/// Version of the benchmark format.
+#[derive(Clone, Debug, Default, Serialize, Deserialize)]
+pub enum BenchmarkVersion {
+ #[default]
+ /// Flat format, a map from key (Identifier + mode) to measurements.
+ V1,
+ /// New format with metadata.
+ V2,
+}
+
+///
+/// Information associated with the benchmark run.
+///
+#[derive(Clone, Debug, Default, Serialize, Deserialize)]
+pub struct Metadata {
+ /// Version for the benchmark report.
+ pub version: BenchmarkVersion,
+ /// Start of the benchmark run.
+ pub start: DateTime,
+ /// End of the benchmark run.
+ pub end: DateTime,
+ /// Context of benchmarking, passed from compiler tester.
+ #[serde(skip)]
+ pub context: Option,
+}
diff --git a/benchmark_analyzer/src/model/benchmark/mod.rs b/benchmark_analyzer/src/model/benchmark/mod.rs
new file mode 100644
index 00000000..0e82ceb5
--- /dev/null
+++ b/benchmark_analyzer/src/model/benchmark/mod.rs
@@ -0,0 +1,78 @@
+//!
+//! The benchmark representation.
+//!
+
+pub mod metadata;
+pub mod test;
+
+use std::collections::BTreeMap;
+use std::path::PathBuf;
+
+use serde::Deserialize;
+use serde::Serialize;
+
+use crate::output::comparison_result::Output;
+use crate::output::file::File;
+use crate::output::IBenchmarkSerializer;
+
+use metadata::Metadata;
+
+use self::test::Test;
+
+///
+/// The benchmark representation.
+///
+#[derive(Debug, Default, Serialize, Deserialize)]
+pub struct Benchmark {
+ /// Metadata related to the whole benchmark.
+ pub metadata: Metadata,
+ /// The tests.
+ pub tests: BTreeMap,
+}
+
+///
+/// Writes the benchmark results to a file using a provided serializer.
+///
+pub fn write_to_file(
+ benchmark: &Benchmark,
+ path: PathBuf,
+ serializer: impl IBenchmarkSerializer,
+) -> anyhow::Result<()> {
+ match serializer
+ .serialize_to_string(benchmark)
+ .expect("Always valid")
+ {
+ Output::SingleFile(contents) => {
+ std::fs::write(path.as_path(), contents)
+ .map_err(|error| anyhow::anyhow!("Benchmark file {path:?} writing: {error}"))?;
+ }
+ Output::MultipleFiles(files) => {
+ if !files.is_empty() {
+ std::fs::create_dir_all(&path)?;
+ }
+ for File {
+ path: relative_path,
+ contents,
+ } in files
+ {
+ let file_path = path.join(relative_path);
+ std::fs::write(file_path.as_path(), contents).map_err(|error| {
+ anyhow::anyhow!("Benchmark file {file_path:?} writing: {error}")
+ })?;
+ }
+ }
+ }
+ Ok(())
+}
+
+impl TryFrom for Benchmark {
+ type Error = anyhow::Error;
+
+ fn try_from(path: PathBuf) -> Result {
+ let text = std::fs::read_to_string(path.as_path())
+ .map_err(|error| anyhow::anyhow!("Benchmark file {path:?} reading: {error}"))?;
+ let json: Self = serde_json::from_str(text.as_str())
+ .map_err(|error| anyhow::anyhow!("Benchmark file {path:?} parsing: {error}"))?;
+ Ok(json)
+ }
+}
diff --git a/benchmark_analyzer/src/model/benchmark/test/codegen/mod.rs b/benchmark_analyzer/src/model/benchmark/test/codegen/mod.rs
new file mode 100644
index 00000000..1cde5971
--- /dev/null
+++ b/benchmark_analyzer/src/model/benchmark/test/codegen/mod.rs
@@ -0,0 +1,26 @@
+//!
+//! Groups test instances by the code generator version.
+//!
+
+pub mod versioned;
+
+use std::collections::BTreeMap;
+
+use serde::Deserialize;
+use serde::Serialize;
+use versioned::VersionedGroup;
+
+///
+/// The language version associated with a test.
+///
+pub type Version = String;
+
+///
+/// Groups test instances by the code generator version.
+///
+#[derive(Debug, Default, Clone, Serialize, Deserialize)]
+pub struct CodegenGroup {
+ #[serde(flatten)]
+ /// Inner groups that differ by the associated language version.
+ pub versioned_groups: BTreeMap,
+}
diff --git a/benchmark_analyzer/src/model/benchmark/test/codegen/versioned/executable/metadata.rs b/benchmark_analyzer/src/model/benchmark/test/codegen/versioned/executable/metadata.rs
new file mode 100644
index 00000000..bc9776de
--- /dev/null
+++ b/benchmark_analyzer/src/model/benchmark/test/codegen/versioned/executable/metadata.rs
@@ -0,0 +1,12 @@
+//!
+//! Information associated with an executable in a benchmark.
+//!
+
+use serde::Deserialize;
+use serde::Serialize;
+
+///
+/// Information associated with an executable in a benchmark.
+///
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
+pub struct Metadata {}
diff --git a/benchmark_analyzer/src/model/benchmark/test/codegen/versioned/executable/mod.rs b/benchmark_analyzer/src/model/benchmark/test/codegen/versioned/executable/mod.rs
new file mode 100644
index 00000000..65353f30
--- /dev/null
+++ b/benchmark_analyzer/src/model/benchmark/test/codegen/versioned/executable/mod.rs
@@ -0,0 +1,26 @@
+//!
+//! Executable is the compiled artifact corresponding to the test.
+//! Executables differ by compilation flags.
+//!
+
+pub mod metadata;
+pub mod run;
+
+use metadata::Metadata;
+use run::Run;
+use serde::Deserialize;
+use serde::Serialize;
+
+///
+/// Executable is the compiled artifact corresponding to the test.
+/// Executables differ by compilation flags.
+///
+#[derive(Debug, Clone, Serialize, Deserialize)]
+pub struct Executable {
+ #[serde(default, skip)]
+ /// Metadata associated with the compiled executable.
+ pub metadata: Metadata,
+ #[serde(flatten)]
+ /// Measurements.
+ pub run: Run,
+}
diff --git a/benchmark_analyzer/src/benchmark/group/element.rs b/benchmark_analyzer/src/model/benchmark/test/codegen/versioned/executable/run/mod.rs
similarity index 72%
rename from benchmark_analyzer/src/benchmark/group/element.rs
rename to benchmark_analyzer/src/model/benchmark/test/codegen/versioned/executable/run/mod.rs
index 550cae70..48652f60 100644
--- a/benchmark_analyzer/src/benchmark/group/element.rs
+++ b/benchmark_analyzer/src/model/benchmark/test/codegen/versioned/executable/run/mod.rs
@@ -1,26 +1,26 @@
//!
-//! The benchmark element.
+//! A run of a test with fixed compiler options (mode).
//!
use serde::Deserialize;
use serde::Serialize;
///
-/// The benchmark element.
+/// A run of a test with fixed compiler options (mode).
///
#[derive(Debug, Clone, Serialize, Deserialize)]
-pub struct Element {
+pub struct Run {
/// The contract size, `Some` for contracts deploys.
pub size: Option,
/// The number of cycles.
pub cycles: usize,
- /// The number of ergs.
+ /// The amount of ergs.
pub ergs: u64,
- /// The number of EVM gas.
+ /// The amount of EVM gas.
pub gas: u64,
}
-impl Element {
+impl Run {
///
/// A shortcut constructor.
///
diff --git a/benchmark_analyzer/src/model/benchmark/test/codegen/versioned/mod.rs b/benchmark_analyzer/src/model/benchmark/test/codegen/versioned/mod.rs
new file mode 100644
index 00000000..ce3ced25
--- /dev/null
+++ b/benchmark_analyzer/src/model/benchmark/test/codegen/versioned/mod.rs
@@ -0,0 +1,27 @@
+//!
+//! Groups test runs by the language version associated with them.
+//!
+
+pub mod executable;
+
+use std::collections::BTreeMap;
+
+use executable::Executable;
+use serde::Deserialize;
+use serde::Serialize;
+
+///
+/// Encoded compiler mode. In future, it can be replaced with a structured type
+/// shared between crates `benchmark_analyzer` and `compiler_tester`.
+///
+pub type Mode = String;
+
+///
+/// Groups test runs by the language version associated with them.
+///
+#[derive(Debug, Default, Clone, Serialize, Deserialize)]
+pub struct VersionedGroup {
+ #[serde(flatten)]
+ /// Compiled executables associated with test runs.
+ pub executables: BTreeMap,
+}
diff --git a/benchmark_analyzer/src/model/benchmark/test/input.rs b/benchmark_analyzer/src/model/benchmark/test/input.rs
new file mode 100644
index 00000000..0190968e
--- /dev/null
+++ b/benchmark_analyzer/src/model/benchmark/test/input.rs
@@ -0,0 +1,78 @@
+//!
+//! Identifier for the test input. Describes the input type and position but not the actual contents.
+//!
+
+use serde::Deserialize;
+use serde::Serialize;
+
+///
+/// Identifier for the test input. Describes the input type and position but not the actual contents.
+///
+#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
+pub enum Input {
+ /// The contract deploy, regardless of target.
+ Deployer {
+ /// Contract identifier, usually file name and contract name separated by a colon.
+ contract_identifier: String,
+ },
+ /// The fallback method.
+ Fallback {
+ /// Index in the array of inputs.
+ input_index: usize,
+ },
+ /// The contract call.
+ Runtime {
+ /// Index in the array of inputs.
+ input_index: usize,
+ /// Input name, provided in the test description.
+ name: String,
+ },
+ /// The storage empty check.
+ StorageEmpty {
+ /// Index in the array of inputs.
+ input_index: usize,
+ },
+ /// Check account balance.
+ Balance {
+ /// Index in the array of inputs.
+ input_index: usize,
+ },
+}
+
+impl Input {
+ /// Returns `true` if the input is [`Deployer`].
+ ///
+ /// [`Deployer`]: Input::Deployer
+ #[must_use]
+ pub fn is_deployer(&self) -> bool {
+ matches!(self, Self::Deployer { .. })
+ }
+
+ /// Returns `true` if the input is [`Fallback`].
+ ///
+ /// [`Fallback`]: Input::Fallback
+ #[must_use]
+ pub fn is_fallback(&self) -> bool {
+ matches!(self, Self::Fallback { .. })
+ }
+}
+
+impl std::fmt::Display for Input {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ match self {
+ Input::Deployer {
+ contract_identifier,
+ } => f.write_fmt(format_args!("#deployer:{contract_identifier}")),
+ Input::Runtime { input_index, name } => {
+ f.write_fmt(format_args!("{name}:{input_index}"))
+ }
+ Input::StorageEmpty { input_index } => {
+ f.write_fmt(format_args!("#storage_empty_check:{input_index}"))
+ }
+ Input::Balance { input_index } => {
+ f.write_fmt(format_args!("#balance_check:{input_index}"))
+ }
+ Input::Fallback { input_index } => f.write_fmt(format_args!("#fallback:{input_index}")),
+ }
+ }
+}
diff --git a/benchmark_analyzer/src/model/benchmark/test/metadata.rs b/benchmark_analyzer/src/model/benchmark/test/metadata.rs
new file mode 100644
index 00000000..ebd565c9
--- /dev/null
+++ b/benchmark_analyzer/src/model/benchmark/test/metadata.rs
@@ -0,0 +1,29 @@
+//!
+//! Information associated with a specific test in benchmark.
+//!
+
+use serde::Deserialize;
+use serde::Serialize;
+
+use crate::model::benchmark::test::selector::Selector;
+
+///
+/// Information associated with a specific test in benchmark.
+///
+#[derive(Clone, Debug, Default, Serialize, Deserialize)]
+pub struct Metadata {
+ #[serde(default)]
+ /// Tests may be tagged with one or many groups.
+ pub tags: Vec,
+ /// Test selector.
+ pub selector: Selector,
+}
+
+impl Metadata {
+ ///
+ /// Creates a new instance of test metadata provided with the test selector and tags.
+ ///
+ pub fn new(selector: Selector, tags: Vec) -> Self {
+ Self { selector, tags }
+ }
+}
diff --git a/benchmark_analyzer/src/model/benchmark/test/mod.rs b/benchmark_analyzer/src/model/benchmark/test/mod.rs
new file mode 100644
index 00000000..ebd82fd1
--- /dev/null
+++ b/benchmark_analyzer/src/model/benchmark/test/mod.rs
@@ -0,0 +1,44 @@
+//!
+//! The benchmark group representation.
+//!
+
+pub mod codegen;
+pub mod input;
+pub mod metadata;
+pub mod selector;
+
+use std::collections::BTreeMap;
+
+use codegen::CodegenGroup;
+use metadata::Metadata;
+use serde::Deserialize;
+use serde::Serialize;
+
+///
+/// The codegen associated with a test definition.
+///
+pub type Codegen = String;
+
+///
+/// The benchmark group representation.
+///
+#[derive(Debug, Default, Serialize, Deserialize, Clone)]
+pub struct Test {
+ /// Metadata for this test.
+ #[serde(default)]
+ pub metadata: Metadata,
+ /// Versions.
+ pub codegen_groups: BTreeMap,
+}
+
+impl Test {
+ ///
+ /// Creates a new test with provided metadata.
+ ///
+ pub fn new(metadata: Metadata) -> Self {
+ Self {
+ codegen_groups: Default::default(),
+ metadata,
+ }
+ }
+}
diff --git a/benchmark_analyzer/src/model/benchmark/test/selector.rs b/benchmark_analyzer/src/model/benchmark/test/selector.rs
new file mode 100644
index 00000000..00abf174
--- /dev/null
+++ b/benchmark_analyzer/src/model/benchmark/test/selector.rs
@@ -0,0 +1,39 @@
+//!
+//! Test selector, unambiously locating a test suite, or a specific input.
+//!
+
+use serde::Deserialize;
+use serde::Serialize;
+
+use crate::model::benchmark::test::input::Input;
+
+///
+/// Test selector, unambiously locating a test suite, case, or input.
+///
+#[derive(Debug, Clone, Default, Eq, PartialEq, Serialize, Deserialize)]
+pub struct Selector {
+ /// Path to the file containing test.
+ pub path: String,
+ /// Name of the case, if any. `None` means nameless case.
+ pub case: Option,
+ /// Identifier of the specific input.
+ pub input: Option,
+}
+
+impl std::fmt::Display for Selector {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ let Self {
+ path: filename,
+ case: case_name,
+ input,
+ } = self;
+ f.write_fmt(format_args!("{filename}"))?;
+ if let Some(case_name) = case_name {
+ f.write_fmt(format_args!("::{case_name}"))?;
+ }
+ if let Some(input) = input {
+ f.write_fmt(format_args!("[{input}]"))?;
+ }
+ Ok(())
+ }
+}
diff --git a/benchmark_analyzer/src/model/context/mod.rs b/benchmark_analyzer/src/model/context/mod.rs
new file mode 100644
index 00000000..9bd9ca65
--- /dev/null
+++ b/benchmark_analyzer/src/model/context/mod.rs
@@ -0,0 +1,35 @@
+//!
+//! A context for benchmarking, passed by compiler-tester.
+//!
+
+///
+/// A context for benchmarking, passed by compiler-tester.
+///
+#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
+pub struct Context {
+ /// Unique identifier of the machine.
+ pub machine: String,
+ /// Target, for example "eravm" or "evm".
+ pub target: era_compiler_common::Target,
+ /// Type of `solc`, for example `zksync`
+ pub toolchain: String,
+}
+
+///
+/// Checks that the context is well-formed.
+///
+pub fn validate_context(context: &Context) -> anyhow::Result<()> {
+ let Context {
+ machine,
+ toolchain,
+ target: _,
+ } = context;
+
+ if machine.is_empty() {
+ anyhow::bail!("The `machine` field in the benchmark context is empty")
+ }
+ if toolchain.is_empty() {
+ anyhow::bail!("The `toolchain` field in the benchmark context is empty")
+ }
+ Ok(())
+}
diff --git a/benchmark_analyzer/src/model/evm_interpreter.rs b/benchmark_analyzer/src/model/evm_interpreter.rs
new file mode 100644
index 00000000..91e09836
--- /dev/null
+++ b/benchmark_analyzer/src/model/evm_interpreter.rs
@@ -0,0 +1,148 @@
+//!
+//! Collects the benchmark model's definitions related to EVM Interpreter test suite.
+//!
+
+/// Path to EVM interpreter test.
+pub const TEST_PATH: &str = "tests/solidity/complex/interpreter/test.json";
+
+/// Component of a name of the results group where tests for EVM opcodes reside.
+pub const GROUP_NAME: &str = "EVMInterpreter";
+
+/// The EVM opcodes to test.
+pub const OPCODES: [&str; 135] = [
+ "ADD",
+ "MUL",
+ "SUB",
+ "DIV",
+ "SDIV",
+ "MOD",
+ "SMOD",
+ "ADDMOD",
+ "MULMOD",
+ "EXP",
+ "SIGNEXTEND",
+ "LT",
+ "GT",
+ "SLT",
+ "SGT",
+ "EQ",
+ "ISZERO",
+ "AND",
+ "OR",
+ "XOR",
+ "NOT",
+ "BYTE",
+ "SHL",
+ "SHR",
+ "SAR",
+ "SGT",
+ "SHA3",
+ "ADDRESS",
+ "BALANCE",
+ "ORIGIN",
+ "CALLER",
+ "CALLVALUE",
+ "CALLDATALOAD",
+ "CALLDATASIZE",
+ "CALLDATACOPY",
+ "CODESIZE",
+ "CODECOPY",
+ "GASPRICE",
+ "EXTCODESIZE",
+ "EXTCODECOPY",
+ "RETURNDATASIZE",
+ "RETURNDATACOPY",
+ "EXTCODEHASH",
+ "BLOCKHASH",
+ "COINBASE",
+ "TIMESTAMP",
+ "NUMBER",
+ "PREVRANDAO",
+ "GASLIMIT",
+ "CHAINID",
+ "SELFBALANCE",
+ "BASEFEE",
+ "POP",
+ "MLOAD",
+ "MSTORE",
+ "MSTORE8",
+ "SLOAD",
+ "SSTORE",
+ "JUMP",
+ "JUMPI",
+ "PC",
+ "MSIZE",
+ "GAS",
+ "JUMPDEST",
+ "PUSH0",
+ "PUSH1",
+ "PUSH2",
+ "PUSH4",
+ "PUSH5",
+ "PUSH6",
+ "PUSH7",
+ "PUSH8",
+ "PUSH9",
+ "PUSH10",
+ "PUSH11",
+ "PUSH12",
+ "PUSH13",
+ "PUSH14",
+ "PUSH15",
+ "PUSH16",
+ "PUSH17",
+ "PUSH18",
+ "PUSH19",
+ "PUSH20",
+ "PUSH21",
+ "PUSH22",
+ "PUSH23",
+ "PUSH24",
+ "PUSH25",
+ "PUSH26",
+ "PUSH27",
+ "PUSH28",
+ "PUSH29",
+ "PUSH30",
+ "PUSH31",
+ "PUSH32",
+ "DUP1",
+ "DUP2",
+ "DUP3",
+ "DUP4",
+ "DUP5",
+ "DUP6",
+ "DUP7",
+ "DUP8",
+ "DUP9",
+ "DUP10",
+ "DUP11",
+ "DUP12",
+ "DUP13",
+ "DUP14",
+ "DUP15",
+ "DUP16",
+ "SWAP1",
+ "SWAP2",
+ "SWAP3",
+ "SWAP4",
+ "SWAP5",
+ "SWAP6",
+ "SWAP7",
+ "SWAP8",
+ "SWAP9",
+ "SWAP10",
+ "SWAP11",
+ "SWAP12",
+ "SWAP13",
+ "SWAP14",
+ "SWAP15",
+ "SWAP16",
+ "CALL",
+ "STATICCALL",
+ "DELEGATECALL",
+ "CREATE",
+ "CREATE2",
+ "RETURN",
+ "REVERT",
+];
diff --git a/benchmark_analyzer/src/model/mod.rs b/benchmark_analyzer/src/model/mod.rs
new file mode 100644
index 00000000..1c6ad9a0
--- /dev/null
+++ b/benchmark_analyzer/src/model/mod.rs
@@ -0,0 +1,7 @@
+//!
+//! Defines a model of benchmark data.
+//!
+
+pub mod benchmark;
+pub mod context;
+pub mod evm_interpreter;
diff --git a/benchmark_analyzer/src/output/comparison_result.rs b/benchmark_analyzer/src/output/comparison_result.rs
new file mode 100644
index 00000000..7f25f048
--- /dev/null
+++ b/benchmark_analyzer/src/output/comparison_result.rs
@@ -0,0 +1,16 @@
+//!
+//! Result of comparing two benchmarks.
+//!
+
+use super::file::File;
+
+///
+/// Result of comparing two benchmarks.
+///
+pub enum Output {
+ /// Benchmark output is a single unnamed file.
+ SingleFile(String),
+ /// Benchmark output is structured as a file tree, relative to some
+ /// user-provided output directory.
+ MultipleFiles(Vec),
+}
diff --git a/benchmark_analyzer/src/output/file.rs b/benchmark_analyzer/src/output/file.rs
new file mode 100644
index 00000000..8813c0aa
--- /dev/null
+++ b/benchmark_analyzer/src/output/file.rs
@@ -0,0 +1,15 @@
+//!
+//! Represents a single benchmark output file in a set of many.
+//!
+
+use std::path::PathBuf;
+
+///
+/// Represents a single benchmark output file in a set of many.
+///
+pub struct File {
+ /// Path to this file relative to user-provided root.
+ pub path: PathBuf,
+ /// File contents.
+ pub contents: String,
+}
diff --git a/benchmark_analyzer/src/output/format/csv.rs b/benchmark_analyzer/src/output/format/csv.rs
new file mode 100644
index 00000000..52c3fa12
--- /dev/null
+++ b/benchmark_analyzer/src/output/format/csv.rs
@@ -0,0 +1,88 @@
+//!
+//! Serializing benchmark data to CSV.
+//!
+
+use std::fmt::Write as _;
+
+use crate::model::benchmark::test::metadata::Metadata as TestMetadata;
+use crate::model::benchmark::test::selector::Selector;
+use crate::model::benchmark::test::Test;
+use crate::model::benchmark::Benchmark;
+use crate::output::IBenchmarkSerializer;
+use crate::output::Output;
+
+///
+/// Serialize the benchmark to CSV in the following format:
+/// "group", "codegen", "version", "optimizations", "path", "case", "input", "size", "cycles", "ergs", "gas""
+///
+#[derive(Default)]
+pub struct Csv;
+
+impl IBenchmarkSerializer for Csv {
+ type Err = std::fmt::Error;
+
+ fn serialize_to_string(&self, benchmark: &Benchmark) -> Result