lib/ethex.ex

defmodule Ethex do
  @moduledoc """
  Documentation for `Ethex`.
  """
  alias Ethex.Account.Wallet
  alias Ethex.Abi.{Abi, Function, Event}
  alias Ethex.Blockchain.{GossipMethod}

  # #### Blockchain related ####

  @spec block_number(String.t()) :: {:error, any} | {:ok, integer}
  defdelegate block_number(rpc), to: GossipMethod, as: :eth_block_number

  # #### Account related ####

  @spec create_wallet :: map()
  defdelegate create_wallet(), to: Wallet, as: :create

  @spec create_wallet(String.t()) :: map()
  defdelegate create_wallet(private_key), to: Wallet, as: :create

  # #### Abi related ####

  @spec register_abi(String.t(), any) :: :ok | :error
  defdelegate register_abi(name, abi_file_path), to: Abi

  @spec get_selectors_by_name(String.t()) :: {:ok, list()} | {:error, :not_found}
  defdelegate get_selectors_by_name(name), to: Abi

  # #### Function related ####

  @spec call(String.t(), String.t(), String.t(), String.t(), list()) ::
          {:ok, list()} | {:error, any()}
  defdelegate call(rpc, abi_name, address, fun_name, args \\ []), to: Function

  # #### Event related ####

  @spec gen_block_range(String.t(), non_neg_integer() | String.t()) ::
          {:ok, non_neg_integer(), map()} | {:error, any()}
  defdelegate gen_block_range(rpc, last_block), to: Event

  @spec get_logs_and_decode(String.t(), String.t(), map()) :: {:error, any()} | {:ok, list()}
  defdelegate get_logs_and_decode(rpc, abi_name, filter), to: Event

  @spec decode(list(), [ABI.FunctionSelector.t(), ...]) :: list()
  defdelegate decode(logs, selectors), to: Event

  @spec decode_log(map(), ABI.FunctionSelector.t()) :: map()
  defdelegate decode_log(log, selector), to: Event
end