defmodule Ethex.Utils do @moduledoc """ some utils """ require Logger @spec to_hex(integer()) :: String.t() def to_hex(number), do: "0x" <> Integer.to_string(number, 16) @spec from_hex(String.t()) :: integer() def from_hex("0x" <> hex_string), do: String.to_integer(hex_string, 16) @doc false @spec http_post(String.t(), map()) :: any() def http_post(rpc, params) do headers = [{"content-type", "application/json"}] options = [timeout: 30000, recv_timeout: 5000] req_body = Map.merge(%{jsonrpc: "2.0", id: fetch_request_id()}, params) with {:ok, encoded_data} <- Jason.encode(req_body), {:ok, %HTTPoison.Response{status_code: 200, body: body}} <- HTTPoison.post(rpc, encoded_data, headers, options), {:ok, %{result: result}} <- Jason.decode(body, keys: :atoms) do {:ok, result} else {:ok, %HTTPoison.Response{status_code: 502}} -> Logger.error( name: :http_post, rpc: rpc, params: inspect(params), error: "Bad Gateway" ) {:ok, %HTTPoison.Response{status_code: 503}} -> Logger.error( name: :http_post, rpc: rpc, params: inspect(params), error: "Service Temporarily Unavailable" ) {:error, %HTTPoison.Error{reason: reason}} -> Logger.error(name: :http_post, rpc: rpc, params: inspect(params), error: inspect(reason)) {:error, reason} {:error, %Jason.EncodeError{}} -> Logger.error(name: :http_post, rpc: rpc, params: inspect(params), error: "invalid params") {:error, "invalid params"} {:ok, %{error: error}} -> Logger.error(name: :http_post, rpc: rpc, params: inspect(params), error: inspect(error)) {:error, error} other -> Logger.error(name: :http_post, rpc: rpc, params: inspect(params), error: inspect(other)) {:error, "unknown error"} end end # @spec camel_to_underscore(map()) :: map() # def camel_to_underscore(map) when is_map(map) do # Enum.reduce(map, %{}, fn {k, v}, acc -> # Map.put(acc, k |> Macro.underscore() |> String.to_atom(), v) # end) # end defp fetch_request_id() do case Application.fetch_env(:ethex, :request_id) do {:ok, value} -> value :error -> "ethex" end end end