Skills foundry-solidity
Build and test Solidity smart contracts with Foundry toolkit. Use when developing Ethereum contracts, writing Forge tests, deploying with scripts, or debugging with Cast/Anvil. Triggers on Foundry commands (forge, cast, anvil), Solidity testing, smart contract development, or files like foundry.toml, *.t.sol, *.s.sol.
install
source · Clone the upstream repo
git clone https://github.com/tenequm/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/tenequm/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/foundry-solidity" ~/.claude/skills/tenequm-skills-foundry-solidity && rm -rf "$T"
manifest:
skills/foundry-solidity/SKILL.mdsource content
Foundry Solidity Development
Complete guide for building secure, efficient smart contracts with Foundry 1.5.0 and Solidity 0.8.30.
When to Use This Skill
- Developing Ethereum/EVM smart contracts
- Writing Forge tests (unit, fuzz, invariant, fork)
- Deploying contracts with scripts
- Using Foundry tools (forge, cast, anvil, chisel)
- Working with
,foundry.toml
,*.t.sol
files*.s.sol - Debugging transactions and contract interactions
Quick Start
# Create new project forge init my-project && cd my-project # Build contracts forge build # Run tests forge test # Deploy (dry-run) forge script script/Deploy.s.sol --rpc-url sepolia # Deploy (broadcast) forge script script/Deploy.s.sol --rpc-url sepolia --broadcast --verify
Project Structure
my-project/ ├── foundry.toml # Configuration ├── src/ # Contracts │ └── Counter.sol ├── test/ # Tests (*.t.sol) │ └── Counter.t.sol ├── script/ # Deploy scripts (*.s.sol) │ └── Deploy.s.sol └── lib/ # Dependencies └── forge-std/
Core Commands
Build & Test
forge build # Compile forge test # Run all tests forge test -vvvv # With traces forge test --match-test testDeposit # Filter by test name forge test --match-contract Vault # Filter by contract forge test --fork-url $RPC_URL # Fork testing forge test --gas-report # Gas usage report
Deployment
# Single contract forge create src/Token.sol:Token --rpc-url sepolia --private-key $KEY --broadcast # Script deployment (recommended) forge script script/Deploy.s.sol:Deploy --rpc-url sepolia --broadcast --verify # Verify existing contract forge verify-contract $ADDRESS src/Token.sol:Token --chain sepolia
Cast - Blockchain Interactions
cast call $CONTRACT "balanceOf(address)" $USER --rpc-url mainnet cast send $CONTRACT "transfer(address,uint256)" $TO $AMOUNT --private-key $KEY cast decode-tx $TX_HASH cast storage $CONTRACT 0 --rpc-url mainnet
Anvil - Local Node
anvil # Start local node anvil --fork-url $RPC_URL # Fork mainnet anvil --fork-block-number 18000000
Basic Test Contract
// SPDX-License-Identifier: MIT pragma solidity ^0.8.30; import {Test, console} from "forge-std/Test.sol"; import {Counter} from "../src/Counter.sol"; contract CounterTest is Test { Counter public counter; address public user; function setUp() public { counter = new Counter(); user = makeAddr("user"); deal(user, 10 ether); } function test_Increment() public { counter.increment(); assertEq(counter.number(), 1); } function test_RevertWhen_Unauthorized() public { vm.expectRevert("Unauthorized"); vm.prank(user); counter.adminFunction(); } function testFuzz_SetNumber(uint256 x) public { x = bound(x, 0, 1000); counter.setNumber(x); assertEq(counter.number(), x); } }
Essential Cheatcodes
// Identity & ETH address alice = makeAddr("alice"); // Create labeled address deal(alice, 10 ether); // Give ETH deal(address(token), alice, 1000e18); // Give ERC20 // Impersonation vm.prank(alice); // Next call as alice vm.startPrank(alice); // All calls as alice vm.stopPrank(); // Time & Block vm.warp(block.timestamp + 1 days); // Set timestamp vm.roll(block.number + 100); // Set block number // Assertions vm.expectRevert("Error message"); // Expect revert vm.expectRevert(CustomError.selector); // Custom error vm.expectEmit(true, true, false, true); // Expect event emit Transfer(from, to, amount); // Must match next emit // Storage vm.store(addr, slot, value); // Write storage vm.load(addr, slot); // Read storage
Deploy Script
// SPDX-License-Identifier: MIT pragma solidity ^0.8.30; import {Script, console} from "forge-std/Script.sol"; import {Counter} from "../src/Counter.sol"; contract Deploy is Script { function run() external { uint256 deployerKey = vm.envUint("PRIVATE_KEY"); vm.startBroadcast(deployerKey); Counter counter = new Counter(); counter.setNumber(42); vm.stopBroadcast(); console.log("Deployed to:", address(counter)); } }
Modern Solidity Patterns (0.8.30)
// Custom errors (gas efficient) error InsufficientBalance(uint256 available, uint256 required); // Transient storage (0.8.28+) - cheap reentrancy guard bool transient locked; modifier nonReentrant() { require(!locked, "Reentrancy"); locked = true; _; locked = false; } // Immutable variables (cheap reads) address public immutable owner; // Named mapping parameters mapping(address user => uint256 balance) public balances; // require with custom error (0.8.26+) require(amount <= balance, InsufficientBalance(balance, amount));
Configuration (foundry.toml)
[profile.default] src = "src" out = "out" libs = ["lib"] solc = "0.8.30" optimizer = true optimizer_runs = 200 evm_version = "prague" fuzz.runs = 256 invariant.runs = 256 invariant.depth = 50 [rpc_endpoints] mainnet = "${MAINNET_RPC_URL}" sepolia = "${SEPOLIA_RPC_URL}" [etherscan] mainnet = { key = "${ETHERSCAN_API_KEY}" } sepolia = { key = "${ETHERSCAN_API_KEY}" } [profile.ci] fuzz.runs = 10000 invariant.runs = 1000
References
For detailed guides, see:
- Testing: See
for complete testing patterns (unit, fuzz, invariant, fork), all cheatcodes, and best practicesreferences/testing.md - forge-std API: See
for complete library reference (150+ functions)references/forge-std-api.md - Solidity 0.8.30: See
for new features and modern syntaxreferences/solidity-modern.md - Deployment: See
for scripting, verification, and multi-chain deploymentreferences/deployment.md - Configuration: See
for all foundry.toml optionsreferences/configuration.md - Gas Optimization: See
for storage packing, compiler settings, and profilingreferences/gas-optimization.md - Patterns: See
for access control, reentrancy guards, factories, and common idiomsreferences/patterns.md - Security: See
for vulnerabilities, defensive patterns, and audit preparationreferences/security.md - Resources: See
for official docs, libraries, security tools, and learning pathsreferences/resources.md - Debugging: See
for traces, breakpoints, console.log, and the interactive debuggerreferences/debugging.md - Dependencies: See
for forge install, remappings, and Soldeer package managerreferences/dependencies.md - CI/CD: See
for GitHub Actions workflows, caching, and gas trackingreferences/cicd.md - Chisel: See
for the interactive Solidity REPLreferences/chisel.md - Cast Advanced: See
for decoding, encoding, wallet management, and batch operationsreferences/cast-advanced.md - Anvil Advanced: See
for impersonation, state manipulation, and mining modesreferences/anvil-advanced.md