微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

错误:返回错误:处理事务时的 VM 异常:恢复余额不足 -- 给出的原因:余额不足

如何解决错误:返回错误:处理事务时的 VM 异常:恢复余额不足 -- 给出的原因:余额不足

这里是我的 erc20 代币的转移函数,名为“CBC”

function transfer(address receiver,uint numTokens) public payable returns (bool)  {
        require(numTokens <= balances[msg.sender],"Not Enough Balance");
        balances[msg.sender] = balances[msg.sender].sub(numTokens);
        balances[receiver] = balances[receiver].add(numTokens);
        emit Transfer(msg.sender,receiver,numTokens);
        return true;
    }

我在另一个 ERC721 合约中调用了转移函数,这是我的代码

function mint(string calldata _uri,uint value) external onlyOwner {
    token.transfer(receiverAddress,value);
    super._mint(msg.sender,tokenId);
    super._setTokenUri(tokenId,_uri);
    urlOf[tokenId] = _uri;
    tokenId = tokenId + 1;
    emit MintToken(msg.sender,tokenId,_uri,value);
}

在我的测试中,它总是失败,除了没有足够的用户余额,但我可以确认部署者有足够的余额,这里是 error i am getting

有人能告诉我如何修复它,因为我是区块链的新手,不胜感激

解决方法

这是因为当你在 mint 中调用 transfer 时,msg.sender(在 transfer 中)是调用合约(实现 mint 的那个)的地址,而不是调用 mint 的人的地址。因此,token 需要有足够的余额来执行操作。

msg.sender 保持不变的唯一时间是调用合约中的另一个函数时。调用另一个合约会将 msg.sender 更改为调用合约的地址。没有这个,任何人都可以使用 msg.sender 来授权其他合约中的其他交易。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。