Packages

Ethereum Contract interaction via json-rpc for multi-chain based on ex_abi

Current section

Files

Jump to
ethex lib abi abi.ex
Raw

lib/abi/abi.ex

defmodule Ethex.Abi.Abi do
@moduledoc false
use GenServer
def start_link(_) do
GenServer.start_link(__MODULE__, :ok, name: __MODULE__)
end
@spec print_state :: map()
def print_state(), do: GenServer.call(__MODULE__, :print_state)
@spec register_abi(String.t(), any) :: :ok | :error
def register_abi(name, abi_file_path) do
GenServer.call(__MODULE__, {:register_abi, name, abi_file_path})
end
@spec get_selectors_by_name(String.t()) :: {:ok, list()} | {:error, :not_found}
def get_selectors_by_name(name) do
GenServer.call(__MODULE__, {:get_selectors_by_name, name})
end
@impl GenServer
def init(:ok), do: {:ok, %{}}
@impl GenServer
def handle_call(:print_state, _, state), do: {:reply, state, state}
@impl GenServer
def handle_call({:register_abi, name, abi_file_path}, _, state) do
with {:ok, str} <- File.read(abi_file_path),
{:ok, abi} <- Jason.decode(str) do
fs = ABI.parse_specification(abi, include_events?: true)
{:reply, :ok, Map.put(state, name, fs)}
else
_ -> {:reply, :error, state}
end
end
@impl GenServer
def handle_call({:get_selectors_by_name, name}, _, state) do
case Map.get(state, name) do
nil -> {:reply, {:error, :not_found}, state}
selectors -> {:reply, {:ok, selectors}, state}
end
end
end