4
0
Fork 0
Fork of the exw3 library. With our own additions
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
Harley Swick 975c0f3279
Merge pull request #2 from hswick/contracts
7 years ago
config Initial commit 7 years ago
doc Bumped version 7 years ago
lib Set version to 0.1.0, and got rid of dependencies 7 years ago
test Changed Contract module to GenServer, new tests, + a few more methods 7 years ago
.gitignore Added travis build 7 years ago
.travis.yml Try elixir version with no dev 7 years ago
README.md Bumped version 7 years ago
exw3_logo.jpg Added image to README 7 years ago
mix.exs Set version to 0.1.0, and got rid of dependencies 7 years ago
mix.lock Added image to README 7 years ago
travis_test.sh Added travis build 7 years ago

README.md

Installation

  1. Add exw3 to your list of dependencies in mix.exs:

    def deps do [{:exw3, "~> 0.0.2"}] end

  2. Ensure exw3 is started before your application:

    def application do [applications: [:exw3]] end

Overview

ExW3 is a wrapper around ethereumex to provide a high level, and user friendly json rpc api. It currently only supports Http.

Usage

Ensure you have an ethereum node to connect to at the specified url in your config. Any easy local testnet to use is ganache-cli:

ganache-cli

Make sure your config includes:

config :ethereumex,
  url: "http://localhost:8545"

Currently ExW3 supports a handful of json rpc commands. Mostly just the useful ones. If it doesn't support those specific commands you can always use the Ethereumex commands.

iex(1)> accounts = ExW3.accounts()                                        
["0x957e3d06f15d6fc3913a24c5c41009784a4ec683",
 "0xa9a5037dc1cba71609792e3309b57e777ae01c0f",
 "0x4944392f44d60f2f949ba241244401bd43863c1c",
 "0xc0fe85ae40d6dd480ccbf31902bdb6b90057c908",
 "0xc06f7379abb368c54059c78f9ef524d8badcb7da",
 "0x0de579fe6dcd60620e10e1ce447dfb6077306e68",
 "0x8895d7195659cbcb442825b62bb028176ab126f6",
 "0x205b8d4b9b52e9653d9ea29815bfa2ccf9f11b71",
 "0xefe82d7b1e7bed2e3bfe7b5a155cff7a5adf0dcc",
 "0x93d1f6303711e5c9fa849cfad38d5782740d39fe"]
iex(2)> ExW3.balance(Enum.at(accounts, 0))                                      
100000000000000000000
iex(3)> ExW3.block_number()            
0
iex(4)> simple_storage_abi = ExW3.load_abi("test/examples/build/SimpleStorage.abi")
%{
  "get" => %{
    "constant" => true,
    "inputs" => [],
    "name" => "get",
    "outputs" => [%{"name" => "", "type" => "uint256"}],
    "payable" => false,
    "stateMutability" => "view",
    "type" => "function"
  },
  "set" => %{
    "constant" => false,
    "inputs" => [%{"name" => "_data", "type" => "uint256"}],
    "name" => "set",
    "outputs" => [],
    "payable" => false,
    "stateMutability" => "nonpayable",
    "type" => "function"
  }
}
iex(5)> contract_address = ExW3.Contract.deploy("test/examples/build/SimpleStorage.bin", %{from: Enum.at(accounts, 0), gas: 150000})
"0xecac9f4000ae355c7d33481edb0fddbece502423"
iex(6)> storage_pid = ExW3.Contract.at(simple_storage_abi, contract_address) 
#PID<0.257.0>
iex(7)> ExW3.Contract.method(storage_pid, "get")
{:ok, 0}
iex(8)> ExW3.Contract.method(storage_pid, "set", [1], %{from: Enum.at(accounts, 0)})
{:ok, "0xb8a6ee58c88efcea775452a68fac20e47bda6ca933aa25dd85c4a97b0cfbf43f"}
iex(9)> ExW3.Contract.method(storage_pid, "get")                          
{:ok, 1}

For bonus style points you can use snake case keywords for the method names. For example:

ExW3.Contract.method(pid, "fooBar")

is the same as:

ExW3.Contract.method(pid, :foo_bar)

Compiling solidity

Ensure you have solc installed:

solc --version

Then if you've made changes to the example contracts you can compile them like this:

mix solc