From dd869064a678918544678c9cb8413d1e9a94de89 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 1 Jul 2014 20:09:37 +0200 Subject: [PATCH] delete? --- ethereal/Makefile | 22 - ethereal/assets/debugger/debugger.qml | 270 - ethereal/assets/ext/big.js | 380 - ethereal/assets/ext/ethereum.js | 145 - ethereal/assets/ext/pre.js | 58 - ethereal/assets/ext/string.js | 58 - ethereal/assets/facet.png | Bin 27302 -> 0 bytes ethereal/assets/heart.png | Bin 4277 -> 0 bytes ethereal/assets/muted/codemirror.css | 272 - ethereal/assets/muted/debugger.html | 53 - ethereal/assets/muted/eclipse.css | 23 - ethereal/assets/muted/index.html | 80 - ethereal/assets/muted/lib/codemirror.js | 7526 ----------------- ethereal/assets/muted/lib/go.js | 182 - ethereal/assets/muted/lib/matchbrackets.js | 117 - ethereal/assets/muted/muted.js | 61 - ethereal/assets/net.png | Bin 4669 -> 0 bytes ethereal/assets/network.png | Bin 2900 -> 0 bytes ethereal/assets/new.png | Bin 4776 -> 0 bytes ethereal/assets/qml/QmlApp.qml | 22 - ethereal/assets/qml/first_run.qml | 155 - ethereal/assets/qml/muted.qml | 74 - ethereal/assets/qml/test_app.qml | 70 - ethereal/assets/qml/transactions.qml | 9 - ethereal/assets/qml/wallet.qml | 1075 --- ethereal/assets/qml/webapp.qml | 246 - .../assets/samplecoin/bootstrap-theme.min.css | 7 - ethereal/assets/samplecoin/bootstrap.min.css | 7 - ethereal/assets/samplecoin/icon.png | Bin 86700 -> 0 bytes ethereal/assets/samplecoin/samplecoin.css | 34 - ethereal/assets/samplecoin/samplecoin.html | 68 - ethereal/assets/tx.png | Bin 4070 -> 0 bytes ethereal/assets/util/test.html | 43 - ethereal/flags.go | 99 - ethereal/main.go | 66 - ethereal/ui/debugger.go | 234 - ethereal/ui/ext_app.go | 132 - ethereal/ui/gui.go | 405 - ethereal/ui/html_container.go | 133 - ethereal/ui/qml_app.go | 59 - ethereal/ui/ui_lib.go | 100 - ethereum/cmd.go | 32 - ethereum/flags.go | 76 - ethereum/javascript_runtime.go | 231 - ethereum/js_lib.go | 53 - ethereum/main.go | 57 - ethereum/repl.go | 153 - ethereum/repl_darwin.go | 123 - ethereum/repl_linux.go | 1 - ethereum/repl_windows.go | 24 - utils/cmd.go | 253 - 51 files changed, 13288 deletions(-) delete mode 100644 ethereal/Makefile delete mode 100644 ethereal/assets/debugger/debugger.qml delete mode 100644 ethereal/assets/ext/big.js delete mode 100644 ethereal/assets/ext/ethereum.js delete mode 100644 ethereal/assets/ext/pre.js delete mode 100644 ethereal/assets/ext/string.js delete mode 100644 ethereal/assets/facet.png delete mode 100644 ethereal/assets/heart.png delete mode 100644 ethereal/assets/muted/codemirror.css delete mode 100644 ethereal/assets/muted/debugger.html delete mode 100644 ethereal/assets/muted/eclipse.css delete mode 100644 ethereal/assets/muted/index.html delete mode 100644 ethereal/assets/muted/lib/codemirror.js delete mode 100644 ethereal/assets/muted/lib/go.js delete mode 100644 ethereal/assets/muted/lib/matchbrackets.js delete mode 100644 ethereal/assets/muted/muted.js delete mode 100644 ethereal/assets/net.png delete mode 100644 ethereal/assets/network.png delete mode 100644 ethereal/assets/new.png delete mode 100644 ethereal/assets/qml/QmlApp.qml delete mode 100644 ethereal/assets/qml/first_run.qml delete mode 100644 ethereal/assets/qml/muted.qml delete mode 100644 ethereal/assets/qml/test_app.qml delete mode 100644 ethereal/assets/qml/transactions.qml delete mode 100644 ethereal/assets/qml/wallet.qml delete mode 100644 ethereal/assets/qml/webapp.qml delete mode 100755 ethereal/assets/samplecoin/bootstrap-theme.min.css delete mode 100755 ethereal/assets/samplecoin/bootstrap.min.css delete mode 100644 ethereal/assets/samplecoin/icon.png delete mode 100644 ethereal/assets/samplecoin/samplecoin.css delete mode 100644 ethereal/assets/samplecoin/samplecoin.html delete mode 100644 ethereal/assets/tx.png delete mode 100644 ethereal/assets/util/test.html delete mode 100644 ethereal/flags.go delete mode 100644 ethereal/main.go delete mode 100644 ethereal/ui/debugger.go delete mode 100644 ethereal/ui/ext_app.go delete mode 100644 ethereal/ui/gui.go delete mode 100644 ethereal/ui/html_container.go delete mode 100644 ethereal/ui/qml_app.go delete mode 100644 ethereal/ui/ui_lib.go delete mode 100644 ethereum/cmd.go delete mode 100644 ethereum/flags.go delete mode 100644 ethereum/javascript_runtime.go delete mode 100644 ethereum/js_lib.go delete mode 100644 ethereum/main.go delete mode 100644 ethereum/repl.go delete mode 100644 ethereum/repl_darwin.go delete mode 120000 ethereum/repl_linux.go delete mode 100644 ethereum/repl_windows.go delete mode 100644 utils/cmd.go diff --git a/ethereal/Makefile b/ethereal/Makefile deleted file mode 100644 index 1acf03049..000000000 --- a/ethereal/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -UNAME = $(shell uname) -FILES=qml *.png -GOPATH=$(PWD) - - -# Default is building -all: - go get -d - cp *.go $(GOPATH)/src/github.com/ethereum/go-ethereum - cp -r ui $(GOPATH)/src/github.com/ethereum/go-ethereum - go build - -install: -# Linux build -ifeq ($(UNAME),Linux) - cp -r assets/* /usr/share/ethereal - cp go-ethereum /usr/local/bin/ethereal -endif -# OS X build -ifeq ($(UNAME),Darwin) - # Execute py script -endif diff --git a/ethereal/assets/debugger/debugger.qml b/ethereal/assets/debugger/debugger.qml deleted file mode 100644 index 3e653882c..000000000 --- a/ethereal/assets/debugger/debugger.qml +++ /dev/null @@ -1,270 +0,0 @@ -import QtQuick 2.0 -import QtQuick.Controls 1.0; -import QtQuick.Layouts 1.0; -import QtQuick.Dialogs 1.0; -import QtQuick.Window 2.1; -import QtQuick.Controls.Styles 1.1 -import Ethereum 1.0 - -ApplicationWindow { - visible: false - title: "IceCREAM" - minimumWidth: 1280 - minimumHeight: 700 - width: 1290 - height: 700 - - property alias codeText: codeEditor.text - property alias dataText: rawDataField.text - - MenuBar { - Menu { - title: "Debugger" - MenuItem { - text: "Run" - shortcut: "Ctrl+r" - onTriggered: debugCurrent() - } - - MenuItem { - text: "Next" - shortcut: "Ctrl+n" - onTriggered: dbg.next() - } - } - } - - SplitView { - anchors.fill: parent - property var asmModel: ListModel { - id: asmModel - } - TableView { - id: asmTableView - width: 200 - TableViewColumn{ role: "value" ; title: "" ; width: 200 } - model: asmModel - } - - Rectangle { - color: "#00000000" - anchors.left: asmTableView.right - anchors.right: parent.right - SplitView { - orientation: Qt.Vertical - anchors.fill: parent - - Rectangle { - color: "#00000000" - height: 330 - anchors.left: parent.left - anchors.right: parent.right - - TextArea { - id: codeEditor - anchors.top: parent.top - anchors.bottom: parent.bottom - anchors.left: parent.left - anchors.right: settings.left - } - - Column { - id: settings - spacing: 5 - width: 300 - height: parent.height - anchors.right: parent.right - anchors.top: parent.top - anchors.bottom: parent.bottom - - Label { - text: "Arbitrary data" - } - TextArea { - id: rawDataField - anchors.left: parent.left - anchors.right: parent.right - height: 150 - } - - Label { - text: "Amount" - } - TextField { - id: txValue - width: 200 - placeholderText: "Amount" - validator: RegExpValidator { regExp: /\d*/ } - } - Label { - text: "Amount of gas" - } - TextField { - id: txGas - width: 200 - validator: RegExpValidator { regExp: /\d*/ } - text: "10000" - placeholderText: "Gas" - } - Label { - text: "Gas price" - } - TextField { - id: txGasPrice - width: 200 - placeholderText: "Gas price" - text: "1000000000000" - validator: RegExpValidator { regExp: /\d*/ } - } - } - } - - SplitView { - orientation: Qt.Vertical - id: inspectorPane - height: 500 - - SplitView { - orientation: Qt.Horizontal - height: 150 - - TableView { - id: stackTableView - property var stackModel: ListModel { - id: stackModel - } - height: parent.height - width: 300 - TableViewColumn{ role: "value" ; title: "Temp" ; width: 200 } - model: stackModel - } - - TableView { - id: memoryTableView - property var memModel: ListModel { - id: memModel - } - height: parent.height - width: parent.width - stackTableView.width - TableViewColumn{ id:mnumColmn ; role: "num" ; title: "#" ; width: 50} - TableViewColumn{ role: "value" ; title: "Memory" ; width: 750} - model: memModel - } - } - - Rectangle { - height: 100 - width: parent.width - TableView { - id: storageTableView - property var memModel: ListModel { - id: storageModel - } - height: parent.height - width: parent.width - TableViewColumn{ id: key ; role: "key" ; title: "#" ; width: storageTableView.width / 2} - TableViewColumn{ role: "value" ; title: "Storage" ; width: storageTableView.width / 2} - model: storageModel - } - } - - Rectangle { - height: 200 - width: parent.width - TableView { - id: logTableView - property var logModel: ListModel { - id: logModel - } - height: parent.height - width: parent.width - TableViewColumn{ id: message ; role: "message" ; title: "log" ; width: logTableView.width } - model: logModel - } - } - } - } - } - } - - toolBar: ToolBar { - RowLayout { - spacing: 5 - - Button { - property var enabled: true - id: debugStart - onClicked: { - debugCurrent() - } - text: "Debug" - } - - Button { - property var enabled: true - id: debugNextButton - onClicked: { - dbg.next() - } - text: "Next" - } - CheckBox { - id: breakEachLine - objectName: "breakEachLine" - text: "Break each instruction" - checked: true - } - } - } - - function debugCurrent() { - dbg.debug(txValue.text, txGas.text, txGasPrice.text, codeEditor.text, rawDataField.text) - } - - function setAsm(asm) { - asmModel.append({asm: asm}) - } - - function clearAsm() { - asmModel.clear() - } - - function setInstruction(num) { - asmTableView.selection.clear() - asmTableView.selection.select(num) - } - - function setMem(mem) { - memModel.append({num: mem.num, value: mem.value}) - } - function clearMem(){ - memModel.clear() - } - - function setStack(stack) { - stackModel.append({value: stack}) - } - function addDebugMessage(message){ - debuggerLog.append({value: message}) - } - - function clearStack() { - stackModel.clear() - } - - function clearStorage() { - storageModel.clear() - } - - function setStorage(storage) { - storageModel.append({key: storage.key, value: storage.value}) - } - - function setLog(msg) { - logModel.insert(0, {message: msg}) - } - - function clearLog() { - logModel.clear() - } -} diff --git a/ethereal/assets/ext/big.js b/ethereal/assets/ext/big.js deleted file mode 100644 index db633fd2f..000000000 --- a/ethereal/assets/ext/big.js +++ /dev/null @@ -1,380 +0,0 @@ -var bigInt = (function () { - var base = 10000000, logBase = 7; - var sign = { - positive: false, - negative: true - }; - - var normalize = function (first, second) { - var a = first.value, b = second.value; - var length = a.length > b.length ? a.length : b.length; - for (var i = 0; i < length; i++) { - a[i] = a[i] || 0; - b[i] = b[i] || 0; - } - for (var i = length - 1; i >= 0; i--) { - if (a[i] === 0 && b[i] === 0) { - a.pop(); - b.pop(); - } else break; - } - if (!a.length) a = [0], b = [0]; - first.value = a; - second.value = b; - }; - - var parse = function (text, first) { - if (typeof text === "object") return text; - text += ""; - var s = sign.positive, value = []; - if (text[0] === "-") { - s = sign.negative; - text = text.slice(1); - } - var base = 10; - if (text.slice(0, 2) == "0x") { - base = 16; - text = text.slice(2); - } - else { - var texts = text.split("e"); - if (texts.length > 2) throw new Error("Invalid integer"); - if (texts[1]) { - var exp = texts[1]; - if (exp[0] === "+") exp = exp.slice(1); - exp = parse(exp); - if (exp.lesser(0)) throw new Error("Cannot include negative exponent part for integers"); - while (exp.notEquals(0)) { - texts[0] += "0"; - exp = exp.prev(); - } - } - text = texts[0]; - } - if (text === "-0") text = "0"; - text = text.toUpperCase(); - var isValid = (base == 16 ? /^[0-9A-F]*$/ : /^[0-9]+$/).test(text); - if (!isValid) throw new Error("Invalid integer"); - if (base == 16) { - var val = bigInt(0); - while (text.length) { - v = text.charCodeAt(0) - 48; - if (v > 9) - v -= 7; - text = text.slice(1); - val = val.times(16).plus(v); - } - return val; - } - else { - while (text.length) { - var divider = text.length > logBase ? text.length - logBase : 0; - value.push(+text.slice(divider)); - text = text.slice(0, divider); - } - var val = bigInt(value, s); - if (first) normalize(first, val); - return val; - } - }; - - var goesInto = function (a, b) { - var a = bigInt(a, sign.positive), b = bigInt(b, sign.positive); - if (a.equals(0)) throw new Error("Cannot divide by 0"); - var n = 0; - do { - var inc = 1; - var c = bigInt(a.value, sign.positive), t = c.times(10); - while (t.lesser(b)) { - c = t; - inc *= 10; - t = t.times(10); - } - while (c.lesserOrEquals(b)) { - b = b.minus(c); - n += inc; - } - } while (a.lesserOrEquals(b)); - - return { - remainder: b.value, - result: n - }; - }; - - var bigInt = function (value, s) { - var self = { - value: value, - sign: s - }; - var o = { - value: value, - sign: s, - negate: function (m) { - var first = m || self; - return bigInt(first.value, !first.sign); - }, - abs: function (m) { - var first = m || self; - return bigInt(first.value, sign.positive); - }, - add: function (n, m) { - var s, first = self, second; - if (m) (first = parse(n)) && (second = parse(m)); - else second = parse(n, first); - s = first.sign; - if (first.sign !== second.sign) { - first = bigInt(first.value, sign.positive); - second = bigInt(second.value, sign.positive); - return s === sign.positive ? - o.subtract(first, second) : - o.subtract(second, first); - } - normalize(first, second); - var a = first.value, b = second.value; - var result = [], - carry = 0; - for (var i = 0; i < a.length || carry > 0; i++) { - var sum = (a[i] || 0) + (b[i] || 0) + carry; - carry = sum >= base ? 1 : 0; - sum -= carry * base; - result.push(sum); - } - return bigInt(result, s); - }, - plus: function (n, m) { - return o.add(n, m); - }, - subtract: function (n, m) { - var first = self, second; - if (m) (first = parse(n)) && (second = parse(m)); - else second = parse(n, first); - if (first.sign !== second.sign) return o.add(first, o.negate(second)); - if (first.sign === sign.negative) return o.subtract(o.negate(second), o.negate(first)); - if (o.compare(first, second) === -1) return o.negate(o.subtract(second, first)); - var a = first.value, b = second.value; - var result = [], - borrow = 0; - for (var i = 0; i < a.length; i++) { - var tmp = a[i] - borrow; - borrow = tmp < b[i] ? 1 : 0; - var minuend = (borrow * base) + tmp - b[i]; - result.push(minuend); - } - return bigInt(result, sign.positive); - }, - minus: function (n, m) { - return o.subtract(n, m); - }, - multiply: function (n, m) { - var s, first = self, second; - if (m) (first = parse(n)) && (second = parse(m)); - else second = parse(n, first); - s = first.sign !== second.sign; - var a = first.value, b = second.value; - var resultSum = []; - for (var i = 0; i < a.length; i++) { - resultSum[i] = []; - var j = i; - while (j--) { - resultSum[i].push(0); - } - } - var carry = 0; - for (var i = 0; i < a.length; i++) { - var x = a[i]; - for (var j = 0; j < b.length || carry > 0; j++) { - var y = b[j]; - var product = y ? (x * y) + carry : carry; - carry = product > base ? Math.floor(product / base) : 0; - product -= carry * base; - resultSum[i].push(product); - } - } - var max = -1; - for (var i = 0; i < resultSum.length; i++) { - var len = resultSum[i].length; - if (len > max) max = len; - } - var result = [], carry = 0; - for (var i = 0; i < max || carry > 0; i++) { - var sum = carry; - for (var j = 0; j < resultSum.length; j++) { - sum += resultSum[j][i] || 0; - } - carry = sum > base ? Math.floor(sum / base) : 0; - sum -= carry * base; - result.push(sum); - } - return bigInt(result, s); - }, - times: function (n, m) { - return o.multiply(n, m); - }, - divmod: function (n, m) { - var s, first = self, second; - if (m) (first = parse(n)) && (second = parse(m)); - else second = parse(n, first); - s = first.sign !== second.sign; - if (bigInt(first.value, first.sign).equals(0)) return { - quotient: bigInt([0], sign.positive), - remainder: bigInt([0], sign.positive) - }; - if (second.equals(0)) throw new Error("Cannot divide by zero"); - var a = first.value, b = second.value; - var result = [], remainder = []; - for (var i = a.length - 1; i >= 0; i--) { - var n = [a[i]].concat(remainder); - var quotient = goesInto(b, n); - result.push(quotient.result); - remainder = quotient.remainder; - } - result.reverse(); - return { - quotient: bigInt(result, s), - remainder: bigInt(remainder, first.sign) - }; - }, - divide: function (n, m) { - return o.divmod(n, m).quotient; - }, - over: function (n, m) { - return o.divide(n, m); - }, - mod: function (n, m) { - return o.divmod(n, m).remainder; - }, - pow: function (n, m) { - var first = self, second; - if (m) (first = parse(n)) && (second = parse(m)); - else second = parse(n, first); - var a = first, b = second; - if (b.lesser(0)) return ZERO; - if (b.equals(0)) return ONE; - var result = bigInt(a.value, a.sign); - - if (b.mod(2).equals(0)) { - var c = result.pow(b.over(2)); - return c.times(c); - } else { - return result.times(result.pow(b.minus(1))); - } - }, - next: function (m) { - var first = m || self; - return o.add(first, 1); - }, - prev: function (m) { - var first = m || self; - return o.subtract(first, 1); - }, - compare: function (n, m) { - var first = self, second; - if (m) (first = parse(n)) && (second = parse(m, first)); - else second = parse(n, first); - normalize(first, second); - if (first.value.length === 1 && second.value.length === 1 && first.value[0] === 0 && second.value[0] === 0) return 0; - if (second.sign !== first.sign) return first.sign === sign.positive ? 1 : -1; - var multiplier = first.sign === sign.positive ? 1 : -1; - var a = first.value, b = second.value; - for (var i = a.length - 1; i >= 0; i--) { - if (a[i] > b[i]) return 1 * multiplier; - if (b[i] > a[i]) return -1 * multiplier; - } - return 0; - }, - compareAbs: function (n, m) { - var first = self, second; - if (m) (first = parse(n)) && (second = parse(m, first)); - else second = parse(n, first); - first.sign = second.sign = sign.positive; - return o.compare(first, second); - }, - equals: function (n, m) { - return o.compare(n, m) === 0; - }, - notEquals: function (n, m) { - return !o.equals(n, m); - }, - lesser: function (n, m) { - return o.compare(n, m) < 0; - }, - greater: function (n, m) { - return o.compare(n, m) > 0; - }, - greaterOrEquals: function (n, m) { - return o.compare(n, m) >= 0; - }, - lesserOrEquals: function (n, m) { - return o.compare(n, m) <= 0; - }, - isPositive: function (m) { - var first = m || self; - return first.sign === sign.positive; - }, - isNegative: function (m) { - var first = m || self; - return first.sign === sign.negative; - }, - isEven: function (m) { - var first = m || self; - return first.value[0] % 2 === 0; - }, - isOdd: function (m) { - var first = m || self; - return first.value[0] % 2 === 1; - }, - toString: function (m) { - var first = m || self; - var str = "", len = first.value.length; - while (len--) { - if (first.value[len].toString().length === 8) str += first.value[len]; - else str += (base.toString() + first.value[len]).slice(-logBase); - } - while (str[0] === "0") { - str = str.slice(1); - } - if (!str.length) str = "0"; - var s = (first.sign === sign.positive || str == "0") ? "" : "-"; - return s + str; - }, - toHex: function (m) { - var first = m || self; - var str = ""; - var l = this.abs(); - while (l > 0) { - var qr = l.divmod(256); - var b = qr.remainder.toJSNumber(); - str = (b >> 4).toString(16) + (b & 15).toString(16) + str; - l = qr.quotient; - } - return (this.isNegative() ? "-" : "") + "0x" + str; - }, - toJSNumber: function (m) { - return +o.toString(m); - }, - valueOf: function (m) { - return o.toJSNumber(m); - } - }; - return o; - }; - - var ZERO = bigInt([0], sign.positive); - var ONE = bigInt([1], sign.positive); - var MINUS_ONE = bigInt([1], sign.negative); - - var fnReturn = function (a) { - if (typeof a === "undefined") return ZERO; - return parse(a); - }; - fnReturn.zero = ZERO; - fnReturn.one = ONE; - fnReturn.minusOne = MINUS_ONE; - return fnReturn; -})(); - -if (typeof module !== "undefined") { - module.exports = bigInt; -} - diff --git a/ethereal/assets/ext/ethereum.js b/ethereal/assets/ext/ethereum.js deleted file mode 100644 index de6fb0255..000000000 --- a/ethereal/assets/ext/ethereum.js +++ /dev/null @@ -1,145 +0,0 @@ -// Main Ethereum library -window.eth = { - prototype: Object(), - - // Retrieve block - // - // Either supply a number or a string. Type is determent for the lookup method - // string - Retrieves the block by looking up the hash - // number - Retrieves the block by looking up the block number - getBlock: function(numberOrHash, cb) { - var func; - if(typeof numberOrHash == "string") { - func = "getBlockByHash"; - } else { - func = "getBlockByNumber"; - } - postData({call: func, args: [numberOrHash]}, cb); - }, - - // Create transaction - // - // Transact between two state objects - transact: function(sec, recipient, value, gas, gasPrice, data, cb) { - postData({call: "transact", args: [sec, recipient, value, gas, gasPrice, data]}, cb); - }, - - create: function(sec, value, gas, gasPrice, init, body, cb) { - postData({call: "create", args: [sec, value, gas, gasPrice, init, body]}, cb); - }, - - getStorageAt: function(address, storageAddress, cb) { - postData({call: "getStorage", args: [address, storageAddress]}, cb); - }, - - getStateKeyVals: function(address, cb){ - postData({call: "getStateKeyVals", args: [address]}, cb); - }, - - getKey: function(cb) { - postData({call: "getKey"}, cb); - }, - - getTxCountAt: function(address, cb) { - postData({call: "getTxCountAt", args: [address]}, cb); - }, - getIsMining: function(cb){ - postData({call: "getIsMining"}, cb) - }, - getIsListening: function(cb){ - postData({call: "getIsListening"}, cb) - }, - getCoinBase: function(cb){ - postData({call: "getCoinBase"}, cb); - }, - getPeerCount: function(cb){ - postData({call: "getPeerCount"}, cb); - }, - getBalanceAt: function(address, cb) { - postData({call: "getBalance", args: [address]}, cb); - }, - getTransactionsFor: function(address, cb) { - postData({call: "getTransactionsFor", args: [address]}, cb); - }, - - getSecretToAddress: function(sec, cb) { - postData({call: "getSecretToAddress", args: [sec]}, cb); - }, - - watch: function(address, storageAddrOrCb, cb) { - var ev; - if(cb === undefined) { - cb = storageAddrOrCb; - storageAddrOrCb = ""; - ev = "object:"+address; - } else { - ev = "storage:"+address+":"+storageAddrOrCb; - } - - eth.on(ev, cb) - - postData({call: "watch", args: [address, storageAddrOrCb]}); - }, - - disconnect: function(address, storageAddrOrCb, cb) { - var ev; - if(cb === undefined) { - cb = storageAddrOrCb; - storageAddrOrCb = ""; - ev = "object:"+address; - } else { - ev = "storage:"+address+":"+storageAddrOrCb; - } - - eth.off(ev, cb) - - postData({call: "disconnect", args: [address, storageAddrOrCb]}); - }, - - set: function(props) { - postData({call: "set", args: props}); - }, - - on: function(event, cb) { - if(eth._onCallbacks[event] === undefined) { - eth._onCallbacks[event] = []; - } - - eth._onCallbacks[event].push(cb); - - return this - }, - - off: function(event, cb) { - if(eth._onCallbacks[event] !== undefined) { - var callbacks = eth._onCallbacks[event]; - for(var i = 0; i < callbacks.length; i++) { - if(callbacks[i] === cb) { - delete callbacks[i]; - } - } - } - - return this - }, - - trigger: function(event, data) { - var callbacks = eth._onCallbacks[event]; - if(callbacks !== undefined) { - for(var i = 0; i < callbacks.length; i++) { - // Figure out whether the returned data was an array - // array means multiple return arguments (multiple params) - if(data instanceof Array) { - callbacks[i].apply(this, data); - } else { - callbacks[i].call(this, data); - } - } - } - }, - - -} -window.eth._callbacks = {} -window.eth._onCallbacks = {} - diff --git a/ethereal/assets/ext/pre.js b/ethereal/assets/ext/pre.js deleted file mode 100644 index ca520f152..000000000 --- a/ethereal/assets/ext/pre.js +++ /dev/null @@ -1,58 +0,0 @@ -function debug(/**/) { - var args = arguments; - var msg = "" - for(var i = 0; i < args.length; i++){ - if(typeof args[i] === "object") { - msg += " " + JSON.stringify(args[i]) - } else { - msg += " " + args[i] - } - } - - postData({call:"debug", args:[msg]}) - document.getElementById("debug").innerHTML += "
" + msg -} - -// Helper function for generating pseudo callbacks and sending data to the QML part of the application -function postData(data, cb) { - data._seed = Math.floor(Math.random() * 1000000) - if(cb) { - eth._callbacks[data._seed] = cb; - } - - if(data.args === undefined) { - data.args = []; - } - - navigator.qt.postMessage(JSON.stringify(data)); -} - -navigator.qt.onmessage = function(ev) { - var data = JSON.parse(ev.data) - - if(data._event !== undefined) { - eth.trigger(data._event, data.data); - } else { - if(data._seed) { - var cb = eth._callbacks[data._seed]; - if(cb) { - // Figure out whether the returned data was an array - // array means multiple return arguments (multiple params) - if(data.data instanceof Array) { - cb.apply(this, data.data) - } else { - cb.call(this, data.data) - } - - // Remove the "trigger" callback - delete eth._callbacks[ev._seed]; - } - } - } -} - -window.onerror = function(message, file, lineNumber, column, errorObj) { - debug(file, message, lineNumber+":"+column, errorObj); - - return false; -} diff --git a/ethereal/assets/ext/string.js b/ethereal/assets/ext/string.js deleted file mode 100644 index 2473b5c36..000000000 --- a/ethereal/assets/ext/string.js +++ /dev/null @@ -1,58 +0,0 @@ -String.prototype.pad = function(l, r) { - if (r === undefined) { - r = l - if (!(this.substr(0, 2) == "0x" || /^\d+$/.test(this))) - l = 0 - } - var ret = this.bin(); - while (ret.length < l) - ret = "\0" + ret - while (ret.length < r) - ret = ret + "\0" - return ret; -} - -String.prototype.unpad = function() { - var i = this.length; - while (i && this[i - 1] == "\0") - --i - return this.substr(0, i) -} - -String.prototype.bin = function() { - if (this.substr(0, 2) == "0x") { - bytes = [] - var i = 2; - - // Check if it's odd - pad with a zero if so. - if (this.length % 2) - bytes.push(parseInt(this.substr(i++, 1), 16)) - - for (; i < this.length - 1; i += 2) - bytes.push(parseInt(this.substr(i, 2), 16)); - - return String.fromCharCode.apply(String, bytes); - } else if (/^\d+$/.test(this)) - return bigInt(this.substr(0)).toHex().bin() - - // Otherwise we'll return the "String" object instead of an actual string - return this.substr(0, this.length) -} - -String.prototype.unbin = function() { - var i, l, o = ''; - for(i = 0, l = this.length; i < l; i++) { - var n = this.charCodeAt(i).toString(16); - o += n.length < 2 ? '0' + n : n; - } - - return "0x" + o; -} - -String.prototype.dec = function() { - return bigInt(this.substr(0)).toString() -} - -String.prototype.hex = function() { - return bigInt(this.substr(0)).toHex() -} diff --git a/ethereal/assets/facet.png b/ethereal/assets/facet.png deleted file mode 100644 index 49a266e96a6c0322cfa927698b10efd35b97fa05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27302 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 R{2>4=4K-cW!fRGf{|D(@9S8sb diff --git a/ethereal/assets/heart.png b/ethereal/assets/heart.png deleted file mode 100644 index 3c874ab7f36da5f25e7295ee5572738941dfe2e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4277 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