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

Hardhat测试时waffle为undefined无法读取provider报错解决方案

问题产生原因
  • 新版Hardhat(V2.10及以上版本,搭配官方默认推荐的@nomicfoundation/hardhat-toolbox工具箱)不再从hardhat包中默认导出waffle对象。旧版@nomiclabs/hardhat-waffle插件会向Hardhat运行时注入waffle实例,但新版工具箱已经替换为原生Hardhat Chai匹配器,不再内置waffle集成,因此代码中解构得到的waffle值为undefined,访问其.provider属性时就会抛出类型错误。
  • 代码本身存在冗余逻辑:测试场景下不需要通过waffle获取链上provider,Hardhat的ethers插件本身就直接暴露了可用的provider实例。
修复方法

方案1:直接使用ethers内置provider(官方推荐,无需额外依赖)

不需要导入waffle,直接替换对应代码即可:

  1. 修改顶部导入语句,移除waffle的解构:
    const { expect, assert} = require("chai");
    const { ethers } = require("hardhat")
    
  2. 替换获取provider的代码行:
    // 原代码 const mainnetForkProvider = waffle.provider;
    const mainnetForkProvider = ethers.provider;
    

补充注意:发送兑换交易后需要等待交易打包完成再查回执,否则大概率拿到null值,在assert(txSwap.hash)后加一行等待逻辑:

await txSwap.wait();

另外你代码里的deadline参数计算有误:Uniswap接口要求deadline为秒级时间戳,你当前写法Date.now() + 1000 + 60 + 5是毫秒级计算,实际仅给交易留了1秒左右的有效时间,很容易触发交易过期报错,正确写法参考:

Math.floor(Date.now() / 1000) + 60 // 交易60秒后过期

设置的200000 gasLimit对于Uniswap兑换交易偏低,单路径兑换通常需要300000左右gas,多跳路径需要更高,建议调整避免gas不足报错。

方案2:补装waffle插件(不推荐,官方已停止维护相关集成)

如果你必须依赖waffle的能力,可以手动安装旧版waffle插件恢复导入:

  1. 安装依赖:
    npm install --save-dev @nomiclabs/hardhat-waffle ethereum-waffle
    
  2. 在hardhat.config.js顶部引入插件:
    require("@nomiclabs/hardhat-waffle");
    

完成后原有导入waffle的代码即可正常运行。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:27:21