Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| df44118463 | |||
| f9cb72598f | |||
| 66f5795c49 | |||
| d2d9ae613e |
@ -1349,11 +1349,14 @@ do_tic(MS, State = #s{timer = {T, _}}) ->
|
|||||||
T = erlang:send_after(MS, self(), tic),
|
T = erlang:send_after(MS, self(), tic),
|
||||||
State#s{timer = {T, MS}}.
|
State#s{timer = {T, MS}}.
|
||||||
|
|
||||||
|
handle_tic(State = #s{wallet = #wallet{poas = []}, timer = {T, MS}}) ->
|
||||||
|
ok = cancel_timer(T),
|
||||||
|
NewT = erlang:send_after(MS, self(), tic),
|
||||||
|
State#s{timer = {NewT, MS}};
|
||||||
handle_tic(State = #s{wallet = This = #wallet{poas = POAs, endpoint = Node},
|
handle_tic(State = #s{wallet = This = #wallet{poas = POAs, endpoint = Node},
|
||||||
timer = {T, MS},
|
timer = {T, MS},
|
||||||
selected = Selected})
|
selected = Selected})
|
||||||
when Selected > 0 ->
|
when Selected > 0 ->
|
||||||
|
|
||||||
NewState =
|
NewState =
|
||||||
case ensure_hz_set(Node) of
|
case ensure_hz_set(Node) of
|
||||||
{ok, ChainID} ->
|
{ok, ChainID} ->
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
%-behavior(gd_v).
|
%-behavior(gd_v).
|
||||||
-include_lib("wx/include/wx.hrl").
|
-include_lib("wx/include/wx.hrl").
|
||||||
-export([to_front/1]).
|
-export([to_front/1]).
|
||||||
-export([set_manifest/1, open_contract/1, call_result/2, dryrun_result/2, trouble/1]).
|
-export([set_manifest/1, open_contract/1, write_console/2, call_result/2, dryrun_result/2, trouble/1]).
|
||||||
-export([start_link/1]).
|
-export([start_link/1]).
|
||||||
-export([init/1, terminate/2, code_change/3,
|
-export([init/1, terminate/2, code_change/3,
|
||||||
handle_call/3, handle_cast/2, handle_info/2, handle_event/2]).
|
handle_call/3, handle_cast/2, handle_info/2, handle_event/2]).
|
||||||
@ -87,6 +87,14 @@ open_contract(Address) ->
|
|||||||
wx_object:cast(?MODULE, {open_contract, Address}).
|
wx_object:cast(?MODULE, {open_contract, Address}).
|
||||||
|
|
||||||
|
|
||||||
|
-spec write_console(ConID, Message) -> ok
|
||||||
|
when ConID :: gajudesk:id(),
|
||||||
|
Message :: unicode:chardata().
|
||||||
|
|
||||||
|
write_console(ConID, Message) ->
|
||||||
|
wx_object:cast(?MODULE, {write_console, ConID, Message}).
|
||||||
|
|
||||||
|
|
||||||
-spec call_result(ConID, CallInfo) -> ok
|
-spec call_result(ConID, CallInfo) -> ok
|
||||||
when ConID :: gajudesk:id(),
|
when ConID :: gajudesk:id(),
|
||||||
CallInfo :: map().
|
CallInfo :: map().
|
||||||
@ -220,6 +228,9 @@ handle_cast(to_front, State = #s{frame = Frame}) ->
|
|||||||
handle_cast({open_contract, Address}, State) ->
|
handle_cast({open_contract, Address}, State) ->
|
||||||
NewState = load2(State, Address),
|
NewState = load2(State, Address),
|
||||||
{noreply, NewState};
|
{noreply, NewState};
|
||||||
|
handle_cast({write_console, ConID, Message}, State) ->
|
||||||
|
ok = do_write_console(State, ConID, Message),
|
||||||
|
{noreply, State};
|
||||||
handle_cast({call_result, ConID, CallInfo}, State) ->
|
handle_cast({call_result, ConID, CallInfo}, State) ->
|
||||||
ok = do_call_result(State, ConID, CallInfo),
|
ok = do_call_result(State, ConID, CallInfo),
|
||||||
{noreply, State};
|
{noreply, State};
|
||||||
@ -325,30 +336,39 @@ clicked2(State, Contract, Name) ->
|
|||||||
handle_troubling(State, "No wallet is selected!")
|
handle_troubling(State, "No wallet is selected!")
|
||||||
end.
|
end.
|
||||||
|
|
||||||
clicked3(State = #s{frame = Frame, j = J}, Contract, Name, Selected, Keys) ->
|
clicked3(State = #s{frame = Frame, j = J}, Contract, Name = {FunName, FunType}, Selected, Keys) ->
|
||||||
Label =
|
{FunName, FunType} = Name,
|
||||||
case element(2, Name) of
|
#c{id = ConID, build = #{aaci := AACI}} = Contract,
|
||||||
call -> "Contract Call";
|
{aaci, ConName, FunSpecs, _} = AACI,
|
||||||
dryr -> "Dry Run"
|
FunSpec = maps:get(FunName, FunSpecs),
|
||||||
|
tell("FunName: ~tp", [FunName]),
|
||||||
|
tell("FunSpec: ~tp", [FunSpec]),
|
||||||
|
CallType =
|
||||||
|
case FunType of
|
||||||
|
call -> J("Contract Call");
|
||||||
|
dryr -> J("Dry Run")
|
||||||
end,
|
end,
|
||||||
Dialog = wxDialog:new(Frame, ?wxID_ANY, J(Label)),
|
Label = [CallType, ": ", ConName, ".", FunName, "/", integer_to_list(length(element(1, FunSpec)))],
|
||||||
|
Dialog = wxDialog:new(Frame, ?wxID_ANY, Label),
|
||||||
Sizer = wxBoxSizer:new(?wxVERTICAL),
|
Sizer = wxBoxSizer:new(?wxVERTICAL),
|
||||||
KeySz = wxStaticBoxSizer:new(?wxVERTICAL, Dialog, [{label, J("Signature Key")}]),
|
KeySz = wxStaticBoxSizer:new(?wxVERTICAL, Dialog, [{label, J("Signature Key")}]),
|
||||||
KeyPicker = wxChoice:new(Dialog, ?wxID_ANY, [{choices, Keys}]),
|
KeyPicker = wxChoice:new(Dialog, ?wxID_ANY, [{choices, Keys}]),
|
||||||
_ = wxStaticBoxSizer:add(KeySz, KeyPicker, zxw:flags(wide)),
|
_ = wxStaticBoxSizer:add(KeySz, KeyPicker, zxw:flags(wide)),
|
||||||
ok = wxChoice:setSelection(KeyPicker, Selected - 1),
|
ok = wxChoice:setSelection(KeyPicker, Selected - 1),
|
||||||
|
{ArgSz, ArgControls, Dimensions} = call_arg_sizer(Dialog, J, FunSpec),
|
||||||
{ParamSz, TTL_Tx, GasP_Tx, Gas_Tx, Amount_Tx} = call_param_sizer(Dialog, J),
|
{ParamSz, TTL_Tx, GasP_Tx, Gas_Tx, Amount_Tx} = call_param_sizer(Dialog, J),
|
||||||
ButtSz = wxBoxSizer:new(?wxHORIZONTAL),
|
ButtSz = wxBoxSizer:new(?wxHORIZONTAL),
|
||||||
Affirm = wxButton:new(Dialog, ?wxID_OK),
|
Affirm = wxButton:new(Dialog, ?wxID_OK),
|
||||||
Cancel = wxButton:new(Dialog, ?wxID_CANCEL),
|
Cancel = wxButton:new(Dialog, ?wxID_CANCEL),
|
||||||
_ = wxBoxSizer:add(ButtSz, Affirm, zxw:flags(wide)),
|
_ = wxBoxSizer:add(ButtSz, Affirm, zxw:flags({wide, 5})),
|
||||||
_ = wxBoxSizer:add(ButtSz, Cancel, zxw:flags(wide)),
|
_ = wxBoxSizer:add(ButtSz, Cancel, zxw:flags({wide, 5})),
|
||||||
_ = wxSizer:add(Sizer, KeySz, zxw:flags(wide)),
|
_ = wxSizer:add(Sizer, KeySz, zxw:flags({base, 5})),
|
||||||
_ = wxSizer:add(Sizer, ParamSz, zxw:flags(wide)),
|
_ = wxSizer:add(Sizer, ArgSz, zxw:flags({wide, 5})),
|
||||||
_ = wxSizer:add(Sizer, ButtSz, zxw:flags(wide)),
|
_ = wxSizer:add(Sizer, ParamSz, zxw:flags({base, 5})),
|
||||||
|
_ = wxSizer:add(Sizer, ButtSz, zxw:flags({base, 5})),
|
||||||
ok = wxDialog:setSizer(Dialog, Sizer),
|
ok = wxDialog:setSizer(Dialog, Sizer),
|
||||||
ok = wxBoxSizer:layout(Sizer),
|
ok = wxBoxSizer:layout(Sizer),
|
||||||
ok = wxDialog:setSize(Dialog, {500, 300}),
|
ok = wxDialog:setSize(Dialog, Dimensions),
|
||||||
ok = wxDialog:center(Dialog),
|
ok = wxDialog:center(Dialog),
|
||||||
Outcome =
|
Outcome =
|
||||||
case wxDialog:showModal(Dialog) of
|
case wxDialog:showModal(Dialog) of
|
||||||
@ -356,14 +376,17 @@ clicked3(State = #s{frame = Frame, j = J}, Contract, Name, Selected, Keys) ->
|
|||||||
ID = wxChoice:getString(KeyPicker, wxChoice:getSelection(KeyPicker)),
|
ID = wxChoice:getString(KeyPicker, wxChoice:getSelection(KeyPicker)),
|
||||||
PK = unicode:characters_to_binary(ID),
|
PK = unicode:characters_to_binary(ID),
|
||||||
Controls =
|
Controls =
|
||||||
[{"TTL", TTL_Tx},
|
[{{"TTL", fun gt_0/1}, TTL_Tx},
|
||||||
{"Gas Price", GasP_Tx},
|
{{"Gas Price", fun gt_0/1}, GasP_Tx},
|
||||||
{"Gas", Gas_Tx},
|
{{"Gas", fun gt_0/1}, Gas_Tx},
|
||||||
{"Amount", Amount_Tx}],
|
{{"Amount", fun gte_0/1}, Amount_Tx}],
|
||||||
case call_params(Controls) of
|
case call_params(Controls) of
|
||||||
{ok, [TTL, GasP, Gas, Amount]} ->
|
{ok, [TTL, GasP, Gas, Amount]} ->
|
||||||
|
{Message, CArgs} = extract_args(ArgControls),
|
||||||
|
ok = gd_v_devman:write_console(ConID, Message),
|
||||||
{ok, Nonce} = hz:next_nonce(PK),
|
{ok, Nonce} = hz:next_nonce(PK),
|
||||||
{ok, {PK, Nonce, TTL, GasP, Gas, Amount}};
|
CallParams = {PK, Nonce, TTL, GasP, Gas, Amount},
|
||||||
|
{ok, CallParams, CArgs};
|
||||||
E ->
|
E ->
|
||||||
E
|
E
|
||||||
end;
|
end;
|
||||||
@ -372,11 +395,80 @@ clicked3(State = #s{frame = Frame, j = J}, Contract, Name, Selected, Keys) ->
|
|||||||
end,
|
end,
|
||||||
ok = wxDialog:destroy(Dialog),
|
ok = wxDialog:destroy(Dialog),
|
||||||
case Outcome of
|
case Outcome of
|
||||||
{ok, Params} -> clicked4(State, Contract, Name, Params);
|
{ok, Params, Args} -> clicked4(State, Contract, Name, Params, Args);
|
||||||
cancel -> State;
|
cancel -> State;
|
||||||
Error -> handle_troubling(State, Error)
|
Error -> handle_troubling(State, Error)
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
extract_args(Controls) ->
|
||||||
|
extract_args(Controls, []).
|
||||||
|
|
||||||
|
extract_args([], Acc) ->
|
||||||
|
pack_args(Acc);
|
||||||
|
extract_args([{Name, Control} | T], Acc) ->
|
||||||
|
String = wxTextCtrl:getValue(Control),
|
||||||
|
extract_args(T, [{Name, String} | Acc]).
|
||||||
|
|
||||||
|
pack_args(Args) ->
|
||||||
|
pack_args(Args, [], []).
|
||||||
|
|
||||||
|
pack_args([], M, A) ->
|
||||||
|
Message = unicode:characters_to_list(["Call Args:\n", M]),
|
||||||
|
{Message, A};
|
||||||
|
pack_args([{N, S} | T], M, A) ->
|
||||||
|
pack_args(T, [[N, ": ", S, "\n"] | M], [S | A]).
|
||||||
|
|
||||||
|
|
||||||
|
call_arg_sizer(Dialog, J, {CallArgs, ReturnType}) ->
|
||||||
|
SpecSz = wxStaticBoxSizer:new(?wxVERTICAL, Dialog, [{label, J("Function Spec")}]),
|
||||||
|
{CallSz, CallControls, Dimensions} = call_sizer(Dialog, J, CallArgs),
|
||||||
|
ReturnSz = return_sizer(Dialog, J, ReturnType),
|
||||||
|
_ = wxStaticBoxSizer:add(SpecSz, CallSz, zxw:flags({wide, 5})),
|
||||||
|
_ = wxStaticBoxSizer:add(SpecSz, ReturnSz, zxw:flags({base, 5})),
|
||||||
|
{SpecSz, CallControls, Dimensions}.
|
||||||
|
|
||||||
|
call_sizer(Dialog, J, []) ->
|
||||||
|
CallSz = wxStaticBoxSizer:new(?wxVERTICAL, Dialog, [{label, J("Call Args")}]),
|
||||||
|
Args = wxStaticText:new(Dialog, ?wxID_ANY, ["[", J("No Args"), "]"]),
|
||||||
|
_ = wxStaticBoxSizer:add(CallSz, Args, zxw:flags({wide, 5})),
|
||||||
|
{CallSz, [], {500, 500}};
|
||||||
|
call_sizer(Dialog, J, CallArgs) ->
|
||||||
|
ScrollWin = wxScrolledWindow:new(Dialog),
|
||||||
|
ScrollSz = wxBoxSizer:new(?wxVERTICAL),
|
||||||
|
ok = wxScrolledWindow:setSizerAndFit(ScrollWin, ScrollSz),
|
||||||
|
ok = wxScrolledWindow:setScrollRate(ScrollWin, 5, 5),
|
||||||
|
CallSz = wxStaticBoxSizer:new(?wxVERTICAL, Dialog, [{label, J("Call Args")}]),
|
||||||
|
GridSz = wxFlexGridSizer:new(2, [{gap, {4, 4}}]),
|
||||||
|
ok = wxFlexGridSizer:setFlexibleDirection(GridSz, ?wxHORIZONTAL),
|
||||||
|
ok = wxFlexGridSizer:addGrowableCol(GridSz, 1),
|
||||||
|
AddArg =
|
||||||
|
fun({Name, Type}) ->
|
||||||
|
L = wxStaticText:new(ScrollWin, ?wxID_ANY, [Name, " : ", textify(Type)]),
|
||||||
|
C = wxTextCtrl:new(ScrollWin, ?wxID_ANY),
|
||||||
|
_ = wxFlexGridSizer:add(GridSz, L, zxw:flags({base, 5})),
|
||||||
|
_ = wxFlexGridSizer:add(GridSz, C, zxw:flags({wide, 5})),
|
||||||
|
{Name, C}
|
||||||
|
end,
|
||||||
|
_ = wxStaticBoxSizer:add(ScrollSz, GridSz, zxw:flags(wide)),
|
||||||
|
_ = wxStaticBoxSizer:add(CallSz, ScrollWin, zxw:flags(wide)),
|
||||||
|
Controls = lists:map(AddArg, CallArgs),
|
||||||
|
{CallSz, Controls, {600, 700}}.
|
||||||
|
|
||||||
|
return_sizer(Dialog, J, ReturnType) ->
|
||||||
|
ReturnSz = wxStaticBoxSizer:new(?wxVERTICAL, Dialog, [{label, J("Return Type")}]),
|
||||||
|
Return = wxStaticText:new(Dialog, ?wxID_ANY, textify(ReturnType)),
|
||||||
|
_ = wxStaticBoxSizer:add(ReturnSz, Return, zxw:flags({wide, 5})),
|
||||||
|
ReturnSz.
|
||||||
|
|
||||||
|
textify({integer, _, _}) -> "int";
|
||||||
|
textify({boolean, _, _}) -> "bool";
|
||||||
|
textify({{bytes, [I]}, _, _}) -> io_lib:format("bytes(~w)", [I]);
|
||||||
|
textify({{bytes, any}, _, _}) -> "bytes()";
|
||||||
|
textify({T, _, _}) when is_atom(T) -> atom_to_list(T);
|
||||||
|
textify({T, _, _}) when is_list(T) -> T;
|
||||||
|
textify({T, _, _}) -> io_lib:format("~tp", [T]).
|
||||||
|
|
||||||
|
|
||||||
call_param_sizer(Dialog, J) ->
|
call_param_sizer(Dialog, J) ->
|
||||||
{ok, Height} = hz:top_height(),
|
{ok, Height} = hz:top_height(),
|
||||||
DefTTL = Height + 10000,
|
DefTTL = Height + 10000,
|
||||||
@ -399,40 +491,64 @@ call_param_sizer(Dialog, J) ->
|
|||||||
Amount_L = wxStaticText:new(Dialog, ?wxID_ANY, J("TX Amount")),
|
Amount_L = wxStaticText:new(Dialog, ?wxID_ANY, J("TX Amount")),
|
||||||
Amount_Tx = wxTextCtrl:new(Dialog, ?wxID_ANY),
|
Amount_Tx = wxTextCtrl:new(Dialog, ?wxID_ANY),
|
||||||
ok = wxTextCtrl:setValue(Amount_Tx, integer_to_list(DefAmount)),
|
ok = wxTextCtrl:setValue(Amount_Tx, integer_to_list(DefAmount)),
|
||||||
_ = wxFlexGridSizer:add(GridSz, TTL_L, zxw:flags(base)),
|
_ = wxFlexGridSizer:add(GridSz, TTL_L, zxw:flags({base, 5})),
|
||||||
_ = wxFlexGridSizer:add(GridSz, TTL_Tx, zxw:flags(wide)),
|
_ = wxFlexGridSizer:add(GridSz, TTL_Tx, zxw:flags({wide, 5})),
|
||||||
_ = wxFlexGridSizer:add(GridSz, GasP_L, zxw:flags(base)),
|
_ = wxFlexGridSizer:add(GridSz, GasP_L, zxw:flags({base, 5})),
|
||||||
_ = wxFlexGridSizer:add(GridSz, GasP_Tx, zxw:flags(wide)),
|
_ = wxFlexGridSizer:add(GridSz, GasP_Tx, zxw:flags({wide, 5})),
|
||||||
_ = wxFlexGridSizer:add(GridSz, Gas_L, zxw:flags(base)),
|
_ = wxFlexGridSizer:add(GridSz, Gas_L, zxw:flags({base, 5})),
|
||||||
_ = wxFlexGridSizer:add(GridSz, Gas_Tx, zxw:flags(wide)),
|
_ = wxFlexGridSizer:add(GridSz, Gas_Tx, zxw:flags({wide, 5})),
|
||||||
_ = wxFlexGridSizer:add(GridSz, Amount_L, zxw:flags(base)),
|
_ = wxFlexGridSizer:add(GridSz, Amount_L, zxw:flags({base, 5})),
|
||||||
_ = wxFlexGridSizer:add(GridSz, Amount_Tx, zxw:flags(wide)),
|
_ = wxFlexGridSizer:add(GridSz, Amount_Tx, zxw:flags({wide, 5})),
|
||||||
_ = wxSizer:add(ParamSz, GridSz, zxw:flags(wide)),
|
_ = wxSizer:add(ParamSz, GridSz, zxw:flags(wide)),
|
||||||
{ParamSz, TTL_Tx, GasP_Tx, Gas_Tx, Amount_Tx}.
|
{ParamSz, TTL_Tx, GasP_Tx, Gas_Tx, Amount_Tx}.
|
||||||
|
|
||||||
call_params(Controls) ->
|
call_params(Controls) ->
|
||||||
call_params(Controls, []).
|
call_params(Controls, {[], []}).
|
||||||
|
|
||||||
call_params([], A) ->
|
call_params([], {Acc, []}) ->
|
||||||
{ok, lists:reverse(A)};
|
{ok, lists:reverse(Acc)};
|
||||||
call_params([{L, C} | T], A) ->
|
call_params([], {_, Errors}) ->
|
||||||
O =
|
{error, lists:reverse(Errors)};
|
||||||
|
call_params([{{Label, Validate}, Control} | T], {Acc, Errors}) ->
|
||||||
|
String = wxTextCtrl:getValue(Control),
|
||||||
|
case Validate(String) of
|
||||||
|
{ok, Value} -> call_params(T, {[Value | Acc], Errors});
|
||||||
|
{error, Reason} -> call_params(T, {Acc, [{Label, Reason} | Errors]})
|
||||||
|
end.
|
||||||
|
|
||||||
|
gt_0(S) ->
|
||||||
|
C = "Must be an integer greater than 0",
|
||||||
|
R =
|
||||||
try
|
try
|
||||||
{ok, list_to_integer(wxTextCtrl:getValue(C))}
|
{ok, list_to_integer(S)}
|
||||||
catch
|
catch
|
||||||
error:badarg -> {error, {L, not_an_integer}}
|
error:badarg -> {error, {S, C}}
|
||||||
end,
|
end,
|
||||||
case O of
|
case R of
|
||||||
{ok, N} -> call_params(T, [N | A]);
|
{ok, N} when N > 0 -> {ok, N};
|
||||||
Error -> Error
|
{ok, N} when N =< 0 -> {error, {S, C}};
|
||||||
|
Error -> Error
|
||||||
|
end.
|
||||||
|
|
||||||
|
gte_0(S) ->
|
||||||
|
C = "Must be a non-negative integer.",
|
||||||
|
R =
|
||||||
|
try
|
||||||
|
{ok, list_to_integer(S)}
|
||||||
|
catch
|
||||||
|
error:badarg -> {error, {S, C}}
|
||||||
|
end,
|
||||||
|
case R of
|
||||||
|
{ok, N} when N >= 0 -> {ok, N};
|
||||||
|
{ok, N} when N < 0 -> {error, {S, C}};
|
||||||
|
Error -> Error
|
||||||
end.
|
end.
|
||||||
|
|
||||||
clicked4(State,
|
clicked4(State,
|
||||||
#c{id = ConID, build = #{aaci := AACI}, funs = {_, Funs}},
|
#c{id = ConID, build = #{aaci := AACI}},
|
||||||
{Name, Type},
|
{Name, Type},
|
||||||
{PK, Nonce, TTL, GasP, Gas, Amt}) ->
|
{PK, Nonce, TTL, GasP, Gas, Amt},
|
||||||
#f{args = ArgFields} = maps:get(Name, Funs),
|
Args) ->
|
||||||
Args = lists:map(fun get_arg/1, ArgFields),
|
|
||||||
case hz:contract_call(PK, Nonce, Gas, GasP, Amt, TTL, AACI, ConID, Name, Args) of
|
case hz:contract_call(PK, Nonce, Gas, GasP, Amt, TTL, AACI, ConID, Name, Args) of
|
||||||
{ok, UnsignedTX} ->
|
{ok, UnsignedTX} ->
|
||||||
case Type of
|
case Type of
|
||||||
@ -453,28 +569,27 @@ do_dry_run(State, ConID, TX) ->
|
|||||||
State.
|
State.
|
||||||
|
|
||||||
|
|
||||||
do_call_result(#s{tabs = TopBook, cons = {Consbook, Contracts}}, ConID, CallInfo) ->
|
do_write_console(#s{tabs = TopBook, cons = {Consbook, Contracts}}, ConID, Message) ->
|
||||||
case lookup_contract(ConID, Contracts) of
|
case lookup_contract(ConID, Contracts) of
|
||||||
{#c{cons = Console}, ZeroIndex} ->
|
{#c{cons = Console}, ZeroIndex} ->
|
||||||
_ = wxNotebook:changeSelection(TopBook, 1),
|
_ = wxNotebook:changeSelection(TopBook, 1),
|
||||||
_ = wxNotebook:changeSelection(Consbook, ZeroIndex),
|
_ = wxNotebook:changeSelection(Consbook, ZeroIndex),
|
||||||
Out = io_lib:format("Call Result:~n~p~n~n", [CallInfo]),
|
Out = [Message, "\n\n"],
|
||||||
wxTextCtrl:appendText(Console, Out);
|
wxTextCtrl:appendText(Console, Out);
|
||||||
error ->
|
error ->
|
||||||
tell(info, "Received result for ~p:~n~p ", [ConID, CallInfo])
|
tell(info, "Received result for ~p:~n~p ", [ConID, Message])
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
|
||||||
do_dryrun_result(#s{tabs = TopBook, cons = {Consbook, Contracts}}, ConID, CallInfo) ->
|
do_call_result(State, ConID, CallInfo) ->
|
||||||
case lookup_contract(ConID, Contracts) of
|
Message = io_lib:format("Call Result:~n~p", [CallInfo]),
|
||||||
{#c{cons = Console}, ZeroIndex} ->
|
do_write_console(State, ConID, Message).
|
||||||
_ = wxNotebook:changeSelection(TopBook, 1),
|
|
||||||
_ = wxNotebook:changeSelection(Consbook, ZeroIndex),
|
|
||||||
Out = io_lib:format("Call Result:~n~p~n~n", [CallInfo]),
|
do_dryrun_result(State, ConID, CallInfo) ->
|
||||||
wxTextCtrl:appendText(Console, Out);
|
Message = io_lib:format("Call Result:~n~p", [CallInfo]),
|
||||||
error ->
|
do_write_console(State, ConID, Message).
|
||||||
tell(info, "Received result for ~p:~n~p ", [ConID, CallInfo])
|
|
||||||
end.
|
|
||||||
|
|
||||||
lookup_contract(ConID, Contracts) ->
|
lookup_contract(ConID, Contracts) ->
|
||||||
lookup_contract(ConID, Contracts, 0).
|
lookup_contract(ConID, Contracts, 0).
|
||||||
@ -618,55 +733,44 @@ deploy3(State, InitSpec, Build) ->
|
|||||||
end.
|
end.
|
||||||
|
|
||||||
deploy4(State = #s{frame = Frame, j = J}, InitSpec, Build, Selected, Keys) ->
|
deploy4(State = #s{frame = Frame, j = J}, InitSpec, Build, Selected, Keys) ->
|
||||||
InitArgs = element(1, InitSpec),
|
|
||||||
Dialog = wxDialog:new(Frame, ?wxID_ANY, J("Deploy Contract")),
|
Dialog = wxDialog:new(Frame, ?wxID_ANY, J("Deploy Contract")),
|
||||||
Sizer = wxBoxSizer:new(?wxVERTICAL),
|
Sizer = wxBoxSizer:new(?wxVERTICAL),
|
||||||
ScrollWin = wxScrolledWindow:new(Dialog),
|
KeySz = wxStaticBoxSizer:new(?wxVERTICAL, Dialog, [{label, J("Signature Key")}]),
|
||||||
ScrollSz = wxBoxSizer:new(?wxVERTICAL),
|
KeyPicker = wxChoice:new(Dialog, ?wxID_ANY, [{choices, Keys}]),
|
||||||
ok = wxScrolledWindow:setSizerAndFit(ScrollWin, ScrollSz),
|
|
||||||
ok = wxScrolledWindow:setScrollRate(ScrollWin, 5, 5),
|
|
||||||
FunName = unicode:characters_to_list(["init/", integer_to_list(length(InitArgs))]),
|
|
||||||
FunSz = wxStaticBoxSizer:new(?wxVERTICAL, ScrollWin, [{label, FunName}]),
|
|
||||||
KeySz = wxStaticBoxSizer:new(?wxVERTICAL, ScrollWin, [{label, J("Signature Key")}]),
|
|
||||||
KeyPicker = wxChoice:new(ScrollWin, ?wxID_ANY, [{choices, Keys}]),
|
|
||||||
_ = wxStaticBoxSizer:add(KeySz, KeyPicker, zxw:flags(wide)),
|
_ = wxStaticBoxSizer:add(KeySz, KeyPicker, zxw:flags(wide)),
|
||||||
ok = wxChoice:setSelection(KeyPicker, Selected - 1),
|
ok = wxChoice:setSelection(KeyPicker, Selected - 1),
|
||||||
{ParamSz, TTL_Tx, GasP_Tx, Gas_Tx, Amount_Tx} = call_param_sizer(ScrollWin, J),
|
{ArgSz, ArgControls, Dimensions} = call_arg_sizer(Dialog, J, InitSpec),
|
||||||
|
{ParamSz, TTL_Tx, GasP_Tx, Gas_Tx, Amount_Tx} = call_param_sizer(Dialog, J),
|
||||||
ButtSz = wxBoxSizer:new(?wxHORIZONTAL),
|
ButtSz = wxBoxSizer:new(?wxHORIZONTAL),
|
||||||
Affirm = wxButton:new(Dialog, ?wxID_OK),
|
Affirm = wxButton:new(Dialog, ?wxID_OK),
|
||||||
Cancel = wxButton:new(Dialog, ?wxID_CANCEL),
|
Cancel = wxButton:new(Dialog, ?wxID_CANCEL),
|
||||||
_ = wxBoxSizer:add(ButtSz, Affirm, zxw:flags(wide)),
|
_ = wxBoxSizer:add(ButtSz, Affirm, zxw:flags({wide, 5})),
|
||||||
_ = wxBoxSizer:add(ButtSz, Cancel, zxw:flags(wide)),
|
_ = wxBoxSizer:add(ButtSz, Cancel, zxw:flags({wide, 5})),
|
||||||
GridSz = wxFlexGridSizer:new(2, 4, 4),
|
_ = wxSizer:add(Sizer, KeySz, zxw:flags({base, 5})),
|
||||||
ok = wxFlexGridSizer:setFlexibleDirection(GridSz, ?wxHORIZONTAL),
|
_ = wxSizer:add(Sizer, ArgSz, zxw:flags({wide, 5})),
|
||||||
ok = wxFlexGridSizer:addGrowableCol(GridSz, 1),
|
_ = wxSizer:add(Sizer, ParamSz, zxw:flags({base, 5})),
|
||||||
ArgFields = make_arg_fields(ScrollWin, GridSz, InitArgs),
|
_ = wxSizer:add(Sizer, ButtSz, zxw:flags({base, 5})),
|
||||||
_ = wxStaticBoxSizer:add(FunSz, GridSz, zxw:flags(wide)),
|
|
||||||
_ = wxStaticBoxSizer:add(ScrollSz, FunSz, [{proportion, 1}, {flag, ?wxEXPAND}]),
|
|
||||||
_ = wxStaticBoxSizer:add(ScrollSz, KeySz, [{proportion, 0}, {flag, ?wxEXPAND}]),
|
|
||||||
_ = wxStaticBoxSizer:add(ScrollSz, ParamSz, [{proportion, 0}, {flag, ?wxEXPAND}]),
|
|
||||||
_ = wxSizer:add(Sizer, ScrollWin, [{proportion, 5}, {flag, ?wxEXPAND}]),
|
|
||||||
_ = wxSizer:add(Sizer, ButtSz, [{proportion, 1}, {flag, ?wxEXPAND}]),
|
|
||||||
ok = wxDialog:setSizer(Dialog, Sizer),
|
ok = wxDialog:setSizer(Dialog, Sizer),
|
||||||
ok = wxBoxSizer:layout(Sizer),
|
ok = wxBoxSizer:layout(Sizer),
|
||||||
ok = wxDialog:setSize(Dialog, {500, 500}),
|
ok = wxDialog:setSize(Dialog, Dimensions),
|
||||||
ok = wxDialog:center(Dialog),
|
ok = wxDialog:center(Dialog),
|
||||||
Outcome =
|
Outcome =
|
||||||
case wxDialog:showModal(Dialog) of
|
case wxDialog:showModal(Dialog) of
|
||||||
?wxID_OK ->
|
?wxID_OK ->
|
||||||
ID = wxChoice:getString(KeyPicker, wxChoice:getSelection(KeyPicker)),
|
ID = wxChoice:getString(KeyPicker, wxChoice:getSelection(KeyPicker)),
|
||||||
PK = unicode:characters_to_binary(ID),
|
PK = unicode:characters_to_binary(ID),
|
||||||
IArgs = lists:map(fun get_arg/1, ArgFields),
|
|
||||||
Controls =
|
Controls =
|
||||||
[{"TTL", TTL_Tx},
|
[{{"TTL", fun gt_0/1}, TTL_Tx},
|
||||||
{"Gas Price", GasP_Tx},
|
{{"Gas Price", fun gt_0/1}, GasP_Tx},
|
||||||
{"Gas", Gas_Tx},
|
{{"Gas", fun gt_0/1}, Gas_Tx},
|
||||||
{"Amount", Amount_Tx}],
|
{{"Amount", fun gte_0/1}, Amount_Tx}],
|
||||||
case call_params(Controls) of
|
case call_params(Controls) of
|
||||||
{ok, [TTL, GasP, Gas, Amount]} ->
|
{ok, [TTL, GasP, Gas, Amount]} ->
|
||||||
|
{Message, CArgs} = extract_args(ArgControls),
|
||||||
|
ok = tell(Message),
|
||||||
{ok, Nonce} = hz:next_nonce(PK),
|
{ok, Nonce} = hz:next_nonce(PK),
|
||||||
DeployParams = {PK, Nonce, TTL, GasP, Gas, Amount},
|
DeployParams = {PK, Nonce, TTL, GasP, Gas, Amount},
|
||||||
{ok, DeployParams, IArgs};
|
{ok, DeployParams, CArgs};
|
||||||
E ->
|
E ->
|
||||||
E
|
E
|
||||||
end;
|
end;
|
||||||
@ -686,19 +790,6 @@ deploy5(State, Build, Params, Args) ->
|
|||||||
State.
|
State.
|
||||||
|
|
||||||
|
|
||||||
make_arg_fields(ScrollWin, GridSz, Args) ->
|
|
||||||
MakeArgField =
|
|
||||||
fun({AN, T}) ->
|
|
||||||
tell(info, "~p: Arg: ~p, Type: ~p", [?LINE, AN, T]),
|
|
||||||
ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, AN),
|
|
||||||
TCT = wxTextCtrl:new(ScrollWin, ?wxID_ANY),
|
|
||||||
_ = wxFlexGridSizer:add(GridSz, ANT, [{proportion, 0}, {flag, ?wxEXPAND}]),
|
|
||||||
_ = wxFlexGridSizer:add(GridSz, TCT, [{proportion, 0}, {flag, ?wxEXPAND}]),
|
|
||||||
{T, TCT}
|
|
||||||
end,
|
|
||||||
lists:map(MakeArgField, Args).
|
|
||||||
|
|
||||||
|
|
||||||
open(State = #s{frame = Frame, j = J}) ->
|
open(State = #s{frame = Frame, j = J}) ->
|
||||||
Dialog = wxDialog:new(Frame, ?wxID_ANY, J("Open Contract Source")),
|
Dialog = wxDialog:new(Frame, ?wxID_ANY, J("Open Contract Source")),
|
||||||
Sizer = wxBoxSizer:new(?wxVERTICAL),
|
Sizer = wxBoxSizer:new(?wxVERTICAL),
|
||||||
@ -1091,23 +1182,6 @@ load3(State = #s{tabs = TopBook, cons = {Consbook, Pages}, buttons = Buttons, j
|
|||||||
State#s{cons = {Consbook, NewPages}, buttons = NewButtons}.
|
State#s{cons = {Consbook, NewPages}, buttons = NewButtons}.
|
||||||
|
|
||||||
|
|
||||||
get_arg({list, AFs, _}) ->
|
|
||||||
lists:map(fun get_arg/1, AFs);
|
|
||||||
get_arg({record, AFs}) ->
|
|
||||||
get_record(AFs);
|
|
||||||
get_arg({tuple, AFs}) ->
|
|
||||||
list_to_tuple(lists:map(fun get_arg/1, AFs));
|
|
||||||
get_arg({map, [Key, Value]}) ->
|
|
||||||
#{get_arg(Key) => get_arg(Value)};
|
|
||||||
get_arg({variant, AFs, [VariantOne | _]}) ->
|
|
||||||
Elems = lists:map(fun get_arg/1, AFs),
|
|
||||||
list_to_tuple([VariantOne | Elems]);
|
|
||||||
get_arg({_, TextCtrl}) ->
|
|
||||||
wxTextCtrl:getValue(TextCtrl).
|
|
||||||
|
|
||||||
get_record([{L, A} | T]) ->
|
|
||||||
[{L, get_arg(A)} | get_record(T)].
|
|
||||||
|
|
||||||
fun_interfaces(ScrollWin, FunSz, Buttons, Funs, J) ->
|
fun_interfaces(ScrollWin, FunSz, Buttons, Funs, J) ->
|
||||||
MakeIface =
|
MakeIface =
|
||||||
fun(Name, {Args, _}) ->
|
fun(Name, {Args, _}) ->
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user