diff --git a/lib/exw3.ex b/lib/exw3.ex index e869d1b..ff9c522 100644 --- a/lib/exw3.ex +++ b/lib/exw3.ex @@ -1,5 +1,59 @@ defmodule ExW3 do + Module.register_attribute __MODULE__, :unit_map, persist: true, accumulate: false + + @unit_map %{ + :noether => 0, + :wei => 1, + :kwei => 1_000, + :Kwei => 1_000, + :babbage => 1_000, + :femtoether => 1_000, + :mwei => 1_000_000, + :Mwei => 1_000_000, + :lovelace => 1_000_000, + :picoether => 1_000_000, + :gwei => 1_000_000_000, + :Gwei => 1_000_000_000, + :shannon => 1_000_000_000, + :nanoether => 1_000_000_000, + :nano => 1_000_000_000, + :szabo => 1_000_000_000_000, + :microether => 1_000_000_000_000, + :micro => 1_000_000_000_000, + :finney => 1_000_000_000_000_000, + :milliether => 1_000_000_000_000_000, + :milli => 1_000_000_000_000_000, + :ether => 1_000_000_000_000_000_000, + :kether => 1_000_000_000_000_000_000_000, + :grand => 1_000_000_000_000_000_000_000, + :mether => 1_000_000_000_000_000_000_000_000, + :gether => 1_000_000_000_000_000_000_000_000_000, + :tether => 1_000_000_000_000_000_000_000_000_000_000 + } + + @spec get_unit_map() :: %{} + @doc "Returns the map used for ether unit conversion" + def get_unit_map do + @unit_map + end + + def to_wei(num, key) do + if @unit_map[key] do + num * @unit_map[key] + else + throw "#{key} not valid unit" + end + end + + def from_wei(num, key) do + if @unit_map[key] do + num / @unit_map[key] + else + throw "#{key} not valid unit" + end + end + @spec keccak256(binary()) :: binary() @doc "Returns a 0x prepended 32 byte hash of the input string" def keccak256(string) do diff --git a/test/exw3_test.exs b/test/exw3_test.exs index 1196878..33d9d18 100644 --- a/test/exw3_test.exs +++ b/test/exw3_test.exs @@ -181,7 +181,7 @@ defmodule EXW3Test do receive do {:event, {_filter_id, data}} -> - Agent.update(agent, fn list -> [data | list] end) + Agent.update(agent, fn list -> [data | list] end) after 3_000 -> raise "Never received event" end @@ -341,4 +341,57 @@ defmodule EXW3Test do end + test "unit conversion to_wei" do + + assert ExW3.to_wei(1, :wei) == 1 + assert ExW3.to_wei(1, :kwei) == 1_000 + assert ExW3.to_wei(1, :Kwei) == 1_000 + assert ExW3.to_wei(1, :babbage) == 1_000 + assert ExW3.to_wei(1, :mwei) == 1_000_000 + assert ExW3.to_wei(1, :Mwei) == 1_000_000 + assert ExW3.to_wei(1, :lovelace) == 1_000_000 + assert ExW3.to_wei(1, :gwei) == 1_000_000_000 + assert ExW3.to_wei(1, :Gwei) == 1_000_000_000 + assert ExW3.to_wei(1, :shannon) == 1_000_000_000 + assert ExW3.to_wei(1, :szabo) == 1_000_000_000_000 + assert ExW3.to_wei(1, :finney) == 1_000_000_000_000_000 + assert ExW3.to_wei(1, :ether) == 1_000_000_000_000_000_000 + assert ExW3.to_wei(1, :kether) == 1_000_000_000_000_000_000_000 + assert ExW3.to_wei(1, :grand) == 1_000_000_000_000_000_000_000 + assert ExW3.to_wei(1, :mether) == 1_000_000_000_000_000_000_000_000 + assert ExW3.to_wei(1, :gether) == 1_000_000_000_000_000_000_000_000_000 + assert ExW3.to_wei(1, :tether) == 1_000_000_000_000_000_000_000_000_000_000 + + assert ExW3.to_wei(1, :kwei) == ExW3.to_wei(1, :femtoether) + assert ExW3.to_wei(1, :szabo) == ExW3.to_wei(1, :microether) + assert ExW3.to_wei(1, :finney) == ExW3.to_wei(1, :milliether) + assert ExW3.to_wei(1, :milli) == ExW3.to_wei(1, :milliether) + assert ExW3.to_wei(1, :milli) == ExW3.to_wei(1000, :micro) + + {:ok, agent} = Agent.start_link(fn -> false end) + + try do + ExW3.to_wei(1, :wei1) + catch + _ -> Agent.update(agent, fn _ -> true end) + end + + assert Agent.get(agent, fn state -> state end) + end + + test "unit conversion from wei" do + assert ExW3.from_wei(1_000_000_000_000_000_000, :wei) == 1_000_000_000_000_000_000 + assert ExW3.from_wei(1_000_000_000_000_000_000, :kwei) == 1_000_000_000_000_000 + assert ExW3.from_wei(1_000_000_000_000_000_000, :mwei) == 1_000_000_000_000 + assert ExW3.from_wei(1_000_000_000_000_000_000, :gwei) == 1_000_000_000 + assert ExW3.from_wei(1_000_000_000_000_000_000, :szabo) == 1_000_000 + assert ExW3.from_wei(1_000_000_000_000_000_000, :finney) == 1_000 + assert ExW3.from_wei(1_000_000_000_000_000_000, :ether) == 1 + assert ExW3.from_wei(1_000_000_000_000_000_000, :kether) == 0.001 + assert ExW3.from_wei(1_000_000_000_000_000_000, :grand) == 0.001 + assert ExW3.from_wei(1_000_000_000_000_000_000, :mether) == 0.000001 + assert ExW3.from_wei(1_000_000_000_000_000_000, :gether) == 0.000000001 + assert ExW3.from_wei(1_000_000_000_000_000_000, :tether) == 0.000000000001 + end + end