lib/util/network.ex

defmodule Stellar.Network do
  @moduledoc """
  Utility that handles Stellar's network configuration.
  """

  alias StellarBase.XDR.Hash

  @passphrases [
    public: "Public Global Stellar Network ; September 2015",
    test: "Test SDF Network ; September 2015",
    future: "Test SDF Future Network ; October 2022",
    standalone: "Standalone Network ; February 2017"
  ]

  @horizon_urls [
    public: "https://horizon.stellar.org",
    test: "https://horizon-testnet.stellar.org",
    future: "https://horizon-futurenet.stellar.org",
    local: "http://localhost:8000"
  ]

  @type passphrase :: String.t()
  @type url :: String.t()
  @type hash :: String.t()

  @spec public_passphrase() :: passphrase()
  def public_passphrase, do: @passphrases[:public]

  @spec testnet_passphrase() :: passphrase()
  def testnet_passphrase, do: @passphrases[:test]

  @spec futurenet_passphrase() :: passphrase()
  def futurenet_passphrase, do: @passphrases[:future]

  @spec standalone_passphrase() :: passphrase()
  def standalone_passphrase, do: @passphrases[:standalone]

  @spec public_horizon_url() :: url()
  def public_horizon_url, do: @horizon_urls[:public]

  @spec testnet_horizon_url() :: url()
  def testnet_horizon_url, do: @horizon_urls[:test]

  @spec futurenet_horizon_url() :: url()
  def futurenet_horizon_url, do: @horizon_urls[:future]

  @spec local_horizon_url() :: url()
  def local_horizon_url, do: @horizon_urls[:local]

  @spec network_id(passphrase :: passphrase()) :: hash()
  def network_id(passphrase), do: :crypto.hash(:sha256, passphrase)

  @spec network_id_xdr(passphrase :: passphrase()) :: Hash.t()
  def network_id_xdr(passphrase) do
    passphrase
    |> network_id()
    |> Hash.new()
  end
end