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

