Skip to content
The Ethereum ABI Interface
Elixir Erlang
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.circleci
config
lib Remove Reliance on ExthCrypto Apr 11, 2019
priv
src
test
.credo.exs
.formatter.exs
.gitignore
CHANGELOG.md
LICENSE.md
README.md
mix.exs
mix.lock

README.md

ABI CircleCI

The Application Binary Interface (ABI) of Solidity describes how to transform binary data to types which the Solidity programming language understands. For instance, if we want to call a function bark(uint32,bool) on a Solidity-created contract contract Dog, what data parameter do we pass into our Ethereum transaction? This project allows us to encode such function calls.

Installation

If available in Hex, the package can be installed by adding abi to your list of dependencies in mix.exs:

def deps do
  [
    {:abi, "~> 0.1.13"}
  ]
end

Documentation can be generated with ExDoc and published on HexDocs. Once published, the docs can be found at https://hexdocs.pm/abi.

Usage

Encoding

To encode a function call, pass the ABI spec and the data to pass in to ABI.encode/1.

iex> ABI.encode("baz(uint,address)", [50, <<1::160>> |> :binary.decode_unsigned])
<<162, 145, 173, 214, 0, 0, 0, 0, 0, 0, 0, 0, ...>

Then, you can construct an Ethereum transaction with that data, e.g.

# Blockchain comes from `Exthereum.Blockchain`, see below.
iex> %Blockchain.Transaction{
...> # ...
...> data: <<162, 145, 173, 214, 0, 0, 0, 0, 0, 0, 0, 0, ...>
...> }

That transaction can then be sent via JSON-RPC or DevP2P to execute the given function.

Decoding

Decode is generally the opposite of encoding, though we generally leave off the function signature from the start of the data. E.g. from above:

iex> ABI.decode("baz(uint,address)", "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000001" |> Base.decode16!(case: :lower))
[50, <<1::160>> |> :binary.decode_unsigned]

Support

Currently supports:

  • uint<M>
  • int<M>
  • address
  • uint
  • bool
  • fixed<M>x<N>
  • ufixed<M>x<N>
  • fixed
  • bytes<M>
  • function
  • <type>[M]
  • bytes
  • string
  • <type>[]
  • (T1,T2,...,Tn) (* currently ABI parsing doesn't parse tuples with multiple elements)

Docs

Collaboration

This ABI library is licensed under the MIT license. Feel free to submit issues, pull requests or fork the code as you wish.

You can’t perform that action at this time.