From 076a46c063883b8b6fdc6752512ef1fdfb547333 Mon Sep 17 00:00:00 2001 From: Oleksandr Zarudnyi Date: Fri, 15 Mar 2024 08:38:45 +0100 Subject: [PATCH] Mirror the private repo (#5) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # What ❔ Synchronized this repo with the private mirror. ## Why ❔ The compiler-tester will soon be fully open-source. ## Checklist - [x] PR title corresponds to the body of PR (we generate changelog entries from PRs). - [x] Tests for the changes have been added / updated. - [x] Documentation comments have been added / updated. - [x] Code has been formatted via `cargo fmt` and checked with `cargo clippy`. --------- Co-authored-by: Anton Baliasnikov --- .github/actions/build-llvm/action.yml | 79 ++ .github/workflows/benchmarks.yml | 123 ++ .github/workflows/tests.yaml | 48 + .gitignore | 19 +- .gitmodules | 8 +- Cargo.lock | 1061 +++++++++-------- LLVM.lock | 2 +- README.md | 53 +- benchmark_analyzer/Cargo.toml | 6 +- compiler_tester/Cargo.toml | 36 +- .../src/compiler_tester/arguments.rs | 10 +- compiler_tester/src/compiler_tester/main.rs | 119 +- .../src/compilers/downloader/config/mod.rs | 35 +- .../src/compilers/downloader/mod.rs | 21 +- compiler_tester/src/compilers/eravm.rs | 48 +- compiler_tester/src/compilers/llvm.rs | 147 ++- compiler_tester/src/compilers/mod.rs | 39 +- compiler_tester/src/compilers/mode/llvm.rs | 4 +- compiler_tester/src/compilers/mode/mod.rs | 2 +- .../src/compilers/mode/solidity.rs | 21 +- compiler_tester/src/compilers/mode/vyper.rs | 4 +- compiler_tester/src/compilers/mode/yul.rs | 4 +- compiler_tester/src/compilers/solidity/mod.rs | 282 +++-- .../src/compilers/solidity/solc_cache_key.rs | 4 +- compiler_tester/src/compilers/vyper/mod.rs | 107 +- compiler_tester/src/compilers/yul.rs | 94 +- .../src/deployers/address_predictor.rs | 73 -- .../src/directories/ethereum/test.rs | 237 +++- .../matter_labs/test/metadata/case/mod.rs | 30 +- .../src/directories/matter_labs/test/mod.rs | 213 +++- compiler_tester/src/directories/mod.rs | 23 +- compiler_tester/src/filters.rs | 4 +- compiler_tester/src/lib.rs | 212 ++-- compiler_tester/src/summary/element/mod.rs | 6 +- .../summary/element/outcome/passed_variant.rs | 8 +- compiler_tester/src/summary/mod.rs | 26 +- .../src/test/case/input/balance.rs | 31 +- .../src/test/case/input/calldata.rs | 2 +- compiler_tester/src/test/case/input/deploy.rs | 55 +- compiler_tester/src/test/case/input/mod.rs | 47 +- .../src/test/case/input/output/event.rs | 42 +- .../src/test/case/input/output/mod.rs | 53 +- .../src/test/case/input/runtime.rs | 53 +- .../src/test/case/input/storage.rs | 7 +- .../src/test/case/input/storage_empty.rs | 31 +- compiler_tester/src/test/case/mod.rs | 52 +- compiler_tester/src/test/eravm.rs | 69 ++ compiler_tester/src/test/evm.rs | 74 ++ compiler_tester/src/test/mod.rs | 69 +- compiler_tester/src/utils.rs | 21 +- .../vm/eravm/deployers/address_predictor.rs | 73 ++ .../src/{ => vm/eravm}/deployers/mod.rs | 4 +- .../eravm}/deployers/native_deployer.rs | 41 +- .../deployers/system_contract_deployer.rs | 79 +- .../output => vm/eravm/input}/build.rs | 4 +- .../output => vm/eravm/input}/mod.rs | 8 +- compiler_tester/src/{ => vm}/eravm/mod.rs | 223 ++-- .../src/{ => vm}/eravm/system_context.rs | 6 +- .../src/{ => vm}/eravm/system_contracts.rs | 98 +- compiler_tester/src/vm/eravm/vm2_adapter.rs | 121 ++ .../src/vm/evm/address_predictor.rs | 53 + compiler_tester/src/vm/evm/input/build.rs | 29 + compiler_tester/src/vm/evm/input/mod.rs | 40 + compiler_tester/src/vm/evm/invoker.rs | 21 + compiler_tester/src/vm/evm/mod.rs | 217 ++++ compiler_tester/src/vm/evm/output.rs | 28 + compiler_tester/src/vm/evm/runtime.rs | 245 ++++ .../src/{eravm => vm}/execution_result.rs | 25 +- compiler_tester/src/vm/mod.rs | 21 + configs/solc-bin-default.json | 474 ++++---- configs/solc-bin-system-contracts.json | 10 +- configs/solc-bin-zkevm-candidate-0.4.12.json | 10 +- configs/solc-bin-zkevm-candidate-0.4.13.json | 10 +- configs/solc-bin-zkevm-candidate-0.4.14.json | 10 +- configs/solc-bin-zkevm-candidate-0.4.15.json | 10 +- configs/solc-bin-zkevm-candidate-0.4.16.json | 10 +- configs/solc-bin-zkevm-candidate-0.4.17.json | 10 +- configs/solc-bin-zkevm-candidate-0.4.18.json | 10 +- configs/solc-bin-zkevm-candidate-0.4.19.json | 10 +- configs/solc-bin-zkevm-candidate-0.4.20.json | 10 +- configs/solc-bin-zkevm-candidate-0.4.21.json | 10 +- configs/solc-bin-zkevm-candidate-0.4.22.json | 10 +- configs/solc-bin-zkevm-candidate-0.4.23.json | 10 +- configs/solc-bin-zkevm-candidate-0.4.24.json | 10 +- configs/solc-bin-zkevm-candidate-0.4.25.json | 10 +- configs/solc-bin-zkevm-candidate-0.4.26.json | 10 +- configs/solc-bin-zkevm-candidate-0.5.0.json | 10 +- configs/solc-bin-zkevm-candidate-0.5.1.json | 10 +- configs/solc-bin-zkevm-candidate-0.5.10.json | 10 +- configs/solc-bin-zkevm-candidate-0.5.11.json | 10 +- configs/solc-bin-zkevm-candidate-0.5.12.json | 10 +- configs/solc-bin-zkevm-candidate-0.5.13.json | 10 +- configs/solc-bin-zkevm-candidate-0.5.14.json | 10 +- configs/solc-bin-zkevm-candidate-0.5.15.json | 10 +- configs/solc-bin-zkevm-candidate-0.5.16.json | 10 +- configs/solc-bin-zkevm-candidate-0.5.17.json | 10 +- configs/solc-bin-zkevm-candidate-0.5.2.json | 10 +- configs/solc-bin-zkevm-candidate-0.5.3.json | 10 +- configs/solc-bin-zkevm-candidate-0.5.4.json | 10 +- configs/solc-bin-zkevm-candidate-0.5.5.json | 10 +- configs/solc-bin-zkevm-candidate-0.5.6.json | 10 +- configs/solc-bin-zkevm-candidate-0.5.7.json | 10 +- configs/solc-bin-zkevm-candidate-0.5.8.json | 10 +- configs/solc-bin-zkevm-candidate-0.5.9.json | 10 +- configs/solc-bin-zkevm-candidate-0.6.0.json | 10 +- configs/solc-bin-zkevm-candidate-0.6.1.json | 10 +- configs/solc-bin-zkevm-candidate-0.6.10.json | 10 +- configs/solc-bin-zkevm-candidate-0.6.11.json | 10 +- configs/solc-bin-zkevm-candidate-0.6.12.json | 10 +- configs/solc-bin-zkevm-candidate-0.6.2.json | 10 +- configs/solc-bin-zkevm-candidate-0.6.3.json | 10 +- configs/solc-bin-zkevm-candidate-0.6.4.json | 10 +- configs/solc-bin-zkevm-candidate-0.6.5.json | 10 +- configs/solc-bin-zkevm-candidate-0.6.6.json | 10 +- configs/solc-bin-zkevm-candidate-0.6.7.json | 10 +- configs/solc-bin-zkevm-candidate-0.6.8.json | 10 +- configs/solc-bin-zkevm-candidate-0.6.9.json | 10 +- configs/solc-bin-zkevm-candidate-0.7.0.json | 10 +- configs/solc-bin-zkevm-candidate-0.7.1.json | 10 +- configs/solc-bin-zkevm-candidate-0.7.2.json | 10 +- configs/solc-bin-zkevm-candidate-0.7.3.json | 10 +- configs/solc-bin-zkevm-candidate-0.7.4.json | 10 +- configs/solc-bin-zkevm-candidate-0.7.5.json | 10 +- configs/solc-bin-zkevm-candidate-0.7.6.json | 10 +- configs/solc-bin-zkevm-candidate-0.8.0.json | 10 +- configs/solc-bin-zkevm-candidate-0.8.1.json | 10 +- configs/solc-bin-zkevm-candidate-0.8.10.json | 10 +- configs/solc-bin-zkevm-candidate-0.8.11.json | 10 +- configs/solc-bin-zkevm-candidate-0.8.12.json | 10 +- configs/solc-bin-zkevm-candidate-0.8.13.json | 10 +- configs/solc-bin-zkevm-candidate-0.8.14.json | 10 +- configs/solc-bin-zkevm-candidate-0.8.15.json | 10 +- configs/solc-bin-zkevm-candidate-0.8.16.json | 10 +- configs/solc-bin-zkevm-candidate-0.8.17.json | 10 +- configs/solc-bin-zkevm-candidate-0.8.18.json | 10 +- configs/solc-bin-zkevm-candidate-0.8.19.json | 10 +- configs/solc-bin-zkevm-candidate-0.8.2.json | 10 +- configs/solc-bin-zkevm-candidate-0.8.20.json | 10 +- configs/solc-bin-zkevm-candidate-0.8.21.json | 10 +- configs/solc-bin-zkevm-candidate-0.8.22.json | 10 +- configs/solc-bin-zkevm-candidate-0.8.23.json | 10 +- configs/solc-bin-zkevm-candidate-0.8.24.json | 16 + configs/solc-bin-zkevm-candidate-0.8.3.json | 10 +- configs/solc-bin-zkevm-candidate-0.8.4.json | 10 +- configs/solc-bin-zkevm-candidate-0.8.5.json | 10 +- configs/solc-bin-zkevm-candidate-0.8.6.json | 10 +- configs/solc-bin-zkevm-candidate-0.8.7.json | 10 +- configs/solc-bin-zkevm-candidate-0.8.8.json | 10 +- configs/solc-bin-zkevm-candidate-0.8.9.json | 10 +- configs/solc-bin-zkevm-reference-0.4.12.json | 12 +- configs/solc-bin-zkevm-reference-0.4.13.json | 12 +- configs/solc-bin-zkevm-reference-0.4.14.json | 12 +- configs/solc-bin-zkevm-reference-0.4.15.json | 12 +- configs/solc-bin-zkevm-reference-0.4.16.json | 12 +- configs/solc-bin-zkevm-reference-0.4.17.json | 12 +- configs/solc-bin-zkevm-reference-0.4.18.json | 12 +- configs/solc-bin-zkevm-reference-0.4.19.json | 12 +- configs/solc-bin-zkevm-reference-0.4.20.json | 12 +- configs/solc-bin-zkevm-reference-0.4.21.json | 12 +- configs/solc-bin-zkevm-reference-0.4.22.json | 12 +- configs/solc-bin-zkevm-reference-0.4.23.json | 12 +- configs/solc-bin-zkevm-reference-0.4.24.json | 12 +- configs/solc-bin-zkevm-reference-0.4.25.json | 12 +- configs/solc-bin-zkevm-reference-0.4.26.json | 12 +- configs/solc-bin-zkevm-reference-0.5.0.json | 12 +- configs/solc-bin-zkevm-reference-0.5.1.json | 12 +- configs/solc-bin-zkevm-reference-0.5.10.json | 12 +- configs/solc-bin-zkevm-reference-0.5.11.json | 12 +- configs/solc-bin-zkevm-reference-0.5.12.json | 12 +- configs/solc-bin-zkevm-reference-0.5.13.json | 12 +- configs/solc-bin-zkevm-reference-0.5.14.json | 12 +- configs/solc-bin-zkevm-reference-0.5.15.json | 12 +- configs/solc-bin-zkevm-reference-0.5.16.json | 12 +- configs/solc-bin-zkevm-reference-0.5.17.json | 12 +- configs/solc-bin-zkevm-reference-0.5.2.json | 12 +- configs/solc-bin-zkevm-reference-0.5.3.json | 12 +- configs/solc-bin-zkevm-reference-0.5.4.json | 12 +- configs/solc-bin-zkevm-reference-0.5.5.json | 12 +- configs/solc-bin-zkevm-reference-0.5.6.json | 12 +- configs/solc-bin-zkevm-reference-0.5.7.json | 12 +- configs/solc-bin-zkevm-reference-0.5.8.json | 12 +- configs/solc-bin-zkevm-reference-0.5.9.json | 12 +- configs/solc-bin-zkevm-reference-0.6.0.json | 12 +- configs/solc-bin-zkevm-reference-0.6.1.json | 12 +- configs/solc-bin-zkevm-reference-0.6.10.json | 12 +- configs/solc-bin-zkevm-reference-0.6.11.json | 12 +- configs/solc-bin-zkevm-reference-0.6.12.json | 12 +- configs/solc-bin-zkevm-reference-0.6.2.json | 12 +- configs/solc-bin-zkevm-reference-0.6.3.json | 12 +- configs/solc-bin-zkevm-reference-0.6.4.json | 12 +- configs/solc-bin-zkevm-reference-0.6.5.json | 12 +- configs/solc-bin-zkevm-reference-0.6.6.json | 12 +- configs/solc-bin-zkevm-reference-0.6.7.json | 12 +- configs/solc-bin-zkevm-reference-0.6.8.json | 12 +- configs/solc-bin-zkevm-reference-0.6.9.json | 12 +- configs/solc-bin-zkevm-reference-0.7.0.json | 12 +- configs/solc-bin-zkevm-reference-0.7.1.json | 12 +- configs/solc-bin-zkevm-reference-0.7.2.json | 12 +- configs/solc-bin-zkevm-reference-0.7.3.json | 12 +- configs/solc-bin-zkevm-reference-0.7.4.json | 12 +- configs/solc-bin-zkevm-reference-0.7.5.json | 12 +- configs/solc-bin-zkevm-reference-0.7.6.json | 12 +- configs/solc-bin-zkevm-reference-0.8.0.json | 12 +- configs/solc-bin-zkevm-reference-0.8.1.json | 12 +- configs/solc-bin-zkevm-reference-0.8.10.json | 12 +- configs/solc-bin-zkevm-reference-0.8.11.json | 12 +- configs/solc-bin-zkevm-reference-0.8.12.json | 12 +- configs/solc-bin-zkevm-reference-0.8.13.json | 12 +- configs/solc-bin-zkevm-reference-0.8.14.json | 12 +- configs/solc-bin-zkevm-reference-0.8.15.json | 12 +- configs/solc-bin-zkevm-reference-0.8.16.json | 12 +- configs/solc-bin-zkevm-reference-0.8.17.json | 12 +- configs/solc-bin-zkevm-reference-0.8.18.json | 12 +- configs/solc-bin-zkevm-reference-0.8.19.json | 12 +- configs/solc-bin-zkevm-reference-0.8.2.json | 12 +- configs/solc-bin-zkevm-reference-0.8.20.json | 12 +- configs/solc-bin-zkevm-reference-0.8.21.json | 12 +- configs/solc-bin-zkevm-reference-0.8.22.json | 12 +- configs/solc-bin-zkevm-reference-0.8.23.json | 12 +- configs/solc-bin-zkevm-reference-0.8.24.json | 16 + configs/solc-bin-zkevm-reference-0.8.3.json | 12 +- configs/solc-bin-zkevm-reference-0.8.4.json | 12 +- configs/solc-bin-zkevm-reference-0.8.5.json | 12 +- configs/solc-bin-zkevm-reference-0.8.6.json | 12 +- configs/solc-bin-zkevm-reference-0.8.7.json | 12 +- configs/solc-bin-zkevm-reference-0.8.8.json | 12 +- configs/solc-bin-zkevm-reference-0.8.9.json | 12 +- configs/vyper-bin-default.json | 5 +- coverage_watcher/Cargo.toml | 4 +- coverage_watcher/src/coverage_watcher/main.rs | 14 +- era-contracts | 1 + solidity | 2 +- solidity_adapter/Cargo.toml | 4 +- solidity_adapter/src/lib.rs | 5 +- .../src/test/function_call/mod.rs | 20 +- .../test/function_call/parser/lexical/mod.rs | 1 - .../parser/lexical/stream/word/tests.rs | 2 +- .../parser/lexical/token/lexeme/keyword.rs | 12 +- .../src/test/function_call/parser/mod.rs | 15 - .../test/function_call/parser/syntax/mod.rs | 10 - .../parser/syntax/parser/event.rs | 3 - .../parser/syntax/parser/type/tuple.rs | 2 +- .../parser/syntax/tree/literal/boolean.rs | 2 +- .../parser/syntax/tree/literal/hex.rs | 2 +- .../parser/syntax/tree/literal/integer.rs | 9 +- .../parser/syntax/tree/literal/string.rs | 6 +- solidity_adapter/src/test/mod.rs | 9 +- .../src/test/params/evm_version.rs | 3 + system-contracts | 1 - system-contracts-stable-build | Bin 346741 -> 406907 bytes tests | 2 +- 251 files changed, 4994 insertions(+), 2500 deletions(-) create mode 100644 .github/actions/build-llvm/action.yml create mode 100644 .github/workflows/benchmarks.yml create mode 100644 .github/workflows/tests.yaml delete mode 100644 compiler_tester/src/deployers/address_predictor.rs create mode 100644 compiler_tester/src/test/eravm.rs create mode 100644 compiler_tester/src/test/evm.rs create mode 100644 compiler_tester/src/vm/eravm/deployers/address_predictor.rs rename compiler_tester/src/{ => vm/eravm}/deployers/mod.rs (88%) rename compiler_tester/src/{ => vm/eravm}/deployers/native_deployer.rs (80%) rename compiler_tester/src/{ => vm/eravm}/deployers/system_contract_deployer.rs (55%) rename compiler_tester/src/{compilers/output => vm/eravm/input}/build.rs (94%) rename compiler_tester/src/{compilers/output => vm/eravm/input}/mod.rs (88%) rename compiler_tester/src/{ => vm}/eravm/mod.rs (63%) rename compiler_tester/src/{ => vm}/eravm/system_context.rs (97%) rename compiler_tester/src/{ => vm}/eravm/system_contracts.rs (75%) create mode 100644 compiler_tester/src/vm/eravm/vm2_adapter.rs create mode 100644 compiler_tester/src/vm/evm/address_predictor.rs create mode 100644 compiler_tester/src/vm/evm/input/build.rs create mode 100644 compiler_tester/src/vm/evm/input/mod.rs create mode 100644 compiler_tester/src/vm/evm/invoker.rs create mode 100644 compiler_tester/src/vm/evm/mod.rs create mode 100644 compiler_tester/src/vm/evm/output.rs create mode 100644 compiler_tester/src/vm/evm/runtime.rs rename compiler_tester/src/{eravm => vm}/execution_result.rs (58%) create mode 100644 compiler_tester/src/vm/mod.rs create mode 100644 configs/solc-bin-zkevm-candidate-0.8.24.json create mode 100644 configs/solc-bin-zkevm-reference-0.8.24.json create mode 160000 era-contracts delete mode 160000 system-contracts diff --git a/.github/actions/build-llvm/action.yml b/.github/actions/build-llvm/action.yml new file mode 100644 index 00000000..70b452f8 --- /dev/null +++ b/.github/actions/build-llvm/action.yml @@ -0,0 +1,79 @@ +name: 'Build LLVM' +description: 'Builds backend LLVM framework' +inputs: + target: + description: 'Specific build target triplet.' + required: false + default: '' +runs: + using: "composite" + steps: + - name: Prepare environment + if: runner.os == 'macOS' + run: brew install cmake ninja + shell: ${{ runner.os == 'Windows' && 'msys2 {0}' || 'bash' }} + + - name: Define build target + id: build-target + if: inputs.target != '' + shell: ${{ runner.os == 'Windows' && 'msys2 {0}' || 'bash' }} + run: | + rustup target add ${{ inputs.target }} + echo "target=--target ${{ inputs.target }}" >> $GITHUB_OUTPUT + + - name: Clone LLVM framework + shell: ${{ runner.os == 'Windows' && 'msys2 {0}' || 'bash' }} + run: | + cargo install compiler-llvm-builder ${{ steps.build-target.outputs.target }} + zkevm-llvm clone + + - name: Define ccache key + shell: ${{ runner.os == 'Windows' && 'msys2 {0}' || 'bash' }} + id: ccache-key + run: | + LLVM_BRANCH="$(git -C ./llvm rev-parse --abbrev-ref HEAD)" + LLVM_SHORT_SHA="$(git -C ./llvm rev-parse --short HEAD)" + echo "key=llvm-${LLVM_BRANCH}-${LLVM_SHORT_SHA}-${{ runner.os }}-${{ runner.arch }}" | tee -a "${GITHUB_OUTPUT}" + + - name: Prepare ccache installation + if: runner.os == 'Linux' + shell: ${{ runner.os == 'Windows' && 'msys2 {0}' || 'bash' }} + run: apt update + + - name: Set up compiler cache + uses: hendrikmuhs/ccache-action@v1.2 + env: + CCACHE_BASEDIR: ${{ github.workspace }} + CCACHE_NOHASHDIR: "true" + CCACHE_COMPILERCHECK: "content" + with: + key: ${{ steps.ccache-key.outputs.key }} + restore-keys: ${{ steps.ccache-key.outputs.key }} + append-timestamp: false + max-size: "2G" + verbose: 2 + save: ${{ github.event_name == 'push' && !startsWith(github.ref, 'refs/tags/v') }} + + - name: Build LLVM Linux + if: ${{ runner.os == 'Linux' }} + uses: nick-fields/retry@v2 + env: + CCACHE_BASEDIR: ${{ github.workspace }} + CCACHE_NOHASHDIR: "true" + CCACHE_COMPILERCHECK: "content" + LIBSTDCPP_SOURCE_PATH: "C:/a/_temp/msys64/mingw64/lib/libstdc++.a" + with: + timeout_minutes: 60 + max_attempts: 16 # protection mechanism for sporadic dependencies download failure + command: zkevm-llvm build --targets 'EVM' --use-ccache + + - name: Build LLVM MacOS and Windows + if: ${{ runner.os != 'Linux' }} + shell: ${{ runner.os == 'Windows' && 'msys2 {0}' || 'bash' }} + env: + CCACHE_BASEDIR: ${{ github.workspace }} + CCACHE_NOHASHDIR: "true" + CCACHE_COMPILERCHECK: "content" + LIBSTDCPP_SOURCE_PATH: "C:/a/_temp/msys64/mingw64/lib/libstdc++.a" + run: | + zkevm-llvm build --targets 'EVM' --use-ccache diff --git a/.github/workflows/benchmarks.yml b/.github/workflows/benchmarks.yml new file mode 100644 index 00000000..8f7f6100 --- /dev/null +++ b/.github/workflows/benchmarks.yml @@ -0,0 +1,123 @@ +name: Benchmarks + +on: + pull_request: + workflow_dispatch: + inputs: + llvm_build_type: + description: "LLVM build type: debug | release" + required: true + default: "release" + compiler_tester_reference_branch: + description: "compiler-tester branch to use as a benchmark reference" + required: true + default: "main" + compiler_tester_candidate_branch: + description: "compiler-tester branch to use as a benchmark candidate" + required: true + default: "main" + compiler_llvm_benchmark_mode: + description: "Mode filter for compiler-llvm benchmarks" + required: false + default: "^M^B3" + compiler_llvm_benchmark_path: + description: "Path filter for compiler-llvm benchmarks" + required: false + default: "" + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + benchmarks: + strategy: + matrix: + type: ["reference", "candidate"] + name: ${{ matrix.type }} + runs-on: matterlabs-ci-runner + container: + image: matterlabs/llvm_runner:ubuntu22-llvm15-latest + options: -m 110g + env: + LLVM_BENCHMARK_MODE: ${{ github.event.inputs.compiler_llvm_benchmark_mode || '^M^B3' }} + LLVM_BENCHMARK_PATH: ${{ github.event.inputs.compiler_llvm_benchmark_path || '' }} + steps: + - name: Define branches + run: | + if [ "${{ matrix.type }}" = "candidate" ]; then + echo "COMPILER_TESTER_BRANCH_NAME=${{ github.event.inputs.compiler_tester_candidate_branch || 'main' }}" >> $GITHUB_ENV + else + echo "COMPILER_TESTER_BRANCH_NAME=${{ github.event.inputs.compiler_tester_reference_branch || 'main' }}" >> $GITHUB_ENV + fi + + - name: Checkout compiler-tester + uses: actions/checkout@v4 + with: + repository: matter-labs/era-compiler-tester + ref: ${{ env.COMPILER_TESTER_BRANCH_NAME }} + submodules: recursive + + - name: Build LLVM + uses: ./.github/actions/build-llvm + with: + debug: ${{ github.event.inputs.llvm_build_type || 'release' }} + + - name: Benchmark + env: + RUST_BACKTRACE: full + run: | + export LLVM_SYS_150_PREFIX="$(pwd)/target-llvm/target-final/" + cargo build --verbose --release --bin 'compiler-tester' + cargo build --verbose --release --manifest-path /usr/local/cargo/git/checkouts/era-compiler-solidity-*/*/Cargo.toml --target-dir './target-zksolc/' + cargo build --verbose --release --manifest-path /usr/local/cargo/git/checkouts/era-compiler-vyper-*/*/Cargo.toml --target-dir './target-zkvyper/' + ./target/release/compiler-tester \ + --zksolc './target-zksolc/release/zksolc' \ + --zkvyper './target-zkvyper/release/zkvyper' \ + --path=${{ env.LLVM_BENCHMARK_PATH }} \ + --mode=${{ env.LLVM_BENCHMARK_MODE }} \ + --benchmark=${{ matrix.type }}.json + + - uses: actions/upload-artifact@v4 + with: + name: compiler-llvm-${{ matrix.type }}-benchmark + path: ${{ matrix.type }}.json + + analysis: + name: "Benchmark comparison" + runs-on: matterlabs-ci-runner + container: + image: matterlabs/llvm_runner:ubuntu22-llvm15-latest + needs: benchmarks + steps: + - name: Checking out the compiler-tester repository + uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.compiler_tester_candidate_branch || 'main' }} + submodules: recursive + + - uses: actions/download-artifact@v4 + with: + pattern: compiler-llvm-* + merge-multiple: true + + - name: Comparing the LLVM framework benchmark results + run: | + cargo run --release --bin benchmark-analyzer -- \ + --reference reference.json --candidate candidate.json --output-file result.txt + + - name: Posting the LLVM benchmark results to the summary + run: | + printf "Benchmark results:\n" >> $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY + cat result.txt >> $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY + cat $GITHUB_STEP_SUMMARY > result.txt + + - name: Posting the LLVM benchmark results to a PR comment + if: github.event_name == 'pull_request' + uses: mshick/add-pr-comment@v2 + env: + GITHUB_TOKEN: ${{ secrets.ZKSYNC_ADMIN_BOT_ORG_REPO_WRITE }} + with: + message-path: result.txt diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml new file mode 100644 index 00000000..68debc1f --- /dev/null +++ b/.github/workflows/tests.yaml @@ -0,0 +1,48 @@ +name: Tests + +on: + pull_request: + push: + branches: + - main + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + testing: + runs-on: [self-hosted, ci-runner-compiler] + timeout-minutes: 720 + container: + image: matterlabs/llvm_runner:ubuntu22-llvm15-latest + options: -m 110g + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Build LLVM + uses: ./.github/actions/build-llvm + + - name: Run tests + run: | + export RUST_BACKTRACE='full' + export LLVM_SYS_150_PREFIX="$(pwd)/target-llvm/target-final/" + cargo build --verbose --release --bin 'compiler-tester' + cargo build --verbose --release --manifest-path /usr/local/cargo/git/checkouts/era-compiler-solidity-*/*/Cargo.toml --target-dir './target-zksolc/' + cargo build --verbose --release --manifest-path /usr/local/cargo/git/checkouts/era-compiler-vyper-*/*/Cargo.toml --target-dir './target-zkvyper/' + + ./target/release/compiler-tester \ + --zksolc './target-zksolc/release/zksolc' \ + --zkvyper './target-zkvyper/release/zkvyper' + + - name: Send Slack notification + uses: 8398a7/action-slack@v3 + if: ${{ failure() || success() }} # Skip canceled jobs + with: + status: ${{ job.status }} + fields: repo,commit,author,action,eventName,ref,workflow,job,took,pullRequest + env: + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} diff --git a/.gitignore b/.gitignore index 22f443a9..04abd624 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,18 @@ -# Generated by Cargo -# will have compiled files and executables -/target/ +# Compiled files and executables +/target*/ # These are backup files generated by rustfmt **/*.rs.bk -# The LLVM framework source and build +# MacOS +/**/.DS_Store + +# IDE +/.idea/ +/.vscode/ + +# The LLVM framework source /llvm/ -/target-llvm*/ # External compilers /solc-bin/* @@ -20,7 +25,3 @@ # The dependency locks # /Cargo.lock # /LLVM.lock - -# IDE -/.idea/ -/.vscode/ diff --git a/.gitmodules b/.gitmodules index aade9503..b777b4bc 100644 --- a/.gitmodules +++ b/.gitmodules @@ -6,7 +6,7 @@ path = solidity url = https://github.com/ethereum/solidity branch = develop -[submodule "system-contracts"] - path = system-contracts - url = https://github.com/matter-labs/era-system-contracts - branch = main +[submodule "era-contracts"] + path = era-contracts + url = https://github.com/matter-labs/era-contracts + branch = release-v20-1.4.1-short-term-fee-model diff --git a/Cargo.lock b/Cargo.lock index 16d09e8f..a167fa83 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -28,9 +28,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.75" +version = "1.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" [[package]] name = "arrayvec" @@ -44,11 +44,22 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi 0.1.19", + "hermit-abi", "libc", "winapi", ] +[[package]] +name = "auto_impl" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.52", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -72,15 +83,15 @@ dependencies = [ [[package]] name = "base16ct" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64" -version = "0.21.5" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64ct" @@ -90,7 +101,7 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "benchmark-analyzer" -version = "1.3.2" +version = "1.4.1" dependencies = [ "anyhow", "colored", @@ -117,9 +128,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" dependencies = [ "serde", ] @@ -139,7 +150,8 @@ dependencies = [ [[package]] name = "blake2" version = "0.10.6" -source = "git+https://github.com/RustCrypto/hashes.git?rev=1f727ce37ff40fa0cce84eb8543a45bdd3ca4a4e#1f727ce37ff40fa0cce84eb8543a45bdd3ca4a4e" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" dependencies = [ "digest", ] @@ -155,9 +167,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" [[package]] name = "byte-slice-cast" @@ -179,12 +191,9 @@ checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cc" -version = "1.0.84" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f8e7c90afad890484a21653d08b6e209ae34770fb5ee298f9c699fcc1e5c856" -dependencies = [ - "libc", -] +checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" [[package]] name = "cfg-if" @@ -205,88 +214,27 @@ dependencies = [ [[package]] name = "colored" -version = "2.0.4" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2674ec482fbc38012cf31e6c42ba0177b431a0cb6f15fe40efa5aab1bda516f6" +checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" dependencies = [ - "is-terminal", "lazy_static", - "windows-sys", -] - -[[package]] -name = "compiler-common" -version = "1.3.3" -source = "git+https://github.com/matter-labs/era-compiler-common?branch=main#8635dbadff6727ed76b7aebea7a10ffe7690698c" -dependencies = [ - "anyhow", - "serde", - "serde_json", - "serde_stacker", -] - -[[package]] -name = "compiler-llvm-context" -version = "1.3.3" -source = "git+https://github.com/matter-labs/era-compiler-llvm-context?branch=main#a5dd76f6d6d5a1df0e68da481926adfd56b65a78" -dependencies = [ - "anyhow", - "compiler-common", - "hex", - "inkwell", - "itertools", - "md5", - "num", - "once_cell", - "regex", - "semver", - "serde", - "sha2 0.10.8", - "sha3 0.10.8", - "zkevm-assembly", - "zkevm_opcode_defs", -] - -[[package]] -name = "compiler-solidity" -version = "1.3.17" -source = "git+https://github.com/matter-labs/era-compiler-solidity?branch=main#1650bde7f23592a75062385f52edf17da2522150" -dependencies = [ - "anyhow", - "colored", - "compiler-common", - "compiler-llvm-context", - "hex", - "inkwell", - "md5", - "mimalloc", - "num", - "once_cell", - "rand 0.8.5", - "rayon", - "regex", - "semver", - "serde", - "serde_json", - "sha3 0.10.8", - "structopt", - "thiserror", - "which", - "zkevm-assembly", + "windows-sys 0.48.0", ] [[package]] name = "compiler-tester" -version = "1.3.3" +version = "1.4.1" dependencies = [ "anyhow", "benchmark-analyzer", "bincode", "colored", - "compiler-common", - "compiler-llvm-context", - "compiler-solidity", - "compiler-vyper", + "era-compiler-common", + "era-compiler-llvm-context", + "era-compiler-solidity", + "era-compiler-vyper", + "evm", "glob", "hex", "inkwell", @@ -302,46 +250,20 @@ dependencies = [ "serde", "serde_json", "serde_yaml", - "sha3 0.10.8", + "sha3", "solidity-adapter", "structopt", - "tokio", "web3", "zkevm-assembly", "zkevm_opcode_defs", "zkevm_tester", ] -[[package]] -name = "compiler-vyper" -version = "1.3.13" -source = "git+https://github.com/matter-labs/era-compiler-vyper?branch=main#701ca3db3e09705f4b69595d52325ecbecf63fd1" -dependencies = [ - "anyhow", - "colored", - "compiler-common", - "compiler-llvm-context", - "hex", - "inkwell", - "lazy_static", - "mimalloc", - "once_cell", - "rayon", - "semver", - "serde", - "serde_json", - "sha3 0.10.8", - "structopt", - "which", - "zkevm-assembly", - "zkevm_opcode_defs", -] - [[package]] name = "const-oid" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "convert_case" @@ -351,9 +273,9 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -361,16 +283,16 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "coverage-watcher" -version = "1.3.3" +version = "1.4.1" dependencies = [ "anyhow", - "compiler-common", + "era-compiler-common", "serde", "serde_yaml", "structopt", @@ -378,45 +300,37 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] [[package]] name = "crossbeam-deque" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.15" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", - "memoffset", - "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "crunchy" @@ -426,9 +340,9 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-bigint" -version = "0.4.9" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", "rand_core 0.6.4", @@ -448,9 +362,9 @@ dependencies = [ [[package]] name = "der" -version = "0.6.1" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" dependencies = [ "const-oid", "zeroize", @@ -476,37 +390,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", "subtle", ] [[package]] name = "ecdsa" -version = "0.14.8" +version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der", + "digest", "elliptic-curve", "rfc6979", "signature", + "spki", ] [[package]] name = "either" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" [[package]] name = "elliptic-curve" -version = "0.12.3" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "der", "digest", "ff", "generic-array", @@ -546,14 +462,102 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "era-compiler-common" +version = "1.5.0" +source = "git+https://github.com/matter-labs/era-compiler-common?branch=main#6781681145a37d9809057cf6fc3fa667abd545af" +dependencies = [ + "anyhow", + "serde", + "serde_json", + "serde_stacker", +] + +[[package]] +name = "era-compiler-llvm-context" +version = "1.4.1" +source = "git+https://github.com/matter-labs/era-compiler-llvm-context?branch=main#f1ae37a655c55ddc9c0bf08f3fbd00f99d38809e" +dependencies = [ + "anyhow", + "era-compiler-common", + "hex", + "inkwell", + "itertools", + "md5", + "num", + "once_cell", + "regex", + "semver", + "serde", + "sha2", + "sha3", + "zkevm-assembly", + "zkevm_opcode_defs", +] + +[[package]] +name = "era-compiler-solidity" +version = "1.4.1" +source = "git+https://github.com/matter-labs/era-compiler-solidity?branch=main#25ef5438bcfbf5cfb773214830d56cec52f0aabd" +dependencies = [ + "anyhow", + "colored", + "era-compiler-common", + "era-compiler-llvm-context", + "hex", + "inkwell", + "md5", + "mimalloc", + "num", + "once_cell", + "path-slash", + "rand 0.8.5", + "rayon", + "regex", + "semver", + "serde", + "serde_json", + "sha3", + "structopt", + "thiserror", + "which", + "zkevm-assembly", +] + +[[package]] +name = "era-compiler-vyper" +version = "1.4.0" +source = "git+https://github.com/matter-labs/era-compiler-vyper?branch=main#f60d8409b42e8da3f0999e862338f3961045629a" +dependencies = [ + "anyhow", + "colored", + "era-compiler-common", + "era-compiler-llvm-context", + "hex", + "inkwell", + "lazy_static", + "mimalloc", + "once_cell", + "path-slash", + "rayon", + "semver", + "serde", + "serde_json", + "sha3", + "structopt", + "which", + "zkevm-assembly", + "zkevm_opcode_defs", +] + [[package]] name = "errno" -version = "0.3.6" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c18ee0ed65a5f1f81cac6b1d213b69c35fa47d4252ad41f1486dbd8226fe36e" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -568,7 +572,7 @@ dependencies = [ "regex", "serde", "serde_json", - "sha3 0.10.8", + "sha3", "thiserror", "uint", ] @@ -600,11 +604,35 @@ dependencies = [ "uint", ] +[[package]] +name = "evm" +version = "1.0.0-dev" +source = "git+https://github.com/rust-ethereum/evm?branch=master#f7a23df6c478ca6a151af5f60e62944800529a61" +dependencies = [ + "evm-interpreter", + "primitive-types", + "sha3", +] + +[[package]] +name = "evm-interpreter" +version = "1.0.0-dev" +source = "git+https://github.com/rust-ethereum/evm?branch=master#f7a23df6c478ca6a151af5f60e62944800529a61" +dependencies = [ + "auto_impl", + "parity-scale-codec", + "primitive-types", + "rlp", + "scale-info", + "serde", + "sha3", +] + [[package]] name = "ff" -version = "0.12.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ "rand_core 0.6.4", "subtle", @@ -630,9 +658,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -651,9 +679,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -666,9 +694,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -676,15 +704,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -693,44 +721,44 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-macro" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.52", ] [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-timer" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", @@ -752,13 +780,14 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] name = "getrandom" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "libc", @@ -767,9 +796,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "glob" @@ -779,9 +808,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "group" -version = "0.12.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", "rand_core 0.6.4", @@ -790,9 +819,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.21" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" dependencies = [ "bytes", "fnv", @@ -800,7 +829,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 1.9.3", + "indexmap", "slab", "tokio", "tokio-util", @@ -809,15 +838,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "headers" @@ -861,12 +884,6 @@ dependencies = [ "libc", ] -[[package]] -name = "hermit-abi" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" - [[package]] name = "hex" version = "0.4.3" @@ -884,18 +901,18 @@ dependencies = [ [[package]] name = "home" -version = "0.5.5" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" dependencies = [ - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "http" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", @@ -904,9 +921,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http", @@ -933,9 +950,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" dependencies = [ "bytes", "futures-channel", @@ -948,7 +965,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.10", + "socket2", "tokio", "tower-service", "tracing", @@ -979,6 +996,16 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "impl-codec" version = "0.6.0" @@ -1019,28 +1046,18 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - -[[package]] -name = "indexmap" -version = "2.1.0" +version = "2.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" dependencies = [ "equivalent", - "hashbrown 0.14.2", + "hashbrown", ] [[package]] name = "inkwell" version = "0.1.0" -source = "git+https://github.com/matter-labs-forks/inkwell?branch=llvm-15#aeeada43db7fd6375ebe2929baeda1934d751cd6" +source = "git+https://github.com/matter-labs-forks/inkwell?branch=llvm-15#98a023834492fe59b4ae97c405f75626437fced0" dependencies = [ "either", "inkwell_internals", @@ -1054,7 +1071,7 @@ dependencies = [ [[package]] name = "inkwell_internals" version = "0.6.0" -source = "git+https://github.com/matter-labs-forks/inkwell?branch=llvm-15#aeeada43db7fd6375ebe2929baeda1934d751cd6" +source = "git+https://github.com/matter-labs-forks/inkwell?branch=llvm-15#98a023834492fe59b4ae97c405f75626437fced0" dependencies = [ "proc-macro2", "quote", @@ -1067,37 +1084,26 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" -[[package]] -name = "is-terminal" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" -dependencies = [ - "hermit-abi 0.3.3", - "rustix", - "windows-sys", -] - [[package]] name = "itertools" -version = "0.10.5" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "js-sys" -version = "0.3.65" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -1119,21 +1125,23 @@ dependencies = [ [[package]] name = "k256" -version = "0.11.6" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2 0.10.8", + "once_cell", + "sha2", + "signature", ] [[package]] name = "keccak" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" dependencies = [ "cpufeatures", ] @@ -1146,9 +1154,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.150" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libmath" @@ -1171,14 +1179,14 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.11" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "llvm-sys" version = "150.0.5" -source = "git+https://github.com/matter-labs-forks/llvm-sys.rs?branch=llvm-15.0#4d5196cde1825d14028788d0ffa6202ea5f98db6" +source = "git+https://github.com/matter-labs-forks/llvm-sys.rs?branch=llvm-15.0#049dba7d1a8154f01c6267e8612504d56e651088" dependencies = [ "cc", "lazy_static", @@ -1199,9 +1207,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "md5" @@ -1211,18 +1219,9 @@ checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" - -[[package]] -name = "memoffset" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" -dependencies = [ - "autocfg", -] +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "mimalloc" @@ -1247,22 +1246,22 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ "adler", ] [[package]] name = "mio" -version = "0.8.9" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "wasi", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1302,28 +1301,27 @@ dependencies = [ [[package]] name = "num-complex" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" +checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6" dependencies = [ "num-traits", ] [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] [[package]] name = "num-iter" -version = "0.1.43" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" dependencies = [ "autocfg", "num-integer", @@ -1344,43 +1342,54 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", ] [[package]] -name = "num_cpus" -version = "1.16.0" +name = "num_enum" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" dependencies = [ - "hermit-abi 0.3.3", - "libc", + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 2.0.52", ] [[package]] name = "object" -version = "0.32.1" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "parity-scale-codec" -version = "3.6.5" +version = "3.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dec8a8073036902368c2cdc0387e85ff9a37054d7e7c98e592145e0c92cd4fb" +checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe" dependencies = [ "arrayvec", "bitvec", @@ -1392,11 +1401,11 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.6.5" +version = "3.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312270ee71e1cd70289dacf597cab7b207aa107d2f28191c2ae45b2ece18a260" +checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 2.0.2", "proc-macro2", "quote", "syn 1.0.109", @@ -1422,33 +1431,39 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.48.5", ] +[[package]] +name = "path-slash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" + [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.52", ] [[package]] @@ -1465,9 +1480,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkcs8" -version = "0.9.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ "der", "spki", @@ -1499,7 +1514,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ "once_cell", - "toml_edit", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime", + "toml_edit 0.20.2", ] [[package]] @@ -1528,9 +1553,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] @@ -1546,9 +1571,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -1629,9 +1654,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +checksum = "e4963ed1bc86e4f3ee217022bd855b297cef07fb9eac5dfa1f788b220b49b3bd" dependencies = [ "either", "rayon-core", @@ -1639,9 +1664,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -1667,9 +1692,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.2" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", @@ -1679,9 +1704,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", @@ -1696,9 +1721,9 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "reqwest" -version = "0.11.22" +version = "0.11.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" +checksum = "0eea5a9eb898d3783f17c6407670e3592fd174cb81a10e51d4c37f49450b9946" dependencies = [ "base64", "bytes", @@ -1722,6 +1747,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", + "sync_wrapper", "system-configuration", "tokio", "tokio-rustls", @@ -1736,27 +1762,27 @@ dependencies = [ [[package]] name = "rfc6979" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "crypto-bigint", "hmac", - "zeroize", + "subtle", ] [[package]] name = "ring" -version = "0.17.5" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", + "cfg-if", "getrandom", "libc", "spin", "untrusted", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1776,7 +1802,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" dependencies = [ "base64", - "bitflags 2.4.1", + "bitflags 2.4.2", "serde", "serde_derive", ] @@ -1804,22 +1830,22 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.21" +version = "0.38.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "rustls" -version = "0.21.8" +version = "0.21.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c" +checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ "log", "ring", @@ -1848,9 +1874,34 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" + +[[package]] +name = "scale-info" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" +dependencies = [ + "bitvec", + "cfg-if", + "derive_more", + "parity-scale-codec", + "scale-info-derive", +] + +[[package]] +name = "scale-info-derive" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] [[package]] name = "scopeguard" @@ -1870,9 +1921,9 @@ dependencies = [ [[package]] name = "sec1" -version = "0.3.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", @@ -1902,38 +1953,38 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" dependencies = [ "serde", ] [[package]] name = "serde" -version = "1.0.192" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.192" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.52", ] [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "itoa", "ryu", @@ -1942,9 +1993,9 @@ dependencies = [ [[package]] name = "serde_stacker" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f5321e680f77e7b5cfccc78708ff86a814d39aba030610aee67bd5eaf8a1c30" +checksum = "babfccff5773ff80657f0ecf553c7c516bdc2eb16389c0918b36b73e7015276e" dependencies = [ "serde", "stacker", @@ -1964,11 +2015,11 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.9.27" +version = "0.9.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cc7a1570e38322cfe4154732e5110f887ea57e22b76f4bfd32b5bdd3368666c" +checksum = "8fd075d994154d4a774f95b51fb96bdc2832b0ea48425c92546073816cda1f2f" dependencies = [ - "indexmap 2.1.0", + "indexmap", "itoa", "ryu", "serde", @@ -1986,16 +2037,6 @@ dependencies = [ "digest", ] -[[package]] -name = "sha2" -version = "0.10.6" -source = "git+https://github.com/RustCrypto/hashes.git?rev=1731ced4a116d61ba9dc6ee6d0f38fb8102e357a#1731ced4a116d61ba9dc6ee6d0f38fb8102e357a" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - [[package]] name = "sha2" version = "0.10.8" @@ -2007,15 +2048,6 @@ dependencies = [ "digest", ] -[[package]] -name = "sha3" -version = "0.10.6" -source = "git+https://github.com/RustCrypto/hashes.git?rev=7a187e934c1f6c68e4b4e5cf37541b7a0d64d303#7a187e934c1f6c68e4b4e5cf37541b7a0d64d303" -dependencies = [ - "digest", - "keccak", -] - [[package]] name = "sha3" version = "0.10.8" @@ -2028,9 +2060,9 @@ dependencies = [ [[package]] name = "signature" -version = "1.6.4" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest", "rand_core 0.6.4", @@ -2047,37 +2079,27 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "socket2" -version = "0.4.10" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" dependencies = [ "libc", - "winapi", -] - -[[package]] -name = "socket2" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" -dependencies = [ - "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "solidity-adapter" -version = "1.3.3" +version = "1.4.1" dependencies = [ "anyhow", "colored", - "compiler-common", + "era-compiler-common", "md5", "regex", "semver", @@ -2095,9 +2117,9 @@ checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] name = "spki" -version = "0.6.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", "der", @@ -2165,31 +2187,37 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.39" +version = "2.0.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "system-configuration" -version = "0.5.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +checksum = "658bc6ee10a9b4fcf576e9b0819d95ec16f4d2c02d39fd83ac1c8789785c4a42" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.2", "core-foundation", "system-configuration-sys", ] [[package]] name = "system-configuration-sys" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" dependencies = [ "core-foundation-sys", "libc", @@ -2203,9 +2231,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "termcolor" -version = "1.3.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] @@ -2221,22 +2249,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.50" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.50" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.52", ] [[package]] @@ -2265,18 +2293,17 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.34.0" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "pin-project-lite", - "socket2 0.5.5", - "windows-sys", + "socket2", + "windows-sys 0.48.0", ] [[package]] @@ -2305,9 +2332,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" [[package]] name = "toml_edit" @@ -2315,7 +2342,18 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.1.0", + "indexmap", + "toml_datetime", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap", "toml_datetime", "winnow", ] @@ -2345,7 +2383,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.52", ] [[package]] @@ -2359,9 +2397,9 @@ dependencies = [ [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" @@ -2383,9 +2421,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" @@ -2395,18 +2433,18 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode-width" @@ -2416,9 +2454,9 @@ checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" [[package]] name = "unsafe-libyaml" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa" +checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b" [[package]] name = "untrusted" @@ -2428,12 +2466,12 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", - "idna", + "idna 0.5.0", "percent-encoding", ] @@ -2466,9 +2504,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.88" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2476,24 +2514,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.88" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.52", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.38" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ "cfg-if", "js-sys", @@ -2503,9 +2541,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.88" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2513,28 +2551,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.88" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.52", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.88" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "web-sys" -version = "0.3.65" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", @@ -2556,7 +2594,7 @@ dependencies = [ "futures-timer", "headers", "hex", - "idna", + "idna 0.4.0", "jsonrpc-core", "log", "once_cell", @@ -2573,20 +2611,21 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.25.2" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "which" -version = "4.4.2" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +checksum = "9bf3ea8596f3a0dd5980b46430f2058dfe2c36a27ccfbb1845d6fbfcd9ba6e14" dependencies = [ "either", "home", "once_cell", "rustix", + "windows-sys 0.48.0", ] [[package]] @@ -2626,7 +2665,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.4", ] [[package]] @@ -2635,13 +2683,28 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +dependencies = [ + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", ] [[package]] @@ -2650,47 +2713,89 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" + [[package]] name = "winnow" -version = "0.5.19" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" dependencies = [ "memchr", ] @@ -2702,7 +2807,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ "cfg-if", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2716,14 +2821,14 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" [[package]] name = "zk_evm" -version = "1.3.3" -source = "git+https://github.com/matter-labs/era-zk_evm?tag=v1.3.3-rc0#c08a8581421d2a0cf1fc8cbbdcd06c00da01fe0e" +version = "1.4.1" +source = "git+https://github.com/matter-labs/era-zk_evm?branch=v1.4.1#6250dbf64b2d14ced87a127735da559f27a432d5" dependencies = [ "anyhow", "lazy_static", @@ -2737,10 +2842,11 @@ dependencies = [ [[package]] name = "zk_evm_abstractions" -version = "0.1.0" -source = "git+https://github.com/matter-labs/era-zk_evm_abstractions.git#7502a661d7d38906d849dcd3e7a15e5848af6581" +version = "1.4.1" +source = "git+https://github.com/matter-labs/era-zk_evm_abstractions?branch=v1.4.1#0aac08c3b097ee8147e748475117ac46bddcdcef" dependencies = [ "anyhow", + "num_enum", "serde", "static_assertions", "zkevm_opcode_defs", @@ -2748,8 +2854,8 @@ dependencies = [ [[package]] name = "zkevm-assembly" -version = "1.3.2" -source = "git+https://github.com/matter-labs/era-zkEVM-assembly?branch=v1.3.2#3c61d450cbe6548068be8f313ed02f1bd229a865" +version = "1.4.1" +source = "git+https://github.com/matter-labs/era-zkEVM-assembly?branch=v1.4.1#e59d5da67f18f8829c3cfaebb967265d73c168ed" dependencies = [ "env_logger", "hex", @@ -2758,7 +2864,7 @@ dependencies = [ "nom", "num-bigint", "num-traits", - "sha3 0.10.8", + "sha3", "smallvec", "structopt", "thiserror", @@ -2767,22 +2873,22 @@ dependencies = [ [[package]] name = "zkevm_opcode_defs" -version = "1.3.2" -source = "git+https://github.com/matter-labs/era-zkevm_opcode_defs?branch=v1.3.2#dffacadeccdfdbff4bc124d44c595c4a6eae5013" +version = "1.4.1" +source = "git+https://github.com/matter-labs/era-zkevm_opcode_defs?branch=v1.4.1#ba8228ff0582d21f64d6a319d50d0aec48e9e7b6" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "blake2", "ethereum-types", "k256", "lazy_static", - "sha2 0.10.6", - "sha3 0.10.6", + "sha2", + "sha3", ] [[package]] name = "zkevm_tester" -version = "1.3.3" -source = "git+https://github.com/matter-labs/era-zkevm_tester?branch=v1.3.3#7915461d7657c9d17758535554e3633783af576f" +version = "1.4.1" +source = "git+https://github.com/matter-labs/era-zkevm_tester?branch=v1.4.1#aab8cdc167402558e8eb47c2b2701057eee4c33d" dependencies = [ "anyhow", "futures", @@ -2791,9 +2897,10 @@ dependencies = [ "num-traits", "serde", "serde_json", - "sha2 0.10.8", + "sha2", "tracing", "vlog", "zk_evm", + "zk_evm_abstractions", "zkevm-assembly", ] diff --git a/LLVM.lock b/LLVM.lock index 41258726..e59e9c5e 100644 --- a/LLVM.lock +++ b/LLVM.lock @@ -1,2 +1,2 @@ url = "https://github.com/matter-labs/era-compiler-llvm" -branch = "v1.3.7" +branch = "v1.4.1" diff --git a/README.md b/README.md index 85c8dedc..35afb3cf 100644 --- a/README.md +++ b/README.md @@ -28,27 +28,39 @@ made, and there is no point in running tests in all LLVM optimization modes. 2. [Install Rust](https://www.rust-lang.org/tools/install). -3. Check out or clone the appropriate branch of this repository using the `--recursive` option. - -4. Install the LLVM building tool: `cargo install compiler-llvm-builder`. +3. Check out or clone the appropriate branch of this repository: + 3.a. If you have not cloned this repository yet: + ``` + git clone --recursive + ``` + 3.b. If you have already cloned this repository: + ``` + git submodule update --init --recursive --remote + ``` -5. Pull and build the LLVM framework: - 5.a. If you have not cloned the LLVM repository yet: +4. Pull, build, or specify the path to your LLVM framework build: + 4.a. If you have not cloned the LLVM repository yet: ``` + cargo install compiler-llvm-builder zkevm-llvm clone && zkevm-llvm build ``` - 5.b. If you have already cloned the LLVM repository: + 4.b. If you have already cloned the LLVM repository: ``` + cargo install compiler-llvm-builder zkevm-llvm checkout git -C './llvm/' pull zkevm-llvm build ``` + 4.c. If you would like to use your local LLVM build: + ``` + export LLVM_SYS_150_PREFIX='' + ``` -6. 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. +5. 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. -7. Build the Tester with `cargo build --release`. +6. Build the Tester with `cargo build --release`. -8. Run the tests using the examples below under “Usage”. +7. Run the tests using [the examples below](#usage). ## What is supported @@ -62,8 +74,8 @@ made, and there is no point in running tests in all LLVM optimization modes. ### Optimizers -- LLVM middle-end optimizer (levels 0 to 3, s, z, e.g. `M0`, `M1` etc.) -- LLVM back-end optimizer (levels 0 to 3, e.g. `B0`, `B1` etc.) +- LLVM middle-end optimizer (levels 0 to 3, s, z, e.g. `M0`, `Mz` etc.) +- LLVM back-end optimizer (levels 0 and 3, i.e. `B0` and `B3`) - `solc` optimizer (`-` or `+`) - `vyper` optimizer (`-` or `+`) @@ -71,7 +83,8 @@ made, and there is no point in running tests in all LLVM optimization modes. - Yul pure (`Y`) - EVM assembly from Yul (`y`) -- EVM assembly (`E`) +- EVM assembly pure (`E`) +- Vyper LLL (`V`) ### Compiler versions @@ -116,7 +129,7 @@ Use: - Yul optimizations enabled (`+`) - level 3 optimizations in LLVM middle-end (`M3`) - level 3 optimizations in LLVM back-end (`B3`) -- Solidity compiler version (`0.8.20`) +- Solidity compiler version (`0.8.24`) Output: @@ -127,8 +140,8 @@ Output: ```bash cargo run --release --bin compiler-tester -- -DT \ --path='tests/solidity/simple/default.sol' \ - --mode='Y+M3B3 0.8.20' \ - --zksolc '../compiler-solidity/target/release/zksolc' + --mode='Y+M3B3 0.8.24' \ + --zksolc '../era-compiler-solidity/target/release/zksolc' ``` ### Example 2 @@ -158,8 +171,8 @@ This takes a few hours on the CI server, and probably much longer on your person ```bash cargo run --release --bin compiler-tester -- \ - --zksolc '../compiler-solidity/target/release/zksolc' \ - --zkvyper '../compiler-vyper/target/release/zkvyper' + --zksolc '../era-compiler-solidity/target/release/zksolc' \ + --zkvyper '../era-compiler-vyper/target/release/zkvyper' ``` ## Tracing @@ -178,7 +191,7 @@ zkevm-llvm checkout && zkevm-llvm build ``` ./target/release/compiler-tester \ --path='tests/solidity/simple/default.sol' \ - --mode='Y+M^B3 0.8.20' \ + --mode='Y+M^B3 0.8.24' \ --benchmark='reference.json' ``` @@ -191,7 +204,7 @@ zkevm-llvm checkout && zkevm-llvm build ``` ./target/release/compiler-tester \ --path='tests/solidity/simple/default.sol' \ - --mode='Y+M^B3 0.8.20' \ + --mode='Y+M^B3 0.8.24' \ --benchmark='candidate.json' ``` @@ -212,7 +225,7 @@ may help. ## License -The Solidity compiler is distributed under the terms of either +The Compiler Tester is distributed under the terms of either - Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or ) - MIT license ([LICENSE-MIT](LICENSE-MIT) or ) diff --git a/benchmark_analyzer/Cargo.toml b/benchmark_analyzer/Cargo.toml index 74c8926d..8eda70c3 100644 --- a/benchmark_analyzer/Cargo.toml +++ b/benchmark_analyzer/Cargo.toml @@ -1,12 +1,12 @@ [package] name = "benchmark-analyzer" -version = "1.3.2" +version = "1.4.1" authors = [ - "Alex Zarudnyy ", + "Oleksandr Zarudnyi ", ] license = "MIT OR Apache-2.0" edition = "2021" -description = "The zkEVM benchmarks analyzer" +description = "The analyzer of benchmark reports" [[bin]] name = "benchmark-analyzer" diff --git a/compiler_tester/Cargo.toml b/compiler_tester/Cargo.toml index 3a28859f..e7f03cb7 100644 --- a/compiler_tester/Cargo.toml +++ b/compiler_tester/Cargo.toml @@ -1,13 +1,13 @@ [package] name = "compiler-tester" -version = "1.3.3" +version = "1.4.1" authors = [ "Oleksandr Zarudnyi ", "Anton Dyadyuk ", ] license = "MIT OR Apache-2.0" edition = "2021" -description = "EraVM Compiler Integration Testing Framework" +description = "Matter Labs Compiler Integration Testing Framework" [[bin]] name = "compiler-tester" @@ -19,7 +19,7 @@ doctest = false [dependencies] structopt = { version = "0.3", default-features = false } anyhow = "1.0" -colored = "2.0" +colored = "2.1" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" @@ -28,32 +28,28 @@ md5 = "0.7" hex = "0.4" sha3 = "0.10" ron = "0.8" -regex = "1.8" +regex = "1.9" glob = "0.3" semver = { version = "1.0", features = ["serde"] } -itertools = "0.10" -once_cell = "1.17" -rayon = "1.7" +itertools = "0.12" +once_cell = "1.19" +rayon = "1.8" lazy_static = "1.4" bincode = "1.3" +evm = { git = "https://github.com/rust-ethereum/evm", branch = "master" } -zkevm-assembly = { git = "https://github.com/matter-labs/era-zkEVM-assembly", branch = "v1.3.2" } -zkevm_opcode_defs = { git = "https://github.com/matter-labs/era-zkevm_opcode_defs", branch = "v1.3.2" } -zkevm_tester = { git = "https://github.com/matter-labs/era-zkevm_tester", branch = "v1.3.3" } +zkevm-assembly = { git = "https://github.com/matter-labs/era-zkEVM-assembly", branch = "v1.4.1" } +zkevm_opcode_defs = { git = "https://github.com/matter-labs/era-zkevm_opcode_defs", branch = "v1.4.1" } +zkevm_tester = { git = "https://github.com/matter-labs/era-zkevm_tester", branch = "v1.4.1" } -compiler-common = { git = "https://github.com/matter-labs/era-compiler-common", branch = "main" } -compiler-llvm-context = { git = "https://github.com/matter-labs/era-compiler-llvm-context", branch = "main" } -compiler-solidity = { git = "https://github.com/matter-labs/era-compiler-solidity", branch = "main" } -compiler-vyper = { git = "https://github.com/matter-labs/era-compiler-vyper", branch = "main" } +era-compiler-common = { git = "https://github.com/matter-labs/era-compiler-common", branch = "main" } +era-compiler-llvm-context = { git = "https://github.com/matter-labs/era-compiler-llvm-context", branch = "main" } +era-compiler-solidity = { git = "https://github.com/matter-labs/era-compiler-solidity", branch = "main" } +era-compiler-vyper = { git = "https://github.com/matter-labs/era-compiler-vyper", branch = "main" } solidity-adapter = { path = "../solidity_adapter" } benchmark-analyzer = { path = "../benchmark_analyzer" } -[dependencies.tokio] -version = "1.28" -default-features = false -features = ["rt-multi-thread"] - [dependencies.web3] version = "0.19" default-features = false @@ -68,4 +64,4 @@ features = ["blocking"] git = "https://github.com/matter-labs-forks/inkwell" branch = "llvm-15" default-features = false -features = ["llvm15-0", "no-libffi-linking", "target-eravm"] +features = ["llvm15-0", "no-libffi-linking", "target-eravm", "target-evm"] diff --git a/compiler_tester/src/compiler_tester/arguments.rs b/compiler_tester/src/compiler_tester/arguments.rs index bb2e2300..b42bb078 100644 --- a/compiler_tester/src/compiler_tester/arguments.rs +++ b/compiler_tester/src/compiler_tester/arguments.rs @@ -74,6 +74,12 @@ pub struct Arguments { #[structopt(long = "zkvyper")] pub zkvyper: Option, + /// Specify the target machine. + /// Available arguments: `eravm`, `evm`. + /// The default is `eravm`. + #[structopt(long = "target")] + pub target: Option, + /// Path to the default `solc` binaries download configuration file. #[structopt(long = "solc-bin-config-path")] pub solc_bin_config_path: Option, @@ -84,11 +90,11 @@ pub struct Arguments { /// Whether to load the system contracts builds from the specified file. #[structopt(long = "load-system-contracts")] - pub load_system_contracts: Option, + pub system_contracts_load_path: Option, /// Whether to save the system contracts builds to the specified file. #[structopt(long = "save-system-contracts")] - pub save_system_contracts: Option, + pub system_contracts_save_path: Option, /// Sets the `verify each` option in LLVM. #[structopt(long = "llvm-verify-each")] diff --git a/compiler_tester/src/compiler_tester/main.rs b/compiler_tester/src/compiler_tester/main.rs index b8b31b3a..cedd9ae5 100644 --- a/compiler_tester/src/compiler_tester/main.rs +++ b/compiler_tester/src/compiler_tester/main.rs @@ -40,32 +40,37 @@ fn main_inner(arguments: Arguments) -> anyhow::Result<()> { inkwell::support::get_commit_id().to_string(), ); + let target = match arguments.target { + Some(target) => era_compiler_llvm_context::Target::from_str(target.as_str())?, + None => era_compiler_llvm_context::Target::EraVM, + }; + inkwell::support::enable_llvm_pretty_stack_trace(); - compiler_llvm_context::initialize_target(compiler_llvm_context::Target::EraVM); + era_compiler_llvm_context::initialize_target(target); compiler_tester::LLVMOptions::initialize( arguments.llvm_verify_each, arguments.llvm_debug_logging, )?; - compiler_solidity::EXECUTABLE + era_compiler_solidity::EXECUTABLE .set( arguments .zksolc - .unwrap_or_else(|| PathBuf::from(compiler_solidity::DEFAULT_EXECUTABLE_NAME)), + .unwrap_or_else(|| PathBuf::from(era_compiler_solidity::DEFAULT_EXECUTABLE_NAME)), ) .expect("Always valid"); - compiler_vyper::EXECUTABLE + era_compiler_vyper::EXECUTABLE .set( arguments .zkvyper - .unwrap_or_else(|| PathBuf::from(compiler_vyper::DEFAULT_EXECUTABLE_NAME)), + .unwrap_or_else(|| PathBuf::from(era_compiler_vyper::DEFAULT_EXECUTABLE_NAME)), ) .expect("Always valid"); let debug_config = if arguments.debug { std::fs::create_dir_all(compiler_tester::DEBUG_DIRECTORY)?; - Some(compiler_llvm_context::DebugConfig::new(PathBuf::from_str( - compiler_tester::DEBUG_DIRECTORY, - )?)) + Some(era_compiler_llvm_context::DebugConfig::new( + PathBuf::from_str(compiler_tester::DEBUG_DIRECTORY)?, + )) } else { None }; @@ -73,10 +78,6 @@ fn main_inner(arguments: Arguments) -> anyhow::Result<()> { if arguments.trace > 0 { std::fs::create_dir_all(compiler_tester::TRACE_DIRECTORY)?; } - zkevm_tester::runners::compiler_tests::set_tracing_mode( - zkevm_tester::runners::compiler_tests::VmTracingOptions::from_u64(arguments.trace as u64), - ); - zkevm_assembly::set_encoding_mode(zkevm_assembly::RunningVmEncodingMode::Testing); let mut thread_pool_builder = rayon::ThreadPoolBuilder::new(); if let Some(threads) = arguments.threads { @@ -90,29 +91,18 @@ fn main_inner(arguments: Arguments) -> anyhow::Result<()> { let summary = compiler_tester::Summary::new(arguments.verbosity, arguments.quiet).wrap(); let filters = compiler_tester::Filters::new(arguments.paths, arguments.modes, arguments.groups); - let system_contract_debug_config = if arguments.dump_system { - debug_config.clone() - } else { - None - }; - let compiler_tester = compiler_tester::CompilerTester::new( - summary.clone(), - filters, - debug_config, - vec![ - arguments - .solc_bin_config_path - .unwrap_or_else(|| PathBuf::from("./configs/solc-bin-default.json")), - arguments - .vyper_bin_config_path - .unwrap_or_else(|| PathBuf::from("./configs/vyper-bin-default.json")), - ], - PathBuf::from("./configs/solc-bin-system-contracts.json"), - system_contract_debug_config, - arguments.load_system_contracts, - arguments.save_system_contracts, - )?; + let compiler_tester = + compiler_tester::CompilerTester::new(summary.clone(), filters, debug_config.clone())?; + + let binary_download_config_paths = vec![ + arguments + .solc_bin_config_path + .unwrap_or_else(|| PathBuf::from("./configs/solc-bin-default.json")), + arguments + .vyper_bin_config_path + .unwrap_or_else(|| PathBuf::from("./configs/vyper-bin-default.json")), + ]; let run_time_start = Instant::now(); println!( @@ -121,14 +111,48 @@ fn main_inner(arguments: Arguments) -> anyhow::Result<()> { rayon::current_num_threads(), ); - match ( - arguments.disable_deployer, - arguments.disable_value_simulator, - ) { - (true, true) => compiler_tester.run::()?, - (true, false) => compiler_tester.run::()?, - (false, true) => compiler_tester.run::()?, - (false, false) => compiler_tester.run::()?, + match target { + era_compiler_llvm_context::Target::EraVM => { + zkevm_tester::runners::compiler_tests::set_tracing_mode( + zkevm_tester::runners::compiler_tests::VmTracingOptions::from_u64( + arguments.trace as u64, + ), + ); + zkevm_assembly::set_encoding_mode(zkevm_assembly::RunningVmEncodingMode::Testing); + + let system_contract_debug_config = if arguments.dump_system { + debug_config + } else { + None + }; + let vm = compiler_tester::EraVM::new( + binary_download_config_paths, + PathBuf::from("./configs/solc-bin-system-contracts.json"), + system_contract_debug_config, + arguments.system_contracts_load_path, + arguments.system_contracts_save_path, + )?; + + match ( + arguments.disable_deployer, + arguments.disable_value_simulator, + ) { + (true, true) => { + compiler_tester.run_eravm::(vm)? + } + (true, false) => { + compiler_tester.run_eravm::(vm)? + } + (false, true) => compiler_tester + .run_eravm::(vm)?, + (false, false) => compiler_tester + .run_eravm::(vm)?, + } + } + era_compiler_llvm_context::Target::EVM => { + compiler_tester::EVM::download(binary_download_config_paths)?; + compiler_tester.run_evm()?; + } } let summary = compiler_tester::Summary::unwrap_arc(summary); @@ -175,12 +199,15 @@ mod tests { dump_system: false, disable_deployer: false, disable_value_simulator: false, - zksolc: Some(PathBuf::from(compiler_solidity::DEFAULT_EXECUTABLE_NAME)), - zkvyper: Some(PathBuf::from(compiler_vyper::DEFAULT_EXECUTABLE_NAME)), + zksolc: Some(PathBuf::from( + era_compiler_solidity::DEFAULT_EXECUTABLE_NAME, + )), + zkvyper: Some(PathBuf::from(era_compiler_vyper::DEFAULT_EXECUTABLE_NAME)), + target: Some(era_compiler_llvm_context::Target::EraVM.to_string()), solc_bin_config_path: Some(PathBuf::from("./configs/solc-bin-default.json")), vyper_bin_config_path: Some(PathBuf::from("./configs/vyper-bin-default.json")), - load_system_contracts: None, - save_system_contracts: None, + system_contracts_load_path: None, + system_contracts_save_path: None, llvm_verify_each: false, llvm_debug_logging: false, }; diff --git a/compiler_tester/src/compilers/downloader/config/mod.rs b/compiler_tester/src/compilers/downloader/config/mod.rs index 1f6ffd95..d925dee7 100644 --- a/compiler_tester/src/compilers/downloader/config/mod.rs +++ b/compiler_tester/src/compilers/downloader/config/mod.rs @@ -32,18 +32,29 @@ impl Config { None => anyhow::bail!("Platforms are not defined"), }; - Ok(if cfg!(target_os = "linux") { - platforms - .get("linux") - .cloned() - .ok_or_else(|| anyhow::anyhow!("Linux platform directory is not defined"))? - } else if cfg!(target_os = "macos") { - platforms - .get("macos") - .cloned() - .ok_or_else(|| anyhow::anyhow!("MacOS platform directory is not defined"))? + let platform = if cfg!(target_arch = "x86_64") { + if cfg!(target_os = "linux") { + "linux-amd64" + } else if cfg!(target_os = "macos") { + "macos-amd64" + } else { + anyhow::bail!("This platform is not supported in `solc`!"); + } + } else if cfg!(target_arch = "aarch64") { + if cfg!(target_os = "linux") { + "linux-arm64" + } else if cfg!(target_os = "macos") { + "macos-arm64" + } else { + anyhow::bail!("This platform is not supported in `solc`!"); + } } else { - anyhow::bail!("Unsupported platform!") - }) + anyhow::bail!("This platform is not supported in `solc`!"); + }; + + platforms + .get(platform) + .cloned() + .ok_or_else(|| anyhow::anyhow!("Directory for platform `{}` is not defined", platform)) } } diff --git a/compiler_tester/src/compilers/downloader/mod.rs b/compiler_tester/src/compilers/downloader/mod.rs index efd1539d..3781c1b5 100644 --- a/compiler_tester/src/compilers/downloader/mod.rs +++ b/compiler_tester/src/compilers/downloader/mod.rs @@ -67,10 +67,13 @@ impl Downloader { let source_path = binary .source - .replace("${PLATFORM}", platform_directory.as_str()); + .replace("${PLATFORM}", platform_directory.as_str()) + .replace("${VERSION}", version.as_str()); - let destination_path = PathBuf::from_str(binary.destination.as_str()) - .map_err(|_| anyhow::anyhow!("Binary `{}` destination is invalid", source_path))?; + let destination_path = binary.destination.replace("${VERSION}", version.as_str()); + let destination_path = PathBuf::from_str(destination_path.as_str()).map_err(|_| { + anyhow::anyhow!("Binary `{}` destination is invalid", destination_path) + })?; let data = match binary.protocol { Protocol::File => { @@ -79,10 +82,10 @@ impl Downloader { } println!( - " {} binary `{}` => `{}`", + " {} binary `{}` => {:?}", "Copying".bright_green().bold(), source_path, - binary.destination, + destination_path, ); std::fs::copy(source_path.as_str(), binary.destination.as_str()).map_err( @@ -104,10 +107,10 @@ impl Downloader { let source_url = reqwest::Url::from_str(source_path.as_str()).expect("Always valid"); println!( - " {} binary `{}` => `{}`", + " {} binary `{}` => {:?}", "Downloading".bright_green().bold(), source_url, - binary.destination, + destination_path, ); self.http_client.get(source_url).send()?.bytes()? } @@ -141,10 +144,10 @@ impl Downloader { reqwest::Url::from_str(source_path.to_str().expect("Always valid")) .expect("Always valid"); println!( - " {} binary `{}` => `{}`", + " {} binary `{}` => {:?}", "Downloading".bright_green().bold(), source_url, - binary.destination, + destination_path, ); self.http_client.get(source_url).send()?.bytes()? } diff --git a/compiler_tester/src/compilers/eravm.rs b/compiler_tester/src/compilers/eravm.rs index 936f3c97..fc9e9fd3 100644 --- a/compiler_tester/src/compilers/eravm.rs +++ b/compiler_tester/src/compilers/eravm.rs @@ -7,31 +7,20 @@ use std::collections::HashMap; use super::mode::eravm::Mode as EraVMMode; use super::mode::Mode; -use super::output::build::Build as EraVMContractBuild; -use super::output::Output; use super::Compiler; +use crate::vm::eravm::input::build::Build as EraVMBuild; +use crate::vm::eravm::input::Input as EraVMInput; +use crate::vm::evm::input::Input as EVMInput; /// /// The EraVM compiler. /// +#[derive(Default)] #[allow(non_camel_case_types)] pub struct EraVMCompiler; -impl EraVMCompiler { - /// - /// A shortcut constructor. - /// - pub fn new() -> Self { - Self - } -} - impl Compiler for EraVMCompiler { - fn modes(&self) -> Vec { - vec![EraVMMode::default().into()] - } - - fn compile( + fn compile_for_eravm( &self, _test_path: String, sources: Vec<(String, String)>, @@ -39,17 +28,17 @@ impl Compiler for EraVMCompiler { _mode: &Mode, _is_system_mode: bool, _is_system_contracts_mode: bool, - _debug_config: Option, - ) -> anyhow::Result { + _debug_config: Option, + ) -> anyhow::Result { let builds = sources .iter() .map(|(path, source_code)| { zkevm_assembly::Assembly::try_from(source_code.to_owned()) .map_err(anyhow::Error::new) - .and_then(EraVMContractBuild::new) + .and_then(EraVMBuild::new) .map(|build| (path.to_string(), build)) }) - .collect::>>()?; + .collect::>>()?; let last_contract = sources .last() @@ -57,10 +46,25 @@ impl Compiler for EraVMCompiler { .0 .clone(); - Ok(Output::new(builds, None, last_contract)) + Ok(EraVMInput::new(builds, None, last_contract)) + } + + fn compile_for_evm( + &self, + _test_path: String, + _sources: Vec<(String, String)>, + _libraries: BTreeMap>, + _mode: &Mode, + _debug_config: Option, + ) -> anyhow::Result { + anyhow::bail!("EraVM compiler does not support EVM compilation"); + } + + fn modes(&self) -> Vec { + vec![EraVMMode::default().into()] } - fn has_many_contracts(&self) -> bool { + fn has_multiple_contracts(&self) -> bool { false } } diff --git a/compiler_tester/src/compilers/llvm.rs b/compiler_tester/src/compilers/llvm.rs index 447e600c..902f452a 100644 --- a/compiler_tester/src/compilers/llvm.rs +++ b/compiler_tester/src/compilers/llvm.rs @@ -9,13 +9,16 @@ use sha3::Digest; use super::mode::llvm::Mode as LLVMMode; use super::mode::Mode; -use super::output::build::Build as EraVMContractBuild; -use super::output::Output; use super::Compiler; +use crate::vm::eravm::input::build::Build as EraVMBuild; +use crate::vm::eravm::input::Input as EraVMInput; +use crate::vm::evm::input::build::Build as EVMBuild; +use crate::vm::evm::input::Input as EVMInput; /// /// The LLVM compiler. /// +#[derive(Default)] pub struct LLVMCompiler; lazy_static::lazy_static! { @@ -23,76 +26,110 @@ lazy_static::lazy_static! { /// The LLVM compiler supported modes. /// static ref MODES: Vec = { - compiler_llvm_context::OptimizerSettings::combinations() + era_compiler_llvm_context::OptimizerSettings::combinations() .into_iter() .map(|llvm_optimizer_settings| LLVMMode::new(llvm_optimizer_settings).into()) .collect::>() }; } -impl LLVMCompiler { - /// - /// A shortcut constructor. - /// - pub fn new() -> Self { - Self - } +impl Compiler for LLVMCompiler { + fn compile_for_eravm( + &self, + _test_path: String, + sources: Vec<(String, String)>, + _libraries: BTreeMap>, + mode: &Mode, + _is_system_mode: bool, + _is_system_contracts_mode: bool, + debug_config: Option, + ) -> anyhow::Result { + let mode = LLVMMode::unwrap(mode); - /// - /// Compiles the source. - /// - fn compile_source( - source_code: &str, - name: &str, - mode: &LLVMMode, - debug_config: Option, - ) -> anyhow::Result { - let llvm = inkwell::context::Context::create(); - let memory_buffer = inkwell::memory_buffer::MemoryBuffer::create_from_memory_range_copy( - source_code.as_bytes(), - name, - ); - let module = llvm - .create_module_from_ir(memory_buffer) - .map_err(|error| anyhow::anyhow!(error.to_string()))?; - let optimizer = compiler_llvm_context::Optimizer::new(mode.llvm_optimizer_settings.clone()); - let source_hash = sha3::Keccak256::digest(source_code.as_bytes()).into(); - - let context = compiler_llvm_context::EraVMContext::< - compiler_llvm_context::EraVMDummyDependency, - >::new(&llvm, module, optimizer, None, true, debug_config); - let build = context.build(name, Some(source_hash))?; - let assembly = - zkevm_assembly::Assembly::from_string(build.assembly_text, build.metadata_hash)?; - - EraVMContractBuild::new(assembly) - } -} + let builds = sources + .iter() + .map(|(path, source)| { + let llvm = inkwell::context::Context::create(); + let memory_buffer = + inkwell::memory_buffer::MemoryBuffer::create_from_memory_range_copy( + source.as_bytes(), + path, + ); + let module = llvm + .create_module_from_ir(memory_buffer) + .map_err(|error| anyhow::anyhow!(error.to_string()))?; + let optimizer = + era_compiler_llvm_context::Optimizer::new(mode.llvm_optimizer_settings.clone()); + let source_hash = sha3::Keccak256::digest(source.as_bytes()).into(); -impl Compiler for LLVMCompiler { - fn modes(&self) -> Vec { - MODES.clone() + let context = era_compiler_llvm_context::EraVMContext::< + era_compiler_llvm_context::EraVMDummyDependency, + >::new( + &llvm, module, optimizer, None, true, debug_config.clone() + ); + let build = context.build(path, Some(source_hash))?; + let assembly = zkevm_assembly::Assembly::from_string( + build.assembly_text, + build.metadata_hash, + )?; + let build = EraVMBuild::new(assembly)?; + + Ok((path.to_owned(), build)) + }) + .collect::>>()?; + + let last_contract = sources + .last() + .ok_or_else(|| anyhow::anyhow!("Sources is empty"))? + .0 + .clone(); + + Ok(EraVMInput::new(builds, None, last_contract)) } - fn compile( + fn compile_for_evm( &self, _test_path: String, sources: Vec<(String, String)>, _libraries: BTreeMap>, mode: &Mode, - _is_system_mode: bool, - _is_system_contracts_mode: bool, - debug_config: Option, - ) -> anyhow::Result { + debug_config: Option, + ) -> anyhow::Result { let mode = LLVMMode::unwrap(mode); let builds = sources .iter() .map(|(path, source)| { - Self::compile_source(source, path, mode, debug_config.clone()) - .map(|build| (path.to_owned(), build)) + let llvm = inkwell::context::Context::create(); + let memory_buffer = + inkwell::memory_buffer::MemoryBuffer::create_from_memory_range_copy( + source.as_bytes(), + path, + ); + let module = llvm + .create_module_from_ir(memory_buffer) + .map_err(|error| anyhow::anyhow!(error.to_string()))?; + let optimizer = + era_compiler_llvm_context::Optimizer::new(mode.llvm_optimizer_settings.clone()); + let source_hash = sha3::Keccak256::digest(source.as_bytes()).into(); + + let context = era_compiler_llvm_context::EVMContext::< + era_compiler_llvm_context::EVMDummyDependency, + >::new( + &llvm, + module, + era_compiler_llvm_context::CodeType::Runtime, + optimizer, + None, + true, + debug_config.clone(), + ); + let build = context.build(path, Some(source_hash))?; + let build = EVMBuild::new(era_compiler_llvm_context::EVMBuild::default(), build); + + Ok((path.to_owned(), build)) }) - .collect::>>()?; + .collect::>>()?; let last_contract = sources .last() @@ -100,10 +137,14 @@ impl Compiler for LLVMCompiler { .0 .clone(); - Ok(Output::new(builds, None, last_contract)) + Ok(EVMInput::new(builds, None, last_contract)) + } + + fn modes(&self) -> Vec { + MODES.clone() } - fn has_many_contracts(&self) -> bool { + fn has_multiple_contracts(&self) -> bool { false } } diff --git a/compiler_tester/src/compilers/mod.rs b/compiler_tester/src/compilers/mod.rs index a8dbc19d..fc1025fa 100644 --- a/compiler_tester/src/compilers/mod.rs +++ b/compiler_tester/src/compilers/mod.rs @@ -7,7 +7,6 @@ pub mod downloader; pub mod eravm; pub mod llvm; pub mod mode; -pub mod output; pub mod solidity; pub mod vyper; pub mod yul; @@ -15,22 +14,19 @@ pub mod yul; use std::collections::BTreeMap; use self::mode::Mode; -use self::output::Output; + +use crate::vm::eravm::input::Input as EraVMInput; +use crate::vm::evm::input::Input as EVMInput; /// /// The compiler trait. /// pub trait Compiler: Send + Sync + 'static { /// - /// Returns supported compiler modes. - /// - fn modes(&self) -> Vec; - - /// - /// Compile all the sources. + /// Compile all sources for EraVM. /// #[allow(clippy::too_many_arguments)] - fn compile( + fn compile_for_eravm( &self, test_path: String, sources: Vec<(String, String)>, @@ -38,11 +34,28 @@ pub trait Compiler: Send + Sync + 'static { mode: &Mode, is_system_mode: bool, is_system_contracts_mode: bool, - debug_config: Option, - ) -> anyhow::Result; + debug_config: Option, + ) -> anyhow::Result; + + /// + /// Compile all sources for EVM. + /// + fn compile_for_evm( + &self, + test_path: String, + sources: Vec<(String, String)>, + libraries: BTreeMap>, + mode: &Mode, + debug_config: Option, + ) -> anyhow::Result; + + /// + /// Returns supported compiler modes. + /// + fn modes(&self) -> Vec; /// - /// Returns true if the one source file can contains many contracts, false otherwise. + /// Whether one source file can contains multiple contracts. /// - fn has_many_contracts(&self) -> bool; + fn has_multiple_contracts(&self) -> bool; } diff --git a/compiler_tester/src/compilers/mode/llvm.rs b/compiler_tester/src/compilers/mode/llvm.rs index b1896dae..c8053e2b 100644 --- a/compiler_tester/src/compilers/mode/llvm.rs +++ b/compiler_tester/src/compilers/mode/llvm.rs @@ -12,14 +12,14 @@ use super::Mode as ModeWrapper; #[derive(Debug, Clone)] pub struct Mode { /// The optimizer settings. - pub llvm_optimizer_settings: compiler_llvm_context::OptimizerSettings, + pub llvm_optimizer_settings: era_compiler_llvm_context::OptimizerSettings, } impl Mode { /// /// A shortcut constructor. /// - pub fn new(mut llvm_optimizer_settings: compiler_llvm_context::OptimizerSettings) -> Self { + pub fn new(mut llvm_optimizer_settings: era_compiler_llvm_context::OptimizerSettings) -> Self { let llvm_options = LLVMOptions::get(); llvm_optimizer_settings.is_verify_each_enabled = llvm_options.is_verify_each_enabled(); llvm_optimizer_settings.is_debug_logging_enabled = llvm_options.is_debug_logging_enabled(); diff --git a/compiler_tester/src/compilers/mode/mod.rs b/compiler_tester/src/compilers/mode/mod.rs index 25a60ee4..3b494a32 100644 --- a/compiler_tester/src/compilers/mode/mod.rs +++ b/compiler_tester/src/compilers/mode/mod.rs @@ -109,7 +109,7 @@ impl Mode { /// /// Returns the LLVM optimizer settings. /// - pub fn llvm_optimizer_settings(&self) -> Option<&compiler_llvm_context::OptimizerSettings> { + pub fn llvm_optimizer_settings(&self) -> Option<&era_compiler_llvm_context::OptimizerSettings> { match self { Mode::Solidity(mode) => Some(&mode.llvm_optimizer_settings), Mode::Yul(mode) => Some(&mode.llvm_optimizer_settings), diff --git a/compiler_tester/src/compilers/mode/solidity.rs b/compiler_tester/src/compilers/mode/solidity.rs index 085447ab..dea07392 100644 --- a/compiler_tester/src/compilers/mode/solidity.rs +++ b/compiler_tester/src/compilers/mode/solidity.rs @@ -16,13 +16,13 @@ pub struct Mode { /// The Solidity compiler version. pub solc_version: semver::Version, /// The Solidity compiler output type. - pub solc_pipeline: compiler_solidity::SolcPipeline, + pub solc_pipeline: era_compiler_solidity::SolcPipeline, /// Whether to enable the EVMLA codegen via Yul IR. pub via_ir: bool, /// Whether to run the Solidity compiler optimizer. pub solc_optimize: bool, /// The optimizer settings. - pub llvm_optimizer_settings: compiler_llvm_context::OptimizerSettings, + pub llvm_optimizer_settings: era_compiler_llvm_context::OptimizerSettings, } impl Mode { @@ -31,10 +31,10 @@ impl Mode { /// pub fn new( solc_version: semver::Version, - solc_pipeline: compiler_solidity::SolcPipeline, + solc_pipeline: era_compiler_solidity::SolcPipeline, via_ir: bool, solc_optimize: bool, - mut llvm_optimizer_settings: compiler_llvm_context::OptimizerSettings, + mut llvm_optimizer_settings: era_compiler_llvm_context::OptimizerSettings, ) -> Self { let llvm_options = LLVMOptions::get(); llvm_optimizer_settings.is_verify_each_enabled = llvm_options.is_verify_each_enabled(); @@ -98,20 +98,21 @@ impl Mode { solidity_adapter::EVM::London, solidity_adapter::EVM::Paris, solidity_adapter::EVM::Shanghai, + solidity_adapter::EVM::Cancun, ]) { return false; } match self.solc_pipeline { - compiler_solidity::SolcPipeline::Yul => { + era_compiler_solidity::SolcPipeline::Yul => { params.compile_via_yul != solidity_adapter::CompileViaYul::False && params.abi_encoder_v1_only != solidity_adapter::ABIEncoderV1Only::True } - compiler_solidity::SolcPipeline::EVMLA if self.via_ir => { + era_compiler_solidity::SolcPipeline::EVMLA if self.via_ir => { params.compile_via_yul != solidity_adapter::CompileViaYul::False && params.abi_encoder_v1_only != solidity_adapter::ABIEncoderV1Only::True } - compiler_solidity::SolcPipeline::EVMLA => { + era_compiler_solidity::SolcPipeline::EVMLA => { params.compile_via_yul != solidity_adapter::CompileViaYul::True } } @@ -124,9 +125,9 @@ impl std::fmt::Display for Mode { f, "{}{}{} {}", match self.solc_pipeline { - compiler_solidity::SolcPipeline::Yul => "Y", - compiler_solidity::SolcPipeline::EVMLA if self.via_ir => "y", - compiler_solidity::SolcPipeline::EVMLA => "E", + era_compiler_solidity::SolcPipeline::Yul => "Y", + era_compiler_solidity::SolcPipeline::EVMLA if self.via_ir => "y", + era_compiler_solidity::SolcPipeline::EVMLA => "E", }, if self.solc_optimize { '+' } else { '-' }, self.llvm_optimizer_settings, diff --git a/compiler_tester/src/compilers/mode/vyper.rs b/compiler_tester/src/compilers/mode/vyper.rs index 57022692..03cafae4 100644 --- a/compiler_tester/src/compilers/mode/vyper.rs +++ b/compiler_tester/src/compilers/mode/vyper.rs @@ -16,7 +16,7 @@ pub struct Mode { /// Whether to run the Vyper compiler optimizer. pub vyper_optimize: bool, /// The optimizer settings. - pub llvm_optimizer_settings: compiler_llvm_context::OptimizerSettings, + pub llvm_optimizer_settings: era_compiler_llvm_context::OptimizerSettings, } impl Mode { @@ -26,7 +26,7 @@ impl Mode { pub fn new( vyper_version: semver::Version, vyper_optimize: bool, - mut llvm_optimizer_settings: compiler_llvm_context::OptimizerSettings, + mut llvm_optimizer_settings: era_compiler_llvm_context::OptimizerSettings, ) -> Self { let llvm_options = LLVMOptions::get(); llvm_optimizer_settings.is_verify_each_enabled = llvm_options.is_verify_each_enabled(); diff --git a/compiler_tester/src/compilers/mode/yul.rs b/compiler_tester/src/compilers/mode/yul.rs index 5ff0fb5e..30dc2197 100644 --- a/compiler_tester/src/compilers/mode/yul.rs +++ b/compiler_tester/src/compilers/mode/yul.rs @@ -12,14 +12,14 @@ use super::Mode as ModeWrapper; #[derive(Debug, Clone)] pub struct Mode { /// The optimizer settings. - pub llvm_optimizer_settings: compiler_llvm_context::OptimizerSettings, + pub llvm_optimizer_settings: era_compiler_llvm_context::OptimizerSettings, } impl Mode { /// /// A shortcut constructor. /// - pub fn new(mut llvm_optimizer_settings: compiler_llvm_context::OptimizerSettings) -> Self { + pub fn new(mut llvm_optimizer_settings: era_compiler_llvm_context::OptimizerSettings) -> Self { let llvm_options = LLVMOptions::get(); llvm_optimizer_settings.is_verify_each_enabled = llvm_options.is_verify_each_enabled(); llvm_optimizer_settings.is_debug_logging_enabled = llvm_options.is_debug_logging_enabled(); diff --git a/compiler_tester/src/compilers/solidity/mod.rs b/compiler_tester/src/compilers/solidity/mod.rs index 21ee521b..3a84918c 100644 --- a/compiler_tester/src/compilers/solidity/mod.rs +++ b/compiler_tester/src/compilers/solidity/mod.rs @@ -13,9 +13,11 @@ use itertools::Itertools; use super::cache::Cache; use super::mode::solidity::Mode as SolidityMode; use super::mode::Mode; -use super::output::build::Build as EraVMContractBuild; -use super::output::Output; use super::Compiler; +use crate::vm::eravm::input::build::Build as EraVMBuild; +use crate::vm::eravm::input::Input as EraVMInput; +use crate::vm::evm::input::build::Build as EVMBuild; +use crate::vm::evm::input::Input as EVMInput; use self::solc_cache_key::SolcCacheKey; @@ -24,7 +26,7 @@ use self::solc_cache_key::SolcCacheKey; /// pub struct SolidityCompiler { /// The `solc` process output cache. - cache: Cache, + cache: Cache, } lazy_static::lazy_static! { @@ -36,18 +38,18 @@ lazy_static::lazy_static! { static ref MODES: Vec = { let mut solc_pipeline_versions = Vec::new(); for (pipeline, optimize, via_ir) in [ - (compiler_solidity::SolcPipeline::Yul, false, true), - (compiler_solidity::SolcPipeline::Yul, true, true), - (compiler_solidity::SolcPipeline::EVMLA, false, false), - (compiler_solidity::SolcPipeline::EVMLA, true, false), - (compiler_solidity::SolcPipeline::EVMLA, true, true), + (era_compiler_solidity::SolcPipeline::Yul, false, true), + (era_compiler_solidity::SolcPipeline::Yul, true, true), + (era_compiler_solidity::SolcPipeline::EVMLA, false, false), + (era_compiler_solidity::SolcPipeline::EVMLA, true, false), + (era_compiler_solidity::SolcPipeline::EVMLA, true, true), ] { for version in SolidityCompiler::all_versions(pipeline, via_ir).expect("`solc` versions analysis error") { solc_pipeline_versions.push((pipeline, optimize, via_ir, version)); } } - compiler_llvm_context::OptimizerSettings::combinations() + era_compiler_llvm_context::OptimizerSettings::combinations() .into_iter() .cartesian_product(solc_pipeline_versions) .map( @@ -85,22 +87,27 @@ impl SolidityCompiler { /// /// Returns the `solc` compiler path by version. /// - pub fn get_solc_by_version(version: &semver::Version) -> compiler_solidity::SolcCompiler { - compiler_solidity::SolcCompiler::new(format!("{}/solc-{}", Self::DIRECTORY, version)) + pub fn get_solc_by_version( + version: &semver::Version, + ) -> anyhow::Result { + era_compiler_solidity::SolcCompiler::new(format!("{}/solc-{}", Self::DIRECTORY, version)) } /// /// Returns the system contract `solc` compiler path. /// - pub fn get_system_contract_solc() -> compiler_solidity::SolcCompiler { - compiler_solidity::SolcCompiler::new(format!("{}/solc-system-contracts", Self::DIRECTORY)) + pub fn get_system_contract_solc() -> anyhow::Result { + era_compiler_solidity::SolcCompiler::new(format!( + "{}/solc-system-contracts", + Self::DIRECTORY + )) } /// /// Returns the compiler versions downloaded for the specified compilation pipeline. /// pub fn all_versions( - pipeline: compiler_solidity::SolcPipeline, + pipeline: era_compiler_solidity::SolcPipeline, via_ir: bool, ) -> anyhow::Result> { let mut versions = Vec::new(); @@ -130,12 +137,12 @@ impl SolidityCompiler { Ok(version) => version, Err(_) => continue, }; - if compiler_solidity::SolcPipeline::Yul == pipeline && version.minor < 8 { + if era_compiler_solidity::SolcPipeline::Yul == pipeline && version.minor < 8 { continue; } - if compiler_solidity::SolcPipeline::EVMLA == pipeline + if era_compiler_solidity::SolcPipeline::EVMLA == pipeline && via_ir - && version < compiler_solidity::SolcCompiler::FIRST_VIA_IR_VERSION + && version < era_compiler_solidity::SolcCompiler::FIRST_VIA_IR_VERSION { continue; } @@ -153,24 +160,34 @@ impl SolidityCompiler { libraries: &BTreeMap>, mode: &SolidityMode, is_system_contracts_mode: bool, - ) -> anyhow::Result { + ) -> anyhow::Result { let mut solc = if is_system_contracts_mode { Self::get_system_contract_solc() } else { Self::get_solc_by_version(&mode.solc_version) - }; + }?; let output_selection = - compiler_solidity::SolcStandardJsonInputSettingsSelection::new_required( + era_compiler_solidity::SolcStandardJsonInputSettingsSelection::new_required( mode.solc_pipeline, ); - let optimizer = compiler_solidity::SolcStandardJsonInputSettingsOptimizer::new( + let optimizer = era_compiler_solidity::SolcStandardJsonInputSettingsOptimizer::new( mode.solc_optimize, None, + &mode.solc_version, + false, + false, ); - let solc_input = compiler_solidity::SolcStandardJsonInput::try_from_sources( + let evm_version = if mode.solc_version == semver::Version::new(0, 8, 24) { + Some(era_compiler_common::EVMVersion::Cancun) + } else { + None + }; + + let solc_input = era_compiler_solidity::SolcStandardJsonInput::try_from_sources( + evm_version, sources.iter().cloned().collect(), libraries.clone(), None, @@ -207,7 +224,7 @@ impl SolidityCompiler { libraries: &BTreeMap>, mode: &SolidityMode, is_system_contracts_mode: bool, - ) -> anyhow::Result { + ) -> anyhow::Result { let cache_key = SolcCacheKey::new( test_path, mode.solc_version.clone(), @@ -225,72 +242,11 @@ impl SolidityCompiler { self.cache.get_cloned(&cache_key) } - /// - /// Compile the contracts for a given solc output. - /// - fn compile( - mut solc_output: compiler_solidity::SolcStandardJsonOutput, - sources: Vec<(String, String)>, - libraries: BTreeMap>, - mode: &SolidityMode, - is_system_mode: bool, - debug_config: Option, - ) -> anyhow::Result> { - let project = solc_output.try_to_project( - sources.into_iter().collect::>(), - libraries, - mode.solc_pipeline, - &mode.solc_version, - debug_config.as_ref(), - )?; - - let build = project.compile( - mode.llvm_optimizer_settings.to_owned(), - is_system_mode, - false, - zkevm_assembly::get_encoding_mode(), - debug_config, - )?; - build.write_to_standard_json( - &mut solc_output, - &compiler_solidity::SolcVersion::new( - mode.solc_version.to_string(), - mode.solc_version.to_owned(), - None, - ), - &semver::Version::new(0, 0, 0), - )?; // TODO: set versions - Ok(solc_output - .contracts - .expect("Always exists") - .into_iter() - .flat_map(|(file_name, file)| { - file.into_iter() - .filter_map(|(contract_name, contract)| { - let name = format!("{}:{}", file_name, contract_name); - let evm = contract.evm.expect("Always exists"); - let assembly = - zkevm_assembly::Assembly::from_string(evm.assembly_text?, None) - .expect("Always valid"); - let build = match contract.hash { - Some(bytecode_hash) => { - EraVMContractBuild::new_with_hash(assembly, bytecode_hash) - .expect("Always valid") - } - None => EraVMContractBuild::new(assembly).expect("Always valid"), - }; - Some((name, build)) - }) - .collect::>() - }) - .collect()) - } - /// /// Get the method identifiers from the solc output. /// fn get_method_identifiers( - solc_output: &compiler_solidity::SolcStandardJsonOutput, + solc_output: &era_compiler_solidity::SolcStandardJsonOutput, ) -> anyhow::Result>> { let files = solc_output .contracts @@ -316,13 +272,14 @@ impl SolidityCompiler { })? .iter() { - let selector = u32::from_str_radix(selector, compiler_common::BASE_HEXADECIMAL) - .map_err(|error| { - anyhow::anyhow!( - "Invalid selector from the Solidity compiler: {}", - error - ) - })?; + let selector = + u32::from_str_radix(selector, era_compiler_common::BASE_HEXADECIMAL) + .map_err(|error| { + anyhow::anyhow!( + "Invalid selector from the Solidity compiler: {}", + error + ) + })?; contract_identifiers.insert(entry.clone(), selector); } method_identifiers.insert(format!("{path}:{name}"), contract_identifiers); @@ -335,7 +292,7 @@ impl SolidityCompiler { /// Get the last contract from the solc output. /// fn get_last_contract( - solc_output: &compiler_solidity::SolcStandardJsonOutput, + solc_output: &era_compiler_solidity::SolcStandardJsonOutput, sources: &[(String, String)], ) -> anyhow::Result { solc_output @@ -366,11 +323,7 @@ impl SolidityCompiler { } impl Compiler for SolidityCompiler { - fn modes(&self) -> Vec { - MODES.clone() - } - - fn compile( + fn compile_for_eravm( &self, test_path: String, sources: Vec<(String, String)>, @@ -378,11 +331,11 @@ impl Compiler for SolidityCompiler { mode: &Mode, is_system_mode: bool, is_system_contracts_mode: bool, - debug_config: Option, - ) -> anyhow::Result { + debug_config: Option, + ) -> anyhow::Result { let mode = SolidityMode::unwrap(mode); - let solc_output = self + let mut solc_output = self .run_solc_cached( test_path, &sources, @@ -414,20 +367,131 @@ impl Compiler for SolidityCompiler { let last_contract = Self::get_last_contract(&solc_output, &sources) .map_err(|error| anyhow::anyhow!("Failed to get last contract: {}", error))?; - let builds = Self::compile( - solc_output, - sources, + let project = solc_output.try_to_project( + sources.into_iter().collect::>(), libraries, - mode, + mode.solc_pipeline, + &era_compiler_solidity::SolcVersion::new_simple(mode.solc_version.to_owned()), + debug_config.as_ref(), + )?; + + let build = project.compile_to_eravm( + mode.llvm_optimizer_settings.to_owned(), is_system_mode, + false, + zkevm_assembly::get_encoding_mode(), debug_config, - ) - .map_err(|error| anyhow::anyhow!("Failed to compile the contracts: {}", error))?; + )?; + build.write_to_standard_json( + &mut solc_output, + &era_compiler_solidity::SolcVersion::new( + mode.solc_version.to_string(), + mode.solc_version.to_owned(), + None, + ), + &semver::Version::new(0, 0, 0), + )?; - Ok(Output::new(builds, Some(method_identifiers), last_contract)) + let builds: HashMap = solc_output + .contracts + .expect("Always exists") + .into_iter() + .flat_map(|(file_name, file)| { + file.into_iter() + .filter_map(|(contract_name, contract)| { + let name = format!("{}:{}", file_name, contract_name); + let evm = contract.evm.expect("Always exists"); + let assembly = + zkevm_assembly::Assembly::from_string(evm.assembly_text?, None) + .expect("Always valid"); + let build = match contract.hash { + Some(bytecode_hash) => { + EraVMBuild::new_with_hash(assembly, bytecode_hash) + .expect("Always valid") + } + None => EraVMBuild::new(assembly).expect("Always valid"), + }; + Some((name, build)) + }) + .collect::>() + }) + .collect(); + + Ok(EraVMInput::new( + builds, + Some(method_identifiers), + last_contract, + )) + } + + fn compile_for_evm( + &self, + test_path: String, + sources: Vec<(String, String)>, + libraries: BTreeMap>, + mode: &Mode, + debug_config: Option, + ) -> anyhow::Result { + let mode = SolidityMode::unwrap(mode); + + let mut solc_output = self + .run_solc_cached(test_path, &sources, &libraries, mode, false) + .map_err(|error| anyhow::anyhow!("Failed to run solc: {}", error))?; + + if let Some(errors) = solc_output.errors.as_deref() { + let mut has_errors = false; + let mut error_messages = Vec::with_capacity(errors.len()); + + for error in errors.iter() { + if error.severity.as_str() == "error" { + has_errors = true; + error_messages.push(error.formatted_message.to_owned()); + } + } + + if has_errors { + anyhow::bail!("Errors found: {:?}", error_messages); + } + } + + let method_identifiers = Self::get_method_identifiers(&solc_output) + .map_err(|error| anyhow::anyhow!("Failed to get method identifiers: {}", error))?; + + let last_contract = Self::get_last_contract(&solc_output, &sources) + .map_err(|error| anyhow::anyhow!("Failed to get last contract: {}", error))?; + + let project = solc_output.try_to_project( + sources.into_iter().collect::>(), + libraries, + mode.solc_pipeline, + &era_compiler_solidity::SolcVersion::new_simple(mode.solc_version.to_owned()), + debug_config.as_ref(), + )?; + + let build = + project.compile_to_evm(mode.llvm_optimizer_settings.to_owned(), false, debug_config)?; + + let builds: HashMap = build + .contracts + .into_iter() + .map(|(path, contract)| { + let build = EVMBuild::new(contract.deploy_build, contract.runtime_build); + (path, build) + }) + .collect::>(); + + Ok(EVMInput::new( + builds, + Some(method_identifiers), + last_contract, + )) + } + + fn modes(&self) -> Vec { + MODES.clone() } - fn has_many_contracts(&self) -> bool { + fn has_multiple_contracts(&self) -> bool { true } } diff --git a/compiler_tester/src/compilers/solidity/solc_cache_key.rs b/compiler_tester/src/compilers/solidity/solc_cache_key.rs index 4860d539..a2a047ba 100644 --- a/compiler_tester/src/compilers/solidity/solc_cache_key.rs +++ b/compiler_tester/src/compilers/solidity/solc_cache_key.rs @@ -12,7 +12,7 @@ pub struct SolcCacheKey { /// The Solidity compiler version. pub version: semver::Version, /// The Solidity compiler output type. - pub pipeline: compiler_solidity::SolcPipeline, + pub pipeline: era_compiler_solidity::SolcPipeline, /// Whether to enable the EVMLA codegen via Yul IR. pub via_ir: bool, /// Whether to run the Solidity compiler optimizer. @@ -26,7 +26,7 @@ impl SolcCacheKey { pub fn new( test_path: String, version: semver::Version, - pipeline: compiler_solidity::SolcPipeline, + pipeline: era_compiler_solidity::SolcPipeline, via_ir: bool, optimize: bool, ) -> Self { diff --git a/compiler_tester/src/compilers/vyper/mod.rs b/compiler_tester/src/compilers/vyper/mod.rs index 42e0bc6f..1bba62d1 100644 --- a/compiler_tester/src/compilers/vyper/mod.rs +++ b/compiler_tester/src/compilers/vyper/mod.rs @@ -15,9 +15,9 @@ use itertools::Itertools; use super::cache::Cache; use super::mode::vyper::Mode as VyperMode; use super::mode::Mode; -use super::output::build::Build as EraVMContractBuild; -use super::output::Output; use super::Compiler; +use crate::vm::eravm::input::build::Build as EraVMBuild; +use crate::vm::eravm::input::Input as EraVMInput; use self::vyper_cache_key::VyperCacheKey; @@ -26,7 +26,7 @@ use self::vyper_cache_key::VyperCacheKey; /// pub struct VyperCompiler { /// The vyper process output cache. - cache: Cache, + cache: Cache, } lazy_static::lazy_static! { @@ -36,7 +36,7 @@ lazy_static::lazy_static! { static ref MODES: Vec = { let vyper_versions = VyperCompiler::all_versions().expect("`vyper` versions analysis error"); - compiler_llvm_context::OptimizerSettings::combinations() + era_compiler_llvm_context::OptimizerSettings::combinations() .into_iter() .cartesian_product(vyper_versions) .cartesian_product(vec![false, true]) @@ -65,8 +65,12 @@ impl VyperCompiler { /// /// Returns the Vyper compiler instance by version. /// - fn get_vyper_by_version(version: &semver::Version) -> compiler_vyper::VyperCompiler { - compiler_vyper::VyperCompiler::new(format!("{}/vyper-{}", Self::DIRECTORY, version)) + fn get_vyper_by_version( + version: &semver::Version, + ) -> anyhow::Result { + era_compiler_vyper::VyperCompiler::new( + format!("{}/vyper-{}", Self::DIRECTORY, version).as_str(), + ) } /// @@ -111,8 +115,8 @@ impl VyperCompiler { fn run_vyper( sources: &[(String, String)], mode: &VyperMode, - ) -> anyhow::Result { - let vyper = Self::get_vyper_by_version(&mode.vyper_version); + ) -> anyhow::Result { + let vyper = Self::get_vyper_by_version(&mode.vyper_version)?; let paths = sources .iter() @@ -121,7 +125,14 @@ impl VyperCompiler { }) .collect::>>()?; - vyper.batch(&mode.vyper_version, paths, mode.vyper_optimize) + // TODO: set Cancun for v0.3.10 + let evm_version = if mode.vyper_version == semver::Version::new(0, 3, 10) { + Some(era_compiler_common::EVMVersion::Shanghai) + } else { + None + }; + + vyper.batch(&mode.vyper_version, paths, evm_version, mode.vyper_optimize) } /// @@ -132,7 +143,7 @@ impl VyperCompiler { test_path: String, sources: &[(String, String)], mode: &VyperMode, - ) -> anyhow::Result { + ) -> anyhow::Result { let cache_key = VyperCacheKey::new(test_path, mode.vyper_version.clone(), mode.vyper_optimize); @@ -148,11 +159,12 @@ impl VyperCompiler { /// Compile the vyper project. /// fn compile( - project: compiler_vyper::Project, + project: era_compiler_vyper::Project, mode: &VyperMode, - debug_config: Option, - ) -> anyhow::Result> { + debug_config: Option, + ) -> anyhow::Result> { let build = project.compile( + None, mode.llvm_optimizer_settings.to_owned(), true, zkevm_assembly::get_encoding_mode(), @@ -170,7 +182,7 @@ impl VyperCompiler { .expect("Always valid"); Ok(( path, - EraVMContractBuild::new_with_hash(assembly, contract.build.bytecode_hash)?, + EraVMBuild::new_with_hash(assembly, contract.build.bytecode_hash)?, )) }) .collect() @@ -180,21 +192,24 @@ impl VyperCompiler { /// Get the method identifiers from the solc output. /// fn get_method_identifiers( - project: &compiler_vyper::Project, + project: &era_compiler_vyper::Project, ) -> anyhow::Result>> { let mut method_identifiers = BTreeMap::new(); for (path, contract) in project.contracts.iter() { let contract_abi = match contract { - compiler_vyper::Contract::Vyper(inner) => &inner.abi, - compiler_vyper::Contract::LLVMIR(_inner) => panic!("Only used in the Vyper CLI"), - compiler_vyper::Contract::ZKASM(_inner) => panic!("Only used in the Vyper CLI"), + era_compiler_vyper::Contract::Vyper(inner) => &inner.abi, + era_compiler_vyper::Contract::LLVMIR(_inner) => { + panic!("Only used in the Vyper CLI") + } + era_compiler_vyper::Contract::ZKASM(_inner) => panic!("Only used in the Vyper CLI"), }; let mut contract_identifiers = BTreeMap::new(); for (entry, hash) in contract_abi.iter() { - let selector = u32::from_str_radix(&hash[2..], compiler_common::BASE_HEXADECIMAL) - .map_err(|error| { - anyhow::anyhow!("Invalid selector from the Vyper compiler: {}", error) - })?; + let selector = + u32::from_str_radix(&hash[2..], era_compiler_common::BASE_HEXADECIMAL) + .map_err(|error| { + anyhow::anyhow!("Invalid selector from the Vyper compiler: {}", error) + })?; contract_identifiers.insert(entry.clone(), selector); } method_identifiers.insert(path.clone(), contract_identifiers); @@ -207,23 +222,30 @@ impl VyperCompiler { /// fn dump_lll( sources: &[(String, String)], - debug_config: &compiler_llvm_context::DebugConfig, + debug_config: &era_compiler_llvm_context::DebugConfig, mode: &VyperMode, ) -> anyhow::Result<()> { - let vyper = Self::get_vyper_by_version(&mode.vyper_version); + let vyper = Self::get_vyper_by_version(&mode.vyper_version)?; + + // TODO: set Cancun for v0.3.10 + let evm_version = if mode.vyper_version == semver::Version::new(0, 3, 10) { + Some(era_compiler_common::EVMVersion::Shanghai) + } else { + None + }; let lll = sources .iter() .map(|(path_str, _)| { let path = Path::new(path_str.as_str()); vyper - .lll_debug(path, mode.vyper_optimize) + .lll_debug(path, evm_version, mode.vyper_optimize) .map(|lll| (path_str.to_string(), lll)) }) .collect::>>()?; for (path, lll) in lll.iter() { - debug_config.dump_lll(path, lll)?; + debug_config.dump_lll(path, None, lll)?; } Ok(()) @@ -231,11 +253,7 @@ impl VyperCompiler { } impl Compiler for VyperCompiler { - fn modes(&self) -> Vec { - MODES.clone() - } - - fn compile( + fn compile_for_eravm( &self, test_path: String, sources: Vec<(String, String)>, @@ -243,8 +261,8 @@ impl Compiler for VyperCompiler { mode: &Mode, _is_system_mode: bool, _is_system_contracts_mode: bool, - debug_config: Option, - ) -> anyhow::Result { + debug_config: Option, + ) -> anyhow::Result { let mode = VyperMode::unwrap(mode); if let Some(ref debug_config) = debug_config { @@ -267,10 +285,29 @@ impl Compiler for VyperCompiler { let builds = Self::compile(project, mode, debug_config) .map_err(|error| anyhow::anyhow!("Failed to compile the contracts: {}", error))?; - Ok(Output::new(builds, Some(method_identifiers), last_contract)) + Ok(EraVMInput::new( + builds, + Some(method_identifiers), + last_contract, + )) + } + + fn compile_for_evm( + &self, + test_path: String, + sources: Vec<(String, String)>, + libraries: BTreeMap>, + mode: &Mode, + debug_config: Option, + ) -> anyhow::Result { + todo!() + } + + fn modes(&self) -> Vec { + MODES.clone() } - fn has_many_contracts(&self) -> bool { + fn has_multiple_contracts(&self) -> bool { false } } diff --git a/compiler_tester/src/compilers/yul.rs b/compiler_tester/src/compilers/yul.rs index bfb8d6d0..8208185d 100644 --- a/compiler_tester/src/compilers/yul.rs +++ b/compiler_tester/src/compilers/yul.rs @@ -8,14 +8,17 @@ use std::path::PathBuf; use super::mode::yul::Mode as YulMode; use super::mode::Mode; -use super::output::build::Build as EraVMContractBuild; -use super::output::Output; use super::solidity::SolidityCompiler; use super::Compiler; +use crate::vm::eravm::input::build::Build as EraVMBuild; +use crate::vm::eravm::input::Input as EraVMInput; +use crate::vm::evm::input::build::Build as EVMBuild; +use crate::vm::evm::input::Input as EVMInput; /// /// The Yul compiler. /// +#[derive(Default)] pub struct YulCompiler; lazy_static::lazy_static! { @@ -23,28 +26,15 @@ lazy_static::lazy_static! { /// The Yul compiler supported modes. /// static ref MODES: Vec = { - compiler_llvm_context::OptimizerSettings::combinations() + era_compiler_llvm_context::OptimizerSettings::combinations() .into_iter() .map(|llvm_optimizer_settings| YulMode::new(llvm_optimizer_settings).into()) .collect::>() }; } -impl YulCompiler { - /// - /// A shortcut constructor. - /// - pub fn new() -> Self { - Self - } -} - impl Compiler for YulCompiler { - fn modes(&self) -> Vec { - MODES.clone() - } - - fn compile( + fn compile_for_eravm( &self, _test_path: String, sources: Vec<(String, String)>, @@ -52,27 +42,27 @@ impl Compiler for YulCompiler { mode: &Mode, is_system_mode: bool, _is_system_contracts_mode: bool, - debug_config: Option, - ) -> anyhow::Result { + debug_config: Option, + ) -> anyhow::Result { let mode = YulMode::unwrap(mode); let solc_validator = if is_system_mode { None } else { - Some(SolidityCompiler::get_system_contract_solc()) + Some(SolidityCompiler::get_system_contract_solc()?) }; let builds = sources .iter() .map(|(path, source)| { - let project = compiler_solidity::Project::try_from_yul_string( + let project = era_compiler_solidity::Project::try_from_yul_string( PathBuf::from(path.as_str()).as_path(), source.as_str(), solc_validator.as_ref(), )?; let contract = project - .compile( + .compile_to_eravm( mode.llvm_optimizer_settings.to_owned(), is_system_mode, true, @@ -90,11 +80,10 @@ impl Compiler for YulCompiler { ) .expect("Always valid"); - let build = - EraVMContractBuild::new_with_hash(assembly, contract.build.bytecode_hash)?; + let build = EraVMBuild::new_with_hash(assembly, contract.build.bytecode_hash)?; Ok((path.to_owned(), build)) }) - .collect::>>()?; + .collect::>>()?; let last_contract = sources .last() @@ -102,10 +91,61 @@ impl Compiler for YulCompiler { .0 .clone(); - Ok(Output::new(builds, None, last_contract)) + Ok(EraVMInput::new(builds, None, last_contract)) + } + + fn compile_for_evm( + &self, + _test_path: String, + sources: Vec<(String, String)>, + _libraries: BTreeMap>, + mode: &Mode, + debug_config: Option, + ) -> anyhow::Result { + let mode = YulMode::unwrap(mode); + + let solc_validator = Some(SolidityCompiler::get_system_contract_solc()?); + + let builds = sources + .iter() + .map(|(path, source)| { + let project = era_compiler_solidity::Project::try_from_yul_string( + PathBuf::from(path.as_str()).as_path(), + source.as_str(), + solc_validator.as_ref(), + )?; + + let contract = project + .compile_to_evm( + mode.llvm_optimizer_settings.to_owned(), + true, + debug_config.clone(), + )? + .contracts + .remove(path) + .ok_or_else(|| { + anyhow::anyhow!("Contract `{}` not found in yul project", path) + })?; + + let build = EVMBuild::new(contract.deploy_build, contract.runtime_build); + Ok((path.to_owned(), build)) + }) + .collect::>>()?; + + let last_contract = sources + .last() + .ok_or_else(|| anyhow::anyhow!("Sources is empty"))? + .0 + .clone(); + + Ok(EVMInput::new(builds, None, last_contract)) + } + + fn modes(&self) -> Vec { + MODES.clone() } - fn has_many_contracts(&self) -> bool { + fn has_multiple_contracts(&self) -> bool { false } } diff --git a/compiler_tester/src/deployers/address_predictor.rs b/compiler_tester/src/deployers/address_predictor.rs deleted file mode 100644 index 3f9508ff..00000000 --- a/compiler_tester/src/deployers/address_predictor.rs +++ /dev/null @@ -1,73 +0,0 @@ -//! -//! The deploy address predictor. -//! - -use std::collections::HashMap; -use std::str::FromStr; - -/// -/// The deploy address predictor. -/// -#[derive(Debug, Clone)] -pub struct AddressPredictor { - /// The accounts create nonces. - nonces: HashMap, -} - -impl AddressPredictor { - /// The create prefix. - const CREATE_PREFIX: &'static str = - "63bae3a9951d38e8a3fbb7b70909afc1200610fc5bc55ade242f815974674f23"; // keccak256("zksyncCreate") -} - -impl AddressPredictor { - /// - /// Create new address predictor instance. - /// - pub fn new() -> Self { - Self { - nonces: HashMap::new(), - } - } - - /// - /// Get the next deploy address (without nonce incrementing). - /// - pub fn advance_next_address(&self, caller: &web3::types::Address) -> web3::types::Address { - let nonce = self.nonces.get(caller).cloned().unwrap_or_default(); - - let mut bytes = web3::types::H256::from_str(Self::CREATE_PREFIX) - .expect("Invalid constant create prefix") - .as_bytes() - .to_vec(); - bytes.extend( - [0; compiler_common::BYTE_LENGTH_FIELD - compiler_common::BYTE_LENGTH_ETH_ADDRESS], - ); - bytes.extend(caller.to_fixed_bytes()); - bytes.extend([0; compiler_common::BYTE_LENGTH_FIELD - std::mem::size_of::()]); - bytes.extend(nonce.to_be_bytes()); - - let address = web3::types::Address::from_slice( - &web3::signing::keccak256(bytes.as_slice()) - [compiler_common::BYTE_LENGTH_FIELD - compiler_common::BYTE_LENGTH_ETH_ADDRESS..], - ); - address - } - - /// - /// Increments caller nonce. - /// - pub fn increment_nonce(&mut self, caller: web3::types::Address) { - let nonce = self.nonces.entry(caller).or_insert(0); - *nonce += 1; - } - - /// - /// Get the next deploy address (increments nonce when called). - /// - pub fn next_address(&mut self, caller: web3::types::Address) -> web3::types::Address { - let address = self.advance_next_address(&caller); - self.increment_nonce(caller); - address - } -} diff --git a/compiler_tester/src/directories/ethereum/test.rs b/compiler_tester/src/directories/ethereum/test.rs index 5e576036..b49f874f 100644 --- a/compiler_tester/src/directories/ethereum/test.rs +++ b/compiler_tester/src/directories/ethereum/test.rs @@ -9,13 +9,16 @@ use std::sync::Mutex; use crate::compilers::mode::Mode; use crate::compilers::Compiler; -use crate::deployers::address_predictor::AddressPredictor; use crate::directories::Buildable; use crate::filters::Filters; use crate::summary::Summary; use crate::test::case::Case; +use crate::test::eravm::Test as EraVMTest; +use crate::test::evm::Test as EVMTest; use crate::test::instance::Instance; -use crate::test::Test; +use crate::vm::eravm::deployers::address_predictor::AddressPredictor as EraVMAddressPredictor; +use crate::vm::evm::address_predictor::AddressPredictor as EVMAddressPredictor; +use crate::vm::AddressPredictorIterator; /// /// The Ethereum compiler test. @@ -59,14 +62,14 @@ impl EthereumTest { } impl Buildable for EthereumTest { - fn build( + fn build_for_eravm( &self, mode: Mode, compiler: Arc, summary: Arc>, filters: &Filters, - debug_config: Option, - ) -> Option { + debug_config: Option, + ) -> Option { let test_path = self.index_entity.path.to_string_lossy().to_string(); if !filters.check_mode(&mode) { @@ -120,13 +123,13 @@ impl Buildable for EthereumTest { } }; - let mut address_predictor = AddressPredictor::new(); + let mut address_predictor = EraVMAddressPredictor::new(); let mut contract_address = None; let mut caller = solidity_adapter::account_address(solidity_adapter::DEFAULT_ACCOUNT_INDEX); - let mut libraries_for_compiler = BTreeMap::new(); let mut libraries_addresses = HashMap::new(); + let mut libraries = BTreeMap::new(); for call in calls.iter() { match call { @@ -140,12 +143,12 @@ impl Buildable for EthereumTest { ); return None; } - contract_address = Some(address_predictor.next_address(caller)); + contract_address = Some(address_predictor.next(&caller, true)); } solidity_adapter::FunctionCall::Library { name, source } => { let source = source.clone().unwrap_or_else(|| last_source.clone()); - let address = address_predictor.next_address(caller); - libraries_for_compiler + let address = address_predictor.next(&caller, true); + libraries .entry(source.clone()) .or_insert_with(BTreeMap::new) .insert( @@ -178,10 +181,10 @@ impl Buildable for EthereumTest { let contract_address = contract_address.expect("Always valid"); let compiler_output = match compiler - .compile( + .compile_for_eravm( test_path.clone(), self.test.sources.clone(), - libraries_for_compiler, + libraries, &mode, false, false, @@ -256,7 +259,215 @@ impl Buildable for EthereumTest { .map(|build| (build.bytecode_hash, build.assembly)) .collect(); - Some(Test::new( + Some(EraVMTest::new( + test_path, + self.index_entity.group.clone(), + mode, + builds, + vec![case], + )) + } + + fn build_for_evm( + &self, + mode: Mode, + compiler: Arc, + summary: Arc>, + filters: &Filters, + debug_config: Option, + ) -> Option { + let test_path = self.index_entity.path.to_string_lossy().to_string(); + + if !filters.check_mode(&mode) { + return None; + } + + if let Some(filters) = self.index_entity.modes.as_ref() { + if !mode.check_extended_filters(filters.as_slice()) { + return None; + } + } + + if let Some(versions) = self.index_entity.version.as_ref() { + if !mode.check_version(versions) { + return None; + } + } + + if !mode.check_ethereum_tests_params(&self.test.params) { + return None; + } + + let mut calls = self.test.calls.clone(); + if !calls + .iter() + .any(|call| matches!(call, solidity_adapter::FunctionCall::Constructor { .. })) + { + let constructor = solidity_adapter::FunctionCall::Constructor { + calldata: vec![], + value: None, + events: vec![], + gas_options: vec![], + }; + let constructor_insert_index = calls + .iter() + .position(|call| !matches!(call, solidity_adapter::FunctionCall::Library { .. })) + .unwrap_or(calls.len()); + calls.insert(constructor_insert_index, constructor); + } + + let last_source = match self.test.sources.last() { + Some(last_source) => last_source.0.clone(), + None => { + Summary::invalid( + summary, + Some(mode), + test_path, + anyhow::anyhow!("Sources is empty"), + ); + return None; + } + }; + + let mut address_predictor = EVMAddressPredictor::new(); + + let mut contract_address = None; + let mut caller = solidity_adapter::account_address(solidity_adapter::DEFAULT_ACCOUNT_INDEX); + + let mut libraries_addresses = HashMap::new(); + let mut libraries = BTreeMap::new(); + + for call in calls.iter() { + match call { + solidity_adapter::FunctionCall::Constructor { .. } => { + if contract_address.is_some() { + Summary::invalid( + summary, + Some(mode), + test_path, + anyhow::anyhow!("Two constructors in test"), + ); + return None; + } + contract_address = Some(address_predictor.next(&caller, true)); + } + solidity_adapter::FunctionCall::Library { name, source } => { + let source = source.clone().unwrap_or_else(|| last_source.clone()); + let address = address_predictor.next(&caller, true); + libraries + .entry(source.clone()) + .or_insert_with(BTreeMap::new) + .insert( + name.clone(), + format!("0x{}", crate::utils::address_as_string(&address)), + ); + libraries_addresses.insert(format!("{source}:{name}"), address); + } + solidity_adapter::FunctionCall::Account { input, expected } => { + let address = solidity_adapter::account_address(*input); + if !expected.eq(&address) { + Summary::invalid( + summary, + Some(mode), + test_path, + anyhow::anyhow!( + "Expected address: {}, but found {}", + expected, + address + ), + ); + return None; + } + caller = address; + } + _ => {} + } + } + + let contract_address = contract_address.expect("Always valid"); + + let compiler_output = match compiler + .compile_for_evm( + test_path.clone(), + self.test.sources.clone(), + libraries, + &mode, + debug_config, + ) + .map_err(|error| anyhow::anyhow!("Failed to compile sources: {}", error)) + { + Ok(output) => output, + Err(error) => { + Summary::invalid(summary, Some(mode), test_path, error); + return None; + } + }; + + let main_contract = compiler_output.last_contract; + + let main_contract_build = match compiler_output + .builds + .get(main_contract.as_str()) + .ok_or_else(|| { + anyhow::anyhow!("Main contract not found in the compiler build artifacts") + }) { + Ok(build) => build, + Err(error) => { + Summary::invalid(summary, Some(mode), test_path, error); + return None; + } + }; + let main_contract_instance = Instance::new( + main_contract, + Some(contract_address), + web3::types::U256::zero(), + ); + + let mut libraries_instances = HashMap::with_capacity(libraries_addresses.len()); + + for (library_name, library_address) in libraries_addresses { + let build = match compiler_output.builds.get(&library_name).ok_or_else(|| { + anyhow::anyhow!( + "Library {} not found in the compiler build artifacts", + library_name + ) + }) { + Ok(build) => build, + Err(error) => { + Summary::invalid(summary, Some(mode), test_path, error); + return None; + } + }; + libraries_instances.insert( + library_name.clone(), + Instance::new( + library_name, + Some(library_address), + web3::types::U256::zero(), + ), + ); + } + + let case = match Case::try_from_ethereum( + &calls, + &main_contract_instance, + &libraries_instances, + &last_source, + ) { + Ok(case) => case, + Err(error) => { + Summary::invalid(summary, Some(mode), test_path, error); + return None; + } + }; + + let builds = compiler_output + .builds + .into_values() + .map(|build| (web3::types::Address::zero(), build)) + .collect(); + + Some(EVMTest::new( test_path, self.index_entity.group.clone(), mode, diff --git a/compiler_tester/src/directories/matter_labs/test/metadata/case/mod.rs b/compiler_tester/src/directories/matter_labs/test/metadata/case/mod.rs index fb86f128..62e531bd 100644 --- a/compiler_tester/src/directories/matter_labs/test/metadata/case/mod.rs +++ b/compiler_tester/src/directories/matter_labs/test/metadata/case/mod.rs @@ -11,7 +11,7 @@ use std::str::FromStr; use serde::Deserialize; use crate::compilers::mode::Mode; -use crate::deployers::address_predictor::AddressPredictor; +use crate::vm::AddressPredictorIterator; use self::input::expected::Expected; use self::input::Input; @@ -98,12 +98,15 @@ impl Case { /// /// Returns all the instances addresses, except libraries. /// - pub fn instances_addresses( + pub fn instance_addresses( &self, libraries: &BTreeSet, - address_predictor: &mut AddressPredictor, + address_predictor: &mut API, mode: &Mode, - ) -> anyhow::Result> { + ) -> anyhow::Result> + where + API: AddressPredictorIterator, + { let mut instances_addresses = HashMap::new(); for (index, input) in self.inputs.iter().enumerate() { if !input.method.eq("#deployer") { @@ -114,24 +117,17 @@ impl Case { continue; } let exception = match input.expected.as_ref() { - Some(expected) => expected.exception(mode).map_err(|error| { - anyhow::anyhow!("Input {}(After adding deployer calls): {}", index, error) - })?, + Some(expected) => expected + .exception(mode) + .map_err(|error| anyhow::anyhow!("Input #{}: {}", index, error))?, None => false, }; if exception { continue; } - let caller = - web3::types::Address::from_str(input.caller.as_str()).map_err(|error| { - anyhow::anyhow!( - "Input {}(After adding deployer calls): Invalid caller: {}", - index, - error - ) - })?; - instances_addresses - .insert(instance.to_string(), address_predictor.next_address(caller)); + let caller = web3::types::Address::from_str(input.caller.as_str()) + .map_err(|error| anyhow::anyhow!("Input #{}: invalid caller: {}", index, error))?; + instances_addresses.insert(instance.to_string(), address_predictor.next(&caller, true)); } Ok(instances_addresses) } diff --git a/compiler_tester/src/directories/matter_labs/test/mod.rs b/compiler_tester/src/directories/matter_labs/test/mod.rs index d90a841d..a79a9ebd 100644 --- a/compiler_tester/src/directories/matter_labs/test/mod.rs +++ b/compiler_tester/src/directories/matter_labs/test/mod.rs @@ -15,13 +15,16 @@ use std::sync::Mutex; use crate::compilers::mode::Mode; use crate::compilers::Compiler; -use crate::deployers::address_predictor::AddressPredictor; use crate::directories::Buildable; use crate::filters::Filters; use crate::summary::Summary; use crate::test::case::Case; +use crate::test::eravm::Test as EraVMTest; +use crate::test::evm::Test as EVMTest; use crate::test::instance::Instance; -use crate::test::Test; +use crate::vm::eravm::deployers::address_predictor::AddressPredictor as EraVMAddressPredictor; +use crate::vm::evm::address_predictor::AddressPredictor as EVMAddressPredictor; +use crate::vm::AddressPredictorIterator; use self::metadata::Metadata; @@ -164,14 +167,14 @@ impl MatterLabsTest { } impl Buildable for MatterLabsTest { - fn build( + fn build_for_eravm( &self, mode: Mode, compiler: Arc, summary: Arc>, filters: &Filters, - debug_config: Option, - ) -> Option { + debug_config: Option, + ) -> Option { let test_path = self.path.to_string_lossy().to_string(); if !filters.check_mode(&mode) { return None; @@ -189,7 +192,7 @@ impl Buildable for MatterLabsTest { let mut contracts = self.metadata.contracts.clone(); if contracts.is_empty() { - let contract_name = if compiler.has_many_contracts() { + let contract_name = if compiler.has_multiple_contracts() { format!("{}:{}", test_path, SIMPLE_TESTS_CONTRACT_NAME) } else { test_path.clone() @@ -197,7 +200,7 @@ impl Buildable for MatterLabsTest { contracts.insert(SIMPLE_TESTS_INSTANCE.to_owned(), contract_name); } - let mut address_predictor = AddressPredictor::new(); + let mut address_predictor = EraVMAddressPredictor::new(); let mut libraries_instances_names = Vec::new(); let mut libraries_for_compiler = BTreeMap::new(); @@ -209,9 +212,10 @@ impl Buildable for MatterLabsTest { file_path.push(file); let mut file_libraries = BTreeMap::new(); for (name, instance) in metadata_file_libraries.iter() { - let address = address_predictor.next_address( - web3::types::Address::from_str(DEFAULT_CALLER_ADDRESS) + let address = address_predictor.next( + &web3::types::Address::from_str(DEFAULT_CALLER_ADDRESS) .expect("Invalid default caller address constant"), + true, ); file_libraries.insert( name.to_owned(), @@ -223,8 +227,8 @@ impl Buildable for MatterLabsTest { libraries_for_compiler.insert(file_path.to_string_lossy().to_string(), file_libraries); } - let compiler_output = match compiler - .compile( + let vm_input = match compiler + .compile_for_eravm( test_path.clone(), self.sources.clone(), libraries_for_compiler, @@ -246,7 +250,7 @@ impl Buildable for MatterLabsTest { let mut instances = HashMap::new(); for (instance, path) in contracts.into_iter() { - let build = match compiler_output.builds.get(&path).ok_or_else(|| { + let build = match vm_input.builds.get(&path).ok_or_else(|| { anyhow::anyhow!("{} not found in the compiler build artifacts", path) }) { Ok(build) => build, @@ -281,7 +285,7 @@ impl Buildable for MatterLabsTest { let mut address_predictor = address_predictor.clone(); let instances_addresses = match case - .instances_addresses( + .instance_addresses( &libraries_instances_names.clone().into_iter().collect(), &mut address_predictor, &mode, @@ -311,7 +315,7 @@ impl Buildable for MatterLabsTest { &case, &mode, &instances, - &compiler_output.method_identifiers, + &vm_input.method_identifiers, ) .map_err(|error| anyhow::anyhow!("Case `{}` is invalid: {}", case.name, error)) { @@ -325,13 +329,190 @@ impl Buildable for MatterLabsTest { cases.push(case); } - let builds = compiler_output + let builds = vm_input .builds .into_values() .map(|build| (build.bytecode_hash, build.assembly)) .collect(); - Some(Test::new( + Some(EraVMTest::new( + test_path, + self.metadata.group.clone(), + mode, + builds, + cases, + )) + } + + fn build_for_evm( + &self, + mode: Mode, + compiler: Arc, + summary: Arc>, + filters: &Filters, + debug_config: Option, + ) -> Option { + let test_path = self.path.to_string_lossy().to_string(); + if !filters.check_mode(&mode) { + return None; + } + + if let Some(filters) = self.metadata.modes.as_ref() { + if !mode.check_extended_filters(filters.as_slice()) { + return None; + } + } + + if !mode.check_pragmas(&self.sources) { + return None; + } + + let mut contracts = self.metadata.contracts.clone(); + if contracts.is_empty() { + let contract_name = if compiler.has_multiple_contracts() { + format!("{}:{}", test_path, SIMPLE_TESTS_CONTRACT_NAME) + } else { + test_path.clone() + }; + contracts.insert(SIMPLE_TESTS_INSTANCE.to_owned(), contract_name); + } + + let mut address_predictor = EVMAddressPredictor::new(); + + let mut libraries_instances_names = Vec::new(); + let mut libraries_for_compiler = BTreeMap::new(); + let mut libraries_instances_addresses = HashMap::new(); + + for (file, metadata_file_libraries) in self.metadata.libraries.iter() { + let mut file_path = self.path.clone(); + file_path.pop(); + file_path.push(file); + let mut file_libraries = BTreeMap::new(); + for (name, instance) in metadata_file_libraries.iter() { + let address = address_predictor.next( + &web3::types::Address::from_str(DEFAULT_CALLER_ADDRESS) + .expect("Invalid default caller address constant"), + true, + ); + file_libraries.insert( + name.to_owned(), + format!("0x{}", crate::utils::address_as_string(&address)), + ); + libraries_instances_addresses.insert(instance.to_owned(), address); + libraries_instances_names.push(instance.to_owned()); + } + libraries_for_compiler.insert(file_path.to_string_lossy().to_string(), file_libraries); + } + + let mut vm_input = match compiler + .compile_for_evm( + test_path.clone(), + self.sources.clone(), + BTreeMap::new(), + &mode, + debug_config, + ) + .map_err(|error| anyhow::anyhow!("Failed to compile sources: {}", error)) + { + Ok(output) => output, + Err(error) => { + Summary::invalid(summary, Some(mode), test_path, error); + return None; + } + }; + + let instances_names = contracts.keys().cloned().collect::>(); + let mut instances = HashMap::new(); + + for (instance, path) in contracts.into_iter() { + let build = match vm_input.builds.get_mut(&path).ok_or_else(|| { + anyhow::anyhow!("{} not found in the compiler build artifacts", path) + }) { + Ok(build) => build, + Err(error) => { + Summary::invalid(summary, Some(mode), test_path, error); + return None; + } + }; + let address = libraries_instances_addresses.get(&instance).cloned(); + instances.insert( + instance, + Instance::new(path, address, web3::types::U256::zero()), + ); + } + + let mut cases = Vec::with_capacity(self.metadata.cases.len()); + for case in self.metadata.cases.iter() { + if let Some(filters) = case.modes.as_ref() { + if !mode.check_extended_filters(filters.as_slice()) { + continue; + } + } + + let mut case = case.clone(); + match case.normalize_deployer_calls(&instances_names, &libraries_instances_names) { + Ok(_) => {} + Err(error) => { + Summary::invalid(summary, Some(mode), test_path, error); + return None; + } + } + case.normalize_expected(); + + let mut address_predictor = address_predictor.clone(); + + let instances_addresses = match case + .instance_addresses( + &libraries_instances_names.clone().into_iter().collect(), + &mut address_predictor, + &mode, + ) + .map_err(|error| { + anyhow::anyhow!( + "Case `{}` is invalid: Failed to compute instances addresses: {}", + case.name, + error + ) + }) { + Ok(addresses) => addresses, + Err(error) => { + Summary::invalid(summary, Some(mode), test_path, error); + return None; + } + }; + let mut instances = instances.clone(); + for (instance, address) in instances_addresses { + let instance = instances + .get_mut(&instance) + .expect("Redundant instance from the instances_addresses case method"); + instance.address = Some(address); + } + + let case = match Case::try_from_matter_labs( + &case, + &mode, + &instances, + &vm_input.method_identifiers, + ) + .map_err(|error| anyhow::anyhow!("Case `{}` is invalid: {}", case.name, error)) + { + Ok(case) => case, + Err(error) => { + Summary::invalid(summary, Some(mode), test_path, error); + return None; + } + }; + + cases.push(case); + } + + let builds = vm_input + .builds + .into_values() + .map(|build| (web3::types::Address::zero(), build)) + .collect(); + + Some(EVMTest::new( test_path, self.metadata.group.clone(), mode, diff --git a/compiler_tester/src/directories/mod.rs b/compiler_tester/src/directories/mod.rs index f44e84be..66e5759e 100644 --- a/compiler_tester/src/directories/mod.rs +++ b/compiler_tester/src/directories/mod.rs @@ -13,23 +13,36 @@ use crate::compilers::mode::Mode; use crate::compilers::Compiler; use crate::filters::Filters; use crate::summary::Summary; -use crate::test::Test; +use crate::test::eravm::Test as EraVMTest; +use crate::test::evm::Test as EVMTest; /// /// The buildable compiler test trait. /// pub trait Buildable: Send + Sync + 'static { /// - /// Builds the test. + /// Builds the test for EraVM. /// - fn build( + fn build_for_eravm( &self, mode: Mode, compiler: Arc, summary: Arc>, filters: &Filters, - debug_config: Option, - ) -> Option; + debug_config: Option, + ) -> Option; + + /// + /// Builds the test for EVM. + /// + fn build_for_evm( + &self, + mode: Mode, + compiler: Arc, + summary: Arc>, + filters: &Filters, + debug_config: Option, + ) -> Option; } /// diff --git a/compiler_tester/src/filters.rs b/compiler_tester/src/filters.rs index 8f748d0e..73b2fbd8 100644 --- a/compiler_tester/src/filters.rs +++ b/compiler_tester/src/filters.rs @@ -1,5 +1,5 @@ //! -//! The compiler tests filters. +//! The compiler tester filters. //! use std::collections::HashSet; @@ -7,7 +7,7 @@ use std::collections::HashSet; use crate::compilers::mode::Mode; /// -/// The compiler tests filters. +/// The compiler tester filters. /// pub struct Filters { /// The path filters. diff --git a/compiler_tester/src/lib.rs b/compiler_tester/src/lib.rs index 5b4406ae..a80f364f 100644 --- a/compiler_tester/src/lib.rs +++ b/compiler_tester/src/lib.rs @@ -3,34 +3,30 @@ //! pub(crate) mod compilers; -pub(crate) mod deployers; pub(crate) mod directories; -pub(crate) mod eravm; pub(crate) mod filters; pub(crate) mod llvm_options; pub(crate) mod summary; pub(crate) mod test; pub(crate) mod utils; +pub(crate) mod vm; -pub use self::deployers::native_deployer::NativeDeployer; -pub use self::deployers::system_contract_deployer::SystemContractDeployer; pub use self::filters::Filters; pub use self::llvm_options::LLVMOptions; pub use self::summary::Summary; +pub use crate::vm::eravm::deployers::native_deployer::NativeDeployer as EraVMNativeDeployer; +pub use crate::vm::eravm::deployers::system_contract_deployer::SystemContractDeployer as EraVMSystemContractDeployer; +pub use crate::vm::eravm::EraVM; +pub use crate::vm::evm::EVM; use std::path::Path; -use std::path::PathBuf; use std::sync::Arc; use std::sync::Mutex; -use std::time::Duration; -use std::time::Instant; -use colored::Colorize; use itertools::Itertools; use rayon::iter::IntoParallelIterator; use rayon::iter::ParallelIterator; -use crate::compilers::downloader::Downloader as CompilerDownloader; use crate::compilers::eravm::EraVMCompiler; use crate::compilers::llvm::LLVMCompiler; use crate::compilers::mode::Mode; @@ -38,12 +34,11 @@ use crate::compilers::solidity::SolidityCompiler; use crate::compilers::vyper::VyperCompiler; use crate::compilers::yul::YulCompiler; use crate::compilers::Compiler; -use crate::deployers::Deployer; use crate::directories::ethereum::EthereumDirectory; use crate::directories::matter_labs::MatterLabsDirectory; use crate::directories::Buildable; use crate::directories::TestsDirectory; -use crate::eravm::EraVM; +use crate::vm::eravm::deployers::Deployer as EraVMDeployer; /// The debug directory path. pub const DEBUG_DIRECTORY: &str = "./debug/"; @@ -57,7 +52,7 @@ pub const TRACE_DIRECTORY: &str = "./trace/"; type Test = (Arc, Arc, Mode); /// -/// The compiler-tester. +/// The compiler tester. /// pub struct CompilerTester { /// The summary. @@ -65,9 +60,7 @@ pub struct CompilerTester { /// The filters. filters: Filters, /// The debug config. - debug_config: Option, - /// The initial EraVM. - initial_vm: Arc, + debug_config: Option, } impl CompilerTester { @@ -99,129 +92,63 @@ impl CompilerTester { /// /// A shortcut constructor. /// - #[allow(clippy::too_many_arguments)] pub fn new( summary: Arc>, filters: Filters, - - debug_config: Option, - - binary_download_config_paths: Vec, - system_contracts_download_config_path: PathBuf, - system_contracts_debug_config: Option, - system_contracts_path: Option, - system_contracts_save_path: Option, + debug_config: Option, ) -> anyhow::Result { - let mut http_client_builder = reqwest::blocking::ClientBuilder::new(); - http_client_builder = http_client_builder.connect_timeout(Duration::from_secs(60)); - http_client_builder = http_client_builder.pool_idle_timeout(Duration::from_secs(60)); - http_client_builder = http_client_builder.timeout(Duration::from_secs(60)); - let http_client = http_client_builder.build()?; - - let download_time_start = Instant::now(); - println!(" {} compiler binaries", "Downloading".bright_green().bold()); - let system_contracts_solc_downloader_config = CompilerDownloader::new(http_client.clone()) - .download(system_contracts_download_config_path.as_path())?; - for config_path in binary_download_config_paths.into_iter() { - CompilerDownloader::new(http_client.clone()).download(config_path.as_path())?; - } - println!( - " {} downloading compiler binaries in {}m{:02}s", - "Finished".bright_green().bold(), - download_time_start.elapsed().as_secs() / 60, - download_time_start.elapsed().as_secs() % 60, - ); - - let initial_vm = Arc::new(EraVM::initialize( - system_contracts_solc_downloader_config, - system_contracts_debug_config, - system_contracts_path, - system_contracts_save_path, - )?); - Ok(Self { summary, filters, - debug_config, - - initial_vm, }) } /// - /// Runs all the tests. + /// Runs all tests on EraVM. /// - pub fn run(self) -> anyhow::Result<()> + pub fn run_eravm(self, vm: EraVM) -> anyhow::Result<()> where - D: Deployer, + D: EraVMDeployer, { - let solidity_compiler = Arc::new(SolidityCompiler::new()); - let vyper_compiler = Arc::new(VyperCompiler::new()); - let yul_compiler = Arc::new(YulCompiler::new()); - let llvm_compiler = Arc::new(LLVMCompiler::new()); - let eravm_compiler = Arc::new(EraVMCompiler::new()); + let tests = self.all_tests()?; + let vm = Arc::new(vm); - let mut tests = Vec::new(); - tests.extend(self.directory::( - Self::SOLIDITY_SIMPLE, - compiler_common::EXTENSION_SOLIDITY, - solidity_compiler.clone(), - )?); - tests.extend(self.directory::( - Self::VYPER_SIMPLE, - compiler_common::EXTENSION_VYPER, - vyper_compiler.clone(), - )?); - tests.extend(self.directory::( - Self::YUL_SIMPLE, - compiler_common::EXTENSION_YUL, - yul_compiler, - )?); - tests.extend(self.directory::( - Self::LLVM_SIMPLE, - compiler_common::EXTENSION_LLVM_SOURCE, - llvm_compiler, - )?); - tests.extend(self.directory::( - Self::ERAVM_SIMPLE, - compiler_common::EXTENSION_ERAVM_ASSEMBLY, - eravm_compiler, - )?); + let _: Vec<()> = tests + .into_par_iter() + .map(|(test, compiler, mode)| { + if let Some(test) = test.build_for_eravm( + mode, + compiler, + self.summary.clone(), + &self.filters, + self.debug_config.clone(), + ) { + test.run::(self.summary.clone(), vm.clone()); + } + }) + .collect(); - tests.extend(self.directory::( - Self::SOLIDITY_COMPLEX, - compiler_common::EXTENSION_JSON, - solidity_compiler.clone(), - )?); - tests.extend(self.directory::( - Self::VYPER_COMPLEX, - compiler_common::EXTENSION_JSON, - vyper_compiler.clone(), - )?); + Ok(()) + } - tests.extend(self.directory::( - Self::SOLIDITY_ETHEREUM, - compiler_common::EXTENSION_SOLIDITY, - solidity_compiler, - )?); - tests.extend(self.directory::( - Self::VYPER_ETHEREUM, - compiler_common::EXTENSION_VYPER, - vyper_compiler, - )?); + /// + /// Runs all tests on EraVM. + /// + pub fn run_evm(self) -> anyhow::Result<()> { + let tests = self.all_tests()?; let _: Vec<()> = tests .into_par_iter() .map(|(test, compiler, mode)| { - if let Some(test) = test.build( + if let Some(test) = test.build_for_evm( mode, compiler, self.summary.clone(), &self.filters, self.debug_config.clone(), ) { - test.run::(self.summary.clone(), self.initial_vm.clone()); + test.run(self.summary.clone()); } }) .collect(); @@ -230,7 +157,7 @@ impl CompilerTester { } /// - /// Returns all test from the specified directory with the specified compiler. + /// Returns all tests from the specified directory for the specified compiler. /// fn directory( &self, @@ -256,4 +183,67 @@ impl CompilerTester { .map(|(test, mode)| (test, compiler.clone() as Arc, mode)) .collect()) } + + /// + /// Returns all tests from all directories. + /// + fn all_tests(&self) -> anyhow::Result> { + let solidity_compiler = Arc::new(SolidityCompiler::new()); + let vyper_compiler = Arc::new(VyperCompiler::new()); + let yul_compiler = Arc::new(YulCompiler); + let llvm_compiler = Arc::new(LLVMCompiler); + let eravm_compiler = Arc::new(EraVMCompiler); + + let mut tests = Vec::with_capacity(16384); + + tests.extend(self.directory::( + Self::SOLIDITY_SIMPLE, + era_compiler_common::EXTENSION_SOLIDITY, + solidity_compiler.clone(), + )?); + tests.extend(self.directory::( + Self::VYPER_SIMPLE, + era_compiler_common::EXTENSION_VYPER, + vyper_compiler.clone(), + )?); + tests.extend(self.directory::( + Self::YUL_SIMPLE, + era_compiler_common::EXTENSION_YUL, + yul_compiler, + )?); + tests.extend(self.directory::( + Self::LLVM_SIMPLE, + era_compiler_common::EXTENSION_LLVM_SOURCE, + llvm_compiler, + )?); + tests.extend(self.directory::( + Self::ERAVM_SIMPLE, + era_compiler_common::EXTENSION_ERAVM_ASSEMBLY, + eravm_compiler, + )?); + + tests.extend(self.directory::( + Self::SOLIDITY_COMPLEX, + era_compiler_common::EXTENSION_JSON, + solidity_compiler.clone(), + )?); + tests.extend(self.directory::( + Self::VYPER_COMPLEX, + era_compiler_common::EXTENSION_JSON, + vyper_compiler.clone(), + )?); + + tests.extend(self.directory::( + Self::SOLIDITY_ETHEREUM, + era_compiler_common::EXTENSION_SOLIDITY, + solidity_compiler, + )?); + tests.extend(self.directory::( + Self::VYPER_ETHEREUM, + era_compiler_common::EXTENSION_VYPER, + vyper_compiler, + )?); + + Ok(tests) + } } diff --git a/compiler_tester/src/summary/element/mod.rs b/compiler_tester/src/summary/element/mod.rs index e1ca5dd1..7389a9c1 100644 --- a/compiler_tester/src/summary/element/mod.rs +++ b/compiler_tester/src/summary/element/mod.rs @@ -63,10 +63,10 @@ impl Element { details.push(format!("size {size}").bright_white().to_string()) }; match variant { - PassedVariant::Deploy { cycles, ergs, .. } - | PassedVariant::Runtime { cycles, ergs } => { + PassedVariant::Deploy { cycles, gas, .. } + | PassedVariant::Runtime { cycles, gas } => { details.push(format!("cycles {cycles}").bright_white().to_string()); - details.push(format!("ergs {ergs}").bright_white().to_string()) + details.push(format!("gas {gas}").bright_white().to_string()) } _ => {} }; diff --git a/compiler_tester/src/summary/element/outcome/passed_variant.rs b/compiler_tester/src/summary/element/outcome/passed_variant.rs index 9663996f..fde33cae 100644 --- a/compiler_tester/src/summary/element/outcome/passed_variant.rs +++ b/compiler_tester/src/summary/element/outcome/passed_variant.rs @@ -13,15 +13,15 @@ pub enum PassedVariant { size: usize, /// The number of execution cycles. cycles: usize, - /// The number of used ergs. - ergs: u32, + /// The amount of gas used. + gas: u32, }, /// The contract call. Runtime { /// The number of execution cycles. cycles: usize, - /// The number of used ergs. - ergs: u32, + /// The amount of gas used. + gas: u32, }, /// The special function call. Special, diff --git a/compiler_tester/src/summary/mod.rs b/compiler_tester/src/summary/mod.rs index 3d8de15f..0c328c56 100644 --- a/compiler_tester/src/summary/mod.rs +++ b/compiler_tester/src/summary/mod.rs @@ -81,7 +81,7 @@ impl Summary { format!( "{} {}", benchmark_analyzer::BENCHMARK_ALL_GROUP_NAME, - compiler_llvm_context::OptimizerSettings::cycles(), + era_compiler_llvm_context::OptimizerSettings::cycles(), ), benchmark_analyzer::BenchmarkGroup::default(), ); @@ -89,21 +89,21 @@ impl Summary { format!( "{} {}", benchmark_analyzer::BENCHMARK_ALL_GROUP_NAME, - compiler_llvm_context::OptimizerSettings::size(), + era_compiler_llvm_context::OptimizerSettings::size(), ), benchmark_analyzer::BenchmarkGroup::default(), ); for element in self.elements.iter() { - let (size, cycles, ergs, group) = match &element.outcome { + let (size, cycles, gas, group) = match &element.outcome { Outcome::Passed { - variant: PassedVariant::Deploy { size, cycles, ergs }, + variant: PassedVariant::Deploy { size, cycles, gas }, group, - } => (Some(*size), *cycles, *ergs, group.clone()), + } => (Some(*size), *cycles, *gas, group.clone()), Outcome::Passed { - variant: PassedVariant::Runtime { cycles, ergs }, + variant: PassedVariant::Runtime { cycles, gas }, group, - } => (None, *cycles, *ergs, group.clone()), + } => (None, *cycles, *gas, group.clone()), _ => continue, }; @@ -120,9 +120,9 @@ impl Summary { .mode .as_ref() .and_then(|mode| mode.llvm_optimizer_settings().cloned()) - .unwrap_or(compiler_llvm_context::OptimizerSettings::none()); + .unwrap_or(era_compiler_llvm_context::OptimizerSettings::none()); - let benchmark_element = benchmark_analyzer::BenchmarkElement::new(size, cycles, ergs); + let benchmark_element = benchmark_analyzer::BenchmarkElement::new(size, cycles, gas); if let Some(group) = group { benchmark .groups @@ -205,9 +205,9 @@ impl Summary { group: Option, size: usize, cycles: usize, - ergs: u32, + gas: u32, ) { - let passed_variant = PassedVariant::Deploy { size, cycles, ergs }; + let passed_variant = PassedVariant::Deploy { size, cycles, gas }; Self::passed(summary, mode, name, group, passed_variant); } @@ -220,9 +220,9 @@ impl Summary { name: String, group: Option, cycles: usize, - ergs: u32, + gas: u32, ) { - let passed_variant = PassedVariant::Runtime { cycles, ergs }; + let passed_variant = PassedVariant::Runtime { cycles, gas }; Self::passed(summary, mode, name, group, passed_variant); } diff --git a/compiler_tester/src/test/case/input/balance.rs b/compiler_tester/src/test/case/input/balance.rs index b5b2d5e9..c13f87e2 100644 --- a/compiler_tester/src/test/case/input/balance.rs +++ b/compiler_tester/src/test/case/input/balance.rs @@ -6,7 +6,8 @@ use std::sync::Arc; use std::sync::Mutex; use crate::compilers::mode::Mode; -use crate::eravm::EraVM; +use crate::vm::eravm::EraVM; +use crate::vm::evm::EVM; use crate::Summary; /// @@ -31,9 +32,9 @@ impl Balance { impl Balance { /// - /// Run the balance check input. + /// Runs the balance check on EraVM. /// - pub fn run( + pub fn run_eravm( self, summary: Arc>, vm: &EraVM, @@ -57,4 +58,28 @@ impl Balance { ); } } + + /// + /// Runs the balance check on EVM. + /// + pub fn run_evm( + self, + summary: Arc>, + _vm: &EVM, + mode: Mode, + _test_group: Option, + name_prefix: String, + index: usize, + ) { + // TODO: get balance from EVM + let name = format!("{name_prefix}[#balance_check:{index}]"); + Summary::failed( + summary, + mode, + name, + self.balance.into(), + self.balance.into(), + self.address.to_fixed_bytes().to_vec(), + ); + } } diff --git a/compiler_tester/src/test/case/input/calldata.rs b/compiler_tester/src/test/case/input/calldata.rs index 1cc1dcbe..e6afda51 100644 --- a/compiler_tester/src/test/case/input/calldata.rs +++ b/compiler_tester/src/test/case/input/calldata.rs @@ -43,7 +43,7 @@ impl Calldata { Value::Certain(value) => value, Value::Any => anyhow::bail!("* not allowed in calldata"), }; - let mut bytes = [0u8; compiler_common::BYTE_LENGTH_FIELD]; + let mut bytes = [0u8; era_compiler_common::BYTE_LENGTH_FIELD]; value.to_big_endian(&mut bytes); calldata.extend(bytes); } diff --git a/compiler_tester/src/test/case/input/deploy.rs b/compiler_tester/src/test/case/input/deploy.rs index 63bb6d50..d003cdd8 100644 --- a/compiler_tester/src/test/case/input/deploy.rs +++ b/compiler_tester/src/test/case/input/deploy.rs @@ -6,8 +6,9 @@ use std::sync::Arc; use std::sync::Mutex; use crate::compilers::mode::Mode; -use crate::deployers::Deployer; -use crate::eravm::EraVM; +use crate::vm::eravm::deployers::Deployer as EraVMDeployer; +use crate::vm::eravm::EraVM; +use crate::vm::evm::EVM; use crate::Summary; use super::calldata::Calldata; @@ -62,9 +63,9 @@ impl Deploy { impl Deploy { /// - /// Run the deploy input. + /// Runs the deploy on EraVM. /// - pub fn run( + pub fn run_eravm( self, summary: Arc>, vm: &mut EraVM, @@ -73,9 +74,9 @@ impl Deploy { test_group: Option, name_prefix: String, ) where - D: Deployer, + D: EraVMDeployer, { - let name = format!("{}[#deployer:{}]", name_prefix, self.path,); + let name = format!("{}[#deployer:{}]", name_prefix, self.path); vm.populate_storage(self.storage.inner); let result = match deployer.deploy::( @@ -107,7 +108,7 @@ impl Deploy { test_group, build_size, result.cycles, - result.ergs, + result.gas, ); } else { Summary::failed( @@ -120,4 +121,44 @@ impl Deploy { ); } } + + /// + /// Runs the deploy on EVM. + /// + pub fn run_evm( + self, + summary: Arc>, + vm: &mut EVM, + mode: Mode, + test_group: Option, + name_prefix: String, + ) { + let name = format!("{}[#deployer:{}]", name_prefix, self.path); + + vm.populate_storage(self.storage.inner); + let result = match vm.execute_deploy_code( + name.clone(), + self.caller, + self.value, + self.calldata.inner.clone(), + ) { + Ok(execution_result) => execution_result, + Err(error) => { + Summary::invalid(summary, Some(mode), name, error); + return; + } + }; + if result.output == self.expected { + Summary::passed_runtime(summary, mode, name, test_group, result.cycles, result.gas); + } else { + Summary::failed( + summary, + mode, + name, + self.expected, + result.output, + self.calldata.inner, + ); + } + } } diff --git a/compiler_tester/src/test/case/input/mod.rs b/compiler_tester/src/test/case/input/mod.rs index 812bfbe8..b87b2c18 100644 --- a/compiler_tester/src/test/case/input/mod.rs +++ b/compiler_tester/src/test/case/input/mod.rs @@ -18,11 +18,12 @@ use std::sync::Arc; use std::sync::Mutex; use crate::compilers::mode::Mode; -use crate::deployers::Deployer; use crate::directories::matter_labs::test::metadata::case::input::Input as MatterLabsTestInput; -use crate::eravm::EraVM; use crate::summary::Summary; use crate::test::instance::Instance; +use crate::vm::eravm::deployers::Deployer as EraVMDeployer; +use crate::vm::eravm::EraVM; +use crate::vm::evm::EVM; use self::balance::Balance; use self::calldata::Calldata; @@ -144,7 +145,7 @@ impl Input { .ok_or_else(|| { anyhow::anyhow!("Selector of the method `{}` not found", entry) })?, - None => u32::from_str_radix(entry, compiler_common::BASE_HEXADECIMAL) + None => u32::from_str_radix(entry, era_compiler_common::BASE_HEXADECIMAL) .map_err(|err| anyhow::anyhow!("Invalid entry value: {}", err))?, }; @@ -296,10 +297,10 @@ impl Input { } /// - /// Run the input. + /// Runs the input on EraVM. /// #[allow(clippy::too_many_arguments)] - pub fn run( + pub fn run_eravm( self, summary: Arc>, vm: &mut EraVM, @@ -309,20 +310,46 @@ impl Input { name_prefix: String, index: usize, ) where - D: Deployer, + D: EraVMDeployer, { match self { Self::Runtime(runtime) => { - runtime.run::(summary, vm, mode, test_group, name_prefix, index) + runtime.run_eravm::(summary, vm, mode, test_group, name_prefix, index) } Self::Deploy(deploy) => { - deploy.run::<_, M>(summary, vm, mode, deployer, test_group, name_prefix) + deploy.run_eravm::<_, M>(summary, vm, mode, deployer, test_group, name_prefix) } Self::StorageEmpty(storage_empty) => { - storage_empty.run(summary, vm, mode, test_group, name_prefix, index) + storage_empty.run_eravm(summary, vm, mode, test_group, name_prefix, index) } Self::Balance(balance_check) => { - balance_check.run(summary, vm, mode, test_group, name_prefix, index) + balance_check.run_eravm(summary, vm, mode, test_group, name_prefix, index) + } + }; + } + + /// + /// Runs the input on EVM. + /// + pub fn run_evm( + self, + summary: Arc>, + vm: &mut EVM, + mode: Mode, + test_group: Option, + name_prefix: String, + index: usize, + ) { + match self { + Self::Runtime(runtime) => { + runtime.run_evm(summary, vm, mode, test_group, name_prefix, index) + } + Self::Deploy(deploy) => deploy.run_evm(summary, vm, mode, test_group, name_prefix), + Self::StorageEmpty(storage_empty) => { + storage_empty.run_evm(summary, vm, mode, test_group, name_prefix, index) + } + Self::Balance(balance_check) => { + balance_check.run_evm(summary, vm, mode, test_group, name_prefix, index) } }; } diff --git a/compiler_tester/src/test/case/input/output/event.rs b/compiler_tester/src/test/case/input/output/event.rs index 035f4a1c..33cb94c4 100644 --- a/compiler_tester/src/test/case/input/output/event.rs +++ b/compiler_tester/src/test/case/input/output/event.rs @@ -137,11 +137,14 @@ impl From<&zkevm_tester::runners::events::SolidityLikeEvent> for Event { let values: Vec = event .data - .chunks(compiler_common::BYTE_LENGTH_FIELD) + .chunks(era_compiler_common::BYTE_LENGTH_FIELD) .map(|word| { - let value = if word.len() != compiler_common::BYTE_LENGTH_FIELD { + let value = if word.len() != era_compiler_common::BYTE_LENGTH_FIELD { let mut word_padded = word.to_vec(); - word_padded.extend(vec![0u8; compiler_common::BYTE_LENGTH_FIELD - word.len()]); + word_padded.extend(vec![ + 0u8; + era_compiler_common::BYTE_LENGTH_FIELD - word.len() + ]); web3::types::U256::from_big_endian(word_padded.as_slice()) } else { web3::types::U256::from_big_endian(word) @@ -158,6 +161,39 @@ impl From<&zkevm_tester::runners::events::SolidityLikeEvent> for Event { } } +impl From for Event { + fn from(log: evm::Log) -> Self { + let address = log.address; + let topics = log + .topics + .into_iter() + .map(|topic| Value::Certain(crate::utils::h256_to_u256(&topic))) + .collect(); + let values: Vec = log + .data + .chunks(era_compiler_common::BYTE_LENGTH_FIELD) + .map(|word| { + let value = if word.len() != era_compiler_common::BYTE_LENGTH_FIELD { + let mut word_padded = word.to_vec(); + word_padded.extend(vec![ + 0u8; + era_compiler_common::BYTE_LENGTH_FIELD - word.len() + ]); + web3::types::U256::from_big_endian(word_padded.as_slice()) + } else { + web3::types::U256::from_big_endian(word) + }; + Value::Certain(value) + }) + .collect(); + Self { + address: None, + topics, + values, + } + } +} + impl PartialEq for Event { fn eq(&self, other: &Self) -> bool { if let (Some(address1), Some(address2)) = (self.address, other.address) { diff --git a/compiler_tester/src/test/case/input/output/mod.rs b/compiler_tester/src/test/case/input/output/mod.rs index 0f029941..c595c77e 100644 --- a/compiler_tester/src/test/case/input/output/mod.rs +++ b/compiler_tester/src/test/case/input/output/mod.rs @@ -14,6 +14,7 @@ use crate::directories::matter_labs::test::metadata::case::input::expected::vari use crate::directories::matter_labs::test::metadata::case::input::expected::Expected as MatterLabsTestExpected; use crate::test::case::input::value::Value; use crate::test::instance::Instance; +use crate::vm::evm::output::Output as EVMOutput; use self::event::Event; @@ -178,12 +179,15 @@ impl From<&zkevm_tester::runners::compiler_tests::VmSnapshot> for Output { match &snapshot.execution_result { zkevm_tester::runners::compiler_tests::VmExecutionResult::Ok(return_data) => { let return_data = return_data - .chunks(compiler_common::BYTE_LENGTH_FIELD) + .chunks(era_compiler_common::BYTE_LENGTH_FIELD) .map(|word| { - let value = if word.len() != compiler_common::BYTE_LENGTH_FIELD { + let value = if word.len() != era_compiler_common::BYTE_LENGTH_FIELD { let mut word_padded = word.to_vec(); - word_padded - .extend(vec![0u8; compiler_common::BYTE_LENGTH_FIELD - word.len()]); + word_padded.extend(vec![ + 0u8; + era_compiler_common::BYTE_LENGTH_FIELD + - word.len() + ]); web3::types::U256::from_big_endian(word_padded.as_slice()) } else { web3::types::U256::from_big_endian(word) @@ -199,12 +203,15 @@ impl From<&zkevm_tester::runners::compiler_tests::VmSnapshot> for Output { } zkevm_tester::runners::compiler_tests::VmExecutionResult::Revert(return_data) => { let return_data = return_data - .chunks(compiler_common::BYTE_LENGTH_FIELD) + .chunks(era_compiler_common::BYTE_LENGTH_FIELD) .map(|word| { - let value = if word.len() != compiler_common::BYTE_LENGTH_FIELD { + let value = if word.len() != era_compiler_common::BYTE_LENGTH_FIELD { let mut word_padded = word.to_vec(); - word_padded - .extend(vec![0u8; compiler_common::BYTE_LENGTH_FIELD - word.len()]); + word_padded.extend(vec![ + 0u8; + era_compiler_common::BYTE_LENGTH_FIELD + - word.len() + ]); web3::types::U256::from_big_endian(word_padded.as_slice()) } else { web3::types::U256::from_big_endian(word) @@ -234,6 +241,36 @@ impl From<&zkevm_tester::runners::compiler_tests::VmSnapshot> for Output { } } +impl From for Output { + fn from(output: EVMOutput) -> Self { + let return_data = output + .return_data + .chunks(era_compiler_common::BYTE_LENGTH_FIELD) + .map(|word| { + let value = if word.len() != era_compiler_common::BYTE_LENGTH_FIELD { + let mut word_padded = word.to_vec(); + word_padded.extend(vec![ + 0u8; + era_compiler_common::BYTE_LENGTH_FIELD - word.len() + ]); + web3::types::U256::from_big_endian(word_padded.as_slice()) + } else { + web3::types::U256::from_big_endian(word) + }; + Value::Certain(value) + }) + .collect(); + + let events = output.logs.into_iter().map(Event::from).collect(); + + Self { + return_data, + exception: output.exception, + events, + } + } +} + impl PartialEq for Output { fn eq(&self, other: &Self) -> bool { if self.exception != other.exception { diff --git a/compiler_tester/src/test/case/input/runtime.rs b/compiler_tester/src/test/case/input/runtime.rs index c0069c1e..91eca439 100644 --- a/compiler_tester/src/test/case/input/runtime.rs +++ b/compiler_tester/src/test/case/input/runtime.rs @@ -6,7 +6,8 @@ use std::sync::Arc; use std::sync::Mutex; use crate::compilers::mode::Mode; -use crate::eravm::EraVM; +use crate::vm::eravm::EraVM; +use crate::vm::evm::EVM; use crate::Summary; use super::calldata::Calldata; @@ -15,7 +16,6 @@ use super::storage::Storage; /// /// The contract call input variant. -/// #[derive(Debug, Clone)] pub struct Runtime { /// The input name. @@ -61,9 +61,9 @@ impl Runtime { impl Runtime { /// - /// Run the call input. + /// Runs the call on EraVM. /// - pub fn run( + pub fn run_eravm( self, summary: Arc>, vm: &mut EraVM, @@ -74,12 +74,13 @@ impl Runtime { ) { let name = format!("{}[{}:{}]", name_prefix, self.name, index); vm.populate_storage(self.storage.inner); - let result = match vm.contract_call::( + let result = match vm.execute::( name.clone(), self.address, self.caller, self.value, self.calldata.inner.clone(), + None, ) { Ok(result) => result, Err(error) => { @@ -88,7 +89,47 @@ impl Runtime { } }; if result.output == self.expected { - Summary::passed_runtime(summary, mode, name, test_group, result.cycles, result.ergs); + Summary::passed_runtime(summary, mode, name, test_group, result.cycles, result.gas); + } else { + Summary::failed( + summary, + mode, + name, + self.expected, + result.output, + self.calldata.inner, + ); + } + } + + /// + /// Runs the call on EVM. + /// + pub fn run_evm( + self, + summary: Arc>, + vm: &mut EVM, + mode: Mode, + test_group: Option, + name_prefix: String, + index: usize, + ) { + let name = format!("{}[{}:{}]", name_prefix, self.name, index); + vm.populate_storage(self.storage.inner); + let result = match vm.execute_runtime_code( + name.clone(), + self.caller, + self.value, + self.calldata.inner.clone(), + ) { + Ok(execution_result) => execution_result, + Err(error) => { + Summary::invalid(summary, Some(mode), name, error); + return; + } + }; + if result.output == self.expected { + Summary::passed_runtime(summary, mode, name, test_group, result.cycles, result.gas); } else { Summary::failed( summary, diff --git a/compiler_tester/src/test/case/input/storage.rs b/compiler_tester/src/test/case/input/storage.rs index 44460c4a..444c7c36 100644 --- a/compiler_tester/src/test/case/input/storage.rs +++ b/compiler_tester/src/test/case/input/storage.rs @@ -15,7 +15,7 @@ use crate::test::instance::Instance; #[derive(Debug, Clone, Default)] pub struct Storage { /// The inner storage hashmap data. - pub inner: HashMap, + pub inner: HashMap<(web3::types::Address, web3::types::U256), web3::types::H256>, } impl Storage { @@ -58,7 +58,6 @@ impl Storage { Value::Certain(value) => value, Value::Any => anyhow::bail!("Storage key can not be `*`"), }; - let key = zkevm_tester::runners::compiler_tests::StorageKey { address, key }; let value = match Value::try_from_matter_labs(value.as_str(), instances) .map_err(|error| anyhow::anyhow!("Invalid storage value: {}", error))? @@ -67,11 +66,11 @@ impl Storage { Value::Any => anyhow::bail!("Storage value can not be `*`"), }; - let mut value_bytes = [0u8; compiler_common::BYTE_LENGTH_FIELD]; + let mut value_bytes = [0u8; era_compiler_common::BYTE_LENGTH_FIELD]; value.to_big_endian(value_bytes.as_mut_slice()); let value = web3::types::H256::from(value_bytes); - result_storage.insert(key, value); + result_storage.insert((address, key), value); } } diff --git a/compiler_tester/src/test/case/input/storage_empty.rs b/compiler_tester/src/test/case/input/storage_empty.rs index 691e4b53..63f69dc1 100644 --- a/compiler_tester/src/test/case/input/storage_empty.rs +++ b/compiler_tester/src/test/case/input/storage_empty.rs @@ -6,7 +6,8 @@ use std::sync::Arc; use std::sync::Mutex; use crate::compilers::mode::Mode; -use crate::eravm::EraVM; +use crate::vm::eravm::EraVM; +use crate::vm::evm::EVM; use crate::Summary; /// @@ -29,9 +30,9 @@ impl StorageEmpty { impl StorageEmpty { /// - /// Run the storage empty check input. + /// Runs the storage empty check on EraVM. /// - pub fn run( + pub fn run_eravm( self, summary: Arc>, vm: &EraVM, @@ -55,4 +56,28 @@ impl StorageEmpty { ); } } + + /// + /// Runs the storage empty check on EVM. + /// + pub fn run_evm( + self, + summary: Arc>, + _vm: &EVM, + mode: Mode, + _test_group: Option, + name_prefix: String, + index: usize, + ) { + // TODO: check storage in EVM + let name = format!("{name_prefix}[#storage_empty_check:{index}]"); + Summary::failed( + summary, + mode, + name, + self.is_empty.into(), + self.is_empty.into(), + vec![], + ); + } } diff --git a/compiler_tester/src/test/case/mod.rs b/compiler_tester/src/test/case/mod.rs index 4b85a0f4..d545431e 100644 --- a/compiler_tester/src/test/case/mod.rs +++ b/compiler_tester/src/test/case/mod.rs @@ -10,11 +10,12 @@ use std::sync::Arc; use std::sync::Mutex; use crate::compilers::mode::Mode; -use crate::deployers::Deployer; use crate::directories::matter_labs::test::metadata::case::Case as MatterLabsTestCase; -use crate::eravm::EraVM; use crate::summary::Summary; use crate::test::instance::Instance; +use crate::vm::eravm::deployers::Deployer as EraVMDeployer; +use crate::vm::eravm::EraVM; +use crate::vm::evm::EVM; use self::input::Input; @@ -50,13 +51,7 @@ impl Case { for (index, input) in case.inputs.iter().enumerate() { let input = Input::try_from_matter_labs(input, mode, instances, method_identifiers) - .map_err(|error| { - anyhow::anyhow!( - "Input {}(After adding deployer calls) is invalid: {}", - index, - error - ) - })?; + .map_err(|error| anyhow::anyhow!("Input #{} is invalid: {}", index, error))?; inputs.push(input); } @@ -101,27 +96,26 @@ impl Case { } /// - /// Run the case. + /// Runs the case on EraVM. /// - pub fn run( + pub fn run_eravm( self, summary: Arc>, - initial_vm: EraVM, + mut vm: EraVM, mode: &Mode, test_name: String, test_group: Option, ) where - D: Deployer, + D: EraVMDeployer, { let name = if let Some(case_name) = self.name { format!("{test_name}::{case_name}") } else { test_name }; - let mut vm = initial_vm; let mut deployer = D::new(); for (index, input) in self.inputs.into_iter().enumerate() { - input.run::<_, M>( + input.run_eravm::<_, M>( summary.clone(), &mut vm, mode.clone(), @@ -132,4 +126,32 @@ impl Case { ) } } + + /// + /// Runs the case on EVM. + /// + pub fn run_evm( + self, + summary: Arc>, + mut vm: EVM, + mode: &Mode, + test_name: String, + test_group: Option, + ) { + let name = if let Some(case_name) = self.name { + format!("{test_name}::{case_name}") + } else { + test_name + }; + for (index, input) in self.inputs.into_iter().enumerate() { + input.run_evm( + summary.clone(), + &mut vm, + mode.clone(), + test_group.clone(), + name.clone(), + index, + ) + } + } } diff --git a/compiler_tester/src/test/eravm.rs b/compiler_tester/src/test/eravm.rs new file mode 100644 index 00000000..f9aa5878 --- /dev/null +++ b/compiler_tester/src/test/eravm.rs @@ -0,0 +1,69 @@ +//! +//! The EraVM test. +//! + +use std::collections::HashMap; +use std::sync::Arc; +use std::sync::Mutex; + +use crate::compilers::mode::Mode; +use crate::test::case::Case; +use crate::vm::eravm::deployers::Deployer as EraVMDeployer; +use crate::vm::eravm::EraVM; +use crate::Summary; + +/// +/// The test. +/// +pub struct Test { + /// The test name. + name: String, + /// The test group. + group: Option, + /// The test mode. + mode: Mode, + /// The contract builds. + builds: HashMap, + /// The test cases. + cases: Vec, +} + +impl Test { + /// + /// A shortcut constructor. + /// + pub fn new( + name: String, + group: Option, + mode: Mode, + builds: HashMap, + cases: Vec, + ) -> Self { + Self { + name, + group, + mode, + builds, + cases, + } + } + + /// + /// Runs the test. + /// + pub fn run(self, summary: Arc>, vm: Arc) + where + D: EraVMDeployer, + { + for case in self.cases { + let vm = EraVM::clone_with_contracts(vm.clone(), self.builds.clone()); + case.run_eravm::( + summary.clone(), + vm.clone(), + &self.mode, + self.name.clone(), + self.group.clone(), + ); + } + } +} diff --git a/compiler_tester/src/test/evm.rs b/compiler_tester/src/test/evm.rs new file mode 100644 index 00000000..229c82d4 --- /dev/null +++ b/compiler_tester/src/test/evm.rs @@ -0,0 +1,74 @@ +//! +//! The EVM test. +//! + +use std::collections::HashMap; +use std::sync::Arc; +use std::sync::Mutex; + +use crate::compilers::mode::Mode; +use crate::test::case::Case; +use crate::vm::evm::input::build::Build as EVMBuild; +use crate::vm::evm::invoker::Invoker as EVMInvoker; +use crate::vm::evm::runtime::Runtime as EVMRuntime; +use crate::vm::evm::EVM; +use crate::Summary; + +/// +/// The test. +/// +pub struct Test { + /// The test name. + name: String, + /// The test group. + group: Option, + /// The test mode. + mode: Mode, + /// The contract builds. + builds: HashMap, + /// The test cases. + cases: Vec, +} + +impl Test { + /// + /// A shortcut constructor. + /// + pub fn new( + name: String, + group: Option, + mode: Mode, + builds: HashMap, + cases: Vec, + ) -> Self { + Self { + name, + group, + mode, + builds, + cases, + } + } + + /// + /// Runs the test. + /// + pub fn run(self, summary: Arc>) { + for case in self.cases { + let config = evm::standard::Config::shanghai(); + let etable = + evm::Etable::::runtime( + ); + let resolver = evm::standard::EtableResolver::new(&config, &(), &etable); + let invoker = EVMInvoker::new(&config, &resolver); + + case.run_evm( + summary.clone(), + EVM::new(self.builds.clone(), invoker), + &self.mode, + self.name.clone(), + self.group.clone(), + ); + } + } +} diff --git a/compiler_tester/src/test/mod.rs b/compiler_tester/src/test/mod.rs index 1e6525dd..52f9fa8d 100644 --- a/compiler_tester/src/test/mod.rs +++ b/compiler_tester/src/test/mod.rs @@ -3,71 +3,6 @@ //! pub mod case; +pub mod eravm; +pub mod evm; pub mod instance; - -use std::collections::HashMap; -use std::sync::Arc; -use std::sync::Mutex; - -use crate::compilers::mode::Mode; -use crate::deployers::Deployer; -use crate::eravm::EraVM; -use crate::Summary; - -use self::case::Case; - -/// -/// The test. -/// -pub struct Test { - /// The test name. - name: String, - /// The test group. - group: Option, - /// The test mode. - mode: Mode, - /// The contract builds. - builds: HashMap, - /// The test cases. - cases: Vec, -} - -impl Test { - /// - /// A shortcut constructor. - /// - pub fn new( - name: String, - group: Option, - mode: Mode, - builds: HashMap, - cases: Vec, - ) -> Self { - Self { - name, - group, - mode, - builds, - cases, - } - } - - /// - /// Run the test. - /// - pub fn run(self, summary: Arc>, initial_vm: Arc) - where - D: Deployer, - { - for case in self.cases { - let vm = EraVM::clone_with_contracts(initial_vm.clone(), self.builds.clone()); - case.run::( - summary.clone(), - vm, - &self.mode, - self.name.clone(), - self.group.clone(), - ); - } - } -} diff --git a/compiler_tester/src/utils.rs b/compiler_tester/src/utils.rs index 44856777..d3df09bc 100644 --- a/compiler_tester/src/utils.rs +++ b/compiler_tester/src/utils.rs @@ -1,5 +1,5 @@ //! -//! The compiler-tester utils. +//! The compiler tester utils. //! /// @@ -13,7 +13,7 @@ pub fn address_as_string(value: &web3::types::Address) -> String { /// Overrides the default formatting for `U256`, which replaces the middle with an ellipsis. /// pub fn u256_as_string(value: &web3::types::U256) -> String { - let mut bytes = vec![0; compiler_common::BYTE_LENGTH_FIELD]; + let mut bytes = vec![0; era_compiler_common::BYTE_LENGTH_FIELD]; value.to_big_endian(&mut bytes); hex::encode(bytes) } @@ -22,10 +22,10 @@ pub fn u256_as_string(value: &web3::types::U256) -> String { /// Converts `[u8; 32]` into `Address`. /// pub fn bytes32_to_address( - bytes: &[u8; compiler_common::BYTE_LENGTH_FIELD], + bytes: &[u8; era_compiler_common::BYTE_LENGTH_FIELD], ) -> web3::types::Address { web3::types::Address::from_slice( - &bytes[bytes.len() - compiler_common::BYTE_LENGTH_ETH_ADDRESS..], + &bytes[bytes.len() - era_compiler_common::BYTE_LENGTH_ETH_ADDRESS..], ) } @@ -33,10 +33,10 @@ pub fn bytes32_to_address( /// Converts `U256` into `Address`. /// pub fn u256_to_address(value: &web3::types::U256) -> web3::types::Address { - let mut bytes = vec![0; compiler_common::BYTE_LENGTH_FIELD]; + let mut bytes = vec![0; era_compiler_common::BYTE_LENGTH_FIELD]; value.to_big_endian(&mut bytes); web3::types::Address::from_slice( - &bytes[bytes.len() - compiler_common::BYTE_LENGTH_ETH_ADDRESS..], + &bytes[bytes.len() - era_compiler_common::BYTE_LENGTH_ETH_ADDRESS..], ) } @@ -44,7 +44,14 @@ pub fn u256_to_address(value: &web3::types::U256) -> web3::types::Address { /// Converts `U256` into `H256`. /// pub fn u256_to_h256(value: &web3::types::U256) -> web3::types::H256 { - let mut bytes = vec![0; compiler_common::BYTE_LENGTH_FIELD]; + let mut bytes = vec![0; era_compiler_common::BYTE_LENGTH_FIELD]; value.to_big_endian(&mut bytes); web3::types::H256::from_slice(bytes.as_slice()) } + +/// +/// Converts `H256` into `U256`. +/// +pub fn h256_to_u256(value: &web3::types::H256) -> web3::types::U256 { + web3::types::U256::from_big_endian(value.as_bytes()) +} diff --git a/compiler_tester/src/vm/eravm/deployers/address_predictor.rs b/compiler_tester/src/vm/eravm/deployers/address_predictor.rs new file mode 100644 index 00000000..a60a3856 --- /dev/null +++ b/compiler_tester/src/vm/eravm/deployers/address_predictor.rs @@ -0,0 +1,73 @@ +//! +//! The EraVM deploy address predictor. +//! + +use std::collections::HashMap; +use std::str::FromStr; + +use crate::vm::AddressPredictorIterator; + +/// +/// The EraVM deploy address predictor. +/// +#[derive(Debug, Clone)] +pub struct AddressPredictor { + /// The accounts create nonces. + nonces: HashMap, +} + +impl AddressPredictor { + /// The create prefix, `keccak256("zksyncCreate")`. + const CREATE_PREFIX: &'static str = + "63bae3a9951d38e8a3fbb7b70909afc1200610fc5bc55ade242f815974674f23"; + + /// + /// Create new address predictor instance. + /// + pub fn new() -> Self { + Self { + nonces: HashMap::new(), + } + } + + /// + /// Increments caller nonce. + /// + pub fn increment_nonce(&mut self, caller: &web3::types::Address) { + let nonce = self.nonces.entry(*caller).or_insert(0); + *nonce += 1; + } +} + +impl AddressPredictorIterator for AddressPredictor { + fn next( + &mut self, + caller: &web3::types::Address, + increment_nonce: bool, + ) -> web3::types::Address { + let nonce = self.nonces.get(caller).cloned().unwrap_or_default(); + + let mut bytes = web3::types::H256::from_str(Self::CREATE_PREFIX) + .expect("Invalid constant create prefix") + .as_bytes() + .to_vec(); + bytes.extend( + [0; era_compiler_common::BYTE_LENGTH_FIELD + - era_compiler_common::BYTE_LENGTH_ETH_ADDRESS], + ); + bytes.extend(caller.to_fixed_bytes()); + bytes.extend([0; era_compiler_common::BYTE_LENGTH_FIELD - std::mem::size_of::()]); + bytes.extend(nonce.to_be_bytes()); + + let address = web3::types::Address::from_slice( + &web3::signing::keccak256(bytes.as_slice())[era_compiler_common::BYTE_LENGTH_FIELD + - era_compiler_common::BYTE_LENGTH_ETH_ADDRESS..], + ); + + if increment_nonce { + self.increment_nonce(caller); + } + + address + } +} diff --git a/compiler_tester/src/deployers/mod.rs b/compiler_tester/src/vm/eravm/deployers/mod.rs similarity index 88% rename from compiler_tester/src/deployers/mod.rs rename to compiler_tester/src/vm/eravm/deployers/mod.rs index f03ba557..fff4b8d1 100644 --- a/compiler_tester/src/deployers/mod.rs +++ b/compiler_tester/src/vm/eravm/deployers/mod.rs @@ -6,8 +6,8 @@ pub mod address_predictor; pub mod native_deployer; pub mod system_contract_deployer; -use crate::eravm::execution_result::ExecutionResult; -use crate::eravm::EraVM; +use crate::vm::eravm::EraVM; +use crate::vm::execution_result::ExecutionResult; /// /// The deployer trait. diff --git a/compiler_tester/src/deployers/native_deployer.rs b/compiler_tester/src/vm/eravm/deployers/native_deployer.rs similarity index 80% rename from compiler_tester/src/deployers/native_deployer.rs rename to compiler_tester/src/vm/eravm/deployers/native_deployer.rs index e0113728..18a1abe4 100644 --- a/compiler_tester/src/deployers/native_deployer.rs +++ b/compiler_tester/src/vm/eravm/deployers/native_deployer.rs @@ -1,21 +1,22 @@ //! -//! The native deployer implementation. +//! The EraVM native deployer implementation. //! use std::collections::HashMap; use web3::contract::tokens::Tokenizable; -use crate::eravm::execution_result::ExecutionResult; -use crate::eravm::EraVM; use crate::test::case::input::output::Output; use crate::test::case::input::value::Value; +use crate::vm::eravm::EraVM; +use crate::vm::execution_result::ExecutionResult; +use crate::vm::AddressPredictorIterator; use super::address_predictor::AddressPredictor; use super::Deployer; /// -/// The native deployer implementation. +/// The EraVM native deployer implementation. /// #[derive(Debug, Clone)] pub struct NativeDeployer { @@ -44,7 +45,7 @@ impl Deployer for NativeDeployer { value: Option, vm: &mut EraVM, ) -> anyhow::Result { - let address = self.address_predictor.advance_next_address(&caller); + let address = self.address_predictor.next(&caller, false); vm.add_deployed_contract(address, bytecode_hash, None); @@ -55,13 +56,13 @@ impl Deployer for NativeDeployer { 0 }; - let result = vm.run( + let result = vm.execute::( test_name, address, caller, - context_u128_value, + Some(context_u128_value), constructor_calldata, - zkevm_tester::runners::compiler_tests::VmLaunchOption::Constructor, + Some(zkevm_tester::runners::compiler_tests::VmLaunchOption::Constructor), )?; if result.output.exception { @@ -72,7 +73,7 @@ impl Deployer for NativeDeployer { return Ok(result); } - self.address_predictor.increment_nonce(caller); + self.address_predictor.increment_nonce(&caller); Self::set_immutables(address, &result.output.return_data, vm)?; @@ -83,7 +84,7 @@ impl Deployer for NativeDeployer { Ok(ExecutionResult::new( Output::new(return_data, false, result.output.events), result.cycles, - result.ergs, + result.gas, )) } } @@ -100,7 +101,7 @@ impl NativeDeployer { let return_data = encoded_data .iter() .flat_map(|value| { - let mut bytes = [0u8; compiler_common::BYTE_LENGTH_FIELD]; + let mut bytes = [0u8; era_compiler_common::BYTE_LENGTH_FIELD]; value.unwrap_certain_as_ref().to_big_endian(&mut bytes); bytes }) @@ -141,14 +142,12 @@ impl NativeDeployer { let immutable_position = Self::get_position_of_immutable(address, immutable_index); - let storage_key = zkevm_tester::runners::compiler_tests::StorageKey { - address: web3::types::Address::from_low_u64_be( - zkevm_opcode_defs::ADDRESS_IMMUTABLE_SIMULATOR.into(), - ), - key: immutable_position, - }; + let address = web3::types::Address::from_low_u64_be( + zkevm_opcode_defs::ADDRESS_IMMUTABLE_SIMULATOR.into(), + ); + let key = immutable_position; - immutables_storage.insert(storage_key, immutable_value); + immutables_storage.insert((address, key), immutable_value); } vm.populate_storage(immutables_storage); @@ -164,12 +163,12 @@ impl NativeDeployer { index: web3::types::U256, ) -> web3::types::U256 { let mut key = web3::types::H256::from(address).to_fixed_bytes().to_vec(); - key.extend([0u8; compiler_common::BYTE_LENGTH_FIELD]); + key.extend([0u8; era_compiler_common::BYTE_LENGTH_FIELD]); Self::IMMUTABLES_MAPPING_POSITION - .to_big_endian(&mut key[compiler_common::BYTE_LENGTH_FIELD..]); + .to_big_endian(&mut key[era_compiler_common::BYTE_LENGTH_FIELD..]); let key = web3::signing::keccak256(key.as_slice()).to_vec(); - let mut nested_key = vec![0u8; compiler_common::BYTE_LENGTH_FIELD]; + let mut nested_key = vec![0u8; era_compiler_common::BYTE_LENGTH_FIELD]; index.to_big_endian(&mut nested_key[..]); nested_key.extend(key); let nested_key = web3::signing::keccak256(nested_key.as_slice()); diff --git a/compiler_tester/src/deployers/system_contract_deployer.rs b/compiler_tester/src/vm/eravm/deployers/system_contract_deployer.rs similarity index 55% rename from compiler_tester/src/deployers/system_contract_deployer.rs rename to compiler_tester/src/vm/eravm/deployers/system_contract_deployer.rs index 0cc22f7d..9099a1b4 100644 --- a/compiler_tester/src/deployers/system_contract_deployer.rs +++ b/compiler_tester/src/vm/eravm/deployers/system_contract_deployer.rs @@ -1,14 +1,14 @@ //! -//! The system contract deployer implementation. +//! The EraVM system contract deployer implementation. //! -use crate::eravm::execution_result::ExecutionResult; -use crate::eravm::EraVM; +use crate::vm::eravm::EraVM; +use crate::vm::execution_result::ExecutionResult; use super::Deployer; /// -/// The system contract deployer implementation. +/// The EraVM system contract deployer implementation. /// #[derive(Debug, Clone)] pub struct SystemContractDeployer; @@ -32,15 +32,11 @@ impl Deployer for SystemContractDeployer { value: Option, vm: &mut EraVM, ) -> anyhow::Result { - let context_u128_value; - let vm_launch_option; let mut entry_address = web3::types::Address::from_low_u64_be( zkevm_opcode_defs::ADDRESS_CONTRACT_DEPLOYER.into(), ); - if M { - context_u128_value = 0; - + let (vm_launch_option, context_u128_value) = if M { let mut r3 = None; let mut r4 = None; let mut r5 = None; @@ -53,7 +49,7 @@ impl Deployer for SystemContractDeployer { zkevm_opcode_defs::ADDRESS_CONTRACT_DEPLOYER, )); r5 = Some(web3::types::U256::from(u8::from( - compiler_llvm_context::eravm_const::SYSTEM_CALL_BIT, + era_compiler_llvm_context::eravm_const::SYSTEM_CALL_BIT, ))); entry_address = web3::types::Address::from_low_u64_be( @@ -61,58 +57,61 @@ impl Deployer for SystemContractDeployer { ); } - vm_launch_option = zkevm_tester::runners::compiler_tests::VmLaunchOption::ManualCallABI( - zkevm_tester::runners::compiler_tests::FullABIParams { - is_constructor: false, - is_system_call: true, - r3_value: r3, - r4_value: r4, - r5_value: r5, - }, - ); + let vm_launch_option = + zkevm_tester::runners::compiler_tests::VmLaunchOption::ManualCallABI( + zkevm_tester::runners::compiler_tests::FullABIParams { + is_constructor: false, + is_system_call: true, + r3_value: r3, + r4_value: r4, + r5_value: r5, + }, + ); + (vm_launch_option, 0) } else { - if let Some(value) = value { - context_u128_value = value; + let context_u128_value = if let Some(value) = value { vm.mint_ether( web3::types::Address::from_low_u64_be( zkevm_opcode_defs::ADDRESS_CONTRACT_DEPLOYER.into(), ), web3::types::U256::from(value), ); + value } else { - context_u128_value = 0; - } - - vm_launch_option = zkevm_tester::runners::compiler_tests::VmLaunchOption::ManualCallABI( - zkevm_tester::runners::compiler_tests::FullABIParams { - is_constructor: false, - is_system_call: true, - r3_value: None, - r4_value: None, - r5_value: None, - }, - ); - } + 0 + }; + let vm_launch_option = + zkevm_tester::runners::compiler_tests::VmLaunchOption::ManualCallABI( + zkevm_tester::runners::compiler_tests::FullABIParams { + is_constructor: false, + is_system_call: true, + r3_value: None, + r4_value: None, + r5_value: None, + }, + ); + (vm_launch_option, context_u128_value) + }; let mut calldata = Vec::with_capacity( - constructor_calldata.len() + compiler_common::BYTE_LENGTH_FIELD * 4 + 4, + constructor_calldata.len() + era_compiler_common::BYTE_LENGTH_FIELD * 4 + 4, ); calldata.extend(Self::CREATE_METHOD_SELECTOR.to_be_bytes().to_vec()); - calldata.extend([0u8; 2 * compiler_common::BYTE_LENGTH_FIELD]); - bytecode_hash.to_big_endian(&mut calldata[compiler_common::BYTE_LENGTH_FIELD + 4..]); + calldata.extend([0u8; 2 * era_compiler_common::BYTE_LENGTH_FIELD]); + bytecode_hash.to_big_endian(&mut calldata[era_compiler_common::BYTE_LENGTH_FIELD + 4..]); calldata.extend(web3::types::H256::from_low_u64_be(96).as_bytes()); calldata.extend( web3::types::H256::from_low_u64_be(constructor_calldata.len() as u64).as_bytes(), ); calldata.extend(constructor_calldata); - vm.run( + vm.execute::( test_name, entry_address, caller, - context_u128_value, + Some(context_u128_value), calldata, - vm_launch_option, + Some(vm_launch_option), ) } } diff --git a/compiler_tester/src/compilers/output/build.rs b/compiler_tester/src/vm/eravm/input/build.rs similarity index 94% rename from compiler_tester/src/compilers/output/build.rs rename to compiler_tester/src/vm/eravm/input/build.rs index b82ea244..d0497835 100644 --- a/compiler_tester/src/compilers/output/build.rs +++ b/compiler_tester/src/vm/eravm/input/build.rs @@ -23,7 +23,7 @@ impl Build { /// A shortcut constructor. /// pub fn new(assembly: zkevm_assembly::Assembly) -> anyhow::Result { - let bytecode: Vec<[u8; compiler_common::BYTE_LENGTH_FIELD]> = assembly + let bytecode: Vec<[u8; era_compiler_common::BYTE_LENGTH_FIELD]> = assembly .clone() .compile_to_bytecode() .map_err(|error| anyhow::anyhow!("Compiling to bytecode error: {}", error))?; @@ -67,7 +67,7 @@ struct BuildHelper { /// The contract assembly string. assembly: String, /// The contract metadata hash. - metadata_hash: Option<[u8; compiler_common::BYTE_LENGTH_FIELD]>, + metadata_hash: Option<[u8; era_compiler_common::BYTE_LENGTH_FIELD]>, } impl Serialize for Build { diff --git a/compiler_tester/src/compilers/output/mod.rs b/compiler_tester/src/vm/eravm/input/mod.rs similarity index 88% rename from compiler_tester/src/compilers/output/mod.rs rename to compiler_tester/src/vm/eravm/input/mod.rs index f7c05b3d..d58d5a6b 100644 --- a/compiler_tester/src/compilers/output/mod.rs +++ b/compiler_tester/src/vm/eravm/input/mod.rs @@ -1,5 +1,5 @@ //! -//! The compiler output. +//! The EraVM compiler input. //! pub mod build; @@ -10,10 +10,10 @@ use std::collections::HashMap; use self::build::Build; /// -/// The compiler output. +/// The EraVM compiler input. /// #[derive(Debug, Clone)] -pub struct Output { +pub struct Input { /// The contract builds. pub builds: HashMap, /// The contracts method identifiers. @@ -22,7 +22,7 @@ pub struct Output { pub last_contract: String, } -impl Output { +impl Input { /// /// A shortcut constructor. /// diff --git a/compiler_tester/src/eravm/mod.rs b/compiler_tester/src/vm/eravm/mod.rs similarity index 63% rename from compiler_tester/src/eravm/mod.rs rename to compiler_tester/src/vm/eravm/mod.rs index 177624c4..d27b65ac 100644 --- a/compiler_tester/src/eravm/mod.rs +++ b/compiler_tester/src/vm/eravm/mod.rs @@ -2,7 +2,8 @@ //! The EraVM wrapper. //! -pub mod execution_result; +pub mod deployers; +pub mod input; pub mod system_context; pub mod system_contracts; @@ -10,10 +11,14 @@ use std::collections::HashMap; use std::path::PathBuf; use std::str::FromStr; use std::sync::Arc; +use std::time::Duration; +use std::time::Instant; -use crate::compilers::downloader::config::Config as DownloaderConfig; +use colored::Colorize; + +use crate::compilers::downloader::Downloader as CompilerDownloader; +use crate::vm::execution_result::ExecutionResult; -use self::execution_result::ExecutionResult; use self::system_context::SystemContext; use self::system_contracts::SystemContracts; @@ -35,14 +40,35 @@ pub struct EraVM { impl EraVM { /// - /// Creates and initializes new EraVM instance. + /// Creates and initializes a new EraVM instance. /// - pub fn initialize( - system_contracts_solc_downloader_config: DownloaderConfig, - system_contracts_debug_config: Option, - system_contracts_path: Option, + pub fn new( + binary_download_config_paths: Vec, + system_contracts_solc_downloader_config_path: PathBuf, + system_contracts_debug_config: Option, + system_contracts_load_path: Option, system_contracts_save_path: Option, ) -> anyhow::Result { + let mut http_client_builder = reqwest::blocking::ClientBuilder::new(); + http_client_builder = http_client_builder.connect_timeout(Duration::from_secs(60)); + http_client_builder = http_client_builder.pool_idle_timeout(Duration::from_secs(60)); + http_client_builder = http_client_builder.timeout(Duration::from_secs(60)); + let http_client = http_client_builder.build()?; + + let download_time_start = Instant::now(); + println!(" {} compiler binaries", "Downloading".bright_green().bold()); + let system_contracts_solc_downloader_config = CompilerDownloader::new(http_client.clone()) + .download(system_contracts_solc_downloader_config_path.as_path())?; + for config_path in binary_download_config_paths.into_iter() { + CompilerDownloader::new(http_client.clone()).download(config_path.as_path())?; + } + println!( + " {} downloading compiler binaries in {}m{:02}s", + "Finished".bright_green().bold(), + download_time_start.elapsed().as_secs() / 60, + download_time_start.elapsed().as_secs() % 60, + ); + let solc_version = system_contracts_solc_downloader_config .binaries .keys() @@ -57,7 +83,7 @@ impl EraVM { let system_contracts = SystemContracts::load_or_build( solc_version, system_contracts_debug_config, - system_contracts_path, + system_contracts_load_path, system_contracts_save_path, )?; @@ -76,13 +102,13 @@ impl EraVM { ); vm.add_known_contract( zkevm_assembly::Assembly::from_string( - compiler_vyper::FORWARDER_CONTRACT_ASSEMBLY.to_owned(), + era_compiler_vyper::FORWARDER_CONTRACT_ASSEMBLY.to_owned(), None, ) .expect("Always valid"), web3::types::U256::from_str_radix( - compiler_vyper::FORWARDER_CONTRACT_HASH.as_str(), - compiler_common::BASE_HEXADECIMAL, + era_compiler_vyper::FORWARDER_CONTRACT_HASH.as_str(), + era_compiler_common::BASE_HEXADECIMAL, ) .expect("Always valid"), ); @@ -95,9 +121,9 @@ impl EraVM { } /// - /// Clones the vm instance from arc and adds known contracts. + /// Clones the VM instance from and adds known contracts for a single test run. /// - /// TODO: check if can be made copyless + /// TODO: make copyless when VM supports it. /// pub fn clone_with_contracts( vm: Arc, @@ -111,80 +137,63 @@ impl EraVM { } /// - /// Runs a contract call transaction. + /// Runs a test transaction. /// - pub fn contract_call( + pub fn execute( &mut self, test_name: String, - entry_address: web3::types::Address, + mut entry_address: web3::types::Address, caller: web3::types::Address, value: Option, calldata: Vec, + vm_launch_option: Option, ) -> anyhow::Result { - let context_u128_value; - let mut entry_address = entry_address; - let vm_launch_option; - - if M { - context_u128_value = 0; - if let Some(value) = value { - self.mint_ether(caller, web3::types::U256::from(value)); - - let r3 = Some(web3::types::U256::from(value)); - let r4 = Some(web3::types::U256::from_big_endian(entry_address.as_bytes())); - let r5 = Some(web3::types::U256::from(u8::from( - compiler_llvm_context::eravm_const::SYSTEM_CALL_BIT, - ))); - - entry_address = web3::types::Address::from_low_u64_be( - zkevm_opcode_defs::ADDRESS_MSG_VALUE.into(), - ); - - vm_launch_option = - zkevm_tester::runners::compiler_tests::VmLaunchOption::ManualCallABI( - zkevm_tester::runners::compiler_tests::FullABIParams { - is_constructor: false, - is_system_call: true, - r3_value: r3, - r4_value: r4, - r5_value: r5, - }, - ); + let (vm_launch_option, context_u128_value) = + if let Some(vm_launch_option) = vm_launch_option { + (vm_launch_option, value) + } else if M { + match value { + Some(value) => { + self.mint_ether(caller, web3::types::U256::from(value)); + + let r3 = Some(web3::types::U256::from(value)); + let r4 = Some(web3::types::U256::from_big_endian(entry_address.as_bytes())); + let r5 = Some(web3::types::U256::from(u8::from( + era_compiler_llvm_context::eravm_const::SYSTEM_CALL_BIT, + ))); + + entry_address = web3::types::Address::from_low_u64_be( + zkevm_opcode_defs::ADDRESS_MSG_VALUE.into(), + ); + + let vm_launch_option = + zkevm_tester::runners::compiler_tests::VmLaunchOption::ManualCallABI( + zkevm_tester::runners::compiler_tests::FullABIParams { + is_constructor: false, + is_system_call: true, + r3_value: r3, + r4_value: r4, + r5_value: r5, + }, + ); + (vm_launch_option, None) + } + None => ( + zkevm_tester::runners::compiler_tests::VmLaunchOption::Call, + None, + ), + } } else { - vm_launch_option = zkevm_tester::runners::compiler_tests::VmLaunchOption::Call; - } - } else { - vm_launch_option = zkevm_tester::runners::compiler_tests::VmLaunchOption::Call; - if let Some(value) = value { - self.mint_ether(entry_address, web3::types::U256::from(value)); - context_u128_value = value; - } else { - context_u128_value = 0; - } - } + if let Some(value) = value { + self.mint_ether(entry_address, web3::types::U256::from(value)); + } - self.run( - test_name, - entry_address, - caller, - context_u128_value, - calldata, - vm_launch_option, - ) - } + ( + zkevm_tester::runners::compiler_tests::VmLaunchOption::Call, + value, + ) + }; - /// - /// Runs the several contracts on the VM with the specified data and returns the result. - /// - pub fn run( - &mut self, - test_name: String, - entry_address: web3::types::Address, - caller: web3::types::Address, - u128_value: u128, - calldata: Vec, - vm_launch_option: zkevm_tester::runners::compiler_tests::VmLaunchOption, - ) -> anyhow::Result { let mut trace_file_path = PathBuf::from_str("./trace/").expect("Always valid"); let trace_file_name = regex::Regex::new("[^A-Za-z0-9]+") .expect("Always valid") @@ -195,27 +204,23 @@ impl EraVM { let context = zkevm_tester::runners::compiler_tests::VmExecutionContext::new( entry_address, caller, - u128_value, + context_u128_value.unwrap_or_default(), 0, ); - let snapshot = tokio::runtime::Runtime::new() - .expect("Tokio error") - .block_on( - zkevm_tester::runners::compiler_tests::run_vm_multi_contracts( - trace_file_path.to_string_lossy().to_string(), - self.deployed_contracts.clone(), - calldata, - self.storage.clone(), - entry_address, - Some(context), - vm_launch_option, - ::MAX, - self.known_contracts.clone(), - self.default_aa_code_hash, - ), - ) - .map_err(|error| anyhow::anyhow!("Internal error: failed to run vm: {}", error))?; + let snapshot = zkevm_tester::runners::compiler_tests::run_vm_multi_contracts( + trace_file_path.to_string_lossy().to_string(), + self.deployed_contracts.clone(), + calldata.as_slice(), + self.storage.clone(), + entry_address, + Some(context), + vm_launch_option, + ::MAX, + self.known_contracts.clone(), + self.default_aa_code_hash, + ) + .map_err(|error| anyhow::anyhow!("Internal error: failed to run vm: {}", error))?; let result = ExecutionResult::from(&snapshot); self.storage = snapshot.storage; @@ -255,7 +260,7 @@ impl EraVM { } /// - /// Mints some Ether value for the specified caller. + /// Mints some Ether value at the specified address. /// Is needed for payable calls simulation. /// pub fn mint_ether(&mut self, address: web3::types::Address, amount: web3::types::U256) { @@ -273,7 +278,7 @@ impl EraVM { } /// - /// Burns some Ether value for the specified caller. + /// Burns some Ether value for at specified address. /// pub fn burn_ether(&mut self, address: web3::types::Address, amount: web3::types::U256) { let key = Self::balance_storage_key(address); @@ -361,9 +366,15 @@ impl EraVM { /// pub fn populate_storage( &mut self, - values: HashMap, + values: HashMap<(web3::types::Address, web3::types::U256), web3::types::H256>, ) { - self.storage.extend(values); + self.storage.extend(values.into_iter().map( + |((address, key), value)| (zkevm_tester::runners::compiler_tests::StorageKey { + address, + key, + }, + value), + ).collect::>()); } /// @@ -376,7 +387,7 @@ impl EraVM { .cloned() .expect("Always exists"); Ok(assembly - .compile_to_bytecode_for_mode::<16, zkevm_opcode_defs::decoding::encoding_mode_testing::EncodingModeTesting>()?.into_iter().flatten().count()) + .compile_to_bytecode_for_mode::<16, zkevm_assembly::zkevm_opcode_defs::decoding::encoding_mode_testing::EncodingModeTesting>()?.into_iter().flatten().count()) } /// @@ -385,16 +396,16 @@ impl EraVM { fn balance_storage_key( address: web3::types::Address, ) -> zkevm_tester::runners::compiler_tests::StorageKey { - let mut key_preimage = Vec::with_capacity(compiler_common::BYTE_LENGTH_FIELD * 2); + let mut key_preimage = Vec::with_capacity(era_compiler_common::BYTE_LENGTH_FIELD * 2); key_preimage.extend(vec![ 0u8; - compiler_common::BYTE_LENGTH_FIELD - - compiler_common::BYTE_LENGTH_ETH_ADDRESS + era_compiler_common::BYTE_LENGTH_FIELD + - era_compiler_common::BYTE_LENGTH_ETH_ADDRESS ]); key_preimage.extend_from_slice(address.as_bytes()); - key_preimage.extend(vec![0u8; compiler_common::BYTE_LENGTH_FIELD]); + key_preimage.extend(vec![0u8; era_compiler_common::BYTE_LENGTH_FIELD]); - let key_string = compiler_llvm_context::eravm_utils::keccak256(key_preimage.as_slice()); + let key_string = era_compiler_llvm_context::eravm_utils::keccak256(key_preimage.as_slice()); let key = web3::types::U256::from_str(key_string.as_str()).expect("Always valid"); zkevm_tester::runners::compiler_tests::StorageKey { address: web3::types::Address::from_low_u64_be( diff --git a/compiler_tester/src/eravm/system_context.rs b/compiler_tester/src/vm/eravm/system_context.rs similarity index 97% rename from compiler_tester/src/eravm/system_context.rs rename to compiler_tester/src/vm/eravm/system_context.rs index 18b90b9a..f867195b 100644 --- a/compiler_tester/src/eravm/system_context.rs +++ b/compiler_tester/src/vm/eravm/system_context.rs @@ -1,5 +1,5 @@ //! -//! The system context. +//! The EraVM system context. //! use std::collections::HashMap; @@ -7,7 +7,7 @@ use std::ops::Add; use std::str::FromStr; /// -/// The system context. +/// The EraVM system context. /// pub struct SystemContext; @@ -139,7 +139,7 @@ impl SystemContext { let mut hash = web3::types::U256::from_str(Self::ZERO_BLOCK_HASH) .expect("Invalid zero block hash const"); hash = hash.add(web3::types::U256::from(index)); - let mut hash_bytes = [0u8; compiler_common::BYTE_LENGTH_FIELD]; + let mut hash_bytes = [0u8; era_compiler_common::BYTE_LENGTH_FIELD]; hash.to_big_endian(&mut hash_bytes); system_context_values.push(( diff --git a/compiler_tester/src/eravm/system_contracts.rs b/compiler_tester/src/vm/eravm/system_contracts.rs similarity index 75% rename from compiler_tester/src/eravm/system_contracts.rs rename to compiler_tester/src/vm/eravm/system_contracts.rs index 4c8418b5..dd20f22a 100644 --- a/compiler_tester/src/eravm/system_contracts.rs +++ b/compiler_tester/src/vm/eravm/system_contracts.rs @@ -1,5 +1,5 @@ //! -//! The system contracts. +//! The EraVM system contracts. //! use std::collections::BTreeMap; @@ -16,88 +16,101 @@ use serde::Serialize; use crate::compilers::mode::solidity::Mode as SolidityMode; use crate::compilers::mode::yul::Mode as YulMode; use crate::compilers::mode::Mode; -use crate::compilers::output::build::Build as EraVMContractBuild; use crate::compilers::solidity::SolidityCompiler; use crate::compilers::yul::YulCompiler; use crate::compilers::Compiler; +use crate::vm::eravm::input::build::Build as EraVMBuild; /// -/// The system contracts. +/// The EraVM system contracts. /// #[derive(Serialize, Deserialize)] pub struct SystemContracts { /// The deployed system contracts builds. - pub deployed_contracts: Vec<(web3::types::Address, EraVMContractBuild)>, + pub deployed_contracts: Vec<(web3::types::Address, EraVMBuild)>, /// The default account abstraction contract build. - pub default_aa: EraVMContractBuild, + pub default_aa: EraVMBuild, } impl SystemContracts { /// The empty contract implementation path. const PATH_EMPTY_CONTRACT: &'static str = - "system-contracts/contracts/EmptyContract.sol:EmptyContract"; + "era-contracts/system-contracts/contracts/EmptyContract.sol:EmptyContract"; /// The `keccak256` system contract implementation path. - const PATH_KECCAK256: &'static str = "system-contracts/contracts/precompiles/Keccak256.yul"; + const PATH_KECCAK256: &'static str = + "era-contracts/system-contracts/contracts/precompiles/Keccak256.yul"; /// The `ecrecover` system contract implementation path. - const PATH_ECRECOVER: &'static str = "system-contracts/contracts/precompiles/Ecrecover.yul"; + const PATH_ECRECOVER: &'static str = + "era-contracts/system-contracts/contracts/precompiles/Ecrecover.yul"; /// The `sha256` system contract implementation path. - const PATH_SHA256: &'static str = "system-contracts/contracts/precompiles/SHA256.yul"; + const PATH_SHA256: &'static str = + "era-contracts/system-contracts/contracts/precompiles/SHA256.yul"; + + /// The `ecadd` system contract implementation path. + const PATH_ECADD: &'static str = + "era-contracts/system-contracts/contracts/precompiles/EcAdd.yul"; + + /// The `ecmul` system contract implementation path. + const PATH_ECMUL: &'static str = + "era-contracts/system-contracts/contracts/precompiles/EcMul.yul"; /// The account code storage system contract implementation path. const PATH_ACCOUNT_CODE_STORAGE: &'static str = - "system-contracts/contracts/AccountCodeStorage.sol:AccountCodeStorage"; + "era-contracts/system-contracts/contracts/AccountCodeStorage.sol:AccountCodeStorage"; /// The contract deployer system contract implementation path. const PATH_CONTRACT_DEPLOYER: &'static str = - "system-contracts/contracts/ContractDeployer.sol:ContractDeployer"; + "era-contracts/system-contracts/contracts/ContractDeployer.sol:ContractDeployer"; /// The nonce holder system contract implementation path. const PATH_NONCE_HOLDER: &'static str = - "system-contracts/contracts/NonceHolder.sol:NonceHolder"; + "era-contracts/system-contracts/contracts/NonceHolder.sol:NonceHolder"; /// The knows codes storage system contract implementation path. const PATH_KNOWN_CODES_STORAGE: &'static str = - "system-contracts/contracts/KnownCodesStorage.sol:KnownCodesStorage"; + "era-contracts/system-contracts/contracts/KnownCodesStorage.sol:KnownCodesStorage"; /// The immutable simulator system contract implementation path. const PATH_IMMUTABLE_SIMULATOR: &'static str = - "system-contracts/contracts/ImmutableSimulator.sol:ImmutableSimulator"; + "era-contracts/system-contracts/contracts/ImmutableSimulator.sol:ImmutableSimulator"; /// The L1-messenger system contract implementation path. const PATH_L1_MESSENGER: &'static str = - "system-contracts/contracts/L1Messenger.sol:L1Messenger"; + "era-contracts/system-contracts/contracts/L1Messenger.sol:L1Messenger"; /// The `msg.value` simulator system contract implementation path. const PATH_MSG_VALUE_SIMULATOR: &'static str = - "system-contracts/contracts/MsgValueSimulator.sol:MsgValueSimulator"; + "era-contracts/system-contracts/contracts/MsgValueSimulator.sol:MsgValueSimulator"; /// The system context system contract implementation path. const PATH_SYSTEM_CONTEXT: &'static str = - "system-contracts/contracts/SystemContext.sol:SystemContext"; + "era-contracts/system-contracts/contracts/SystemContext.sol:SystemContext"; /// The event writer system contract implementation path. - const PATH_EVENT_WRITER: &'static str = "system-contracts/contracts/EventWriter.yul"; + const PATH_EVENT_WRITER: &'static str = + "era-contracts/system-contracts/contracts/EventWriter.yul"; /// The ETH token system contract implementation path. - const PATH_ETH_TOKEN: &'static str = "system-contracts/contracts/L2EthToken.sol:L2EthToken"; + const PATH_ETH_TOKEN: &'static str = + "era-contracts/system-contracts/contracts/L2EthToken.sol:L2EthToken"; /// The default account abstraction contract implementation path. const PATH_DEFAULT_AA: &'static str = - "system-contracts/contracts/DefaultAccount.sol:DefaultAccount"; + "era-contracts/system-contracts/contracts/DefaultAccount.sol:DefaultAccount"; /// /// Load or build the system contracts. /// pub fn load_or_build( solc_version: semver::Version, - system_contracts_debug_config: Option, - system_contracts_path: Option, + system_contracts_debug_config: Option, + system_contracts_load_path: Option, system_contracts_save_path: Option, ) -> anyhow::Result { - let system_contracts = if let Some(system_contracts_path) = system_contracts_path { + let system_contracts = if let Some(system_contracts_path) = system_contracts_load_path { Self::load(system_contracts_path) .map_err(|error| anyhow::anyhow!("System contracts loading: {}", error))? } else { @@ -119,7 +132,7 @@ impl SystemContracts { /// fn build( solc_version: semver::Version, - debug_config: Option, + debug_config: Option, ) -> anyhow::Result { let build_time_start = Instant::now(); println!(" {} system contracts", "Building".bright_green().bold()); @@ -137,6 +150,18 @@ impl SystemContracts { web3::types::Address::from_low_u64_be(zkevm_opcode_defs::ADDRESS_SHA256.into()), Self::PATH_SHA256, ), + ( + web3::types::Address::from_low_u64_be( + 0x06, /* TODO: zkevm_opcode_defs::ADDRESS_ECADD.into() */ + ), + Self::PATH_ECADD, + ), + ( + web3::types::Address::from_low_u64_be( + 0x07, /* TODO: zkevm_opcode_defs::ADDRESS_ECMUL.into() */ + ), + Self::PATH_ECMUL, + ), ( web3::types::Address::from_low_u64_be( zkevm_opcode_defs::ADDRESS_EVENT_WRITER.into(), @@ -204,9 +229,9 @@ impl SystemContracts { let file_path = path.split(':').next().expect("Always valid"); yul_file_paths.push(file_path.to_owned()); } - let yul_mode = YulMode::new(compiler_llvm_context::OptimizerSettings::cycles()).into(); + let yul_mode = YulMode::new(era_compiler_llvm_context::OptimizerSettings::cycles()).into(); let mut builds = Self::compile( - YulCompiler::new(), + YulCompiler, &yul_mode, yul_file_paths, debug_config.clone(), @@ -217,7 +242,7 @@ impl SystemContracts { let file_path = path.split(':').next().expect("Always valid"); solidity_file_paths.push(file_path.to_owned()); } - for path in glob::glob("system-contracts/**/*.sol")?.filter_map(Result::ok) { + for path in glob::glob("era-contracts/system-contracts/**/*.sol")?.filter_map(Result::ok) { let path = path.to_string_lossy().to_string(); if !solidity_file_paths.contains(&path) { solidity_file_paths.push(path); @@ -225,10 +250,10 @@ impl SystemContracts { } let solidity_mode = SolidityMode::new( solc_version, - compiler_solidity::SolcPipeline::Yul, + era_compiler_solidity::SolcPipeline::Yul, true, true, - compiler_llvm_context::OptimizerSettings::cycles(), + era_compiler_llvm_context::OptimizerSettings::cycles(), ) .into(); builds.extend(Self::compile( @@ -305,19 +330,19 @@ impl SystemContracts { compiler: C, mode: &Mode, paths: Vec, - debug_config: Option, - ) -> anyhow::Result> + debug_config: Option, + ) -> anyhow::Result> where C: Compiler, { let mut sources = Vec::new(); for path in paths.into_iter() { - let file_path = if compiler.has_many_contracts() { + let file_path = if compiler.has_multiple_contracts() { path.split(':').next().expect("Always valid").to_string() } else { path }; - let source = std::fs::read_to_string( + let mut source = std::fs::read_to_string( PathBuf::from_str(file_path.as_str()) .expect("Always valid") .as_path(), @@ -325,10 +350,15 @@ impl SystemContracts { .map_err(|error| { anyhow::anyhow!("System contract file `{}` reading: {}", file_path, error) })?; + + if file_path == "era-contracts/system-contracts/contracts/Constants.sol" { + source = source.replace("{{SYSTEM_CONTRACTS_OFFSET}}", "0x8000"); + } + sources.push((file_path.to_string(), source)); } compiler - .compile( + .compile_for_eravm( "system-contracts".to_owned(), sources, BTreeMap::new(), diff --git a/compiler_tester/src/vm/eravm/vm2_adapter.rs b/compiler_tester/src/vm/eravm/vm2_adapter.rs new file mode 100644 index 00000000..e88f2de1 --- /dev/null +++ b/compiler_tester/src/vm/eravm/vm2_adapter.rs @@ -0,0 +1,121 @@ +use std::collections::HashMap; +use vm2::World; +use web3::ethabi::Address; +use zkevm_assembly::{zkevm_opcode_defs::bytecode_to_code_hash, Assembly}; +use zkevm_opcode_defs::ethereum_types::{BigEndianHash, H256, U256}; +use zkevm_tester::runners::compiler_tests::{ + FullABIParams, StorageKey, VmExecutionContext, VmLaunchOption, +}; + +use crate::test::case::input::output::Output; + +use super::execution_result::ExecutionResult; + +pub fn run_vm( + contracts: HashMap, + calldata: &[u8], + storage: HashMap, + entry_address: Address, + context: Option, + vm_launch_option: VmLaunchOption, + mut known_contracts: HashMap, + default_aa_code_hash: U256, +) -> anyhow::Result { + let abi_params = match vm_launch_option { + VmLaunchOption::Constructor => FullABIParams { + is_constructor: true, + is_system_call: false, + r3_value: None, + r4_value: None, + r5_value: None, + }, + VmLaunchOption::ManualCallABI(abiparams) => abiparams, + _ => return Err(anyhow::anyhow!("Unsupported launch option")), + }; + + for (_, contract) in contracts { + let bytecode = contract.clone().compile_to_bytecode().unwrap(); + let hash = bytecode_to_code_hash(&bytecode).unwrap(); + known_contracts.insert(U256::from_big_endian(&hash), contract); + } + + let mut vm = vm2::State::new( + Box::new(TestWorld { + storage, + contracts: known_contracts, + }), + entry_address, + calldata.to_vec(), + ); + + let output = match vm.run() { + Ok(_) => Output { + return_data: vec![], + exception: false, + events: vec![], + }, + Err(e) => { + dbg!(e, vm.current_frame.gas); + Output { + return_data: vec![], + exception: true, + events: vec![], + } + } + }; + + Ok(ExecutionResult { + output, + cycles: 0, + ergs: 0, + }) +} + +struct TestWorld { + storage: HashMap, + contracts: HashMap, +} +impl World for TestWorld { + fn decommit( + &mut self, + hash: U256, + ) -> (std::sync::Arc<[vm2::Instruction]>, std::sync::Arc<[U256]>) { + let bytecode = self + .contracts + .get(&hash) + .unwrap() + .clone() + .compile_to_bytecode() + .unwrap(); + let instructions = bytecode + .iter() + .flat_map(|x| { + x.chunks(8) + .map(|x| u64::from_be_bytes(x.try_into().unwrap())) + }) + .collect::>(); + + ( + vm2::decode::decode_program(&instructions).into(), + bytecode + .iter() + .map(|x| U256::from_big_endian(x)) + .collect::>() + .into(), + ) + } + + fn read_storage( + &mut self, + contract: zkevm_opcode_defs::ethereum_types::H160, + key: U256, + ) -> U256 { + self.storage + .get(&StorageKey { + address: contract, + key, + }) + .map(|h| h.into_uint()) + .unwrap_or(U256::zero()) + } +} diff --git a/compiler_tester/src/vm/evm/address_predictor.rs b/compiler_tester/src/vm/evm/address_predictor.rs new file mode 100644 index 00000000..d6866a73 --- /dev/null +++ b/compiler_tester/src/vm/evm/address_predictor.rs @@ -0,0 +1,53 @@ +//! +//! The EVM deploy address predictor. +//! + +use std::collections::HashMap; +use std::str::FromStr; + +use crate::vm::AddressPredictorIterator; + +/// +/// The EVM deploy address predictor. +/// +#[derive(Debug, Clone)] +pub struct AddressPredictor { + /// The accounts create nonces. + nonces: HashMap, +} + +impl AddressPredictor { + /// + /// Create new address predictor instance. + /// + pub fn new() -> Self { + Self { + nonces: HashMap::new(), + } + } + + /// + /// Increments caller nonce. + /// + pub fn increment_nonce(&mut self, caller: &web3::types::Address) { + let nonce = self.nonces.entry(*caller).or_insert(0); + *nonce += 1; + } +} + +impl AddressPredictorIterator for AddressPredictor { + fn next( + &mut self, + caller: &web3::types::Address, + increment_nonce: bool, + ) -> web3::types::Address { + let address = web3::types::Address::from_str("9f1ebbf13029eaa4d453a2eb221f322404be895b") + .expect("Always valid"); + + if increment_nonce { + self.increment_nonce(caller); + } + + address + } +} diff --git a/compiler_tester/src/vm/evm/input/build.rs b/compiler_tester/src/vm/evm/input/build.rs new file mode 100644 index 00000000..8579fa2d --- /dev/null +++ b/compiler_tester/src/vm/evm/input/build.rs @@ -0,0 +1,29 @@ +//! +//! The EVM contract build. +//! + +/// +/// The EVM contract build. +/// +#[derive(Debug, Clone)] +pub struct Build { + /// The contract deploy build. + pub deploy_build: era_compiler_llvm_context::EVMBuild, + /// The contract runtime build. + pub runtime_build: era_compiler_llvm_context::EVMBuild, +} + +impl Build { + /// + /// A shortcut constructor. + /// + pub fn new( + deploy_build: era_compiler_llvm_context::EVMBuild, + runtime_build: era_compiler_llvm_context::EVMBuild, + ) -> Self { + Self { + deploy_build, + runtime_build, + } + } +} diff --git a/compiler_tester/src/vm/evm/input/mod.rs b/compiler_tester/src/vm/evm/input/mod.rs new file mode 100644 index 00000000..37b0318e --- /dev/null +++ b/compiler_tester/src/vm/evm/input/mod.rs @@ -0,0 +1,40 @@ +//! +//! The EVM compiler input. +//! + +pub mod build; + +use std::collections::BTreeMap; +use std::collections::HashMap; + +use self::build::Build; + +/// +/// The EraVM compiler input. +/// +#[derive(Debug)] +pub struct Input { + /// The contract builds. + pub builds: HashMap, + /// The contracts method identifiers. + pub method_identifiers: Option>>, + /// The last contract name. + pub last_contract: String, +} + +impl Input { + /// + /// A shortcut constructor. + /// + pub fn new( + builds: HashMap, + method_identifiers: Option>>, + last_contract: String, + ) -> Self { + Self { + builds, + method_identifiers, + last_contract, + } + } +} diff --git a/compiler_tester/src/vm/evm/invoker.rs b/compiler_tester/src/vm/evm/invoker.rs new file mode 100644 index 00000000..03578662 --- /dev/null +++ b/compiler_tester/src/vm/evm/invoker.rs @@ -0,0 +1,21 @@ +//! +//! The EVM invoker. +//! + +use crate::vm::evm::runtime::Runtime as EVMRuntime; + +/// +/// The EVM resolver type. +/// +pub type Resolver<'evm> = evm::standard::EtableResolver< + 'evm, + 'evm, + 'evm, + (), + evm::Etable, EVMRuntime, evm::trap::CallCreateTrap>, +>; + +/// +/// The EVM wrapped invoker type. +/// +pub type Invoker<'evm> = evm::standard::Invoker<'evm, 'evm, Resolver<'evm>>; diff --git a/compiler_tester/src/vm/evm/mod.rs b/compiler_tester/src/vm/evm/mod.rs new file mode 100644 index 00000000..ee0f5c26 --- /dev/null +++ b/compiler_tester/src/vm/evm/mod.rs @@ -0,0 +1,217 @@ +//! +//! The EVM wrapper. +//! + +pub mod address_predictor; +pub mod input; +pub mod invoker; +pub mod output; +pub mod runtime; + +use std::collections::HashMap; +use std::path::PathBuf; +use std::time::Duration; +use std::time::Instant; + +use colored::Colorize; + +use crate::compilers::downloader::Downloader as CompilerDownloader; +use crate::vm::execution_result::ExecutionResult; + +use self::input::build::Build as EVMBuild; +use self::invoker::Invoker as EVMInvoker; +use self::output::Output as EVMOutput; +use self::runtime::Runtime as EVMRuntime; + +/// +/// The EVM wrapper. +/// +#[allow(non_camel_case_types)] +pub struct EVM<'evm> { + /// The EVM runtime. + runtime: EVMRuntime, + /// The known contracts. + known_contracts: HashMap, + /// The EVM invoker. + invoker: EVMInvoker<'evm>, +} + +impl<'evm> EVM<'evm> { + /// + /// A shortcut constructor. + /// + pub fn new( + known_contracts: HashMap, + invoker: EVMInvoker<'evm>, + ) -> Self { + let runtime = EVMRuntime::default(); + + Self { + runtime, + known_contracts, + invoker, + } + } + + /// + /// Downloads the necessary compiler binaries. + /// + pub fn download(binary_download_config_paths: Vec) -> anyhow::Result<()> { + let mut http_client_builder = reqwest::blocking::ClientBuilder::new(); + http_client_builder = http_client_builder.connect_timeout(Duration::from_secs(60)); + http_client_builder = http_client_builder.pool_idle_timeout(Duration::from_secs(60)); + http_client_builder = http_client_builder.timeout(Duration::from_secs(60)); + let http_client = http_client_builder.build()?; + + let download_time_start = Instant::now(); + println!(" {} compiler binaries", "Downloading".bright_green().bold()); + for config_path in binary_download_config_paths.into_iter() { + CompilerDownloader::new(http_client.clone()).download(config_path.as_path())?; + } + println!( + " {} downloading compiler binaries in {}m{:02}s", + "Finished".bright_green().bold(), + download_time_start.elapsed().as_secs() / 60, + download_time_start.elapsed().as_secs() % 60, + ); + + Ok(()) + } + + /// + /// Runs a deploy code test transaction. + /// + pub fn execute_deploy_code( + &mut self, + test_name: String, + caller: web3::types::Address, + value: Option, + constructor_args: Vec, + ) -> anyhow::Result { + let bytecode = self.known_contracts.values().next().unwrap(); + let mut deploy_code = bytecode.deploy_build.bytecode.to_owned(); + deploy_code.extend(constructor_args); + let runtime_code = bytecode.runtime_build.bytecode.to_owned(); + + self.runtime + .balances + .insert(caller, web3::types::U256::max_value()); + + let (address, exception) = match evm::transact( + evm::standard::TransactArgs::Create { + caller, + value: value.unwrap_or_default().into(), + init_code: deploy_code, + salt: None, + gas_limit: web3::types::U256::from_str_radix( + "ffffffff", + era_compiler_common::BASE_HEXADECIMAL, + ) + .expect("Always valid"), + gas_price: web3::types::U256::from_str_radix( + "b2d05e00", + era_compiler_common::BASE_HEXADECIMAL, + ) + .expect("Always valid"), + access_list: vec![], + }, + None, + &mut self.runtime, + &self.invoker, + ) { + Ok(evm::standard::TransactValue::Create { succeed, address }) => match succeed { + evm::ExitSucceed::Returned => { + self.runtime.codes.insert(address, runtime_code.clone()); + (address, false) + } + _ => (web3::types::Address::zero(), true), + }, + Ok(evm::standard::TransactValue::Call { .. }) => { + panic!("Unreachable due to the `Create` transaction sent above") + } + Err(error) => (web3::types::Address::zero(), true), + }; + + let mut return_data = vec![ + 0u8; + era_compiler_common::BYTE_LENGTH_FIELD + - era_compiler_common::BYTE_LENGTH_ETH_ADDRESS + ]; + return_data.extend(address.as_fixed_bytes()); + let events = self.runtime.logs.drain(..).collect(); + let output = EVMOutput::new(return_data, exception, events); + + let execution_result = ExecutionResult::from(output); + Ok(execution_result) + } + + /// + /// Runs a runtime code transaction. + /// + pub fn execute_runtime_code( + &mut self, + test_name: String, + caller: web3::types::Address, + value: Option, + calldata: Vec, + ) -> anyhow::Result { + self.runtime + .balances + .insert(caller, web3::types::U256::max_value()); + + let address = self.runtime.codes.iter().next().unwrap().0.to_owned(); + + let (return_data, exception) = match evm::transact( + evm::standard::TransactArgs::Call { + caller, + address, + value: value.unwrap_or_default().into(), + data: calldata, + gas_limit: web3::types::U256::from_str_radix( + "ffffffff", + era_compiler_common::BASE_HEXADECIMAL, + ) + .expect("Always valid"), + gas_price: web3::types::U256::from_str_radix( + "b2d05e00", + era_compiler_common::BASE_HEXADECIMAL, + ) + .expect("Always valid"), + access_list: vec![], + }, + None, + &mut self.runtime, + &self.invoker, + ) { + Ok(evm::standard::TransactValue::Call { succeed, retval }) => { + (retval, succeed != evm::ExitSucceed::Returned) + } + Ok(evm::standard::TransactValue::Create { .. }) => { + panic!("Unreachable due to the `Call` transaction sent above") + } + Err(_error) => (vec![], true), + }; + + let events = self.runtime.logs.drain(..).collect(); + let output = EVMOutput::new(return_data, exception, events); + + let execution_result = ExecutionResult::from(output); + Ok(execution_result) + } + + /// + /// Adds values to storage. + /// + pub fn populate_storage( + &mut self, + values: HashMap<(web3::types::Address, web3::types::U256), web3::types::H256>, + ) { + for ((address, key), value) in values.into_iter() { + self.runtime + .storages + .entry(address) + .or_default() + .insert(crate::utils::u256_to_h256(&key), value); + } + } +} diff --git a/compiler_tester/src/vm/evm/output.rs b/compiler_tester/src/vm/evm/output.rs new file mode 100644 index 00000000..042718f4 --- /dev/null +++ b/compiler_tester/src/vm/evm/output.rs @@ -0,0 +1,28 @@ +//! +//! The EVM output. +//! + +/// +/// The EVM output. +/// +pub struct Output { + /// The return data. + pub return_data: Vec, + /// The exception flag. + pub exception: bool, + /// The emitted logs. + pub logs: Vec, +} + +impl Output { + /// + /// A shortcut constructor. + /// + pub fn new(return_data: Vec, exception: bool, logs: Vec) -> Self { + Self { + return_data, + exception, + logs, + } + } +} diff --git a/compiler_tester/src/vm/evm/runtime.rs b/compiler_tester/src/vm/evm/runtime.rs new file mode 100644 index 00000000..161b9f4c --- /dev/null +++ b/compiler_tester/src/vm/evm/runtime.rs @@ -0,0 +1,245 @@ +//! +//! The EVM runtime. +//! + +use std::collections::HashMap; + +/// +/// The EVM runtime. +/// +#[derive(Debug, Default)] +pub struct Runtime { + /// The contract codes. + pub codes: HashMap>, + /// The contract balances. + pub balances: HashMap, + /// The contract nonces. + pub nonces: HashMap, + /// The contract storages. + pub storages: HashMap>, + /// The contract logs. + pub logs: Vec, +} + +impl Runtime { + /// + /// A shortcut constructor. + /// + pub fn new( + codes: HashMap>, + balances: HashMap, + nonces: HashMap, + storages: HashMap>, + logs: Vec, + ) -> Self { + Self { + codes, + balances, + nonces, + storages, + logs, + } + } +} + +impl evm::RuntimeEnvironment for Runtime { + fn block_hash(&self, number: web3::types::U256) -> web3::types::H256 { + crate::utils::u256_to_h256( + &web3::types::U256::from_str_radix( + "3737373737373737373737373737373737373737373737373737373737373862", + era_compiler_common::BASE_HEXADECIMAL, + ) + .expect("Always valid"), + ) + } + + fn block_number(&self) -> web3::types::U256 { + web3::types::U256::from_str_radix("12c", era_compiler_common::BASE_HEXADECIMAL) + .expect("Always valid") + } + + fn block_coinbase(&self) -> web3::types::H160 { + crate::utils::u256_to_address( + &web3::types::U256::from_str_radix("8001", era_compiler_common::BASE_HEXADECIMAL) + .expect("Always valid"), + ) + } + + fn block_timestamp(&self) -> web3::types::U256 { + web3::types::U256::from_str_radix("deadbeef", era_compiler_common::BASE_HEXADECIMAL) + .expect("Always valid") + } + + fn block_difficulty(&self) -> web3::types::U256 { + web3::types::U256::from_str_radix("8e1bc9bf04000", era_compiler_common::BASE_HEXADECIMAL) + .expect("Always valid") + } + + fn block_randomness(&self) -> Option { + None + } + + fn block_gas_limit(&self) -> web3::types::U256 { + web3::types::U256::from_str_radix("40000000", era_compiler_common::BASE_HEXADECIMAL) + .expect("Always valid") + } + + fn block_base_fee_per_gas(&self) -> web3::types::U256 { + web3::types::U256::from_dec_str("7").expect("Always valid") + } + + fn chain_id(&self) -> web3::types::U256 { + web3::types::U256::from_dec_str("280").expect("Always valid") + } +} + +impl evm::RuntimeBaseBackend for Runtime { + fn balance(&self, address: web3::types::H160) -> web3::types::U256 { + self.balances + .get(&address) + .cloned() + .unwrap_or(web3::types::U256::zero()) + } + + fn code_size(&self, address: web3::types::H160) -> web3::types::U256 { + self.codes + .get(&address) + .map(|code| web3::types::U256::from(code.len())) + .unwrap_or(web3::types::U256::zero()) + } + + fn code_hash(&self, address: web3::types::H160) -> web3::types::H256 { + web3::types::H256::zero() + } + + fn code(&self, address: web3::types::H160) -> Vec { + self.codes.get(&address).cloned().unwrap_or_default() + } + + fn storage(&self, address: web3::types::H160, index: web3::types::H256) -> web3::types::H256 { + self.storages + .get(&address) + .and_then(|storage| storage.get(&index)) + .cloned() + .unwrap_or(web3::types::H256::zero()) + } + + fn exists(&self, address: web3::types::H160) -> bool { + self.codes.contains_key(&address) + } + + fn nonce(&self, address: web3::types::H160) -> web3::types::U256 { + self.nonces + .get(&address) + .cloned() + .unwrap_or(web3::types::U256::zero()) + } +} + +impl evm::RuntimeBackend for Runtime { + fn original_storage( + &self, + address: web3::types::H160, + index: web3::types::H256, + ) -> web3::types::H256 { + evm::RuntimeBaseBackend::storage(self, address, index) + } + + fn deleted(&self, address: web3::types::H160) -> bool { + false + } + + fn is_cold(&self, address: web3::types::H160, index: Option) -> bool { + false + } + + fn is_hot(&self, address: web3::types::H160, index: Option) -> bool { + !self.is_cold(address, index) + } + + fn mark_hot(&mut self, address: web3::types::H160, index: Option) {} + + fn set_storage( + &mut self, + address: web3::types::H160, + index: web3::types::H256, + value: web3::types::H256, + ) -> Result<(), evm::ExitError> { + self.storages + .entry(address) + .and_modify(|storage| { + storage.insert(index, value); + }) + .or_insert_with(|| { + let mut storage = HashMap::new(); + storage.insert(index, value); + storage + }); + Ok(()) + } + + fn log(&mut self, log: evm::Log) -> Result<(), evm::ExitError> { + self.logs.push(log); + Ok(()) + } + + fn mark_delete(&mut self, address: web3::types::H160) {} + + fn reset_storage(&mut self, address: web3::types::H160) {} + + fn set_code( + &mut self, + address: web3::types::H160, + code: Vec, + ) -> Result<(), evm::ExitError> { + self.codes.insert(address, code); + Ok(()) + } + + fn reset_balance(&mut self, address: web3::types::H160) { + self.balances.insert(address, web3::types::U256::zero()); + } + + fn deposit(&mut self, target: web3::types::H160, value: web3::types::U256) { + self.balances + .entry(target) + .and_modify(|balance| *balance += value) + .or_insert(value); + } + + fn withdrawal( + &mut self, + source: web3::types::H160, + value: web3::types::U256, + ) -> Result<(), evm::ExitError> { + let balance = self + .balances + .get_mut(&source) + .ok_or(evm::ExitError::Exception(evm::ExitException::OutOfFund))?; + if *balance < value { + return Err(evm::ExitError::Exception(evm::ExitException::OutOfFund)); + } + *balance -= value; + Ok(()) + } + + fn transfer(&mut self, transfer: evm::Transfer) -> Result<(), evm::ExitError> { + self.withdrawal(transfer.source, transfer.value)?; + self.deposit(transfer.target, transfer.value); + Ok(()) + } + + fn inc_nonce(&mut self, address: web3::types::H160) -> Result<(), evm::ExitError> { + self.nonces + .entry(address) + .and_modify(|nonce| *nonce += web3::types::U256::one()) + .or_insert(web3::types::U256::one()); + Ok(()) + } +} + +impl evm::TransactionalBackend for Runtime { + fn push_substate(&mut self) {} + + fn pop_substate(&mut self, strategy: evm::MergeStrategy) {} +} diff --git a/compiler_tester/src/eravm/execution_result.rs b/compiler_tester/src/vm/execution_result.rs similarity index 58% rename from compiler_tester/src/eravm/execution_result.rs rename to compiler_tester/src/vm/execution_result.rs index 2b05e9df..cdb5c6bb 100644 --- a/compiler_tester/src/eravm/execution_result.rs +++ b/compiler_tester/src/vm/execution_result.rs @@ -1,11 +1,12 @@ //! -//! The EraVM execution result. +//! The VM execution result. //! use crate::test::case::input::output::Output; +use crate::vm::evm::output::Output as EVMOutput; /// -/// The EraVM execution result. +/// The VM execution result. /// #[derive(Debug, Clone)] pub struct ExecutionResult { @@ -13,19 +14,19 @@ pub struct ExecutionResult { pub output: Output, /// The number of executed cycles. pub cycles: usize, - /// The number of used ergs. - pub ergs: u32, + /// The amount of gas used. + pub gas: u32, } impl ExecutionResult { /// /// A shortcut constructor. /// - pub fn new(output: Output, cycles: usize, ergs: u32) -> Self { + pub fn new(output: Output, cycles: usize, gas: u32) -> Self { Self { output, cycles, - ergs, + gas, } } } @@ -35,7 +36,17 @@ impl From<&zkevm_tester::runners::compiler_tests::VmSnapshot> for ExecutionResul Self { output: Output::from(snapshot), cycles: snapshot.num_cycles_used, - ergs: snapshot.num_ergs_used, + gas: snapshot.num_ergs_used, + } + } +} + +impl From for ExecutionResult { + fn from(output: EVMOutput) -> Self { + Self { + output: Output::from(output), + cycles: 0, + gas: 0, } } } diff --git a/compiler_tester/src/vm/mod.rs b/compiler_tester/src/vm/mod.rs new file mode 100644 index 00000000..384ef8c0 --- /dev/null +++ b/compiler_tester/src/vm/mod.rs @@ -0,0 +1,21 @@ +//! +//! The VM wrappers. +//! + +pub mod eravm; +pub mod evm; +pub mod execution_result; + +/// +/// The address predictor iterator. +/// +pub trait AddressPredictorIterator { + /// + /// Returns the next predicted address. + /// + fn next( + &mut self, + caller: &web3::types::Address, + increment_nonce: bool, + ) -> web3::types::Address; +} diff --git a/configs/solc-bin-default.json b/configs/solc-bin-default.json index 75e9a557..6c0700a0 100644 --- a/configs/solc-bin-default.json +++ b/configs/solc-bin-default.json @@ -2,469 +2,477 @@ "binaries": { "0.4.12": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.12" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.4.13": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.13" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.4.14": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.14" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.4.15": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.15" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.4.16": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.16" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.4.17": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.17" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.4.18": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.18" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.4.19": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.19" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.4.20": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.20" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.4.21": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.21" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.4.22": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.22" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.4.23": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.23" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.4.24": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.24" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.4.25": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.25" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.4.26": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.26" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.5.0": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.0" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.5.1": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.1" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.5.2": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.2" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.5.3": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.3" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.5.4": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.4" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.5.5": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.5" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.5.6": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.6" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.5.7": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.7" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.5.8": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.8" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.5.9": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.9" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.5.10": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.10" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.5.11": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.11" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.5.12": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.12" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.5.13": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.13" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.5.14": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.14" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.5.15": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.15" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.5.16": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.16" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.5.17": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.17" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.6.0": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.0" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.6.1": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.1" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.6.2": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.2" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.6.3": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.3" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.6.4": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.4" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.6.5": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.5" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.6.6": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.6" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.6.7": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.7" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.6.8": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.8" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.6.9": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.9" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.6.10": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.10" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.6.11": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.11" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.6.12": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.12" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.7.0": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.7.0" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.7.1": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.7.1" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.7.2": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.7.2" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.7.3": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.7.3" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.7.4": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.7.4" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.7.5": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.7.5" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.7.6": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.7.6" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.8.0": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.0" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.8.1": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.1" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.8.2": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.2" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.8.3": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.3" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.8.4": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.4" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.8.5": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.5" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.8.6": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.6" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.8.7": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.7" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.8.8": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.8" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.8.9": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.9" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.8.10": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.10" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.8.11": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.11" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.8.12": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.12" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.8.13": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.13" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.8.14": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.14" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.8.15": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.15" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.8.16": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.16" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.8.17": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.17" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.8.18": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.18" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.8.19": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.19" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.8.20": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.20" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.8.21": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.21" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.8.22": { "is_enabled": false, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.22" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" }, "0.8.23": { + "is_enabled": false, + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" + }, + "0.8.24": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.23" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-system-contracts.json b/configs/solc-bin-system-contracts.json index f912e0d3..4f247eec 100644 --- a/configs/solc-bin-system-contracts.json +++ b/configs/solc-bin-system-contracts.json @@ -2,13 +2,15 @@ "binaries": { "0.8.20": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", "destination": "./solc-bin/solc-system-contracts" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.4.12.json b/configs/solc-bin-zkevm-candidate-0.4.12.json index 95435c26..c3afef92 100644 --- a/configs/solc-bin-zkevm-candidate-0.4.12.json +++ b/configs/solc-bin-zkevm-candidate-0.4.12.json @@ -3,12 +3,14 @@ "0.4.12": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.4.12", - "destination": "./solc-bin/solc-0.4.12" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.4.13.json b/configs/solc-bin-zkevm-candidate-0.4.13.json index 5c64e825..6a8317ec 100644 --- a/configs/solc-bin-zkevm-candidate-0.4.13.json +++ b/configs/solc-bin-zkevm-candidate-0.4.13.json @@ -3,12 +3,14 @@ "0.4.13": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.4.13", - "destination": "./solc-bin/solc-0.4.13" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.4.14.json b/configs/solc-bin-zkevm-candidate-0.4.14.json index 9bf145cf..eb7de640 100644 --- a/configs/solc-bin-zkevm-candidate-0.4.14.json +++ b/configs/solc-bin-zkevm-candidate-0.4.14.json @@ -3,12 +3,14 @@ "0.4.14": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.4.14", - "destination": "./solc-bin/solc-0.4.14" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.4.15.json b/configs/solc-bin-zkevm-candidate-0.4.15.json index cbcc0dbb..251e7e6f 100644 --- a/configs/solc-bin-zkevm-candidate-0.4.15.json +++ b/configs/solc-bin-zkevm-candidate-0.4.15.json @@ -3,12 +3,14 @@ "0.4.15": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.4.15", - "destination": "./solc-bin/solc-0.4.15" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.4.16.json b/configs/solc-bin-zkevm-candidate-0.4.16.json index 0692de92..89d9ebcd 100644 --- a/configs/solc-bin-zkevm-candidate-0.4.16.json +++ b/configs/solc-bin-zkevm-candidate-0.4.16.json @@ -3,12 +3,14 @@ "0.4.16": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.4.16", - "destination": "./solc-bin/solc-0.4.16" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.4.17.json b/configs/solc-bin-zkevm-candidate-0.4.17.json index 573c8609..14f1f8aa 100644 --- a/configs/solc-bin-zkevm-candidate-0.4.17.json +++ b/configs/solc-bin-zkevm-candidate-0.4.17.json @@ -3,12 +3,14 @@ "0.4.17": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.4.17", - "destination": "./solc-bin/solc-0.4.17" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.4.18.json b/configs/solc-bin-zkevm-candidate-0.4.18.json index 5aa62f88..a1f6e7af 100644 --- a/configs/solc-bin-zkevm-candidate-0.4.18.json +++ b/configs/solc-bin-zkevm-candidate-0.4.18.json @@ -3,12 +3,14 @@ "0.4.18": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.4.18", - "destination": "./solc-bin/solc-0.4.18" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.4.19.json b/configs/solc-bin-zkevm-candidate-0.4.19.json index 57e28b1d..5cffba2e 100644 --- a/configs/solc-bin-zkevm-candidate-0.4.19.json +++ b/configs/solc-bin-zkevm-candidate-0.4.19.json @@ -3,12 +3,14 @@ "0.4.19": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.4.19", - "destination": "./solc-bin/solc-0.4.19" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.4.20.json b/configs/solc-bin-zkevm-candidate-0.4.20.json index a26df1e3..4996ebf8 100644 --- a/configs/solc-bin-zkevm-candidate-0.4.20.json +++ b/configs/solc-bin-zkevm-candidate-0.4.20.json @@ -3,12 +3,14 @@ "0.4.20": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.4.20", - "destination": "./solc-bin/solc-0.4.20" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.4.21.json b/configs/solc-bin-zkevm-candidate-0.4.21.json index 8ee7e363..54c00332 100644 --- a/configs/solc-bin-zkevm-candidate-0.4.21.json +++ b/configs/solc-bin-zkevm-candidate-0.4.21.json @@ -3,12 +3,14 @@ "0.4.21": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.4.21", - "destination": "./solc-bin/solc-0.4.21" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.4.22.json b/configs/solc-bin-zkevm-candidate-0.4.22.json index dd37e793..c6dbe49b 100644 --- a/configs/solc-bin-zkevm-candidate-0.4.22.json +++ b/configs/solc-bin-zkevm-candidate-0.4.22.json @@ -3,12 +3,14 @@ "0.4.22": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.4.22", - "destination": "./solc-bin/solc-0.4.22" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.4.23.json b/configs/solc-bin-zkevm-candidate-0.4.23.json index 2f7efc55..9fc4f818 100644 --- a/configs/solc-bin-zkevm-candidate-0.4.23.json +++ b/configs/solc-bin-zkevm-candidate-0.4.23.json @@ -3,12 +3,14 @@ "0.4.23": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.4.23", - "destination": "./solc-bin/solc-0.4.23" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.4.24.json b/configs/solc-bin-zkevm-candidate-0.4.24.json index f8fac6b9..49083243 100644 --- a/configs/solc-bin-zkevm-candidate-0.4.24.json +++ b/configs/solc-bin-zkevm-candidate-0.4.24.json @@ -3,12 +3,14 @@ "0.4.24": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.4.24", - "destination": "./solc-bin/solc-0.4.24" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.4.25.json b/configs/solc-bin-zkevm-candidate-0.4.25.json index 408f5f30..88f3201d 100644 --- a/configs/solc-bin-zkevm-candidate-0.4.25.json +++ b/configs/solc-bin-zkevm-candidate-0.4.25.json @@ -3,12 +3,14 @@ "0.4.25": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.4.25", - "destination": "./solc-bin/solc-0.4.25" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.4.26.json b/configs/solc-bin-zkevm-candidate-0.4.26.json index bc6c4ae3..81bb2723 100644 --- a/configs/solc-bin-zkevm-candidate-0.4.26.json +++ b/configs/solc-bin-zkevm-candidate-0.4.26.json @@ -3,12 +3,14 @@ "0.4.26": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.4.26", - "destination": "./solc-bin/solc-0.4.26" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.5.0.json b/configs/solc-bin-zkevm-candidate-0.5.0.json index ba697267..6c3f805f 100644 --- a/configs/solc-bin-zkevm-candidate-0.5.0.json +++ b/configs/solc-bin-zkevm-candidate-0.5.0.json @@ -3,12 +3,14 @@ "0.5.0": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.5.0", - "destination": "./solc-bin/solc-0.5.0" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.5.1.json b/configs/solc-bin-zkevm-candidate-0.5.1.json index a667b63b..a74a5dc5 100644 --- a/configs/solc-bin-zkevm-candidate-0.5.1.json +++ b/configs/solc-bin-zkevm-candidate-0.5.1.json @@ -3,12 +3,14 @@ "0.5.1": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.5.1", - "destination": "./solc-bin/solc-0.5.1" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.5.10.json b/configs/solc-bin-zkevm-candidate-0.5.10.json index 8c0f3a71..49ffef44 100644 --- a/configs/solc-bin-zkevm-candidate-0.5.10.json +++ b/configs/solc-bin-zkevm-candidate-0.5.10.json @@ -3,12 +3,14 @@ "0.5.10": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.5.10", - "destination": "./solc-bin/solc-0.5.10" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.5.11.json b/configs/solc-bin-zkevm-candidate-0.5.11.json index e384237f..d5f6ddde 100644 --- a/configs/solc-bin-zkevm-candidate-0.5.11.json +++ b/configs/solc-bin-zkevm-candidate-0.5.11.json @@ -3,12 +3,14 @@ "0.5.11": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.5.11", - "destination": "./solc-bin/solc-0.5.11" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.5.12.json b/configs/solc-bin-zkevm-candidate-0.5.12.json index 154b2c10..d48c825f 100644 --- a/configs/solc-bin-zkevm-candidate-0.5.12.json +++ b/configs/solc-bin-zkevm-candidate-0.5.12.json @@ -3,12 +3,14 @@ "0.5.12": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.5.12", - "destination": "./solc-bin/solc-0.5.12" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.5.13.json b/configs/solc-bin-zkevm-candidate-0.5.13.json index 6fe40fdc..f1e525a6 100644 --- a/configs/solc-bin-zkevm-candidate-0.5.13.json +++ b/configs/solc-bin-zkevm-candidate-0.5.13.json @@ -3,12 +3,14 @@ "0.5.13": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.5.13", - "destination": "./solc-bin/solc-0.5.13" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.5.14.json b/configs/solc-bin-zkevm-candidate-0.5.14.json index 6f4d48e2..2a32c071 100644 --- a/configs/solc-bin-zkevm-candidate-0.5.14.json +++ b/configs/solc-bin-zkevm-candidate-0.5.14.json @@ -3,12 +3,14 @@ "0.5.14": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.5.14", - "destination": "./solc-bin/solc-0.5.14" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.5.15.json b/configs/solc-bin-zkevm-candidate-0.5.15.json index f44aa03d..c0e8618e 100644 --- a/configs/solc-bin-zkevm-candidate-0.5.15.json +++ b/configs/solc-bin-zkevm-candidate-0.5.15.json @@ -3,12 +3,14 @@ "0.5.15": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.5.15", - "destination": "./solc-bin/solc-0.5.15" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.5.16.json b/configs/solc-bin-zkevm-candidate-0.5.16.json index c187289d..8c296475 100644 --- a/configs/solc-bin-zkevm-candidate-0.5.16.json +++ b/configs/solc-bin-zkevm-candidate-0.5.16.json @@ -3,12 +3,14 @@ "0.5.16": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.5.16", - "destination": "./solc-bin/solc-0.5.16" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.5.17.json b/configs/solc-bin-zkevm-candidate-0.5.17.json index 3d658c97..78bbc133 100644 --- a/configs/solc-bin-zkevm-candidate-0.5.17.json +++ b/configs/solc-bin-zkevm-candidate-0.5.17.json @@ -3,12 +3,14 @@ "0.5.17": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.5.17", - "destination": "./solc-bin/solc-0.5.17" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.5.2.json b/configs/solc-bin-zkevm-candidate-0.5.2.json index 9458f4db..01bcf951 100644 --- a/configs/solc-bin-zkevm-candidate-0.5.2.json +++ b/configs/solc-bin-zkevm-candidate-0.5.2.json @@ -3,12 +3,14 @@ "0.5.2": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.5.2", - "destination": "./solc-bin/solc-0.5.2" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.5.3.json b/configs/solc-bin-zkevm-candidate-0.5.3.json index 9876e267..6b7c36ef 100644 --- a/configs/solc-bin-zkevm-candidate-0.5.3.json +++ b/configs/solc-bin-zkevm-candidate-0.5.3.json @@ -3,12 +3,14 @@ "0.5.3": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.5.3", - "destination": "./solc-bin/solc-0.5.3" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.5.4.json b/configs/solc-bin-zkevm-candidate-0.5.4.json index 8916f006..42534d2b 100644 --- a/configs/solc-bin-zkevm-candidate-0.5.4.json +++ b/configs/solc-bin-zkevm-candidate-0.5.4.json @@ -3,12 +3,14 @@ "0.5.4": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.5.4", - "destination": "./solc-bin/solc-0.5.4" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.5.5.json b/configs/solc-bin-zkevm-candidate-0.5.5.json index 8092900f..d4f7c33a 100644 --- a/configs/solc-bin-zkevm-candidate-0.5.5.json +++ b/configs/solc-bin-zkevm-candidate-0.5.5.json @@ -3,12 +3,14 @@ "0.5.5": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.5.5", - "destination": "./solc-bin/solc-0.5.5" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.5.6.json b/configs/solc-bin-zkevm-candidate-0.5.6.json index 95b16b09..4d9c4b08 100644 --- a/configs/solc-bin-zkevm-candidate-0.5.6.json +++ b/configs/solc-bin-zkevm-candidate-0.5.6.json @@ -3,12 +3,14 @@ "0.5.6": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.5.6", - "destination": "./solc-bin/solc-0.5.6" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.5.7.json b/configs/solc-bin-zkevm-candidate-0.5.7.json index 7f1762e3..e514a5f8 100644 --- a/configs/solc-bin-zkevm-candidate-0.5.7.json +++ b/configs/solc-bin-zkevm-candidate-0.5.7.json @@ -3,12 +3,14 @@ "0.5.7": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.5.7", - "destination": "./solc-bin/solc-0.5.7" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.5.8.json b/configs/solc-bin-zkevm-candidate-0.5.8.json index 5abbdae0..f9536824 100644 --- a/configs/solc-bin-zkevm-candidate-0.5.8.json +++ b/configs/solc-bin-zkevm-candidate-0.5.8.json @@ -3,12 +3,14 @@ "0.5.8": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.5.8", - "destination": "./solc-bin/solc-0.5.8" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.5.9.json b/configs/solc-bin-zkevm-candidate-0.5.9.json index fa6d968d..17a3bdf0 100644 --- a/configs/solc-bin-zkevm-candidate-0.5.9.json +++ b/configs/solc-bin-zkevm-candidate-0.5.9.json @@ -3,12 +3,14 @@ "0.5.9": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.5.9", - "destination": "./solc-bin/solc-0.5.9" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.6.0.json b/configs/solc-bin-zkevm-candidate-0.6.0.json index 99b73e4c..7a091bf5 100644 --- a/configs/solc-bin-zkevm-candidate-0.6.0.json +++ b/configs/solc-bin-zkevm-candidate-0.6.0.json @@ -3,12 +3,14 @@ "0.6.0": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.6.0", - "destination": "./solc-bin/solc-0.6.0" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.6.1.json b/configs/solc-bin-zkevm-candidate-0.6.1.json index c4a13f07..cc455161 100644 --- a/configs/solc-bin-zkevm-candidate-0.6.1.json +++ b/configs/solc-bin-zkevm-candidate-0.6.1.json @@ -3,12 +3,14 @@ "0.6.1": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.6.1", - "destination": "./solc-bin/solc-0.6.1" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.6.10.json b/configs/solc-bin-zkevm-candidate-0.6.10.json index 51af91b0..c733bf4a 100644 --- a/configs/solc-bin-zkevm-candidate-0.6.10.json +++ b/configs/solc-bin-zkevm-candidate-0.6.10.json @@ -3,12 +3,14 @@ "0.6.10": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.6.10", - "destination": "./solc-bin/solc-0.6.10" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.6.11.json b/configs/solc-bin-zkevm-candidate-0.6.11.json index 528e5a69..e8960ec4 100644 --- a/configs/solc-bin-zkevm-candidate-0.6.11.json +++ b/configs/solc-bin-zkevm-candidate-0.6.11.json @@ -3,12 +3,14 @@ "0.6.11": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.6.11", - "destination": "./solc-bin/solc-0.6.11" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.6.12.json b/configs/solc-bin-zkevm-candidate-0.6.12.json index fd0da807..ed9c9ca5 100644 --- a/configs/solc-bin-zkevm-candidate-0.6.12.json +++ b/configs/solc-bin-zkevm-candidate-0.6.12.json @@ -3,12 +3,14 @@ "0.6.12": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.6.12", - "destination": "./solc-bin/solc-0.6.12" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.6.2.json b/configs/solc-bin-zkevm-candidate-0.6.2.json index cf540496..65a3e89d 100644 --- a/configs/solc-bin-zkevm-candidate-0.6.2.json +++ b/configs/solc-bin-zkevm-candidate-0.6.2.json @@ -3,12 +3,14 @@ "0.6.2": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.6.2", - "destination": "./solc-bin/solc-0.6.2" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.6.3.json b/configs/solc-bin-zkevm-candidate-0.6.3.json index e868e0d9..d9d0c6b9 100644 --- a/configs/solc-bin-zkevm-candidate-0.6.3.json +++ b/configs/solc-bin-zkevm-candidate-0.6.3.json @@ -3,12 +3,14 @@ "0.6.3": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.6.3", - "destination": "./solc-bin/solc-0.6.3" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.6.4.json b/configs/solc-bin-zkevm-candidate-0.6.4.json index 6a07a333..c2fe907a 100644 --- a/configs/solc-bin-zkevm-candidate-0.6.4.json +++ b/configs/solc-bin-zkevm-candidate-0.6.4.json @@ -3,12 +3,14 @@ "0.6.4": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.6.4", - "destination": "./solc-bin/solc-0.6.4" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.6.5.json b/configs/solc-bin-zkevm-candidate-0.6.5.json index 76d716de..e1b41684 100644 --- a/configs/solc-bin-zkevm-candidate-0.6.5.json +++ b/configs/solc-bin-zkevm-candidate-0.6.5.json @@ -3,12 +3,14 @@ "0.6.5": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.6.5", - "destination": "./solc-bin/solc-0.6.5" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.6.6.json b/configs/solc-bin-zkevm-candidate-0.6.6.json index 5c67e9da..872b0fbb 100644 --- a/configs/solc-bin-zkevm-candidate-0.6.6.json +++ b/configs/solc-bin-zkevm-candidate-0.6.6.json @@ -3,12 +3,14 @@ "0.6.6": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.6.6", - "destination": "./solc-bin/solc-0.6.6" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.6.7.json b/configs/solc-bin-zkevm-candidate-0.6.7.json index 35a33c4b..3c7c2bcf 100644 --- a/configs/solc-bin-zkevm-candidate-0.6.7.json +++ b/configs/solc-bin-zkevm-candidate-0.6.7.json @@ -3,12 +3,14 @@ "0.6.7": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.6.7", - "destination": "./solc-bin/solc-0.6.7" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.6.8.json b/configs/solc-bin-zkevm-candidate-0.6.8.json index 311c98d0..263c6073 100644 --- a/configs/solc-bin-zkevm-candidate-0.6.8.json +++ b/configs/solc-bin-zkevm-candidate-0.6.8.json @@ -3,12 +3,14 @@ "0.6.8": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.6.8", - "destination": "./solc-bin/solc-0.6.8" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.6.9.json b/configs/solc-bin-zkevm-candidate-0.6.9.json index bb531b87..8d9a8489 100644 --- a/configs/solc-bin-zkevm-candidate-0.6.9.json +++ b/configs/solc-bin-zkevm-candidate-0.6.9.json @@ -3,12 +3,14 @@ "0.6.9": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.6.9", - "destination": "./solc-bin/solc-0.6.9" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.7.0.json b/configs/solc-bin-zkevm-candidate-0.7.0.json index e60c79ea..111c015a 100644 --- a/configs/solc-bin-zkevm-candidate-0.7.0.json +++ b/configs/solc-bin-zkevm-candidate-0.7.0.json @@ -3,12 +3,14 @@ "0.7.0": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.7.0", - "destination": "./solc-bin/solc-0.7.0" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.7.1.json b/configs/solc-bin-zkevm-candidate-0.7.1.json index 05f22f3e..5a49762b 100644 --- a/configs/solc-bin-zkevm-candidate-0.7.1.json +++ b/configs/solc-bin-zkevm-candidate-0.7.1.json @@ -3,12 +3,14 @@ "0.7.1": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.7.1", - "destination": "./solc-bin/solc-0.7.1" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.7.2.json b/configs/solc-bin-zkevm-candidate-0.7.2.json index e1a75c51..fda9c24e 100644 --- a/configs/solc-bin-zkevm-candidate-0.7.2.json +++ b/configs/solc-bin-zkevm-candidate-0.7.2.json @@ -3,12 +3,14 @@ "0.7.2": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.7.2", - "destination": "./solc-bin/solc-0.7.2" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.7.3.json b/configs/solc-bin-zkevm-candidate-0.7.3.json index 137f3a72..c4f7370d 100644 --- a/configs/solc-bin-zkevm-candidate-0.7.3.json +++ b/configs/solc-bin-zkevm-candidate-0.7.3.json @@ -3,12 +3,14 @@ "0.7.3": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.7.3", - "destination": "./solc-bin/solc-0.7.3" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.7.4.json b/configs/solc-bin-zkevm-candidate-0.7.4.json index 73787bf1..748a8652 100644 --- a/configs/solc-bin-zkevm-candidate-0.7.4.json +++ b/configs/solc-bin-zkevm-candidate-0.7.4.json @@ -3,12 +3,14 @@ "0.7.4": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.7.4", - "destination": "./solc-bin/solc-0.7.4" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.7.5.json b/configs/solc-bin-zkevm-candidate-0.7.5.json index bfaf016b..5a129640 100644 --- a/configs/solc-bin-zkevm-candidate-0.7.5.json +++ b/configs/solc-bin-zkevm-candidate-0.7.5.json @@ -3,12 +3,14 @@ "0.7.5": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.7.5", - "destination": "./solc-bin/solc-0.7.5" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.7.6.json b/configs/solc-bin-zkevm-candidate-0.7.6.json index e417d4cf..83f1cba5 100644 --- a/configs/solc-bin-zkevm-candidate-0.7.6.json +++ b/configs/solc-bin-zkevm-candidate-0.7.6.json @@ -3,12 +3,14 @@ "0.7.6": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.7.6", - "destination": "./solc-bin/solc-0.7.6" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.8.0.json b/configs/solc-bin-zkevm-candidate-0.8.0.json index aadfea5b..8da677f7 100644 --- a/configs/solc-bin-zkevm-candidate-0.8.0.json +++ b/configs/solc-bin-zkevm-candidate-0.8.0.json @@ -3,12 +3,14 @@ "0.8.0": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.8.0", - "destination": "./solc-bin/solc-0.8.0" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.8.1.json b/configs/solc-bin-zkevm-candidate-0.8.1.json index 3d8ee649..10e67bae 100644 --- a/configs/solc-bin-zkevm-candidate-0.8.1.json +++ b/configs/solc-bin-zkevm-candidate-0.8.1.json @@ -3,12 +3,14 @@ "0.8.1": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.8.1", - "destination": "./solc-bin/solc-0.8.1" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.8.10.json b/configs/solc-bin-zkevm-candidate-0.8.10.json index 0922c024..9561e8f3 100644 --- a/configs/solc-bin-zkevm-candidate-0.8.10.json +++ b/configs/solc-bin-zkevm-candidate-0.8.10.json @@ -3,12 +3,14 @@ "0.8.10": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.8.10", - "destination": "./solc-bin/solc-0.8.10" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.8.11.json b/configs/solc-bin-zkevm-candidate-0.8.11.json index b6a571ee..4ba8b1e3 100644 --- a/configs/solc-bin-zkevm-candidate-0.8.11.json +++ b/configs/solc-bin-zkevm-candidate-0.8.11.json @@ -3,12 +3,14 @@ "0.8.11": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.8.11", - "destination": "./solc-bin/solc-0.8.11" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.8.12.json b/configs/solc-bin-zkevm-candidate-0.8.12.json index ac3e2f23..e64353d2 100644 --- a/configs/solc-bin-zkevm-candidate-0.8.12.json +++ b/configs/solc-bin-zkevm-candidate-0.8.12.json @@ -3,12 +3,14 @@ "0.8.12": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.8.12", - "destination": "./solc-bin/solc-0.8.12" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.8.13.json b/configs/solc-bin-zkevm-candidate-0.8.13.json index 8749258c..7ba53ad9 100644 --- a/configs/solc-bin-zkevm-candidate-0.8.13.json +++ b/configs/solc-bin-zkevm-candidate-0.8.13.json @@ -3,12 +3,14 @@ "0.8.13": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.8.13", - "destination": "./solc-bin/solc-0.8.13" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.8.14.json b/configs/solc-bin-zkevm-candidate-0.8.14.json index 290fd813..5dd69942 100644 --- a/configs/solc-bin-zkevm-candidate-0.8.14.json +++ b/configs/solc-bin-zkevm-candidate-0.8.14.json @@ -3,12 +3,14 @@ "0.8.14": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.8.14", - "destination": "./solc-bin/solc-0.8.14" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.8.15.json b/configs/solc-bin-zkevm-candidate-0.8.15.json index 8c384de9..f6ee065e 100644 --- a/configs/solc-bin-zkevm-candidate-0.8.15.json +++ b/configs/solc-bin-zkevm-candidate-0.8.15.json @@ -3,12 +3,14 @@ "0.8.15": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.8.15", - "destination": "./solc-bin/solc-0.8.15" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.8.16.json b/configs/solc-bin-zkevm-candidate-0.8.16.json index 14609055..a8874d46 100644 --- a/configs/solc-bin-zkevm-candidate-0.8.16.json +++ b/configs/solc-bin-zkevm-candidate-0.8.16.json @@ -3,12 +3,14 @@ "0.8.16": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.8.16", - "destination": "./solc-bin/solc-0.8.16" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.8.17.json b/configs/solc-bin-zkevm-candidate-0.8.17.json index 5b23f988..4908cbf2 100644 --- a/configs/solc-bin-zkevm-candidate-0.8.17.json +++ b/configs/solc-bin-zkevm-candidate-0.8.17.json @@ -3,12 +3,14 @@ "0.8.17": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.8.17", - "destination": "./solc-bin/solc-0.8.17" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.8.18.json b/configs/solc-bin-zkevm-candidate-0.8.18.json index ea3e8ea2..d259e26d 100644 --- a/configs/solc-bin-zkevm-candidate-0.8.18.json +++ b/configs/solc-bin-zkevm-candidate-0.8.18.json @@ -3,12 +3,14 @@ "0.8.18": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.8.18", - "destination": "./solc-bin/solc-0.8.18" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.8.19.json b/configs/solc-bin-zkevm-candidate-0.8.19.json index fd6ece11..cb83ea65 100644 --- a/configs/solc-bin-zkevm-candidate-0.8.19.json +++ b/configs/solc-bin-zkevm-candidate-0.8.19.json @@ -3,12 +3,14 @@ "0.8.19": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.8.19", - "destination": "./solc-bin/solc-0.8.19" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.8.2.json b/configs/solc-bin-zkevm-candidate-0.8.2.json index 55dfb777..1bf805c6 100644 --- a/configs/solc-bin-zkevm-candidate-0.8.2.json +++ b/configs/solc-bin-zkevm-candidate-0.8.2.json @@ -3,12 +3,14 @@ "0.8.2": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.8.2", - "destination": "./solc-bin/solc-0.8.2" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.8.20.json b/configs/solc-bin-zkevm-candidate-0.8.20.json index fe510a75..3c089e67 100644 --- a/configs/solc-bin-zkevm-candidate-0.8.20.json +++ b/configs/solc-bin-zkevm-candidate-0.8.20.json @@ -3,12 +3,14 @@ "0.8.20": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.8.20", - "destination": "./solc-bin/solc-0.8.20" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.8.21.json b/configs/solc-bin-zkevm-candidate-0.8.21.json index 186d0a5a..2b45c6a5 100644 --- a/configs/solc-bin-zkevm-candidate-0.8.21.json +++ b/configs/solc-bin-zkevm-candidate-0.8.21.json @@ -3,12 +3,14 @@ "0.8.21": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.8.21", - "destination": "./solc-bin/solc-0.8.21" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.8.22.json b/configs/solc-bin-zkevm-candidate-0.8.22.json index fb3375d7..3eb1a705 100644 --- a/configs/solc-bin-zkevm-candidate-0.8.22.json +++ b/configs/solc-bin-zkevm-candidate-0.8.22.json @@ -3,12 +3,14 @@ "0.8.22": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.8.22", - "destination": "./solc-bin/solc-0.8.22" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.8.23.json b/configs/solc-bin-zkevm-candidate-0.8.23.json index cc615bd4..eb6c0bc6 100644 --- a/configs/solc-bin-zkevm-candidate-0.8.23.json +++ b/configs/solc-bin-zkevm-candidate-0.8.23.json @@ -3,12 +3,14 @@ "0.8.23": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.8.23", - "destination": "./solc-bin/solc-0.8.23" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.8.24.json b/configs/solc-bin-zkevm-candidate-0.8.24.json new file mode 100644 index 00000000..1c327b0d --- /dev/null +++ b/configs/solc-bin-zkevm-candidate-0.8.24.json @@ -0,0 +1,16 @@ +{ + "binaries": { + "0.8.24": { + "is_enabled": true, + "protocol": "file", + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" + } + }, + "platforms": { + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" + } +} diff --git a/configs/solc-bin-zkevm-candidate-0.8.3.json b/configs/solc-bin-zkevm-candidate-0.8.3.json index 6b05e4d9..6a168511 100644 --- a/configs/solc-bin-zkevm-candidate-0.8.3.json +++ b/configs/solc-bin-zkevm-candidate-0.8.3.json @@ -3,12 +3,14 @@ "0.8.3": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.8.3", - "destination": "./solc-bin/solc-0.8.3" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.8.4.json b/configs/solc-bin-zkevm-candidate-0.8.4.json index 9b347c85..399489d4 100644 --- a/configs/solc-bin-zkevm-candidate-0.8.4.json +++ b/configs/solc-bin-zkevm-candidate-0.8.4.json @@ -3,12 +3,14 @@ "0.8.4": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.8.4", - "destination": "./solc-bin/solc-0.8.4" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.8.5.json b/configs/solc-bin-zkevm-candidate-0.8.5.json index b3dbee0c..09a8c426 100644 --- a/configs/solc-bin-zkevm-candidate-0.8.5.json +++ b/configs/solc-bin-zkevm-candidate-0.8.5.json @@ -3,12 +3,14 @@ "0.8.5": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.8.5", - "destination": "./solc-bin/solc-0.8.5" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.8.6.json b/configs/solc-bin-zkevm-candidate-0.8.6.json index 28797951..c4a3fa43 100644 --- a/configs/solc-bin-zkevm-candidate-0.8.6.json +++ b/configs/solc-bin-zkevm-candidate-0.8.6.json @@ -3,12 +3,14 @@ "0.8.6": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.8.6", - "destination": "./solc-bin/solc-0.8.6" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.8.7.json b/configs/solc-bin-zkevm-candidate-0.8.7.json index c45d6840..d1e2b007 100644 --- a/configs/solc-bin-zkevm-candidate-0.8.7.json +++ b/configs/solc-bin-zkevm-candidate-0.8.7.json @@ -3,12 +3,14 @@ "0.8.7": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.8.7", - "destination": "./solc-bin/solc-0.8.7" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.8.8.json b/configs/solc-bin-zkevm-candidate-0.8.8.json index 0d3f71c3..b5ec61ec 100644 --- a/configs/solc-bin-zkevm-candidate-0.8.8.json +++ b/configs/solc-bin-zkevm-candidate-0.8.8.json @@ -3,12 +3,14 @@ "0.8.8": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.8.8", - "destination": "./solc-bin/solc-0.8.8" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-candidate-0.8.9.json b/configs/solc-bin-zkevm-candidate-0.8.9.json index bcde516c..29d0e4cb 100644 --- a/configs/solc-bin-zkevm-candidate-0.8.9.json +++ b/configs/solc-bin-zkevm-candidate-0.8.9.json @@ -3,12 +3,14 @@ "0.8.9": { "is_enabled": true, "protocol": "file", - "source": "./solc-bin/solc-0.8.9", - "destination": "./solc-bin/solc-0.8.9" + "source": "./solc-bin/solc-${VERSION}", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.4.12.json b/configs/solc-bin-zkevm-reference-0.4.12.json index a4cd7167..b5906004 100644 --- a/configs/solc-bin-zkevm-reference-0.4.12.json +++ b/configs/solc-bin-zkevm-reference-0.4.12.json @@ -2,13 +2,15 @@ "binaries": { "0.4.12": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.12" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.4.13.json b/configs/solc-bin-zkevm-reference-0.4.13.json index d5b34635..054d92f8 100644 --- a/configs/solc-bin-zkevm-reference-0.4.13.json +++ b/configs/solc-bin-zkevm-reference-0.4.13.json @@ -2,13 +2,15 @@ "binaries": { "0.4.13": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.13" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.4.14.json b/configs/solc-bin-zkevm-reference-0.4.14.json index 9aa57a0e..9f438888 100644 --- a/configs/solc-bin-zkevm-reference-0.4.14.json +++ b/configs/solc-bin-zkevm-reference-0.4.14.json @@ -2,13 +2,15 @@ "binaries": { "0.4.14": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.14" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.4.15.json b/configs/solc-bin-zkevm-reference-0.4.15.json index af19c21e..5696b26f 100644 --- a/configs/solc-bin-zkevm-reference-0.4.15.json +++ b/configs/solc-bin-zkevm-reference-0.4.15.json @@ -2,13 +2,15 @@ "binaries": { "0.4.15": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.15" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.4.16.json b/configs/solc-bin-zkevm-reference-0.4.16.json index 9e826e94..5e40d6cd 100644 --- a/configs/solc-bin-zkevm-reference-0.4.16.json +++ b/configs/solc-bin-zkevm-reference-0.4.16.json @@ -2,13 +2,15 @@ "binaries": { "0.4.16": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.16" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.4.17.json b/configs/solc-bin-zkevm-reference-0.4.17.json index f37d8fc6..0c4e5fbf 100644 --- a/configs/solc-bin-zkevm-reference-0.4.17.json +++ b/configs/solc-bin-zkevm-reference-0.4.17.json @@ -2,13 +2,15 @@ "binaries": { "0.4.17": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.17" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.4.18.json b/configs/solc-bin-zkevm-reference-0.4.18.json index 604086e2..64125758 100644 --- a/configs/solc-bin-zkevm-reference-0.4.18.json +++ b/configs/solc-bin-zkevm-reference-0.4.18.json @@ -2,13 +2,15 @@ "binaries": { "0.4.18": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.18" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.4.19.json b/configs/solc-bin-zkevm-reference-0.4.19.json index 75e09550..8d03cac9 100644 --- a/configs/solc-bin-zkevm-reference-0.4.19.json +++ b/configs/solc-bin-zkevm-reference-0.4.19.json @@ -2,13 +2,15 @@ "binaries": { "0.4.19": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.19" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.4.20.json b/configs/solc-bin-zkevm-reference-0.4.20.json index 0e05baac..602f7b6b 100644 --- a/configs/solc-bin-zkevm-reference-0.4.20.json +++ b/configs/solc-bin-zkevm-reference-0.4.20.json @@ -2,13 +2,15 @@ "binaries": { "0.4.20": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.20" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.4.21.json b/configs/solc-bin-zkevm-reference-0.4.21.json index adb649be..cd0c07f6 100644 --- a/configs/solc-bin-zkevm-reference-0.4.21.json +++ b/configs/solc-bin-zkevm-reference-0.4.21.json @@ -2,13 +2,15 @@ "binaries": { "0.4.21": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.21" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.4.22.json b/configs/solc-bin-zkevm-reference-0.4.22.json index 0574ef62..8209912f 100644 --- a/configs/solc-bin-zkevm-reference-0.4.22.json +++ b/configs/solc-bin-zkevm-reference-0.4.22.json @@ -2,13 +2,15 @@ "binaries": { "0.4.22": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.22" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.4.23.json b/configs/solc-bin-zkevm-reference-0.4.23.json index c6af4783..bbe6e784 100644 --- a/configs/solc-bin-zkevm-reference-0.4.23.json +++ b/configs/solc-bin-zkevm-reference-0.4.23.json @@ -2,13 +2,15 @@ "binaries": { "0.4.23": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.23" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.4.24.json b/configs/solc-bin-zkevm-reference-0.4.24.json index 8ce5de77..75a9f1e0 100644 --- a/configs/solc-bin-zkevm-reference-0.4.24.json +++ b/configs/solc-bin-zkevm-reference-0.4.24.json @@ -2,13 +2,15 @@ "binaries": { "0.4.24": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.24" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.4.25.json b/configs/solc-bin-zkevm-reference-0.4.25.json index fd1930f0..b948a39b 100644 --- a/configs/solc-bin-zkevm-reference-0.4.25.json +++ b/configs/solc-bin-zkevm-reference-0.4.25.json @@ -2,13 +2,15 @@ "binaries": { "0.4.25": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.25" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.4.26.json b/configs/solc-bin-zkevm-reference-0.4.26.json index f545050f..e6cca2d2 100644 --- a/configs/solc-bin-zkevm-reference-0.4.26.json +++ b/configs/solc-bin-zkevm-reference-0.4.26.json @@ -2,13 +2,15 @@ "binaries": { "0.4.26": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.4.26" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.5.0.json b/configs/solc-bin-zkevm-reference-0.5.0.json index 1ff93d05..bd0df49a 100644 --- a/configs/solc-bin-zkevm-reference-0.5.0.json +++ b/configs/solc-bin-zkevm-reference-0.5.0.json @@ -2,13 +2,15 @@ "binaries": { "0.5.0": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.0" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.5.1.json b/configs/solc-bin-zkevm-reference-0.5.1.json index a328cf23..d10009ec 100644 --- a/configs/solc-bin-zkevm-reference-0.5.1.json +++ b/configs/solc-bin-zkevm-reference-0.5.1.json @@ -2,13 +2,15 @@ "binaries": { "0.5.1": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.1" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.5.10.json b/configs/solc-bin-zkevm-reference-0.5.10.json index a362dfe2..1c2de58c 100644 --- a/configs/solc-bin-zkevm-reference-0.5.10.json +++ b/configs/solc-bin-zkevm-reference-0.5.10.json @@ -2,13 +2,15 @@ "binaries": { "0.5.10": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.10" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.5.11.json b/configs/solc-bin-zkevm-reference-0.5.11.json index 36789013..71c04eee 100644 --- a/configs/solc-bin-zkevm-reference-0.5.11.json +++ b/configs/solc-bin-zkevm-reference-0.5.11.json @@ -2,13 +2,15 @@ "binaries": { "0.5.11": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.11" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.5.12.json b/configs/solc-bin-zkevm-reference-0.5.12.json index 1a6e52f6..89726d03 100644 --- a/configs/solc-bin-zkevm-reference-0.5.12.json +++ b/configs/solc-bin-zkevm-reference-0.5.12.json @@ -2,13 +2,15 @@ "binaries": { "0.5.12": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.12" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.5.13.json b/configs/solc-bin-zkevm-reference-0.5.13.json index 14b3539e..961d6838 100644 --- a/configs/solc-bin-zkevm-reference-0.5.13.json +++ b/configs/solc-bin-zkevm-reference-0.5.13.json @@ -2,13 +2,15 @@ "binaries": { "0.5.13": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.13" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.5.14.json b/configs/solc-bin-zkevm-reference-0.5.14.json index 758f5418..d40cc621 100644 --- a/configs/solc-bin-zkevm-reference-0.5.14.json +++ b/configs/solc-bin-zkevm-reference-0.5.14.json @@ -2,13 +2,15 @@ "binaries": { "0.5.14": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.14" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.5.15.json b/configs/solc-bin-zkevm-reference-0.5.15.json index fa37f0f8..13c21b23 100644 --- a/configs/solc-bin-zkevm-reference-0.5.15.json +++ b/configs/solc-bin-zkevm-reference-0.5.15.json @@ -2,13 +2,15 @@ "binaries": { "0.5.15": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.15" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.5.16.json b/configs/solc-bin-zkevm-reference-0.5.16.json index 6abde4c5..231bc238 100644 --- a/configs/solc-bin-zkevm-reference-0.5.16.json +++ b/configs/solc-bin-zkevm-reference-0.5.16.json @@ -2,13 +2,15 @@ "binaries": { "0.5.16": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.16" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.5.17.json b/configs/solc-bin-zkevm-reference-0.5.17.json index 81ea45a0..4ec9fe98 100644 --- a/configs/solc-bin-zkevm-reference-0.5.17.json +++ b/configs/solc-bin-zkevm-reference-0.5.17.json @@ -2,13 +2,15 @@ "binaries": { "0.5.17": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.17" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.5.2.json b/configs/solc-bin-zkevm-reference-0.5.2.json index b56927ab..1f7a0933 100644 --- a/configs/solc-bin-zkevm-reference-0.5.2.json +++ b/configs/solc-bin-zkevm-reference-0.5.2.json @@ -2,13 +2,15 @@ "binaries": { "0.5.2": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.2" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.5.3.json b/configs/solc-bin-zkevm-reference-0.5.3.json index bd972cba..0a7bb30e 100644 --- a/configs/solc-bin-zkevm-reference-0.5.3.json +++ b/configs/solc-bin-zkevm-reference-0.5.3.json @@ -2,13 +2,15 @@ "binaries": { "0.5.3": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.3" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.5.4.json b/configs/solc-bin-zkevm-reference-0.5.4.json index 2c73c87b..11cb1b1b 100644 --- a/configs/solc-bin-zkevm-reference-0.5.4.json +++ b/configs/solc-bin-zkevm-reference-0.5.4.json @@ -2,13 +2,15 @@ "binaries": { "0.5.4": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.4" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.5.5.json b/configs/solc-bin-zkevm-reference-0.5.5.json index 5e57f52e..cfbd9be7 100644 --- a/configs/solc-bin-zkevm-reference-0.5.5.json +++ b/configs/solc-bin-zkevm-reference-0.5.5.json @@ -2,13 +2,15 @@ "binaries": { "0.5.5": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.5" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.5.6.json b/configs/solc-bin-zkevm-reference-0.5.6.json index f75b972d..a1463239 100644 --- a/configs/solc-bin-zkevm-reference-0.5.6.json +++ b/configs/solc-bin-zkevm-reference-0.5.6.json @@ -2,13 +2,15 @@ "binaries": { "0.5.6": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.6" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.5.7.json b/configs/solc-bin-zkevm-reference-0.5.7.json index b216a79d..4d42f718 100644 --- a/configs/solc-bin-zkevm-reference-0.5.7.json +++ b/configs/solc-bin-zkevm-reference-0.5.7.json @@ -2,13 +2,15 @@ "binaries": { "0.5.7": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.7" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.5.8.json b/configs/solc-bin-zkevm-reference-0.5.8.json index 24bbe8b5..9ecaac27 100644 --- a/configs/solc-bin-zkevm-reference-0.5.8.json +++ b/configs/solc-bin-zkevm-reference-0.5.8.json @@ -2,13 +2,15 @@ "binaries": { "0.5.8": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.8" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.5.9.json b/configs/solc-bin-zkevm-reference-0.5.9.json index 9d9ae30c..330f174a 100644 --- a/configs/solc-bin-zkevm-reference-0.5.9.json +++ b/configs/solc-bin-zkevm-reference-0.5.9.json @@ -2,13 +2,15 @@ "binaries": { "0.5.9": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.5.9" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.6.0.json b/configs/solc-bin-zkevm-reference-0.6.0.json index 65ab35a9..fe139ac5 100644 --- a/configs/solc-bin-zkevm-reference-0.6.0.json +++ b/configs/solc-bin-zkevm-reference-0.6.0.json @@ -2,13 +2,15 @@ "binaries": { "0.6.0": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.0" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.6.1.json b/configs/solc-bin-zkevm-reference-0.6.1.json index dfd7519e..d2636883 100644 --- a/configs/solc-bin-zkevm-reference-0.6.1.json +++ b/configs/solc-bin-zkevm-reference-0.6.1.json @@ -2,13 +2,15 @@ "binaries": { "0.6.1": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.1" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.6.10.json b/configs/solc-bin-zkevm-reference-0.6.10.json index f21bab65..90553e56 100644 --- a/configs/solc-bin-zkevm-reference-0.6.10.json +++ b/configs/solc-bin-zkevm-reference-0.6.10.json @@ -2,13 +2,15 @@ "binaries": { "0.6.10": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.10" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.6.11.json b/configs/solc-bin-zkevm-reference-0.6.11.json index 03078db6..2e57c580 100644 --- a/configs/solc-bin-zkevm-reference-0.6.11.json +++ b/configs/solc-bin-zkevm-reference-0.6.11.json @@ -2,13 +2,15 @@ "binaries": { "0.6.11": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.11" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.6.12.json b/configs/solc-bin-zkevm-reference-0.6.12.json index 3efc367a..cc2823ff 100644 --- a/configs/solc-bin-zkevm-reference-0.6.12.json +++ b/configs/solc-bin-zkevm-reference-0.6.12.json @@ -2,13 +2,15 @@ "binaries": { "0.6.12": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.12" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.6.2.json b/configs/solc-bin-zkevm-reference-0.6.2.json index e41e8e4a..bde83f70 100644 --- a/configs/solc-bin-zkevm-reference-0.6.2.json +++ b/configs/solc-bin-zkevm-reference-0.6.2.json @@ -2,13 +2,15 @@ "binaries": { "0.6.2": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.2" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.6.3.json b/configs/solc-bin-zkevm-reference-0.6.3.json index 78aa7fe1..0230582e 100644 --- a/configs/solc-bin-zkevm-reference-0.6.3.json +++ b/configs/solc-bin-zkevm-reference-0.6.3.json @@ -2,13 +2,15 @@ "binaries": { "0.6.3": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.3" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.6.4.json b/configs/solc-bin-zkevm-reference-0.6.4.json index dfe4d001..bdd98eee 100644 --- a/configs/solc-bin-zkevm-reference-0.6.4.json +++ b/configs/solc-bin-zkevm-reference-0.6.4.json @@ -2,13 +2,15 @@ "binaries": { "0.6.4": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.4" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.6.5.json b/configs/solc-bin-zkevm-reference-0.6.5.json index 9777c895..8c882c3d 100644 --- a/configs/solc-bin-zkevm-reference-0.6.5.json +++ b/configs/solc-bin-zkevm-reference-0.6.5.json @@ -2,13 +2,15 @@ "binaries": { "0.6.5": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.5" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.6.6.json b/configs/solc-bin-zkevm-reference-0.6.6.json index 342f2144..8c368b56 100644 --- a/configs/solc-bin-zkevm-reference-0.6.6.json +++ b/configs/solc-bin-zkevm-reference-0.6.6.json @@ -2,13 +2,15 @@ "binaries": { "0.6.6": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.6" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.6.7.json b/configs/solc-bin-zkevm-reference-0.6.7.json index 97969330..673cc2b5 100644 --- a/configs/solc-bin-zkevm-reference-0.6.7.json +++ b/configs/solc-bin-zkevm-reference-0.6.7.json @@ -2,13 +2,15 @@ "binaries": { "0.6.7": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.7" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.6.8.json b/configs/solc-bin-zkevm-reference-0.6.8.json index 1630b196..1ab0244c 100644 --- a/configs/solc-bin-zkevm-reference-0.6.8.json +++ b/configs/solc-bin-zkevm-reference-0.6.8.json @@ -2,13 +2,15 @@ "binaries": { "0.6.8": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.8" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.6.9.json b/configs/solc-bin-zkevm-reference-0.6.9.json index 5399e86c..8024575f 100644 --- a/configs/solc-bin-zkevm-reference-0.6.9.json +++ b/configs/solc-bin-zkevm-reference-0.6.9.json @@ -2,13 +2,15 @@ "binaries": { "0.6.9": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.6.9" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.7.0.json b/configs/solc-bin-zkevm-reference-0.7.0.json index b8af9182..387c7b94 100644 --- a/configs/solc-bin-zkevm-reference-0.7.0.json +++ b/configs/solc-bin-zkevm-reference-0.7.0.json @@ -2,13 +2,15 @@ "binaries": { "0.7.0": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.7.0" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.7.1.json b/configs/solc-bin-zkevm-reference-0.7.1.json index b61f1375..2d7d88ae 100644 --- a/configs/solc-bin-zkevm-reference-0.7.1.json +++ b/configs/solc-bin-zkevm-reference-0.7.1.json @@ -2,13 +2,15 @@ "binaries": { "0.7.1": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.7.1" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.7.2.json b/configs/solc-bin-zkevm-reference-0.7.2.json index 5374f1fb..163250c3 100644 --- a/configs/solc-bin-zkevm-reference-0.7.2.json +++ b/configs/solc-bin-zkevm-reference-0.7.2.json @@ -2,13 +2,15 @@ "binaries": { "0.7.2": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.7.2" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.7.3.json b/configs/solc-bin-zkevm-reference-0.7.3.json index b25843e5..c227c9a7 100644 --- a/configs/solc-bin-zkevm-reference-0.7.3.json +++ b/configs/solc-bin-zkevm-reference-0.7.3.json @@ -2,13 +2,15 @@ "binaries": { "0.7.3": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.7.3" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.7.4.json b/configs/solc-bin-zkevm-reference-0.7.4.json index d379edef..c91d62e5 100644 --- a/configs/solc-bin-zkevm-reference-0.7.4.json +++ b/configs/solc-bin-zkevm-reference-0.7.4.json @@ -2,13 +2,15 @@ "binaries": { "0.7.4": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.7.4" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.7.5.json b/configs/solc-bin-zkevm-reference-0.7.5.json index 1e50e87c..a361bb5b 100644 --- a/configs/solc-bin-zkevm-reference-0.7.5.json +++ b/configs/solc-bin-zkevm-reference-0.7.5.json @@ -2,13 +2,15 @@ "binaries": { "0.7.5": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.7.5" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.7.6.json b/configs/solc-bin-zkevm-reference-0.7.6.json index 086670c2..30cfd408 100644 --- a/configs/solc-bin-zkevm-reference-0.7.6.json +++ b/configs/solc-bin-zkevm-reference-0.7.6.json @@ -2,13 +2,15 @@ "binaries": { "0.7.6": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.7.6" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.8.0.json b/configs/solc-bin-zkevm-reference-0.8.0.json index c7df36ab..f78e9bf6 100644 --- a/configs/solc-bin-zkevm-reference-0.8.0.json +++ b/configs/solc-bin-zkevm-reference-0.8.0.json @@ -2,13 +2,15 @@ "binaries": { "0.8.0": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.0" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.8.1.json b/configs/solc-bin-zkevm-reference-0.8.1.json index 1e2a1c07..e14e3591 100644 --- a/configs/solc-bin-zkevm-reference-0.8.1.json +++ b/configs/solc-bin-zkevm-reference-0.8.1.json @@ -2,13 +2,15 @@ "binaries": { "0.8.1": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.1" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.8.10.json b/configs/solc-bin-zkevm-reference-0.8.10.json index 31de493f..536539d7 100644 --- a/configs/solc-bin-zkevm-reference-0.8.10.json +++ b/configs/solc-bin-zkevm-reference-0.8.10.json @@ -2,13 +2,15 @@ "binaries": { "0.8.10": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.10" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.8.11.json b/configs/solc-bin-zkevm-reference-0.8.11.json index 2fabc7f7..1c2e29ff 100644 --- a/configs/solc-bin-zkevm-reference-0.8.11.json +++ b/configs/solc-bin-zkevm-reference-0.8.11.json @@ -2,13 +2,15 @@ "binaries": { "0.8.11": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.11" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.8.12.json b/configs/solc-bin-zkevm-reference-0.8.12.json index 23c36cfb..740d00ec 100644 --- a/configs/solc-bin-zkevm-reference-0.8.12.json +++ b/configs/solc-bin-zkevm-reference-0.8.12.json @@ -2,13 +2,15 @@ "binaries": { "0.8.12": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.12" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.8.13.json b/configs/solc-bin-zkevm-reference-0.8.13.json index 01486927..0df8c085 100644 --- a/configs/solc-bin-zkevm-reference-0.8.13.json +++ b/configs/solc-bin-zkevm-reference-0.8.13.json @@ -2,13 +2,15 @@ "binaries": { "0.8.13": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.13" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.8.14.json b/configs/solc-bin-zkevm-reference-0.8.14.json index 1a73a210..7f0cabf3 100644 --- a/configs/solc-bin-zkevm-reference-0.8.14.json +++ b/configs/solc-bin-zkevm-reference-0.8.14.json @@ -2,13 +2,15 @@ "binaries": { "0.8.14": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.14" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.8.15.json b/configs/solc-bin-zkevm-reference-0.8.15.json index 53a34348..1c164e6d 100644 --- a/configs/solc-bin-zkevm-reference-0.8.15.json +++ b/configs/solc-bin-zkevm-reference-0.8.15.json @@ -2,13 +2,15 @@ "binaries": { "0.8.15": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.15" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.8.16.json b/configs/solc-bin-zkevm-reference-0.8.16.json index 45f64ece..c0675f5f 100644 --- a/configs/solc-bin-zkevm-reference-0.8.16.json +++ b/configs/solc-bin-zkevm-reference-0.8.16.json @@ -2,13 +2,15 @@ "binaries": { "0.8.16": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.16" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.8.17.json b/configs/solc-bin-zkevm-reference-0.8.17.json index 58d6b0d0..601cd26f 100644 --- a/configs/solc-bin-zkevm-reference-0.8.17.json +++ b/configs/solc-bin-zkevm-reference-0.8.17.json @@ -2,13 +2,15 @@ "binaries": { "0.8.17": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.17" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.8.18.json b/configs/solc-bin-zkevm-reference-0.8.18.json index b719023b..a75e9b38 100644 --- a/configs/solc-bin-zkevm-reference-0.8.18.json +++ b/configs/solc-bin-zkevm-reference-0.8.18.json @@ -2,13 +2,15 @@ "binaries": { "0.8.18": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.18" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.8.19.json b/configs/solc-bin-zkevm-reference-0.8.19.json index 14fe1585..4da5bf0d 100644 --- a/configs/solc-bin-zkevm-reference-0.8.19.json +++ b/configs/solc-bin-zkevm-reference-0.8.19.json @@ -2,13 +2,15 @@ "binaries": { "0.8.19": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.19" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.8.2.json b/configs/solc-bin-zkevm-reference-0.8.2.json index f12fe7c9..072ce4a0 100644 --- a/configs/solc-bin-zkevm-reference-0.8.2.json +++ b/configs/solc-bin-zkevm-reference-0.8.2.json @@ -2,13 +2,15 @@ "binaries": { "0.8.2": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.2" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.8.20.json b/configs/solc-bin-zkevm-reference-0.8.20.json index 45979ba0..c545ba13 100644 --- a/configs/solc-bin-zkevm-reference-0.8.20.json +++ b/configs/solc-bin-zkevm-reference-0.8.20.json @@ -2,13 +2,15 @@ "binaries": { "0.8.20": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.20" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.8.21.json b/configs/solc-bin-zkevm-reference-0.8.21.json index 05565fe8..1851be1b 100644 --- a/configs/solc-bin-zkevm-reference-0.8.21.json +++ b/configs/solc-bin-zkevm-reference-0.8.21.json @@ -2,13 +2,15 @@ "binaries": { "0.8.21": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.21" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.8.22.json b/configs/solc-bin-zkevm-reference-0.8.22.json index 4aabf118..f8016e3e 100644 --- a/configs/solc-bin-zkevm-reference-0.8.22.json +++ b/configs/solc-bin-zkevm-reference-0.8.22.json @@ -2,13 +2,15 @@ "binaries": { "0.8.22": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.22" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.8.23.json b/configs/solc-bin-zkevm-reference-0.8.23.json index ace07352..1c41ec57 100644 --- a/configs/solc-bin-zkevm-reference-0.8.23.json +++ b/configs/solc-bin-zkevm-reference-0.8.23.json @@ -2,13 +2,15 @@ "binaries": { "0.8.23": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.23" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.8.24.json b/configs/solc-bin-zkevm-reference-0.8.24.json new file mode 100644 index 00000000..b6a4a765 --- /dev/null +++ b/configs/solc-bin-zkevm-reference-0.8.24.json @@ -0,0 +1,16 @@ +{ + "binaries": { + "0.8.24": { + "is_enabled": true, + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" + } + }, + "platforms": { + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" + } +} diff --git a/configs/solc-bin-zkevm-reference-0.8.3.json b/configs/solc-bin-zkevm-reference-0.8.3.json index 90a48950..dd53fd62 100644 --- a/configs/solc-bin-zkevm-reference-0.8.3.json +++ b/configs/solc-bin-zkevm-reference-0.8.3.json @@ -2,13 +2,15 @@ "binaries": { "0.8.3": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.3" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.8.4.json b/configs/solc-bin-zkevm-reference-0.8.4.json index 96d108ea..dddb0e3d 100644 --- a/configs/solc-bin-zkevm-reference-0.8.4.json +++ b/configs/solc-bin-zkevm-reference-0.8.4.json @@ -2,13 +2,15 @@ "binaries": { "0.8.4": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.4" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.8.5.json b/configs/solc-bin-zkevm-reference-0.8.5.json index b03d94bc..a42f64cf 100644 --- a/configs/solc-bin-zkevm-reference-0.8.5.json +++ b/configs/solc-bin-zkevm-reference-0.8.5.json @@ -2,13 +2,15 @@ "binaries": { "0.8.5": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.5" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.8.6.json b/configs/solc-bin-zkevm-reference-0.8.6.json index c907aa78..366bbf7f 100644 --- a/configs/solc-bin-zkevm-reference-0.8.6.json +++ b/configs/solc-bin-zkevm-reference-0.8.6.json @@ -2,13 +2,15 @@ "binaries": { "0.8.6": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.6" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.8.7.json b/configs/solc-bin-zkevm-reference-0.8.7.json index de451713..b961a5ae 100644 --- a/configs/solc-bin-zkevm-reference-0.8.7.json +++ b/configs/solc-bin-zkevm-reference-0.8.7.json @@ -2,13 +2,15 @@ "binaries": { "0.8.7": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.7" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.8.8.json b/configs/solc-bin-zkevm-reference-0.8.8.json index ca96ccc5..4379448d 100644 --- a/configs/solc-bin-zkevm-reference-0.8.8.json +++ b/configs/solc-bin-zkevm-reference-0.8.8.json @@ -2,13 +2,15 @@ "binaries": { "0.8.8": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.8" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/solc-bin-zkevm-reference-0.8.9.json b/configs/solc-bin-zkevm-reference-0.8.9.json index 9d50570f..8153ac7c 100644 --- a/configs/solc-bin-zkevm-reference-0.8.9.json +++ b/configs/solc-bin-zkevm-reference-0.8.9.json @@ -2,13 +2,15 @@ "binaries": { "0.8.9": { "is_enabled": true, - "protocol": "solc-bin-list", - "source": "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/${PLATFORM}/list.json", - "destination": "./solc-bin/solc-0.8.9" + "protocol": "https", + "source": "https://github.com/matter-labs/era-solidity/releases/download/${VERSION}-1.0.0/solc-${PLATFORM}-${VERSION}-1.0.0", + "destination": "./solc-bin/solc-${VERSION}" } }, "platforms": { - "linux": "linux-amd64", - "macos": "macosx-amd64" + "linux-amd64": "linux-amd64", + "linux-arm64": "linux-arm64", + "macos-amd64": "macosx-amd64", + "macos-arm64": "macosx-arm64" } } diff --git a/configs/vyper-bin-default.json b/configs/vyper-bin-default.json index ecc03e0f..a9e7b171 100644 --- a/configs/vyper-bin-default.json +++ b/configs/vyper-bin-default.json @@ -20,7 +20,8 @@ } }, "platforms": { - "linux": "linux", - "macos": "darwin" + "linux-amd64": "linux", + "macos-amd64": "darwin", + "macos-arm64": "darwin" } } diff --git a/coverage_watcher/Cargo.toml b/coverage_watcher/Cargo.toml index 4be6266b..18274203 100644 --- a/coverage_watcher/Cargo.toml +++ b/coverage_watcher/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "coverage-watcher" -version = "1.3.3" +version = "1.4.1" authors = [ "Oleksandr Zarudnyi ", "Anton Dyadyuk ", @@ -20,4 +20,4 @@ anyhow = "1.0" serde = { version = "1.0", features = [ "derive" ] } serde_yaml = "0.9" -compiler-common = { git = "https://github.com/matter-labs/era-compiler-common", branch = "main" } +era-compiler-common = { git = "https://github.com/matter-labs/era-compiler-common", branch = "main" } diff --git a/coverage_watcher/src/coverage_watcher/main.rs b/coverage_watcher/src/coverage_watcher/main.rs index 2a406b95..8eeab2ec 100644 --- a/coverage_watcher/src/coverage_watcher/main.rs +++ b/coverage_watcher/src/coverage_watcher/main.rs @@ -36,7 +36,7 @@ fn main() -> anyhow::Result<()> { name: "solidity/simple".to_string(), directories: vec![TestsDirectory { path: PathBuf::from("tests/solidity/simple"), - extension: compiler_common::EXTENSION_SOLIDITY.to_string(), + extension: era_compiler_common::EXTENSION_SOLIDITY.to_string(), flatten: false, }], }, @@ -44,7 +44,7 @@ fn main() -> anyhow::Result<()> { name: "vyper/simple".to_string(), directories: vec![TestsDirectory { path: PathBuf::from("tests/vyper/simple"), - extension: compiler_common::EXTENSION_VYPER.to_string(), + extension: era_compiler_common::EXTENSION_VYPER.to_string(), flatten: false, }], }, @@ -54,7 +54,7 @@ fn main() -> anyhow::Result<()> { name: "solidity/complex".to_string(), directories: vec![TestsDirectory { path: PathBuf::from("tests/solidity/complex"), - extension: compiler_common::EXTENSION_JSON.to_string(), + extension: era_compiler_common::EXTENSION_JSON.to_string(), flatten: false, }], }, @@ -62,7 +62,7 @@ fn main() -> anyhow::Result<()> { name: "vyper/complex".to_string(), directories: vec![TestsDirectory { path: PathBuf::from("tests/vyper/complex"), - extension: compiler_common::EXTENSION_JSON.to_string(), + extension: era_compiler_common::EXTENSION_JSON.to_string(), flatten: false, }], }, @@ -72,7 +72,7 @@ fn main() -> anyhow::Result<()> { name: "solidity/external".to_string(), directories: vec![TestsDirectory { path: PathBuf::from("solidity/test/libsolidity/semanticTests"), - extension: compiler_common::EXTENSION_SOLIDITY.to_string(), + extension: era_compiler_common::EXTENSION_SOLIDITY.to_string(), flatten: false, }], }, @@ -81,12 +81,12 @@ fn main() -> anyhow::Result<()> { directories: vec![ TestsDirectory { path: PathBuf::from("tests/vyper/external"), - extension: compiler_common::EXTENSION_VYPER.to_string(), + extension: era_compiler_common::EXTENSION_VYPER.to_string(), flatten: false, }, TestsDirectory { path: PathBuf::from("tests/vyper/complex/external"), - extension: compiler_common::EXTENSION_JSON.to_string(), + extension: era_compiler_common::EXTENSION_JSON.to_string(), flatten: true, }, ], diff --git a/era-contracts b/era-contracts new file mode 160000 index 00000000..2dfbc6ba --- /dev/null +++ b/era-contracts @@ -0,0 +1 @@ +Subproject commit 2dfbc6bac84ecada93cab4a0dea113bc2aceba1c diff --git a/solidity b/solidity index 58811f13..c0ef06c3 160000 --- a/solidity +++ b/solidity @@ -1 +1 @@ -Subproject commit 58811f134ac369b20c2ec1120907321edf08fff1 +Subproject commit c0ef06c362f86e1e35c4663e27913e1cabd3f5e6 diff --git a/solidity_adapter/Cargo.toml b/solidity_adapter/Cargo.toml index 0849e5fd..9caaf456 100644 --- a/solidity_adapter/Cargo.toml +++ b/solidity_adapter/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "solidity-adapter" -version = "1.3.3" +version = "1.4.1" authors = [ "Oleksandr Zarudnyi ", "Anton Dyadyuk ", @@ -27,7 +27,7 @@ semver = { version = "1.0", features = [ "serde" ] } regex = "1.7" md5 = "0.7" -compiler-common = { git = "https://github.com/matter-labs/era-compiler-common", branch = "main" } +era-compiler-common = { git = "https://github.com/matter-labs/era-compiler-common", branch = "main" } [dependencies.web3] version = "0.19" diff --git a/solidity_adapter/src/lib.rs b/solidity_adapter/src/lib.rs index 921412a3..6c86c190 100644 --- a/solidity_adapter/src/lib.rs +++ b/solidity_adapter/src/lib.rs @@ -43,9 +43,10 @@ pub fn account_address(index: usize) -> web3::types::Address { let address = web3::types::U256::from_str(ZERO_ADDRESS).expect("Default address"); let address = address.add(index * ADDRESS_INDEX_MULTIPLIER); - let mut bytes = [0u8; compiler_common::BYTE_LENGTH_FIELD]; + let mut bytes = [0u8; era_compiler_common::BYTE_LENGTH_FIELD]; address.to_big_endian(&mut bytes); web3::types::Address::from_slice( - &bytes[compiler_common::BYTE_LENGTH_FIELD - compiler_common::BYTE_LENGTH_ETH_ADDRESS..], + &bytes[era_compiler_common::BYTE_LENGTH_FIELD + - era_compiler_common::BYTE_LENGTH_ETH_ADDRESS..], ) } diff --git a/solidity_adapter/src/test/function_call/mod.rs b/solidity_adapter/src/test/function_call/mod.rs index 96c37b1e..8c513209 100644 --- a/solidity_adapter/src/test/function_call/mod.rs +++ b/solidity_adapter/src/test/function_call/mod.rs @@ -201,7 +201,7 @@ impl TryFrom for FunctionCall { Ok(Self::IsoltestSideEffectsTest { input, expected }) } "balance" => { - if input.len() > compiler_common::BYTE_LENGTH_FIELD { + if input.len() > era_compiler_common::BYTE_LENGTH_FIELD { anyhow::bail!("balance function expect one or zero element"); } if expected.len() != 1 { @@ -214,8 +214,8 @@ impl TryFrom for FunctionCall { if !input .iter() .take( - compiler_common::BYTE_LENGTH_FIELD - - compiler_common::BYTE_LENGTH_ETH_ADDRESS, + era_compiler_common::BYTE_LENGTH_FIELD + - era_compiler_common::BYTE_LENGTH_ETH_ADDRESS, ) .all(|byte| byte.eq(&0)) { @@ -224,8 +224,8 @@ impl TryFrom for FunctionCall { ); } Some(web3::types::Address::from_slice( - &input[compiler_common::BYTE_LENGTH_FIELD - - compiler_common::BYTE_LENGTH_ETH_ADDRESS..], + &input[era_compiler_common::BYTE_LENGTH_FIELD + - era_compiler_common::BYTE_LENGTH_ETH_ADDRESS..], )) }, expected: expected.into_iter().next().expect("Always valid"), @@ -251,7 +251,7 @@ impl TryFrom for FunctionCall { }) } "account" => { - if input.len() != compiler_common::BYTE_LENGTH_FIELD { + if input.len() != era_compiler_common::BYTE_LENGTH_FIELD { anyhow::bail!("account function expect one element"); } if expected.len() != 1 { @@ -265,13 +265,13 @@ impl TryFrom for FunctionCall { } let input = web3::types::U256::from_big_endian(input.as_slice()); let expected = expected.into_iter().next().expect("Always valid"); - let mut expected_bytes = [0u8; compiler_common::BYTE_LENGTH_FIELD]; + let mut expected_bytes = [0u8; era_compiler_common::BYTE_LENGTH_FIELD]; expected.to_big_endian(&mut expected_bytes); Ok(Self::Account { input: input.as_usize(), expected: web3::types::Address::from_slice( &expected_bytes[expected_bytes.len() - - compiler_common::BYTE_LENGTH_ETH_ADDRESS..], + - era_compiler_common::BYTE_LENGTH_ETH_ADDRESS..], ), }) } @@ -347,9 +347,9 @@ fn signature(identifier: Option, types: Option>) -> String /// fn bytes_as_u256(bytes: &[u8]) -> Vec { let mut result = Vec::new(); - for value in bytes.chunks(compiler_common::BYTE_LENGTH_FIELD) { + for value in bytes.chunks(era_compiler_common::BYTE_LENGTH_FIELD) { let mut value = value.to_owned(); - while value.len() < compiler_common::BYTE_LENGTH_FIELD { + while value.len() < era_compiler_common::BYTE_LENGTH_FIELD { value.push(0); } result.push(web3::types::U256::from_big_endian(value.as_slice())); diff --git a/solidity_adapter/src/test/function_call/parser/lexical/mod.rs b/solidity_adapter/src/test/function_call/parser/lexical/mod.rs index 6a2aca22..1047b449 100644 --- a/solidity_adapter/src/test/function_call/parser/lexical/mod.rs +++ b/solidity_adapter/src/test/function_call/parser/lexical/mod.rs @@ -11,7 +11,6 @@ mod token; pub use self::error::Error; pub use self::stream::TokenStream; -pub use self::token::lexeme::identifier::Identifier; pub use self::token::lexeme::keyword::Keyword; pub use self::token::lexeme::literal::boolean::Boolean as BooleanLiteral; pub use self::token::lexeme::literal::hex::Hex as HexLiteral; diff --git a/solidity_adapter/src/test/function_call/parser/lexical/stream/word/tests.rs b/solidity_adapter/src/test/function_call/parser/lexical/stream/word/tests.rs index 8a1543f1..46561a09 100644 --- a/solidity_adapter/src/test/function_call/parser/lexical/stream/word/tests.rs +++ b/solidity_adapter/src/test/function_call/parser/lexical/stream/word/tests.rs @@ -76,7 +76,7 @@ fn ok_keyword_unsigned_integer_max() { let expected = Output::new( input.len(), Lexeme::Keyword(Keyword::new_integer_unsigned( - compiler_common::BIT_LENGTH_FIELD, + era_compiler_common::BIT_LENGTH_FIELD, )), ); let result = parse(input); diff --git a/solidity_adapter/src/test/function_call/parser/lexical/token/lexeme/keyword.rs b/solidity_adapter/src/test/function_call/parser/lexical/token/lexeme/keyword.rs index 0833da86..afe1da02 100644 --- a/solidity_adapter/src/test/function_call/parser/lexical/token/lexeme/keyword.rs +++ b/solidity_adapter/src/test/function_call/parser/lexical/token/lexeme/keyword.rs @@ -75,11 +75,11 @@ pub enum Keyword { impl Keyword { /// The range including the minimal and maximal integer bit-lengths. pub const INTEGER_BIT_LENGTH_RANGE: RangeInclusive = - compiler_common::BIT_LENGTH_BYTE..=compiler_common::BIT_LENGTH_FIELD; + era_compiler_common::BIT_LENGTH_BYTE..=era_compiler_common::BIT_LENGTH_FIELD; /// The range including the minimal and maximal bytes byte-lengths. pub const BYTES_BYTE_LENGTH_RANGE: RangeInclusive = - compiler_common::BYTE_LENGTH_BYTE..=compiler_common::BYTE_LENGTH_FIELD; + era_compiler_common::BYTE_LENGTH_BYTE..=era_compiler_common::BYTE_LENGTH_FIELD; /// /// Creates a `uint{N}` keyword. @@ -180,10 +180,10 @@ impl TryFrom<&str> for Keyword { Self::INTEGER_BIT_LENGTH_RANGE, )); } - if bit_length % compiler_common::BIT_LENGTH_BYTE != 0 { + if bit_length % era_compiler_common::BIT_LENGTH_BYTE != 0 { return Err(Error::IntegerBitLengthNotMultipleOfEight( bit_length, - compiler_common::BIT_LENGTH_BYTE, + era_compiler_common::BIT_LENGTH_BYTE, )); } return Ok(Self::new_integer_unsigned(bit_length)); @@ -203,10 +203,10 @@ impl TryFrom<&str> for Keyword { Self::INTEGER_BIT_LENGTH_RANGE, )); } - if bit_length % compiler_common::BIT_LENGTH_BYTE != 0 { + if bit_length % era_compiler_common::BIT_LENGTH_BYTE != 0 { return Err(Error::IntegerBitLengthNotMultipleOfEight( bit_length, - compiler_common::BIT_LENGTH_BYTE, + era_compiler_common::BIT_LENGTH_BYTE, )); } return Ok(Self::new_integer_signed(bit_length)); diff --git a/solidity_adapter/src/test/function_call/parser/mod.rs b/solidity_adapter/src/test/function_call/parser/mod.rs index cfd70c0a..e258099a 100644 --- a/solidity_adapter/src/test/function_call/parser/mod.rs +++ b/solidity_adapter/src/test/function_call/parser/mod.rs @@ -5,28 +5,13 @@ mod lexical; mod syntax; -pub use lexical::BooleanLiteral as LexicalBooleanLiteral; -pub use lexical::Error as LexicalError; -pub use lexical::HexLiteral as LexicalHexLiteral; -pub use lexical::IntegerLiteral as LexicalIntegerLiteral; -pub use lexical::StringLiteral as LexicalStringLiteral; -pub use syntax::Alignment; -pub use syntax::BooleanLiteral; pub use syntax::Call; pub use syntax::CallVariant; -pub use syntax::Error as SyntaxError; pub use syntax::Event; pub use syntax::EventVariant; pub use syntax::Gas; pub use syntax::GasVariant; -pub use syntax::HexLiteral; pub use syntax::Identifier; -pub use syntax::IntegerLiteral; -pub use syntax::Literal; pub use syntax::Parser; -pub use syntax::ParsingError; -pub use syntax::StringLiteral; pub use syntax::Type; -pub use syntax::TypeVariant; pub use syntax::Unit; -pub use syntax::Value; diff --git a/solidity_adapter/src/test/function_call/parser/syntax/mod.rs b/solidity_adapter/src/test/function_call/parser/syntax/mod.rs index 1795b154..661bfdbc 100644 --- a/solidity_adapter/src/test/function_call/parser/syntax/mod.rs +++ b/solidity_adapter/src/test/function_call/parser/syntax/mod.rs @@ -6,8 +6,6 @@ mod error; mod parser; mod tree; -pub use self::error::Error; -pub use self::error::ParsingError; pub use self::parser::Parser; pub use self::tree::call::variant::Variant as CallVariant; pub use self::tree::call::Call; @@ -16,13 +14,5 @@ pub use self::tree::event::Event; pub use self::tree::gas::variant::Variant as GasVariant; pub use self::tree::gas::Gas; pub use self::tree::identifier::Identifier; -pub use self::tree::literal::alignment::Alignment; -pub use self::tree::literal::boolean::Literal as BooleanLiteral; -pub use self::tree::literal::hex::Literal as HexLiteral; -pub use self::tree::literal::integer::Literal as IntegerLiteral; -pub use self::tree::literal::string::Literal as StringLiteral; -pub use self::tree::literal::Literal; -pub use self::tree::r#type::variant::Variant as TypeVariant; pub use self::tree::r#type::Type; pub use self::tree::value::unit::Unit; -pub use self::tree::value::Value; diff --git a/solidity_adapter/src/test/function_call/parser/syntax/parser/event.rs b/solidity_adapter/src/test/function_call/parser/syntax/parser/event.rs index 96e7e24e..d0cbdc17 100644 --- a/solidity_adapter/src/test/function_call/parser/syntax/parser/event.rs +++ b/solidity_adapter/src/test/function_call/parser/syntax/parser/event.rs @@ -339,9 +339,6 @@ impl Parser { #[cfg(test)] mod tests { - - use crate::test::function_call::parser::lexical::Identifier as LexicalIdentifier; - use crate::test::function_call::parser::lexical::Lexeme; use crate::test::function_call::parser::lexical::Location; diff --git a/solidity_adapter/src/test/function_call/parser/syntax/parser/type/tuple.rs b/solidity_adapter/src/test/function_call/parser/syntax/parser/type/tuple.rs index 62c0a01d..70619529 100644 --- a/solidity_adapter/src/test/function_call/parser/syntax/parser/type/tuple.rs +++ b/solidity_adapter/src/test/function_call/parser/syntax/parser/type/tuple.rs @@ -163,7 +163,7 @@ mod tests { TypeVariant::tuple(vec![ Type::new( Location::test(1, 2), - TypeVariant::integer_unsigned(compiler_common::BIT_LENGTH_FIELD), + TypeVariant::integer_unsigned(era_compiler_common::BIT_LENGTH_FIELD), ), Type::new(Location::test(1, 11), TypeVariant::tuple(Vec::new())), Type::new( diff --git a/solidity_adapter/src/test/function_call/parser/syntax/tree/literal/boolean.rs b/solidity_adapter/src/test/function_call/parser/syntax/tree/literal/boolean.rs index 02b2df8a..6ee818c6 100644 --- a/solidity_adapter/src/test/function_call/parser/syntax/tree/literal/boolean.rs +++ b/solidity_adapter/src/test/function_call/parser/syntax/tree/literal/boolean.rs @@ -35,7 +35,7 @@ impl Literal { /// Converts literal to bytes. /// pub fn as_bytes_be(&self) -> Vec { - let mut result = vec![0u8; compiler_common::BYTE_LENGTH_FIELD]; + let mut result = vec![0u8; era_compiler_common::BYTE_LENGTH_FIELD]; if self.inner == LexicalBooleanLiteral::True { if self.alignment == Alignment::Left { result[0] = 1; diff --git a/solidity_adapter/src/test/function_call/parser/syntax/tree/literal/hex.rs b/solidity_adapter/src/test/function_call/parser/syntax/tree/literal/hex.rs index 7221d217..24827e6f 100644 --- a/solidity_adapter/src/test/function_call/parser/syntax/tree/literal/hex.rs +++ b/solidity_adapter/src/test/function_call/parser/syntax/tree/literal/hex.rs @@ -37,7 +37,7 @@ impl Literal { /// Converts literal to bytes. /// pub fn as_bytes_be(&self) -> Vec { - let mut result = vec![0u8; compiler_common::BYTE_LENGTH_FIELD]; + let mut result = vec![0u8; era_compiler_common::BYTE_LENGTH_FIELD]; web3::types::U256::from_str(self.inner.inner.as_str()) .expect("Always valid") .to_big_endian(&mut result); diff --git a/solidity_adapter/src/test/function_call/parser/syntax/tree/literal/integer.rs b/solidity_adapter/src/test/function_call/parser/syntax/tree/literal/integer.rs index fed3c492..b513bf48 100644 --- a/solidity_adapter/src/test/function_call/parser/syntax/tree/literal/integer.rs +++ b/solidity_adapter/src/test/function_call/parser/syntax/tree/literal/integer.rs @@ -39,7 +39,7 @@ impl Literal { /// Converts literal to bytes. /// pub fn as_bytes_be(&self) -> Vec { - let mut result = vec![0u8; compiler_common::BYTE_LENGTH_FIELD]; + let mut result = vec![0u8; era_compiler_common::BYTE_LENGTH_FIELD]; match &self.inner { LexicalIntegerLiteral::Decimal { inner, negative } => { let mut number = @@ -63,9 +63,12 @@ impl Literal { } } if self.alignment == Alignment::Left { - result.extend(vec![0; compiler_common::BYTE_LENGTH_FIELD - result.len()]); + result.extend(vec![ + 0; + era_compiler_common::BYTE_LENGTH_FIELD - result.len() + ]); } else { - let mut zeroes = vec![0; compiler_common::BYTE_LENGTH_FIELD - result.len()]; + let mut zeroes = vec![0; era_compiler_common::BYTE_LENGTH_FIELD - result.len()]; zeroes.extend(result); result = zeroes; } diff --git a/solidity_adapter/src/test/function_call/parser/syntax/tree/literal/string.rs b/solidity_adapter/src/test/function_call/parser/syntax/tree/literal/string.rs index cc198c2a..5f781b92 100644 --- a/solidity_adapter/src/test/function_call/parser/syntax/tree/literal/string.rs +++ b/solidity_adapter/src/test/function_call/parser/syntax/tree/literal/string.rs @@ -93,9 +93,9 @@ impl Literal { anyhow::bail!("Unterminated escape sequence"); } let mut pad_len = 0; - if result.len() % compiler_common::BYTE_LENGTH_FIELD != 0 || result.is_empty() { - pad_len = compiler_common::BYTE_LENGTH_FIELD - - result.len() % compiler_common::BYTE_LENGTH_FIELD; + if result.len() % era_compiler_common::BYTE_LENGTH_FIELD != 0 || result.is_empty() { + pad_len = era_compiler_common::BYTE_LENGTH_FIELD + - result.len() % era_compiler_common::BYTE_LENGTH_FIELD; } if self.alignment == Alignment::Right { let mut zeroes = vec![0; pad_len]; diff --git a/solidity_adapter/src/test/mod.rs b/solidity_adapter/src/test/mod.rs index 4e2a4f8b..d631f1b6 100644 --- a/solidity_adapter/src/test/mod.rs +++ b/solidity_adapter/src/test/mod.rs @@ -41,7 +41,7 @@ impl TryFrom<&Path> for Test { let comment_start = if path .extension() .ok_or_else(|| anyhow::anyhow!("Failed to get file extension"))? - == compiler_common::EXTENSION_VYPER + == era_compiler_common::EXTENSION_VYPER { "# ".to_owned() } else { @@ -123,13 +123,10 @@ fn process_sources(data: &str, path: &Path) -> anyhow::Result ( captures.get(1).expect("Always exists").as_str().to_owned(), - PathBuf::try_from(captures.get(2).expect("Always exists").as_str()), + PathBuf::from(captures.get(2).expect("Always exists").as_str()), ), - None => (data.to_owned(), PathBuf::try_from(data)), + None => (data.to_owned(), PathBuf::from(data)), }; - let relative_path = relative_path.map_err(|err| { - anyhow::anyhow!("Invalid path on line {}: {}", index + 1, err) - })?; let path = path .parent() diff --git a/solidity_adapter/src/test/params/evm_version.rs b/solidity_adapter/src/test/params/evm_version.rs index fa058bc8..b21ea982 100644 --- a/solidity_adapter/src/test/params/evm_version.rs +++ b/solidity_adapter/src/test/params/evm_version.rs @@ -105,6 +105,8 @@ pub enum EVM { Paris, /// Shanghai EVM version. Shanghai, + /// Cancun EVM version. + Cancun, } impl TryFrom<&str> for EVM { @@ -123,6 +125,7 @@ impl TryFrom<&str> for EVM { "london" => EVM::London, "paris" => EVM::Paris, "shanghai" => EVM::Shanghai, + "cancun" => EVM::Cancun, _ => anyhow::bail!("Invalid EVM: {}", value), }) } diff --git a/system-contracts b/system-contracts deleted file mode 160000 index 408dffdf..00000000 --- a/system-contracts +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 408dffdf089a81183daada55f6a5cacacc4cde1c diff --git a/system-contracts-stable-build b/system-contracts-stable-build index 67b04b6a87926cffa098e993c5f0e555736c32f0..b559b1306c82818ad0f21d0e4f92a8fa6a52f88b 100644 GIT binary patch literal 406907 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%0Az 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 T$OW{V4Ri8GR~di-!vE?&4x2@E literal 346741 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 r%6RbscGU6+R8