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

Hardhat中使用.sub()校验ERC20合约所有者余额时函数不可用错误

问题解决:Hardhat测试中.sub()方法不可用及潜在挖矿奖励问题

核心错误原因

在ethers.js v6及以上版本中,调用balanceOf返回的是原生BigInt类型,而非旧版本的BigNumber对象,因此不存在.sub()方法,直接调用会报错。

解决方案

方法1:使用BigInt原生减法运算

直接用-运算符替代.sub(),注意将数值转为BigInt类型(添加n后缀):

// 替换原错误行
expect(finalOwnerBalance).to.equal(initialOwnerBalance - 150n);

方法2:转换为ethers BigNumber处理

如果习惯使用ethers的数值方法,可将余额结果手动转为BigNumber:

// 修改初始余额和最终余额的获取代码
const initialOwnerBalance = ethers.BigNumber.from(await oceanToken.balanceOf(owner.address));
// ...执行转账操作
const finalOwnerBalance = ethers.BigNumber.from(await oceanToken.balanceOf(owner.address));

// 此时可正常使用.sub()方法
expect(finalOwnerBalance).to.equal(initialOwnerBalance.sub(150));

额外注意事项

你的合约中_beforeTokenTransfer钩子会在每次非铸币、非矿工转账的操作中触发_mintMinerReward,即每次转账都会给矿工铸造blockReward数量的代币。这意味着两次转账会触发两次挖矿奖励,总供给会增加2倍的blockReward,但owner的余额仅减少转出的150个单位(挖矿奖励为新铸代币,不影响owner余额)。

另外,测试中这行代码存在逻辑错误:

console.log(initialOwnerBalance - Number(hre.ethers.formatEther(150)));

formatEther(150)会将150 wei转换为以太单位的极小数值,与BigInt相减会导致计算错误,建议改为:

console.log(initialOwnerBalance - 150n);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 10:26:01