From 22f33a21da255d502bd593f40c60abf05164b743 Mon Sep 17 00:00:00 2001 From: hswick Date: Wed, 26 Sep 2018 17:45:09 -0500 Subject: [PATCH] Can specify topic params with map now --- lib/exw3.ex | 16 ++++++++++--- test/exw3_test.exs | 56 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 3 deletions(-) diff --git a/lib/exw3.ex b/lib/exw3.ex index 25d7897..90ccbb9 100644 --- a/lib/exw3.ex +++ b/lib/exw3.ex @@ -730,8 +730,17 @@ defmodule ExW3 do # Calls - defp filter_topics_helper(event_signature, event_data, topic_types) do - topics = event_data[:topics] + defp filter_topics_helper(event_signature, event_data, topic_types, topic_names) do + + topics = + if is_map(event_data[:topics]) do + Enum.map(topic_names, fn name -> + event_data[:topics][String.to_atom(name)] + end) + else + event_data[:topics] + end + if topics do formatted_topics = Enum.map(0..length(topics) - 1, fn i -> @@ -801,8 +810,9 @@ defmodule ExW3 do event_signature = contract_info[:event_names][event_name] topic_types = contract_info[:events][event_signature][:topic_types] + topic_names = contract_info[:events][event_signature][:topic_names] - topics = filter_topics_helper(event_signature, event_data, topic_types) + topics = filter_topics_helper(event_signature, event_data, topic_types, topic_names) payload = Map.merge( %{address: contract_info[:address], topics: topics}, diff --git a/test/exw3_test.exs b/test/exw3_test.exs index 3782d46..f010ec8 100644 --- a/test/exw3_test.exs +++ b/test/exw3_test.exs @@ -294,6 +294,62 @@ defmodule EXW3Test do raise "Never received event" end + state = Agent.get(agent, fn list -> list end) + event_log = Enum.at(state, 0) + assert event_log |> is_map + log_data = Map.get(event_log, "data") + assert log_data |> is_map + assert Map.get(log_data, "num") == 46 + assert ExW3.bytes_to_string(Map.get(log_data, "data")) == "Hello, World!" + assert Map.get(log_data, "otherNum") == 42 + ExW3.uninstall_filter(indexed_filter_id) + end + + test "starts a EventTester", context do + ExW3.Contract.register(:EventTester, abi: context[:event_tester_abi]) + + {:ok, address, _} = + ExW3.Contract.deploy( + :EventTester, + bin: ExW3.load_bin("test/examples/build/EventTester.bin"), + options: %{ + gas: 300_000, + from: Enum.at(context[:accounts], 0) + } + ) + + ExW3.Contract.at(:EventTester, address) + + # Test Indexing Indexed Events with Map params + + ExW3.EventListener.start_link() + + {:ok, agent} = Agent.start_link(fn -> [] end) + + indexed_filter_id = ExW3.Contract.filter( + :EventTester, + "SimpleIndex", + self(), + %{ + topics: %{num: 46, data: "Hello, World!"}, + } + ) + + {:ok, _tx_hash} = + ExW3.Contract.send( + :EventTester, + :simpleIndex, + ["Hello, World!"], + %{from: Enum.at(context[:accounts], 0), gas: 30_000} + ) + + receive do + {:event, {_filter_id, data}} -> + Agent.update(agent, fn list -> [data | list] end) + after 3_000 -> + raise "Never received event" + end + state = Agent.get(agent, fn list -> list end) event_log = Enum.at(state, 0) assert event_log |> is_map