def METHOD_NAME(self, shareable: Shareable, fl_ctx: FLContext) -> bool:
    """Store shareable and update aggregator's internal state
    Args:
        shareable: information from contributor
        fl_ctx: context provided by workflow
    Returns:
        The first boolean indicates if this shareable is accepted.
        The second boolean indicates if aggregate can be called.
    """
    try:
        dxo = from_shareable(shareable)
    except Exception:
        self.log_exception(fl_ctx, "shareable data is not a valid DXO")
        return False
    contributor_name = shareable.get_peer_prop(key=ReservedKey.IDENTITY_NAME, default="?")
    contribution_round = shareable.get_cookie(AppConstants.CONTRIBUTION_ROUND)
    rc = shareable.get_return_code()
    if rc and rc != ReturnCode.OK:
        self.log_warning(fl_ctx, f"Contributor {contributor_name} returned rc: {rc}. Disregarding contribution.")
        return False
    if dxo.data_kind != self.expected_data_kind:
        self.log_error(fl_ctx, "expected {} but got {}".format(self.expected_data_kind, dxo.data_kind))
        return False
    current_round = fl_ctx.get_prop(AppConstants.CURRENT_ROUND)
    self.log_debug(fl_ctx, f"current_round: {current_round}")
    if contribution_round != current_round:
        self.log_warning(
            fl_ctx,
            f"discarding DXO from {contributor_name} at round: "
            f"{contribution_round}. Current round is: {current_round}",
        )
        return False
    for item in self.history:
        if contributor_name == item["contributor_name"]:
            prev_round = item["round"]
            self.log_warning(
                fl_ctx,
                f"discarding DXO from {contributor_name} at round: "
                f"{contribution_round} as {prev_round} accepted already",
            )
            return False
    data = dxo.data
    if data is None:
        self.log_error(fl_ctx, "no data to aggregate")
        return False
    else:
        self.local_models.append(data["model_data"])
        self.local_models_as_dict.append(json.loads(data["model_data"]))
        self.history.append(
            {
                "contributor_name": contributor_name,
                "round": contribution_round,
            }
        )
    return True