defmodule Polymarket.Schemas.MarketResolvedEvent do @moduledoc """ Market resolved event. Announces that a market has settled, naming the winning asset and its outcome. """ use TypedEctoSchema alias Polymarket.JsonUtil alias Polymarket.Schemas.Coerce alias Polymarket.Schemas.EventMessage @primary_key false @derive Jason.Encoder typed_embedded_schema do field(:id, :string) field(:market, :string) field(:assets_ids, {:array, :string}) field(:winning_asset_id, :string) # Free-form outcome label, e.g. "Yes", "No", "Over", or a team name. field(:winning_outcome, :string) field(:tags, {:array, :string}) # Unix epoch in milliseconds, delivered as a string (e.g. "1782494011246"). field(:timestamp, :integer) field(:event_type, :string) embeds_one(:event_message, EventMessage) end @required [:id, :market, :winning_asset_id, :winning_outcome, :timestamp, :event_type] @doc """ Builds a `MarketResolvedEvent` from a decoded (atom-keyed) websocket message, coercing each value to its field type. Returns `{:error, {:missing_fields, fields}}` when a required field is absent. """ @spec from_attrs(map()) :: {:ok, t()} | {:error, {:missing_fields, [atom()]}} def from_attrs(attrs) do attrs = JsonUtil.snake_case_keys(attrs) %__MODULE__{ id: attrs["id"], market: attrs["market"], assets_ids: attrs["assets_ids"], winning_asset_id: attrs["winning_asset_id"], winning_outcome: attrs["winning_outcome"], tags: attrs["tags"], timestamp: Coerce.to_int(attrs["timestamp"]), event_type: attrs["event_type"], event_message: Coerce.embed(EventMessage, attrs["event_message"]) } |> Coerce.require_fields(@required) end end