diff --git a/lib/eth/query.ex b/lib/eth/query.ex index 766f00c..ea2c512 100644 --- a/lib/eth/query.ex +++ b/lib/eth/query.ex @@ -1,3 +1,4 @@ +# TODO: use Macro.underscore defmodule ETH.Query do import ETH.Utils @@ -27,7 +28,7 @@ defmodule ETH.Query do end def get_block(block_number) when is_number(block_number) do - Ethereumex.HttpClient.eth_get_block_by_number([block_number, true]) + Ethereumex.HttpClient.eth_get_block_by_number(["0x" <> Hexate.encode(block_number), true]) |> get_result # TODO: make camelCased to snake_cased |> convert_block_details end @@ -75,20 +76,7 @@ defmodule ETH.Query do def get_transaction(transaction_hash) do Ethereumex.HttpClient.eth_get_transaction_by_hash([transaction_hash]) |> get_result - |> Enum.reduce(%{}, fn(tuple, acc) -> - {key, value} = tuple - - case key do - "nonce" -> Map.put(acc, :nonce, convert_to_number(value)) - "blockHash" -> Map.put(acc, :block_hash, value) - "blockNumber" -> Map.put(acc, :block_number, convert_to_number(value)) - "transactionIndex" -> Map.put(acc, :transaction_index, convert_to_number(value)) - "value" -> Map.put(acc, :value, convert_to_number(value)) - "gasPrice" -> Map.put(acc, :gas_price, convert_to_number(value)) - "gas" -> Map.put(acc, :gas, convert_to_number(value)) - _ -> Map.put(acc, String.to_atom(key), value) - end - end) + |> convert_transaction_details end def get_transaction_receipt(transaction_hash) do @@ -104,8 +92,13 @@ defmodule ETH.Query do "blockNumber" -> Map.put(acc, :block_number, convert_to_number(value)) "cumulativeGasUsed" -> Map.put(acc, :cumulative_gas_used, convert_to_number(value)) "gasUsed" -> Map.put(acc, :gas_used, convert_to_number(value)) - "contractAddress" -> Map.put(acc, :contract_address, value) - "logs" -> Map.put(acc, :logs, value) + "contractAddress" -> Map.put(acc, :contract_address, value) + "logs" -> + Map.put(acc, :logs, Enum.map(value, fn(log) -> + convert_transaction_log(log) + end)) + "logsBloom" -> Map.put(acc, :logs_bloom, value) + _ -> Map.put(acc, String.to_atom(key), value) end end) end @@ -125,7 +118,8 @@ defmodule ETH.Query do |> get_number_result end - defp get_result(eth_result), do: eth_result |> elem(1) |> Map.get("result") + defp get_result({:ok, eth_result}), do: Map.get(eth_result, "result") + defp get_result(error), do: raise error defp get_number_result(eth_result) do get_result(eth_result) |> convert_to_number @@ -137,6 +131,42 @@ defmodule ETH.Query do |> Hexate.to_integer end + defp convert_transaction_log(log) do + Enum.reduce(log, %{}, fn(tuple, acc) -> + + {key, value} = tuple + + case key do + "blockHash" -> Map.put(acc, :block_hash, value) + "blockNumber" -> Map.put(acc, :block_number, convert_to_number(value)) + "logIndex" -> Map.put(acc, :log_index, convert_to_number(value)) + "transactionHash" -> Map.put(acc, :transaction_hash, value) + "transactionIndex" -> Map.put(acc, :transaction_index, convert_to_number(value)) + "transactionLogIndex" -> Map.put(acc, :transaction_log_index, convert_to_number(value)) + _ -> Map.put(acc, String.to_atom(key), value) + end + end) + end + defp convert_transaction_details(transaction) do + Enum.reduce(transaction, %{}, fn(tuple, acc) -> + {key, value} = tuple + + case key do + "nonce" -> Map.put(acc, :nonce, convert_to_number(value)) + "blockHash" -> Map.put(acc, :block_hash, value) + "blockNumber" -> Map.put(acc, :block_number, convert_to_number(value)) + "transactionIndex" -> Map.put(acc, :transaction_index, convert_to_number(value)) + "value" -> Map.put(acc, :value, convert_to_number(value)) + "gasPrice" -> Map.put(acc, :gas_price, convert_to_number(value)) + "gas" -> Map.put(acc, :gas, convert_to_number(value)) + "networkId" -> Map.put(acc, :network_id, value) + "publicKey" -> Map.put(acc, :public_key, value) + "standardV" -> Map.put(acc, :standard_v, value) + _ -> Map.put(acc, String.to_atom(key), value) + end + end) + end + defp convert_block_details(result) do result |> Enum.reduce(%{}, fn(tuple, acc) -> @@ -145,19 +175,25 @@ defmodule ETH.Query do case key do "number" -> Map.put(acc, :number, convert_to_number(value)) "parentHash" -> Map.put(acc, :parent_hash, value) + "mixHash" -> Map.put(acc, :mix_hash, value) "sha3Uncles" -> Map.put(acc, :sha3_uncles, value) "logsBloom" -> Map.put(acc, :logs_bloom, value) "transactionsRoot" -> Map.put(acc, :transactions_root, value) "stateRoot" -> Map.put(acc, :state_root, value) - "receiptRoot" -> Map.put(acc, :receipt_root, value) - "difficulty" -> Map.put(acc, :difficulty, convert_to_number(value)) - "totalDifficulty" -> Map.put(acc, :total_difficulty, convert_to_number(value)) + "receiptsRoot" -> Map.put(acc, :receipt_root, value) "extraData" -> Map.put(acc, :extra_data, value) "size" -> Map.put(acc, :size, convert_to_number(value)) + "sealFields" -> Map.put(acc, :seal_fields, value) "gasLimit" -> Map.put(acc, :gas_limit, convert_to_number(value)) "gasUsed" -> Map.put(acc, :gas_used, convert_to_number(value)) "timestamp" -> Map.put(acc, :timestamp, convert_to_number(value)) - _ -> Map.put(acc, String.to_atom(key), value) + "difficulty" -> Map.put(acc, :difficulty, convert_to_number(value)) + "totalDifficulty" -> Map.put(acc, :total_difficulty, convert_to_number(value)) + "transactions" -> + Map.put(acc, String.to_atom(key), Enum.map(value, fn(transaction) -> + convert_transaction_details(transaction) + end)) + _ -> Map.put(acc, String.to_atom(key), value) end end) end diff --git a/mix.exs b/mix.exs index bf17415..b1d9d4b 100644 --- a/mix.exs +++ b/mix.exs @@ -16,7 +16,7 @@ defmodule Eth.Mixfile do # Run "mix help compile.app" to learn about applications. def application do [ - extra_applications: [:logger] + extra_applications: [:logger, :ethereumex] ] end @@ -24,10 +24,10 @@ defmodule Eth.Mixfile do defp deps do [ {:libsecp256k1, [github: "mbrix/libsecp256k1", manager: :rebar]}, - {:keccakf1600, git: "https://github.com/jur0/erlang-keccakf1600", branch: "original-keccak"}, + {:keccakf1600, "~> 2.0", hex: :keccakf1600_orig}, {:ex_rlp, "~> 0.2.1"}, {:hexate, "~> 0.6.1"}, - {:ethereumex, "~> 0.1.0"}, + {:ethereumex, "~> 0.1.1"}, {:poison, "~> 3.1"}, {:ex_doc, ">= 0.0.0", only: :dev} ] diff --git a/mix.lock b/mix.lock index 6f741a2..2246685 100644 --- a/mix.lock +++ b/mix.lock @@ -1,6 +1,6 @@ %{"certifi": {:hex, :certifi, "1.2.1", "c3904f192bd5284e5b13f20db3ceac9626e14eeacfbb492e19583cf0e37b22be", [:rebar3], []}, "earmark": {:hex, :earmark, "1.2.3", "206eb2e2ac1a794aa5256f3982de7a76bf4579ff91cb28d0e17ea2c9491e46a4", [:mix], []}, - "ethereumex": {:hex, :ethereumex, "0.1.0", "05764dfdfcc3c98a0cd2c5452f8bd086f77187df5994d07ebbb761a189f1afc8", [:mix], [{:httpoison, "~> 0.11.1", [hex: :httpoison, optional: false]}, {:poison, "~> 3.1.0", [hex: :poison, optional: false]}]}, + "ethereumex": {:hex, :ethereumex, "0.1.1", "9b308ab4d5f13e784165f977c1117ee3ac8964f5897f67bc7356959569ba9a8b", [:mix], [{:httpoison, "~> 0.11.1", [hex: :httpoison, optional: false]}, {:poison, "~> 3.1.0", [hex: :poison, optional: false]}]}, "ex_doc": {:hex, :ex_doc, "0.16.3", "cd2a4cfe5d26e37502d3ec776702c72efa1adfa24ed9ce723bb565f4c30bd31a", [:mix], [{:earmark, "~> 1.1", [hex: :earmark, optional: false]}]}, "ex_rlp": {:hex, :ex_rlp, "0.2.1", "bd320900d6316cdfe01d365d4bda22eb2f39b359798daeeffd3bd1ca7ba958ec", [:mix], []}, "hackney": {:hex, :hackney, "1.8.6", "21a725db3569b3fb11a6af17d5c5f654052ce9624219f1317e8639183de4a423", [:rebar3], [{:certifi, "1.2.1", [hex: :certifi, optional: false]}, {:idna, "5.0.2", [hex: :idna, optional: false]}, {:metrics, "1.0.1", [hex: :metrics, optional: false]}, {:mimerl, "1.0.2", [hex: :mimerl, optional: false]}, {:ssl_verify_fun, "1.1.1", [hex: :ssl_verify_fun, optional: false]}]}, @@ -8,7 +8,7 @@ "hexate": {:hex, :hexate, "0.6.1", "1cea42e462c1daa32223127d4752e71016c3d933d492b9bb7fa4709a4a0fd50d", [:mix], []}, "httpoison": {:hex, :httpoison, "0.11.2", "9e59f17a473ef6948f63c51db07320477bad8ba88cf1df60a3eee01150306665", [:mix], [{:hackney, "~> 1.8.0", [hex: :hackney, optional: false]}]}, "idna": {:hex, :idna, "5.0.2", "ac203208ada855d95dc591a764b6e87259cb0e2a364218f215ad662daa8cd6b4", [:rebar3], [{:unicode_util_compat, "0.2.0", [hex: :unicode_util_compat, optional: false]}]}, - "keccakf1600": {:git, "https://github.com/jur0/erlang-keccakf1600", "a87d31d32250091262e0da5ee2c2a4535bc50945", [branch: "original-keccak"]}, + "keccakf1600": {:hex, :keccakf1600_orig, "2.0.0", "0a7217ddb3ee8220d449bbf7575ec39d4e967099f220a91e3dfca4dbaef91963", [:rebar3], []}, "libsecp256k1": {:git, "https://github.com/mbrix/libsecp256k1.git", "671be513a6c19db47fbeea0ceefbf61421d196cc", []}, "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], []}, "mimerl": {:hex, :mimerl, "1.0.2", "993f9b0e084083405ed8252b99460c4f0563e41729ab42d9074fd5e52439be88", [:rebar3], []},