When I call mint function from token address it doesn't send the tokens to given address but sends to token address.
function mint(address _beneficiary, uint256 _value) public returns (bool success) { require( msg.sender == saleAddress || msg.sender == admin, "Sender must be saleAddress or admin."); balanceOf[_beneficiary] += _value; supply += _value; emit Mint(msg.sender, _beneficiary, _value); return true; Event:
event Mint( address indexed _sender, address indexed _beneficiary, uint256 _value It's interesting that this call from Sales Contract works:
function startNewPhase(uint256 _tokenPrice, uint256 tokenAmount) public { require(msg.sender == admin, "Can only be inoked by admin"); require(tokenContract.mint(address(this), tokenAmount)); saleActive = true; tokenPrice = _tokenPrice; Whole code:
Migrations.sol:
// SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; contract Migrations { address public owner = msg.sender; uint public last_completed_migration; modifier restricted() { require( msg.sender == owner, "This function is restricted to the contract's owner" ); _; } function setCompleted(uint completed) public restricted { last_completed_migration = completed; } } Sale.sol:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Token.sol"; contract Sale { address admin; Token public tokenContract; uint256 public tokenPrice; uint256 public tokenSold; bool public saleActive; event Sell( address _buyer, uint256 _amount ); constructor(Token _tokenContract, uint256 _tokenPrice) { admin = msg.sender; tokenContract = _tokenContract; tokenPrice = _tokenPrice; saleActive = true; } modifier onlyOwner { require(msg.sender == admin, "Can only be inoked by admin"); _; } function multiply(uint x, uint y) internal pure returns (uint z) { require(y == 0 || (z = x * y) / y == x); } function buyTokens(uint256 _numberOfTokens) public payable { require(saleActive == true, "Sale inactive"); require(msg.value == multiply(_numberOfTokens, tokenPrice)); require(tokenContract.balanceOf(address(this)) >= _numberOfTokens, "Not enough tokens for sale"); require(tokenContract.transfer(msg.sender, _numberOfTokens)); tokenSold += _numberOfTokens; emit Sell(msg.sender, _numberOfTokens); } function startNewPhase(uint256 _tokenPrice, uint256 tokenAmount) public onlyOwner { require(tokenContract.mint(address(this), tokenAmount)); saleActive = true; tokenPrice = _tokenPrice; } function endSale() public onlyOwner{ require(tokenContract.transfer(admin, tokenContract.balanceOf(address(this)))); payable(admin).transfer(address(this).balance); saleActive = false; } } Token.sol:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Token { string public name = "Token"; string public symbol = "TKN"; address public admin; address public saleAddress; uint256 public totalSupply = 5500000; uint256 public cicrulatingSupply; uint256 public decimals = 5; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; event Transfer( address indexed _from, address indexed _to , uint256 _value ); event Approval( address indexed _owner, address indexed _spender, uint256 _value ); event Mint( address indexed _sender, address indexed _beneficiary, uint256 _value ); constructor() { admin = msg.sender; } function writeSale(address _saleAddress) public returns (bool success) { require(msg.sender == admin, "Sender must be address"); saleAddress = _saleAddress; return true; } function transfer (address _to, uint256 _value) public returns (bool success) { require(balanceOf[msg.sender] >= _value, 'Not enough funds'); balanceOf[msg.sender] -= _value; balanceOf[_to] += _value; emit Transfer(msg.sender, _to, _value); return true; } function mint(address _beneficiary, uint256 _value) public returns (bool success) { require( msg.sender == saleAddress || msg.sender == admin, "Sender must be saleAddress or admin."); require( cicrulatingSupply + _value <= totalSupply, "Reached totalSupply cap"); balanceOf[_beneficiary] += _value; cicrulatingSupply += _value; emit Mint(msg.sender, _beneficiary, _value); return true; } function approve(address _spender, uint256 _value) public returns (bool success) { allowance[msg.sender][_spender] = _value; emit Approval(msg.sender, _spender, _value); return true; } function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) { require( balanceOf[_from] >= _value); require (allowance[_from][msg.sender] >= _value); balanceOf[_from] -= _value; balanceOf[_to] += _value; allowance[_from][msg.sender] -= _value; emit Transfer(_from, _to, _value); return true; } }