WIP
This commit is contained in:
parent
7c78aa00d7
commit
c03a2d1f41
@ -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}) ->
|
||||||
|
@ -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.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user