diff --git a/.circleci/config.yml b/.circleci/config.yml index 6edfc2d3a..02f91de83 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1371,6 +1371,13 @@ workflows: binary_type: native # NOTE: Tests crash on nodejs 17: "Error: error:0308010C:digital envelope routines::unsupported" nodejs_version: '16' + - t_ems_ext: + <<: *workflow_ubuntu2004_static + name: t_native_test_ext_trident + project: trident + binary_type: native + # NOTE: Tests crash on nodejs 17: "Error: error:0308010C:digital envelope routines::unsupported" + nodejs_version: '16' # Windows build and tests - b_win: *workflow_trigger_on_tags diff --git a/test/externalTests.sh b/test/externalTests.sh index 86f13401e..846cdf515 100755 --- a/test/externalTests.sh +++ b/test/externalTests.sh @@ -42,3 +42,4 @@ printTask "Running external tests..." "$REPO_ROOT/externalTests/gnosis-v2.sh" "$@" "$REPO_ROOT/externalTests/colony.sh" "$@" "$REPO_ROOT/externalTests/ens.sh" "$@" +"$REPO_ROOT/externalTests/trident.sh" "$@" diff --git a/test/externalTests/common.sh b/test/externalTests/common.sh index d394a0b5f..a0bf17bda 100644 --- a/test/externalTests/common.sh +++ b/test/externalTests/common.sh @@ -189,14 +189,17 @@ function force_hardhat_compiler_binary echo "Config file: ${config_file}" echo "Binary type: ${binary_type}" echo "Compiler path: ${solc_path}" - hardhat_solc_build_subtask "$SOLCVERSION_SHORT" "$SOLCVERSION" "$binary_type" "$solc_path" >> "$config_file" + + local language="${config_file##*.}" + hardhat_solc_build_subtask "$SOLCVERSION_SHORT" "$SOLCVERSION" "$binary_type" "$solc_path" "$language" >> "$config_file" } function force_hardhat_compiler_settings { local config_file="$1" local preset="$2" - local evm_version="${3:-"$CURRENT_EVM_VERSION"}" + local config_var_name="$3" + local evm_version="${4:-"$CURRENT_EVM_VERSION"}" printLog "Configuring Hardhat..." echo "-------------------------------------" @@ -208,10 +211,16 @@ function force_hardhat_compiler_settings echo "Compiler version (full): ${SOLCVERSION}" echo "-------------------------------------" - { - echo -n 'module.exports["solidity"] = ' - hardhat_compiler_settings "$SOLCVERSION_SHORT" "$preset" "$evm_version" - } >> "$config_file" + local settings + settings=$(hardhat_compiler_settings "$SOLCVERSION_SHORT" "$preset" "$evm_version") + if [[ $config_file == *\.js ]]; then + [[ $config_var_name == "" ]] || assertFail + echo "module.exports['solidity'] = ${settings}" >> "$config_file" + else + [[ $config_file == *\.ts ]] || assertFail + [[ $config_var_name != "" ]] || assertFail + echo "${config_var_name}.solidity = {compilers: [${settings}]}" >> "$config_file" + fi } function truffle_verify_compiler_version @@ -309,16 +318,27 @@ function hardhat_solc_build_subtask { local full_solc_version="$2" local binary_type="$3" local solc_path="$4" + local language="$5" [[ $binary_type == native || $binary_type == solcjs ]] || assertFail [[ $binary_type == native ]] && local is_solcjs=false [[ $binary_type == solcjs ]] && local is_solcjs=true - echo "const {TASK_COMPILE_SOLIDITY_GET_SOLC_BUILD} = require('hardhat/builtin-tasks/task-names');" - echo "const assert = require('assert');" - echo - echo "subtask(TASK_COMPILE_SOLIDITY_GET_SOLC_BUILD, async (args, hre, runSuper) => {" + if [[ $language == js ]]; then + echo "const {TASK_COMPILE_SOLIDITY_GET_SOLC_BUILD} = require('hardhat/builtin-tasks/task-names');" + echo "const assert = require('assert');" + echo + echo "subtask(TASK_COMPILE_SOLIDITY_GET_SOLC_BUILD, async (args, hre, runSuper) => {" + else + [[ $language == ts ]] || assertFail + echo "import {TASK_COMPILE_SOLIDITY_GET_SOLC_BUILD} from 'hardhat/builtin-tasks/task-names';" + echo "import assert = require('assert');" + echo "import {subtask} from 'hardhat/config';" + echo + echo "subtask(TASK_COMPILE_SOLIDITY_GET_SOLC_BUILD, async (args: any, _hre: any, _runSuper: any) => {" + fi + echo " assert(args.solcVersion == '${solc_version}', 'Unexpected solc version: ' + args.solcVersion)" echo " return {" echo " compilerPath: '$(realpath "$solc_path")'," @@ -384,9 +404,10 @@ function hardhat_run_test local compile_only_presets="$3" local compile_fn="$4" local test_fn="$5" + local config_var_name="$6" hardhat_clean - force_hardhat_compiler_settings "$config_file" "$preset" + force_hardhat_compiler_settings "$config_file" "$preset" "$config_var_name" compile_and_run_test compile_fn test_fn hardhat_verify_compiler_version "$preset" "$compile_only_presets" } diff --git a/test/externalTests/trident.sh b/test/externalTests/trident.sh new file mode 100755 index 000000000..312930293 --- /dev/null +++ b/test/externalTests/trident.sh @@ -0,0 +1,96 @@ +#!/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) 2021 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 build; } + +function test_fn { + # shellcheck disable=SC2046 + TS_NODE_TRANSPILE_ONLY=1 npx hardhat test --no-compile $( + # TODO: We need to skip Migration.test.ts because it fails and makes other tests fail too. + # Replace this with `yarn test` once https://github.com/sushiswap/trident/issues/283 is fixed. + find test/ -name "*.test.ts" ! -path "test/Migration.test.ts" + ) +} + +function trident_test +{ + local repo="https://github.com/sushiswap/trident" + local branch=master + 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 var_amount_165 is 9 slot(s) too deep inside the stack." + #ir-optimize-evm-only # Compilation fails with: "YulException: Variable var_amount_165 is 9 slot(s) too deep inside the stack." + #ir-optimize-evm+yul # Compilation fails with: "YulException: Cannot swap Variable var_nearestTick with Variable _4: too deep in the stack by 4 slots" + legacy-no-optimize + legacy-optimize-evm-only + legacy-optimize-evm+yul + ) + + local selected_optimizer_presets + selected_optimizer_presets=$(circleci_select_steps_multiarg "${settings_presets[@]}") + print_optimizer_presets_or_exit "$selected_optimizer_presets" + + setup_solc "$DIR" "$BINARY_TYPE" "$BINARY_PATH" + download_project "$repo" "$branch" "$DIR" + + # TODO: Currently tests work only with the exact versions from yarn.lock. + # Re-enable this when https://github.com/sushiswap/trident/issues/284 is fixed. + #neutralize_package_lock + + neutralize_package_json_hooks + force_hardhat_compiler_binary "$config_file" "$BINARY_TYPE" "$BINARY_PATH" + force_hardhat_compiler_settings "$config_file" "$(first_word "$selected_optimizer_presets")" "$config_var" + yarn install + + replace_version_pragmas + force_solc_modules "${DIR}/solc" + + # BentoBoxV1Flat.sol requires a few small tweaks to compile on 0.8.x. + # TODO: Remove once https://github.com/sushiswap/trident/pull/282 gets merged. + sed -i 's|uint128(-1)|type(uint128).max|g' contracts/flat/BentoBoxV1Flat.sol + sed -i 's|uint64(-1)|type(uint64).max|g' contracts/flat/BentoBoxV1Flat.sol + sed -i 's|uint32(-1)|type(uint32).max|g' contracts/flat/BentoBoxV1Flat.sol + sed -i 's|IERC20(0)|IERC20(address(0))|g' contracts/flat/BentoBoxV1Flat.sol + sed -i 's|IStrategy(0)|IStrategy(address(0))|g' contracts/flat/BentoBoxV1Flat.sol + + # @sushiswap/core package contains contracts that get built with 0.6.12 and fail our compiler + # version check. It's not used by tests so we can remove it. + rm -r node_modules/@sushiswap/core/ + + for preset in $selected_optimizer_presets; do + hardhat_run_test "$config_file" "$preset" "${compile_only_presets[*]}" compile_fn test_fn "$config_var" + done +} + +external_test Trident trident_test