Skip to main content

lib/rujira/assets/metadata.ex

defmodule Rujira.Assets.Metadata do
  @moduledoc """
  Module for handling asset metadata.
  """

  alias Cosmos.Bank.V1beta1.Query.Stub
  alias Cosmos.Bank.V1beta1.QueryDenomMetadataRequest
  alias Cosmos.Bank.V1beta1.QueryDenomMetadataResponse

  defstruct decimals: 0,
            description: nil,
            display: nil,
            name: nil,
            symbol: nil,
            uri: nil,
            uri_hash: nil,
            png_url: nil,
            svg_url: nil

  @type t :: %__MODULE__{
          decimals: integer(),
          description: String.t(),
          display: String.t(),
          name: String.t(),
          symbol: String.t(),
          uri: String.t(),
          uri_hash: String.t(),
          png_url: String.t(),
          svg_url: String.t()
        }

  def load_metadata(denom) do
    q = %QueryDenomMetadataRequest{denom: denom}

    case Rujira.Node.query(&Stub.denom_metadata/2, q) do
      {:ok, %QueryDenomMetadataResponse{metadata: metadata}} ->
        {:ok,
         %__MODULE__{
           description: metadata.description,
           display: metadata.display,
           name: metadata.name,
           symbol: metadata.symbol,
           uri: metadata.uri,
           uri_hash: metadata.uri_hash
         }}

      _ ->
        {:ok,
         %__MODULE__{
           description: "",
           display: String.upcase(denom),
           name: String.upcase(denom),
           symbol: denom,
           uri: "",
           uri_hash: ""
         }}
    end
  end
end