4
0
Fork 0

Deploying and using a contract

contracts
hswick 7 years ago
parent d23139c181
commit c2b6468828
  1. 53
      lib/exw3.ex
  2. 38
      test/exw3_test.exs

@ -1,20 +1,47 @@
defmodule EXW3 do
@moduledoc """
Documentation for EXW3.
"""
defmodule Contract do
use Agent
def at(abi, address) do
{ _, pid } = Agent.start_link(fn -> %{abi: abi, address: address} end)
pid
end
def get(contract, key) do
Agent.get(contract, &Map.get(&1, key))
end
@doc """
Puts the `value` for the given `key` in the `contract`.
"""
def put(contract, key, value) do
Agent.update(contract, &Map.put(&1, key, value))
end
def deploy(bin_filename, options) do
{_, bin} = File.read(Path.join(System.cwd(), bin_filename))
tx = %{
from: options[:from],
data: bin,
gas: options[:gas]
}
{_, tx_receipt_id} = Ethereumex.HttpClient.eth_send_transaction(tx)
{_, tx_receipt} = Ethereumex.HttpClient.eth_get_transaction_receipt(tx_receipt_id)
@doc """
Hello world.
tx_receipt["contractAddress"]
end
## Examples
def method(contract_agent, name) do
tx = %{
to: get(contract_agent, :address),
data: EXW3.encode(get(contract_agent, :abi), name, [])
}
iex> EXW3.hello
:world
{_, result } = Ethereumex.HttpClient.eth_call(tx)
result
end
"""
def hello do
:world
end
def accounts do
@ -39,6 +66,6 @@ defmodule EXW3 do
def encode abi, name, args do
inputs = Enum.map abi[name]["inputs"], fn x -> x["type"] end
fn_signature = Enum.join [name, "(", Enum.join(inputs, ","), ")"]
ABI.encode(fn_signature, args)
ABI.encode(fn_signature, args) |> :binary.decode_unsigned
end
end
end

@ -3,44 +3,28 @@ defmodule EXW3Test do
doctest EXW3
setup_all do
simple_storage_abi = EXW3.load_abi("test/examples/build/SimpleStorage.abi")
%{simple_storage_abi: simple_storage_abi}
%{
simple_storage_abi: EXW3.load_abi("test/examples/build/SimpleStorage.abi"),
accounts: EXW3.accounts
}
end
test "loads abi", context do
assert is_map context[:simple_storage_abi]
assert context[:simple_storage_abi] |> is_map
end
test "encodes value and sends it", context do
tx = %{
data: EXW3.encode(context[:simple_storage_abi], "get", [])
}
tx
|> Kernel.inspect
|> IO.puts
end
test "deploys contract and uses it", context do
contract_address = EXW3.Contract.deploy("test/examples/build/SimpleStorage.bin", %{from: Enum.at(context[:accounts], 0), gas: 150000})
test "the truth" do
assert 1 + 1 == 2
end
contract_agent = EXW3.Contract.at context[:simple_storage_abi], contract_address
test "greets the world" do
assert EXW3.hello() == :world
EXW3.Contract.method(contract_agent, "get")
|> Kernel.inspect
|> IO.puts
end
test "gets accounts" do
assert EXW3.accounts |> is_list
end
# test "testing simple storage" do
# SimpleStorageTester.test_simple_storage "test/examples/build/SimpleStorage.abi"
# end
# test "get value" do
# abi = EXW3.load_abi "test/examples/build/SimpleStorage.abi"
# |> Kernel.inspect
# |> IO.puts
# end
end
Loading…
Cancel
Save