Packages

Ethereum library for Gleam - JSON-RPC client, transaction signing, ABI encoding, and wallet management on the BEAM

Current section

Files

Jump to
gleeth src gleeth@commands@send.erl
Raw

src/gleeth@commands@send.erl

-module(gleeth@commands@send).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/gleeth/commands/send.gleam").
-export([execute/2]).
-export_type([send_args/0]).
-type send_args() :: {send_args,
binary(),
binary(),
binary(),
binary(),
binary(),
boolean()}.
-file("src/gleeth/commands/send.gleam", 156).
-spec print_receipt(gleeth@provider:provider(), binary()) -> {ok, nil} |
{error, gleeth@rpc@types:gleeth_error()}.
print_receipt(Provider, Tx_hash) ->
case gleeth@rpc@methods:get_transaction_receipt(Provider, Tx_hash) of
{ok, Receipt} ->
gleam_stdlib:println(<<""/utf8>>),
gleam_stdlib:println(<<"Receipt:"/utf8>>),
gleeth@ethereum@formatting:print_labeled_value(
<<"Status"/utf8>>,
case erlang:element(13, Receipt) of
success ->
<<"Success"/utf8>>;
failed ->
<<"Failed"/utf8>>
end
),
gleeth@ethereum@formatting:print_labeled_value(
<<"Block"/utf8>>,
erlang:element(5, Receipt)
),
gleeth@ethereum@formatting:print_labeled_value(
<<"Gas Used"/utf8>>,
erlang:element(9, Receipt)
),
{ok, nil};
{error, _} ->
gleam_stdlib:println(<<""/utf8>>),
gleam_stdlib:println(
<<"Receipt not yet available. Query with: gleeth transaction "/utf8,
Tx_hash/binary>>
),
{ok, nil}
end.
-file("src/gleeth/commands/send.gleam", 182).
-spec map_tx_error(
{ok, QLY} | {error, gleeth@crypto@transaction:transaction_error()}
) -> {ok, QLY} | {error, gleeth@rpc@types:gleeth_error()}.
map_tx_error(Res) ->
gleam@result:map_error(Res, fun(Field@0) -> {transaction_err, Field@0} end).
-file("src/gleeth/commands/send.gleam", 76).
-spec send_legacy(
gleeth@provider:provider(),
gleeth@crypto@wallet:wallet(),
send_args(),
binary(),
binary(),
integer()
) -> {ok, nil} | {error, gleeth@rpc@types:gleeth_error()}.
send_legacy(Provider, W, Args, Nonce, Gas_limit, Chain_id) ->
gleam@result:'try'(
gleeth@rpc@methods:get_gas_price(Provider),
fun(Gas_price) ->
gleeth@ethereum@formatting:print_labeled_value(
<<"Gas Price"/utf8>>,
Gas_price
),
gleeth@ethereum@formatting:print_labeled_value(
<<"Type"/utf8>>,
<<"Legacy (Type 0)"/utf8>>
),
gleam_stdlib:println(<<""/utf8>>),
gleam@result:'try'(
begin
_pipe = gleeth@crypto@transaction:create_legacy_transaction(
erlang:element(2, Args),
erlang:element(3, Args),
Gas_limit,
Gas_price,
Nonce,
erlang:element(6, Args),
Chain_id
),
map_tx_error(_pipe)
end,
fun(Tx) ->
gleam@result:'try'(
begin
_pipe@1 = gleeth@crypto@transaction:sign_transaction(
Tx,
W
),
map_tx_error(_pipe@1)
end,
fun(Signed) ->
gleam@result:'try'(
gleeth@rpc@methods:send_raw_transaction(
Provider,
erlang:element(12, Signed)
),
fun(Tx_hash) ->
gleam_stdlib:println(
<<"Transaction sent!"/utf8>>
),
gleeth@ethereum@formatting:print_labeled_value(
<<"Hash"/utf8>>,
Tx_hash
),
print_receipt(Provider, Tx_hash)
end
)
end
)
end
)
end
).
-file("src/gleeth/commands/send.gleam", 113).
-spec send_eip1559(
gleeth@provider:provider(),
gleeth@crypto@wallet:wallet(),
send_args(),
binary(),
binary(),
integer()
) -> {ok, nil} | {error, gleeth@rpc@types:gleeth_error()}.
send_eip1559(Provider, W, Args, Nonce, Gas_limit, Chain_id) ->
gleam@result:'try'(
gleeth@rpc@methods:get_gas_price(Provider),
fun(Max_fee) ->
gleam@result:'try'(
gleeth@rpc@methods:get_max_priority_fee(Provider),
fun(Priority_fee) ->
gleeth@ethereum@formatting:print_labeled_value(
<<"Max Fee"/utf8>>,
Max_fee
),
gleeth@ethereum@formatting:print_labeled_value(
<<"Priority Fee"/utf8>>,
Priority_fee
),
gleeth@ethereum@formatting:print_labeled_value(
<<"Type"/utf8>>,
<<"EIP-1559 (Type 2)"/utf8>>
),
gleam_stdlib:println(<<""/utf8>>),
gleam@result:'try'(
begin
_pipe = gleeth@crypto@transaction:create_eip1559_transaction(
erlang:element(2, Args),
erlang:element(3, Args),
Gas_limit,
Max_fee,
Priority_fee,
Nonce,
erlang:element(6, Args),
Chain_id,
[]
),
map_tx_error(_pipe)
end,
fun(Tx) ->
gleam@result:'try'(
begin
_pipe@1 = gleeth@crypto@transaction:sign_eip1559_transaction(
Tx,
W
),
map_tx_error(_pipe@1)
end,
fun(Signed) ->
gleam@result:'try'(
gleeth@rpc@methods:send_raw_transaction(
Provider,
erlang:element(14, Signed)
),
fun(Tx_hash) ->
gleam_stdlib:println(
<<"Transaction sent!"/utf8>>
),
gleeth@ethereum@formatting:print_labeled_value(
<<"Hash"/utf8>>,
Tx_hash
),
print_receipt(Provider, Tx_hash)
end
)
end
)
end
)
end
)
end
).
-file("src/gleeth/commands/send.gleam", 25).
-spec execute(gleeth@provider:provider(), send_args()) -> {ok, nil} |
{error, gleeth@rpc@types:gleeth_error()}.
execute(Provider, Args) ->
gleam@result:'try'(
begin
_pipe = gleeth@crypto@wallet:from_private_key_hex(
erlang:element(4, Args)
),
gleam@result:map_error(
_pipe,
fun(Field@0) -> {wallet_err, Field@0} end
)
end,
fun(W) ->
Sender = gleeth@crypto@wallet:get_address(W),
gleam@result:'try'(case gleeth@provider:chain_id(Provider) of
{some, Id} ->
{ok, {Provider, Id}};
none ->
gleam@result:'try'(
gleeth@rpc@methods:get_chain_id(Provider),
fun(Chain_id_hex) ->
gleam@result:'try'(
begin
_pipe@1 = gleeth@utils@hex:to_int(
Chain_id_hex
),
gleam@result:map_error(
_pipe@1,
fun(_) ->
{parse_error,
<<"Failed to parse chain ID: "/utf8,
Chain_id_hex/binary>>}
end
)
end,
fun(Id@1) ->
{ok,
{gleeth@provider:with_chain_id(
Provider,
Id@1
),
Id@1}}
end
)
end
)
end, fun(_use0) ->
{Provider@1, Chain_id} = _use0,
gleam@result:'try'(
gleeth@rpc@methods:get_transaction_count(
Provider@1,
Sender,
<<"pending"/utf8>>
),
fun(Nonce) ->
Gas_limit = case erlang:element(5, Args) of
<<""/utf8>> ->
<<"0x5208"/utf8>>;
Gl ->
Gl
end,
gleam_stdlib:println(
<<"Sending transaction..."/utf8>>
),
gleeth@ethereum@formatting:print_labeled_value(
<<"From"/utf8>>,
Sender
),
gleeth@ethereum@formatting:print_labeled_value(
<<"To"/utf8>>,
erlang:element(2, Args)
),
gleeth@ethereum@formatting:print_labeled_value(
<<"Value"/utf8>>,
erlang:element(3, Args)
),
gleeth@ethereum@formatting:print_labeled_value(
<<"Nonce"/utf8>>,
Nonce
),
gleeth@ethereum@formatting:print_labeled_value(
<<"Chain ID"/utf8>>,
erlang:integer_to_binary(Chain_id)
),
case erlang:element(7, Args) of
true ->
send_legacy(
Provider@1,
W,
Args,
Nonce,
Gas_limit,
Chain_id
);
false ->
send_eip1559(
Provider@1,
W,
Args,
Nonce,
Gas_limit,
Chain_id
)
end
end
)
end)
end
).