lib/network.ex

defmodule Cardanoex.Network do
  alias Cardanoex.Backend
  alias Cardanoex.Util

  @moduledoc """
  The Network module helps you check various information and parameters in the network
  """

  @type network_information :: %{
          sync_process: %{
            status: String.t(),
            progress: %{
              quantity: 0..100,
              unit: String.t()
            }
          },
          node_tip: %{
            absolute_slot_number: non_neg_integer(),
            slot_number: non_neg_integer(),
            epoch_number: non_neg_integer(),
            time: String.t(),
            height: %{
              quantity: non_neg_integer(),
              unit: String.t()
            }
          },
          network_tip: %{
            absolute_slot_number: non_neg_integer(),
            slot_number: non_neg_integer(),
            epoch_number: non_neg_integer(),
            time: String.t()
          },
          next_epoch: %{
            epoch_number: non_neg_integer(),
            epoch_start_time: String.t()
          },
          node_era: String.t()
        }

  @type clock :: %{
          status: String.t(),
          offset: %{
            quantity: integer(),
            unit: String.t()
          }
        }

  @type parameters :: %{
          slot_length: %{
            quantity: non_neg_integer(),
            unit: String.t()
          },
          decentralization_level: %{
            quantity: non_neg_integer(),
            unit: String.t()
          },
          maximum_token_bundle_size: %{
            quantity: non_neg_integer(),
            unit: String.t()
          },
          genesis_block_hash: String.t(),
          blockchain_start_time: String.t(),
          desired_pool_number: non_neg_integer(),
          epoch_length: %{
            quantity: non_neg_integer(),
            unit: String.t()
          },
          eras: map(),
          active_slot_coefficient: %{
            quantity: non_neg_integer(),
            unit: String.t()
          },
          security_parameter: %{
            quantity: non_neg_integer(),
            unit: String.t()
          },
          minimum_utxo_value: %{
            quantity: non_neg_integer(),
            unit: String.t()
          },
          maximum_collateral_input_count: non_neg_integer()
        }

  @spec information :: {:error, String} | {:ok, network_information}
  @doc """
  Get information about the network.
  """
  def information do
    case Backend.network_information() do
      {:ok, information} -> {:ok, Util.keys_to_atom(information)}
      {:error, message} -> {:error, message}
    end
  end

  @spec clock :: {:error, String.t()} | {:ok, clock}
  @doc """
  Get network clock information.
  """
  def clock do
    case Backend.network_clock() do
      {:ok, clock} -> {:ok, Util.keys_to_atom(clock)}
      {:error, message} -> {:error, message}
    end
  end

  @spec parameters :: {:error, String.t()} | {:ok, parameters}
  @doc """
  Get network parameters.
  """
  def parameters do
    case Backend.network_parameters() do
      {:ok, parameters} -> {:ok, Util.keys_to_atom(parameters)}
      {:error, message} -> {:error, message}
    end
  end
end