plugins/contract-security/skills/hardhat-v3-fork-testing/SKILL.md
当用户使用 Hardhat v3 + Foundry 风格在 Fork 主网环境下测试已部署合约时应使用此技能
npx skillsauth add phpmac/skills hardhat-v3-fork-testingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
使用 Hardhat v3 + Foundry 风格在 Fork 主网环境下进行 Solidity 智能合约测试.
| 工具 | 用途 | 检测命令 |
|------|------|----------|
| bun | 包管理/运行测试 | which bun |
不使用: 简单的单元测试 / 不依赖链状态的逻辑测试
*Fork.t.sol - Fork 主网已部署合约测试.t.sol 结尾的文件setUp() 中使用 vm.createSelectFork(rpcUrl)vm.deal() 给主网地址充值 ETH/BNBvm.prank(sender, origin) 完整模拟合约调用// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
import {Test, console} from "forge-std/Test.sol";
interface IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function balanceOf(address) external view returns (uint256);
}
contract ForkTest is Test {
address public constant USDT = 0x55d398326f99059fF775485246999027B3197955;
IERC20 public usdt;
function setUp() public {
// 创建 BSC 主网 Fork
vm.createSelectFork("https://bsc-dataseed.defibit.io");
// 绑定主网合约接口
usdt = IERC20(USDT);
}
/**
* @notice [测试] 读取主网 USDT 基本信息
*/
function test_ReadUSDTInfo() public view {
string memory name = usdt.name();
string memory symbol = usdt.symbol();
console.log(string.concat(unicode"USDT 名称: ", name));
console.log(string.concat(unicode"USDT 符号: ", symbol));
assertEq(symbol, "USDT");
}
}
| Cheatcode | 说明 |
|-----------|------|
| vm.createSelectFork(url) | 创建并切换到指定 RPC 的 Fork |
| vm.deal(addr, amount) | 给地址设置 ETH/BNB 余额 |
| vm.prank(sender, origin) | 完整模拟 (sender, origin) 调用 |
| vm.roll(blockNumber) | 设置区块高度 |
| vm.warp(timestamp) | 设置区块时间戳 |
# 运行所有测试
bunx hardhat test solidity
# 运行单个 Fork 测试文件
bunx hardhat test solidity contracts/MyContractForkTest.t.sol
# 运行指定测试函数
bunx hardhat test solidity contracts/MyContractForkTest.t.sol --grep "test_MyFunction"
# 显示详细输出
bunx hardhat test solidity contracts/MyContractForkTest.t.sol -vv
合约使用 onlyEOA 检查 tx.origin == _msgSender() 时, 使用双参数 vm.startPrank:
// 正确
vm.startPrank(user, user);
contract.someFunction();
vm.stopPrank();
// 错误
vm.prank(user);
contract.someFunction();
多个参数会换行显示, 分开调用:
// 正确
console.log(unicode"用户:");
console.log(user);
// 错误
console.log(unicode"用户:", user);
参考资源: console-helpers.sol
复制辅助函数到测试合约, 直接调用:
function test_Example() public {
_logStage(unicode"阶段1: 获取数据");
_logLine(unicode" [用户余额]", beforeBalance, afterBalance);
_logStage(unicode"通过");
}
输出:
-> 阶段1: 获取数据
[用户余额] 0 +100 = 100
-> 通过
data-ai
当用户提到 Linux 提权/本地提权/local privilege escalation/获取root权限/内核漏洞利用/LPE/SUID/sudo滥用/容器逃逸/权限提升检测; 或要求在Linux系统上从普通用户提升到root权限; 或查询CVE提权漏洞(如Dirty Pipe/CopyFail/Dirty Frag/PwnKit/Looney Tunables); 或需要安全加固建议时应使用此技能
tools
当用户要求 "计算仓位", "仓位管理", "止损比例", "凯利公式", "盈亏比", "资金管理", "半凯利", "反马丁格尔", "固定风险", "position sizing", "策略评估", "策略体检", "SQN", "夏普比率", "卡玛比率", "期望值", "获利因子", "MAE", "MFE", "R乘数", "索提诺", "蒙特卡洛", "样本外测试", "策略回测" 或需要计算合约交易的最优仓位/止损/资金分配/策略质量评估时应使用此技能. 覆盖仓位管理/策略评估/交易解剖/压力测试的完整框架. 即使用户只是提到 "这笔交易该下多少", "策略好不好", "复盘怎么算" 等模糊描述也应触发.
development
当用户要求 "提取API", "逆向APK", "分析APP接口", "提取业务端点", "React Native逆向", "Flutter逆向" 或需要从移动应用提取后端API信息时使用此技能. 覆盖APK解包/JS bundle分析/kernel_blob.bin分析/H5页面参数发现/Spring Boot API验证全流程. 支持React Native和Flutter两种框架.
research
当用户要求 "推荐VPS", "选服务器", "对比服务商", "建站VPS", "便宜VPS", "VPS推荐" 或需要研究/筛选/对比VPS服务商时应使用此技能. 从 hostloc/lowendtalk/lowendbox/测评站搜集真实评测数据, 交叉验证后给出可溯源排名.