diff --git a/ebin/clutch.app b/ebin/clutch.app index e38dee7..840d84c 100644 --- a/ebin/clutch.app +++ b/ebin/clutch.app @@ -3,7 +3,7 @@ {registered,[]}, {included_applications,[]}, {applications,[stdlib,kernel,sasl,ssl]}, - {vsn,"0.4.1"}, + {vsn,"0.5.0"}, {modules,[clutch,gmc_con,gmc_grids,gmc_gui,gmc_jt, gmc_key_master,gmc_sup,gmc_v,gmc_v_devman, gmc_v_netman,gmc_v_wallman]}, diff --git a/src/clutch.erl b/src/clutch.erl index ba9e42e..5da7333 100644 --- a/src/clutch.erl +++ b/src/clutch.erl @@ -3,7 +3,7 @@ %%% @end -module(clutch). --vsn("0.4.1"). +-vsn("0.5.0"). -behavior(application). -author("Craig Everett "). -copyright("QPQ AG "). diff --git a/src/gmc_con.erl b/src/gmc_con.erl index a1a2ff4..5d9b1e6 100644 --- a/src/gmc_con.erl +++ b/src/gmc_con.erl @@ -3,7 +3,7 @@ %%% @end -module(gmc_con). --vsn("0.4.1"). +-vsn("0.5.0"). -author("Craig Everett "). -copyright("QPQ AG "). -license("GPL-3.0-or-later"). @@ -187,16 +187,21 @@ dry_run(ConID, TX) -> gen_server:cast(?MODULE, {dry_run, ConID, TX}). --spec deploy(CreatorID, Build, InitArgs) -> Result - when CreatorID :: clutch:id(), - Build :: map(), - InitArgs :: [Arg :: string()], - Result :: {ok, TX_Hash :: clutch:id()} - | {error, Reason}, - Reason :: term(). % FIXME +-spec deploy(Build, Params, InitArgs) -> Result + when Build :: map(), + Params :: {PK :: clutch:id(), + Nonce :: non_neg_integer(), + TTL :: pos_integer(), + GasP :: pos_integer(), + Gas :: pos_integer(), + Amount :: pos_integer()}, + InitArgs :: [Arg :: string()], + Result :: {ok, TX_Hash :: clutch:id()} + | {error, Reason}, + Reason :: term(). % FIXME -deploy(CreatorID, Build, InitArgs) -> - gen_server:cast(?MODULE, {deploy, CreatorID, Build, InitArgs}). +deploy(Build, Params, InitArgs) -> + gen_server:cast(?MODULE, {deploy, Build, Params, InitArgs}). -spec make_key(Type, Size, Name, Seed, Encoding, Transform) -> ok @@ -416,8 +421,8 @@ handle_cast({sign_call, ConID, PubKey, TX}, State) -> handle_cast({dry_run, ConID, TX}, State) -> ok = do_dry_run(ConID, TX), {noreply, State}; -handle_cast({deploy, CreatorID, Build, InitArgs}, State) -> - ok = do_deploy(CreatorID, Build, InitArgs, State), +handle_cast({deploy, Build, Params, InitArgs}, State) -> + ok = do_deploy(Build, Params, InitArgs, State), {noreply, State}; handle_cast({make_key, Name, Seed, Encoding, Transform}, State) -> NewState = do_make_key(Name, Seed, Encoding, Transform, State), @@ -783,7 +788,7 @@ do_dry_run(ConID, TX) -> case hz:dry_run(TX) of {ok, Result} -> gmc_v_devman:dryrun_result(ConID, Result); Other -> gmc_v_devmam:trouble({error, ConID, Other}) -end. + end. do_spend(KeyID, TX, State = #s{wallet = #wallet{keys = Keys}}) -> @@ -978,12 +983,14 @@ do_mnemonic(ID, #s{wallet = #wallet{keys = Keys}}) -> end. -do_deploy(CreatorID, - Build, +do_deploy(Build, + {PubKey, Nonce, TTL, GasPrice, Gas, Amount}, InitArgs, #s{wallet = #wallet{keys = Keys, chain_id = ChainID}}) -> - #key{pair = #{secret := SecKey}} = lists:keyfind(CreatorID, #key.id, Keys), - case hz:contract_create_built(CreatorID, Build, InitArgs) of + #key{pair = #{secret := SecKey}} = lists:keyfind(PubKey, #key.id, Keys), + case hz:contract_create_built(PubKey, + Nonce, Amount, TTL, Gas, GasPrice, + Build, InitArgs) of {ok, CreateTX} -> do_deploy2(SecKey, CreateTX, ChainID); Error -> gmc_v_devman:trouble(Error) end. diff --git a/src/gmc_grids.erl b/src/gmc_grids.erl index c74274b..f597a85 100644 --- a/src/gmc_grids.erl +++ b/src/gmc_grids.erl @@ -37,7 +37,7 @@ %%% @end -module(gmc_grids). --vsn("0.4.1"). +-vsn("0.5.0"). -author("Craig Everett "). -copyright("QPQ AG "). -license("GPL-3.0-or-later"). diff --git a/src/gmc_gui.erl b/src/gmc_gui.erl index eacd5c9..7491ad7 100644 --- a/src/gmc_gui.erl +++ b/src/gmc_gui.erl @@ -3,7 +3,7 @@ %%% @end -module(gmc_gui). --vsn("0.4.1"). +-vsn("0.5.0"). -author("Craig Everett "). -copyright("QPQ AG "). -license("GPL-3.0-or-later"). diff --git a/src/gmc_jt.erl b/src/gmc_jt.erl index 2040ed4..39f39e2 100644 --- a/src/gmc_jt.erl +++ b/src/gmc_jt.erl @@ -15,7 +15,7 @@ %%% translation library is retained). -module(gmc_jt). --vsn("0.4.1"). +-vsn("0.5.0"). -export([read_translations/1, j/2, oneshot_j/2]). diff --git a/src/gmc_key_master.erl b/src/gmc_key_master.erl index 18666be..01db215 100644 --- a/src/gmc_key_master.erl +++ b/src/gmc_key_master.erl @@ -8,7 +8,7 @@ %%% @end -module(gmc_key_master). --vsn("0.4.1"). +-vsn("0.5.0"). -export([make_key/2, encode/1, decode/1]). diff --git a/src/gmc_sup.erl b/src/gmc_sup.erl index e3f835a..1e4770e 100644 --- a/src/gmc_sup.erl +++ b/src/gmc_sup.erl @@ -12,7 +12,7 @@ %%% @end -module(gmc_sup). --vsn("0.4.1"). +-vsn("0.5.0"). -behaviour(supervisor). -author("Craig Everett "). -copyright("QPQ AG "). diff --git a/src/gmc_v.erl b/src/gmc_v.erl index 6a6c040..135eb46 100644 --- a/src/gmc_v.erl +++ b/src/gmc_v.erl @@ -1,5 +1,5 @@ -module(gmc_v). --vsn("0.4.1"). +-vsn("0.5.0"). -author("Craig Everett "). -copyright("QPQ AG "). -license("GPL-3.0-or-later"). diff --git a/src/gmc_v_devman.erl b/src/gmc_v_devman.erl index 308634f..06cb38f 100644 --- a/src/gmc_v_devman.erl +++ b/src/gmc_v_devman.erl @@ -1,5 +1,5 @@ -module(gmc_v_devman). --vsn("0.4.1"). +-vsn("0.5.0"). -author("Craig Everett "). -copyright("QPQ AG "). -license("GPL-3.0-or-later"). @@ -312,11 +312,6 @@ 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, Label = case element(2, Name) of call -> "Contract Call"; @@ -328,31 +323,7 @@ clicked3(State = #s{frame = Frame, j = J}, Contract, Name, Selected, Keys) -> 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)), + {ParamSz, TTL_Tx, GasP_Tx, Gas_Tx, Amount_Tx} = call_param_sizer(Dialog, J), ButtSz = wxBoxSizer:new(?wxHORIZONTAL), Affirm = wxButton:new(Dialog, ?wxID_OK), Cancel = wxButton:new(Dialog, ?wxID_CANCEL), @@ -392,6 +363,39 @@ clicked3(State = #s{frame = Frame, j = J}, Contract, Name, Selected, Keys) -> Error -> handle_troubling(State, Error) end. +call_param_sizer(Dialog, J) -> + {ok, Height} = hz:top_height(), + DefTTL = Height + 10000, + DefGasP = hz:min_gas_price(), + DefGas = 5000000, + DefAmount = 0, + 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)), + {ParamSz, TTL_Tx, GasP_Tx, Gas_Tx, Amount_Tx}. + call_params(Controls) -> call_params(Controls, []). @@ -613,14 +617,16 @@ deploy4(State = #s{frame = Frame, j = J}, Build = #{aci := ACI}, Selected, Keys) Dialog = wxDialog:new(Frame, ?wxID_ANY, J("Deploy Contract")), Sizer = wxBoxSizer:new(?wxVERTICAL), ScrollWin = wxScrolledWindow:new(Dialog), - FunName = unicode:characters_to_list(["init/", integer_to_list(length(As))]), - FunSizer = wxStaticBoxSizer:new(?wxVERTICAL, ScrollWin, [{label, FunName}]), - ok = wxScrolledWindow:setSizerAndFit(ScrollWin, FunSizer), + ScrollSz = wxBoxSizer:new(?wxVERTICAL), + ok = wxScrolledWindow:setSizerAndFit(ScrollWin, ScrollSz), ok = wxScrolledWindow:setScrollRate(ScrollWin, 5, 5), - KeySz = wxStaticBoxSizer:new(?wxVERTICAL, Dialog, [{label, J("Signature Key")}]), - KeyPicker = wxChoice:new(Dialog, ?wxID_ANY, [{choices, Keys}]), + FunName = unicode:characters_to_list(["init/", integer_to_list(length(As))]), + 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)), ok = wxChoice:setSelection(KeyPicker, Selected - 1), + {ParamSz, TTL_Tx, GasP_Tx, Gas_Tx, Amount_Tx} = call_param_sizer(ScrollWin, J), ButtSz = wxBoxSizer:new(?wxHORIZONTAL), Affirm = wxButton:new(Dialog, ?wxID_OK), Cancel = wxButton:new(Dialog, ?wxID_CANCEL), @@ -647,33 +653,48 @@ deploy4(State = #s{frame = Frame, j = J}, Build = #{aci := ACI}, Selected, Keys) {ANT, TCT, Type} end, ArgFields = lists:map(MakeArgField, As), - _ = wxStaticBoxSizer:add(FunSizer, GridSz, zxw:flags(wide)), + _ = 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, KeySz, [{proportion, 0}, {flag, ?wxEXPAND}]), _ = wxSizer:add(Sizer, ButtSz, [{proportion, 1}, {flag, ?wxEXPAND}]), ok = wxDialog:setSizer(Dialog, Sizer), ok = wxBoxSizer:layout(Sizer), - ok = wxDialog:setSize(Dialog, {500, 300}), + ok = wxDialog:setSize(Dialog, {500, 500}), 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), - Inputs = lists:map(fun get_arg/1, ArgFields), - {ok, BinID, Inputs}; + PK = unicode:characters_to_binary(ID), + InitArgs = lists:map(fun get_arg/1, ArgFields), + 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), + DeployParams = {PK, Nonce, TTL, GasP, Gas, Amount}, + {ok, DeployParams, InitArgs}; + E -> + E + end; ?wxID_CANCEL -> cancel end, ok = wxDialog:destroy(Dialog), case Outcome of - {ok, SigID, Args} -> deploy5(State, SigID, Build, Args); - cancel -> State + {ok, Params, Args} -> deploy5(State, Build, Params, Args); + cancel -> State; + Error -> handle_troubling(State, Error) end. -deploy5(State, SigID, Build, Args) -> +deploy5(State, Build, Params, Args) -> tell(info, "Build: ~p", [Build]), - ok = gmc_con:deploy(SigID, Build, Args), + ok = gmc_con:deploy(Build, Params, Args), State. diff --git a/src/gmc_v_netman.erl b/src/gmc_v_netman.erl index 1d9e58f..c716c83 100644 --- a/src/gmc_v_netman.erl +++ b/src/gmc_v_netman.erl @@ -1,5 +1,5 @@ -module(gmc_v_netman). --vsn("0.4.1"). +-vsn("0.5.0"). -author("Craig Everett "). -copyright("QPQ AG "). -license("GPL-3.0-or-later"). diff --git a/src/gmc_v_wallman.erl b/src/gmc_v_wallman.erl index 1dc6016..153183d 100644 --- a/src/gmc_v_wallman.erl +++ b/src/gmc_v_wallman.erl @@ -1,5 +1,5 @@ -module(gmc_v_wallman). --vsn("0.4.1"). +-vsn("0.5.0"). -author("Craig Everett "). -copyright("QPQ AG "). -license("GPL-3.0-or-later"). diff --git a/zomp.meta b/zomp.meta index 3b2420e..12e241d 100644 --- a/zomp.meta +++ b/zomp.meta @@ -2,12 +2,12 @@ {type,gui}. {modules,[]}. {prefix,"gmc"}. -{desc,"A desktop client for the Gajumaru network of blockchain networks"}. {author,"Craig Everett"}. -{package_id,{"otpr","clutch",{0,4,1}}}. -{deps,[{"otpr","gmserialization",{0,1,3}}, +{desc,"A desktop client for the Gajumaru network of blockchain networks"}. +{package_id,{"otpr","clutch",{0,5,0}}}. +{deps,[{"otpr","hakuzaru",{0,4,0}}, + {"otpr","gmserialization",{0,1,3}}, {"otpr","sophia",{9,0,0}}, - {"otpr","hakuzaru",{0,3,0}}, {"otpr","gmbytecode",{3,4,1}}, {"otpr","lom",{1,0,0}}, {"otpr","zj",{1,1,0}},