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,直接替换对应代码即可:
- 修改顶部导入语句,移除waffle的解构:
const { expect, assert} = require("chai"); const { ethers } = require("hardhat") - 替换获取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插件恢复导入:
- 安装依赖:
npm install --save-dev @nomiclabs/hardhat-waffle ethereum-waffle - 在
hardhat.config.js顶部引入插件:require("@nomiclabs/hardhat-waffle");
完成后原有导入waffle的代码即可正常运行。
内容的提问来源于stack exchange,提问作者dazito
相关产品推荐
相关产品推荐

