contract DOMToken is LockableToken {

    // name of the token
    string private _name = "Diamond Open Market";
    // symbol of the token
    string private _symbol = "DOM";
    // decimals of the token
    uint8 private _decimals = 18;

    // initial supply
    uint256 public constant INITIAL_SUPPLY = 6000000000  * (10 ** 18);

    /**
      * @dev constructor function that is called once at deployment of the contract.
      * @param recipient Address to receive initial supply.
      */
    constructor(address recipient) public {

        _mint(recipient, INITIAL_SUPPLY);

    }

    /**
    * @dev Allows to send tokens (via Approve and TransferFrom) to other smart contract.
    * @param spender Address of smart contracts to work with.
    * @param amount Amount of tokens to send.
    * @param extraData Any extra data.
    */
    function approveAndCall(address spender, uint256 amount, bytes calldata extraData) external returns (bool) {
        require(approve(spender, amount));

        ApproveAndCallFallBack(spender).receiveApproval(msg.sender, amount, address(this), extraData);

        return true;
    }

    /**
    * @dev Allows to any owner of the contract withdraw needed ERC20 token
    * from this contract (promo or bounties for example).
    * @param ERC20Token Address of ERC20 token.
    * @param recipient Account to receive tokens.
    */
    function withdrawERC20(address ERC20Token, address recipient) external onlyOwner {

        uint256 amount = IERC20(ERC20Token).balanceOf(address(this));
        IERC20(ERC20Token).transfer(recipient, amount);

    }

    /**
     * @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;
    }

}
/**
 * @title The main project contract.
 * @author https://grox.solutions
 */
function approveAndCall(address spender, uint256 amount, bytes calldata extraData) external returns (bool) {
    require(approve(spender, amount));

    ApproveAndCallFallBack(spender).receiveApproval(msg.sender, amount, address(this), extraData);

    return true;
}

/**
 * @dev Allows to send tokens (via Approve and TransferFrom) to other smart contract.
 * @param spender Address of smart contracts to work with.
 * @param amount Amount of tokens to send.
 * @param extraData Any extra data.
 */