Packages

An Elixir client for the Polymarket API.

Current section

Files

Jump to
ex_polymarket lib schemas market_resolved_event.ex
Raw

lib/schemas/market_resolved_event.ex

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