Packages
signet
1.6.0
1.6.1
1.6.0
1.5.0
1.4.2
1.4.1
1.4.0
1.3.12
1.3.11
1.3.10
1.3.9
1.3.8
1.3.7
1.3.6
1.3.5
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.2.9
1.2.8
1.2.7
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.2
1.1.1
1.1.0
1.0.0-echo8
1.0.0-echo7
1.0.0-echo6
1.0.0-echo5
1.0.0-echo4
1.0.0-echo3
1.0.0-echo2
1.0.0-echo1
1.0.0-delta8
1.0.0-delta7
1.0.0-delta6
1.0.0-delta5
1.0.0-delta4
1.0.0-delta3
1.0.0-delta2
1.0.0-delta1
1.0.0-charlie9
1.0.0-charlie8
1.0.0-charlie7
1.0.0-charlie6
1.0.0-charlie5
1.0.0-charlie4
1.0.0-charlie3
1.0.0-charlie2
1.0.0-charlie1
1.0.0-beta9
1.0.0-beta8
1.0.0-beta7
1.0.0-beta6
1.0.0-beta5
1.0.0-beta4
1.0.0-beta3
1.0.0-beta2
1.0.0-beta1
1.0.0-alpha9
1.0.0-alpha8
1.0.0-alpha7
1.0.0-alpha6
1.0.0-alpha5
1.0.0-alpha4
1.0.0-alpha3
1.0.0-alpha2
1.0.0-alpha10
1.0.0-alpha1
0.2.0-alpha6
0.2.0-alpha5
0.2.0-alpha4
0.2.0-alpha1
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
0.1.0-rc7
0.1.0-rc6
0.1.0-rc5
0.1.0-rc4
0.1.0-rc3
0.1.0-rc2
0.1.0-rc1
0.1.0-rc0
Lightweight Ethereum and Solana RPC client for Elixir
Current section
Files
Jump to
Current section
Files
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