关于 solidity-foundry-development
面向 Solidity 开发者的 Foundry 技能,涵盖项目配置、测试、调试与部署,并介绍可选的 solidity-agent-toolkit 工作流。
主要功能
- 01Foundry 项目初始化与配置
- 02单元、模糊、不变量及分叉测试
- 03部署脚本与源码验证
- 04作弊码与调试指南
- 05可选的 solidity-agent-toolkit 工作流
适用场景
- 01使用 Foundry 启动 Solidity 项目
- 02通过随机输入和分叉状态测试合约
- 03准备并验证 Solidity 部署
- 04检查合约产物并进行安全扫描
MCP 相关
在可用 solidity-agent-toolkit 时,本技能介绍用于编译和测试合约、检查产物与存储、估算 Gas、模拟部署及安全扫描的 MCP 工具。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ whackur/ solidity-agent-toolkit --skill solidity-foundry-development安装后在 Claude Code 中输入/solidity-foundry-development确认已加载。
附带文件references/foundry-cheatsheet.md
详细介绍
Foundry 开发指南
适用场景
在使用 Foundry 工具包开发 Solidity 项目时应用此技能。这包括搭建新项目、编写单元测试和集成测试、执行模糊测试和不变量测试、通过分叉测试模拟主网环境,以及使用 Solidity 脚本管理部署。
项目设置
使用 forge init 初始化项目。使用 forge install <author>/<repo> 管理依赖项。配置 foundry.toml 中的重映射、优化器设置和 EVM 版本。使用 remappings.txt 简化导入(例如,@openzeppelin/=lib/openzeppelin-contracts/contracts/)。
测试最佳实践
测试结构
测试应继承 forge-std/Test.sol。使用 setUp() 初始化状态。
test_Xxx:标准测试用例。testFuzz_Xxx:模糊测试用例。testFail_Xxx:预期失败的测试(建议使用vm.expectRevert)。
模糊测试
Foundry 会自动为 testFuzz 函数的参数提供随机输入。使用 vm.assume() 筛选输入,或使用 bound(uint256 x, uint256 min, uint256 max) 限制取值范围。
不变量测试
有状态模糊测试,用于确保属性在多笔交易中始终成立。
targetContract(address):定义要测试的合约。handler:使用专用合约管理复杂的调用序列和状态转换。
分叉测试
提供 RPC URL,以模拟主网状态。
vm.createFork(url):创建分叉。vm.selectFork(id):切换到某个分叉。vm.rollFork(blockNumber):将分叉固定到特定区块。
必备作弊码
| 作弊码 | 描述 |
|---|---|
vm.prank(addr) | 为下一次调用设置 msg.sender。 |
vm.startPrank(addr) | 为后续所有调用设置 msg.sender,直到调用 stopPrank。 |
vm.deal(addr, amt) | 设置某个地址的余额。 |
vm.expectRevert(bytes) | 预期下一次调用因特定错误而回滚。 |
vm.expectEmit(bool,bool,bool,bool) | 预期下一次调用发出特定事件。 |
vm.warp(timestamp) | 设置区块时间戳。 |
vm.roll(blockNumber) | 设置区块编号。 |
vm.sign(pk, digest) | 生成 ECDSA 签名。 |
vm.label(addr, name) | 为地址添加标签,便于阅读跟踪记录。 |
vm.record() | 开始记录所有存储读写操作。 |
vm.getCode(path) | 返回合约的创建字节码。 |
部署工作流
使用 forge script 执行基于 Solidity 的部署。
- 试运行:
forge script script/Deploy.s.sol --rpc-url $RPC_URL - 广播:
forge script script/Deploy.s.sol --rpc-url $RPC_URL --broadcast --verify - 将
--verify与--etherscan-api-key配合使用,以自动验证源代码。
调试
- 详细程度:
-v(日志)、-vv(失败测试的跟踪记录)、-vvv(所有测试的跟踪记录)、-vvvv(设置过程的跟踪记录)、-vvvvv(完整堆栈跟踪)。 forge debug:用于调试特定交易的交互式调试器。console.log:使用forge-std/console.sol输出调试信息。
配置配置文件
使用 foundry.toml 中的配置文件管理不同的构建配置。
[profile.via_ir]
via_ir = true
test = 'src'
out = 'via_ir-out'
[profile.deterministic]
block_number = 17722462
block_timestamp = 1689711647
bytecode_hash = 'none'
cbor_metadata = false
使用 MCP 增强
当 solidity-agent-toolkit 可用时,可在 Foundry 工作流中使用以下工具:
构建与测试:
compile_contract:编译合约并获取构建产物(ABI、字节码、错误)run_tests:运行完整的 Foundry 测试套件,并控制详细程度run_single_test:针对特定测试函数运行测试,以便快速迭代
构建产物与检查:
get_abi:提取已编译合约的 ABIget_bytecode:获取部署或运行时字节码inspect_storage:检查存储布局,以便优化或调试gas_snapshot:生成并比较不同测试运行的 Gas 报告estimate_gas:估算特定函数调用的 Gas
部署:
dry_run_deploy:模拟部署,在广播前捕获错误check_deployment_status:验证部署交易状态
安全(提交前):
run_slither:推送代码前进行静态分析run_aderyn:基于 Rust 的快速漏洞扫描match_vulnerability_patterns:快速检查已更改文件中的模式
参考
详细的命令参考和模式见 Foundry 速查表。