Packages
abi
0.1.2
1.3.0
1.2.0
1.1.0
1.0.0-bravo6
1.0.0-bravo4
1.0.0-bravo3
1.0.0-bravo2
1.0.0-bravo1
1.0.0-alpha9
1.0.0-alpha8
1.0.0-alpha7
1.0.0-alpha6
1.0.0-alpha5
1.0.0-alpha4
1.0.0-alpha3
1.0.0-alpha2
1.0.0-alpha1
0.1.21
0.1.21-alpha2
0.1.21-alpha1
0.1.20
0.1.19
0.1.18
0.1.17
0.1.16
0.1.15
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Ethereum's ABI Interface
Current section
Files
Jump to
Current section
Files
README.md
# ABIThe [Application Binary Interface](https://solidity.readthedocs.io/en/develop/abi-spec.html) (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.## InstallationIf [available in Hex](https://hex.pm/docs/publish), the package can be installedby adding `abi` to your list of dependencies in `mix.exs`:```elixirdef deps do [ {:abi, "~> 0.1.1"} ]end```Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)and published on [HexDocs](https://hexdocs.pm). Once published, the docs canbe found at [https://hexdocs.pm/abi](https://hexdocs.pm/abi).## Usage### EncodingTo encode a function call, pass the ABI spec and the data to pass in to `ABI.encode/1`.```elixiriex> 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.```elixir# 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.### DecodingDecode is generally the opposite of encoding, though we generally leave off the function signature from the start of the data. E.g. from above:```elixiriex> ABI.decode("baz(uint,address)", "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000001" |> Base.decode16!(case: :lower))[50, <<1::160>> |> :binary.decode_unsigned]```## SupportCurrently supports: * [X] `uint<M>` * [X] `int<M>` * [X] `address` * [X] `uint` * [X] `bool` * [ ] `fixed<M>x<N>` * [ ] `ufixed<M>x<N>` * [ ] `fixed` * [ ] `bytes<M>` * [ ] `function` * [X] `<type>[M]` * [X] `bytes` * [X] `string` * [X] `<type>[]` * [X] `(T1,T2,...,Tn)` (* currently ABI parsing doesn't parse tuples with multiple elements)# Docs* [Solidity ABI](https://solidity.readthedocs.io/en/develop/abi-spec.html)* [Solidity Docs](https://solidity.readthedocs.io/)* [Solidity Grammar](https://github.com/ethereum/solidity/blob/develop/docs/grammar.txt)* [Exthereum Blockchain](https://github.com/exthereum/blockchain)