Error: Returned error: VM Exception while processing transaction: revert Not Enough Balance -- Reason given: Not Enough Balance

Error: Returned error: VM Exception while processing transaction: revert Not Enough Balance -- Reason given: Not Enough Balance

这是我的 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 来授权其他合约中的其他交易。