merge upstream
This commit is contained in:
commit
08de13a57b
|
@ -58,6 +58,9 @@ window.eth = {
|
||||||
getBalanceAt: function(address, cb) {
|
getBalanceAt: function(address, cb) {
|
||||||
postData({call: "getBalance", args: [address]}, cb);
|
postData({call: "getBalance", args: [address]}, cb);
|
||||||
},
|
},
|
||||||
|
getTransactionsFor: function(address, cb) {
|
||||||
|
postData({call: "getTransactionsFor", args: [address]}, cb);
|
||||||
|
},
|
||||||
|
|
||||||
getSecretToAddress: function(sec, cb) {
|
getSecretToAddress: function(sec, cb) {
|
||||||
postData({call: "getSecretToAddress", args: [sec]}, cb);
|
postData({call: "getSecretToAddress", args: [sec]}, cb);
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
import QtQuick 2.0
|
||||||
|
import QtQuick.Controls 1.0;
|
||||||
|
import QtQuick.Layouts 1.0;
|
||||||
|
import Ethereum 1.0
|
||||||
|
|
||||||
|
ApplicationWindow {
|
||||||
|
minimumWidth: 500
|
||||||
|
maximumWidth: 500
|
||||||
|
maximumHeight: 400
|
||||||
|
minimumHeight: 400
|
||||||
|
|
||||||
|
function onNewBlockCb(block) {
|
||||||
|
console.log("Please overwrite onNewBlock(block):", block)
|
||||||
|
}
|
||||||
|
function onObjectChangeCb(stateObject) {
|
||||||
|
console.log("Please overwrite onObjectChangeCb(object)", stateObject)
|
||||||
|
}
|
||||||
|
function onStorageChangeCb(storageObject) {
|
||||||
|
var ev = ["storage", storageObject.stateAddress, storageObject.address].join(":");
|
||||||
|
console.log("Please overwrite onStorageChangeCb(object)", ev)
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,33 +3,68 @@ import QtQuick.Controls 1.0;
|
||||||
import QtQuick.Layouts 1.0;
|
import QtQuick.Layouts 1.0;
|
||||||
import Ethereum 1.0
|
import Ethereum 1.0
|
||||||
|
|
||||||
ApplicationWindow {
|
QmlApp {
|
||||||
minimumWidth: 500
|
minimumWidth: 350
|
||||||
maximumWidth: 500
|
maximumWidth: 350
|
||||||
maximumHeight: 100
|
maximumHeight: 80
|
||||||
minimumHeight: 100
|
minimumHeight: 80
|
||||||
|
|
||||||
title: "Ethereum Dice"
|
title: "Generic Coin"
|
||||||
|
|
||||||
TextField {
|
property string contractAddr: "f299f6c74515620e4c4cd8fe3d205b5c4f2e25c8"
|
||||||
id: textField
|
property string addr: "2ef47100e0787b915105fd5e3f4ff6752079d5cb"
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
Component.onCompleted: {
|
||||||
placeholderText: "Amount"
|
eth.watch(contractAddr, addr)
|
||||||
|
eth.watch(addr, contractAddr)
|
||||||
|
setAmount()
|
||||||
|
}
|
||||||
|
|
||||||
|
function onStorageChangeCb(storageObject) {
|
||||||
|
setAmount()
|
||||||
|
}
|
||||||
|
|
||||||
|
function setAmount(){
|
||||||
|
var state = eth.getStateObject(contractAddr)
|
||||||
|
var storage = state.getStorage(addr)
|
||||||
|
amountLabel.text = storage
|
||||||
|
}
|
||||||
|
Column {
|
||||||
|
spacing: 5
|
||||||
|
Row {
|
||||||
|
spacing: 20
|
||||||
|
Label {
|
||||||
|
id: genLabel
|
||||||
|
text: "Generic coin balance:"
|
||||||
}
|
}
|
||||||
Label {
|
Label {
|
||||||
id: txHash
|
id: amountLabel
|
||||||
anchors.bottom: textField.top
|
}
|
||||||
anchors.bottomMargin: 5
|
}
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
Row {
|
||||||
|
spacing: 20
|
||||||
|
TextField {
|
||||||
|
id: address
|
||||||
|
placeholderText: "Address"
|
||||||
|
}
|
||||||
|
TextField {
|
||||||
|
id: amount
|
||||||
|
placeholderText: "Amount"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Button {
|
Button {
|
||||||
anchors.top: textField.bottom
|
text: "Send coins"
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
|
||||||
anchors.topMargin: 5
|
|
||||||
text: "Place bet"
|
|
||||||
onClicked: {
|
onClicked: {
|
||||||
txHash.text = eth.createTx("e6716f9544a56c530d868e4bfbacb172315bdead", textField.text)
|
var privKey = eth.getKey().privateKey
|
||||||
|
if(privKey){
|
||||||
|
var result = eth.transact(privKey, contractAddr, 0,"100000","250", "0x" + address.text + "\n" + amount.text)
|
||||||
|
resultTx.text = result.hash
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Label {
|
||||||
|
id: resultTx
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -372,7 +372,15 @@ ApplicationWindow {
|
||||||
onAccepted: {
|
onAccepted: {
|
||||||
//ui.open(openAppDialog.fileUrl.toString())
|
//ui.open(openAppDialog.fileUrl.toString())
|
||||||
//ui.openHtml(Qt.resolvedUrl(ui.assetPath("test.html")))
|
//ui.openHtml(Qt.resolvedUrl(ui.assetPath("test.html")))
|
||||||
ui.openHtml(openAppDialog.fileUrl.toString())
|
var path = openAppDialog.fileUrl.toString()
|
||||||
|
console.log(path)
|
||||||
|
var ext = path.split('.').pop()
|
||||||
|
console.log(ext)
|
||||||
|
if(ext == "html" || ext == "htm") {
|
||||||
|
ui.openHtml(path)
|
||||||
|
}else if(ext == "qml"){
|
||||||
|
ui.openQml(path)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -102,6 +102,12 @@ ApplicationWindow {
|
||||||
var stateObject = eth.getStateObject(data.args[0]).stateKeyVal(true)
|
var stateObject = eth.getStateObject(data.args[0]).stateKeyVal(true)
|
||||||
postData(data._seed,stateObject)
|
postData(data._seed,stateObject)
|
||||||
|
|
||||||
|
break
|
||||||
|
case "getTransactionsFor":
|
||||||
|
require(1);
|
||||||
|
var txs = eth.getTransactionsFor(data.args[0], true)
|
||||||
|
postData(data._seed, txs)
|
||||||
|
|
||||||
break
|
break
|
||||||
case "getBalance":
|
case "getBalance":
|
||||||
require(1);
|
require(1);
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
package ethui
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/ethereum/eth-go/ethchain"
|
||||||
|
"github.com/ethereum/eth-go/ethpub"
|
||||||
|
"github.com/ethereum/eth-go/ethutil"
|
||||||
|
"github.com/go-qml/qml"
|
||||||
|
)
|
||||||
|
|
||||||
|
type QmlApplication struct {
|
||||||
|
win *qml.Window
|
||||||
|
engine *qml.Engine
|
||||||
|
lib *UiLib
|
||||||
|
path string
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewQmlApplication(path string, lib *UiLib) *QmlApplication {
|
||||||
|
engine := qml.NewEngine()
|
||||||
|
return &QmlApplication{engine: engine, path: path, lib: lib}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (app *QmlApplication) Create() error {
|
||||||
|
component, err := app.engine.LoadFile(app.path)
|
||||||
|
if err != nil {
|
||||||
|
ethutil.Config.Log.Debugln(err)
|
||||||
|
}
|
||||||
|
app.win = component.CreateWindow(nil)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (app *QmlApplication) Destroy() {
|
||||||
|
app.engine.Destroy()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (app *QmlApplication) NewWatcher(quitChan chan bool) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// Events
|
||||||
|
func (app *QmlApplication) NewBlock(block *ethchain.Block) {
|
||||||
|
pblock := ðpub.PBlock{Number: int(block.BlockInfo().Number), Hash: ethutil.Hex(block.Hash())}
|
||||||
|
app.win.Call("onNewBlockCb", pblock)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (app *QmlApplication) ObjectChanged(stateObject *ethchain.StateObject) {
|
||||||
|
app.win.Call("onObjectChangeCb", ethpub.NewPStateObject(stateObject))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (app *QmlApplication) StorageChanged(storageObject *ethchain.StorageState) {
|
||||||
|
app.win.Call("onStorageChangeCb", ethpub.NewPStorageState(storageObject))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Getters
|
||||||
|
func (app *QmlApplication) Engine() *qml.Engine {
|
||||||
|
return app.engine
|
||||||
|
}
|
||||||
|
func (app *QmlApplication) Window() *qml.Window {
|
||||||
|
return app.win
|
||||||
|
}
|
|
@ -28,18 +28,11 @@ func NewUiLib(engine *qml.Engine, eth *eth.Ethereum, assetPath string) *UiLib {
|
||||||
return &UiLib{engine: engine, eth: eth, assetPath: assetPath}
|
return &UiLib{engine: engine, eth: eth, assetPath: assetPath}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opens a QML file (external application)
|
func (ui *UiLib) OpenQml(path string) {
|
||||||
func (ui *UiLib) Open(path string) {
|
container := NewQmlApplication(path[7:], ui)
|
||||||
component, err := ui.engine.LoadFile(path[7:])
|
app := NewExtApplication(container, ui)
|
||||||
if err != nil {
|
|
||||||
logger.Debugln(err)
|
|
||||||
}
|
|
||||||
win := component.CreateWindow(nil)
|
|
||||||
|
|
||||||
go func() {
|
go app.run()
|
||||||
win.Show()
|
|
||||||
win.Wait()
|
|
||||||
}()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ui *UiLib) OpenHtml(path string) {
|
func (ui *UiLib) OpenHtml(path string) {
|
||||||
|
|
|
@ -144,7 +144,7 @@ func (self *JSRE) initStdFuncs() {
|
||||||
eth.Set("require", self.require)
|
eth.Set("require", self.require)
|
||||||
eth.Set("stopMining", self.stopMining)
|
eth.Set("stopMining", self.stopMining)
|
||||||
eth.Set("startMining", self.startMining)
|
eth.Set("startMining", self.startMining)
|
||||||
eth.Set("blockDo", self.execBlock)
|
eth.Set("execBlock", self.execBlock)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -221,7 +221,7 @@ func (self *JSRE) execBlock(call otto.FunctionCall) otto.Value {
|
||||||
return otto.UndefinedValue()
|
return otto.UndefinedValue()
|
||||||
}
|
}
|
||||||
|
|
||||||
err = self.ethereum.BlockDo(ethutil.FromHex(hash))
|
err = utils.BlockDo(self.ethereum, ethutil.FromHex(hash))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
return otto.FalseValue()
|
return otto.FalseValue()
|
||||||
|
|
|
@ -1,10 +1,15 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/ethereum/eth-go"
|
"github.com/ethereum/eth-go"
|
||||||
"github.com/ethereum/eth-go/ethpub"
|
"github.com/ethereum/eth-go/ethpub"
|
||||||
|
"github.com/ethereum/eth-go/ethutil"
|
||||||
"github.com/obscuren/otto"
|
"github.com/obscuren/otto"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Repl interface {
|
type Repl interface {
|
||||||
|
@ -16,20 +21,40 @@ type JSRepl struct {
|
||||||
re *JSRE
|
re *JSRE
|
||||||
|
|
||||||
prompt string
|
prompt string
|
||||||
|
|
||||||
|
history *os.File
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewJSRepl(ethereum *eth.Ethereum) *JSRepl {
|
func NewJSRepl(ethereum *eth.Ethereum) *JSRepl {
|
||||||
return &JSRepl{re: NewJSRE(ethereum), prompt: "> "}
|
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() {
|
func (self *JSRepl) Start() {
|
||||||
logger.Infoln("init JS Console")
|
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()
|
self.read()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *JSRepl) Stop() {
|
func (self *JSRepl) Stop() {
|
||||||
self.re.Stop()
|
self.re.Stop()
|
||||||
logger.Infoln("exit JS Console")
|
logger.Infoln("exit JS Console")
|
||||||
|
self.history.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *JSRepl) parseInput(code string) {
|
func (self *JSRepl) parseInput(code string) {
|
||||||
|
|
|
@ -102,7 +102,9 @@ L:
|
||||||
break L
|
break L
|
||||||
}
|
}
|
||||||
|
|
||||||
addHistory(str[:len(str)-1]) //allow user to recall this line
|
hist := str[:len(str)-1]
|
||||||
|
addHistory(hist) //allow user to recall this line
|
||||||
|
self.history.WriteString(str)
|
||||||
|
|
||||||
self.parseInput(str)
|
self.parseInput(str)
|
||||||
|
|
||||||
|
|
18
utils/cmd.go
18
utils/cmd.go
|
@ -219,3 +219,21 @@ func StopMining(ethereum *eth.Ethereum) bool {
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Replay block
|
||||||
|
func BlockDo(ethereum *eth.Ethereum, hash []byte) error {
|
||||||
|
block := ethereum.BlockChain().GetBlock(hash)
|
||||||
|
if block == nil {
|
||||||
|
return fmt.Errorf("unknown block %x", hash)
|
||||||
|
}
|
||||||
|
|
||||||
|
parent := ethereum.BlockChain().GetBlock(block.PrevHash)
|
||||||
|
|
||||||
|
_, err := ethereum.StateManager().ApplyDiff(parent.State(), parent, block)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue