Modernize external test suite: drop unmaintained `solidity-external-tests` forks and adopt actively maintained projects
- Dominant language
- C++
- Stars
- 25.7k
- Forks
- 6.2k
- Avg merge
- 1d 11h
- Merged PRs (30d)
- 21
Description
This issue supersedes #5956.
## Background
The external test suite under `test/externalTests/` was assembled around five years ago and relies on:
1. Patched forks under [`solidity-external-tests`](https://github.com/solidity-external-tests) created to make pre-0.8 codebases work with the 0.8 compiler. Most upstream projects today support modern Solidity natively, so these forks are effectively unmaintained legacy.
2. A set of upstream repos that are themselves now stale or archived (Brink, Trident, PoolTogether v4, ElementFi, Euler v1, Yield Liquidator v2).
3. An execution model that was historically Hardhat-only and still routinely surfaces unrelated breakages when upstream tooling drifts. Recent example: a pnpm/Node.js mismatch (#16687) that cascaded through every Hardhat-based test. The Python runner now supports Foundry projects via [FoundryRunner](https://github.com/argotorg/solidity/blob/develop/scripts/externalTests/runners/foundry.py), but benchmark / gas-report collection for Foundry runs is [still unimplemented](https://github.com/argotorg/solidity/blob/1a776c9682267e44e5aefe076afc6487c762bcfb/scripts/externalTests/test_helpers.py#L143).
The result is a suite that increasingly tests the upstream toolchains rather than the Solidity compiler. We should refresh it to point at modern, actively maintained projects that exercise current optimizer and codegen paths, and retire what cannot be cheaply maintained.
IMHO we should not maintain external test forks, and the [`solidity-external-tests`](https://github.com/solidity-external-tests) organization should be archived once nothing references it.
## Current state
| External test | Source repo | Last commit | Status | Suggested Action |
|---|---|---|---|---|
| `zeppelin.sh` | [`OpenZeppelin/openzeppelin-contracts`](https://github.com/OpenZeppelin/openzeppelin-contracts) | [2026-05-07](https://github.com/OpenZeppelin/openzeppelin-contracts/commit/8b010f9) | active | **Keep**, bump pin |
| `ens.sh` | [`ensdomains/ens-contracts`](https://github.com/ensdomains/ens-contracts) | [2026-03-17](https://github.com/ensdomains/ens-contracts/commit/91c966f) | active | **Keep**, bump pin to `v1.7.0` |
| `gnosis.sh` | [`safe-global/safe-contracts`](https://github.com/safe-global/safe-contracts) → redirects to [`safe-fndn/safe-smart-account`](https://github.com/safe-fndn/safe-smart-account); also [patches a dep](https://github.com/argotorg/solidity/blob/1a776c9682267e44e5aefe076afc6487c762bcfb/test/externalTests/gnosis.sh#L65) to fork [`solidity-external-tests/mock-contract`](https://github.com/solidity-external-tests/mock-contract) | [2026-04-14](https://github.com/safe-fndn/safe-smart-account/commit/d7de455) | active, currently compile-only | **Promote to full test** (drop the `mock-contract` fork patch and point at upstream `safe-fndn/safe-smart-account`). **Drop** if the test suite still cannot run. |
| `prb-math.py` | [`PaulRBerg/prb-math`](https://github.com/PaulRBerg/prb-math) | [2026-03-06](https://github.com/PaulRBerg/prb-math/commit/82e5ed5) | active | **Keep**, bump pin |
| `chainlink.sh` | [`solidity-external-tests/chainlink`](https://github.com/solidity-external-tests/chainlink) (fork) | upstream [2026-05-11](https://github.com/smartcontractkit/chainlink/commit/d387621) | fork unneeded | **Replace fork with upstream** [`smartcontractkit/chainlink`](https://github.com/smartcontractkit/chainlink) |
| `gp2.sh` | [`cowprotocol/contracts`](https://github.com/cowprotocol/contracts) | [2026-05-05](https://github.com/cowprotocol/contracts/commit/c6b61ce) | active, compile-only | **Drop** (compile-only) |
| `colony.sh` | [`solidity-external-tests/colonyNetwork`](https://github.com/solidity-external-tests/colonyNetwork) + [`dappsys-monolithic`](https://github.com/solidity-external-tests/dappsys-monolithic) (forks) | upstream [2026-03-24](https://github.com/JoinColony/colonyNetwork/commit/08bca31) | fork unneeded | **Replace fork with upstream** [`JoinColony/colonyNetwork`](https://github.com/JoinColony/colonyNetwork), or drop |
| `uniswap.sh` | [`solidity-external-tests/uniswap-v3-core`](https://github.com/solidity-external-tests/uniswap-v3-core) (fork) | upstream V3 frozen | obsolete | **Replace with Uniswap V4** ([`Uniswap/v4-core`](https://github.com/Uniswap/v4-core) + [`Uniswap/v4-periphery`](https://github.com/Uniswap/v4-periphery)) |
| `brink.sh` | [`brinktrade/brink-core`](https://github.com/brinktrade/brink-core) | [2023-10-07](https://github.com/brinktrade/brink-core/commit/c18f721) | dead (~2.5y) | **Drop** |
| `trident.sh` | [`sushiswap/trident`](https://github.com/sushiswap/trident) | [2023-02-07](https://github.com/sushiswap/trident/commit/b4f1e3b) | dead (~3y) | **Drop** |
| `yield-liquidator.sh` | [`yieldprotocol/yield-liquidator-v2`](https://github.com/yieldprotocol/yield-liquidator-v2) | [2022-04-27](https://github.com/yieldprotocol/yield-liquidator-v2/commit/9a49d9a) | dead (~4y) | **Drop** |
| `pool-together.sh` | [`pooltogether/v4-core`](https://github.com/pooltogether/v4-core) | [2023-01-10](https://github.com/pooltogether/v4-core/commit/a456847) | dead (v5 is split across many small repos in [`GenerationSoftware`](https://github.com/orgs/GenerationSoftware/repositories?q=pt-v5) that are also stale) | **Drop** |
| `euler.sh` | [`euler-xyz/euler-contracts`](https://github.com/euler-xyz/euler-contracts) → redirects to [`euler-legacy-xyz/euler-contracts`](https://github.com/euler-legacy-xyz/euler-contracts) | [2024-05-24](https://github.com/euler-legacy-xyz/euler-contracts/commit/24da0f2) (archived) | dead (legacy v1) | **Drop** |
| `elementfi.sh` | [`element-fi/elf-contracts`](https://github.com/element-fi/elf-contracts) → redirects to [`delvtech/elf-contracts`](https://github.com/delvtech/elf-contracts) (an unreferenced stale fork also exists at [`solidity-external-tests/elf-contracts`](https://github.com/solidity-external-tests/elf-contracts)) | [2024-05-09](https://github.com/delvtech/elf-contracts/commit/c54666a) | inactive (~2y) | **Drop** |
| `bleeps.sh` | [`wighawag/bleeps`](https://github.com/wighawag/bleeps) | [2024-05-30](https://github.com/wighawag/bleeps/commit/1a3d946) | inactive (~2y) | **Drop** |
## Proposed additions
All projects are verified active as of 2026-05-11. Compiler versions are verified against each project's `foundry.toml` / `hardhat.config` / `solc pragmas` on the default branch.
| Project | compiler | framework | Remarks |
|---|---|---|---|
| [Solady](https://github.com/Vectorized/solady) | =0.8.33 | Foundry | Heavy inline assembly |
| [Uniswap V4 Core](https://github.com/Uniswap/v4-core) | =0.8.26 | Foundry | Transient storage, hooks, modern AMM |
| [Uniswap V4 Periphery](https://github.com/Uniswap/v4-periphery) | =0.8.26 | Foundry | Pairs with V4 core |
| [Aave V3](https://github.com/aave-dao/aave-v3-origin) | =0.8.27 | Foundry | Major DeFi, deep inheritance |
| [Compound V3 (Comet)](https://github.com/compound-finance/comet) | =0.8.15 | Foundry/Hardhat | Large active lending protocol |
| [Optimism contracts-bedrock](https://github.com/ethereum-optimism/optimism) | =0.8.15 | Foundry | L2 system contracts; large bytecode |
| [Arbitrum nitro-contracts](https://github.com/OffchainLabs/nitro-contracts) | =0.8.17 | Foundry/Hardhat | L2 system contracts |
| [EigenLayer](https://github.com/Layr-Labs/eigenlayer-contracts) | =0.8.30 | Foundry | Restaking; complex modern Solidity |
| [Sablier](https://github.com/sablier-labs/evm-monorepo) | =0.8.29 | Foundry | Token streaming |
| [Morpho Blue](https://github.com/morpho-org/morpho-blue) | =0.8.19 | Foundry | Gas-optimized lending |
| [Seaport](https://github.com/ProjectOpenSea/seaport) | =0.8.24 (some contracts =0.8.17) | Foundry | NFT marketplace |
| [ERC-4337](https://github.com/eth-infinitism/account-abstraction) | =0.8.28 | Hardhat | Account-abstraction reference |
Contributor guide
Research direction
Start by reviewing the scripts under test/externalTests/ and the runner support in scripts/externalTests/runners/foundry.py and scripts/externalTests/test_helpers.py. Run the existing external-test suite to identify current failures and benchmark limitations. Done means stale projects and unneeded forks are removed or replaced with maintained upstream projects, with the retained tests running successfully.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- blockchain, compilers, testing-qa
- Issue type
- Refactor
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100