Hardhat-Ethers分叉测试问题:主网合约状态修改后余额未更新
问题原因与修复方案
核心错误分析
你遇到的问题根源在于错误使用了外部主网Provider,而非Hardhat分叉环境的本地Provider,导致所有合约操作都直接作用于真实以太坊主网,而非本地分叉节点,自然无法在分叉环境中修改状态并读取到更新后的余额。此外代码还存在一处语法错误。
具体错误点:
- 手动创建
AlchemyProvider连接真实主网,而非使用Hardhat测试环境内置的、连接本地分叉节点的Provider - 合约实例连接逻辑错误,未关联到分叉环境的签名者
balanceOf调用处多了一个右括号,存在语法问题
修复后的测试代码
it("Deploy check", async function () { // 直接使用Hardhat测试环境内置的签名者(自动关联本地分叉节点) const [Alice] = await ethers.getSigners(); // 通过getContractAt获取分叉环境中的WETH合约实例,关联Alice签名者 const WETH9 = await ethers.getContractAt(WETH9ABI, ETHEREUM.WETH9.address, Alice); const txGetWETH = await WETH9.deposit({ value: getBigNumber(1e18) }); await txGetWETH.wait(); // 等待交易上链确认,确保状态更新 const balance = await WETH9.balanceOf(Alice.address); expect(balance.toString()).to.equal(getBigNumber(1e18).toString()); });
关键修复说明
- 移除外部Provider:Hardhat在分叉模式下会自动启动本地节点并提供关联的Provider,无需手动创建AlchemyProvider,直接通过
ethers.getSigners()获取的签名者即可操作分叉环境 - 正确关联合约实例:使用
ethers.getContractAt并传入签名者,确保合约操作在本地分叉节点执行,而非真实主网 - 等待交易确认:添加
tx.wait()确保交易在分叉节点上完成,避免提前查询未更新的状态 - 修正语法错误:删除
balanceOf调用处多余的右括号 - 数值类型匹配:断言时将BigNumber转为字符串,避免类型不匹配导致的断言失败
额外注意事项
确保运行测试时设置了FORKING=true环境变量,让Hardhat正确启用分叉模式。
内容的提问来源于stack exchange,提问作者Okavango
相关产品推荐
相关产品推荐

