README.md

# Fast EIP-55

Encode and validate Ethereum addresses fast!

FastEIP55 is a derivative work of unnawut's [EIP-55](https://github.com/unnawut/eip_55) elixir implementation of the [spec](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-55.md).

The original version uses a pure elixir version. This version makes 2 substantial changes.

* replaces pure slow elixir keccak version with the much faster rust-powered one [Ex_Keccak](https://github.com/tzumby/ex_keccak)
* replaces easy-to-read logic, with harder-to-read optimized logic

I've kept the library interface the same, and have kept the original tests. I'm taking some liberty with the `to_upper` logic and might tweak things a bit if I uncover issues. I've also have some additional performance tweaks that I'd like to experiment with. Many thanks to unnawut for the original implemenation and tests!

## Installation

The package can be installed by adding `:fast_eip_55` to your list of dependencies in `mix.exs`:

```elixir
defp deps do
  [
    {:fast_eip_55, "~> 0.1"}
  ]
end
```

## Usage

Encoding:

```elixir
iex> alias FastEIP55, as: EIP55
iex> EIP55.encode("0x5aaeb6053f3e94c9b9a09f33669435e7ef1beaed")
{:ok, "0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed"}

iex> EIP55.encode(<<90, 174, 182, 5, 63, 62, 148, 201, 185, 160,
...> 159, 51, 102, 148, 53, 231, 239, 27, 234, 237>>)
{:ok, "0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed"}
```

Validation:

```elixir
iex> alias FastEIP55, as: EIP55
iex> EIP55.valid?("0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed")
true

iex> EIP55.valid?("0x5AAEB6053f3e94c9b9a09f33669435e7ef1beaed")
false
```

Full documentation can be found at [https://hexdocs.pm/fast_eip_55](https://hexdocs.pm/fast_eip_55).

## Performance

```
Benchmarking :eip55...
Benchmarking :fast_eip55...

Name                  ips        average  deviation         median         99th %
:fast_eip55      346.97 K        2.88 μs   ±641.72%        2.99 μs        4.99 μs
:eip55             2.79 K      357.92 μs     ±7.01%      352.99 μs      448.99 μs

Comparison:
:fast_eip55      346.97 K
:eip55             2.79 K - 124.19x slower +355.04 μs

```

## License

FastEIP-55 is released under the MIT License. See [LICENSE](./LICENSE) for further details.