lib/solana.ex

defmodule Solana do
  @moduledoc """
  A library for interacting with the Solana blockchain.
  """

  @typedoc "See `t:Solana.Key.t/0`"
  @type key :: Solana.Key.t()

  @typedoc "See `t:Solana.Key.pair/0`"
  @type keypair :: Solana.Key.pair()

  @doc """
  See `Solana.Key.pair/0`
  """
  defdelegate keypair(), to: Solana.Key, as: :pair

  @doc """
  Decodes or extracts a `t:Solana.Key.t/0` from a Base58-encoded string or a
  `t:Solana.Key.pair/0`.

  Returns `{:ok, key}` if the key is valid, or an error tuple if it's not.
  """
  def pubkey(pair_or_encoded)
  def pubkey({_sk, pk}), do: Solana.Key.check(pk)
  defdelegate pubkey(encoded), to: Solana.Key, as: :decode

  @doc """
  Decodes or extracts a `t:Solana.Key.t/0` from a Base58-encoded string or a
  `t:Solana.Key.pair/0`.

  Throws an `ArgumentError` if it fails to retrieve the public key.
  """
  def pubkey!(pair_or_encoded)

  def pubkey!(pair = {_sk, _pk}) do
    case pubkey(pair) do
      {:ok, key} -> key
      _ -> raise ArgumentError, "invalid keypair: #{inspect(pair)}"
    end
  end

  defdelegate pubkey!(encoded), to: Solana.Key, as: :decode!

  @doc """
  The public key for the [Rent system
  variable](https://docs.solana.com/developing/runtime-facilities/sysvars#rent).
  """
  def rent(), do: pubkey!("SysvarRent111111111111111111111111111111111")

  @doc """
  The public key for the [RecentBlockhashes system
  variable](https://docs.solana.com/developing/runtime-facilities/sysvars#recentblockhashes)
  """
  def recent_blockhashes(), do: pubkey!("SysvarRecentB1ockHashes11111111111111111111")

  @doc false
  def lamports_per_sol(), do: 1_000_000_000
end