def ipstr_to_tup(formatted_ip: str) -> tuple[str, int]:
    """
    Converts a string IP address into a tuple equivalent

    :param formatted_ip: A string, representing the IP address.
        Must be in the format "ip:port"
    :type formatted_ip: str
    :return: A tuple, with IP address as the first element, and
        an INTEGER port as the second element
    :rtype: tuple[str, int]

    :raise ValueError: If the IP address isn't in the "ip:port" format.
    """

    try:
        ip_split = formatted_ip.split(":")
        if len(ip_split) != 2:
            raise IndexError
        if len(ip_split[0].split(".")) != 4:
            raise IndexError
        if int(ip_split[1]) <= 0 or int(ip_split[1]) > 65535:
            raise IndexError

        recon_ip_split = (str(ip_split[0]), int(ip_split[1]))
        return recon_ip_split
    except IndexError:
        raise ValueError(f"{formatted_ip} is not a valid IP address") from None