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
相关产品推荐
相关产品推荐

