contract GBMCoin is IERC20, SafeMath{

    string public name;
    string public symbol;
    uint8 public decimals;
    uint256 public totalSupply;
    
    mapping(address => uint256) public balanceOf;    
    mapping(address => mapping(address => uint256)) public allowance;
    
    // initialize the contract
    constructor() public {
        name = "GBM Coin";
        symbol = "GBM";
        decimals = 18;
        totalSupply = 10000000000000000000000000000;            
        balanceOf[msg.sender] = totalSupply;        
    }
             
    /* Send coins */ 
    function transfer(address _to, uint256 _value) public returns (bool) {        
        require(_to != address(0x0)); // Prevent transfer to 0x0 address  OK     
        require(_value > 0);
        require(balanceOf[msg.sender] >= _value);        
        require(balanceOf[_to] + _value >= balanceOf[_to]); // Check for overflows
        balanceOf[msg.sender] = sub(balanceOf[msg.sender], _value);
        balanceOf[_to] = add(balanceOf[_to], _value);
        emit Transfer(msg.sender, _to, _value);
        return true;
    }

    function approve(address _spender, uint256 _value) public returns (bool) {
        require(_spender != address(0));
        require(_value > 0);
        allowance[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }
    
        
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
        require(_value <= allowance[_from][msg.sender]);    
        require(_value <= balanceOf[_from]);                
        require(balanceOf[_to] + _value >= balanceOf[_to]);  // Check for overflows    
        require(_to != address(0));
        require(_value > 0);
        balanceOf[_from] = sub(balanceOf[_from], _value);
        balanceOf[_to] = add(balanceOf[_to], _value);
        allowance[_from][msg.sender] = sub(allowance[_from][msg.sender], _value);        
        emit Transfer(_from, _to, _value);
        return true;
    }

}
// ----------------------------------------------------------------------------
// TOKEN
// ----------------------------------------------------------------------------
function transfer(address _to, uint256 _value) public returns (bool) {        
    require(_to != address(0x0)); // Prevent transfer to 0x0 address  OK     
    require(_value > 0);
    require(balanceOf[msg.sender] >= _value);        
    require(balanceOf[_to] + _value >= balanceOf[_to]); // Check for overflows
    balanceOf[msg.sender] = sub(balanceOf[msg.sender], _value);
    balanceOf[_to] = add(balanceOf[_to], _value);
    emit Transfer(msg.sender, _to, _value);
    return true;
}

/* Send coins */