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

Solidity合约测试报Cannot read property 'BuyToken' of undefined如何解决

问题原因分析

1. 测试代码层面直接触发报错的核心原因

  • 你在beforeEach中只调用了合约的deploy()方法,没有后续调用.send()方法完成链上部署,此时的token变量只是部署器对象,不是已经部署完成的合约实例,不存在methods属性,因此访问token.methods会返回undefined,进一步读取BuyToken就抛出了对应错误。
    正确的部署写法示例如下,需要补充send参数传入部署地址和gas限制:
    token = await new web3.eth.Contract(KiaToken.abi as AbiItem[])
      .deploy({
          data: KiaToken.evm.bytecode.object,
          arguments: [rapstoneAddress, initSupply, TokenName, tokenSymbol, decimalUnits]
      })
      .send({
          from: 你的测试钱包地址,
          gas: '3000000'
      })
    
  • 你当前的测试用例逻辑完全错误:BuyToken是用于购买代币的payable方法,没有返回值,也不能用call调用(需要发起上链交易),你要校验合约owner应该调用合约自带的owner()方法,而非BuyToken。

2. 合约代码层面的隐藏问题(即使修复测试部署问题,后续执行也会失败)

  • KIA合约中你额外声明了未初始化的Token private token变量,你已经继承了Token合约,不需要单独声明这个变量。你在BuyToken和ownerToken方法中调用的token是未赋值的空地址,调用会直接回滚。建议删除这个多余的变量,方法中直接调用继承自父合约的transfer、owner方法即可。
  • Token合约的两个修饰符逻辑全部写反:
    • transferModifire中require(_value <= 0)要求转账金额小于等于0才能通过,正常转账逻辑应该是require(_value > 0);require(balance[_to] + _value < balance[_to])要求转账后溢出才能通过,正常逻辑应该是require(balance[_to] + _value >= balance[_to]),且你使用的0.8.7版本solidity自带溢出检查,不需要手动写这类校验,也不需要额外引入SafeMath。
    • transferFromModifire里的所有require判断条件全是反向的,比如require(balance[_from] < _value, " not have enough money ")要求余额小于转账金额才能通过,正常逻辑应该是require(balance[_from] >= _value)。

内容的提问来源于stack exchange,提问作者Mr Coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:51:01