You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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());
});

关键修复说明

  1. 移除外部Provider:Hardhat在分叉模式下会自动启动本地节点并提供关联的Provider,无需手动创建AlchemyProvider,直接通过ethers.getSigners()获取的签名者即可操作分叉环境
  2. 正确关联合约实例:使用ethers.getContractAt并传入签名者,确保合约操作在本地分叉节点执行,而非真实主网
  3. 等待交易确认:添加tx.wait()确保交易在分叉节点上完成,避免提前查询未更新的状态
  4. 修正语法错误:删除balanceOf调用处多余的右括号
  5. 数值类型匹配:断言时将BigNumber转为字符串,避免类型不匹配导致的断言失败

额外注意事项

确保运行测试时设置了FORKING=true环境变量,让Hardhat正确启用分叉模式。

内容的提问来源于stack exchange,提问作者Okavango

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:15:35