| 
									
										
										
										
											2014-10-23 15:48:53 +02:00
										 |  |  | // Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // This library is free software; you can redistribute it and/or | 
					
						
							|  |  |  | // modify it under the terms of the GNU General Public | 
					
						
							|  |  |  | // License as published by the Free Software Foundation; either | 
					
						
							|  |  |  | // version 2.1 of the License, or (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // This library is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
					
						
							|  |  |  | // General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  | // along with this library; if not, write to the Free Software | 
					
						
							|  |  |  | // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | 
					
						
							|  |  |  | // MA 02110-1301  USA | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-02 00:13:50 +02:00
										 |  |  | package main | 
					
						
							| 
									
										
										
										
											2014-02-21 12:37:40 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-14 00:13:47 +02:00
										 |  |  | import "C" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-21 12:37:40 +01:00
										 |  |  | import ( | 
					
						
							| 
									
										
										
										
											2014-02-25 10:54:37 +01:00
										 |  |  | 	"bytes" | 
					
						
							| 
									
										
										
										
											2014-08-20 10:00:02 +02:00
										 |  |  | 	"encoding/json" | 
					
						
							| 
									
										
										
										
											2014-02-21 12:37:40 +01:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2014-07-30 00:30:57 +02:00
										 |  |  | 	"math/big" | 
					
						
							| 
									
										
										
										
											2014-09-08 00:50:25 +02:00
										 |  |  | 	"path" | 
					
						
							| 
									
										
										
										
											2014-08-23 11:00:15 +02:00
										 |  |  | 	"runtime" | 
					
						
							| 
									
										
										
										
											2014-07-30 00:30:57 +02:00
										 |  |  | 	"strconv" | 
					
						
							|  |  |  | 	"strings" | 
					
						
							|  |  |  | 	"time" | 
					
						
							| 
									
										
										
										
											2014-09-14 13:28:28 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-23 15:01:27 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum" | 
					
						
							| 
									
										
										
										
											2014-10-31 10:59:17 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/chain" | 
					
						
							| 
									
										
										
										
											2014-10-23 15:01:27 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/ethdb" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/ethutil" | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/logger" | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/miner" | 
					
						
							| 
									
										
										
										
											2014-10-31 14:53:42 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/wire" | 
					
						
							| 
									
										
										
										
											2014-10-31 14:30:08 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/xeth" | 
					
						
							| 
									
										
										
										
											2014-08-15 13:27:43 +02:00
										 |  |  | 	"gopkg.in/qml.v1" | 
					
						
							| 
									
										
										
										
											2014-02-21 12:37:40 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-14 13:27:20 +02:00
										 |  |  | /* | 
					
						
							| 
									
										
										
										
											2014-09-14 00:13:47 +02:00
										 |  |  | func LoadExtension(path string) (uintptr, error) { | 
					
						
							|  |  |  | 	lib, err := ffi.NewLibrary(path) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return 0, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	so, err := lib.Fct("sharedObject", ffi.Pointer, nil) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return 0, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ptr := so() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		err = lib.Close() | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return 0, err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return ptr.Interface().(uintptr), nil | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-09-14 13:27:20 +02:00
										 |  |  | */ | 
					
						
							| 
									
										
										
										
											2014-11-15 00:29:27 +01:00
										 |  |  | /* | 
					
						
							|  |  |  | 	vec, errr := LoadExtension("/Users/jeffrey/Desktop/build-libqmltest-Desktop_Qt_5_2_1_clang_64bit-Debug/liblibqmltest_debug.dylib") | 
					
						
							|  |  |  | 	fmt.Printf("Fetched vec with addr: %#x\n", vec) | 
					
						
							|  |  |  | 	if errr != nil { | 
					
						
							|  |  |  | 		fmt.Println(errr) | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		context.SetVar("vec", (unsafe.Pointer)(vec)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2014-09-14 00:13:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | var guilogger = logger.NewLogger("GUI") | 
					
						
							| 
									
										
										
										
											2014-06-23 11:41:11 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-21 12:37:40 +01:00
										 |  |  | type Gui struct { | 
					
						
							| 
									
										
										
										
											2014-02-22 23:19:38 +01:00
										 |  |  | 	// The main application window | 
					
						
							|  |  |  | 	win *qml.Window | 
					
						
							|  |  |  | 	// QML Engine | 
					
						
							| 
									
										
										
										
											2014-02-21 12:37:40 +01:00
										 |  |  | 	engine    *qml.Engine | 
					
						
							|  |  |  | 	component *qml.Common | 
					
						
							| 
									
										
										
										
											2014-08-12 11:02:33 +02:00
										 |  |  | 	qmlDone   bool | 
					
						
							| 
									
										
										
										
											2014-02-22 23:19:38 +01:00
										 |  |  | 	// The ethereum interface | 
					
						
							|  |  |  | 	eth *eth.Ethereum | 
					
						
							| 
									
										
										
										
											2014-02-21 17:29:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-22 23:19:38 +01:00
										 |  |  | 	// The public Ethereum library | 
					
						
							| 
									
										
										
										
											2014-05-12 13:56:29 +02:00
										 |  |  | 	uiLib *UiLib | 
					
						
							| 
									
										
										
										
											2014-02-25 10:54:37 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	txDb *ethdb.LDBDatabase | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 	logLevel logger.LogLevel | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 	open     bool | 
					
						
							| 
									
										
										
										
											2014-06-29 20:38:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 14:30:08 +01:00
										 |  |  | 	pipe *xeth.JSXEth | 
					
						
							| 
									
										
										
										
											2014-08-15 13:16:07 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-03 17:35:48 +01:00
										 |  |  | 	Session        string | 
					
						
							| 
									
										
										
										
											2014-10-31 14:53:42 +01:00
										 |  |  | 	clientIdentity *wire.SimpleClientIdentity | 
					
						
							| 
									
										
										
										
											2014-07-03 17:35:48 +01:00
										 |  |  | 	config         *ethutil.ConfigManager | 
					
						
							| 
									
										
										
										
											2014-07-18 12:01:26 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-20 10:00:02 +02:00
										 |  |  | 	plugins map[string]plugin | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 	miner  *miner.Miner | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 	stdLog logger.LogSystem | 
					
						
							| 
									
										
										
										
											2014-02-21 12:37:40 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-22 23:19:38 +01:00
										 |  |  | // Create GUI, but doesn't start it | 
					
						
							| 
									
										
										
										
											2014-10-31 14:53:42 +01:00
										 |  |  | func NewWindow(ethereum *eth.Ethereum, config *ethutil.ConfigManager, clientIdentity *wire.SimpleClientIdentity, session string, logLevel int) *Gui { | 
					
						
							| 
									
										
										
										
											2014-02-25 10:54:37 +01:00
										 |  |  | 	db, err := ethdb.NewLDBDatabase("tx_database") | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		panic(err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-21 17:29:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 14:30:08 +01:00
										 |  |  | 	pipe := xeth.NewJSXEth(ethereum) | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 	gui := &Gui{eth: ethereum, txDb: db, pipe: pipe, logLevel: logger.LogLevel(logLevel), Session: session, open: false, clientIdentity: clientIdentity, config: config, plugins: make(map[string]plugin)} | 
					
						
							| 
									
										
										
										
											2014-09-08 00:50:25 +02:00
										 |  |  | 	data, _ := ethutil.ReadAllFile(path.Join(ethutil.Config.ExecPath, "plugins.json")) | 
					
						
							| 
									
										
										
										
											2014-08-20 10:00:02 +02:00
										 |  |  | 	json.Unmarshal([]byte(data), &gui.plugins) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return gui | 
					
						
							| 
									
										
										
										
											2014-02-21 12:37:40 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-08 18:24:28 +02:00
										 |  |  | func (gui *Gui) Start(assetPath string) { | 
					
						
							|  |  |  | 	defer gui.txDb.Close() | 
					
						
							| 
									
										
										
										
											2014-02-25 10:54:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-15 00:29:27 +01:00
										 |  |  | 	guilogger.Infoln("Starting GUI") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-22 23:19:38 +01:00
										 |  |  | 	// Register ethereum functions | 
					
						
							|  |  |  | 	qml.RegisterTypes("Ethereum", 1, 0, []qml.TypeSpec{{ | 
					
						
							| 
									
										
										
										
											2014-10-31 14:30:08 +01:00
										 |  |  | 		Init: func(p *xeth.JSBlock, obj qml.Object) { p.Number = 0; p.Hash = "" }, | 
					
						
							| 
									
										
										
										
											2014-02-23 01:56:04 +01:00
										 |  |  | 	}, { | 
					
						
							| 
									
										
										
										
											2014-10-31 14:30:08 +01:00
										 |  |  | 		Init: func(p *xeth.JSTransaction, obj qml.Object) { p.Value = ""; p.Hash = ""; p.Address = "" }, | 
					
						
							| 
									
										
										
										
											2014-06-04 15:54:33 +02:00
										 |  |  | 	}, { | 
					
						
							| 
									
										
										
										
											2014-10-31 14:30:08 +01:00
										 |  |  | 		Init: func(p *xeth.KeyVal, obj qml.Object) { p.Key = ""; p.Value = "" }, | 
					
						
							| 
									
										
										
										
											2014-02-21 12:37:40 +01:00
										 |  |  | 	}}) | 
					
						
							| 
									
										
										
										
											2014-02-22 23:19:38 +01:00
										 |  |  | 	// Create a new QML engine | 
					
						
							| 
									
										
										
										
											2014-05-08 18:24:28 +02:00
										 |  |  | 	gui.engine = qml.NewEngine() | 
					
						
							|  |  |  | 	context := gui.engine.Context() | 
					
						
							| 
									
										
										
										
											2014-08-12 12:16:21 +02:00
										 |  |  | 	gui.uiLib = NewUiLib(gui.engine, gui.eth, assetPath) | 
					
						
							| 
									
										
										
										
											2014-03-05 10:44:33 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Expose the eth library and the ui library to QML | 
					
						
							| 
									
										
										
										
											2014-08-12 12:16:21 +02:00
										 |  |  | 	context.SetVar("gui", gui) | 
					
						
							|  |  |  | 	context.SetVar("eth", gui.uiLib) | 
					
						
							| 
									
										
										
										
											2014-02-28 16:41:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-22 23:19:38 +01:00
										 |  |  | 	// Load the main QML interface | 
					
						
							| 
									
										
										
										
											2014-04-10 14:53:12 -04:00
										 |  |  | 	data, _ := ethutil.Config.Db.Get([]byte("KeyRing")) | 
					
						
							| 
									
										
										
										
											2014-05-12 13:56:29 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	var win *qml.Window | 
					
						
							| 
									
										
										
										
											2014-04-10 14:53:12 -04:00
										 |  |  | 	var err error | 
					
						
							| 
									
										
										
										
											2014-06-26 12:13:31 +01:00
										 |  |  | 	var addlog = false | 
					
						
							| 
									
										
										
										
											2014-05-12 13:56:29 +02:00
										 |  |  | 	if len(data) == 0 { | 
					
						
							|  |  |  | 		win, err = gui.showKeyImport(context) | 
					
						
							| 
									
										
										
										
											2014-04-10 14:53:12 -04:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2014-05-12 13:56:29 +02:00
										 |  |  | 		win, err = gui.showWallet(context) | 
					
						
							| 
									
										
										
										
											2014-06-26 12:13:31 +01:00
										 |  |  | 		addlog = true | 
					
						
							| 
									
										
										
										
											2014-04-10 14:53:12 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-21 12:37:40 +01:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 		guilogger.Errorln("asset not found: you can set an alternative asset path on the command line using option 'asset_path'", err) | 
					
						
							| 
									
										
										
										
											2014-04-23 11:51:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-21 12:37:40 +01:00
										 |  |  | 		panic(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-26 16:26:14 +01:00
										 |  |  | 	gui.open = true | 
					
						
							| 
									
										
										
										
											2014-05-31 11:34:37 +02:00
										 |  |  | 	win.Show() | 
					
						
							| 
									
										
										
										
											2014-08-12 12:21:50 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 	// only add the gui guilogger after window is shown otherwise slider wont be shown | 
					
						
							| 
									
										
										
										
											2014-06-26 12:13:31 +01:00
										 |  |  | 	if addlog { | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 		logger.AddLogSystem(gui) | 
					
						
							| 
									
										
										
										
											2014-06-26 12:13:31 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-05-12 13:56:29 +02:00
										 |  |  | 	win.Wait() | 
					
						
							| 
									
										
										
										
											2014-08-12 12:21:50 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 	// need to silence gui guilogger after window closed otherwise logsystem hangs (but do not save loglevel) | 
					
						
							|  |  |  | 	gui.logLevel = logger.Silence | 
					
						
							| 
									
										
										
										
											2014-06-26 16:26:14 +01:00
										 |  |  | 	gui.open = false | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (gui *Gui) Stop() { | 
					
						
							|  |  |  | 	if gui.open { | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 		gui.logLevel = logger.Silence | 
					
						
							| 
									
										
										
										
											2014-06-26 16:26:14 +01:00
										 |  |  | 		gui.open = false | 
					
						
							|  |  |  | 		gui.win.Hide() | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-08-11 16:24:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-12 12:16:21 +02:00
										 |  |  | 	gui.uiLib.jsEngine.Stop() | 
					
						
							| 
									
										
										
										
											2014-08-11 16:24:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 	guilogger.Infoln("Stopped") | 
					
						
							| 
									
										
										
										
											2014-05-12 13:56:29 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-02-22 01:52:47 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-12 13:56:29 +02:00
										 |  |  | func (gui *Gui) showWallet(context *qml.Context) (*qml.Window, error) { | 
					
						
							| 
									
										
										
										
											2014-09-26 13:38:40 +02:00
										 |  |  | 	component, err := gui.engine.LoadFile(gui.uiLib.AssetPath("qml/main.qml")) | 
					
						
							| 
									
										
										
										
											2014-05-12 13:56:29 +02:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							| 
									
										
										
										
											2014-04-10 14:53:12 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-21 12:37:40 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-12 11:02:33 +02:00
										 |  |  | 	gui.win = gui.createWindow(component) | 
					
						
							| 
									
										
										
										
											2014-05-30 13:04:23 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-15 01:13:39 +01:00
										 |  |  | 	gui.update() | 
					
						
							| 
									
										
										
										
											2014-05-12 13:56:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-12 11:02:33 +02:00
										 |  |  | 	return gui.win, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // The done handler will be called by QML when all views have been loaded | 
					
						
							|  |  |  | func (gui *Gui) Done() { | 
					
						
							|  |  |  | 	gui.qmlDone = true | 
					
						
							| 
									
										
										
										
											2014-05-12 13:56:29 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-25 10:41:57 +02:00
										 |  |  | func (gui *Gui) ImportKey(filePath string) { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-12 13:56:29 +02:00
										 |  |  | func (gui *Gui) showKeyImport(context *qml.Context) (*qml.Window, error) { | 
					
						
							| 
									
										
										
										
											2014-06-29 20:38:26 +01:00
										 |  |  | 	context.SetVar("lib", gui) | 
					
						
							| 
									
										
										
										
											2014-05-12 13:56:29 +02:00
										 |  |  | 	component, err := gui.engine.LoadFile(gui.uiLib.AssetPath("qml/first_run.qml")) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return gui.createWindow(component), nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (gui *Gui) createWindow(comp qml.Object) *qml.Window { | 
					
						
							|  |  |  | 	win := comp.CreateWindow(nil) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	gui.win = win | 
					
						
							|  |  |  | 	gui.uiLib.win = win | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return gui.win | 
					
						
							| 
									
										
										
										
											2014-02-21 12:37:40 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-06-29 20:38:26 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (gui *Gui) ImportAndSetPrivKey(secret string) bool { | 
					
						
							|  |  |  | 	err := gui.eth.KeyManager().InitFromString(gui.Session, 0, secret) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 		guilogger.Errorln("unable to import: ", err) | 
					
						
							| 
									
										
										
										
											2014-06-29 20:38:26 +01:00
										 |  |  | 		return false | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 	guilogger.Errorln("successfully imported: ", err) | 
					
						
							| 
									
										
										
										
											2014-06-29 20:38:26 +01:00
										 |  |  | 	return true | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (gui *Gui) CreateAndSetPrivKey() (string, string, string, string) { | 
					
						
							|  |  |  | 	err := gui.eth.KeyManager().Init(gui.Session, 0, true) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 		guilogger.Errorln("unable to create key: ", err) | 
					
						
							| 
									
										
										
										
											2014-06-29 20:38:26 +01:00
										 |  |  | 		return "", "", "", "" | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return gui.eth.KeyManager().KeyPair().AsStrings() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-15 00:29:27 +01:00
										 |  |  | func (gui *Gui) setInitialChain(ancientBlocks bool) { | 
					
						
							| 
									
										
										
										
											2014-10-20 12:03:31 +02:00
										 |  |  | 	sBlk := gui.eth.ChainManager().LastBlockHash | 
					
						
							|  |  |  | 	blk := gui.eth.ChainManager().GetBlock(sBlk) | 
					
						
							|  |  |  | 	for ; blk != nil; blk = gui.eth.ChainManager().GetBlock(sBlk) { | 
					
						
							| 
									
										
										
										
											2014-05-27 10:29:39 +02:00
										 |  |  | 		sBlk = blk.PrevHash | 
					
						
							| 
									
										
										
										
											2014-06-03 11:48:44 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-27 11:49:42 +02:00
										 |  |  | 		gui.processBlock(blk, true) | 
					
						
							| 
									
										
										
										
											2014-02-21 13:06:17 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-30 11:50:30 +02:00
										 |  |  | func (gui *Gui) loadAddressBook() { | 
					
						
							| 
									
										
										
										
											2014-08-12 11:02:33 +02:00
										 |  |  | 	view := gui.getObjectByName("infoView") | 
					
						
							| 
									
										
										
										
											2014-08-15 13:16:07 +02:00
										 |  |  | 	nameReg := gui.pipe.World().Config().Get("NameReg") | 
					
						
							| 
									
										
										
										
											2014-07-01 20:10:38 +02:00
										 |  |  | 	if nameReg != nil { | 
					
						
							| 
									
										
										
										
											2014-07-21 11:55:50 +02:00
										 |  |  | 		nameReg.EachStorage(func(name string, value *ethutil.Value) { | 
					
						
							| 
									
										
										
										
											2014-07-02 11:29:59 +02:00
										 |  |  | 			if name[0] != 0 { | 
					
						
							| 
									
										
										
										
											2014-07-21 11:55:50 +02:00
										 |  |  | 				value.Decode() | 
					
						
							| 
									
										
										
										
											2014-08-12 11:02:33 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				view.Call("addAddress", struct{ Name, Address string }{name, ethutil.Bytes2Hex(value.Bytes())}) | 
					
						
							| 
									
										
										
										
											2014-07-02 11:29:59 +02:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-05-31 11:34:37 +02:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-05-30 11:50:30 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | func (self *Gui) loadMergedMiningOptions() { | 
					
						
							|  |  |  | 	view := self.getObjectByName("mergedMiningModel") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	nameReg := self.pipe.World().Config().Get("MergeMining") | 
					
						
							|  |  |  | 	if nameReg != nil { | 
					
						
							|  |  |  | 		i := 0 | 
					
						
							|  |  |  | 		nameReg.EachStorage(func(name string, value *ethutil.Value) { | 
					
						
							|  |  |  | 			if name[0] != 0 { | 
					
						
							|  |  |  | 				value.Decode() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				view.Call("addMergedMiningOption", struct { | 
					
						
							|  |  |  | 					Checked       bool | 
					
						
							|  |  |  | 					Name, Address string | 
					
						
							|  |  |  | 					Id, ItemId    int | 
					
						
							|  |  |  | 				}{false, name, ethutil.Bytes2Hex(value.Bytes()), 0, i}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				i++ | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 10:59:17 +01:00
										 |  |  | func (gui *Gui) insertTransaction(window string, tx *chain.Transaction) { | 
					
						
							| 
									
										
										
										
											2014-10-31 14:30:08 +01:00
										 |  |  | 	pipe := xeth.New(gui.eth) | 
					
						
							| 
									
										
										
										
											2014-10-02 17:35:57 +02:00
										 |  |  | 	nameReg := pipe.World().Config().Get("NameReg") | 
					
						
							| 
									
										
										
										
											2014-06-29 20:38:26 +01:00
										 |  |  | 	addr := gui.address() | 
					
						
							| 
									
										
										
										
											2014-02-25 10:54:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-10 14:57:42 +01:00
										 |  |  | 	var inout string | 
					
						
							|  |  |  | 	if bytes.Compare(tx.Sender(), addr) == 0 { | 
					
						
							|  |  |  | 		inout = "send" | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		inout = "recv" | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var ( | 
					
						
							| 
									
										
										
										
											2014-10-31 14:30:08 +01:00
										 |  |  | 		ptx  = xeth.NewJSTx(tx, pipe.World().State()) | 
					
						
							| 
									
										
										
										
											2014-08-10 14:57:42 +01:00
										 |  |  | 		send = nameReg.Storage(tx.Sender()) | 
					
						
							|  |  |  | 		rec  = nameReg.Storage(tx.Recipient) | 
					
						
							|  |  |  | 		s, r string | 
					
						
							|  |  |  | 	) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if tx.CreatesContract() { | 
					
						
							| 
									
										
										
										
											2014-10-02 17:35:57 +02:00
										 |  |  | 		rec = nameReg.Storage(tx.CreationAddress(pipe.World().State())) | 
					
						
							| 
									
										
										
										
											2014-08-10 14:57:42 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if send.Len() != 0 { | 
					
						
							|  |  |  | 		s = strings.Trim(send.Str(), "\x00") | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		s = ethutil.Bytes2Hex(tx.Sender()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if rec.Len() != 0 { | 
					
						
							|  |  |  | 		r = strings.Trim(rec.Str(), "\x00") | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		if tx.CreatesContract() { | 
					
						
							| 
									
										
										
										
											2014-10-02 17:35:57 +02:00
										 |  |  | 			r = ethutil.Bytes2Hex(tx.CreationAddress(pipe.World().State())) | 
					
						
							| 
									
										
										
										
											2014-05-26 00:10:38 +02:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2014-08-10 14:57:42 +01:00
										 |  |  | 			r = ethutil.Bytes2Hex(tx.Recipient) | 
					
						
							| 
									
										
										
										
											2014-05-26 00:10:38 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-08-10 14:57:42 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	ptx.Sender = s | 
					
						
							|  |  |  | 	ptx.Address = r | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-14 00:18:37 +02:00
										 |  |  | 	if window == "post" { | 
					
						
							| 
									
										
										
										
											2014-08-25 12:53:17 +02:00
										 |  |  | 		//gui.getObjectByName("transactionView").Call("addTx", ptx, inout) | 
					
						
							| 
									
										
										
										
											2014-08-14 00:18:37 +02:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		gui.getObjectByName("pendingTxView").Call("addTx", ptx, inout) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-08-10 14:57:42 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-05-26 00:10:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-10 14:57:42 +01:00
										 |  |  | func (gui *Gui) readPreviousTransactions() { | 
					
						
							| 
									
										
										
										
											2014-11-03 00:30:52 +01:00
										 |  |  | 	it := gui.txDb.NewIterator() | 
					
						
							| 
									
										
										
										
											2014-08-10 14:57:42 +01:00
										 |  |  | 	for it.Next() { | 
					
						
							| 
									
										
										
										
											2014-10-31 10:59:17 +01:00
										 |  |  | 		tx := chain.NewTransactionFromBytes(it.Value()) | 
					
						
							| 
									
										
										
										
											2014-08-10 14:57:42 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		gui.insertTransaction("post", tx) | 
					
						
							| 
									
										
										
										
											2014-05-26 00:10:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-25 10:54:37 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	it.Release() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 10:59:17 +01:00
										 |  |  | func (gui *Gui) processBlock(block *chain.Block, initial bool) { | 
					
						
							| 
									
										
										
										
											2014-08-15 13:16:07 +02:00
										 |  |  | 	name := strings.Trim(gui.pipe.World().Config().Get("NameReg").Storage(block.Coinbase).Str(), "\x00") | 
					
						
							| 
									
										
										
										
											2014-10-31 14:30:08 +01:00
										 |  |  | 	b := xeth.NewJSBlock(block) | 
					
						
							| 
									
										
										
										
											2014-07-17 22:30:17 +02:00
										 |  |  | 	b.Name = name | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-12 11:02:33 +02:00
										 |  |  | 	gui.getObjectByName("chainView").Call("addBlock", b, initial) | 
					
						
							| 
									
										
										
										
											2014-02-21 12:37:40 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-14 14:57:05 +02:00
										 |  |  | func (gui *Gui) setWalletValue(amount, unconfirmedFunds *big.Int) { | 
					
						
							|  |  |  | 	var str string | 
					
						
							|  |  |  | 	if unconfirmedFunds != nil { | 
					
						
							|  |  |  | 		pos := "+" | 
					
						
							| 
									
										
										
										
											2014-05-21 13:37:46 +02:00
										 |  |  | 		if unconfirmedFunds.Cmp(big.NewInt(0)) < 0 { | 
					
						
							| 
									
										
										
										
											2014-05-14 14:57:05 +02:00
										 |  |  | 			pos = "-" | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		val := ethutil.CurrencyToString(new(big.Int).Abs(ethutil.BigCopy(unconfirmedFunds))) | 
					
						
							|  |  |  | 		str = fmt.Sprintf("%v (%s %v)", ethutil.CurrencyToString(amount), pos, val) | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		str = fmt.Sprintf("%v", ethutil.CurrencyToString(amount)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	gui.win.Root().Call("setWalletValue", str) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-18 11:57:58 +02:00
										 |  |  | func (self *Gui) getObjectByName(objectName string) qml.Object { | 
					
						
							|  |  |  | 	return self.win.Root().ObjectByName(objectName) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-25 10:54:37 +01:00
										 |  |  | // Simple go routine function that updates the list of peers in the GUI | 
					
						
							| 
									
										
										
										
											2014-05-08 18:24:28 +02:00
										 |  |  | func (gui *Gui) update() { | 
					
						
							| 
									
										
										
										
											2014-08-12 11:02:33 +02:00
										 |  |  | 	// We have to wait for qml to be done loading all the windows. | 
					
						
							|  |  |  | 	for !gui.qmlDone { | 
					
						
							| 
									
										
										
										
											2014-11-15 00:29:27 +01:00
										 |  |  | 		time.Sleep(300 * time.Millisecond) | 
					
						
							| 
									
										
										
										
											2014-08-12 11:02:33 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	go func() { | 
					
						
							| 
									
										
										
										
											2014-11-15 00:29:27 +01:00
										 |  |  | 		go gui.setInitialChain(false) | 
					
						
							| 
									
										
										
										
											2014-08-12 11:02:33 +02:00
										 |  |  | 		gui.loadAddressBook() | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 		gui.loadMergedMiningOptions() | 
					
						
							| 
									
										
										
										
											2014-08-12 11:02:33 +02:00
										 |  |  | 		gui.setPeerInfo() | 
					
						
							| 
									
										
										
										
											2014-11-10 01:17:31 +01:00
										 |  |  | 		//gui.readPreviousTransactions() | 
					
						
							| 
									
										
										
										
											2014-08-12 11:02:33 +02:00
										 |  |  | 	}() | 
					
						
							| 
									
										
										
										
											2014-05-14 14:57:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-20 10:00:02 +02:00
										 |  |  | 	for _, plugin := range gui.plugins { | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 		guilogger.Infoln("Loading plugin ", plugin.Name) | 
					
						
							| 
									
										
										
										
											2014-09-08 00:50:25 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-20 10:00:02 +02:00
										 |  |  | 		gui.win.Root().Call("addPlugin", plugin.Path, "") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-18 11:57:58 +02:00
										 |  |  | 	peerUpdateTicker := time.NewTicker(5 * time.Second) | 
					
						
							| 
									
										
										
										
											2014-09-24 19:57:22 +02:00
										 |  |  | 	generalUpdateTicker := time.NewTicker(500 * time.Millisecond) | 
					
						
							| 
									
										
										
										
											2014-08-23 11:00:15 +02:00
										 |  |  | 	statsUpdateTicker := time.NewTicker(5 * time.Second) | 
					
						
							| 
									
										
										
										
											2014-06-02 15:16:37 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-04 10:57:02 +01:00
										 |  |  | 	state := gui.eth.BlockManager().TransState() | 
					
						
							| 
									
										
										
										
											2014-04-30 17:13:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-08 18:24:28 +02:00
										 |  |  | 	unconfirmedFunds := new(big.Int) | 
					
						
							| 
									
										
										
										
											2014-10-23 01:01:41 +02:00
										 |  |  | 	gui.win.Root().Call("setWalletValue", fmt.Sprintf("%v", ethutil.CurrencyToString(state.GetAccount(gui.address()).Balance()))) | 
					
						
							| 
									
										
										
										
											2014-07-18 11:57:58 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	lastBlockLabel := gui.getObjectByName("lastBlockLabel") | 
					
						
							| 
									
										
										
										
											2014-08-21 20:13:38 +02:00
										 |  |  | 	miningLabel := gui.getObjectByName("miningLabel") | 
					
						
							| 
									
										
										
										
											2014-04-30 17:13:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-14 19:38:38 +02:00
										 |  |  | 	events := gui.eth.EventMux().Subscribe( | 
					
						
							|  |  |  | 		eth.ChainSyncEvent{}, | 
					
						
							|  |  |  | 		eth.PeerListEvent{}, | 
					
						
							| 
									
										
										
										
											2014-10-31 10:59:17 +01:00
										 |  |  | 		chain.NewBlockEvent{}, | 
					
						
							|  |  |  | 		chain.TxPreEvent{}, | 
					
						
							|  |  |  | 		chain.TxPostEvent{}, | 
					
						
							| 
									
										
										
										
											2014-10-14 19:38:38 +02:00
										 |  |  | 	) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// nameReg := gui.pipe.World().Config().Get("NameReg") | 
					
						
							|  |  |  | 	// mux.Subscribe("object:"+string(nameReg.Address()), objectChan) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-15 01:13:39 +01:00
										 |  |  | 	go func() { | 
					
						
							| 
									
										
										
										
											2014-10-14 19:38:38 +02:00
										 |  |  | 		defer events.Unsubscribe() | 
					
						
							| 
									
										
										
										
											2014-07-15 01:13:39 +01:00
										 |  |  | 		for { | 
					
						
							|  |  |  | 			select { | 
					
						
							| 
									
										
										
										
											2014-10-14 19:38:38 +02:00
										 |  |  | 			case ev, isopen := <-events.Chan(): | 
					
						
							|  |  |  | 				if !isopen { | 
					
						
							|  |  |  | 					return | 
					
						
							| 
									
										
										
										
											2014-07-15 01:13:39 +01:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2014-10-14 19:38:38 +02:00
										 |  |  | 				switch ev := ev.(type) { | 
					
						
							| 
									
										
										
										
											2014-10-31 10:59:17 +01:00
										 |  |  | 				case chain.NewBlockEvent: | 
					
						
							| 
									
										
										
										
											2014-10-14 19:38:38 +02:00
										 |  |  | 					gui.processBlock(ev.Block, false) | 
					
						
							|  |  |  | 					if bytes.Compare(ev.Block.Coinbase, gui.address()) == 0 { | 
					
						
							| 
									
										
										
										
											2014-11-04 10:57:02 +01:00
										 |  |  | 						gui.setWalletValue(gui.eth.BlockManager().CurrentState().GetAccount(gui.address()).Balance(), nil) | 
					
						
							| 
									
										
										
										
											2014-10-14 19:38:38 +02:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2014-02-25 10:54:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 10:59:17 +01:00
										 |  |  | 				case chain.TxPreEvent: | 
					
						
							| 
									
										
										
										
											2014-10-14 19:38:38 +02:00
										 |  |  | 					tx := ev.Tx | 
					
						
							| 
									
										
										
										
											2014-10-29 03:50:20 +01:00
										 |  |  | 					object := state.GetAccount(gui.address()) | 
					
						
							| 
									
										
										
										
											2014-05-08 18:24:28 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-29 03:50:20 +01:00
										 |  |  | 					if bytes.Compare(tx.Sender(), gui.address()) == 0 { | 
					
						
							|  |  |  | 						unconfirmedFunds.Sub(unconfirmedFunds, tx.Value) | 
					
						
							|  |  |  | 					} else if bytes.Compare(tx.Recipient, gui.address()) == 0 { | 
					
						
							|  |  |  | 						unconfirmedFunds.Add(unconfirmedFunds, tx.Value) | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2014-02-28 12:16:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-29 03:50:20 +01:00
										 |  |  | 					gui.setWalletValue(object.Balance(), unconfirmedFunds) | 
					
						
							|  |  |  | 					gui.insertTransaction("pre", tx) | 
					
						
							| 
									
										
										
										
											2014-08-10 14:57:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 10:59:17 +01:00
										 |  |  | 				case chain.TxPostEvent: | 
					
						
							| 
									
										
										
										
											2014-10-29 03:50:20 +01:00
										 |  |  | 					tx := ev.Tx | 
					
						
							|  |  |  | 					object := state.GetAccount(gui.address()) | 
					
						
							| 
									
										
										
										
											2014-08-10 14:57:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-29 03:50:20 +01:00
										 |  |  | 					if bytes.Compare(tx.Sender(), gui.address()) == 0 { | 
					
						
							|  |  |  | 						object.SubAmount(tx.Value) | 
					
						
							| 
									
										
										
										
											2014-08-10 14:57:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 14:30:08 +01:00
										 |  |  | 						//gui.getObjectByName("transactionView").Call("addTx", xeth.NewJSTx(tx), "send") | 
					
						
							| 
									
										
										
										
											2014-10-29 03:50:20 +01:00
										 |  |  | 						gui.txDb.Put(tx.Hash(), tx.RlpEncode()) | 
					
						
							|  |  |  | 					} else if bytes.Compare(tx.Recipient, gui.address()) == 0 { | 
					
						
							|  |  |  | 						object.AddAmount(tx.Value) | 
					
						
							| 
									
										
										
										
											2014-10-14 19:38:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 14:30:08 +01:00
										 |  |  | 						//gui.getObjectByName("transactionView").Call("addTx", xeth.NewJSTx(tx), "recv") | 
					
						
							| 
									
										
										
										
											2014-10-29 03:50:20 +01:00
										 |  |  | 						gui.txDb.Put(tx.Hash(), tx.RlpEncode()) | 
					
						
							| 
									
										
										
										
											2014-07-15 01:13:39 +01:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2014-02-28 12:16:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-29 03:50:20 +01:00
										 |  |  | 					gui.setWalletValue(object.Balance(), nil) | 
					
						
							|  |  |  | 					state.UpdateStateObject(object) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-14 19:38:38 +02:00
										 |  |  | 				// case object: | 
					
						
							|  |  |  | 				// 	gui.loadAddressBook() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				case eth.PeerListEvent: | 
					
						
							|  |  |  | 					gui.setPeerInfo() | 
					
						
							| 
									
										
										
										
											2014-05-08 18:24:28 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 					/* | 
					
						
							|  |  |  | 						case miner.Event: | 
					
						
							|  |  |  | 							if ev.Type == miner.Started { | 
					
						
							|  |  |  | 								gui.miner = ev.Miner | 
					
						
							|  |  |  | 							} else { | 
					
						
							|  |  |  | 								gui.miner = nil | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 					*/ | 
					
						
							| 
									
										
										
										
											2014-07-15 01:13:39 +01:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2014-07-21 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			case <-peerUpdateTicker.C: | 
					
						
							| 
									
										
										
										
											2014-07-15 01:13:39 +01:00
										 |  |  | 				gui.setPeerInfo() | 
					
						
							| 
									
										
										
										
											2014-07-21 13:30:37 +01:00
										 |  |  | 			case <-generalUpdateTicker.C: | 
					
						
							| 
									
										
										
										
											2014-10-20 12:03:31 +02:00
										 |  |  | 				statusText := "#" + gui.eth.ChainManager().CurrentBlock.Number.String() | 
					
						
							| 
									
										
										
										
											2014-08-21 20:13:38 +02:00
										 |  |  | 				lastBlockLabel.Set("text", statusText) | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 				miningLabel.Set("text", "Mining @ "+strconv.FormatInt(gui.uiLib.miner.GetPow().GetHashrate(), 10)+"Khash") | 
					
						
							| 
									
										
										
										
											2014-08-23 11:00:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-24 19:57:22 +02:00
										 |  |  | 				blockLength := gui.eth.BlockPool().BlocksProcessed | 
					
						
							|  |  |  | 				chainLength := gui.eth.BlockPool().ChainLength | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				var ( | 
					
						
							|  |  |  | 					pct      float64 = 1.0 / float64(chainLength) * float64(blockLength) | 
					
						
							|  |  |  | 					dlWidget         = gui.win.Root().ObjectByName("downloadIndicator") | 
					
						
							| 
									
										
										
										
											2014-10-02 01:37:23 +02:00
										 |  |  | 					dlLabel          = gui.win.Root().ObjectByName("downloadLabel") | 
					
						
							| 
									
										
										
										
											2014-09-24 19:57:22 +02:00
										 |  |  | 				) | 
					
						
							| 
									
										
										
										
											2014-10-02 17:35:57 +02:00
										 |  |  | 				dlWidget.Set("value", pct) | 
					
						
							|  |  |  | 				dlLabel.Set("text", fmt.Sprintf("%d / %d", blockLength, chainLength)) | 
					
						
							| 
									
										
										
										
											2014-09-24 19:57:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-23 11:00:15 +02:00
										 |  |  | 			case <-statsUpdateTicker.C: | 
					
						
							|  |  |  | 				gui.setStatsPane() | 
					
						
							| 
									
										
										
										
											2014-02-25 10:54:37 +01:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-07-15 01:13:39 +01:00
										 |  |  | 	}() | 
					
						
							| 
									
										
										
										
											2014-02-23 01:56:04 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-23 11:00:15 +02:00
										 |  |  | func (gui *Gui) setStatsPane() { | 
					
						
							|  |  |  | 	var memStats runtime.MemStats | 
					
						
							|  |  |  | 	runtime.ReadMemStats(&memStats) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	statsPane := gui.getObjectByName("statsPane") | 
					
						
							| 
									
										
										
										
											2014-11-14 13:51:41 +01:00
										 |  |  | 	statsPane.Set("text", fmt.Sprintf(`###### Mist %s (%s) ####### | 
					
						
							| 
									
										
										
										
											2014-09-17 15:58:44 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | eth %d (p2p = %d) | 
					
						
							| 
									
										
										
										
											2014-08-23 11:00:15 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | CPU:        # %d | 
					
						
							|  |  |  | Goroutines: # %d | 
					
						
							|  |  |  | CGoCalls:   # %d | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Alloc:      %d | 
					
						
							|  |  |  | Heap Alloc: %d | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CGNext:     %x | 
					
						
							|  |  |  | NumGC:      %d | 
					
						
							| 
									
										
										
										
											2014-11-14 13:51:41 +01:00
										 |  |  | `, Version, runtime.Version(), | 
					
						
							| 
									
										
										
										
											2014-09-17 15:58:44 +02:00
										 |  |  | 		eth.ProtocolVersion, eth.P2PVersion, | 
					
						
							|  |  |  | 		runtime.NumCPU, runtime.NumGoroutine(), runtime.NumCgoCall(), | 
					
						
							| 
									
										
										
										
											2014-08-23 11:00:15 +02:00
										 |  |  | 		memStats.Alloc, memStats.HeapAlloc, | 
					
						
							|  |  |  | 		memStats.NextGC, memStats.NumGC, | 
					
						
							|  |  |  | 	)) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-30 13:04:23 +02:00
										 |  |  | func (gui *Gui) setPeerInfo() { | 
					
						
							|  |  |  | 	gui.win.Root().Call("setPeers", fmt.Sprintf("%d / %d", gui.eth.PeerCount(), gui.eth.MaxPeers)) | 
					
						
							| 
									
										
										
										
											2014-06-02 15:16:37 +02:00
										 |  |  | 	gui.win.Root().Call("resetPeers") | 
					
						
							| 
									
										
										
										
											2014-08-18 01:35:42 +02:00
										 |  |  | 	for _, peer := range gui.pipe.Peers() { | 
					
						
							| 
									
										
										
										
											2014-06-02 15:16:37 +02:00
										 |  |  | 		gui.win.Root().Call("addPeer", peer) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-05-30 13:04:23 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-29 20:38:26 +01:00
										 |  |  | func (gui *Gui) privateKey() string { | 
					
						
							|  |  |  | 	return ethutil.Bytes2Hex(gui.eth.KeyManager().PrivateKey()) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (gui *Gui) address() []byte { | 
					
						
							|  |  |  | 	return gui.eth.KeyManager().Address() | 
					
						
							|  |  |  | } |