Here is the transfer function of my erc20 token which called "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;
}
And I called the transfer function in another ERC721 contract, here is my code
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);
}
In My tests, it always failed with the exception of not enough user balance but i can confirm that the deployer has enough balance and here is the error i am getting
Can someone tell me how to fix it as I am new to blockchain, that is appreciated
It is because when you call transfer in mint, msg.sender (in transfer) is the address of the calling contract (the one that implements mint) not the address of the person calling mint. Therefore, token needs to have enough balance to perform the operation.
The only time msg.sender stays the same is when the call is to another function in the contract. Call to another contract changes the msg.sender to the address of the calling contract. Without this, anyone can use msg.sender to authorize other transactions in other contracts.