Add contract call and dry run params interface

This commit is contained in:
Craig Everett 2025-02-27 19:50:41 +09:00
parent af69159eb5
commit 4af3367784
2 changed files with 69 additions and 14 deletions

View File

@ -756,7 +756,7 @@ do_sign_call(#s{wallet = #wallet{keys = Keys, chain_id = ChainID}},
SignedTX = sign_tx_hash(TX, SecKey, ChainID), SignedTX = sign_tx_hash(TX, SecKey, ChainID),
case hz:post_tx(SignedTX) of case hz:post_tx(SignedTX) of
{ok, Data = #{"tx_hash" := TXHash}} -> {ok, Data = #{"tx_hash" := TXHash}} ->
ok = tell("Contract deploy TX succeded with: ~p", [TXHash]), ok = tell("TX succeded with: ~p", [TXHash]),
do_sign_call2(ConID, Data); do_sign_call2(ConID, Data);
{ok, WTF} -> {ok, WTF} ->
gmc_v_devman:trouble({error, WTF}); gmc_v_devman:trouble({error, WTF});

View File

@ -312,51 +312,106 @@ clicked2(State, Contract, Name) ->
end. end.
clicked3(State = #s{frame = Frame, j = J}, Contract, Name, Selected, Keys) -> clicked3(State = #s{frame = Frame, j = J}, Contract, Name, Selected, Keys) ->
{ok, Height} = hz:top_height(),
DefTTL = Height + 10000,
DefGasP = hz:min_gas_price(),
DefGas = 5000000,
DefAmount = 0,
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),
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),
ParamSz = wxStaticBoxSizer:new(?wxVERTICAL, Dialog, [{label, J("TX Parameters")}]),
GridSz = wxFlexGridSizer:new(2, 4, 4),
ok = wxFlexGridSizer:setFlexibleDirection(GridSz, ?wxHORIZONTAL),
ok = wxFlexGridSizer:addGrowableCol(GridSz, 1),
TTL_L = wxStaticText:new(Dialog, ?wxID_ANY, "TTL"),
TTL_Tx = wxTextCtrl:new(Dialog, ?wxID_ANY),
ok = wxTextCtrl:setValue(TTL_Tx, integer_to_list(DefTTL)),
GasP_L = wxStaticText:new(Dialog, ?wxID_ANY, J("Gas Price")),
GasP_Tx = wxTextCtrl:new(Dialog, ?wxID_ANY),
ok = wxTextCtrl:setValue(GasP_Tx, integer_to_list(DefGasP)),
Gas_L = wxStaticText:new(Dialog, ?wxID_ANY, J("Gas")),
Gas_Tx = wxTextCtrl:new(Dialog, ?wxID_ANY),
ok = wxTextCtrl:setValue(Gas_Tx, integer_to_list(DefGas)),
Amount_L = wxStaticText:new(Dialog, ?wxID_ANY, J("TX Amount")),
Amount_Tx = wxTextCtrl:new(Dialog, ?wxID_ANY),
ok = wxTextCtrl:setValue(Amount_Tx, integer_to_list(DefAmount)),
_ = wxFlexGridSizer:add(GridSz, TTL_L, zxw:flags(base)),
_ = wxFlexGridSizer:add(GridSz, TTL_Tx, zxw:flags(wide)),
_ = wxFlexGridSizer:add(GridSz, GasP_L, zxw:flags(base)),
_ = wxFlexGridSizer:add(GridSz, GasP_Tx, zxw:flags(wide)),
_ = wxFlexGridSizer:add(GridSz, Gas_L, zxw:flags(base)),
_ = wxFlexGridSizer:add(GridSz, Gas_Tx, zxw:flags(wide)),
_ = wxFlexGridSizer:add(GridSz, Amount_L, zxw:flags(base)),
_ = wxFlexGridSizer:add(GridSz, Amount_Tx, zxw:flags(wide)),
_ = wxSizer:add(ParamSz, GridSz, zxw:flags(wide)),
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)),
_ = wxBoxSizer:add(ButtSz, Cancel, zxw:flags(wide)), _ = wxBoxSizer:add(ButtSz, Cancel, zxw:flags(wide)),
_ = wxSizer:add(Sizer, KeySz, [{proportion, 0}, {flag, ?wxEXPAND}]), _ = wxSizer:add(Sizer, KeySz, zxw:flags(wide)),
_ = wxSizer:add(Sizer, ButtSz, [{proportion, 1}, {flag, ?wxEXPAND}]), _ = wxSizer:add(Sizer, ParamSz, zxw:flags(wide)),
_ = wxSizer:add(Sizer, ButtSz, zxw:flags(wide)),
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: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)),
BinID = unicode:characters_to_binary(ID), PK = unicode:characters_to_binary(ID),
{ok, BinID}; Controls =
[{"TTL", TTL_Tx},
{"Gas Price", GasP_Tx},
{"Gas", Gas_Tx},
{"Amount", Amount_Tx}],
case call_params(Controls) of
{ok, [TTL, GasP, Gas, Amount]} ->
{ok, Nonce} = hz:next_nonce(PK),
{ok, {PK, Nonce, TTL, GasP, Gas, Amount}};
E ->
E
end;
?wxID_CANCEL -> ?wxID_CANCEL ->
cancel cancel
end, end,
ok = wxDialog:destroy(Dialog), ok = wxDialog:destroy(Dialog),
case Outcome of case Outcome of
{ok, CallerID} -> clicked4(State, Contract, Name, CallerID); {ok, Params} -> clicked4(State, Contract, Name, Params);
cancel -> State cancel -> State;
Error -> handle_troubling(State, Error)
end.
call_params(Controls) ->
call_params(Controls, []).
call_params([], A) ->
{ok, lists:reverse(A)};
call_params([{L, C} | T], A) ->
O =
try
{ok, list_to_integer(wxTextCtrl:getValue(C))}
catch
error:badarg -> {error, {L, not_an_integer}}
end,
case O of
{ok, N} -> call_params(T, [N | A]);
Error -> Error
end. end.
clicked4(State, clicked4(State,
#c{id = ConID, build = #{aci := ACI}, funs = {_, Funs}}, #c{id = ConID, build = #{aci := ACI}, funs = {_, Funs}},
{Name, Type}, {Name, Type},
PK) -> {PK, Nonce, TTL, GasP, Gas, Amount}) ->
AACI = hz:prepare_aaci(ACI), AACI = hz:prepare_aaci(ACI),
#f{args = ArgFields} = lists:keyfind(Name, #f.name, Funs), #f{args = ArgFields} = lists:keyfind(Name, #f.name, Funs),
Args = lists:map(fun get_arg/1, ArgFields), Args = lists:map(fun get_arg/1, ArgFields),
FunName = binary_to_list(Name), FunName = binary_to_list(Name),
{ok, Nonce} = hz:next_nonce(PK),
{ok, Height} = hz:top_height(),
TTL = Height + 10000,
GasP = hz:min_gas_price(),
Gas = 5000000,
Amount = 0,
case hz:contract_call(PK, Nonce, Gas, GasP, Amount, TTL, AACI, ConID, FunName, Args) of case hz:contract_call(PK, Nonce, Gas, GasP, Amount, TTL, AACI, ConID, FunName, Args) of
{ok, UnsignedTX} -> {ok, UnsignedTX} ->
case Type of case Type of