| name | foundry-project |
| description | Set up and configure Foundry projects. Use when initializing new projects, configuring foundry.toml, managing dependencies, or structuring Solidity codebases. |
Foundry Project Setup
Initialize, configure, and manage Foundry projects.
When to Use
- Creating new Foundry projects
- Configuring foundry.toml settings
- Managing dependencies (forge-std, OpenZeppelin, etc.)
- Setting up remappings
- Optimizing build and test settings
Quick Start
New Project
forge init my-project
cd my-project
forge init my-project --template https://github.com/foundry-rs/forge-template
Existing Project
forge init --force
git clone https://github.com/some/project
cd project
forge build
Project Structure
my-project/
├── foundry.toml # Configuration
├── .env # Environment variables (gitignored)
├── .gitignore
├── README.md
├── lib/ # Dependencies
│ └── forge-std/ # Standard library
├── script/ # Deployment scripts
│ └── Deploy.s.sol
├── src/ # Source contracts
│ └── MyContract.sol
└── test/ # Tests
└── MyContract.t.sol
foundry.toml Configuration
See config.md for all options.
Basic Configuration
[profile.default]
src = "src"
out = "out"
libs = ["lib"]
solc = "0.8.24"
optimizer = true
optimizer_runs = 200
[profile.default.fuzz]
runs = 256
[profile.default.invariant]
runs = 256
depth = 15
With RPC Endpoints
[rpc_endpoints]
mainnet = "${MAINNET_RPC_URL}"
sepolia = "${SEPOLIA_RPC_URL}"
arbitrum = "${ARBITRUM_RPC_URL}"
[etherscan]
mainnet = { key = "${ETHERSCAN_API_KEY}" }
sepolia = { key = "${ETHERSCAN_API_KEY}" }
arbitrum = { key = "${ARBISCAN_API_KEY}" }
With Remappings
[profile.default]
remappings = [
"@openzeppelin/=lib/openzeppelin-contracts/",
"@uniswap/=lib/v3-periphery/contracts/",
"solmate/=lib/solmate/src/"
]
Dependency Management
Install Dependencies
forge install foundry-rs/forge-std
forge install OpenZeppelin/openzeppelin-contracts
forge install OpenZeppelin/openzeppelin-contracts@v4.9.0
forge install OpenZeppelin/openzeppelin-contracts --no-commit
Update Dependencies
forge update
forge update lib/openzeppelin-contracts
Remove Dependencies
forge remove openzeppelin-contracts
Common Dependencies
forge install OpenZeppelin/openzeppelin-contracts
forge install OpenZeppelin/openzeppelin-contracts-upgradeable
forge install transmissions11/solmate
forge install Vectorized/solady
forge install PaulRBerg/prb-math
forge install Uniswap/v3-core
forge install Uniswap/v3-periphery
Remappings
Auto-generate
forge remappings > remappings.txt
Manual remappings.txt
forge-std/=lib/forge-std/src/
@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/
@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/
solmate/=lib/solmate/src/
In foundry.toml
[profile.default]
remappings = [
"forge-std/=lib/forge-std/src/",
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/"
]
Build Commands
forge build
forge build --sizes
forge clean && forge build
forge build --contracts src/MyContract.sol
Profile Management
Multiple Profiles
[profile.default]
optimizer = true
optimizer_runs = 200
[profile.ci]
optimizer = true
optimizer_runs = 200
fuzz = { runs = 1000 }
[profile.lite]
optimizer = false
[profile.production]
optimizer = true
optimizer_runs = 10000
via_ir = true
Using Profiles
FOUNDRY_PROFILE=ci forge test
FOUNDRY_PROFILE=production forge script script/Deploy.s.sol --broadcast
Environment Variables
.env File
MAINNET_RPC_URL=https://eth-mainnet.g.alchemy.com/v2/your-key
SEPOLIA_RPC_URL=https://eth-sepolia.g.alchemy.com/v2/your-key
ETHERSCAN_API_KEY=your-etherscan-key
PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
Loading .env
source .env && forge script script/Deploy.s.sol
export $(cat .env | xargs) && forge test
In Scripts
contract DeployScript is Script {
function run() public {
uint256 deployerKey = vm.envUint("PRIVATE_KEY");
address owner = vm.envAddress("OWNER_ADDRESS");
string memory rpcUrl = vm.envString("RPC_URL");
vm.startBroadcast(deployerKey);
// ...
}
}
Common Tasks
Run Tests
forge test
forge test -vvv
forge test --match-test test_Deposit
forge test --watch
forge test --gas-report
Run Scripts
forge script script/Deploy.s.sol
forge script script/Deploy.s.sol --broadcast
forge script script/Deploy.s.sol --verify
Generate Documentation
forge doc
forge doc --serve
forge doc --out docs
Check Code
forge fmt
forge fmt --check
forge snapshot
forge snapshot --diff
.gitignore
# Foundry
/out
/cache
/broadcast
# Environment
.env
.env.*
!.env.example
# Dependencies (if not using git submodules)
# /lib
# Coverage
lcov.info
coverage/
Best Practices
- Pin Solidity version in foundry.toml
- Use remappings for cleaner imports
- Separate profiles for CI, development, production
- Never commit .env files with real keys
- Use forge-std Test contract for all tests
- Organize tests by contract (MyContract.t.sol)
- Document with NatSpec comments