diff --git a/src/gmc_con.erl b/src/gmc_con.erl index da15d6e..1b74c10 100644 --- a/src/gmc_con.erl +++ b/src/gmc_con.erl @@ -12,7 +12,7 @@ -behavior(gen_server). -export([show_ui/1, - open_wallet/2, close_wallet/0, password/2, + open_wallet/2, close_wallet/0, password/2, refresh/0, nonce/1, spend/2, chain/1, grids/1, make_key/6, recover_key/1, mnemonic/1, rename_key/2, drop_key/1, add_node/1, set_sole_node/1]). @@ -80,13 +80,19 @@ password(Old, New) -> gen_server:cast(?MODULE, {password, Old, New}). +-spec refresh() -> ok. + +refresh() -> + gen_server:cast(?MODULE, refresh). + + -spec nonce(ID) -> {ok, Nonce} | {error, Reason} when ID :: clutch:id(), Nonce :: integer(), Reason :: term(). % FIXME -% FIXME -nonce(_) -> {ok, 42}. +nonce(ID) -> + gen_server:call(?MODULE, {nonce, ID}). -spec spend(KeyID, TX) -> ok @@ -253,6 +259,9 @@ read_prefs() -> %% The gen_server:handle_call/3 callback. %% See: http://erlang.org/doc/man/gen_server.html#Module:handle_call-3 +handle_call({nonce, ID}, _, State) -> + Response = do_nonce(ID), + {reply, Response, State}; handle_call({save, Prefs}, _, State) -> Response = do_save(State#s{prefs = Prefs}), {reply, Response, State}; @@ -284,6 +293,9 @@ handle_cast({open_wallet, Path, Phrase}, State) -> handle_cast({password, Old, New}, State) -> NewState = do_password(Old, New, State), {noreply, NewState}; +handle_cast(refresh, State) -> + NewState = do_refresh(State), + {noreply, NewState}; handle_cast({spend, KeyID, TX}, State) -> ok = do_spend(KeyID, TX, State), {noreply, State}; @@ -525,12 +537,50 @@ do_add_node(New, State) -> % FIXME: This will, of course, totally explode if anything goes wrong do_set_sole_node(TOTN = #node{external = none}, State) -> do_set_sole_node(TOTN#node{external = 3013}, State); -do_set_sole_node(#node{ip = Address, external = Port}, State) -> - ok = hz:chain_nodes([{Address, Port}]), - {ok, Status = #{"network_id" := NetworkID}} = hz:status(), - ok = hz:network_id(NetworkID), - tell("Status: ~p", [Status]), - State. +do_set_sole_node(New, State = #s{wallet = W}) -> + ChainID = ensure_hz_set(New), + Net = #net{id = ChainID, chains = [#chain{id = ChainID, nodes = [New]}]}, + NewWallet = W#wallet{chain_id = ChainID, endpoint = New, nets = [Net]}, + NewState = State#s{wallet = NewWallet}, + do_refresh(NewState). + + +do_refresh(State = #s{wallet = W = #wallet{poas = POAs, endpoint = Node}}) -> + ChainID = ensure_hz_set(Node), + CheckBalance = + fun(This = #poa{id = ID}) -> + Pucks = + case hz:acc(ID) of + {ok, #{"balance" := P}} -> P; + {error, "Account not found"} -> 0 + end, + Dist = [{ChainID, Pucks}], + Gaju = #balance{coin = "gaju", total = Pucks, dist = Dist}, + This#poa{balances = [Gaju]} + end, + NewPOAs = lists:map(CheckBalance, POAs), + ok = gmc_gui:show(NewPOAs), + NewW = W#wallet{chain_id = ChainID, poas = NewPOAs}, + State#s{wallet = NewW}. + + +ensure_hz_set(Node = #node{ip = IP, external = Port}) -> + case hz:status() of + {ok, #{"network_id" := ChainID}} -> + list_to_binary(ChainID); + {error, no_nodes} -> + ok = hz:chain_nodes([{IP, Port}]), + {ok, #{"network_id" := C}} = hz:status(), + ChainID = list_to_binary(C), + ok = hz:network_id(ChainID), + ok = gmc_gui:chain(ChainID, Node), + ChainID + end. + + +%ensure_connected(ChainID, IP, Port) -> +% ok = hz:chain_nodes([{IP, Port}]), +% ok = hz:network_id(ChainID). encrypt(Pass, Binary) -> @@ -599,6 +649,7 @@ do_password(Old, New, State = #s{wallet = #wallet{pass = Pass}}) -> do_spend(KeyID, TX, State = #s{wallet = #wallet{keys = Keys}}) -> + tell("SpendTX: ~p", [TX]), case lists:keyfind(KeyID, #key.id, Keys) of #key{pair = #{secret := PrivKey}} -> do_spend2(PrivKey, TX, State); @@ -649,7 +700,13 @@ do_spend2(PrivKey, {transaction, NetworkTX}], SignedTX = aeser_chain_objects:serialize(SigTxType, SigTxVsn, SigTemplate, TX_Data), Encoded = aeser_api_encoder:encode(transaction, SignedTX), - tell("SpendTX: ~p", [Encoded]). + tell("SpendTX: ~p", [Encoded]), + Outcome = hz:post_tx(Encoded), + tell("Outcome: ~p", [Outcome]). + + +do_nonce(ID) -> + hz:next_nonce(ID). do_save(Label, Pref, State = #s{prefs = Prefs}) -> diff --git a/src/gmc_gui.erl b/src/gmc_gui.erl index 6e3e3e2..f2a7b30 100644 --- a/src/gmc_gui.erl +++ b/src/gmc_gui.erl @@ -301,6 +301,7 @@ handle_event(#wx{event = #wxCommand{type = command_button_clicked}, #w{name = www} -> www(State); #w{name = send} -> spend(State); #w{name = grids} -> grids_dialogue(State); + #w{name = refresh} -> refresh(State); #w{name = Name} -> handle_button(Name, State); false -> State end, @@ -344,6 +345,11 @@ terminate(Reason, State) -> %%% Doers +refresh(State) -> + ok = gmc_con:refresh(), + State. + + netman(State) -> ok = gmc_con:show_ui(gmc_v_netman), State.