You can read the full article for this project in the Chainstack blog
This repository contains two similar projects built with Hardhat and Foundry.
|
Foundry |
Hardhat |
Installation |
via CLI curl command |
not required with NPX, or via NPM |
CLI tools |
forge to manage the project (build/compile) & cast to interact with smart contracts |
hardhat manage the project (build/compile/run scripts) |
Build & test performance |
💨💨💨💨💨 |
🐢🐢 |
Configuration file |
foundry.toml |
hardhat.config.js |
Allows project folder configuration |
Yes, in foundry.toml file |
Yes, in hardhat.config.js file |
Dependency management |
GitHub submodules (any repository) |
NPM packages |
Dependencies file |
.gitmodules |
package.json |
Files included in sample project |
empty smart contract and basic test |
Greeter smart contract (with set/get methods), test files and script to run locally |
Test file format |
Solidity contracts |
JavaScript test files |
Test assertion library (default) |
ds-test |
Mocha |
Allows to alter blockchain status (time, block) in tests |
Yes via cheatcodes |
Limited, via mainnet forking. |
Allows run specific tests? |
Yes via --match-test --match-contract |
Yes via "only" or "skip" in test files |
Contract deployments |
Via forge CLI or Bash scripts (new solutions in progress) |
Via JS scripts |
Blockchain / contracts interaction |
via Cast CLI tool |
N/A |
Default project structure vs Hardhat
Files |
Foundry |
Hardhat |
Contract files |
/src |
/contracts |
Test files |
/src/test |
/test |
Output |
/out |
/artifacts |
Dependencies |
/lib |
/node_modules |
Pros |
Cons |
Neither |
No async/await |
Test names not as descriptive as in JS tests |
tests writen in solidity |
Tests require less code |
Cheats are difficult to understand at first |
|
Tests run super fast |
expectRevert assertion is weird |
|
Auto-generated gas report |
testFail only tests if the test fails, not if the error is what we expect |
|