This commit is contained in:
Craig Everett 2024-10-24 15:27:54 +09:00
parent 7c78aa00d7
commit c03a2d1f41
2 changed files with 73 additions and 10 deletions

View File

@ -12,7 +12,7 @@
-behavior(gen_server). -behavior(gen_server).
-export([show_ui/1, -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, nonce/1, spend/2, chain/1, grids/1,
make_key/6, recover_key/1, mnemonic/1, rename_key/2, drop_key/1, make_key/6, recover_key/1, mnemonic/1, rename_key/2, drop_key/1,
add_node/1, set_sole_node/1]). add_node/1, set_sole_node/1]).
@ -80,13 +80,19 @@ password(Old, New) ->
gen_server:cast(?MODULE, {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} -spec nonce(ID) -> {ok, Nonce} | {error, Reason}
when ID :: clutch:id(), when ID :: clutch:id(),
Nonce :: integer(), Nonce :: integer(),
Reason :: term(). % FIXME Reason :: term(). % FIXME
% FIXME
nonce(_) -> {ok, 42}. nonce(ID) ->
gen_server:call(?MODULE, {nonce, ID}).
-spec spend(KeyID, TX) -> ok -spec spend(KeyID, TX) -> ok
@ -253,6 +259,9 @@ read_prefs() ->
%% The gen_server:handle_call/3 callback. %% The gen_server:handle_call/3 callback.
%% See: http://erlang.org/doc/man/gen_server.html#Module:handle_call-3 %% 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) -> handle_call({save, Prefs}, _, State) ->
Response = do_save(State#s{prefs = Prefs}), Response = do_save(State#s{prefs = Prefs}),
{reply, Response, State}; {reply, Response, State};
@ -284,6 +293,9 @@ handle_cast({open_wallet, Path, Phrase}, State) ->
handle_cast({password, Old, New}, State) -> handle_cast({password, Old, New}, State) ->
NewState = do_password(Old, New, State), NewState = do_password(Old, New, State),
{noreply, NewState}; {noreply, NewState};
handle_cast(refresh, State) ->
NewState = do_refresh(State),
{noreply, NewState};
handle_cast({spend, KeyID, TX}, State) -> handle_cast({spend, KeyID, TX}, State) ->
ok = do_spend(KeyID, TX, State), ok = do_spend(KeyID, TX, State),
{noreply, State}; {noreply, State};
@ -525,12 +537,50 @@ do_add_node(New, State) ->
% FIXME: This will, of course, totally explode if anything goes wrong % 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 = none}, State) ->
do_set_sole_node(TOTN#node{external = 3013}, State); do_set_sole_node(TOTN#node{external = 3013}, State);
do_set_sole_node(#node{ip = Address, external = Port}, State) -> do_set_sole_node(New, State = #s{wallet = W}) ->
ok = hz:chain_nodes([{Address, Port}]), ChainID = ensure_hz_set(New),
{ok, Status = #{"network_id" := NetworkID}} = hz:status(), Net = #net{id = ChainID, chains = [#chain{id = ChainID, nodes = [New]}]},
ok = hz:network_id(NetworkID), NewWallet = W#wallet{chain_id = ChainID, endpoint = New, nets = [Net]},
tell("Status: ~p", [Status]), NewState = State#s{wallet = NewWallet},
State. 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) -> 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}}) -> do_spend(KeyID, TX, State = #s{wallet = #wallet{keys = Keys}}) ->
tell("SpendTX: ~p", [TX]),
case lists:keyfind(KeyID, #key.id, Keys) of case lists:keyfind(KeyID, #key.id, Keys) of
#key{pair = #{secret := PrivKey}} -> #key{pair = #{secret := PrivKey}} ->
do_spend2(PrivKey, TX, State); do_spend2(PrivKey, TX, State);
@ -649,7 +700,13 @@ do_spend2(PrivKey,
{transaction, NetworkTX}], {transaction, NetworkTX}],
SignedTX = aeser_chain_objects:serialize(SigTxType, SigTxVsn, SigTemplate, TX_Data), SignedTX = aeser_chain_objects:serialize(SigTxType, SigTxVsn, SigTemplate, TX_Data),
Encoded = aeser_api_encoder:encode(transaction, SignedTX), 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}) -> do_save(Label, Pref, State = #s{prefs = Prefs}) ->

View File

@ -301,6 +301,7 @@ handle_event(#wx{event = #wxCommand{type = command_button_clicked},
#w{name = www} -> www(State); #w{name = www} -> www(State);
#w{name = send} -> spend(State); #w{name = send} -> spend(State);
#w{name = grids} -> grids_dialogue(State); #w{name = grids} -> grids_dialogue(State);
#w{name = refresh} -> refresh(State);
#w{name = Name} -> handle_button(Name, State); #w{name = Name} -> handle_button(Name, State);
false -> State false -> State
end, end,
@ -344,6 +345,11 @@ terminate(Reason, State) ->
%%% Doers %%% Doers
refresh(State) ->
ok = gmc_con:refresh(),
State.
netman(State) -> netman(State) ->
ok = gmc_con:show_ui(gmc_v_netman), ok = gmc_con:show_ui(gmc_v_netman),
State. State.