Current section

Files

Jump to
signet lib signet application.ex
Raw

lib/signet/application.ex

defmodule Signet.Application do
# See https://hexdocs.pm/elixir/Application.html
# for more information on OTP Applications
@moduledoc false
use Application
def chain_id(), do: Signet.Util.parse_chain_id(Application.get_env(:signet, :chain_id, 1))
def ethereum_node(),
do: Application.get_env(:signet, :ethereum_node, "https://mainnet.infura.io")
def http_client(), do: Application.get_env(:signet, :client, Finch)
@impl true
def start(_type, _args) do
eth_signers = Application.get_env(:signet, :signer, [])
sol_signers = Application.get_env(:signet, :solana_signer, [])
finch_name = Application.get_env(:signet, :finch_name, SignetFinch)
# start a finch process by default
finch_child =
if Application.get_env(:signet, :start_finch, true) do
[{Finch, name: finch_name}]
else
[]
end
children =
Enum.map(eth_signers, &get_signer_spec/1) ++
Enum.map(sol_signers, &get_solana_signer_spec/1) ++
finch_child
opts = [strategy: :one_for_one, name: Signet.Supervisor]
Supervisor.start_link(children, opts)
end
# --- Ethereum signers ---
def get_signer_spec({name, signer_type}) do
name =
case name do
:default -> Signet.Signer.Default
els -> els
end
Supervisor.child_spec(
{Signet.Signer, mfa: signer_mfa(signer_type), name: name},
id: name
)
end
defp signer_mfa({:priv_key, priv_key}) do
{Signet.Signer.Curvy, :sign, [Signet.Util.decode_hex_input!(priv_key)]}
end
defp signer_mfa({:cloud_kms, kms_credentials, key_path, version}) do
# E.g. "projects/*/locations/*/keyRings/*/cryptoKeys/*"
["projects", project, "locations", location, "keyRings", key_ring, "cryptoKeys", key_id] =
String.split(key_path, "/")
{Signet.Signer.CloudKMS, :sign,
[kms_credentials, project, location, key_ring, key_id, version]}
end
# --- Solana signers ---
defp get_solana_signer_spec({name, signer_type}) do
name =
case name do
:default -> Signet.Solana.Signer.Default
els -> els
end
Supervisor.child_spec(
{Signet.Solana.Signer, mfa: solana_signer_mfa(signer_type), name: name},
id: name
)
end
defp solana_signer_mfa({:ed25519, seed}) do
{Signet.Solana.Signer.Ed25519, :sign, [decode_solana_key!(seed)]}
end
defp solana_signer_mfa({:cloud_kms, kms_credentials, key_path, version}) do
["projects", project, "locations", location, "keyRings", key_ring, "cryptoKeys", key_id] =
String.split(key_path, "/")
{Signet.Solana.Signer.CloudKMS, :sign,
[kms_credentials, project, location, key_ring, key_id, version]}
end
# Solana keys can be raw 32-byte binaries, hex-encoded, or Base58-encoded
defp decode_solana_key!(key) when byte_size(key) == 32, do: key
defp decode_solana_key!(key) when is_binary(key) do
case Base.decode16(key, case: :mixed) do
{:ok, <<decoded::binary-32>>} ->
decoded
_ ->
case Signet.Base58.decode(key) do
{:ok, <<decoded::binary-32>>} -> decoded
_ -> Signet.Util.decode_hex_input!(key)
end
end
end
end