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