Skip to content

Commit

Permalink
transaction tests are complete
Browse files Browse the repository at this point in the history
  • Loading branch information
izelnakri committed Jan 25, 2018
1 parent cd0222b commit 2a563f6
Show file tree
Hide file tree
Showing 6 changed files with 481 additions and 141 deletions.
8 changes: 8 additions & 0 deletions lib/eth.ex
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,14 @@ defmodule ETH do
defdelegate send_transaction(sender_wallet, receiver_wallet, value_or_params, private_key),
to: ETH.Transaction

defdelegate send_transaction!(params_or_wallet, private_key_or_params), to: ETH.Transaction

defdelegate send_transaction!(sender_wallet, receiver_wallet, value_or_params),
to: ETH.Transaction

defdelegate send_transaction!(sender_wallet, receiver_wallet, value_or_params, private_key),
to: ETH.Transaction

defdelegate send(signature), to: ETH.Transaction
defdelegate send!(signature), to: ETH.Transaction
defdelegate get_senders_public_key(transaction_input), to: ETH.Transaction
Expand Down
195 changes: 121 additions & 74 deletions lib/eth/transaction.ex
Original file line number Diff line number Diff line change
Expand Up @@ -16,55 +16,130 @@ defmodule ETH.Transaction do
defdelegate decode(rlp_encoded_transaction), to: ETH.Transaction.Signer
defdelegate encode(signed_transaction_list), to: ETH.Transaction.Signer

# NOTE: raise if private_key isnt the one in the params from?
def send_transaction(wallet, params) when is_map(params) do
params
|> Map.merge(%{from: wallet.eth_address})
|> to_transaction(wallet.private_key)
|> send_transaction(wallet.private_key)
end

# NOTE: check params.from
def send_transaction(params, private_key) when is_list(params) do
params
|> to_transaction(private_key)
end

def send_transaction(params, private_key) when is_map(params) do
params
|> to_transaction(private_key)
def send_transaction(params, private_key) do
set_default_from(params, private_key)
|> build
|> sign_transaction(private_key)
|> Base.encode16()
|> send
end

def send_transaction(sender_wallet, receiver_wallet, value) when is_number(value) do
%{from: sender_wallet.eth_address, to: receiver_wallet.eth_address, value: value}
|> to_transaction(sender_wallet.private_key)
|> send_transaction(sender_wallet.private_key)
end

def send_transaction(sender_wallet, receiver_wallet, params) when is_map(params) do
params
|> Map.merge(%{from: sender_wallet.eth_address, to: receiver_wallet.eth_address})
|> to_transaction(sender_wallet.private_key)
|> send_transaction(sender_wallet.private_key)
end

def send_transaction(sender_wallet, receiver_wallet, params) when is_list(params) do
params
|> Keyword.merge(from: sender_wallet.eth_address, to: receiver_wallet.eth_address)
|> to_transaction(sender_wallet.private_key)
|> send_transaction(sender_wallet.private_key)
end

def send_transaction(sender_wallet, receiver_wallet, value, private_key) when is_number(value) do
%{from: sender_wallet.eth_address, to: receiver_wallet.eth_address, value: value}
|> to_transaction(private_key)
|> send_transaction(private_key)
end

def send_transaction(sender_wallet, receiver_wallet, params, private_key) when is_map(params) do
params
|> Map.merge(%{from: sender_wallet.eth_address, to: receiver_wallet.eth_address})
|> to_transaction(private_key)
|> send_transaction(private_key)
end

def send_transaction(sender_wallet, receiver_wallet, params, private_key) when is_list(params) do
params
|> Keyword.merge(from: sender_wallet.eth_address, to: receiver_wallet.eth_address)
|> to_transaction(private_key)
|> send_transaction(private_key)
end

def send_transaction!(wallet, params) when is_map(params) do
{:ok, tx_hash} =
params
|> Map.merge(%{from: wallet.eth_address})
|> send_transaction(wallet.private_key)

tx_hash
end

def send_transaction!(params, private_key) when is_list(params) do
{:ok, tx_hash} =
params
|> send_transaction(private_key)

tx_hash
end

def send_transaction!(params, private_key) when is_map(params) do
{:ok, tx_hash} =
params
|> send_transaction(private_key)

tx_hash
end

def send_transaction!(sender_wallet, receiver_wallet, value) when is_number(value) do
{:ok, tx_hash} =
%{from: sender_wallet.eth_address, to: receiver_wallet.eth_address, value: value}
|> send_transaction(sender_wallet.private_key)

tx_hash
end

def send_transaction!(sender_wallet, receiver_wallet, params) when is_map(params) do
{:ok, tx_hash} =
params
|> Map.merge(%{from: sender_wallet.eth_address, to: receiver_wallet.eth_address})
|> send_transaction(sender_wallet.private_key)

tx_hash
end

def send_transaction!(sender_wallet, receiver_wallet, params) when is_list(params) do
{:ok, tx_hash} =
params
|> Keyword.merge(from: sender_wallet.eth_address, to: receiver_wallet.eth_address)
|> send_transaction(sender_wallet.private_key)

tx_hash
end

def send_transaction!(sender_wallet, receiver_wallet, value, private_key) when is_number(value) do
{:ok, tx_hash} =
%{from: sender_wallet.eth_address, to: receiver_wallet.eth_address, value: value}
|> send_transaction(private_key)

tx_hash
end

def send_transaction!(sender_wallet, receiver_wallet, params, private_key) when is_map(params) do
{:ok, tx_hash} =
params
|> Map.merge(%{from: sender_wallet.eth_address, to: receiver_wallet.eth_address})
|> send_transaction(private_key)

tx_hash
end

def send_transaction!(sender_wallet, receiver_wallet, params, private_key) when is_list(params) do
{:ok, tx_hash} =
params
|> Keyword.merge(from: sender_wallet.eth_address, to: receiver_wallet.eth_address)
|> send_transaction(private_key)

tx_hash
end

def send(signature), do: HttpClient.eth_send_raw_transaction(signature)
Expand All @@ -74,18 +149,10 @@ defmodule ETH.Transaction do
transaction_hash
end

# NOTE: not tested
def get_senders_public_key("0x" <> rlp_encoded_transaction_list) do
rlp_encoded_transaction_list
|> Base.decode16!(case: :mixed)
|> to_senders_public_key
end

def get_senders_public_key(<<encoded_tx>>) do
encoded_tx
|> Base.decode16!(case: :mixed)
|> ExRLP.decode()
|> to_senders_public_key
|> get_senders_public_key
end

def get_senders_public_key(
Expand All @@ -96,27 +163,36 @@ defmodule ETH.Transaction do
_to,
_value,
_data,
_v,
_r,
_s
v,
r,
s
]
),
do: to_senders_public_key(transaction_list)
) do
message_hash = hash_transaction(transaction_list, false)
chain_id = get_chain_id(v, Enum.at(transaction_list, 9))
v_int = buffer_to_int(v)
target_v = if chain_id > 0, do: v_int - (chain_id * 2 + 8), else: v_int

# NOTE: not tested
def get_sender_address("0x" <> rlp_encoded_transaction_list) do
rlp_encoded_transaction_list
signature = r <> s
recovery_id = target_v - 27

{:ok, public_key} =
:libsecp256k1.ecdsa_recover_compact(message_hash, signature, :uncompressed, recovery_id)

public_key
end

def get_senders_public_key(decoded_tx_binary) do
decoded_tx_binary
|> ExRLP.decode()
|> get_senders_public_key
|> get_address
end

def get_sender_address(<<encoded_tx>>) do
encoded_tx
def get_sender_address("0x" <> rlp_encoded_transaction_list) do
rlp_encoded_transaction_list
|> Base.decode16!(case: :mixed)
|> ExRLP.decode()
|> to_senders_public_key
|> get_address
|> get_sender_address()
end

def get_sender_address(
Expand All @@ -131,44 +207,15 @@ defmodule ETH.Transaction do
_r,
_s
]
),
do: get_senders_public_key(transaction_list) |> get_address

defp to_senders_public_key(
transaction_list = [
_nonce,
_gas_price,
_gas_limit,
_to,
_value,
_data,
v,
r,
s
]
) do
message_hash = hash_transaction(transaction_list, false)
chain_id = get_chain_id(v, Enum.at(transaction_list, 9))
v_int = buffer_to_int(v)
target_v = if chain_id > 0, do: v_int - (chain_id * 2 + 8), else: v_int

signature = r <> s
recovery_id = target_v - 27

{:ok, public_key} =
:libsecp256k1.ecdsa_recover_compact(message_hash, signature, :uncompressed, recovery_id)

public_key
) do
get_senders_public_key(transaction_list)
|> get_address
end

defp to_transaction(params, private_key) do
target_params = set_default_from(params, private_key)

target_params
|> build
|> sign_transaction(private_key)
|> Base.encode16()
|> send
def get_sender_address(decoded_tx_binary) do
decoded_tx_binary
|> get_senders_public_key()
|> get_address
end

defp set_default_from(params, private_key) when is_list(params) do
Expand Down
3 changes: 1 addition & 2 deletions lib/eth/transaction_queries.ex
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,7 @@ defmodule ETH.TransactionQueries do
end

def get_block_transaction_count!(block_hash) do
{:ok, transaction_count} =
HttpClient.eth_get_block_transaction_count_by_hash_transaction(block_hash)
{:ok, transaction_count} = HttpClient.eth_get_block_transaction_count_by_hash(block_hash)

transaction_count
end
Expand Down
2 changes: 1 addition & 1 deletion mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ defmodule Eth.Mixfile do
def project do
[
app: :eth,
version: "0.3.4",
version: "0.3.5",
elixir: "~> 1.6",
start_permanent: Mix.env() == :prod,
deps: deps(),
Expand Down
3 changes: 3 additions & 0 deletions test/eth/eth_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@ defmodule ETH.Test do
send_transaction: 2,
send_transaction: 3,
send_transaction: 4,
send_transaction!: 2,
send_transaction!: 3,
send_transaction!: 4,
sign_transaction: 2,
syncing: 0,
syncing!: 0,
Expand Down
Loading

0 comments on commit 2a563f6

Please # to comment.