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