mcpField
S
solidity-foundry-development

solidity-foundry-development

github.com/whackur开发046 次安装2 天前更新
代码仓库

关于 solidity-foundry-development

面向 Solidity 开发者的 Foundry 技能,涵盖项目配置、测试、调试与部署,并介绍可选的 solidity-agent-toolkit 工作流。

主要功能

  1. 01Foundry 项目初始化与配置
  2. 02单元、模糊、不变量及分叉测试
  3. 03部署脚本与源码验证
  4. 04作弊码与调试指南
  5. 05可选的 solidity-agent-toolkit 工作流

适用场景

  1. 01使用 Foundry 启动 Solidity 项目
  2. 02通过随机输入和分叉状态测试合约
  3. 03准备并验证 Solidity 部署
  4. 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:提取已编译合约的 ABI
  • get_bytecode:获取部署或运行时字节码
  • inspect_storage:检查存储布局,以便优化或调试
  • gas_snapshot:生成并比较不同测试运行的 Gas 报告
  • estimate_gas:估算特定函数调用的 Gas

部署:

  • dry_run_deploy:模拟部署,在广播前捕获错误
  • check_deployment_status:验证部署交易状态

安全(提交前):

  • run_slither:推送代码前进行静态分析
  • run_aderyn:基于 Rust 的快速漏洞扫描
  • match_vulnerability_patterns:快速检查已更改文件中的模式

参考

详细的命令参考和模式见 Foundry 速查表。

评论

支持 Markdown