错误:返回错误:处理事务时的 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 来授权其他合约中的其他交易。