From 0ae3bbc3f5eda7ccabbd067fc8e361155004748c Mon Sep 17 00:00:00 2001
From: obscuren <geffobscura@gmail.com>
Date: Fri, 4 Jul 2014 15:53:16 +0200
Subject: deleted

---
 ethereal/assets/samplecoin | 1 -
 1 file changed, 1 deletion(-)
 delete mode 160000 ethereal/assets/samplecoin

diff --git a/ethereal/assets/samplecoin b/ethereal/assets/samplecoin
deleted file mode 160000
index 944fbaa31..000000000
--- a/ethereal/assets/samplecoin
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 944fbaa31d51328b522c0cd55113716630b4cbcb
-- 
cgit v1.2.3


From c0ae5c58a6b3d78540ec19b24bd31b6e14e24191 Mon Sep 17 00:00:00 2001
From: Maran <maran.hidskes@gmail.com>
Date: Tue, 15 Jul 2014 12:52:30 +0200
Subject: Rewrote mnemonic word loading to facilitate deployable builds.

---
 ethereal/flags.go | 31 ++-----------------------------
 utils/cmd.go      | 29 +++++++++++++++++++++++++++++
 2 files changed, 31 insertions(+), 29 deletions(-)

diff --git a/ethereal/flags.go b/ethereal/flags.go
index d5ca9f336..c7d330f80 100644
--- a/ethereal/flags.go
+++ b/ethereal/flags.go
@@ -1,15 +1,13 @@
 package main
 
 import (
-	"bitbucket.org/kardianos/osext"
 	"flag"
 	"fmt"
 	"github.com/ethereum/eth-go/ethlog"
+	"github.com/ethereum/go-ethereum/utils"
 	"os"
 	"os/user"
 	"path"
-	"path/filepath"
-	"runtime"
 )
 
 var Identifier string
@@ -36,31 +34,6 @@ var LogLevel int
 // flags specific to gui client
 var AssetPath string
 
-func defaultAssetPath() string {
-	var assetPath string
-	// If the current working directory is the go-ethereum dir
-	// assume a debug build and use the source directory as
-	// asset directory.
-	pwd, _ := os.Getwd()
-	if pwd == path.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "ethereal") {
-		assetPath = path.Join(pwd, "assets")
-	} else {
-		switch runtime.GOOS {
-		case "darwin":
-			// Get Binary Directory
-			exedir, _ := osext.ExecutableFolder()
-			assetPath = filepath.Join(exedir, "../Resources")
-		case "linux":
-			assetPath = "/usr/share/ethereal"
-		case "windows":
-			assetPath = "./assets"
-		default:
-			assetPath = "."
-		}
-	}
-	return assetPath
-}
-
 func defaultDataDir() string {
 	usr, _ := user.Current()
 	return path.Join(usr.HomeDir, ".ethereal")
@@ -93,7 +66,7 @@ func Init() {
 	flag.StringVar(&DebugFile, "debug", "", "debug file (no debugging if not set)")
 	flag.IntVar(&LogLevel, "loglevel", int(ethlog.InfoLevel), "loglevel: 0-5: silent,error,warn,info,debug,debug detail)")
 
-	flag.StringVar(&AssetPath, "asset_path", defaultAssetPath(), "absolute path to GUI assets directory")
+	flag.StringVar(&AssetPath, "asset_path", utils.DefaultAssetPath(), "absolute path to GUI assets directory")
 
 	flag.Parse()
 }
diff --git a/utils/cmd.go b/utils/cmd.go
index 889726b04..fac164b47 100644
--- a/utils/cmd.go
+++ b/utils/cmd.go
@@ -1,6 +1,7 @@
 package utils
 
 import (
+	"bitbucket.org/kardianos/osext"
 	"fmt"
 	"github.com/ethereum/eth-go"
 	"github.com/ethereum/eth-go/ethcrypto"
@@ -16,6 +17,8 @@ import (
 	"os"
 	"os/signal"
 	"path"
+	"path/filepath"
+	"runtime"
 	"time"
 )
 
@@ -164,7 +167,33 @@ func NewKeyManager(KeyStore string, Datadir string, db ethutil.Database) *ethcry
 	return keyManager
 }
 
+func DefaultAssetPath() string {
+	var assetPath string
+	// If the current working directory is the go-ethereum dir
+	// assume a debug build and use the source directory as
+	// asset directory.
+	pwd, _ := os.Getwd()
+	if pwd == path.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "ethereal") {
+		assetPath = path.Join(pwd, "assets")
+	} else {
+		switch runtime.GOOS {
+		case "darwin":
+			// Get Binary Directory
+			exedir, _ := osext.ExecutableFolder()
+			assetPath = filepath.Join(exedir, "../Resources")
+		case "linux":
+			assetPath = "/usr/share/ethereal"
+		case "windows":
+			assetPath = "./assets"
+		default:
+			assetPath = "."
+		}
+	}
+	return assetPath
+}
 func KeyTasks(keyManager *ethcrypto.KeyManager, KeyRing string, GenAddr bool, SecretFile string, ExportDir string, NonInteractive bool) {
+	ethcrypto.InitWords(DefaultAssetPath()) // Init mnemonic word list
+
 	var err error
 	switch {
 	case GenAddr:
-- 
cgit v1.2.3


From 223432fa1eedb9fa5c712056afb804322aa12b02 Mon Sep 17 00:00:00 2001
From: Maran <maran.hidskes@gmail.com>
Date: Tue, 15 Jul 2014 16:21:16 +0200
Subject: Work around crash issues when building OSX binary

---
 ethereal/flags.go | 31 +++++++++++++++++++++++++++++--
 utils/cmd.go      |  1 +
 2 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/ethereal/flags.go b/ethereal/flags.go
index c7d330f80..c9327c3d3 100644
--- a/ethereal/flags.go
+++ b/ethereal/flags.go
@@ -1,13 +1,15 @@
 package main
 
 import (
+	"bitbucket.org/kardianos/osext"
 	"flag"
 	"fmt"
 	"github.com/ethereum/eth-go/ethlog"
-	"github.com/ethereum/go-ethereum/utils"
 	"os"
 	"os/user"
 	"path"
+	"path/filepath"
+	"runtime"
 )
 
 var Identifier string
@@ -34,6 +36,31 @@ var LogLevel int
 // flags specific to gui client
 var AssetPath string
 
+//TODO: If we re-use the one defined in cmd.go the binary osx image crashes. If somebody finds out why we can dry this up.
+func defaultAssetPath() string {
+	var assetPath string
+	// If the current working directory is the go-ethereum dir
+	// assume a debug build and use the source directory as
+	// asset directory.
+	pwd, _ := os.Getwd()
+	if pwd == path.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "ethereal") {
+		assetPath = path.Join(pwd, "assets")
+	} else {
+		switch runtime.GOOS {
+		case "darwin":
+			// Get Binary Directory
+			exedir, _ := osext.ExecutableFolder()
+			assetPath = filepath.Join(exedir, "../Resources")
+		case "linux":
+			assetPath = "/usr/share/ethereal"
+		case "windows":
+			assetPath = "./assets"
+		default:
+			assetPath = "."
+		}
+	}
+	return assetPath
+}
 func defaultDataDir() string {
 	usr, _ := user.Current()
 	return path.Join(usr.HomeDir, ".ethereal")
@@ -66,7 +93,7 @@ func Init() {
 	flag.StringVar(&DebugFile, "debug", "", "debug file (no debugging if not set)")
 	flag.IntVar(&LogLevel, "loglevel", int(ethlog.InfoLevel), "loglevel: 0-5: silent,error,warn,info,debug,debug detail)")
 
-	flag.StringVar(&AssetPath, "asset_path", utils.DefaultAssetPath(), "absolute path to GUI assets directory")
+	flag.StringVar(&AssetPath, "asset_path", defaultAssetPath(), "absolute path to GUI assets directory")
 
 	flag.Parse()
 }
diff --git a/utils/cmd.go b/utils/cmd.go
index fac164b47..1e1599582 100644
--- a/utils/cmd.go
+++ b/utils/cmd.go
@@ -191,6 +191,7 @@ func DefaultAssetPath() string {
 	}
 	return assetPath
 }
+
 func KeyTasks(keyManager *ethcrypto.KeyManager, KeyRing string, GenAddr bool, SecretFile string, ExportDir string, NonInteractive bool) {
 	ethcrypto.InitWords(DefaultAssetPath()) // Init mnemonic word list
 
-- 
cgit v1.2.3


From 28948d061cfc14d7a5da307a12ebd504b78d2dbb Mon Sep 17 00:00:00 2001
From: obscuren <geffobscura@gmail.com>
Date: Tue, 15 Jul 2014 20:34:25 +0200
Subject: Moved the repl to a new package

---
 ethereum/cmd.go                     |   5 +-
 ethereum/flags.go                   |   2 +
 ethereum/javascript_runtime.go      | 231 ------------------------------------
 ethereum/js_lib.go                  |  53 ---------
 ethereum/main.go                    |   1 +
 ethereum/repl.go                    | 153 ------------------------
 ethereum/repl/javascript_runtime.go | 231 ++++++++++++++++++++++++++++++++++++
 ethereum/repl/js_lib.go             |  53 +++++++++
 ethereum/repl/repl.go               |  83 +++++++++++++
 ethereum/repl/repl_darwin.go        | 123 +++++++++++++++++++
 ethereum/repl/repl_linux.go         |   1 +
 ethereum/repl/repl_windows.go       |  24 ++++
 ethereum/repl/types.go              |  95 +++++++++++++++
 ethereum/repl_darwin.go             | 123 -------------------
 ethereum/repl_linux.go              |   1 -
 ethereum/repl_windows.go            |  24 ----
 16 files changed, 616 insertions(+), 587 deletions(-)
 delete mode 100644 ethereum/javascript_runtime.go
 delete mode 100644 ethereum/js_lib.go
 delete mode 100644 ethereum/repl.go
 create mode 100644 ethereum/repl/javascript_runtime.go
 create mode 100644 ethereum/repl/js_lib.go
 create mode 100644 ethereum/repl/repl.go
 create mode 100644 ethereum/repl/repl_darwin.go
 create mode 120000 ethereum/repl/repl_linux.go
 create mode 100644 ethereum/repl/repl_windows.go
 create mode 100644 ethereum/repl/types.go
 delete mode 100644 ethereum/repl_darwin.go
 delete mode 120000 ethereum/repl_linux.go
 delete mode 100644 ethereum/repl_windows.go

diff --git a/ethereum/cmd.go b/ethereum/cmd.go
index 08147824d..ff2b8409c 100644
--- a/ethereum/cmd.go
+++ b/ethereum/cmd.go
@@ -2,13 +2,14 @@ package main
 
 import (
 	"github.com/ethereum/eth-go"
+	"github.com/ethereum/go-ethereum/ethereum/repl"
 	"github.com/ethereum/go-ethereum/utils"
 	"io/ioutil"
 	"os"
 )
 
 func InitJsConsole(ethereum *eth.Ethereum) {
-	repl := NewJSRepl(ethereum)
+	repl := ethrepl.NewJSRepl(ethereum)
 	go repl.Start()
 	utils.RegisterInterrupt(func(os.Signal) {
 		repl.Stop()
@@ -24,7 +25,7 @@ func ExecJsFile(ethereum *eth.Ethereum, InputFile string) {
 	if err != nil {
 		logger.Fatalln(err)
 	}
-	re := NewJSRE(ethereum)
+	re := ethrepl.NewJSRE(ethereum)
 	utils.RegisterInterrupt(func(os.Signal) {
 		re.Stop()
 	})
diff --git a/ethereum/flags.go b/ethereum/flags.go
index af0fd9a69..4f59ddf06 100644
--- a/ethereum/flags.go
+++ b/ethereum/flags.go
@@ -12,6 +12,7 @@ import (
 var Identifier string
 var KeyRing string
 var DiffTool bool
+var DiffType string
 var KeyStore string
 var StartRpc bool
 var RpcPort int
@@ -68,6 +69,7 @@ func Init() {
 	flag.StringVar(&DebugFile, "debug", "", "debug file (no debugging if not set)")
 	flag.IntVar(&LogLevel, "loglevel", int(ethlog.InfoLevel), "loglevel: 0-5: silent,error,warn,info,debug,debug detail)")
 	flag.BoolVar(&DiffTool, "difftool", false, "creates output for diff'ing. Sets LogLevel=0")
+	flag.StringVar(&DiffType, "diff", "all", "sets the level of diff output [vm, all]. Has no effect if difftool=false")
 
 	flag.BoolVar(&StartMining, "mine", false, "start dagger mining")
 	flag.BoolVar(&StartJsConsole, "js", false, "launches javascript console")
diff --git a/ethereum/javascript_runtime.go b/ethereum/javascript_runtime.go
deleted file mode 100644
index 852a50487..000000000
--- a/ethereum/javascript_runtime.go
+++ /dev/null
@@ -1,231 +0,0 @@
-package main
-
-import (
-	"fmt"
-	"github.com/ethereum/eth-go"
-	"github.com/ethereum/eth-go/ethchain"
-	"github.com/ethereum/eth-go/ethlog"
-	"github.com/ethereum/eth-go/ethpub"
-	"github.com/ethereum/eth-go/ethutil"
-	"github.com/ethereum/go-ethereum/utils"
-	"github.com/obscuren/otto"
-	"io/ioutil"
-	"os"
-	"path"
-	"path/filepath"
-)
-
-var jsrelogger = ethlog.NewLogger("JSRE")
-
-type JSRE struct {
-	ethereum *eth.Ethereum
-	vm       *otto.Otto
-	lib      *ethpub.PEthereum
-
-	blockChan  chan ethutil.React
-	changeChan chan ethutil.React
-	quitChan   chan bool
-
-	objectCb map[string][]otto.Value
-}
-
-func (jsre *JSRE) LoadExtFile(path string) {
-	result, err := ioutil.ReadFile(path)
-	if err == nil {
-		jsre.vm.Run(result)
-	} else {
-		jsrelogger.Debugln("Could not load file:", path)
-	}
-}
-
-func (jsre *JSRE) LoadIntFile(file string) {
-	assetPath := path.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "ethereal", "assets", "ext")
-	jsre.LoadExtFile(path.Join(assetPath, file))
-}
-
-func NewJSRE(ethereum *eth.Ethereum) *JSRE {
-	re := &JSRE{
-		ethereum,
-		otto.New(),
-		ethpub.NewPEthereum(ethereum),
-		make(chan ethutil.React, 1),
-		make(chan ethutil.React, 1),
-		make(chan bool),
-		make(map[string][]otto.Value),
-	}
-
-	// Init the JS lib
-	re.vm.Run(jsLib)
-
-	// Load extra javascript files
-	re.LoadIntFile("string.js")
-	re.LoadIntFile("big.js")
-
-	// We have to make sure that, whoever calls this, calls "Stop"
-	go re.mainLoop()
-
-	re.Bind("eth", &JSEthereum{re.lib, re.vm})
-
-	re.initStdFuncs()
-
-	jsrelogger.Infoln("started")
-
-	return re
-}
-
-func (self *JSRE) Bind(name string, v interface{}) {
-	self.vm.Set(name, v)
-}
-
-func (self *JSRE) Run(code string) (otto.Value, error) {
-	return self.vm.Run(code)
-}
-
-func (self *JSRE) Require(file string) error {
-	if len(filepath.Ext(file)) == 0 {
-		file += ".js"
-	}
-
-	fh, err := os.Open(file)
-	if err != nil {
-		return err
-	}
-
-	content, _ := ioutil.ReadAll(fh)
-	self.Run("exports = {};(function() {" + string(content) + "})();")
-
-	return nil
-}
-
-func (self *JSRE) Stop() {
-	// Kill the main loop
-	self.quitChan <- true
-
-	close(self.blockChan)
-	close(self.quitChan)
-	close(self.changeChan)
-	jsrelogger.Infoln("stopped")
-}
-
-func (self *JSRE) mainLoop() {
-	// Subscribe to events
-	reactor := self.ethereum.Reactor()
-	reactor.Subscribe("newBlock", self.blockChan)
-
-out:
-	for {
-		select {
-		case <-self.quitChan:
-			break out
-		case block := <-self.blockChan:
-			if _, ok := block.Resource.(*ethchain.Block); ok {
-			}
-		case object := <-self.changeChan:
-			if stateObject, ok := object.Resource.(*ethchain.StateObject); ok {
-				for _, cb := range self.objectCb[ethutil.Bytes2Hex(stateObject.Address())] {
-					val, _ := self.vm.ToValue(ethpub.NewPStateObject(stateObject))
-					cb.Call(cb, val)
-				}
-			} else if storageObject, ok := object.Resource.(*ethchain.StorageState); ok {
-				for _, cb := range self.objectCb[ethutil.Bytes2Hex(storageObject.StateAddress)+ethutil.Bytes2Hex(storageObject.Address)] {
-					val, _ := self.vm.ToValue(ethpub.NewPStorageState(storageObject))
-					cb.Call(cb, val)
-				}
-			}
-		}
-	}
-}
-
-func (self *JSRE) initStdFuncs() {
-	t, _ := self.vm.Get("eth")
-	eth := t.Object()
-	eth.Set("watch", self.watch)
-	eth.Set("addPeer", self.addPeer)
-	eth.Set("require", self.require)
-	eth.Set("stopMining", self.stopMining)
-	eth.Set("startMining", self.startMining)
-	eth.Set("execBlock", self.execBlock)
-}
-
-/*
- * The following methods are natively implemented javascript functions
- */
-
-func (self *JSRE) stopMining(call otto.FunctionCall) otto.Value {
-	v, _ := self.vm.ToValue(utils.StopMining(self.ethereum))
-	return v
-}
-
-func (self *JSRE) startMining(call otto.FunctionCall) otto.Value {
-	v, _ := self.vm.ToValue(utils.StartMining(self.ethereum))
-	return v
-}
-
-// eth.watch
-func (self *JSRE) watch(call otto.FunctionCall) otto.Value {
-	addr, _ := call.Argument(0).ToString()
-	var storageAddr string
-	var cb otto.Value
-	var storageCallback bool
-	if len(call.ArgumentList) > 2 {
-		storageCallback = true
-		storageAddr, _ = call.Argument(1).ToString()
-		cb = call.Argument(2)
-	} else {
-		cb = call.Argument(1)
-	}
-
-	if storageCallback {
-		self.objectCb[addr+storageAddr] = append(self.objectCb[addr+storageAddr], cb)
-
-		event := "storage:" + string(ethutil.Hex2Bytes(addr)) + ":" + string(ethutil.Hex2Bytes(storageAddr))
-		self.ethereum.Reactor().Subscribe(event, self.changeChan)
-	} else {
-		self.objectCb[addr] = append(self.objectCb[addr], cb)
-
-		event := "object:" + string(ethutil.Hex2Bytes(addr))
-		self.ethereum.Reactor().Subscribe(event, self.changeChan)
-	}
-
-	return otto.UndefinedValue()
-}
-
-func (self *JSRE) addPeer(call otto.FunctionCall) otto.Value {
-	host, err := call.Argument(0).ToString()
-	if err != nil {
-		return otto.FalseValue()
-	}
-	self.ethereum.ConnectToPeer(host)
-
-	return otto.TrueValue()
-}
-
-func (self *JSRE) require(call otto.FunctionCall) otto.Value {
-	file, err := call.Argument(0).ToString()
-	if err != nil {
-		return otto.UndefinedValue()
-	}
-	if err := self.Require(file); err != nil {
-		fmt.Println("err:", err)
-		return otto.UndefinedValue()
-	}
-
-	t, _ := self.vm.Get("exports")
-
-	return t
-}
-
-func (self *JSRE) execBlock(call otto.FunctionCall) otto.Value {
-	hash, err := call.Argument(0).ToString()
-	if err != nil {
-		return otto.UndefinedValue()
-	}
-
-	err = utils.BlockDo(self.ethereum, ethutil.Hex2Bytes(hash))
-	if err != nil {
-		fmt.Println(err)
-		return otto.FalseValue()
-	}
-
-	return otto.TrueValue()
-}
diff --git a/ethereum/js_lib.go b/ethereum/js_lib.go
deleted file mode 100644
index 189dcc3a0..000000000
--- a/ethereum/js_lib.go
+++ /dev/null
@@ -1,53 +0,0 @@
-package main
-
-const jsLib = `
-function pp(object) {
-    var str = "";
-
-    if(object instanceof Array) {
-        str += "[ ";
-        for(var i = 0, l = object.length; i < l; i++) {
-            str += pp(object[i]);
-
-            if(i < l-1) {
-                str += ", ";
-            }
-        }
-        str += " ]";
-    } else if(typeof(object) === "object") {
-        str += "{ ";
-        var last = Object.keys(object).sort().pop()
-        for(var k in object) {
-            str += k + ": " + pp(object[k]);
-
-            if(k !== last) {
-                str += ", ";
-            }
-        }
-        str += " }";
-    } else if(typeof(object) === "string") {
-        str += "\033[32m'" + object + "'";
-    } else if(typeof(object) === "undefined") {
-        str += "\033[1m\033[30m" + object;
-    } else if(typeof(object) === "number") {
-        str += "\033[31m" + object;
-    } else if(typeof(object) === "function") {
-	str += "\033[35m[Function]";
-    } else {
-        str += object;                    
-    }
-
-    str += "\033[0m";
-
-    return str;
-}
-
-function prettyPrint(/* */) {
-    var args = arguments;
-    for(var i = 0, l = args.length; i < l; i++) {
-	    console.log(pp(args[i]))
-    }
-}
-
-var print = prettyPrint;
-`
diff --git a/ethereum/main.go b/ethereum/main.go
index 39226c1d2..fd4a89aa9 100644
--- a/ethereum/main.go
+++ b/ethereum/main.go
@@ -29,6 +29,7 @@ func main() {
 
 	utils.InitConfig(ConfigFile, Datadir, "ETH")
 	ethutil.Config.Diff = DiffTool
+	ethutil.Config.DiffType = DiffType
 
 	utils.InitDataDir(Datadir)
 
diff --git a/ethereum/repl.go b/ethereum/repl.go
deleted file mode 100644
index 34380a06f..000000000
--- a/ethereum/repl.go
+++ /dev/null
@@ -1,153 +0,0 @@
-package main
-
-import (
-	"bufio"
-	"fmt"
-	"github.com/ethereum/eth-go"
-	"github.com/ethereum/eth-go/ethpub"
-	"github.com/ethereum/eth-go/ethutil"
-	"github.com/obscuren/otto"
-	"io"
-	"os"
-	"path"
-)
-
-type Repl interface {
-	Start()
-	Stop()
-}
-
-type JSRepl struct {
-	re *JSRE
-
-	prompt string
-
-	history *os.File
-
-	running bool
-}
-
-func NewJSRepl(ethereum *eth.Ethereum) *JSRepl {
-	hist, err := os.OpenFile(path.Join(ethutil.Config.ExecPath, "history"), os.O_RDWR|os.O_CREATE, os.ModePerm)
-	if err != nil {
-		panic(err)
-	}
-
-	return &JSRepl{re: NewJSRE(ethereum), prompt: "> ", history: hist}
-}
-
-func (self *JSRepl) Start() {
-	if !self.running {
-		self.running = true
-		logger.Infoln("init JS Console")
-		reader := bufio.NewReader(self.history)
-		for {
-			line, err := reader.ReadString('\n')
-			if err != nil && err == io.EOF {
-				break
-			} else if err != nil {
-				fmt.Println("error reading history", err)
-				break
-			}
-
-			addHistory(line[:len(line)-1])
-		}
-		self.read()
-	}
-}
-
-func (self *JSRepl) Stop() {
-	if self.running {
-		self.running = false
-		self.re.Stop()
-		logger.Infoln("exit JS Console")
-		self.history.Close()
-	}
-}
-
-func (self *JSRepl) parseInput(code string) {
-	defer func() {
-		if r := recover(); r != nil {
-			fmt.Println("[native] error", r)
-		}
-	}()
-
-	value, err := self.re.Run(code)
-	if err != nil {
-		fmt.Println(err)
-		return
-	}
-
-	self.PrintValue(value)
-}
-
-// The JSEthereum object attempts to wrap the PEthereum object and returns
-// meaningful javascript objects
-type JSBlock struct {
-	*ethpub.PBlock
-	eth *JSEthereum
-}
-
-func (self *JSBlock) GetTransaction(hash string) otto.Value {
-	return self.eth.toVal(self.PBlock.GetTransaction(hash))
-}
-
-type JSEthereum struct {
-	*ethpub.PEthereum
-	vm *otto.Otto
-}
-
-func (self *JSEthereum) GetBlock(hash string) otto.Value {
-	return self.toVal(&JSBlock{self.PEthereum.GetBlock(hash), self})
-}
-
-func (self *JSEthereum) GetPeers() otto.Value {
-	return self.toVal(self.PEthereum.GetPeers())
-}
-
-func (self *JSEthereum) GetKey() otto.Value {
-	return self.toVal(self.PEthereum.GetKey())
-}
-
-func (self *JSEthereum) GetStateObject(addr string) otto.Value {
-	return self.toVal(self.PEthereum.GetStateObject(addr))
-}
-
-func (self *JSEthereum) GetStateKeyVals(addr string) otto.Value {
-	return self.toVal(self.PEthereum.GetStateObject(addr).StateKeyVal(false))
-}
-
-func (self *JSEthereum) Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr string) otto.Value {
-	r, err := self.PEthereum.Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr)
-	if err != nil {
-		fmt.Println(err)
-
-		return otto.UndefinedValue()
-	}
-
-	return self.toVal(r)
-}
-
-func (self *JSEthereum) Create(key, valueStr, gasStr, gasPriceStr, scriptStr string) otto.Value {
-	r, err := self.PEthereum.Create(key, valueStr, gasStr, gasPriceStr, scriptStr)
-
-	if err != nil {
-		fmt.Println(err)
-
-		return otto.UndefinedValue()
-	}
-
-	return self.toVal(r)
-}
-
-func (self *JSEthereum) toVal(v interface{}) otto.Value {
-	result, err := self.vm.ToValue(v)
-
-	if err != nil {
-		fmt.Println("Value unknown:", err)
-
-		return otto.UndefinedValue()
-	}
-
-	return result
-}
diff --git a/ethereum/repl/javascript_runtime.go b/ethereum/repl/javascript_runtime.go
new file mode 100644
index 000000000..cd87f9868
--- /dev/null
+++ b/ethereum/repl/javascript_runtime.go
@@ -0,0 +1,231 @@
+package ethrepl
+
+import (
+	"fmt"
+	"github.com/ethereum/eth-go"
+	"github.com/ethereum/eth-go/ethchain"
+	"github.com/ethereum/eth-go/ethlog"
+	"github.com/ethereum/eth-go/ethpub"
+	"github.com/ethereum/eth-go/ethutil"
+	"github.com/ethereum/go-ethereum/utils"
+	"github.com/obscuren/otto"
+	"io/ioutil"
+	"os"
+	"path"
+	"path/filepath"
+)
+
+var jsrelogger = ethlog.NewLogger("JSRE")
+
+type JSRE struct {
+	ethereum *eth.Ethereum
+	vm       *otto.Otto
+	lib      *ethpub.PEthereum
+
+	blockChan  chan ethutil.React
+	changeChan chan ethutil.React
+	quitChan   chan bool
+
+	objectCb map[string][]otto.Value
+}
+
+func (jsre *JSRE) LoadExtFile(path string) {
+	result, err := ioutil.ReadFile(path)
+	if err == nil {
+		jsre.vm.Run(result)
+	} else {
+		jsrelogger.Debugln("Could not load file:", path)
+	}
+}
+
+func (jsre *JSRE) LoadIntFile(file string) {
+	assetPath := path.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "ethereal", "assets", "ext")
+	jsre.LoadExtFile(path.Join(assetPath, file))
+}
+
+func NewJSRE(ethereum *eth.Ethereum) *JSRE {
+	re := &JSRE{
+		ethereum,
+		otto.New(),
+		ethpub.NewPEthereum(ethereum),
+		make(chan ethutil.React, 1),
+		make(chan ethutil.React, 1),
+		make(chan bool),
+		make(map[string][]otto.Value),
+	}
+
+	// Init the JS lib
+	re.vm.Run(jsLib)
+
+	// Load extra javascript files
+	re.LoadIntFile("string.js")
+	re.LoadIntFile("big.js")
+
+	// We have to make sure that, whoever calls this, calls "Stop"
+	go re.mainLoop()
+
+	re.Bind("eth", &JSEthereum{re.lib, re.vm})
+
+	re.initStdFuncs()
+
+	jsrelogger.Infoln("started")
+
+	return re
+}
+
+func (self *JSRE) Bind(name string, v interface{}) {
+	self.vm.Set(name, v)
+}
+
+func (self *JSRE) Run(code string) (otto.Value, error) {
+	return self.vm.Run(code)
+}
+
+func (self *JSRE) Require(file string) error {
+	if len(filepath.Ext(file)) == 0 {
+		file += ".js"
+	}
+
+	fh, err := os.Open(file)
+	if err != nil {
+		return err
+	}
+
+	content, _ := ioutil.ReadAll(fh)
+	self.Run("exports = {};(function() {" + string(content) + "})();")
+
+	return nil
+}
+
+func (self *JSRE) Stop() {
+	// Kill the main loop
+	self.quitChan <- true
+
+	close(self.blockChan)
+	close(self.quitChan)
+	close(self.changeChan)
+	jsrelogger.Infoln("stopped")
+}
+
+func (self *JSRE) mainLoop() {
+	// Subscribe to events
+	reactor := self.ethereum.Reactor()
+	reactor.Subscribe("newBlock", self.blockChan)
+
+out:
+	for {
+		select {
+		case <-self.quitChan:
+			break out
+		case block := <-self.blockChan:
+			if _, ok := block.Resource.(*ethchain.Block); ok {
+			}
+		case object := <-self.changeChan:
+			if stateObject, ok := object.Resource.(*ethchain.StateObject); ok {
+				for _, cb := range self.objectCb[ethutil.Bytes2Hex(stateObject.Address())] {
+					val, _ := self.vm.ToValue(ethpub.NewPStateObject(stateObject))
+					cb.Call(cb, val)
+				}
+			} else if storageObject, ok := object.Resource.(*ethchain.StorageState); ok {
+				for _, cb := range self.objectCb[ethutil.Bytes2Hex(storageObject.StateAddress)+ethutil.Bytes2Hex(storageObject.Address)] {
+					val, _ := self.vm.ToValue(ethpub.NewPStorageState(storageObject))
+					cb.Call(cb, val)
+				}
+			}
+		}
+	}
+}
+
+func (self *JSRE) initStdFuncs() {
+	t, _ := self.vm.Get("eth")
+	eth := t.Object()
+	eth.Set("watch", self.watch)
+	eth.Set("addPeer", self.addPeer)
+	eth.Set("require", self.require)
+	eth.Set("stopMining", self.stopMining)
+	eth.Set("startMining", self.startMining)
+	eth.Set("execBlock", self.execBlock)
+}
+
+/*
+ * The following methods are natively implemented javascript functions
+ */
+
+func (self *JSRE) stopMining(call otto.FunctionCall) otto.Value {
+	v, _ := self.vm.ToValue(utils.StopMining(self.ethereum))
+	return v
+}
+
+func (self *JSRE) startMining(call otto.FunctionCall) otto.Value {
+	v, _ := self.vm.ToValue(utils.StartMining(self.ethereum))
+	return v
+}
+
+// eth.watch
+func (self *JSRE) watch(call otto.FunctionCall) otto.Value {
+	addr, _ := call.Argument(0).ToString()
+	var storageAddr string
+	var cb otto.Value
+	var storageCallback bool
+	if len(call.ArgumentList) > 2 {
+		storageCallback = true
+		storageAddr, _ = call.Argument(1).ToString()
+		cb = call.Argument(2)
+	} else {
+		cb = call.Argument(1)
+	}
+
+	if storageCallback {
+		self.objectCb[addr+storageAddr] = append(self.objectCb[addr+storageAddr], cb)
+
+		event := "storage:" + string(ethutil.Hex2Bytes(addr)) + ":" + string(ethutil.Hex2Bytes(storageAddr))
+		self.ethereum.Reactor().Subscribe(event, self.changeChan)
+	} else {
+		self.objectCb[addr] = append(self.objectCb[addr], cb)
+
+		event := "object:" + string(ethutil.Hex2Bytes(addr))
+		self.ethereum.Reactor().Subscribe(event, self.changeChan)
+	}
+
+	return otto.UndefinedValue()
+}
+
+func (self *JSRE) addPeer(call otto.FunctionCall) otto.Value {
+	host, err := call.Argument(0).ToString()
+	if err != nil {
+		return otto.FalseValue()
+	}
+	self.ethereum.ConnectToPeer(host)
+
+	return otto.TrueValue()
+}
+
+func (self *JSRE) require(call otto.FunctionCall) otto.Value {
+	file, err := call.Argument(0).ToString()
+	if err != nil {
+		return otto.UndefinedValue()
+	}
+	if err := self.Require(file); err != nil {
+		fmt.Println("err:", err)
+		return otto.UndefinedValue()
+	}
+
+	t, _ := self.vm.Get("exports")
+
+	return t
+}
+
+func (self *JSRE) execBlock(call otto.FunctionCall) otto.Value {
+	hash, err := call.Argument(0).ToString()
+	if err != nil {
+		return otto.UndefinedValue()
+	}
+
+	err = utils.BlockDo(self.ethereum, ethutil.Hex2Bytes(hash))
+	if err != nil {
+		fmt.Println(err)
+		return otto.FalseValue()
+	}
+
+	return otto.TrueValue()
+}
diff --git a/ethereum/repl/js_lib.go b/ethereum/repl/js_lib.go
new file mode 100644
index 000000000..c781c43d0
--- /dev/null
+++ b/ethereum/repl/js_lib.go
@@ -0,0 +1,53 @@
+package ethrepl
+
+const jsLib = `
+function pp(object) {
+    var str = "";
+
+    if(object instanceof Array) {
+        str += "[ ";
+        for(var i = 0, l = object.length; i < l; i++) {
+            str += pp(object[i]);
+
+            if(i < l-1) {
+                str += ", ";
+            }
+        }
+        str += " ]";
+    } else if(typeof(object) === "object") {
+        str += "{ ";
+        var last = Object.keys(object).sort().pop()
+        for(var k in object) {
+            str += k + ": " + pp(object[k]);
+
+            if(k !== last) {
+                str += ", ";
+            }
+        }
+        str += " }";
+    } else if(typeof(object) === "string") {
+        str += "\033[32m'" + object + "'";
+    } else if(typeof(object) === "undefined") {
+        str += "\033[1m\033[30m" + object;
+    } else if(typeof(object) === "number") {
+        str += "\033[31m" + object;
+    } else if(typeof(object) === "function") {
+	str += "\033[35m[Function]";
+    } else {
+        str += object;                    
+    }
+
+    str += "\033[0m";
+
+    return str;
+}
+
+function prettyPrint(/* */) {
+    var args = arguments;
+    for(var i = 0, l = args.length; i < l; i++) {
+	    console.log(pp(args[i]))
+    }
+}
+
+var print = prettyPrint;
+`
diff --git a/ethereum/repl/repl.go b/ethereum/repl/repl.go
new file mode 100644
index 000000000..92d4ad86a
--- /dev/null
+++ b/ethereum/repl/repl.go
@@ -0,0 +1,83 @@
+package ethrepl
+
+import (
+	"bufio"
+	"fmt"
+	"github.com/ethereum/eth-go"
+	"github.com/ethereum/eth-go/ethlog"
+	"github.com/ethereum/eth-go/ethutil"
+	"io"
+	"os"
+	"path"
+)
+
+var logger = ethlog.NewLogger("REPL")
+
+type Repl interface {
+	Start()
+	Stop()
+}
+
+type JSRepl struct {
+	re *JSRE
+
+	prompt string
+
+	history *os.File
+
+	running bool
+}
+
+func NewJSRepl(ethereum *eth.Ethereum) *JSRepl {
+	hist, err := os.OpenFile(path.Join(ethutil.Config.ExecPath, "history"), os.O_RDWR|os.O_CREATE, os.ModePerm)
+	if err != nil {
+		panic(err)
+	}
+
+	return &JSRepl{re: NewJSRE(ethereum), prompt: "> ", history: hist}
+}
+
+func (self *JSRepl) Start() {
+	if !self.running {
+		self.running = true
+		logger.Infoln("init JS Console")
+		reader := bufio.NewReader(self.history)
+		for {
+			line, err := reader.ReadString('\n')
+			if err != nil && err == io.EOF {
+				break
+			} else if err != nil {
+				fmt.Println("error reading history", err)
+				break
+			}
+
+			addHistory(line[:len(line)-1])
+		}
+		self.read()
+	}
+}
+
+func (self *JSRepl) Stop() {
+	if self.running {
+		self.running = false
+		self.re.Stop()
+		logger.Infoln("exit JS Console")
+		self.history.Close()
+	}
+}
+
+func (self *JSRepl) parseInput(code string) {
+	defer func() {
+		if r := recover(); r != nil {
+			fmt.Println("[native] error", r)
+		}
+	}()
+
+	value, err := self.re.Run(code)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	self.PrintValue(value)
+}
diff --git a/ethereum/repl/repl_darwin.go b/ethereum/repl/repl_darwin.go
new file mode 100644
index 000000000..3a91b0d44
--- /dev/null
+++ b/ethereum/repl/repl_darwin.go
@@ -0,0 +1,123 @@
+package ethrepl
+
+// #cgo darwin CFLAGS: -I/usr/local/opt/readline/include
+// #cgo darwin LDFLAGS: -L/usr/local/opt/readline/lib
+// #cgo LDFLAGS: -lreadline
+// #include <stdio.h>
+// #include <stdlib.h>
+// #include <readline/readline.h>
+// #include <readline/history.h>
+import "C"
+import (
+	"os"
+	"os/signal"
+	"strings"
+	"syscall"
+	"unsafe"
+)
+
+func initReadLine() {
+	C.rl_catch_sigwinch = 0
+	C.rl_catch_signals = 0
+	c := make(chan os.Signal, 1)
+	signal.Notify(c, syscall.SIGWINCH)
+	signal.Notify(c, os.Interrupt)
+	go func() {
+		for sig := range c {
+			switch sig {
+			case syscall.SIGWINCH:
+				C.rl_resize_terminal()
+
+			case os.Interrupt:
+				C.rl_cleanup_after_signal()
+			default:
+
+			}
+		}
+	}()
+}
+
+func readLine(prompt *string) *string {
+	var p *C.char
+
+	//readline allows an empty prompt(NULL)
+	if prompt != nil {
+		p = C.CString(*prompt)
+	}
+
+	ret := C.readline(p)
+
+	if p != nil {
+		C.free(unsafe.Pointer(p))
+	}
+
+	if ret == nil {
+		return nil
+	} //EOF
+
+	s := C.GoString(ret)
+	C.free(unsafe.Pointer(ret))
+	return &s
+}
+
+func addHistory(s string) {
+	p := C.CString(s)
+	C.add_history(p)
+	C.free(unsafe.Pointer(p))
+}
+
+var indentCount = 0
+var str = ""
+
+func (self *JSRepl) setIndent() {
+	open := strings.Count(str, "{")
+	open += strings.Count(str, "(")
+	closed := strings.Count(str, "}")
+	closed += strings.Count(str, ")")
+	indentCount = open - closed
+	if indentCount <= 0 {
+		self.prompt = "> "
+	} else {
+		self.prompt = strings.Join(make([]string, indentCount*2), "..")
+		self.prompt += " "
+	}
+}
+
+func (self *JSRepl) read() {
+	initReadLine()
+L:
+	for {
+		switch result := readLine(&self.prompt); true {
+		case result == nil:
+			break L
+
+		case *result != "":
+			str += *result + "\n"
+
+			self.setIndent()
+
+			if indentCount <= 0 {
+				if *result == "exit" {
+					self.Stop()
+					break L
+				}
+
+				hist := str[:len(str)-1]
+				addHistory(hist) //allow user to recall this line
+				self.history.WriteString(str)
+
+				self.parseInput(str)
+
+				str = ""
+			}
+		}
+	}
+}
+
+func (self *JSRepl) PrintValue(v interface{}) {
+	method, _ := self.re.vm.Get("prettyPrint")
+	v, err := self.re.vm.ToValue(v)
+	if err == nil {
+		method.Call(method, v)
+	}
+}
diff --git a/ethereum/repl/repl_linux.go b/ethereum/repl/repl_linux.go
new file mode 120000
index 000000000..276f135d7
--- /dev/null
+++ b/ethereum/repl/repl_linux.go
@@ -0,0 +1 @@
+repl_darwin.go
\ No newline at end of file
diff --git a/ethereum/repl/repl_windows.go b/ethereum/repl/repl_windows.go
new file mode 100644
index 000000000..4106c89bc
--- /dev/null
+++ b/ethereum/repl/repl_windows.go
@@ -0,0 +1,24 @@
+package ethrepl
+
+import (
+	"bufio"
+	"fmt"
+	"os"
+)
+
+func (self *JSRepl) read() {
+	reader := bufio.NewReader(os.Stdin)
+	for {
+		fmt.Printf(self.prompt)
+		str, _, err := reader.ReadLine()
+		if err != nil {
+			fmt.Println("Error reading input", err)
+		} else {
+			self.parseInput(string(str))
+		}
+	}
+}
+
+func (self *JSRepl) PrintValue(value otto.Value) {
+	fmt.Println(value)
+}
diff --git a/ethereum/repl/types.go b/ethereum/repl/types.go
new file mode 100644
index 000000000..16a18e6e5
--- /dev/null
+++ b/ethereum/repl/types.go
@@ -0,0 +1,95 @@
+package ethrepl
+
+import (
+	"fmt"
+	"github.com/ethereum/eth-go/ethpub"
+	"github.com/ethereum/eth-go/ethutil"
+	"github.com/obscuren/otto"
+)
+
+type JSStateObject struct {
+	*ethpub.PStateObject
+	eth *JSEthereum
+}
+
+func (self *JSStateObject) EachStorage(call otto.FunctionCall) otto.Value {
+	cb := call.Argument(0)
+	self.PStateObject.EachStorage(func(key string, value *ethutil.Value) {
+		value.Decode()
+
+		cb.Call(self.eth.toVal(self), self.eth.toVal(key), self.eth.toVal(ethutil.Bytes2Hex(value.Bytes())))
+	})
+
+	return otto.UndefinedValue()
+}
+
+// The JSEthereum object attempts to wrap the PEthereum object and returns
+// meaningful javascript objects
+type JSBlock struct {
+	*ethpub.PBlock
+	eth *JSEthereum
+}
+
+func (self *JSBlock) GetTransaction(hash string) otto.Value {
+	return self.eth.toVal(self.PBlock.GetTransaction(hash))
+}
+
+type JSEthereum struct {
+	*ethpub.PEthereum
+	vm *otto.Otto
+}
+
+func (self *JSEthereum) GetBlock(hash string) otto.Value {
+	return self.toVal(&JSBlock{self.PEthereum.GetBlock(hash), self})
+}
+
+func (self *JSEthereum) GetPeers() otto.Value {
+	return self.toVal(self.PEthereum.GetPeers())
+}
+
+func (self *JSEthereum) GetKey() otto.Value {
+	return self.toVal(self.PEthereum.GetKey())
+}
+
+func (self *JSEthereum) GetStateObject(addr string) otto.Value {
+	return self.toVal(&JSStateObject{self.PEthereum.GetStateObject(addr), self})
+}
+
+func (self *JSEthereum) GetStateKeyVals(addr string) otto.Value {
+	return self.toVal(self.PEthereum.GetStateObject(addr).StateKeyVal(false))
+}
+
+func (self *JSEthereum) Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr string) otto.Value {
+	r, err := self.PEthereum.Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr)
+	if err != nil {
+		fmt.Println(err)
+
+		return otto.UndefinedValue()
+	}
+
+	return self.toVal(r)
+}
+
+func (self *JSEthereum) Create(key, valueStr, gasStr, gasPriceStr, scriptStr string) otto.Value {
+	r, err := self.PEthereum.Create(key, valueStr, gasStr, gasPriceStr, scriptStr)
+
+	if err != nil {
+		fmt.Println(err)
+
+		return otto.UndefinedValue()
+	}
+
+	return self.toVal(r)
+}
+
+func (self *JSEthereum) toVal(v interface{}) otto.Value {
+	result, err := self.vm.ToValue(v)
+
+	if err != nil {
+		fmt.Println("Value unknown:", err)
+
+		return otto.UndefinedValue()
+	}
+
+	return result
+}
diff --git a/ethereum/repl_darwin.go b/ethereum/repl_darwin.go
deleted file mode 100644
index 62b40059a..000000000
--- a/ethereum/repl_darwin.go
+++ /dev/null
@@ -1,123 +0,0 @@
-package main
-
-// #cgo darwin CFLAGS: -I/usr/local/opt/readline/include
-// #cgo darwin LDFLAGS: -L/usr/local/opt/readline/lib
-// #cgo LDFLAGS: -lreadline
-// #include <stdio.h>
-// #include <stdlib.h>
-// #include <readline/readline.h>
-// #include <readline/history.h>
-import "C"
-import (
-	"os"
-	"os/signal"
-	"strings"
-	"syscall"
-	"unsafe"
-)
-
-func initReadLine() {
-	C.rl_catch_sigwinch = 0
-	C.rl_catch_signals = 0
-	c := make(chan os.Signal, 1)
-	signal.Notify(c, syscall.SIGWINCH)
-	signal.Notify(c, os.Interrupt)
-	go func() {
-		for sig := range c {
-			switch sig {
-			case syscall.SIGWINCH:
-				C.rl_resize_terminal()
-
-			case os.Interrupt:
-				C.rl_cleanup_after_signal()
-			default:
-
-			}
-		}
-	}()
-}
-
-func readLine(prompt *string) *string {
-	var p *C.char
-
-	//readline allows an empty prompt(NULL)
-	if prompt != nil {
-		p = C.CString(*prompt)
-	}
-
-	ret := C.readline(p)
-
-	if p != nil {
-		C.free(unsafe.Pointer(p))
-	}
-
-	if ret == nil {
-		return nil
-	} //EOF
-
-	s := C.GoString(ret)
-	C.free(unsafe.Pointer(ret))
-	return &s
-}
-
-func addHistory(s string) {
-	p := C.CString(s)
-	C.add_history(p)
-	C.free(unsafe.Pointer(p))
-}
-
-var indentCount = 0
-var str = ""
-
-func (self *JSRepl) setIndent() {
-	open := strings.Count(str, "{")
-	open += strings.Count(str, "(")
-	closed := strings.Count(str, "}")
-	closed += strings.Count(str, ")")
-	indentCount = open - closed
-	if indentCount <= 0 {
-		self.prompt = "> "
-	} else {
-		self.prompt = strings.Join(make([]string, indentCount*2), "..")
-		self.prompt += " "
-	}
-}
-
-func (self *JSRepl) read() {
-	initReadLine()
-L:
-	for {
-		switch result := readLine(&self.prompt); true {
-		case result == nil:
-			break L
-
-		case *result != "":
-			str += *result + "\n"
-
-			self.setIndent()
-
-			if indentCount <= 0 {
-				if *result == "exit" {
-					self.Stop()
-					break L
-				}
-
-				hist := str[:len(str)-1]
-				addHistory(hist) //allow user to recall this line
-				self.history.WriteString(str)
-
-				self.parseInput(str)
-
-				str = ""
-			}
-		}
-	}
-}
-
-func (self *JSRepl) PrintValue(v interface{}) {
-	method, _ := self.re.vm.Get("prettyPrint")
-	v, err := self.re.vm.ToValue(v)
-	if err == nil {
-		method.Call(method, v)
-	}
-}
diff --git a/ethereum/repl_linux.go b/ethereum/repl_linux.go
deleted file mode 120000
index 276f135d7..000000000
--- a/ethereum/repl_linux.go
+++ /dev/null
@@ -1 +0,0 @@
-repl_darwin.go
\ No newline at end of file
diff --git a/ethereum/repl_windows.go b/ethereum/repl_windows.go
deleted file mode 100644
index 9d4787772..000000000
--- a/ethereum/repl_windows.go
+++ /dev/null
@@ -1,24 +0,0 @@
-package main
-
-import (
-	"bufio"
-	"fmt"
-	"os"
-)
-
-func (self *JSRepl) read() {
-	reader := bufio.NewReader(os.Stdin)
-	for {
-		fmt.Printf(self.prompt)
-		str, _, err := reader.ReadLine()
-		if err != nil {
-			fmt.Println("Error reading input", err)
-		} else {
-			self.parseInput(string(str))
-		}
-	}
-}
-
-func (self *JSRepl) PrintValue(value otto.Value) {
-	fmt.Println(value)
-}
-- 
cgit v1.2.3


From 7d64b589b4cf3f71125d5bd0f0a8f6a560e909db Mon Sep 17 00:00:00 2001
From: obscuren <geffobscura@gmail.com>
Date: Thu, 17 Jul 2014 15:02:25 +0200
Subject: h scroll

---
 ethereal/assets/debugger/debugger.qml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ethereal/assets/debugger/debugger.qml b/ethereal/assets/debugger/debugger.qml
index fa56737a2..34fe01253 100644
--- a/ethereal/assets/debugger/debugger.qml
+++ b/ethereal/assets/debugger/debugger.qml
@@ -86,7 +86,7 @@ ApplicationWindow {
 		TableView {
 			id: asmTableView
 			width: 200
-			TableViewColumn{ role: "value" ; title: "" ; width: 200 }
+			TableViewColumn{ role: "value" ; title: "" ; width: asmTableView.width - 2 }
 			model: asmModel
 		}
 
-- 
cgit v1.2.3


From 6c565eae74b1e1a8175f12fd0e26b70e0ad730c1 Mon Sep 17 00:00:00 2001
From: obscuren <geffobscura@gmail.com>
Date: Thu, 17 Jul 2014 15:36:16 +0200
Subject: bump

---
 README.md        | 2 +-
 ethereal/main.go | 2 +-
 ethereum/main.go | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/README.md b/README.md
index 11b7ed7e9..29dae7341 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@ Ethereum
 
 Ethereum Go Client © 2014 Jeffrey Wilcke.
 
-Current state: Proof of Concept 0.5.16.
+Current state: Proof of Concept 0.5.17.
 
 For the development package please see the [eth-go package](https://github.com/ethereum/eth-go).
 
diff --git a/ethereal/main.go b/ethereal/main.go
index 645e8f2ce..e1cd43ace 100644
--- a/ethereal/main.go
+++ b/ethereal/main.go
@@ -10,7 +10,7 @@ import (
 
 const (
 	ClientIdentifier = "Ethereal"
-	Version          = "0.5.16"
+	Version          = "0.5.17"
 )
 
 func main() {
diff --git a/ethereum/main.go b/ethereum/main.go
index fd4a89aa9..b670cb495 100644
--- a/ethereum/main.go
+++ b/ethereum/main.go
@@ -9,7 +9,7 @@ import (
 
 const (
 	ClientIdentifier = "Ethereum(G)"
-	Version          = "0.5.16"
+	Version          = "0.5.17"
 )
 
 var logger = ethlog.NewLogger("CLI")
-- 
cgit v1.2.3


From edf10ef8c5908ffdc787dc9457da6d735212423d Mon Sep 17 00:00:00 2001
From: obscuren <geffobscura@gmail.com>
Date: Thu, 17 Jul 2014 17:10:35 +0200
Subject: Fixed name reg

---
 ethereal/gui.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ethereal/gui.go b/ethereal/gui.go
index 9f28045f8..39677c38f 100644
--- a/ethereal/gui.go
+++ b/ethereal/gui.go
@@ -356,7 +356,7 @@ func (gui *Gui) address() []byte {
 }
 
 func (gui *Gui) RegisterName(name string) {
-	name = fmt.Sprintf("\"%s\"", name)
+	name = fmt.Sprintf("\"register\"\n\"%s\"", name)
 
 	gui.pub.Transact(gui.privateKey(), "NameReg", "", "10000", "10000000000000", name)
 }
-- 
cgit v1.2.3


From ba3fabda774cc3f0c12542985c7ff252abc034da Mon Sep 17 00:00:00 2001
From: obscuren <geffobscura@gmail.com>
Date: Thu, 17 Jul 2014 22:01:39 +0200
Subject: Added a catch up indicator

---
 ethereal/assets/qml/wallet.qml | 14 ++++++++++++++
 ethereal/gui.go                | 17 +++++++++++++----
 2 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/ethereal/assets/qml/wallet.qml b/ethereal/assets/qml/wallet.qml
index c783cde83..afb210bec 100644
--- a/ethereal/assets/qml/wallet.qml
+++ b/ethereal/assets/qml/wallet.qml
@@ -419,6 +419,17 @@ ApplicationWindow {
 			}
 		}
 
+        ProgressBar {
+            id: syncProgressIndicator
+            visible: false
+            objectName: "syncProgressIndicator"
+            y: 3
+            width: 140
+            indeterminate: true
+            anchors.right: peerLabel.left
+            anchors.rightMargin: 5
+        }
+
 		Label {
 			y: 7
 			anchors.right: peerImage.left
@@ -443,6 +454,7 @@ ApplicationWindow {
 	Window {
 		id: popup
 		visible: false
+        flags: Qt.CustomizeWindowHint | Qt.Tool | Qt.WindowCloseButtonHint
 		property var block
 		width: root.width
 		height: 300
@@ -577,6 +589,7 @@ ApplicationWindow {
 
 	Window {
 		id: addPeerWin
+        flags: Qt.CustomizeWindowHint | Qt.Tool | Qt.WindowCloseButtonHint
 		visible: false
 		minimumWidth: 230
 		maximumWidth: 230
@@ -743,6 +756,7 @@ ApplicationWindow {
 	// ******************************************
 	Window {
 		id: peerWindow
+        flags: Qt.CustomizeWindowHint | Qt.Tool | Qt.WindowCloseButtonHint
 		height: 200
 		width: 700
 		Rectangle {
diff --git a/ethereal/gui.go b/ethereal/gui.go
index 39677c38f..f777f64f7 100644
--- a/ethereal/gui.go
+++ b/ethereal/gui.go
@@ -266,14 +266,18 @@ func (gui *Gui) setWalletValue(amount, unconfirmedFunds *big.Int) {
 func (gui *Gui) update() {
 	reactor := gui.eth.Reactor()
 
-	blockChan := make(chan ethutil.React, 1)
-	txChan := make(chan ethutil.React, 1)
-	objectChan := make(chan ethutil.React, 1)
-	peerChan := make(chan ethutil.React, 1)
+	var (
+		blockChan     = make(chan ethutil.React, 1)
+		txChan        = make(chan ethutil.React, 1)
+		objectChan    = make(chan ethutil.React, 1)
+		peerChan      = make(chan ethutil.React, 1)
+		chainSyncChan = make(chan ethutil.React, 1)
+	)
 
 	reactor.Subscribe("newBlock", blockChan)
 	reactor.Subscribe("newTx:pre", txChan)
 	reactor.Subscribe("newTx:post", txChan)
+	reactor.Subscribe("chainSync", chainSyncChan)
 
 	nameReg := ethpub.EthereumConfig(gui.eth.StateManager()).NameReg()
 	if nameReg != nil {
@@ -287,6 +291,7 @@ func (gui *Gui) update() {
 
 	unconfirmedFunds := new(big.Int)
 	gui.win.Root().Call("setWalletValue", fmt.Sprintf("%v", ethutil.CurrencyToString(state.GetAccount(gui.address()).Amount)))
+	gui.win.Root().ObjectByName("syncProgressIndicator").Set("visible", !gui.eth.IsUpToDate())
 
 	for {
 		select {
@@ -328,6 +333,10 @@ func (gui *Gui) update() {
 
 				state.UpdateStateObject(object)
 			}
+		case msg := <-chainSyncChan:
+			sync := msg.Resource.(bool)
+			gui.win.Root().ObjectByName("syncProgressIndicator").Set("visible", sync)
+
 		case <-objectChan:
 			gui.loadAddressBook()
 		case <-peerChan:
-- 
cgit v1.2.3


From 01d9107bce356e4de94b9506246672d003948203 Mon Sep 17 00:00:00 2001
From: obscuren <geffobscura@gmail.com>
Date: Thu, 17 Jul 2014 22:30:17 +0200
Subject: Add namecoin name if available to block

---
 ethereal/assets/qml/wallet.qml | 6 +++---
 ethereal/gui.go                | 6 +++++-
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/ethereal/assets/qml/wallet.qml b/ethereal/assets/qml/wallet.qml
index afb210bec..a9e309356 100644
--- a/ethereal/assets/qml/wallet.qml
+++ b/ethereal/assets/qml/wallet.qml
@@ -472,7 +472,7 @@ ApplicationWindow {
 					Text { text: '<h3>Block details</h3>'; color: "#F2F2F2"}
 					Text { text: '<b>Block number:</b> ' + number; color: "#F2F2F2"}
 					Text { text: '<b>Hash:</b> ' + hash; color: "#F2F2F2"}
-					Text { text: '<b>Coinbase:</b> ' + coinbase; color: "#F2F2F2"}
+					Text { text: '<b>Coinbase:</b> <' + name + '> ' + coinbase; color: "#F2F2F2"}
 					Text { text: '<b>Block found at:</b> ' + prettyTime; color: "#F2F2F2"}
 					Text { text: '<b>Gas used:</b> ' + gasUsed + " / " + gasLimit; color: "#F2F2F2"}
 				}
@@ -699,9 +699,9 @@ ApplicationWindow {
 		}
 
 		if(initial){
-			blockModel.append({number: block.number, gasLimit: block.gasLimit, gasUsed: block.gasUsed, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)})
+			blockModel.append({number: block.number, name: block.name, gasLimit: block.gasLimit, gasUsed: block.gasUsed, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)})
 		}else{
-			blockModel.insert(0, {number: block.number, gasLimit: block.gasLimit, gasUsed: block.gasUsed, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)})
+			blockModel.insert(0, {number: block.number, name: block.name, gasLimit: block.gasLimit, gasUsed: block.gasUsed, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)})
 		}
 	}
 
diff --git a/ethereal/gui.go b/ethereal/gui.go
index f777f64f7..9a65ff3d0 100644
--- a/ethereal/gui.go
+++ b/ethereal/gui.go
@@ -243,7 +243,11 @@ func (gui *Gui) readPreviousTransactions() {
 }
 
 func (gui *Gui) processBlock(block *ethchain.Block, initial bool) {
-	gui.win.Root().Call("addBlock", ethpub.NewPBlock(block), initial)
+	name := ethpub.FindNameInNameReg(gui.eth.StateManager(), block.Coinbase)
+	b := ethpub.NewPBlock(block)
+	b.Name = name
+
+	gui.win.Root().Call("addBlock", b, initial)
 }
 
 func (gui *Gui) setWalletValue(amount, unconfirmedFunds *big.Int) {
-- 
cgit v1.2.3


From 44296c0b33de5f6c2ff28c6a0fd528d6ccd04dec Mon Sep 17 00:00:00 2001
From: obscuren <geffobscura@gmail.com>
Date: Thu, 17 Jul 2014 23:17:10 +0200
Subject: html tags not allowed

---
 ethereal/assets/qml/wallet.qml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ethereal/assets/qml/wallet.qml b/ethereal/assets/qml/wallet.qml
index a9e309356..592698d8e 100644
--- a/ethereal/assets/qml/wallet.qml
+++ b/ethereal/assets/qml/wallet.qml
@@ -472,7 +472,7 @@ ApplicationWindow {
 					Text { text: '<h3>Block details</h3>'; color: "#F2F2F2"}
 					Text { text: '<b>Block number:</b> ' + number; color: "#F2F2F2"}
 					Text { text: '<b>Hash:</b> ' + hash; color: "#F2F2F2"}
-					Text { text: '<b>Coinbase:</b> <' + name + '> ' + coinbase; color: "#F2F2F2"}
+					Text { text: '<b>Coinbase:</b> &lt;' + name + '&gt; ' + coinbase; color: "#F2F2F2"}
 					Text { text: '<b>Block found at:</b> ' + prettyTime; color: "#F2F2F2"}
 					Text { text: '<b>Gas used:</b> ' + gasUsed + " / " + gasLimit; color: "#F2F2F2"}
 				}
-- 
cgit v1.2.3


From 34e2ab9f9fac7067fa4a4dbe6170283f1d9c682a Mon Sep 17 00:00:00 2001
From: obscuren <geffobscura@gmail.com>
Date: Fri, 18 Jul 2014 11:57:58 +0200
Subject: Added block update

---
 ethereal/assets/qml/wallet.qml | 52 ++++++++++++++++++++++++++----------------
 ethereal/debugger.go           |  3 +++
 ethereal/gui.go                | 15 +++++++++---
 3 files changed, 47 insertions(+), 23 deletions(-)

diff --git a/ethereal/assets/qml/wallet.qml b/ethereal/assets/qml/wallet.qml
index 592698d8e..bb1f60260 100644
--- a/ethereal/assets/qml/wallet.qml
+++ b/ethereal/assets/qml/wallet.qml
@@ -419,6 +419,17 @@ ApplicationWindow {
 			}
 		}
 
+        Label {
+            y: 6
+            id: lastBlockLabel
+            objectName: "lastBlockLabel"
+            visible: true
+            text: ""
+			font.pixelSize: 10
+            anchors.right: peerGroup.left
+            anchors.rightMargin: 5
+        }
+
         ProgressBar {
             id: syncProgressIndicator
             visible: false
@@ -426,29 +437,30 @@ ApplicationWindow {
             y: 3
             width: 140
             indeterminate: true
-            anchors.right: peerLabel.left
+            anchors.right: peerGroup.left
             anchors.rightMargin: 5
         }
 
-		Label {
-			y: 7
-			anchors.right: peerImage.left
-			anchors.rightMargin: 5
-			id: peerLabel
-			font.pixelSize: 8
-			text: "0 / 0"
-		}
-		Image {
-			y: 7
-			id: peerImage
-			anchors.right: parent.right
-			width: 10; height: 10
-			MouseArea {
-				onDoubleClicked:  peerWindow.visible = true
-				anchors.fill: parent
-			}
-			source: "../network.png"
-		}
+        RowLayout {
+            id: peerGroup
+            y: 7
+            anchors.right: parent.right
+            MouseArea {
+                onDoubleClicked:  peerWindow.visible = true
+                anchors.fill: parent
+            }
+
+            Label {
+                id: peerLabel
+                font.pixelSize: 8
+                text: "0 / 0"
+            }
+            Image {
+                id: peerImage
+                width: 10; height: 10
+                source: "../network.png"
+            }
+        }
 	}
 
 	Window {
diff --git a/ethereal/debugger.go b/ethereal/debugger.go
index 997c2e8dd..7742b1627 100644
--- a/ethereal/debugger.go
+++ b/ethereal/debugger.go
@@ -17,6 +17,8 @@ type DebuggerWindow struct {
 
 	vm *ethchain.Vm
 	Db *Debugger
+
+	state *ethchain.State
 }
 
 func NewDebuggerWindow(lib *UiLib) *DebuggerWindow {
@@ -53,6 +55,7 @@ func (self *DebuggerWindow) SetCode(code string) {
 func (self *DebuggerWindow) SetData(data string) {
 	self.win.Set("dataText", data)
 }
+
 func (self *DebuggerWindow) SetAsm(data []byte) {
 	self.win.Root().Call("clearAsm")
 
diff --git a/ethereal/gui.go b/ethereal/gui.go
index 9a65ff3d0..ad701a584 100644
--- a/ethereal/gui.go
+++ b/ethereal/gui.go
@@ -266,6 +266,10 @@ func (gui *Gui) setWalletValue(amount, unconfirmedFunds *big.Int) {
 	gui.win.Root().Call("setWalletValue", str)
 }
 
+func (self *Gui) getObjectByName(objectName string) qml.Object {
+	return self.win.Root().ObjectByName(objectName)
+}
+
 // Simple go routine function that updates the list of peers in the GUI
 func (gui *Gui) update() {
 	reactor := gui.eth.Reactor()
@@ -289,13 +293,16 @@ func (gui *Gui) update() {
 	}
 	reactor.Subscribe("peerList", peerChan)
 
-	ticker := time.NewTicker(5 * time.Second)
+	peerUpdateTicker := time.NewTicker(5 * time.Second)
+	generalUpdateTicker := time.NewTicker(1 * time.Second)
 
 	state := gui.eth.StateManager().TransState()
 
 	unconfirmedFunds := new(big.Int)
 	gui.win.Root().Call("setWalletValue", fmt.Sprintf("%v", ethutil.CurrencyToString(state.GetAccount(gui.address()).Amount)))
-	gui.win.Root().ObjectByName("syncProgressIndicator").Set("visible", !gui.eth.IsUpToDate())
+	gui.getObjectByName("syncProgressIndicator").Set("visible", !gui.eth.IsUpToDate())
+
+	lastBlockLabel := gui.getObjectByName("lastBlockLabel")
 
 	for {
 		select {
@@ -345,8 +352,10 @@ func (gui *Gui) update() {
 			gui.loadAddressBook()
 		case <-peerChan:
 			gui.setPeerInfo()
-		case <-ticker.C:
+		case <-peerUpdateTicker.C:
 			gui.setPeerInfo()
+		case <-generalUpdateTicker.C:
+			lastBlockLabel.Set("text", "#"+gui.eth.BlockChain().CurrentBlock.Number.String())
 		}
 	}
 }
-- 
cgit v1.2.3


From 2b9f16802d22b8d743797aecc9bd040a38d6f1f4 Mon Sep 17 00:00:00 2001
From: Maran <maran.hidskes@gmail.com>
Date: Fri, 18 Jul 2014 12:01:26 +0200
Subject: WIP to expose hashrate to gui

---
 ethereal/gui.go | 8 ++++++++
 utils/cmd.go    | 4 ++++
 2 files changed, 12 insertions(+)

diff --git a/ethereal/gui.go b/ethereal/gui.go
index 9a65ff3d0..8047db63e 100644
--- a/ethereal/gui.go
+++ b/ethereal/gui.go
@@ -7,6 +7,7 @@ import (
 	"github.com/ethereum/eth-go/ethchain"
 	"github.com/ethereum/eth-go/ethdb"
 	"github.com/ethereum/eth-go/ethlog"
+	"github.com/ethereum/eth-go/ethminer"
 	"github.com/ethereum/eth-go/ethpub"
 	"github.com/ethereum/eth-go/ethutil"
 	"github.com/ethereum/eth-go/ethwire"
@@ -40,6 +41,8 @@ type Gui struct {
 	Session        string
 	clientIdentity *ethwire.SimpleClientIdentity
 	config         *ethutil.ConfigManager
+
+	miner *ethminer.Miner
 }
 
 // Create GUI, but doesn't start it
@@ -124,6 +127,7 @@ func (gui *Gui) ToggleMining() {
 		txt = "Start mining"
 	} else {
 		utils.StartMining(gui.eth)
+		gui.miner = utils.GetMiner()
 		txt = "Stop mining"
 	}
 
@@ -346,6 +350,10 @@ func (gui *Gui) update() {
 		case <-peerChan:
 			gui.setPeerInfo()
 		case <-ticker.C:
+			if gui.miner != nil {
+				pow := gui.miner.GetPow()
+				fmt.Println("HashRate from miner", pow.GetHashrate())
+			}
 			gui.setPeerInfo()
 		}
 	}
diff --git a/utils/cmd.go b/utils/cmd.go
index 1e1599582..638114bbe 100644
--- a/utils/cmd.go
+++ b/utils/cmd.go
@@ -236,6 +236,10 @@ func StartRpc(ethereum *eth.Ethereum, RpcPort int) {
 
 var miner ethminer.Miner
 
+func GetMiner() *ethminer.Miner {
+	return &miner
+}
+
 func StartMining(ethereum *eth.Ethereum) bool {
 	if !ethereum.Mining {
 		ethereum.Mining = true
-- 
cgit v1.2.3


From 4572d4940c5b027918364e0600fc88a50f73ed16 Mon Sep 17 00:00:00 2001
From: obscuren <geffobscura@gmail.com>
Date: Fri, 18 Jul 2014 12:02:45 +0200
Subject: Windows don't like dem flags

---
 ethereal/assets/qml/wallet.qml | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/ethereal/assets/qml/wallet.qml b/ethereal/assets/qml/wallet.qml
index bb1f60260..a79e4708c 100644
--- a/ethereal/assets/qml/wallet.qml
+++ b/ethereal/assets/qml/wallet.qml
@@ -466,7 +466,7 @@ ApplicationWindow {
 	Window {
 		id: popup
 		visible: false
-        flags: Qt.CustomizeWindowHint | Qt.Tool | Qt.WindowCloseButtonHint
+        //flags: Qt.CustomizeWindowHint | Qt.Tool | Qt.WindowCloseButtonHint
 		property var block
 		width: root.width
 		height: 300
@@ -601,7 +601,7 @@ ApplicationWindow {
 
 	Window {
 		id: addPeerWin
-        flags: Qt.CustomizeWindowHint | Qt.Tool | Qt.WindowCloseButtonHint
+        //flags: Qt.CustomizeWindowHint | Qt.Tool | Qt.WindowCloseButtonHint
 		visible: false
 		minimumWidth: 230
 		maximumWidth: 230
@@ -768,7 +768,7 @@ ApplicationWindow {
 	// ******************************************
 	Window {
 		id: peerWindow
-        flags: Qt.CustomizeWindowHint | Qt.Tool | Qt.WindowCloseButtonHint
+        //flags: Qt.CustomizeWindowHint | Qt.Tool | Qt.WindowCloseButtonHint
 		height: 200
 		width: 700
 		Rectangle {
-- 
cgit v1.2.3


From 0c5a747ef1e9f64f7c5627256b87ed47d23438db Mon Sep 17 00:00:00 2001
From: Maran <maran.hidskes@gmail.com>
Date: Fri, 18 Jul 2014 12:29:14 +0200
Subject: Add mining hash to GUI

---
 ethereal/gui.go | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/ethereal/gui.go b/ethereal/gui.go
index cfe5e2269..d816a774f 100644
--- a/ethereal/gui.go
+++ b/ethereal/gui.go
@@ -14,6 +14,7 @@ import (
 	"github.com/ethereum/go-ethereum/utils"
 	"github.com/go-qml/qml"
 	"math/big"
+	"strconv"
 	"strings"
 	"time"
 )
@@ -369,11 +370,14 @@ func (gui *Gui) update() {
 			}
 
 		case <-generalUpdateTicker.C:
+			statusText := "#" + gui.eth.BlockChain().CurrentBlock.Number.String()
 			if gui.miner != nil {
 				pow := gui.miner.GetPow()
-				fmt.Println("HashRate from miner", pow.GetHashrate())
+				if pow.GetHashrate() != 0 {
+					statusText = "Mining @ " + strconv.FormatInt(pow.GetHashrate(), 10) + "Khash - " + statusText
+				}
 			}
-			lastBlockLabel.Set("text", "#"+gui.eth.BlockChain().CurrentBlock.Number.String())
+			lastBlockLabel.Set("text", statusText)
 		}
 	}
 }
-- 
cgit v1.2.3


From f702e27485981562ed7b88ecd3f8485af4c61b62 Mon Sep 17 00:00:00 2001
From: obscuren <geffobscura@gmail.com>
Date: Fri, 18 Jul 2014 13:49:52 +0200
Subject: Fixed miner stopping / starting:wq

---
 utils/cmd.go | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/utils/cmd.go b/utils/cmd.go
index f4d613c29..5d0b3463c 100644
--- a/utils/cmd.go
+++ b/utils/cmd.go
@@ -247,7 +247,10 @@ func StartMining(ethereum *eth.Ethereum) bool {
 		addr := ethereum.KeyManager().Address()
 
 		go func() {
-			miner = ethminer.NewDefaultMiner(addr, ethereum)
+			if miner == nil {
+				miner = ethminer.NewDefaultMiner(addr, ethereum)
+			}
+
 			// Give it some time to connect with peers
 			time.Sleep(3 * time.Second)
 			for !ethereum.IsUpToDate() {
@@ -255,7 +258,6 @@ func StartMining(ethereum *eth.Ethereum) bool {
 			}
 
 			logger.Infoln("Miner started")
-			miner := ethminer.NewDefaultMiner(addr, ethereum)
 			miner.Start()
 		}()
 		RegisterInterrupt(func(os.Signal) {
@@ -269,10 +271,14 @@ func StartMining(ethereum *eth.Ethereum) bool {
 func StopMining(ethereum *eth.Ethereum) bool {
 	if ethereum.Mining && miner != nil {
 		miner.Stop()
+
 		logger.Infoln("Miner stopped")
+
 		ethereum.Mining = false
+
 		return true
 	}
+
 	return false
 }
 
-- 
cgit v1.2.3