diff --git a/.circleci/config.yml b/.circleci/config.yml index 58c382435..cf9d3053e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -566,6 +566,13 @@ defaults: binary_type: native # NOTE: Tests crash on nodejs 17: "Error: error:0308010C:digital envelope routines::unsupported" nodejs_version: '16' + - job_native_test_ext_uniswap: &job_native_test_ext_uniswap + <<: *workflow_ubuntu2004_static + name: t_native_test_ext_uniswap + project: uniswap + binary_type: native + # NOTE: Tests crash on nodejs 17: "Error: error:0308010C:digital envelope routines::unsupported" + nodejs_version: '16' - job_ems_test_ext_colony: &job_ems_test_ext_colony <<: *workflow_emscripten name: t_ems_test_ext_colony @@ -1449,6 +1456,7 @@ workflows: - t_ems_ext: *job_native_test_ext_bleeps - t_ems_ext: *job_native_test_ext_pool_together - t_ems_ext: *job_native_test_ext_perpetual_pools + - t_ems_ext: *job_native_test_ext_uniswap # Windows build and tests - b_win: *workflow_trigger_on_tags diff --git a/test/externalTests.sh b/test/externalTests.sh index 96728585a..4649d0630 100755 --- a/test/externalTests.sh +++ b/test/externalTests.sh @@ -48,3 +48,4 @@ printTask "Running external tests..." "$REPO_ROOT/externalTests/bleeps.sh" "$@" "$REPO_ROOT/externalTests/pool-together.sh" "$@" "$REPO_ROOT/externalTests/perpetual-pools.sh" "$@" +"$REPO_ROOT/externalTests/uniswap.sh" "$@" diff --git a/test/externalTests/common.sh b/test/externalTests/common.sh index 4c0fed8d3..130e325a2 100644 --- a/test/externalTests/common.sh +++ b/test/externalTests/common.sh @@ -211,6 +211,17 @@ function force_truffle_compiler_settings echo "module.exports['compilers'] = $(truffle_compiler_settings "$solc_path" "$preset" "$evm_version");" >> "$config_file" } +function name_hardhat_default_export +{ + local config_file="$1" + local config_var_name="$2" + + local import="import {HardhatUserConfig} from 'hardhat/types';" + local config="const config: HardhatUserConfig = {" + sed -i "s|^\s*export\s*default\s*{|${import}\n${config}|g" "$config_file" + echo "export default config;" >> "$config_file" +} + function force_hardhat_compiler_binary { local config_file="$1" @@ -244,7 +255,7 @@ function force_hardhat_unlimited_contract_size else [[ $config_file == *\.ts ]] || assertFail [[ $config_var_name != "" ]] || assertFail - echo "${config_var_name}.networks!.hardhat ??= {allowUnlimitedContractSize: undefined};" + echo "${config_var_name}.networks!.hardhat = ${config_var_name}.networks!.hardhat ?? {allowUnlimitedContractSize: undefined};" echo "${config_var_name}.networks!.hardhat!.allowUnlimitedContractSize = true" fi >> "$config_file" } diff --git a/test/externalTests/uniswap.sh b/test/externalTests/uniswap.sh new file mode 100755 index 000000000..b3baad1a3 --- /dev/null +++ b/test/externalTests/uniswap.sh @@ -0,0 +1,83 @@ +#!/usr/bin/env bash + +# ------------------------------------------------------------------------------ +# This file is part of solidity. +# +# solidity is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# solidity is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with solidity. If not, see +# +# (c) 2022 solidity contributors. +#------------------------------------------------------------------------------ + +set -e + +source scripts/common.sh +source test/externalTests/common.sh + +verify_input "$@" +BINARY_TYPE="$1" +BINARY_PATH="$2" + +function compile_fn { yarn compile; } +function test_fn { UPDATE_SNAPSHOT=1 npx hardhat test; } + +function uniswap_test +{ + local repo="https://github.com/solidity-external-tests/uniswap-v3-core.git" + local ref_type=branch + local ref=main_080 + local config_file="hardhat.config.ts" + local config_var=config + + local compile_only_presets=() + local settings_presets=( + "${compile_only_presets[@]}" + #ir-no-optimize # Compilation fails with: "YulException: Variable ret_0 is 1 slot(s) too deep inside the stack." + #ir-optimize-evm-only # Compilation fails with: "YulException: Variable ret_0 is 1 slot(s) too deep inside the stack." + #ir-optimize-evm+yul # Compilation fails with: "YulException: Variable var_slot0Start_mpos is 1 too deep in the stack" + legacy-no-optimize + legacy-optimize-evm-only + legacy-optimize-evm+yul + ) + + [[ $SELECTED_PRESETS != "" ]] || SELECTED_PRESETS=$(circleci_select_steps_multiarg "${settings_presets[@]}") + print_presets_or_exit "$SELECTED_PRESETS" + + setup_solc "$DIR" "$BINARY_TYPE" "$BINARY_PATH" + download_project "$repo" "$ref_type" "$ref" "$DIR" + + neutralize_package_json_hooks + name_hardhat_default_export "$config_file" "$config_var" + force_hardhat_compiler_binary "$config_file" "$BINARY_TYPE" "$BINARY_PATH" + force_hardhat_compiler_settings "$config_file" "$(first_word "$SELECTED_PRESETS")" "$config_var" + force_hardhat_unlimited_contract_size "$config_file" "$config_var" + + # Force latest versions of everything except Hardhat and some of its dependencies. + # - Hardhat 2.2.0 pulled in by yarn.lock is too old because it can't decode Panics caused by overflow/underflow. + # - Hardhat 2.5.0+ won't work because of error messages hard-coded in test expectations. E.g. + # "revert SPL" is expected but the message is "reverted with reason string 'SPL'" in 2.5.0. + # - Newer versions of ethereumjs/tx have an issue with 'gteHardfork()' method. + neutralize_package_lock + yarn add hardhat@2.4.3 + yarn add @ethereumjs/tx@3.1.3 + + yarn install + + replace_version_pragmas + + for preset in $SELECTED_PRESETS; do + hardhat_run_test "$config_file" "$preset" "${compile_only_presets[*]}" compile_fn test_fn "$config_var" + done +} + +external_test Uniswap-V3 uniswap_test