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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 06:25:20