Hardhat测试ERC20代币buy功能时amount.mul()报错求助
问题解决:TypeError: amount.mul is not a function
原因分析
问题出在ethers.js版本差异:
- 你参考的YouTube视频使用的是ethers.js v5版本,
ethers.parseEther()返回的是ethers.BigNumber对象,该对象自带mul()方法。 - 你当前用的是ethers.js v6版本,
ethers.parseEther()返回的是原生JavaScript的BigInt类型,它没有mul()方法,只能用原生乘法运算符*。
修复方案
把测试代码里调用mul()的行替换为原生BigInt乘法即可,注意要把数字1000转为BigInt类型(BigInt不能和普通Number直接运算):
修改后的关键代码行:
const tokenAmount = amount * BigInt(1000); // 用原生BigInt乘法替代mul()
完整修复后的测试用例代码:
it("Buying token Successful", async function () { const buyer = accounts[2]; const tokenAmount = amount * BigInt(1000); await token.connect(buyer).buy({ value: amount }); expect(await token.balanceOf(buyer.address)).to.equal(tokenAmount); });
额外说明
合约里的msg.value * 1000是Solidity的uint256运算,和测试中BigInt计算的结果完全匹配:
amount是ethers.parseEther("1"),对应1e18 wei(BigInt类型)- 乘以BigInt(1000)后得到1e21,和合约中
1 ether * 1000的结果一致
内容的提问来源于stack exchange,提问作者Bikash Santra
相关产品推荐
相关产品推荐

