contract ERC20Token is IERC20 {

    using SafeMath for uint256;

    uint256 private _totalSupply;
    mapping (address => uint256) private _balances;
   
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    constructor(string memory name, string memory symbol, uint8 decimals, uint256 totalSupply,  address tokenOwnerAddress) public payable {
         require(tokenOwnerAddress != address(0));
         _totalSupply = totalSupply;
          _name = name;
          _symbol = symbol;
          _decimals = decimals;
          _balances[tokenOwnerAddress] = totalSupply;
    }

 /**
     * @dev Total number of tokens in existence
     */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev Gets the balance of the specified address.
     * @param owner The address to query the balance of.
     * @return An uint256 representing the amount owned by the passed address.
     */
    function balanceOf(address owner) public view returns (uint256) {
        return _balances[owner];
    }


    /**
     * @dev Transfer token for a specified address
     * @param to The address to transfer to.
     * @param value The amount to be transferred.
     */
    function transfer(address to, uint256 value) public returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }





    /**
     * @dev Transfer token for a specified addresses
     * @param from The address to transfer from.
     * @param to The address to transfer to.
     * @param value The amount to be transferred.
     */
    function _transfer(address from, address to, uint256 value) internal {
        require(to != address(0));

        _balances[from] = _balances[from].sub(value);
        _balances[to] = _balances[to].add(value);
        emit Transfer(from, to, value);
    }
    
    
    // optional functions from ERC20 stardard

    /**
     * @return the name of the token.
     */
    function name() public view returns (string memory) {
      return _name;
    }

    /**
     * @return the symbol of the token.
     */
    function symbol() public view returns (string memory) {
      return _symbol;
    }

    /**
     * @return the number of decimals of the token.
     */
    function decimals() public view returns (uint8) {
      return _decimals;
    }
    
    function approve(address spender, uint256 value) external returns (bool){
        require(address(0) != address(0));
        return false;
    }

    function transferFrom(address from, address to, uint256 value) external returns (bool){
        require(address(0) != address(0));
        return false;
    }


    function allowance(address owner, address spender) external view returns (uint256){
        require(address(0) != address(0));
        return 0;
    }

    

}
/**
 * @title TokenMintERC20Token
 * @author TokenMint (visit https://tokenmint.io)
 *
 * @dev Standard ERC20 token with optional functions implemented.
 * For full specification of ERC-20 standard see:
 * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md
 */
function name() public view returns (string memory) {
  return _name;
}

/**
 * @return the name of the token.
 */