소스 검색

removed key while in the process of moving to the new key storage

obscuren 10 년 전
부모
커밋
cebb149f5c
9개의 변경된 파일63개의 추가작업 그리고 714개의 파일을 삭제
  1. 0 486
      cmd/mist/assets/qml/browser.qml
  2. 1 1
      cmd/mist/assets/qml/main.qml
  3. 0 209
      cmd/mist/assets/qml/views/browser2.qml
  4. 1 1
      cmd/mist/bindings.go
  5. 3 0
      cmd/mist/main.go
  6. 0 1
      cmd/mist/ui_lib.go
  7. 1 1
      javascript/types.go
  8. 2 2
      rpc/packages.go
  9. 55 13
      xeth/xeth.go

+ 0 - 486
cmd/mist/assets/qml/browser.qml

@@ -1,486 +0,0 @@
-import QtQuick 2.1
-import QtWebKit 3.0
-import QtWebKit.experimental 1.0
-import QtQuick.Controls 1.0;
-import QtQuick.Controls.Styles 1.0
-import QtQuick.Layouts 1.0;
-import QtQuick.Window 2.1;
-import Ethereum 1.0
-
-Rectangle {
-	id: window
-	anchors.fill: parent
-	color: "#00000000"
-
-	property var title: "DApps"
-	property var iconSource: "../browser.png"
-	property var menuItem
-    property var hideUrl: true
-
-	property alias url: webview.url
-    property alias windowTitle: webview.title
-	property alias webView: webview
-
-	property var cleanPath: false
-	property var open: function(url) {
-		if(!window.cleanPath) {
-			var uri = url;
-			if(!/.*\:\/\/.*/.test(uri)) {
-				uri = "http://" + uri;
-			}
-
-			var reg = /(^https?\:\/\/(?:www\.)?)([a-zA-Z0-9_\-]*\.eth)(.*)/
-
-			if(reg.test(uri)) {
-				uri.replace(reg, function(match, pre, domain, path) {
-					uri = pre;
-
-					var lookup = eth.lookupDomain(domain.substring(0, domain.length - 4));
-					var ip = [];
-					for(var i = 0, l = lookup.length; i < l; i++) {
-						ip.push(lookup.charCodeAt(i))
-					}
-
-					if(ip.length != 0) {
-						uri += lookup;
-					} else {
-						uri += domain;
-					}
-
-					uri += path;
-				});
-			}
-
-			window.cleanPath = true;
-
-			webview.url = uri;
-
-			//uriNav.text = uri.text.replace(/(^https?\:\/\/(?:www\.)?)([a-zA-Z0-9_\-]*\.\w{2,3})(.*)/, "$1$2<span style='color:#CCC'>$3</span>");
-			uriNav.text = uri;
-		} else {
-			// Prevent inf loop.
-			window.cleanPath = false;
-		}
-	}
-
-	Component.onCompleted: {
-		webview.url = "http://etherian.io"
-	}
-
-    function messages(messages, id) {
-		// Bit of a cheat to get proper JSON
-		var m = JSON.parse(JSON.parse(JSON.stringify(messages)))
-		webview.postEvent("eth_changed", id, m);
-	}
-
-	function onShhMessage(message, id) {
-		webview.postEvent("shh_changed", id, message)
-	}
-
-	Item {
-		objectName: "root"
-		id: root
-		anchors.fill: parent
-		state: "inspectorShown"
-
-		RowLayout {
-			id: navBar
-			height: 40
-			anchors {
-				left: parent.left
-				right: parent.right
-				leftMargin: 7
-			}
-
-			Button {
-				id: back
-				onClicked: {
-					webview.goBack()
-				}
-				style: ButtonStyle {
-					background: Image {
-						source: "../back.png"
-						width: 30
-						height: 30
-					}
-				}
-			}
-
-			TextField {
-				anchors {
-					left: back.right
-					right: toggleInspector.left
-					leftMargin: 10
-					rightMargin: 10
-				}
-				text: webview.url;
-				id: uriNav
-				y: parent.height / 2 - this.height / 2
-
-				Keys.onReturnPressed: {
-					webview.url = this.text;
-				}
-			}
-
-			Button {
-				id: toggleInspector
-				anchors {
-					right: parent.right
-				}
-				iconSource: "../bug.png"
-				onClicked: {
-					if(inspector.visible == true){
-						inspector.visible = false
-					}else{
-						inspector.visible = true
-						inspector.url = webview.experimental.remoteInspectorUrl
-					}
-				}
-			}
-		}
-
-		// Border
-		Rectangle {
-			id: divider
-			anchors {
-				left: parent.left
-				right: parent.right
-				top: navBar.bottom
-			}
-			z: -1
-			height: 1
-			color: "#CCCCCC"
-		}
-
-		ScrollView {
-			anchors {
-				left: parent.left
-				right: parent.right
-				bottom: parent.bottom
-				top: divider.bottom
-			}
-			WebView {
-				objectName: "webView"
-				id: webview
-				anchors.fill: parent
-
-				function sendMessage(data) {
-					webview.experimental.postMessage(JSON.stringify(data))
-				}
-
-				experimental.preferences.javascriptEnabled: true
-				experimental.preferences.webAudioEnabled: true
-				experimental.preferences.pluginsEnabled: true
-				experimental.preferences.navigatorQtObjectEnabled: true
-				experimental.preferences.developerExtrasEnabled: true
-				experimental.preferences.webGLEnabled: true
-				experimental.preferences.notificationsEnabled: true
-				experimental.preferences.localStorageEnabled: true
-				experimental.userAgent:"Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36  (KHTML, like Gecko) Mist/0.1 Safari/537.36"
-
-				experimental.itemSelector:  MouseArea {
-					// To avoid conflicting with ListView.model when inside Initiator context.
-					property QtObject selectorModel: model
-					anchors.fill: parent
-					onClicked: selectorModel.reject()
-
-					Menu {
-						visible: true
-						id: itemSelector
-
-						Instantiator {
-							model: selectorModel.items
-							delegate: MenuItem {
-								text: model.text
-								onTriggered: {
-									selectorModel.accept(index)
-								}
-							}
-							onObjectAdded: itemSelector.insertItem(index, object)
-							onObjectRemoved: itemSelector.removeItem(object)
-						}
-					}
-
-					Component.onCompleted: {
-						itemSelector.popup()
-					}
-				}
-				experimental.userScripts: ["../ext/q.js", "../ext/ethereum.js/lib/web3.js", "../ext/ethereum.js/lib/qt.js", "../ext/setup.js"]
-				experimental.onMessageReceived: {
-					//console.log("[onMessageReceived]: ", message.data)
-					var data = JSON.parse(message.data)
-
-					try {
-						switch(data.call) {
-							case "eth_compile":
-							postData(data._id, eth.compile(data.args[0]))
-							break
-
-							case "eth_coinbase":
-							postData(data._id, eth.coinBase())
-
-							case "eth_account":
-							postData(data._id, eth.key().address);
-
-							case "eth_istening":
-							postData(data._id, eth.isListening())
-
-							break
-
-							case "eth_mining":
-							postData(data._id, eth.isMining())
-
-							break
-
-							case "eth_peerCount":
-							postData(data._id, eth.peerCount())
-
-							break
-
-							case "eth_countAt":
-							require(1)
-							postData(data._id, eth.txCountAt(data.args[0]))
-
-							break
-
-							case "eth_codeAt":
-							require(1)
-							var code = eth.codeAt(data.args[0])
-							postData(data._id, code);
-
-							break
-
-							case "eth_blockByNumber":
-							require(1)
-							var block = eth.blockByNumber(data.args[0])
-							postData(data._id, block)
-							break
-
-							case "eth_blockByHash":
-							require(1)
-							var block = eth.blockByHash(data.args[0])
-							postData(data._id, block)
-							break
-
-							require(2)
-							var block = eth.blockByHash(data.args[0])
-							postData(data._id, block.transactions[data.args[1]])
-							break
-
-							case "eth_transactionByHash":
-							case "eth_transactionByNumber":
-							require(2)
-
-							var block;
-							if (data.call === "transactionByHash")
-							block = eth.blockByHash(data.args[0])
-							else
-							block = eth.blockByNumber(data.args[0])
-
-							var tx = block.transactions.get(data.args[1])
-
-							postData(data._id, tx)
-							break
-
-							case "eth_uncleByHash":
-							case "eth_uncleByNumber":
-							require(2)
-
-							var block;
-							if (data.call === "uncleByHash")
-							block = eth.blockByHash(data.args[0])
-							else
-							block = eth.blockByNumber(data.args[0])
-
-							var uncle = block.uncles.get(data.args[1])
-
-							postData(data._id, uncle)
-
-							break
-
-							case "transact":
-							require(5)
-
-							var tx = eth.transact(data.args)
-							postData(data._id, tx)
-
-							break
-
-							case "eth_stateAt":
-							require(2);
-
-							var storage = eth.storageAt(data.args[0], data.args[1]);
-							postData(data._id, storage)
-
-							break
-
-							case "eth_call":
-							require(1);
-							var ret = eth.call(data.args)
-							postData(data._id, ret)
-							break
-
-							case "eth_balanceAt":
-							require(1);
-
-							postData(data._id, eth.balanceAt(data.args[0]));
-							break
-
-							case "eth_watch":
-							require(2)
-							eth.watch(data.args[0], data.args[1])
-
-							case "eth_disconnect":
-							require(1)
-							postData(data._id, null)
-							break;
-
-							case "eth_newFilterString":
-							require(1)
-							var id = eth.newFilterString(data.args[0], window)
-							postData(data._id, id);
-							break;
-
-							case "eth_newFilter":
-							require(1)
-							var id = eth.newFilter(data.args[0], window)
-
-							postData(data._id, id);
-							break;
-
-							case "eth_filterLogs":
-							require(1);
-
-							var messages = eth.messages(data.args[0]);
-							var m = JSON.parse(JSON.parse(JSON.stringify(messages)))
-							postData(data._id, m);
-
-							break;
-
-							case "eth_deleteFilter":
-							require(1);
-							eth.uninstallFilter(data.args[0])
-							break;
-
-
-							case "shh_newFilter":
-							require(1);
-							var id = shh.watch(data.args[0], window);
-							postData(data._id, id);
-							break;
-
-							case "shh_newIdentity":
-							var id = shh.newIdentity()
-							postData(data._id, id)
-
-							break
-
-							case "shh_post":
-							require(1);
-
-							var params = data.args[0];
-							var fields = ["payload", "to", "from"];
-							for(var i = 0; i < fields.length; i++) {
-								params[fields[i]] = params[fields[i]] || "";
-							}
-							if(typeof params.payload !== "object") { params.payload = [params.payload]; } //params.payload = params.payload.join(""); }
-							params.topics = params.topics || [];
-							params.priority = params.priority || 1000;
-							params.ttl = params.ttl || 100;
-
-							shh.post(params.payload, params.to, params.from, params.topics, params.priority, params.ttl);
-
-							break;
-
-							case "shh_getMessages":
-							require(1);
-
-							var m = shh.messages(data.args[0]);
-							var messages = JSON.parse(JSON.parse(JSON.stringify(m)));
-							postData(data._id, messages);
-
-							break;
-
-							case "ssh_newGroup":
-							postData(data._id, "");
-							break;
-						}
-					} catch(e) {
-						console.log(data.call + ": " + e)
-
-						postData(data._id, null);
-					}
-				}
-
-				function post(seed, data) {
-					postData(data._id, data)
-				}
-				function require(args, num) {
-					if(args.length < num) {
-						throw("required argument count of "+num+" got "+args.length);
-					}
-				}
-				function postData(seed, data) {
-					webview.experimental.postMessage(JSON.stringify({data: data, _id: seed}))
-				}
-				function postEvent(event, id, data) {
-					webview.experimental.postMessage(JSON.stringify({data: data, _id: id, _event: event}))
-				}
-				function onWatchedCb(data, id) {
-					var messages = JSON.parse(data)
-					postEvent("watched:"+id, messages)
-				}
-				function onNewBlockCb(block) {
-					postEvent("block:new", block)
-				}
-				function onObjectChangeCb(stateObject) {
-					postEvent("object:"+stateObject.address(), stateObject)
-				}
-				function onStorageChangeCb(storageObject) {
-					var ev = ["storage", storageObject.stateAddress, storageObject.address].join(":");
-					postEvent(ev, [storageObject.address, storageObject.value])
-				}
-			}
-		}
-
-		Rectangle {
-			id: sizeGrip
-			color: "gray"
-			visible: false
-			height: 10
-			anchors {
-				left: root.left
-				right: root.right
-			}
-			y: Math.round(root.height * 2 / 3)
-
-			MouseArea {
-				anchors.fill: parent
-				drag.target: sizeGrip
-				drag.minimumY: 0
-				drag.maximumY: root.height
-				drag.axis: Drag.YAxis
-			}
-		}
-
-		WebView {
-			id: inspector
-			visible: false
-			anchors {
-				left: root.left
-				right: root.right
-				top: sizeGrip.bottom
-				bottom: root.bottom
-			}
-		}
-
-		states: [
-			State {
-				name: "inspectorShown"
-				PropertyChanges {
-					target: inspector
-				}
-			}
-		]
-	}
-}

+ 1 - 1
cmd/mist/assets/qml/main.qml

@@ -109,7 +109,7 @@ ApplicationWindow {
 	}
 
 	function newBrowserTab(url) {
-		var window = addPlugin("./views/browser2.qml", {noAdd: true, close: true, section: "apps", active: true});
+		var window = addPlugin("./views/browser.qml", {noAdd: true, close: true, section: "apps", active: true});
 		window.view.url = url;
 		window.menuItem.title = "Browser Tab";
 		activeView(window.view, window.menuItem);

+ 0 - 209
cmd/mist/assets/qml/views/browser2.qml

@@ -1,209 +0,0 @@
-import QtQuick 2.0
-import QtQuick.Controls 1.0;
-import QtQuick.Controls.Styles 1.0
-import QtQuick.Layouts 1.0;
-import QtWebEngine 1.0
-//import QtWebEngine.experimental 1.0
-import QtQuick.Window 2.0;
-
-Rectangle {
-	id: window
-	anchors.fill: parent
-	color: "#00000000"
-
-	property var title: "DApps"
-	property var iconSource: "../browser.png"
-	property var menuItem
-	property var hideUrl: true
-
-	property alias url: webview.url
-	property alias windowTitle: webview.title
-	property alias webView: webview
-
-	property var cleanPath: false
-	property var open: function(url) {
-		if(!window.cleanPath) {
-			var uri = url;
-			if(!/.*\:\/\/.*/.test(uri)) {
-				uri = "http://" + uri;
-			}
-
-			var reg = /(^https?\:\/\/(?:www\.)?)([a-zA-Z0-9_\-]*\.eth)(.*)/
-
-			if(reg.test(uri)) {
-				uri.replace(reg, function(match, pre, domain, path) {
-					uri = pre;
-
-					var lookup = eth.lookupDomain(domain.substring(0, domain.length - 4));
-					var ip = [];
-					for(var i = 0, l = lookup.length; i < l; i++) {
-						ip.push(lookup.charCodeAt(i))
-					}
-
-					if(ip.length != 0) {
-						uri += lookup;
-					} else {
-						uri += domain;
-					}
-
-					uri += path;
-				});
-			}
-
-			window.cleanPath = true;
-
-			webview.url = uri;
-
-			//uriNav.text = uri.text.replace(/(^https?\:\/\/(?:www\.)?)([a-zA-Z0-9_\-]*\.\w{2,3})(.*)/, "$1$2<span style='color:#CCC'>$3</span>");
-			uriNav.text = uri;
-		} else {
-			// Prevent inf loop.
-			window.cleanPath = false;
-		}
-	}
-
-	Component.onCompleted: {
-	}
-
-	Item {
-		objectName: "root"
-		id: root
-		anchors.fill: parent
-		state: "inspectorShown"
-
-		RowLayout {
-			id: navBar
-			height: 40
-			anchors {
-				left: parent.left
-				right: parent.right
-				leftMargin: 7
-			}
-
-			Button {
-				id: back
-				onClicked: {
-					webview.goBack()
-				}
-				style: ButtonStyle {
-					background: Image {
-						source: "../../back.png"
-						width: 30
-						height: 30
-					}
-				}
-			}
-
-			TextField {
-				anchors {
-					left: back.right
-					right: toggleInspector.left
-					leftMargin: 10
-					rightMargin: 10
-				}
-				text: webview.url;
-				id: uriNav
-				y: parent.height / 2 - this.height / 2
-
-				Keys.onReturnPressed: {
-					webview.url = this.text;
-				}
-			}
-
-			Button {
-				id: toggleInspector
-				anchors {
-					right: parent.right
-				}
-				iconSource: "../../bug.png"
-				onClicked: {
-					// XXX soon
-					return
-					if(inspector.visible == true){
-						inspector.visible = false
-					}else{
-						inspector.visible = true
-						inspector.url = webview.experimental.remoteInspectorUrl
-					}
-				}
-			}
-		}
-
-		// Border
-		Rectangle {
-			id: divider
-			anchors {
-				left: parent.left
-				right: parent.right
-				top: navBar.bottom
-			}
-			z: -1
-			height: 1
-			color: "#CCCCCC"
-		}
-
-		WebEngineView {
-			objectName: "webView"
-			id: webview
-			anchors {
-				left: parent.left
-				right: parent.right
-				bottom: parent.bottom
-				top: divider.bottom
-			}
-
-			onLoadingChanged: {
-				console.log(url)
-				if (loadRequest.status == WebEngineView.LoadSucceededStatus) {
-					webview.runJavaScript(eth.readFile("bignumber.min.js"));
-					webview.runJavaScript(eth.readFile("dist/ethereum.js"));
-				}
-			}
-			onJavaScriptConsoleMessage: {
-				console.log(sourceID + ":" + lineNumber + ":" + JSON.stringify(message));
-			}
-		}
-
-		Rectangle {
-			id: sizeGrip
-			color: "gray"
-			visible: false
-			height: 10
-			anchors {
-				left: root.left
-				right: root.right
-			}
-			y: Math.round(root.height * 2 / 3)
-
-			MouseArea {
-				anchors.fill: parent
-				drag.target: sizeGrip
-				drag.minimumY: 0
-				drag.maximumY: root.height
-				drag.axis: Drag.YAxis
-			}
-		}
-
-		WebEngineView {
-			id: inspector
-			visible: false
-			anchors {
-				left: root.left
-				right: root.right
-				top: sizeGrip.bottom
-				bottom: root.bottom
-			}
-
-		}
-
-		states: [
-			State {
-				name: "inspectorShown"
-				PropertyChanges {
-					target: inspector
-				}
-			}
-		]
-	}
-}
-

+ 1 - 1
cmd/mist/bindings.go

@@ -61,7 +61,7 @@ func (gui *Gui) Transact(recipient, value, gas, gasPrice, d string) (string, err
 		data = ethutil.Bytes2Hex(utils.FormatTransactionData(d))
 	}
 
-	return gui.xeth.Transact(gui.privateKey(), recipient, value, gas, gasPrice, data)
+	return gui.xeth.Transact(recipient, value, gas, gasPrice, data)
 }
 
 func (gui *Gui) SetCustomIdentifier(customIdentifier string) {

+ 3 - 0
cmd/mist/main.go

@@ -30,6 +30,7 @@ import (
 	"github.com/ethereum/go-ethereum/eth"
 	"github.com/ethereum/go-ethereum/logger"
 	"github.com/ethereum/go-ethereum/p2p"
+	"github.com/ethereum/go-ethereum/ui/qt/webengine"
 	"github.com/obscuren/qml"
 )
 
@@ -42,6 +43,8 @@ var ethereum *eth.Ethereum
 var mainlogger = logger.NewLogger("MAIN")
 
 func run() error {
+	webengine.Initialize()
+
 	// precedence: code-internal flag default < config file < environment variables < command line
 	Init() // parsing command line
 

+ 0 - 1
cmd/mist/ui_lib.go

@@ -179,7 +179,6 @@ func (self *UiLib) Transact(params map[string]interface{}) (string, error) {
 	object := mapToTxParams(params)
 
 	return self.XEth.Transact(
-		object["from"],
 		object["to"],
 		object["value"],
 		object["gas"],

+ 1 - 1
javascript/types.go

@@ -75,7 +75,7 @@ func (self *JSEthereum) GetStateObject(addr string) otto.Value {
 }
 
 func (self *JSEthereum) Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr string) otto.Value {
-	r, err := self.XEth.Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr)
+	r, err := self.XEth.Transact(recipient, valueStr, gasStr, gasPriceStr, dataStr)
 	if err != nil {
 		fmt.Println(err)
 

+ 2 - 2
rpc/packages.go

@@ -65,7 +65,7 @@ func (p *EthereumApi) Transact(args *NewTxArgs, reply *interface{}) error {
 	if err != nil {
 		return err
 	}
-	result, _ := p.xeth.Transact( /* TODO specify account */ "", args.Recipient, args.Value, args.Gas, args.GasPrice, args.Body)
+	result, _ := p.xeth.Transact( /* TODO specify account */ args.Recipient, args.Value, args.Gas, args.GasPrice, args.Body)
 	*reply = result
 	return nil
 }
@@ -76,7 +76,7 @@ func (p *EthereumApi) Create(args *NewTxArgs, reply *interface{}) error {
 		return err
 	}
 
-	result, _ := p.xeth.Transact( /* TODO specify account */ "", "", args.Value, args.Gas, args.GasPrice, args.Body)
+	result, _ := p.xeth.Transact( /* TODO specify account */ "", args.Value, args.Gas, args.GasPrice, args.Body)
 	*reply = result
 	return nil
 }

+ 55 - 13
xeth/xeth.go

@@ -22,7 +22,6 @@ var pipelogger = logger.NewLogger("XETH")
 type Backend interface {
 	BlockProcessor() *core.BlockProcessor
 	ChainManager() *core.ChainManager
-	Coinbase() []byte
 	KeyManager() *crypto.KeyManager
 	IsMining() bool
 	IsListening() bool
@@ -82,14 +81,6 @@ func (self *XEth) Accounts() []string {
 	return []string{toHex(self.eth.KeyManager().Address())}
 }
 
-/*
-func (self *XEth) StateObject(addr string) *Object {
-	object := &Object{self.State().safeGet(fromHex(addr))}
-
-	return NewObject(object)
-}
-*/
-
 func (self *XEth) PeerCount() int {
 	return self.eth.PeerCount()
 }
@@ -190,10 +181,6 @@ func (self *XEth) FromNumber(str string) string {
 	return ethutil.BigD(fromHex(str)).String()
 }
 
-func (self *XEth) Transact(key, toStr, valueStr, gasStr, gasPriceStr, codeStr string) (string, error) {
-	return "", nil
-}
-
 func ToMessages(messages state.Messages) *ethutil.List {
 	var msgs []Message
 	for _, m := range messages {
@@ -216,3 +203,58 @@ func (self *XEth) PushTx(encodedTx string) (string, error) {
 	}
 	return toHex(tx.Hash()), nil
 }
+
+func (self *XEth) Transact(toStr, valueStr, gasStr, gasPriceStr, codeStr string) (string, error) {
+
+	var (
+		to               []byte
+		value            = ethutil.NewValue(valueStr)
+		gas              = ethutil.NewValue(gasStr)
+		price            = ethutil.NewValue(gasPriceStr)
+		data             []byte
+		key              = self.eth.KeyManager().KeyPair()
+		contractCreation bool
+	)
+
+	data = fromHex(codeStr)
+	to = fromHex(toStr)
+	if len(to) == 0 {
+		contractCreation = true
+	}
+
+	var tx *types.Transaction
+	if contractCreation {
+		tx = types.NewContractCreationTx(value.BigInt(), gas.BigInt(), price.BigInt(), data)
+	} else {
+		tx = types.NewTransactionMessage(to, value.BigInt(), gas.BigInt(), price.BigInt(), data)
+	}
+
+	state := self.chainManager.TransState()
+	nonce := state.GetNonce(key.Address())
+
+	tx.SetNonce(nonce)
+	tx.Sign(key.PrivateKey)
+
+	// Do some pre processing for our "pre" events  and hooks
+	block := self.chainManager.NewBlock(key.Address())
+	coinbase := state.GetOrNewStateObject(key.Address())
+	coinbase.SetGasPool(block.GasLimit())
+	self.blockProcessor.ApplyTransactions(coinbase, state, block, types.Transactions{tx}, true)
+
+	err := self.eth.TxPool().Add(tx)
+	if err != nil {
+		return "", err
+	}
+	state.SetNonce(key.Address(), nonce+1)
+
+	if contractCreation {
+		addr := core.AddressFromMessage(tx)
+		pipelogger.Infof("Contract addr %x\n", addr)
+	}
+
+	if types.IsContractAddr(to) {
+		return toHex(core.AddressFromMessage(tx)), nil
+	}
+
+	return toHex(tx.Hash()), nil
+}