def METHOD_NAME(node: messages.HDNodeType, i: int) -> messages.HDNodeType:
    # Public Child key derivation (CKD) algorithm of BIP32
    i_as_bytes = struct.pack(">L", i)
    if i & tools.HARDENED_FLAG:
        raise ValueError("Prime derivation not supported")
    # Public derivation
    data = node.public_key + i_as_bytes
    I64 = hmac.HMAC(key=node.chain_code, msg=data, digestmod=hashlib.sha512).digest()
    I_left_as_exponent = string_to_number(I64[:32])
    # BIP32 magic converts old public key to new public point
    x, y = sec_to_public_pair(node.public_key)
    point = I_left_as_exponent * SECP256k1.generator + Point(
        SECP256k1.curve, x, y, SECP256k1.order
    )
    if point == INFINITY:
        raise ValueError("Point cannot be INFINITY")
    return messages.HDNodeType(
        depth=node.depth + 1,
        child_num=i,
        chain_code=I64[32:],
        fingerprint=fingerprint(node.public_key),
        # Convert public point to compressed public key
        public_key=point_to_pubkey(point),
    )