diff --git a/.circleci/config.yml b/.circleci/config.yml index b6e261713..143a692fd 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -580,6 +580,14 @@ defaults: binary_type: native # NOTE: Tests crash on nodejs 17: "Error: error:0308010C:digital envelope routines::unsupported" nodejs_version: '16' + - job_native_test_ext_elementfi: &job_native_test_ext_elementfi + <<: *workflow_ubuntu2004_static + name: t_native_test_ext_elementfi + project: elementfi + binary_type: native + # NOTE: Tests crash on nodejs 17: "Error: error:0308010C:digital envelope routines::unsupported" + nodejs_version: '16' + resource_class: medium - job_ems_test_ext_colony: &job_ems_test_ext_colony <<: *workflow_emscripten name: t_ems_test_ext_colony @@ -1465,6 +1473,7 @@ workflows: - t_ems_ext: *job_native_test_ext_perpetual_pools - t_ems_ext: *job_native_test_ext_uniswap - t_ems_ext: *job_native_test_prb_math + - t_ems_ext: *job_native_test_ext_elementfi # Windows build and tests - b_win: *workflow_trigger_on_tags diff --git a/test/externalTests.sh b/test/externalTests.sh index cdbfe517e..a5e52c852 100755 --- a/test/externalTests.sh +++ b/test/externalTests.sh @@ -50,3 +50,4 @@ printTask "Running external tests..." "$REPO_ROOT/externalTests/perpetual-pools.sh" "$@" "$REPO_ROOT/externalTests/uniswap.sh" "$@" "$REPO_ROOT/externalTests/prb-math.sh" "$@" +"$REPO_ROOT/externalTests/elementfi.sh" "$@" diff --git a/test/externalTests/elementfi.sh b/test/externalTests/elementfi.sh new file mode 100755 index 000000000..7227ce37e --- /dev/null +++ b/test/externalTests/elementfi.sh @@ -0,0 +1,101 @@ +#!/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 { npm run build; } +function test_fn { npm run test; } + +function elementfi_test +{ + local repo="https://github.com/element-fi/elf-contracts" + local ref_type=branch + local ref=main + local config_file="hardhat.config.ts" + local config_var=config + + local compile_only_presets=( + ir-optimize-evm+yul # Compiles but tests fail. See https://github.com/nomiclabs/hardhat/issues/2115 + ) + local settings_presets=( + "${compile_only_presets[@]}" + #ir-no-optimize # Compilation fails with "YulException: Variable var_amount_9311 is 10 slot(s) too deep inside the stack." + #ir-optimize-evm-only # Compilation fails with "YulException: Variable var_amount_9311 is 10 slot(s) too deep inside 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" + + chmod +x scripts/load-balancer-contracts.sh + scripts/load-balancer-contracts.sh + + # Balancer contracts require 0.7.x. Patch them for 0.8.x. + pushd contracts/balancer-core-v2 + sed -i 's|uint256(address(this))|uint256(uint160(address(this)))|g' test/MockPoolFactory.sol + sed -i 's|uint256(address(this))|uint256(uint160(address(this)))|g' vault/ProtocolFeesCollector.sol + sed -i 's|uint256(address(this))|uint256(uint160(address(this)))|g' vault/VaultAuthorization.sol + sed -i 's|msg\.sender\.sendValue(excess)|payable(msg.sender).sendValue(excess)|g' vault/AssetTransfersHandler.sol + sed -i 's|msg\.sender\.transfer(wad)|payable(msg.sender).transfer(wad)|g' test/WETH.sol + sed -i 's|int256(-amountsOut\[i\])|-int256(amountsOut[i])|g' test/MockVault.sol + sed -i 's|int256(-amount)|-int256(amount)|g' vault/AssetManagers.sol + sed -i 's|uint256(-1)|type(uint256).max|g' pools/BalancerPoolToken.sol + sed -i 's|uint256(-1)|type(uint256).max|g' test/WETH.sol + sed -i 's|IERC20(0)|IERC20(address(0))|g' pools/BasePool.sol + sed -i 's|IERC20(0)|IERC20(address(0))|g' vault/balances/TwoTokenPoolsBalance.sol + sed -i 's|IERC20(0)|IERC20(address(0))|g' vault/FlashLoans.sol + sed -i 's|IERC20(0)|IERC20(address(0))|g' vault/PoolTokens.sol + sed -i 's|uint256(msg\.sender)|uint256(uint160(msg.sender))|g' pools/BasePool.sol + sed -i 's|uint256(msg\.sender)|uint256(uint160(msg.sender))|g' pools/weighted/WeightedPool2Tokens.sol + sed -i 's|address(uint256(_data))|address(uint160(uint256(_data)))|g' lib/openzeppelin/Create2.sol + sed -i 's|address(uint256(poolId) >> (12 \* 8))|address(uint160(uint256(poolId) >> (12 * 8)))|g' vault/PoolRegistry.sol + sed -i 's|bytes32(uint256(pool))|bytes32(uint256(uint160(pool)))|g' vault/PoolRegistry.sol + popd + + # Several tests fail unless we use the exact versions hard-coded in package-lock.json + #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_PRESETS")" "$config_var" + force_hardhat_unlimited_contract_size "$config_file" "$config_var" + npm 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 ElementFi elementfi_test