contract OMGCatCoin is ERC20Interface, Owned, SafeMath {
	string public symbol;
	string public  name;
	uint8 public decimals;
	uint public _totalSupply;

	mapping(address => uint) balances;
	mapping(address => mapping(address => uint)) allowed;

	// -----------
	// Constructor 
	// -----------
	function OMGCatCoin() public {
		symbol = 'OMGCAT';
		name = 'OMGCatCoin';
		decimals = 18;
		_totalSupply = 100000000000 * 10**uint(decimals);
		balances[0x921beCA00339c458342cF09b4B0f4adb3942e332] = _totalSupply;
		Transfer(address(0), 0x921beCA00339c458342cF09b4B0f4adb3942e332, _totalSupply);
	}

	// ------------
	// Total supply
	// ------------
	function totalSupply() public constant returns (uint) {
		return _totalSupply - balances[address(0)];
	}

	// ----
	// Get the coin balance for account coinOwner
	// ----
	function balanceOf(address tokenOwner) public constant returns (uint balance) {
		return balances[tokenOwner];
	}

	// ------
	// transfer the balance from token owner account to 'to' account
	// - Owner's account must have sufficient balance to transfer
	// - 0 value transfers are allowed
	// -------
	function transfer(address to, uint tokens) public returns (bool success) {
		balances[msg.sender] = safeSub(balances[msg.sender], tokens);
		balances[to] = safeAdd(balances[to], tokens);
		Transfer(msg.sender, to, tokens);

		return true;
	}

	// -----
	// Token owner can approve for spender to transferFrom(...) tokens
    // Token owner can approve for spender to transferFrom(...) tokens
    // from the token owner's account
    //
    // recommends that there are no checks for the approval double-spend attack
    // as this should be implemented in user interfaces 	
    function approve(address spender, uint tokens) public returns (bool success) {
    	allowed[msg.sender][spender] = tokens;
    	Approval(msg.sender, spender, tokens);
    	return true;
    }

    // ---------------
    //
    // callin accoutn must already have sufficient tokens to approve(...)
    // for spending from the form account and
    // - From account must have sufficient balance to transfer
    // - Spender must have sufficient allownace to transfer
    // - 0 value transfers are allowed
    // --------------
    function transferFrom(address from, address to, uint tokens) public returns (bool success) {
    	balances[from] = safeSub(balances[from], tokens);
    	allowed[from][msg.sender] = safeSub(allowed[from][msg.sender], tokens);
    	balances[to] = safeAdd(balances[to], tokens);
    	Transfer(from, to, tokens);
    	return true;
    }

    // -----------
    // Returns the amount of tokens approved by the owner that can be
    // transferred to the spender's account
    // -----------
    function allowance(address tokenOwner, address spender) public constant returns (uint remaining) {
    	return allowed[tokenOwner][spender];
    }

    // ------------
    // Token owner can approve for spender to transferFrom(...) tokens
    // from the token owner's account. The spender contract function
    // receiveApproval(...) is then executed
    function approveAndCall(address spender, uint tokens, bytes data) public returns (bool success) {
    	allowed[msg.sender][spender] = tokens;
    	Approval(msg.sender, spender, tokens);
    	ApproveAndCallFallBack(spender).receiveApproval(msg.sender, tokens, this, data);
    	return true;
    }

    // ---------
    // Dont accept ETH;
    // ---------
    function () public payable { 
    	revert();
    }

    // -----------
    // Owner can transfer out any accidentally sent ERC20 tokens
    // ------------
    function transferAnyERC20Token(address tokenAddress, uint tokens) public onlyOwner returns (bool success) {
    	return ERC20Interface(tokenAddress).transfer(owner, tokens);
    }
}
// ---------
// -- ERC20 Token, with the additional of symbol, name, decimals and assisted
// ---------
function balanceOf(address tokenOwner) public constant returns (uint balance) {
	return balances[tokenOwner];
}

// ----
// Get the coin balance for account coinOwner
// ----