SuperAPI AI 工具集

hardhat

编程与开发

查看项目

更新于 10-16 07:23

技能介绍

用途:该技能面向 Hardhat 3 项目,帮助编写或修改 Solidity 测试、TypeScript 测试,以及任何涉及 hardhat.config.ts 和 hardhat 导入的代码。工具箱层(客户端、合约交互、生态特定断言)由配套技能承担:使用 @nomicfoundation/hardhat-toolbox-viem 时同时加载 hardhat-toolbox-viem 技能;使用 @nomicfoundation/hardhat-toolbox-mocha-ethers 时同时加载 hardhat-toolbox-mocha-ethers 技能。

测试组织:Hardhat 3 支持两层测试。Solidity 测试(contracts/ 下的 .t.sol 文件,或 test/ 下任意 .sol 文件)是单个合约单元测试的默认选择,直接在 EVM 中运行,按真实 ABI 编译检查,可使用 cheatcodes 操作 EVM 状态;任何以 test 开头的 public 函数都会作为测试用例执行。TypeScript 测试(test/ 下的 .ts 文件)适合需要链下编排的场景:多合约交互、大型套件中的 fixture 复用、从外部断言 gas 或 ETH 余额、由外部状态驱动的集成场景。仅在 Solidity 不够用时才使用 TypeScript。

运行命令:hardhat test 运行全部测试(Solidity + TypeScript);hardhat test solidity 仅运行 Solidity 测试。TypeScript 测试根据所用工具箱或插件,通过 hardhat test nodejs 或 hardhat test mocha 运行:基于 viem 的工具箱使用 nodejs,ethers+mocha 工具箱使用 mocha。传入 --coverage 可在运行测试时收集 Solidity 覆盖率,适用于主 hardhat test 任务以及 solidity 和 TypeScript 子任务(nodejs / mocha)。

Solidity 测试:包含至少一个 test* 函数的合约被视为测试合约。若 package.json 中存在 forge-std,可用其断言和 cheatcodes。vm 对象(来自 forge-std/Test.sol)提供 EVM 状态操作 cheatcodes,常用包括 vm.prank(addr) 仅对下一次调用设置 msg.sender;vm.startPrank(addr) / vm.stopPrank() 对一段调用设置 msg.sender;vm.deal(addr, amount) 设置账户 ETH 余额;vm.warp(timestamp) 设置 block.timestamp;vm.roll(blockNum) 设置 block.number;vm.expectRevert(...) 断言下一次调用回滚;vm.expectEmit(...) 断言下一次调用发出特定事件。

TypeScript 测试与网络连接:核心对象是由 network.create() 创建的网络连接,工具箱插件为其扩展辅助对象(如 viem 或 ethers,以及 networkHelpers)。Hardhat 3 仅支持 ESM,因此可用顶层 await。每次 network.create() 产生隔离的区块链状态;顶层网络连接可在文件内所有测试共享同一连接及其状态时使用,需要更多隔离时可为每个测试套件甚至每个测试用例创建新连接。

networkHelpers:将 Hardhat 仅开发用辅助函数封装为类型化、易用的 API,优先于原始 JSON-RPC 调用。时间方面:networkHelpers.time.increase(60) 向前挖一个区块 60 秒;increaseTo(target) 挖到指定时间戳;latest() 获取最新区块时间戳;setNextBlockTimestamp(ts) 设置但不挖矿。区块方面:mine() 挖一个区块,mine(5) 挖多个区块。账户方面:impersonateAccount(addr)、setBalance(addr, 10n ** 18n)。区块参数方面:setPrevRandao(value) 为下一区块设置 block.prevrandao;setNextBlockBaseFeePerGas(baseFee)。Fixture 方面:loadFixture 运行一次设置并快照状态,后续调用恢复快照而非重新部署,对大型套件更快;loadFixture 需要具名函数才能缓存(不能是箭头或匿名函数)。快照方面:takeSnapshot() 与 snap.restore()。普通 TypeScript 断言使用 node:assert/strict;生态特定断言(回滚、事件、余额变化)参见对应 hardhat-toolbox-* 技能。

类型检查:生成的合约类型派生自编译后的 ABI(viem 工具箱用 viem,ethers 工具箱用 TypeChain),因此先重新编译再类型检查:npx hardhat build && npx tsc --noEmit。编译器会在运行测试前捕获参数类型错误、缺少参数和无效选项(如对非 payable 函数传 value)。

限制:资料未提供收费、价格、平台支持范围等细节。