diff --git a/README.md b/README.md
index 104e4725c..eee24f71e 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@ Ethereum
Ethereum Go Client © 2014 Jeffrey Wilcke.
-Current state: Proof of Concept 5.0 RC12.
+Current state: Proof of Concept 5.0 RC13.
For the development package please see the [eth-go package](https://github.com/ethereum/eth-go).
diff --git a/ethereal/assets/debugger/debugger.qml b/ethereal/assets/debugger/debugger.qml
index bc34233fd..31e0eb781 100644
--- a/ethereal/assets/debugger/debugger.qml
+++ b/ethereal/assets/debugger/debugger.qml
@@ -135,7 +135,7 @@ ApplicationWindow {
}
height: parent.height
width: 300
- TableViewColumn{ role: "value" ; title: "Stack" ; width: 200 }
+ TableViewColumn{ role: "value" ; title: "Temp" ; width: 200 }
model: stackModel
}
@@ -224,8 +224,8 @@ ApplicationWindow {
}
function setInstruction(num) {
- //asmTableView.selection.clear()
- //asmTableView.selection.select(num)
+ asmTableView.selection.clear()
+ asmTableView.selection.select(num)
}
function setMem(mem) {
diff --git a/ethereal/assets/qml/wallet.qml b/ethereal/assets/qml/wallet.qml
index fece8e7d6..a7c03f6d1 100644
--- a/ethereal/assets/qml/wallet.qml
+++ b/ethereal/assets/qml/wallet.qml
@@ -29,6 +29,7 @@ ApplicationWindow {
}
Menu {
+ title: "Developer"
MenuItem {
text: "Debugger"
shortcut: "Ctrl+d"
@@ -261,7 +262,7 @@ ApplicationWindow {
id: addressView
width: parent.width - 200
height: 200
- anchors.bottom: logView.top
+ anchors.bottom: logLayout.top
TableViewColumn{ role: "name"; title: "name" }
TableViewColumn{ role: "address"; title: "address"; width: 300}
@@ -296,14 +297,48 @@ ApplicationWindow {
property var logModel: ListModel {
id: logModel
}
- TableView {
- id: logView
+ RowLayout {
+ id: logLayout
width: parent.width
height: 200
anchors.bottom: parent.bottom
- TableViewColumn{ role: "description" ; title: "log" }
+ TableView {
+ id: logView
+ headerVisible: false
+ anchors {
+ right: logLevelSlider.left
+ left: parent.left
+ bottom: parent.bottom
+ top: parent.top
+ }
- model: logModel
+ TableViewColumn{ role: "description" ; title: "log" }
+
+ model: logModel
+ }
+
+ Slider {
+ id: logLevelSlider
+ value: 1
+ anchors {
+ right: parent.right
+ top: parent.top
+ bottom: parent.bottom
+
+ rightMargin: 5
+ leftMargin: 5
+ topMargin: 5
+ bottomMargin: 5
+ }
+
+ orientation: Qt.Vertical
+ maximumValue: 3
+ stepSize: 1
+
+ onValueChanged: {
+ eth.setLogLevel(value)
+ }
+ }
}
}
@@ -419,6 +454,7 @@ ApplicationWindow {
Text { text: 'Hash: ' + hash; color: "#F2F2F2"}
Text { text: 'Coinbase: ' + coinbase; color: "#F2F2F2"}
Text { text: 'Block found at: ' + prettyTime; color: "#F2F2F2"}
+ Text { text: 'Gas used: ' + gasUsed + " / " + gasLimit; color: "#F2F2F2"}
}
}
}
@@ -642,16 +678,27 @@ ApplicationWindow {
}
if(initial){
- blockModel.append({number: block.number, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)})
+ 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)})
}else{
- blockModel.insert(0, {number: block.number, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)})
+ 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)})
}
}
function addLog(str) {
- if(str.len != 0) {
- logModel.insert(0, {description: str})
+ // Remove first item once we've reached max log items
+ if(logModel.count > 250) {
+ logModel.remove(0)
}
+
+ if(str.len != 0) {
+ if(logView.flickableItem.atYEnd) {
+ logModel.append({description: str})
+ logView.positionViewAtRow(logView.rowCount - 1, ListView.Contain)
+ } else {
+ logModel.append({description: str})
+ }
+ }
+
}
function setPeers(text) {
@@ -767,6 +814,20 @@ ApplicationWindow {
anchors.leftMargin: 5
anchors.topMargin: 5
+ ListModel {
+ id: denomModel
+ ListElement { text: "Wei" ; zeros: "" }
+ ListElement { text: "Ada" ; zeros: "000" }
+ ListElement { text: "Babbage" ; zeros: "000000" }
+ ListElement { text: "Shannon" ; zeros: "000000000" }
+ ListElement { text: "Szabo" ; zeros: "000000000000" }
+ ListElement { text: "Finney" ; zeros: "000000000000000" }
+ ListElement { text: "Ether" ; zeros: "000000000000000000" }
+ ListElement { text: "Einstein" ;zeros: "000000000000000000000" }
+ ListElement { text: "Douglas" ; zeros: "000000000000000000000000000000000000000000" }
+ }
+
+
TextField {
id: txFuelRecipient
placeholderText: "Address / Name or empty for contract"
@@ -774,13 +835,21 @@ ApplicationWindow {
width: 400
}
- TextField {
- id: txValue
- width: 222
- placeholderText: "Amount"
- validator: RegExpValidator { regExp: /\d*/ }
- onTextChanged: {
- contractFormReady()
+ RowLayout {
+ TextField {
+ id: txValue
+ width: 222
+ placeholderText: "Amount"
+ validator: RegExpValidator { regExp: /\d*/ }
+ onTextChanged: {
+ contractFormReady()
+ }
+ }
+
+ ComboBox {
+ id: valueDenom
+ currentIndex: 6
+ model: denomModel
}
}
@@ -806,7 +875,7 @@ ApplicationWindow {
id: txGasPrice
width: 200
placeholderText: "Gas price"
- text: "1000000"
+ text: "10"
validator: RegExpValidator { regExp: /\d*/ }
/*
onTextChanged: {
@@ -814,6 +883,12 @@ ApplicationWindow {
}
*/
}
+
+ ComboBox {
+ id: gasDenom
+ currentIndex: 4
+ model: denomModel
+ }
}
Label {
@@ -847,8 +922,9 @@ ApplicationWindow {
]
text: "Send"
onClicked: {
- //this.enabled = false
- var res = eth.create(txFuelRecipient.text, txValue.text, txGas.text, txGasPrice.text, codeView.text)
+ var value = txValue.text + denomModel.get(valueDenom.currentIndex).zeros;
+ var gasPrice = txGasPrice.text + denomModel.get(gasDenom.currentIndex).zeros;
+ var res = eth.create(txFuelRecipient.text, value, txGas.text, gasPrice, codeView.text)
if(res[1]) {
txResult.text = "Your contract could not be send over the network:\n"
txResult.text += res[1].error()
diff --git a/ethereal/assets/qml/webapp.qml b/ethereal/assets/qml/webapp.qml
index ec236a18c..4a5a1293a 100644
--- a/ethereal/assets/qml/webapp.qml
+++ b/ethereal/assets/qml/webapp.qml
@@ -170,6 +170,30 @@ ApplicationWindow {
postEvent(ev, [storageObject.address, storageObject.value])
}
}
+ Rectangle {
+ id: toggleInspector
+ color: "#bcbcbc"
+ visible: true
+ height: 12
+ width: 12
+ anchors {
+ right: root.right
+ }
+ MouseArea {
+ onClicked: {
+ if(inspector.visible == true){
+ inspector.visible = false
+ }else{
+ inspector.visible = true
+ }
+ }
+ onDoubleClicked: {
+ console.log('refreshing')
+ webView.reload()
+ }
+ anchors.fill: parent
+ }
+ }
Rectangle {
id: sizeGrip
@@ -193,7 +217,7 @@ ApplicationWindow {
WebView {
id: inspector
- visible: true
+ visible: false
url: webview.experimental.remoteInspectorUrl
anchors {
left: root.left
diff --git a/ethereal/config.go b/ethereal/config.go
index 6a42663e7..2315d1435 100644
--- a/ethereal/config.go
+++ b/ethereal/config.go
@@ -20,6 +20,8 @@ var ImportKey string
var ExportKey bool
var AssetPath string
+var Datadir string
+
func Init() {
flag.StringVar(&Identifier, "id", "", "Custom client identifier")
flag.StringVar(&OutboundPort, "port", "30303", "listening port")
@@ -35,5 +37,7 @@ func Init() {
flag.BoolVar(&ExportKey, "export", false, "export private key")
flag.StringVar(&ImportKey, "import", "", "imports the given private key (hex)")
+ flag.StringVar(&Datadir, "datadir", ".ethereal", "specifies the datadir to use. Takes precedence over config file.")
+
flag.Parse()
}
diff --git a/ethereal/ethereum.go b/ethereal/ethereum.go
index b6e1c681b..0db1fa4cd 100644
--- a/ethereal/ethereum.go
+++ b/ethereal/ethereum.go
@@ -3,7 +3,6 @@ package main
import (
"fmt"
"github.com/ethereum/eth-go"
- "github.com/ethereum/eth-go/ethchain"
"github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/go-ethereum/ethereal/ui"
"github.com/ethereum/go-ethereum/utils"
@@ -40,17 +39,15 @@ func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
- ethchain.InitFees()
-
g, err := globalconf.NewWithOptions(&globalconf.Options{
- Filename: path.Join(ethutil.ApplicationFolder(".ethereal"), "conf.ini"),
+ Filename: path.Join(ethutil.ApplicationFolder(Datadir), "conf.ini"),
})
if err != nil {
fmt.Println(err)
} else {
g.ParseAll()
}
- ethutil.ReadConfig(".ethereal", ethutil.LogFile|ethutil.LogStd, g, Identifier)
+ ethutil.ReadConfig(Datadir, ethutil.LogFile|ethutil.LogStd, g, Identifier)
// Instantiated a eth stack
ethereum, err := eth.New(eth.CapDefault, UseUPnP)
diff --git a/ethereal/ui/gui.go b/ethereal/ui/gui.go
index 2ba89ce22..01d963332 100644
--- a/ethereal/ui/gui.go
+++ b/ethereal/ui/gui.go
@@ -56,7 +56,7 @@ func New(ethereum *eth.Ethereum) *Gui {
}
func (gui *Gui) Start(assetPath string) {
- const version = "0.5.0 RC12"
+ const version = "0.5.0 RC13"
defer gui.txDb.Close()
@@ -69,7 +69,7 @@ func (gui *Gui) Start(assetPath string) {
Init: func(p *ethpub.KeyVal, obj qml.Object) { p.Key = ""; p.Value = "" },
}})
- ethutil.Config.SetClientString(fmt.Sprintf("/Ethereal v%s", version))
+ ethutil.Config.SetClientString("Ethereal")
// Create a new QML engine
gui.engine = qml.NewEngine()
@@ -356,3 +356,7 @@ func (gui *Gui) ChangeClientId(id string) {
func (gui *Gui) ClientId() string {
return ethutil.Config.Identifier
}
+
+func (gui *Gui) SetLogLevel(level int) {
+ ethutil.Config.Log.SetLevel(level)
+}
diff --git a/ethereum/config.go b/ethereum/config.go
index 39dc11727..a80b47a8e 100644
--- a/ethereum/config.go
+++ b/ethereum/config.go
@@ -24,6 +24,8 @@ var NonInteractive bool
var StartJsConsole bool
var InputFile string
+var Datadir string
+
func Init() {
flag.Usage = func() {
fmt.Fprintf(os.Stderr, "%s [options] [filename]:\n", os.Args[0])
@@ -46,6 +48,8 @@ func Init() {
flag.StringVar(&LogFile, "logfile", "", "log file (defaults to standard output)")
flag.StringVar(&ImportKey, "import", "", "imports the given private key (hex)")
+ flag.StringVar(&Datadir, "datadir", ".ethereum", "specifies the datadir to use. Takes precedence over config file.")
+
flag.Parse()
InputFile = flag.Arg(0)
diff --git a/ethereum/ethereum.go b/ethereum/ethereum.go
index 56ea46122..8812e0a60 100644
--- a/ethereum/ethereum.go
+++ b/ethereum/ethereum.go
@@ -3,7 +3,6 @@ package main
import (
"fmt"
"github.com/ethereum/eth-go"
- "github.com/ethereum/eth-go/ethchain"
"github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/go-ethereum/utils"
"github.com/rakyll/globalconf"
@@ -62,14 +61,14 @@ func main() {
}
g, err := globalconf.NewWithOptions(&globalconf.Options{
- Filename: path.Join(ethutil.ApplicationFolder(".ethereum"), "conf.ini"),
+ Filename: path.Join(ethutil.ApplicationFolder(Datadir), "conf.ini"),
})
if err != nil {
fmt.Println(err)
} else {
g.ParseAll()
}
- ethutil.ReadConfig(".ethereum", lt, g, Identifier)
+ ethutil.ReadConfig(Datadir, lt, g, Identifier)
logger := ethutil.Config.Log
@@ -86,8 +85,6 @@ func main() {
logSys = log.New(os.Stdout, "", flags)
}
- ethchain.InitFees()
-
// Instantiated a eth stack
ethereum, err := eth.New(eth.CapDefault, UseUPnP)
if err != nil {