From 4af3367784530ac26c5694c57601318fe35f4b54 Mon Sep 17 00:00:00 2001 From: Craig Everett Date: Thu, 27 Feb 2025 19:50:41 +0900 Subject: [PATCH] Add contract call and dry run params interface --- src/gmc_con.erl | 2 +- src/gmc_v_devman.erl | 81 +++++++++++++++++++++++++++++++++++++------- 2 files changed, 69 insertions(+), 14 deletions(-) diff --git a/src/gmc_con.erl b/src/gmc_con.erl index e72960f..4fece88 100644 --- a/src/gmc_con.erl +++ b/src/gmc_con.erl @@ -756,7 +756,7 @@ do_sign_call(#s{wallet = #wallet{keys = Keys, chain_id = ChainID}}, SignedTX = sign_tx_hash(TX, SecKey, ChainID), case hz:post_tx(SignedTX) of {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); {ok, WTF} -> gmc_v_devman:trouble({error, WTF}); diff --git a/src/gmc_v_devman.erl b/src/gmc_v_devman.erl index 9b92941..0a251b4 100644 --- a/src/gmc_v_devman.erl +++ b/src/gmc_v_devman.erl @@ -312,51 +312,106 @@ clicked2(State, Contract, Name) -> end. 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")), Sizer = wxBoxSizer:new(?wxVERTICAL), KeySz = wxStaticBoxSizer:new(?wxVERTICAL, Dialog, [{label, J("Signature Key")}]), KeyPicker = wxChoice:new(Dialog, ?wxID_ANY, [{choices, Keys}]), _ = wxStaticBoxSizer:add(KeySz, KeyPicker, zxw:flags(wide)), 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), Affirm = wxButton:new(Dialog, ?wxID_OK), Cancel = wxButton:new(Dialog, ?wxID_CANCEL), _ = wxBoxSizer:add(ButtSz, Affirm, zxw:flags(wide)), _ = wxBoxSizer:add(ButtSz, Cancel, zxw:flags(wide)), - _ = wxSizer:add(Sizer, KeySz, [{proportion, 0}, {flag, ?wxEXPAND}]), - _ = wxSizer:add(Sizer, ButtSz, [{proportion, 1}, {flag, ?wxEXPAND}]), + _ = wxSizer:add(Sizer, KeySz, zxw:flags(wide)), + _ = wxSizer:add(Sizer, ParamSz, zxw:flags(wide)), + _ = wxSizer:add(Sizer, ButtSz, zxw:flags(wide)), ok = wxDialog:setSizer(Dialog, Sizer), ok = wxBoxSizer:layout(Sizer), + ok = wxDialog:setSize(Dialog, {500, 300}), ok = wxDialog:center(Dialog), Outcome = case wxDialog:showModal(Dialog) of ?wxID_OK -> ID = wxChoice:getString(KeyPicker, wxChoice:getSelection(KeyPicker)), - BinID = unicode:characters_to_binary(ID), - {ok, BinID}; + PK = unicode:characters_to_binary(ID), + 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 -> cancel end, ok = wxDialog:destroy(Dialog), case Outcome of - {ok, CallerID} -> clicked4(State, Contract, Name, CallerID); - cancel -> State + {ok, Params} -> clicked4(State, Contract, Name, Params); + 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. clicked4(State, #c{id = ConID, build = #{aci := ACI}, funs = {_, Funs}}, {Name, Type}, - PK) -> + {PK, Nonce, TTL, GasP, Gas, Amount}) -> AACI = hz:prepare_aaci(ACI), #f{args = ArgFields} = lists:keyfind(Name, #f.name, Funs), Args = lists:map(fun get_arg/1, ArgFields), 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 {ok, UnsignedTX} -> case Type of