removed old js yet again
This commit is contained in:
		
							parent
							
								
									cbf1d07073
								
							
						
					
					
						commit
						f80fe97763
					
				| @ -1,14 +0,0 @@ | ||||
| This file is part of ethereum.js. | ||||
| 
 | ||||
| ethereum.js is free software: you can redistribute it and/or modify | ||||
| it under the terms of the GNU Lesser General Public License as published by | ||||
| the Free Software Foundation, either version 3 of the License, or | ||||
| (at your option) any later version. | ||||
| 
 | ||||
| ethereum.js is distributed in the hope that it will be useful, | ||||
| but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| GNU Lesser General Public License for more details. | ||||
| 
 | ||||
| You should have received a copy of the GNU Lesser General Public License | ||||
| along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>. | ||||
| @ -1,96 +0,0 @@ | ||||
| # Ethereum JavaScript API | ||||
| 
 | ||||
| This is the Ethereum compatible [JavaScript API](https://github.com/ethereum/wiki/wiki/JavaScript-API) | ||||
| which implements the [Generic JSON RPC](https://github.com/ethereum/wiki/wiki/Generic-JSON-RPC) spec. It's available on npm as a node module and also for bower and component as an embeddable js | ||||
| 
 | ||||
| [![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![dependency status][dep-image]][dep-url] [![dev dependency status][dep-dev-image]][dep-dev-url] | ||||
| 
 | ||||
| <!-- [](https://ci.testling.com/ethereum/ethereum.js) --> | ||||
| 
 | ||||
| ## Installation | ||||
| 
 | ||||
| ### Node.js | ||||
| 
 | ||||
|     npm install ethereum.js | ||||
| 
 | ||||
| ### For browser | ||||
| Bower | ||||
| 
 | ||||
| 	bower install ethereum.js | ||||
| 
 | ||||
| Component | ||||
| 
 | ||||
| 	component install ethereum/ethereum.js | ||||
| 
 | ||||
| * Include `ethereum.min.js` in your html file. | ||||
| * Include [bignumber.js](https://github.com/MikeMcl/bignumber.js/) | ||||
| 
 | ||||
| ## Usage | ||||
| Require the library: | ||||
| 
 | ||||
| 	var web3 = require('web3'); | ||||
| 
 | ||||
| Set a provider (QtProvider, WebSocketProvider, HttpRpcProvider) | ||||
| 
 | ||||
| 	var web3.setProvider(new web3.providers.WebSocketProvider('ws://localhost:40404/eth')); | ||||
| 
 | ||||
| There you go, now you can use it: | ||||
| 
 | ||||
| ``` | ||||
| var coinbase = web3.eth.coinbase; | ||||
| var balance = web3.eth.balanceAt(coinbase); | ||||
| ``` | ||||
| 
 | ||||
| 
 | ||||
| For another example see `example/index.html`. | ||||
| 
 | ||||
| ## Contribute! | ||||
| 
 | ||||
| ### Requirements | ||||
| 
 | ||||
| * Node.js | ||||
| * npm | ||||
| * gulp (build) | ||||
| * mocha (tests) | ||||
| 
 | ||||
| ```bash | ||||
| sudo apt-get update | ||||
| sudo apt-get install nodejs | ||||
| sudo apt-get install npm | ||||
| sudo apt-get install nodejs-legacy | ||||
| ``` | ||||
| 
 | ||||
| ### Building (gulp) | ||||
| 
 | ||||
| ```bash | ||||
| npm run-script build | ||||
| ``` | ||||
| 
 | ||||
| 
 | ||||
| ### Testing (mocha) | ||||
| 
 | ||||
| ```bash | ||||
| npm test | ||||
| ``` | ||||
| 
 | ||||
| **Please note this repo is in it's early stage.** | ||||
| 
 | ||||
| If you'd like to run a WebSocket ethereum node check out | ||||
| [go-ethereum](https://github.com/ethereum/go-ethereum). | ||||
| 
 | ||||
| To install ethereum and spawn a node: | ||||
| 
 | ||||
| ``` | ||||
| go get github.com/ethereum/go-ethereum/ethereum | ||||
| ethereum -ws -loglevel=4 | ||||
| ``` | ||||
| 
 | ||||
| [npm-image]: https://badge.fury.io/js/ethereum.js.png | ||||
| [npm-url]: https://npmjs.org/package/ethereum.js | ||||
| [travis-image]: https://travis-ci.org/ethereum/ethereum.js.svg | ||||
| [travis-url]: https://travis-ci.org/ethereum/ethereum.js | ||||
| [dep-image]: https://david-dm.org/ethereum/ethereum.js.svg | ||||
| [dep-url]: https://david-dm.org/ethereum/ethereum.js | ||||
| [dep-dev-image]: https://david-dm.org/ethereum/ethereum.js/dev-status.svg | ||||
| [dep-dev-url]: https://david-dm.org/ethereum/ethereum.js#info=devDependencies | ||||
| 
 | ||||
| @ -1,397 +0,0 @@ | ||||
| // Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
 | ||||
| //
 | ||||
| // This library is free software; you can redistribute it and/or
 | ||||
| // modify it under the terms of the GNU General Public
 | ||||
| // License as published by the Free Software Foundation; either
 | ||||
| // version 2.1 of the License, or (at your option) any later version.
 | ||||
| //
 | ||||
| // This library is distributed in the hope that it will be useful,
 | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | ||||
| // General Public License for more details.
 | ||||
| //
 | ||||
| // You should have received a copy of the GNU General Public License
 | ||||
| // along with this library; if not, write to the Free Software
 | ||||
| // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 | ||||
| // MA 02110-1301  USA
 | ||||
| 
 | ||||
| var BigNumber = (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 = BigNumber(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 = BigNumber(value, s); | ||||
| 	        if (first) normalize(first, val); | ||||
|         	return val; | ||||
| 	} | ||||
|     }; | ||||
| 
 | ||||
|     var goesInto = function (a, b) { | ||||
|         var a = BigNumber(a, sign.positive), b = BigNumber(b, sign.positive); | ||||
|         if (a.equals(0)) throw new Error("Cannot divide by 0"); | ||||
|         var n = 0; | ||||
|         do { | ||||
|             var inc = 1; | ||||
|             var c = BigNumber(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 BigNumber = function (value, s) { | ||||
|         var self = { | ||||
|             value: value, | ||||
|             sign: s | ||||
|         }; | ||||
|         var o = { | ||||
|             value: value, | ||||
|             sign: s, | ||||
|             negate: function (m) { | ||||
|                 var first = m || self; | ||||
|                 return BigNumber(first.value, !first.sign); | ||||
|             }, | ||||
|             abs: function (m) { | ||||
|                 var first = m || self; | ||||
|                 return BigNumber(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 = BigNumber(first.value, sign.positive); | ||||
|                     second = BigNumber(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 BigNumber(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 BigNumber(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 BigNumber(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 (BigNumber(first.value, first.sign).equals(0)) return { | ||||
|                     quotient: BigNumber([0], sign.positive), | ||||
|                     remainder: BigNumber([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: BigNumber(result, s), | ||||
|                     remainder: BigNumber(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 = BigNumber(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 = BigNumber([0], sign.positive); | ||||
|     var ONE = BigNumber([1], sign.positive); | ||||
|     var MINUS_ONE = BigNumber([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 = BigNumber; | ||||
| } | ||||
| 
 | ||||
| @ -1,51 +0,0 @@ | ||||
| { | ||||
|   "name": "ethereum.js", | ||||
|   "namespace": "ethereum", | ||||
|   "version": "0.0.10", | ||||
|   "description": "Ethereum Compatible JavaScript API", | ||||
|   "main": ["./dist/ethereum.js", "./dist/ethereum.min.js"], | ||||
|   "dependencies": { | ||||
|     "bignumber.js": ">=2.0.0" | ||||
|   }, | ||||
|   "repository": { | ||||
|     "type": "git", | ||||
|     "url": "https://github.com/ethereum/ethereum.js.git" | ||||
|   }, | ||||
|   "homepage": "https://github.com/ethereum/ethereum.js", | ||||
|   "bugs": { | ||||
|     "url": "https://github.com/ethereum/ethereum.js/issues" | ||||
|   }, | ||||
|   "keywords": [ | ||||
|     "ethereum", | ||||
|     "javascript", | ||||
|     "API" | ||||
|   ], | ||||
|   "authors": [ | ||||
|     { | ||||
|       "name": "Marek Kotewicz", | ||||
|       "email": "marek@ethdev.com", | ||||
|       "homepage": "https://github.com/debris" | ||||
|     }, | ||||
|     { | ||||
|       "name": "Marian Oancea", | ||||
|       "email": "marian@ethdev.com", | ||||
|       "homepage": "https://github.com/cubedro" | ||||
|     } | ||||
|   ], | ||||
|   "license": "LGPL-3.0", | ||||
|   "ignore": [ | ||||
|     "example", | ||||
|     "lib", | ||||
|     "node_modules", | ||||
|     "package.json", | ||||
|     ".bowerrc", | ||||
|     ".editorconfig", | ||||
|     ".gitignore", | ||||
|     ".jshintrc", | ||||
|     ".npmignore", | ||||
|     ".travis.yml", | ||||
|     "gulpfile.js", | ||||
|     "index.js", | ||||
|     "**/*.txt" | ||||
|   ] | ||||
| } | ||||
							
								
								
									
										1198
									
								
								cmd/mist/assets/ext/dist/ethereum.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1198
									
								
								cmd/mist/assets/ext/dist/ethereum.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										29
									
								
								cmd/mist/assets/ext/dist/ethereum.js.map
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								cmd/mist/assets/ext/dist/ethereum.js.map
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										1
									
								
								cmd/mist/assets/ext/dist/ethereum.min.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								cmd/mist/assets/ext/dist/ethereum.min.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @ -1,46 +0,0 @@ | ||||
| <!doctype> | ||||
| <html> | ||||
| 
 | ||||
| <head> | ||||
| <script type="text/javascript" src="../bignumber.min.js"></script> | ||||
| <script type="text/javascript" src="../dist/ethereum.js"></script> | ||||
| <script type="text/javascript"> | ||||
|     | ||||
| console.log("hello world"); | ||||
|     var web3 = require('web3'); | ||||
| console.log(web3) | ||||
|     web3.setProvider(new web3.providers.HttpSyncProvider('http://localhost:8080')); | ||||
| 
 | ||||
|     function watchBalance() { | ||||
|         var coinbase = web3.eth.coinbase; | ||||
|         var originalBalance = 0; | ||||
| 
 | ||||
|         var balance = web3.eth.balanceAt(coinbase); | ||||
|         var originalBalance = web3.toDecimal(balance); | ||||
|         document.getElementById('original').innerText = 'original balance: ' + originalBalance + '    watching...'; | ||||
| 
 | ||||
|         web3.eth.watch({altered: coinbase}).changed(function() { | ||||
|             balance = web3.eth.balanceAt(coinbase) | ||||
|             var currentBalance = web3.toDecimal(balance); | ||||
|             document.getElementById("current").innerText = 'current: ' + currentBalance; | ||||
|             document.getElementById("diff").innerText = 'diff:    ' + (currentBalance - originalBalance); | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
| var request = new XMLHttpRequest(); | ||||
| request.open('POST', "http://localhost:8080", false); | ||||
| request.send({}); | ||||
| 
 | ||||
| 
 | ||||
| </script> | ||||
| </head> | ||||
| <body> | ||||
|     <h1>coinbase balance</h1> | ||||
|     <button type="button" onClick="watchBalance();">watch balance</button> | ||||
|     <div></div> | ||||
|     <div id="original"></div> | ||||
|     <div id="current"></div> | ||||
|     <div id="diff"></div> | ||||
| </body> | ||||
| </html> | ||||
| 
 | ||||
| @ -1,73 +0,0 @@ | ||||
| <!doctype> | ||||
| <html> | ||||
| 
 | ||||
| <head> | ||||
| <script type="text/javascript" src="js/bignumber.js/bignumber.min.js"></script> | ||||
| <script type="text/javascript" src="../dist/ethereum.js"></script> | ||||
| <script type="text/javascript"> | ||||
| 
 | ||||
|     var web3 = require('web3'); | ||||
|     web3.setProvider(new web3.providers.HttpSyncProvider()); | ||||
| 
 | ||||
|     // solidity source code | ||||
|     var source = "" +  | ||||
|     "contract test {\n" + | ||||
|     "   function multiply(uint a) returns(uint d) {\n" + | ||||
|     "       return a * 7;\n" + | ||||
|     "   }\n" + | ||||
|     "}\n"; | ||||
| 
 | ||||
|     // contract description, this will be autogenerated somehow | ||||
|     var desc =  [{ | ||||
|         "name": "multiply(uint256)", | ||||
|         "inputs": [ | ||||
|         { | ||||
|             "name": "a", | ||||
|             "type": "uint256" | ||||
|         } | ||||
|         ], | ||||
|         "outputs": [ | ||||
|         { | ||||
|             "name": "d", | ||||
|             "type": "uint256" | ||||
|         } | ||||
|         ] | ||||
|     }]; | ||||
| 
 | ||||
|     var contract; | ||||
| 
 | ||||
|     function createExampleContract() { | ||||
|         // hide create button | ||||
|         document.getElementById('create').style.visibility = 'hidden';  | ||||
|         document.getElementById('source').innerText = source; | ||||
| 
 | ||||
|         // create contract | ||||
|         var address = web3.eth.transact({code: web3.eth.solidity(source)}); | ||||
|         contract = web3.eth.contract(address, desc); | ||||
|         document.getElementById('call').style.visibility = 'visible'; | ||||
|     } | ||||
| 
 | ||||
|     function callExampleContract() { | ||||
|         // this should be generated by ethereum | ||||
|         var param = parseInt(document.getElementById('value').value); | ||||
| 
 | ||||
|         // call the contract | ||||
|         var res = contract.call().multiply(param); | ||||
|         document.getElementById('result').innerText = res.toString(10); | ||||
|     } | ||||
| 
 | ||||
| </script> | ||||
| </head> | ||||
| <body> | ||||
|     <h1>contract</h1> | ||||
|     <div id="source"></div>  | ||||
|     <div id='create'> | ||||
|         <button type="button" onClick="createExampleContract();">create example contract</button> | ||||
|     </div> | ||||
|     <div id='call' style='visibility: hidden;'> | ||||
|         <input type="number" id="value" onkeyup='callExampleContract()'></input> | ||||
|     </div> | ||||
|     <div id="result"></div> | ||||
| </body> | ||||
| </html> | ||||
| 
 | ||||
| @ -1,76 +0,0 @@ | ||||
| <!doctype> | ||||
| <html> | ||||
| 
 | ||||
| <head> | ||||
| <script type="text/javascript" src="js/bignumber.js/bignumber.min.js"></script> | ||||
| <script type="text/javascript" src="../dist/ethereum.js"></script> | ||||
| <script type="text/javascript"> | ||||
| 
 | ||||
|     var web3 = require('web3'); | ||||
|     web3.setProvider(new web3.providers.QtSyncProvider()); | ||||
| 
 | ||||
|     // solidity source code | ||||
|     var source = "" +  | ||||
|     "contract test {\n" + | ||||
|     "   /// @notice Will multiply `a` by 7. \n" + | ||||
|     "   function multiply(uint a) returns(uint d) {\n" + | ||||
|     "       return a * 7;\n" + | ||||
|     "   }\n" + | ||||
|     "}\n"; | ||||
| 
 | ||||
|     // contract description, this will be autogenerated somehow | ||||
|     var desc =  [{ | ||||
|         "name": "multiply(uint256)", | ||||
|         "inputs": [ | ||||
|         { | ||||
|             "name": "a", | ||||
|             "type": "uint256" | ||||
|         } | ||||
|         ], | ||||
|         "outputs": [ | ||||
|         { | ||||
|             "name": "d", | ||||
|             "type": "uint256" | ||||
|         } | ||||
|         ] | ||||
|     }]; | ||||
| 
 | ||||
|     var contract; | ||||
| 
 | ||||
|     function createExampleContract() { | ||||
|         // hide create button | ||||
|         document.getElementById('create').style.visibility = 'hidden';  | ||||
|         document.getElementById('source').innerText = source; | ||||
| 
 | ||||
|         // create contract | ||||
|         var address = web3.eth.transact({code: web3.eth.solidity(source)}); | ||||
|         contract = web3.eth.contract(address, desc); | ||||
|         document.getElementById('call').style.visibility = 'visible'; | ||||
|     } | ||||
| 
 | ||||
|     function callExampleContract() { | ||||
|         // this should be generated by ethereum | ||||
|         var param = parseInt(document.getElementById('value').value); | ||||
| 
 | ||||
|         // transaction does not return any result, cause it's not synchronous and we don't know, | ||||
|         // when it will be processed | ||||
|         contract.transact().multiply(param); | ||||
|         document.getElementById('result').innerText = 'transaction made'; | ||||
|     } | ||||
| 
 | ||||
| </script> | ||||
| </head> | ||||
| <body> | ||||
|     <h1>contract</h1> | ||||
|     <div id="source"></div>  | ||||
|     <div id='create'> | ||||
|         <button type="button" onClick="createExampleContract();">create example contract</button> | ||||
|     </div> | ||||
|     <div id='call' style='visibility: hidden;'> | ||||
|         <input type="number" id="value"></input> | ||||
| 		<button type="button" onClick="callExampleContract()">Call Contract</button> | ||||
|     </div> | ||||
|     <div id="result"></div> | ||||
| </body> | ||||
| </html> | ||||
| 
 | ||||
| @ -1,12 +0,0 @@ | ||||
| #!/usr/bin/env node
 | ||||
| 
 | ||||
| var web3 = require("../index.js"); | ||||
| 
 | ||||
| web3.setProvider(new web3.providers.HttpSyncProvider('http://localhost:8080')); | ||||
| 
 | ||||
| var coinbase = web3.eth.coinbase; | ||||
| console.log(coinbase); | ||||
| 
 | ||||
| var balance = web3.eth.balanceAt(coinbase); | ||||
| console.log(balance); | ||||
| 
 | ||||
| @ -1,66 +0,0 @@ | ||||
| // Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
 | ||||
| //
 | ||||
| // This library is free software; you can redistribute it and/or
 | ||||
| // modify it under the terms of the GNU General Public
 | ||||
| // License as published by the Free Software Foundation; either
 | ||||
| // version 2.1 of the License, or (at your option) any later version.
 | ||||
| //
 | ||||
| // This library is distributed in the hope that it will be useful,
 | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | ||||
| // General Public License for more details.
 | ||||
| //
 | ||||
| // You should have received a copy of the GNU General Public License
 | ||||
| // along with this library; if not, write to the Free Software
 | ||||
| // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 | ||||
| // MA 02110-1301  USA
 | ||||
| 
 | ||||
| var ethx = { | ||||
|     prototype: Object, | ||||
| 
 | ||||
|     watch: function(options) { | ||||
|         return new Filter(options); | ||||
|     }, | ||||
| 
 | ||||
|     note: function() { | ||||
|         var args = Array.prototype.slice.call(arguments, 0); | ||||
|         var o = [] | ||||
|         for(var i = 0; i < args.length; i++) { | ||||
|             o.push(args[i].toString()) | ||||
|         } | ||||
| 
 | ||||
|         eth.notef(o); | ||||
|     }, | ||||
| }; | ||||
| 
 | ||||
| var Filter = function(options) { | ||||
| 	this.callbacks = []; | ||||
| 	this.options = options; | ||||
| 
 | ||||
| 	if(options === "chain") { | ||||
| 		this.id = eth.newFilterString(options); | ||||
| 	} else if(typeof options === "object") { | ||||
| 		this.id = eth.newFilter(options); | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
| Filter.prototype.changed = function(callback) { | ||||
|     this.callbacks.push(callback); | ||||
| 
 | ||||
| 	var self = this; | ||||
| 	messages.connect(function(messages, id) { | ||||
| 		if(id ==  self.id) { | ||||
| 			for(var i = 0; i < self.callbacks.length; i++) { | ||||
| 				self.callbacks[i].call(self, messages); | ||||
| 			} | ||||
| 		} | ||||
| 	}); | ||||
| }; | ||||
| 
 | ||||
| Filter.prototype.uninstall = function() { | ||||
| 	eth.uninstallFilter(this.id) | ||||
| } | ||||
| 
 | ||||
| Filter.prototype.messages = function() { | ||||
| 	return eth.messages(this.id) | ||||
| } | ||||
| @ -1,104 +0,0 @@ | ||||
| #!/usr/bin/env node
 | ||||
| 
 | ||||
| 'use strict'; | ||||
| 
 | ||||
| var path = require('path'); | ||||
| 
 | ||||
| var del = require('del'); | ||||
| var gulp = require('gulp'); | ||||
| var browserify = require('browserify'); | ||||
| var jshint = require('gulp-jshint'); | ||||
| var uglify = require('gulp-uglify'); | ||||
| var rename = require('gulp-rename'); | ||||
| var envify = require('envify/custom'); | ||||
| var unreach = require('unreachable-branch-transform'); | ||||
| var source = require('vinyl-source-stream'); | ||||
| var exorcist = require('exorcist'); | ||||
| var bower = require('bower'); | ||||
| 
 | ||||
| var DEST = './dist/'; | ||||
| 
 | ||||
| var build = function(src, dst, ugly) { | ||||
|   var result = browserify({ | ||||
|       debug: true, | ||||
|       insert_global_vars: false, | ||||
|       detectGlobals: false, | ||||
|       bundleExternal: false | ||||
|     }) | ||||
|     .require('./' + src + '.js', {expose: 'web3'}) | ||||
|     .add('./' + src + '.js') | ||||
|     .transform('envify', { | ||||
|       NODE_ENV: 'build' | ||||
|     }) | ||||
|     .transform('unreachable-branch-transform'); | ||||
| 
 | ||||
|     if (ugly) { | ||||
|       result = result.transform('uglifyify', { | ||||
|         mangle: false, | ||||
|         compress: { | ||||
|           dead_code: false, | ||||
|           conditionals: true, | ||||
|           unused: false, | ||||
|           hoist_funs: true, | ||||
|           hoist_vars: true, | ||||
|           negate_iife: false | ||||
|         }, | ||||
|         beautify: true, | ||||
|         warnings: true | ||||
|       }); | ||||
|     } | ||||
| 
 | ||||
|     return result.bundle() | ||||
|     .pipe(exorcist(path.join( DEST, dst + '.js.map'))) | ||||
|     .pipe(source(dst + '.js')) | ||||
|     .pipe(gulp.dest( DEST )); | ||||
| }; | ||||
| 
 | ||||
| var uglifyFile = function(file) { | ||||
|   return gulp.src( DEST + file + '.js') | ||||
|     .pipe(uglify()) | ||||
|     .pipe(rename(file + '.min.js')) | ||||
|     .pipe(gulp.dest( DEST )); | ||||
| }; | ||||
| 
 | ||||
| gulp.task('bower', function(cb){ | ||||
|   bower.commands.install().on('end', function (installed){ | ||||
|     console.log(installed); | ||||
|     cb(); | ||||
|   }); | ||||
| }); | ||||
| 
 | ||||
| gulp.task('clean', ['lint'], function(cb) { | ||||
|   del([ DEST ], cb); | ||||
| }); | ||||
| 
 | ||||
| gulp.task('lint', function(){ | ||||
|   return gulp.src(['./*.js', './lib/*.js']) | ||||
|     .pipe(jshint()) | ||||
|     .pipe(jshint.reporter('default')); | ||||
| }); | ||||
| 
 | ||||
| gulp.task('build', ['clean'], function () { | ||||
|     return build('index', 'ethereum', true); | ||||
| }); | ||||
| 
 | ||||
| gulp.task('buildDev', ['clean'], function () { | ||||
|     return build('index', 'ethereum', false); | ||||
| }); | ||||
| 
 | ||||
| gulp.task('uglify', ['build'], function(){ | ||||
|     return uglifyFile('ethereum'); | ||||
| }); | ||||
| 
 | ||||
| gulp.task('uglifyDev', ['buildDev'], function(){ | ||||
|     return uglifyFile('ethereum'); | ||||
| }); | ||||
| 
 | ||||
| gulp.task('watch', function() { | ||||
|   gulp.watch(['./lib/*.js'], ['lint', 'prepare', 'build']); | ||||
| }); | ||||
| 
 | ||||
| gulp.task('release', ['bower', 'lint', 'build', 'uglify']); | ||||
| gulp.task('dev', ['bower', 'lint', 'buildDev', 'uglifyDev']); | ||||
| gulp.task('default', ['dev']); | ||||
| 
 | ||||
| @ -1,22 +0,0 @@ | ||||
| <!doctype> | ||||
| <html> | ||||
| <head> | ||||
| <title>Ethereum</title> | ||||
| 
 | ||||
| <style type="text/css"> | ||||
| h1 { | ||||
|     text-align: center; | ||||
|     font-family: Courier; | ||||
|     font-size: 50pt; | ||||
| } | ||||
| </style> | ||||
| </head> | ||||
| 
 | ||||
| <body> | ||||
| <h1>... Ethereum ...</h1> | ||||
| <ul> | ||||
| 	<li><a href="http://std.eth">std::Service</a></li> | ||||
| </ul> | ||||
| </body> | ||||
| </html> | ||||
| 
 | ||||
| @ -1,481 +0,0 @@ | ||||
| // Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
 | ||||
| //
 | ||||
| // This library is free software; you can redistribute it and/or
 | ||||
| // modify it under the terms of the GNU General Public
 | ||||
| // License as published by the Free Software Foundation; either
 | ||||
| // version 2.1 of the License, or (at your option) any later version.
 | ||||
| //
 | ||||
| // This library is distributed in the hope that it will be useful,
 | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | ||||
| // General Public License for more details.
 | ||||
| //
 | ||||
| // You should have received a copy of the GNU General Public License
 | ||||
| // along with this library; if not, write to the Free Software
 | ||||
| // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 | ||||
| // MA 02110-1301  USA
 | ||||
| 
 | ||||
| // The magic return variable. The magic return variable will be set during the execution of the QML call.
 | ||||
| (function(window) { | ||||
| 	var Promise = window.Promise; | ||||
| 	if(typeof(Promise) === "undefined") { | ||||
| 		var Promise = Q.Promise; | ||||
| 	} | ||||
| 
 | ||||
| 	function isPromise(o) { | ||||
| 		return typeof o === "object" && o.then | ||||
| 	} | ||||
| 
 | ||||
| 	window.eth = { | ||||
| 		_callbacks: {}, | ||||
| 		_events: {}, | ||||
| 		prototype: Object(), | ||||
| 
 | ||||
| 		toHex: function(str) { | ||||
| 			var hex = ""; | ||||
| 			for(var i = 0; i < str.length; i++) { | ||||
| 				var n = str.charCodeAt(i).toString(16); | ||||
| 				hex += n.length < 2 ? '0' + n : n; | ||||
| 			} | ||||
| 
 | ||||
| 			return hex; | ||||
| 		}, | ||||
| 
 | ||||
| 		toAscii: function(hex) { | ||||
| 			// Find termination
 | ||||
| 			var str = ""; | ||||
| 			var i = 0, l = hex.length; | ||||
| 			for(; i < l; i+=2) { | ||||
| 				var code = hex.charCodeAt(i) | ||||
| 				if(code == 0) { | ||||
| 					break; | ||||
| 				} | ||||
| 
 | ||||
| 				str += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); | ||||
| 			} | ||||
| 
 | ||||
| 			return str; | ||||
| 		}, | ||||
| 
 | ||||
| 		fromAscii: function(str, pad) { | ||||
| 			if(pad === undefined) { | ||||
| 				pad = 32 | ||||
| 			} | ||||
| 
 | ||||
| 			var hex = this.toHex(str); | ||||
| 
 | ||||
| 			while(hex.length < pad*2) | ||||
| 				hex += "00"; | ||||
| 
 | ||||
| 			return hex | ||||
| 		}, | ||||
| 
 | ||||
| 		block: function(numberOrHash) { | ||||
| 			return new Promise(function(resolve, reject) { | ||||
| 				var func; | ||||
| 				if(typeof numberOrHash == "string") { | ||||
| 					func =  "getBlockByHash"; | ||||
| 				} else { | ||||
| 					func =  "getBlockByNumber"; | ||||
| 				} | ||||
| 
 | ||||
| 				postData({call: func, args: [numberOrHash]}, function(block) { | ||||
| 					if(block) | ||||
| 						resolve(block); | ||||
| 					else | ||||
| 						reject("not found"); | ||||
| 
 | ||||
| 				}); | ||||
| 			}); | ||||
| 		}, | ||||
| 
 | ||||
| 		transact: function(params) { | ||||
| 			if(params === undefined) { | ||||
| 				params = {}; | ||||
| 			} | ||||
| 
 | ||||
| 			if(params.endowment !== undefined) | ||||
| 				params.value = params.endowment; | ||||
| 			if(params.code !== undefined) | ||||
| 				params.data = params.code; | ||||
| 
 | ||||
| 
 | ||||
| 			var promises = [] | ||||
| 			if(isPromise(params.to)) { | ||||
| 				promises.push(params.to.then(function(_to) { params.to = _to; })); | ||||
| 			} | ||||
| 			if(isPromise(params.from)) { | ||||
| 				promises.push(params.from.then(function(_from) { params.from = _from; })); | ||||
| 			} | ||||
| 
 | ||||
|             if(typeof params.data !== "object" || isPromise(params.data)) { | ||||
|                 params.data = [params.data] | ||||
|             } | ||||
| 
 | ||||
|             var data = params.data; | ||||
|             for(var i = 0; i < params.data.length; i++) { | ||||
|                 if(isPromise(params.data[i])) { | ||||
|                     var promise = params.data[i]; | ||||
|                     var _i = i; | ||||
|                     promises.push(promise.then(function(_arg) { params.data[_i] = _arg; })); | ||||
|                 } | ||||
|             } | ||||
|                  | ||||
| 			// Make sure everything is string
 | ||||
| 			var fields = ["value", "gas", "gasPrice"]; | ||||
| 			for(var i = 0; i < fields.length; i++) { | ||||
| 				if(params[fields[i]] === undefined) { | ||||
| 					params[fields[i]] = ""; | ||||
| 				} | ||||
| 				params[fields[i]] = params[fields[i]].toString(); | ||||
| 			} | ||||
| 
 | ||||
| 			// Load promises then call the last "transact".
 | ||||
| 			return Q.all(promises).then(function() { | ||||
| 				return new Promise(function(resolve, reject) { | ||||
|                     params.data = params.data.join(""); | ||||
| 					postData({call: "transact", args: params}, function(data) { | ||||
| 						if(data[1]) | ||||
| 							reject(data[0]); | ||||
| 						else | ||||
| 							resolve(data[0]); | ||||
| 					}); | ||||
| 				}); | ||||
| 			}) | ||||
| 		}, | ||||
| 
 | ||||
| 		compile: function(code) { | ||||
| 			return new Promise(function(resolve, reject) { | ||||
| 				postData({call: "compile", args: [code]}, function(data) { | ||||
| 					if(data[1]) | ||||
| 						reject(data[0]); | ||||
| 					else | ||||
| 						resolve(data[0]); | ||||
| 				}); | ||||
| 			}); | ||||
| 		}, | ||||
| 
 | ||||
| 		balanceAt: function(address) { | ||||
| 			var promises = []; | ||||
| 
 | ||||
| 			if(isPromise(address)) { | ||||
| 				promises.push(address.then(function(_address) { address = _address; })); | ||||
| 			} | ||||
| 
 | ||||
| 			return Q.all(promises).then(function() { | ||||
| 				return new Promise(function(resolve, reject) { | ||||
| 					postData({call: "getBalanceAt", args: [address]}, function(balance) { | ||||
| 						resolve(balance); | ||||
| 					}); | ||||
| 				}); | ||||
| 			}); | ||||
| 		}, | ||||
| 
 | ||||
| 		countAt: function(address) { | ||||
| 			var promises = []; | ||||
| 
 | ||||
| 			if(isPromise(address)) { | ||||
| 				promises.push(address.then(function(_address) { address = _address; })); | ||||
| 			} | ||||
| 
 | ||||
| 			return Q.all(promises).then(function() { | ||||
| 				return new Promise(function(resolve, reject) { | ||||
| 					postData({call: "getCountAt", args: [address]}, function(count) { | ||||
| 						resolve(count); | ||||
| 					}); | ||||
| 				}); | ||||
| 			}); | ||||
| 		}, | ||||
| 
 | ||||
| 		codeAt: function(address) { | ||||
| 			var promises = []; | ||||
| 
 | ||||
| 			if(isPromise(address)) { | ||||
| 				promises.push(address.then(function(_address) { address = _address; })); | ||||
| 			} | ||||
| 
 | ||||
| 			return Q.all(promises).then(function() { | ||||
| 				return new Promise(function(resolve, reject) { | ||||
| 					postData({call: "getCodeAt", args: [address]}, function(code) { | ||||
| 						resolve(code); | ||||
| 					}); | ||||
| 				}); | ||||
| 			}); | ||||
| 		}, | ||||
| 
 | ||||
| 		storageAt: function(address, storageAddress) { | ||||
| 			var promises = []; | ||||
| 
 | ||||
| 			if(isPromise(address)) { | ||||
| 				promises.push(address.then(function(_address) { address = _address; })); | ||||
| 			} | ||||
| 
 | ||||
| 			if(isPromise(storageAddress)) { | ||||
| 				promises.push(storageAddress.then(function(_sa) { storageAddress = _sa; })); | ||||
| 			} | ||||
| 
 | ||||
| 			return Q.all(promises).then(function() { | ||||
| 				return new Promise(function(resolve, reject) { | ||||
| 					postData({call: "getStorageAt", args: [address, storageAddress]}, function(entry) { | ||||
| 						resolve(entry); | ||||
| 					}); | ||||
| 				}); | ||||
| 			}); | ||||
| 		}, | ||||
| 
 | ||||
| 		stateAt: function(address, storageAddress) { | ||||
| 			return this.storageAt(address, storageAddress); | ||||
| 		}, | ||||
| 
 | ||||
| 		call: function(params) { | ||||
| 			if(params === undefined) { | ||||
| 				params = {}; | ||||
| 			} | ||||
| 
 | ||||
| 			if(params.endowment !== undefined) | ||||
| 				params.value = params.endowment; | ||||
| 			if(params.code !== undefined) | ||||
| 				params.data = params.code; | ||||
| 
 | ||||
| 
 | ||||
| 			var promises = [] | ||||
| 			if(isPromise(params.to)) { | ||||
| 				promises.push(params.to.then(function(_to) { params.to = _to; })); | ||||
| 			} | ||||
| 			if(isPromise(params.from)) { | ||||
| 				promises.push(params.from.then(function(_from) { params.from = _from; })); | ||||
| 			} | ||||
| 
 | ||||
| 			if(isPromise(params.data)) { | ||||
| 				promises.push(params.data.then(function(_code) { params.data = _code; })); | ||||
| 			} else { | ||||
| 				if(typeof params.data === "object") { | ||||
| 					data = ""; | ||||
| 					for(var i = 0; i < params.data.length; i++) { | ||||
| 						data += params.data[i] | ||||
| 					} | ||||
| 				} else { | ||||
| 					data = params.data; | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			// Make sure everything is string
 | ||||
| 			var fields = ["value", "gas", "gasPrice"]; | ||||
| 			for(var i = 0; i < fields.length; i++) { | ||||
| 				if(params[fields[i]] === undefined) { | ||||
| 					params[fields[i]] = ""; | ||||
| 				} | ||||
| 				params[fields[i]] = params[fields[i]].toString(); | ||||
| 			} | ||||
| 
 | ||||
| 			// Load promises then call the last "transact".
 | ||||
| 			return Q.all(promises).then(function() { | ||||
| 				return new Promise(function(resolve, reject) { | ||||
| 					postData({call: "call", args: params}, function(data) { | ||||
| 						if(data[1]) | ||||
| 							reject(data[0]); | ||||
| 						else | ||||
| 							resolve(data[0]); | ||||
| 					}); | ||||
| 				}); | ||||
| 			}) | ||||
| 		}, | ||||
| 
 | ||||
| 		watch: function(params) { | ||||
| 			return new Filter(params); | ||||
| 		}, | ||||
| 
 | ||||
| 		secretToAddress: function(key) { | ||||
| 			var promises = []; | ||||
| 			if(isPromise(key)) { | ||||
| 				promises.push(key.then(function(_key) { key = _key; })); | ||||
| 			} | ||||
| 
 | ||||
| 			return Q.all(promises).then(function() { | ||||
| 				return new Promise(function(resolve, reject) { | ||||
| 					postData({call: "getSecretToAddress", args: [key]}, function(address) { | ||||
| 						resolve(address); | ||||
| 					}); | ||||
| 				}); | ||||
| 			}); | ||||
| 		}, | ||||
| 
 | ||||
| 		on: function(event, cb) { | ||||
| 			if(eth._events[event] === undefined) { | ||||
| 				eth._events[event] = []; | ||||
| 			} | ||||
| 
 | ||||
| 			eth._events[event].push(cb); | ||||
| 
 | ||||
| 			return this | ||||
| 		}, | ||||
| 
 | ||||
| 		off: function(event, cb) { | ||||
| 			if(eth._events[event] !== undefined) { | ||||
| 				var callbacks = eth._events[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._events[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); | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		}, | ||||
| 	}; | ||||
| 
 | ||||
| 	// Eth object properties
 | ||||
| 	Object.defineProperty(eth, "key", { | ||||
| 		get: function() { | ||||
| 			return new Promise(function(resolve, reject) { | ||||
| 				postData({call: "getKey"}, function(k) { | ||||
| 					resolve(k); | ||||
| 				}); | ||||
| 			}); | ||||
| 		}, | ||||
| 	}); | ||||
| 
 | ||||
| 	Object.defineProperty(eth, "gasPrice", { | ||||
| 		get: function() { | ||||
| 			return "10000000000000" | ||||
| 		} | ||||
| 	}); | ||||
| 
 | ||||
| 	Object.defineProperty(eth, "coinbase", { | ||||
| 		get: function() { | ||||
| 			return new Promise(function(resolve, reject) { | ||||
| 				postData({call: "getCoinBase"}, function(coinbase) { | ||||
| 					resolve(coinbase); | ||||
| 				}); | ||||
| 			}); | ||||
| 		}, | ||||
| 	}); | ||||
| 
 | ||||
| 	Object.defineProperty(eth, "listening", { | ||||
| 		get: function() { | ||||
| 			return new Promise(function(resolve, reject) { | ||||
| 				postData({call: "getIsListening"}, function(listening) { | ||||
| 					resolve(listening); | ||||
| 				}); | ||||
| 			}); | ||||
| 		}, | ||||
| 	}); | ||||
| 
 | ||||
| 
 | ||||
| 	Object.defineProperty(eth, "mining", { | ||||
| 		get: function() { | ||||
| 			return new Promise(function(resolve, reject) { | ||||
| 				postData({call: "getIsMining"}, function(mining) { | ||||
| 					resolve(mining); | ||||
| 				}); | ||||
| 			}); | ||||
| 		}, | ||||
| 	}); | ||||
| 
 | ||||
| 	Object.defineProperty(eth, "peerCount", { | ||||
| 		get: function() { | ||||
| 			return new Promise(function(resolve, reject) { | ||||
| 				postData({call: "getPeerCount"}, function(peerCount) { | ||||
| 					resolve(peerCount); | ||||
| 				}); | ||||
| 			}); | ||||
| 		}, | ||||
| 	}); | ||||
| 
 | ||||
| 	var filters = []; | ||||
| 	var Filter = function(options) { | ||||
| 		filters.push(this); | ||||
| 
 | ||||
| 		this.callbacks = []; | ||||
| 		this.options = options; | ||||
| 
 | ||||
| 		var call; | ||||
| 		if(options === "chain") { | ||||
| 			call = "newFilterString" | ||||
| 		} else if(typeof options === "object") { | ||||
| 			call = "newFilter" | ||||
| 		} | ||||
| 
 | ||||
| 		var self = this; // Cheaper than binding
 | ||||
| 		this.promise = new Promise(function(resolve, reject) { | ||||
| 			postData({call: call, args: [options]}, function(id) { | ||||
| 				self.id = id; | ||||
| 
 | ||||
| 				resolve(id); | ||||
| 			}); | ||||
| 		}); | ||||
| 	}; | ||||
| 
 | ||||
| 	Filter.prototype.changed = function(callback) { | ||||
| 		var self = this; | ||||
| 		this.promise.then(function(id) { | ||||
| 			self.callbacks.push(callback); | ||||
| 		}); | ||||
| 	}; | ||||
| 
 | ||||
| 	Filter.prototype.trigger = function(messages, id) { | ||||
| 		if(id == this.id) { | ||||
| 			for(var i = 0; i < this.callbacks.length; i++) { | ||||
| 				this.callbacks[i].call(this, messages); | ||||
| 			} | ||||
| 		} | ||||
| 	}; | ||||
| 
 | ||||
| 	Filter.prototype.uninstall = function() { | ||||
| 		this.promise.then(function(id) { | ||||
| 			postData({call: "uninstallFilter", args:[id]}); | ||||
| 		}); | ||||
| 	}; | ||||
| 
 | ||||
| 	Filter.prototype.messages = function() { | ||||
| 		var self=this; | ||||
| 		return Q.all([this.promise]).then(function() { | ||||
| 			var id = self.id | ||||
| 			return new Promise(function(resolve, reject) { | ||||
| 				postData({call: "getMessages", args: [id]}, function(messages) { | ||||
| 					resolve(messages); | ||||
| 				}); | ||||
| 			}); | ||||
| 		}); | ||||
| 	}; | ||||
| 
 | ||||
| 	// Register to the messages callback. "messages" will be emitted when new messages
 | ||||
| 	// from the client have been created.
 | ||||
| 	eth.on("messages", function(messages, id) { | ||||
| 		for(var i = 0; i < filters.length; i++) { | ||||
| 			filters[i].trigger(messages, id); | ||||
| 		} | ||||
| 	}); | ||||
| 
 | ||||
| 
 | ||||
| 	var g_seed = 1; | ||||
| 	function postData(data, cb) { | ||||
| 		data._seed = g_seed; | ||||
| 		if(cb) { | ||||
| 			eth._callbacks[data._seed] = cb; | ||||
| 		} | ||||
| 
 | ||||
| 		if(data.args === undefined) { | ||||
| 			data.args = []; | ||||
| 		} | ||||
| 
 | ||||
| 		g_seed++; | ||||
| 
 | ||||
| 		window._messagingAdapter.call(this, JSON.stringify(data)) | ||||
| 	} | ||||
| })(this); | ||||
| @ -1,30 +0,0 @@ | ||||
| // Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
 | ||||
| //
 | ||||
| // This library is free software; you can redistribute it and/or
 | ||||
| // modify it under the terms of the GNU General Public
 | ||||
| // License as published by the Free Software Foundation; either
 | ||||
| // version 2.1 of the License, or (at your option) any later version.
 | ||||
| //
 | ||||
| // This library is distributed in the hope that it will be useful,
 | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | ||||
| // General Public License for more details.
 | ||||
| //
 | ||||
| // You should have received a copy of the GNU General Public License
 | ||||
| // along with this library; if not, write to the Free Software
 | ||||
| // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 | ||||
| // MA 02110-1301  USA
 | ||||
| 
 | ||||
| // this function is included locally, but you can also include separately via a header definition
 | ||||
| function request(url, callback) { | ||||
| 	var xhr = new XMLHttpRequest(); | ||||
| 	xhr.onreadystatechange = (function(req) { | ||||
| 		return function() { | ||||
| 			if(req.readyState === 4) { | ||||
| 				callback(req); | ||||
| 			} | ||||
| 		} | ||||
| 	})(xhr); | ||||
| 	xhr.open('GET', url, true); | ||||
| 	xhr.send(''); | ||||
| } | ||||
| @ -1,11 +0,0 @@ | ||||
| var web3 = require('./lib/web3'); | ||||
| var ProviderManager = require('./lib/providermanager'); | ||||
| web3.provider = new ProviderManager(); | ||||
| web3.filter = require('./lib/filter'); | ||||
| web3.providers.HttpSyncProvider = require('./lib/httpsync'); | ||||
| web3.providers.QtSyncProvider = require('./lib/qtsync'); | ||||
| web3.eth.contract = require('./lib/contract'); | ||||
| web3.abi = require('./lib/abi'); | ||||
| 
 | ||||
| 
 | ||||
| module.exports = web3; | ||||
| @ -1,410 +0,0 @@ | ||||
| /* | ||||
|     This file is part of ethereum.js. | ||||
| 
 | ||||
|     ethereum.js is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU Lesser General Public License as published by | ||||
|     the Free Software Foundation, either version 3 of the License, or | ||||
|     (at your option) any later version. | ||||
| 
 | ||||
|     ethereum.js is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU Lesser General Public License for more details. | ||||
| 
 | ||||
|     You should have received a copy of the GNU Lesser General Public License | ||||
|     along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| */ | ||||
| /** @file abi.js | ||||
|  * @authors: | ||||
|  *   Marek Kotewicz <marek@ethdev.com> | ||||
|  *   Gav Wood <g@ethdev.com> | ||||
|  * @date 2014 | ||||
|  */ | ||||
| 
 | ||||
| // TODO: is these line is supposed to be here? 
 | ||||
| if (process.env.NODE_ENV !== 'build') { | ||||
|     var BigNumber = require('bignumber.js'); // jshint ignore:line
 | ||||
| } | ||||
| 
 | ||||
| var web3 = require('./web3'); // jshint ignore:line
 | ||||
| 
 | ||||
| BigNumber.config({ ROUNDING_MODE: BigNumber.ROUND_DOWN }); | ||||
| 
 | ||||
| var ETH_PADDING = 32; | ||||
| 
 | ||||
| /// method signature length in bytes
 | ||||
| var ETH_METHOD_SIGNATURE_LENGTH = 4; | ||||
| 
 | ||||
| /// Finds first index of array element matching pattern
 | ||||
| /// @param array
 | ||||
| /// @param callback pattern
 | ||||
| /// @returns index of element
 | ||||
| var findIndex = function (array, callback) { | ||||
|     var end = false; | ||||
|     var i = 0; | ||||
|     for (; i < array.length && !end; i++) { | ||||
|         end = callback(array[i]); | ||||
|     } | ||||
|     return end ? i - 1 : -1; | ||||
| }; | ||||
| 
 | ||||
| /// @returns a function that is used as a pattern for 'findIndex'
 | ||||
| var findMethodIndex = function (json, methodName) { | ||||
|     return findIndex(json, function (method) { | ||||
|         return method.name === methodName; | ||||
|     }); | ||||
| }; | ||||
| 
 | ||||
| /// @returns method with given method name
 | ||||
| var getMethodWithName = function (json, methodName) { | ||||
|     var index = findMethodIndex(json, methodName); | ||||
|     if (index === -1) { | ||||
|         console.error('method ' + methodName + ' not found in the abi'); | ||||
|         return undefined; | ||||
|     } | ||||
|     return json[index]; | ||||
| }; | ||||
| 
 | ||||
| /// @param string string to be padded
 | ||||
| /// @param number of characters that result string should have
 | ||||
| /// @param sign, by default 0
 | ||||
| /// @returns right aligned string
 | ||||
| var padLeft = function (string, chars, sign) { | ||||
|     return new Array(chars - string.length + 1).join(sign ? sign : "0") + string; | ||||
| }; | ||||
| 
 | ||||
| /// @param expected type prefix (string)
 | ||||
| /// @returns function which checks if type has matching prefix. if yes, returns true, otherwise false
 | ||||
| var prefixedType = function (prefix) { | ||||
|     return function (type) { | ||||
|         return type.indexOf(prefix) === 0; | ||||
|     }; | ||||
| }; | ||||
| 
 | ||||
| /// @param expected type name (string)
 | ||||
| /// @returns function which checks if type is matching expected one. if yes, returns true, otherwise false
 | ||||
| var namedType = function (name) { | ||||
|     return function (type) { | ||||
|         return name === type; | ||||
|     }; | ||||
| }; | ||||
| 
 | ||||
| var arrayType = function (type) { | ||||
|     return type.slice(-2) === '[]'; | ||||
| }; | ||||
| 
 | ||||
| /// Formats input value to byte representation of int
 | ||||
| /// If value is negative, return it's two's complement
 | ||||
| /// If the value is floating point, round it down
 | ||||
| /// @returns right-aligned byte representation of int
 | ||||
| var formatInputInt = function (value) { | ||||
|     var padding = ETH_PADDING * 2; | ||||
|     if (value instanceof BigNumber || typeof value === 'number') { | ||||
|         if (typeof value === 'number') | ||||
|             value = new BigNumber(value); | ||||
|         value = value.round(); | ||||
| 
 | ||||
|         if (value.lessThan(0))  | ||||
|             value = new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16).plus(value).plus(1); | ||||
|         value = value.toString(16); | ||||
|     } | ||||
|     else if (value.indexOf('0x') === 0) | ||||
|         value = value.substr(2); | ||||
|     else if (typeof value === 'string') | ||||
|         value = formatInputInt(new BigNumber(value)); | ||||
|     else | ||||
|         value = (+value).toString(16); | ||||
|     return padLeft(value, padding); | ||||
| }; | ||||
| 
 | ||||
| /// Formats input value to byte representation of string
 | ||||
| /// @returns left-algined byte representation of string
 | ||||
| var formatInputString = function (value) { | ||||
|     return web3.fromAscii(value, ETH_PADDING).substr(2); | ||||
| }; | ||||
| 
 | ||||
| /// Formats input value to byte representation of bool
 | ||||
| /// @returns right-aligned byte representation bool
 | ||||
| var formatInputBool = function (value) { | ||||
|     return '000000000000000000000000000000000000000000000000000000000000000' + (value ?  '1' : '0'); | ||||
| }; | ||||
| 
 | ||||
| /// Formats input value to byte representation of real
 | ||||
| /// Values are multiplied by 2^m and encoded as integers
 | ||||
| /// @returns byte representation of real
 | ||||
| var formatInputReal = function (value) { | ||||
|     return formatInputInt(new BigNumber(value).times(new BigNumber(2).pow(128)));  | ||||
| }; | ||||
| 
 | ||||
| var dynamicTypeBytes = function (type, value) { | ||||
|     // TODO: decide what to do with array of strings
 | ||||
|     if (arrayType(type) || type === 'string')    // only string itself that is dynamic; stringX is static length.
 | ||||
|         return formatInputInt(value.length);  | ||||
|     return ""; | ||||
| }; | ||||
| 
 | ||||
| /// Setups input formatters for solidity types
 | ||||
| /// @returns an array of input formatters 
 | ||||
| var setupInputTypes = function () { | ||||
|      | ||||
|     return [ | ||||
|         { type: prefixedType('uint'), format: formatInputInt }, | ||||
|         { type: prefixedType('int'), format: formatInputInt }, | ||||
|         { type: prefixedType('hash'), format: formatInputInt }, | ||||
|         { type: prefixedType('string'), format: formatInputString },  | ||||
|         { type: prefixedType('real'), format: formatInputReal }, | ||||
|         { type: prefixedType('ureal'), format: formatInputReal }, | ||||
|         { type: namedType('address'), format: formatInputInt }, | ||||
|         { type: namedType('bool'), format: formatInputBool } | ||||
|     ]; | ||||
| }; | ||||
| 
 | ||||
| var inputTypes = setupInputTypes(); | ||||
| 
 | ||||
| /// Formats input params to bytes
 | ||||
| /// @param contract json abi
 | ||||
| /// @param name of the method that we want to use
 | ||||
| /// @param array of params that will be formatted to bytes
 | ||||
| /// @returns bytes representation of input params
 | ||||
| var toAbiInput = function (json, methodName, params) { | ||||
|     var bytes = ""; | ||||
| 
 | ||||
|     var method = getMethodWithName(json, methodName); | ||||
|     var padding = ETH_PADDING * 2; | ||||
| 
 | ||||
|     /// first we iterate in search for dynamic 
 | ||||
|     method.inputs.forEach(function (input, index) { | ||||
|         bytes += dynamicTypeBytes(input.type, params[index]); | ||||
|     }); | ||||
| 
 | ||||
|     method.inputs.forEach(function (input, i) { | ||||
|         var typeMatch = false; | ||||
|         for (var j = 0; j < inputTypes.length && !typeMatch; j++) { | ||||
|             typeMatch = inputTypes[j].type(method.inputs[i].type, params[i]); | ||||
|         } | ||||
|         if (!typeMatch) { | ||||
|             console.error('input parser does not support type: ' + method.inputs[i].type); | ||||
|         } | ||||
| 
 | ||||
|         var formatter = inputTypes[j - 1].format; | ||||
|         var toAppend = ""; | ||||
| 
 | ||||
|         if (arrayType(method.inputs[i].type)) | ||||
|             toAppend = params[i].reduce(function (acc, curr) { | ||||
|                 return acc + formatter(curr); | ||||
|             }, ""); | ||||
|         else | ||||
|             toAppend = formatter(params[i]); | ||||
| 
 | ||||
|         bytes += toAppend;  | ||||
|     }); | ||||
|     return bytes; | ||||
| }; | ||||
| 
 | ||||
| /// Check if input value is negative
 | ||||
| /// @param value is hex format
 | ||||
| /// @returns true if it is negative, otherwise false
 | ||||
| var signedIsNegative = function (value) { | ||||
|     return (new BigNumber(value.substr(0, 1), 16).toString(2).substr(0, 1)) === '1'; | ||||
| }; | ||||
| 
 | ||||
| /// Formats input right-aligned input bytes to int
 | ||||
| /// @returns right-aligned input bytes formatted to int
 | ||||
| var formatOutputInt = function (value) { | ||||
|     value = value || "0"; | ||||
|     // check if it's negative number
 | ||||
|     // it it is, return two's complement
 | ||||
|     if (signedIsNegative(value)) { | ||||
|         return new BigNumber(value, 16).minus(new BigNumber('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 16)).minus(1); | ||||
|     } | ||||
|     return new BigNumber(value, 16); | ||||
| }; | ||||
| 
 | ||||
| /// Formats big right-aligned input bytes to uint
 | ||||
| /// @returns right-aligned input bytes formatted to uint
 | ||||
| var formatOutputUInt = function (value) { | ||||
|     value = value || "0"; | ||||
|     return new BigNumber(value, 16); | ||||
| }; | ||||
| 
 | ||||
| /// @returns input bytes formatted to real
 | ||||
| var formatOutputReal = function (value) { | ||||
|     return formatOutputInt(value).dividedBy(new BigNumber(2).pow(128));  | ||||
| }; | ||||
| 
 | ||||
| /// @returns input bytes formatted to ureal
 | ||||
| var formatOutputUReal = function (value) { | ||||
|     return formatOutputUInt(value).dividedBy(new BigNumber(2).pow(128));  | ||||
| }; | ||||
| 
 | ||||
| /// @returns right-aligned input bytes formatted to hex
 | ||||
| var formatOutputHash = function (value) { | ||||
|     return "0x" + value; | ||||
| }; | ||||
| 
 | ||||
| /// @returns right-aligned input bytes formatted to bool
 | ||||
| var formatOutputBool = function (value) { | ||||
|     return value === '0000000000000000000000000000000000000000000000000000000000000001' ? true : false; | ||||
| }; | ||||
| 
 | ||||
| /// @returns left-aligned input bytes formatted to ascii string
 | ||||
| var formatOutputString = function (value) { | ||||
|     return web3.toAscii(value); | ||||
| }; | ||||
| 
 | ||||
| /// @returns right-aligned input bytes formatted to address
 | ||||
| var formatOutputAddress = function (value) { | ||||
|     return "0x" + value.slice(value.length - 40, value.length); | ||||
| }; | ||||
| 
 | ||||
| var dynamicBytesLength = function (type) { | ||||
|     if (arrayType(type) || type === 'string')   // only string itself that is dynamic; stringX is static length.
 | ||||
|         return ETH_PADDING * 2; | ||||
|     return 0; | ||||
| }; | ||||
| 
 | ||||
| /// Setups output formaters for solidity types
 | ||||
| /// @returns an array of output formatters
 | ||||
| var setupOutputTypes = function () { | ||||
| 
 | ||||
|     return [ | ||||
|         { type: prefixedType('uint'), format: formatOutputUInt }, | ||||
|         { type: prefixedType('int'), format: formatOutputInt }, | ||||
|         { type: prefixedType('hash'), format: formatOutputHash }, | ||||
|         { type: prefixedType('string'), format: formatOutputString }, | ||||
|         { type: prefixedType('real'), format: formatOutputReal }, | ||||
|         { type: prefixedType('ureal'), format: formatOutputUReal }, | ||||
|         { type: namedType('address'), format: formatOutputAddress }, | ||||
|         { type: namedType('bool'), format: formatOutputBool } | ||||
|     ]; | ||||
| }; | ||||
| 
 | ||||
| var outputTypes = setupOutputTypes(); | ||||
| 
 | ||||
| /// Formats output bytes back to param list
 | ||||
| /// @param contract json abi
 | ||||
| /// @param name of the method that we want to use
 | ||||
| /// @param bytes representtion of output 
 | ||||
| /// @returns array of output params 
 | ||||
| var fromAbiOutput = function (json, methodName, output) { | ||||
|      | ||||
|     output = output.slice(2); | ||||
|     var result = []; | ||||
|     var method = getMethodWithName(json, methodName); | ||||
|     var padding = ETH_PADDING * 2; | ||||
| 
 | ||||
|     var dynamicPartLength = method.outputs.reduce(function (acc, curr) { | ||||
|         return acc + dynamicBytesLength(curr.type); | ||||
|     }, 0); | ||||
|      | ||||
|     var dynamicPart = output.slice(0, dynamicPartLength); | ||||
|     output = output.slice(dynamicPartLength); | ||||
| 
 | ||||
|     method.outputs.forEach(function (out, i) { | ||||
|         var typeMatch = false; | ||||
|         for (var j = 0; j < outputTypes.length && !typeMatch; j++) { | ||||
|             typeMatch = outputTypes[j].type(method.outputs[i].type); | ||||
|         } | ||||
| 
 | ||||
|         if (!typeMatch) { | ||||
|             console.error('output parser does not support type: ' + method.outputs[i].type); | ||||
|         } | ||||
| 
 | ||||
|         var formatter = outputTypes[j - 1].format; | ||||
|         if (arrayType(method.outputs[i].type)) { | ||||
|             var size = formatOutputUInt(dynamicPart.slice(0, padding)); | ||||
|             dynamicPart = dynamicPart.slice(padding); | ||||
|             var array = []; | ||||
|             for (var k = 0; k < size; k++) { | ||||
|                 array.push(formatter(output.slice(0, padding)));  | ||||
|                 output = output.slice(padding); | ||||
|             } | ||||
|             result.push(array); | ||||
|         } | ||||
|         else if (prefixedType('string')(method.outputs[i].type)) { | ||||
|             dynamicPart = dynamicPart.slice(padding);  | ||||
|             result.push(formatter(output.slice(0, padding))); | ||||
|             output = output.slice(padding); | ||||
|         } else { | ||||
|             result.push(formatter(output.slice(0, padding))); | ||||
|             output = output.slice(padding); | ||||
|         } | ||||
|     }); | ||||
| 
 | ||||
|     return result; | ||||
| }; | ||||
| 
 | ||||
| /// @returns display name for method eg. multiply(uint256) -> multiply
 | ||||
| var methodDisplayName = function (method) { | ||||
|     var length = method.indexOf('(');  | ||||
|     return length !== -1 ? method.substr(0, length) : method; | ||||
| }; | ||||
| 
 | ||||
| /// @returns overloaded part of method's name
 | ||||
| var methodTypeName = function (method) { | ||||
|     /// TODO: make it not vulnerable
 | ||||
|     var length = method.indexOf('('); | ||||
|     return length !== -1 ? method.substr(length + 1, method.length - 1 - (length + 1)) : ""; | ||||
| }; | ||||
| 
 | ||||
| /// @param json abi for contract
 | ||||
| /// @returns input parser object for given json abi
 | ||||
| var inputParser = function (json) { | ||||
|     var parser = {}; | ||||
|     json.forEach(function (method) { | ||||
|         var displayName = methodDisplayName(method.name);  | ||||
|         var typeName = methodTypeName(method.name); | ||||
| 
 | ||||
|         var impl = function () { | ||||
|             var params = Array.prototype.slice.call(arguments); | ||||
|             return toAbiInput(json, method.name, params); | ||||
|         }; | ||||
|         | ||||
|         if (parser[displayName] === undefined) { | ||||
|             parser[displayName] = impl; | ||||
|         } | ||||
| 
 | ||||
|         parser[displayName][typeName] = impl; | ||||
|     }); | ||||
| 
 | ||||
|     return parser; | ||||
| }; | ||||
| 
 | ||||
| /// @param json abi for contract
 | ||||
| /// @returns output parser for given json abi
 | ||||
| var outputParser = function (json) { | ||||
|     var parser = {}; | ||||
|     json.forEach(function (method) { | ||||
| 
 | ||||
|         var displayName = methodDisplayName(method.name);  | ||||
|         var typeName = methodTypeName(method.name); | ||||
| 
 | ||||
|         var impl = function (output) { | ||||
|             return fromAbiOutput(json, method.name, output); | ||||
|         }; | ||||
| 
 | ||||
|         if (parser[displayName] === undefined) { | ||||
|             parser[displayName] = impl; | ||||
|         } | ||||
| 
 | ||||
|         parser[displayName][typeName] = impl; | ||||
|     }); | ||||
| 
 | ||||
|     return parser; | ||||
| }; | ||||
| 
 | ||||
| /// @param method name for which we want to get method signature
 | ||||
| /// @returns (promise) contract method signature for method with given name
 | ||||
| var methodSignature = function (name) { | ||||
|     return web3.sha3(web3.fromAscii(name)).slice(0, 2 + ETH_METHOD_SIGNATURE_LENGTH * 2); | ||||
| }; | ||||
| 
 | ||||
| module.exports = { | ||||
|     inputParser: inputParser, | ||||
|     outputParser: outputParser, | ||||
|     methodSignature: methodSignature, | ||||
|     methodDisplayName: methodDisplayName, | ||||
|     methodTypeName: methodTypeName, | ||||
|     getMethodWithName: getMethodWithName | ||||
| }; | ||||
| 
 | ||||
| @ -1,145 +0,0 @@ | ||||
| /* | ||||
|     This file is part of ethereum.js. | ||||
| 
 | ||||
|     ethereum.js is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU Lesser General Public License as published by | ||||
|     the Free Software Foundation, either version 3 of the License, or | ||||
|     (at your option) any later version. | ||||
| 
 | ||||
|     ethereum.js is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU Lesser General Public License for more details. | ||||
| 
 | ||||
|     You should have received a copy of the GNU Lesser General Public License | ||||
|     along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| */ | ||||
| /** @file contract.js | ||||
|  * @authors: | ||||
|  *   Marek Kotewicz <marek@ethdev.com> | ||||
|  * @date 2014 | ||||
|  */ | ||||
| 
 | ||||
| var web3 = require('./web3'); // jshint ignore:line
 | ||||
| var abi = require('./abi'); | ||||
| 
 | ||||
| /** | ||||
|  * This method should be called when we want to call / transact some solidity method from javascript | ||||
|  * it returns an object which has same methods available as solidity contract description | ||||
|  * usage example:  | ||||
|  * | ||||
|  * var abi = [{ | ||||
|  *      name: 'myMethod', | ||||
|  *      inputs: [{ name: 'a', type: 'string' }], | ||||
|  *      outputs: [{name: 'd', type: 'string' }] | ||||
|  * }];  // contract abi
 | ||||
|  * | ||||
|  * var myContract = web3.eth.contract('0x0123123121', abi); // creation of contract object
 | ||||
|  * | ||||
|  * myContract.myMethod('this is test string param for call'); // myMethod call (implicit, default)
 | ||||
|  * myContract.call().myMethod('this is test string param for call'); // myMethod call (explicit)
 | ||||
|  * myContract.transact().myMethod('this is test string param for transact'); // myMethod transact
 | ||||
|  * | ||||
|  * @param address - address of the contract, which should be called | ||||
|  * @param desc - abi json description of the contract, which is being created | ||||
|  * @returns contract object | ||||
|  */ | ||||
| 
 | ||||
| var contract = function (address, desc) { | ||||
| 
 | ||||
|     desc.forEach(function (method) { | ||||
|         // workaround for invalid assumption that method.name is the full anonymous prototype of the method.
 | ||||
|         // it's not. it's just the name. the rest of the code assumes it's actually the anonymous
 | ||||
|         // prototype, so we make it so as a workaround.
 | ||||
|         if (method.name.indexOf('(') === -1) { | ||||
|             var displayName = method.name; | ||||
|             var typeName = method.inputs.map(function(i){return i.type; }).join(); | ||||
|             method.name = displayName + '(' + typeName + ')'; | ||||
|         } | ||||
|     }); | ||||
| 
 | ||||
|     var inputParser = abi.inputParser(desc); | ||||
|     var outputParser = abi.outputParser(desc); | ||||
| 
 | ||||
|     var result = {}; | ||||
| 
 | ||||
|     result.call = function (options) { | ||||
|         result._isTransact = false; | ||||
|         result._options = options; | ||||
|         return result; | ||||
|     }; | ||||
| 
 | ||||
|     result.transact = function (options) { | ||||
|         result._isTransact = true; | ||||
|         result._options = options; | ||||
|         return result; | ||||
|     }; | ||||
| 
 | ||||
|     result._options = {}; | ||||
|     ['gas', 'gasPrice', 'value', 'from'].forEach(function(p) { | ||||
|         result[p] = function (v) { | ||||
|             result._options[p] = v; | ||||
|             return result; | ||||
|         }; | ||||
|     }); | ||||
| 
 | ||||
| 
 | ||||
|     desc.forEach(function (method) { | ||||
| 
 | ||||
|         var displayName = abi.methodDisplayName(method.name); | ||||
|         var typeName = abi.methodTypeName(method.name); | ||||
| 
 | ||||
|         var impl = function () { | ||||
|             var params = Array.prototype.slice.call(arguments); | ||||
|             var signature = abi.methodSignature(method.name); | ||||
|             var parsed = inputParser[displayName][typeName].apply(null, params); | ||||
| 
 | ||||
|             var options = result._options || {}; | ||||
|             options.to = address; | ||||
|             options.data = signature + parsed; | ||||
|              | ||||
|             var isTransact = result._isTransact === true || (result._isTransact !== false && !method.constant); | ||||
|             var collapse = options.collapse !== false; | ||||
|              | ||||
|             // reset
 | ||||
|             result._options = {}; | ||||
|             result._isTransact = null; | ||||
| 
 | ||||
|             if (isTransact) { | ||||
|                 // it's used byt natspec.js
 | ||||
|                 // TODO: figure out better way to solve this
 | ||||
|                 web3._currentContractAbi = desc; | ||||
|                 web3._currentContractAddress = address; | ||||
|                 web3._currentContractMethodName = method.name; | ||||
|                 web3._currentContractMethodParams = params; | ||||
| 
 | ||||
|                 // transactions do not have any output, cause we do not know, when they will be processed
 | ||||
|                 web3.eth.transact(options); | ||||
|                 return; | ||||
|             } | ||||
|              | ||||
|             var output = web3.eth.call(options); | ||||
|             var ret = outputParser[displayName][typeName](output); | ||||
|             if (collapse) | ||||
|             { | ||||
|                 if (ret.length === 1) | ||||
|                     ret = ret[0]; | ||||
|                 else if (ret.length === 0) | ||||
|                     ret = null; | ||||
|             } | ||||
|             return ret; | ||||
|         }; | ||||
| 
 | ||||
|         if (result[displayName] === undefined) { | ||||
|             result[displayName] = impl; | ||||
|         } | ||||
| 
 | ||||
|         result[displayName][typeName] = impl; | ||||
| 
 | ||||
|     }); | ||||
| 
 | ||||
|     return result; | ||||
| }; | ||||
| 
 | ||||
| module.exports = contract; | ||||
| 
 | ||||
| @ -1,73 +0,0 @@ | ||||
| /* | ||||
|     This file is part of ethereum.js. | ||||
| 
 | ||||
|     ethereum.js is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU Lesser General Public License as published by | ||||
|     the Free Software Foundation, either version 3 of the License, or | ||||
|     (at your option) any later version. | ||||
| 
 | ||||
|     ethereum.js is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU Lesser General Public License for more details. | ||||
| 
 | ||||
|     You should have received a copy of the GNU Lesser General Public License | ||||
|     along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| */ | ||||
| /** @file filter.js | ||||
|  * @authors: | ||||
|  *   Jeffrey Wilcke <jeff@ethdev.com> | ||||
|  *   Marek Kotewicz <marek@ethdev.com> | ||||
|  *   Marian Oancea <marian@ethdev.com> | ||||
|  *   Gav Wood <g@ethdev.com> | ||||
|  * @date 2014 | ||||
|  */ | ||||
| 
 | ||||
| var web3 = require('./web3'); // jshint ignore:line
 | ||||
| 
 | ||||
| /// should be used when we want to watch something
 | ||||
| /// it's using inner polling mechanism and is notified about changes
 | ||||
| var Filter = function(options, impl) { | ||||
|     this.impl = impl; | ||||
|     this.callbacks = []; | ||||
| 
 | ||||
|     this.id = impl.newFilter(options); | ||||
|     web3.provider.startPolling({call: impl.changed, args: [this.id]}, this.id, this.trigger.bind(this)); | ||||
| }; | ||||
| 
 | ||||
| /// alias for changed*
 | ||||
| Filter.prototype.arrived = function(callback) { | ||||
|     this.changed(callback); | ||||
| }; | ||||
| 
 | ||||
| /// gets called when there is new eth/shh message
 | ||||
| Filter.prototype.changed = function(callback) { | ||||
|     this.callbacks.push(callback); | ||||
| }; | ||||
| 
 | ||||
| /// trigger calling new message from people
 | ||||
| Filter.prototype.trigger = function(messages) { | ||||
|     for (var i = 0; i < this.callbacks.length; i++) { | ||||
|         for (var j = 0; j < messages.length; j++) { | ||||
|             this.callbacks[i].call(this, messages[j]); | ||||
|         } | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| /// should be called to uninstall current filter
 | ||||
| Filter.prototype.uninstall = function() { | ||||
|     this.impl.uninstallFilter(this.id); | ||||
|     web3.provider.stopPolling(this.id); | ||||
| }; | ||||
| 
 | ||||
| /// should be called to manually trigger getting latest messages from the client
 | ||||
| Filter.prototype.messages = function() { | ||||
|     return this.impl.getMessages(this.id); | ||||
| }; | ||||
| 
 | ||||
| /// alias for messages
 | ||||
| Filter.prototype.logs = function () { | ||||
|     return this.messages(); | ||||
| }; | ||||
| 
 | ||||
| module.exports = Filter; | ||||
| @ -1,70 +0,0 @@ | ||||
| /* | ||||
|     This file is part of ethereum.js. | ||||
| 
 | ||||
|     ethereum.js is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU Lesser General Public License as published by | ||||
|     the Free Software Foundation, either version 3 of the License, or | ||||
|     (at your option) any later version. | ||||
| 
 | ||||
|     ethereum.js is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU Lesser General Public License for more details. | ||||
| 
 | ||||
|     You should have received a copy of the GNU Lesser General Public License | ||||
|     along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| */ | ||||
| /** @file httpsync.js | ||||
|  * @authors: | ||||
|  *   Marek Kotewicz <marek@ethdev.com> | ||||
|  *   Marian Oancea <marian@ethdev.com> | ||||
|  * @date 2014 | ||||
|  */ | ||||
| 
 | ||||
| if (process.env.NODE_ENV !== 'build') { | ||||
|         var XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; // jshint ignore:line
 | ||||
| } | ||||
| 
 | ||||
| var HttpSyncProvider = function (host) { | ||||
|     this.handlers = []; | ||||
|     this.host = host || 'http://localhost:8080'; | ||||
| }; | ||||
| 
 | ||||
| /// Transforms inner message to proper jsonrpc object
 | ||||
| /// @param inner message object
 | ||||
| /// @returns jsonrpc object
 | ||||
| function formatJsonRpcObject(object) { | ||||
|     return { | ||||
|         jsonrpc: '2.0', | ||||
|         method: object.call, | ||||
|         params: object.args, | ||||
|         id: object._id | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| /// Transforms jsonrpc object to inner message
 | ||||
| /// @param incoming jsonrpc message 
 | ||||
| /// @returns inner message object
 | ||||
| function formatJsonRpcMessage(message) { | ||||
|     var object = JSON.parse(message); | ||||
| 
 | ||||
|     return { | ||||
|         _id: object.id, | ||||
|         data: object.result, | ||||
|         error: object.error | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| HttpSyncProvider.prototype.send = function (payload) { | ||||
|     var data = formatJsonRpcObject(payload); | ||||
|      | ||||
|     var request = new XMLHttpRequest(); | ||||
|     request.open('POST', this.host, false); | ||||
|     request.send(JSON.stringify(data)); | ||||
|      | ||||
|     // check request.status
 | ||||
|     return request.responseText; | ||||
| }; | ||||
| 
 | ||||
| module.exports = HttpSyncProvider; | ||||
| 
 | ||||
| @ -1,18 +0,0 @@ | ||||
| var addressName = {"0x12378912345789": "Gav", "0x57835893478594739854": "Jeff"}; | ||||
| var nameAddress = {}; | ||||
| 
 | ||||
| for (var prop in addressName) { | ||||
|   if (addressName.hasOwnProperty(prop)) { | ||||
|     nameAddress[addressName[prop]]  = prop; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| var local = { | ||||
|   addressBook:{ | ||||
|     byName: addressName, | ||||
|     byAddress: nameAddress | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| if (typeof(module) !== "undefined") | ||||
|     module.exports = local; | ||||
| @ -1,110 +0,0 @@ | ||||
| /* | ||||
|     This file is part of ethereum.js. | ||||
| 
 | ||||
|     ethereum.js is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU Lesser General Public License as published by | ||||
|     the Free Software Foundation, either version 3 of the License, or | ||||
|     (at your option) any later version. | ||||
| 
 | ||||
|     ethereum.js is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU Lesser General Public License for more details. | ||||
| 
 | ||||
|     You should have received a copy of the GNU Lesser General Public License | ||||
|     along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| */ | ||||
| /** @file providermanager.js | ||||
|  * @authors: | ||||
|  *   Jeffrey Wilcke <jeff@ethdev.com> | ||||
|  *   Marek Kotewicz <marek@ethdev.com> | ||||
|  *   Marian Oancea <marian@ethdev.com> | ||||
|  *   Gav Wood <g@ethdev.com> | ||||
|  * @date 2014 | ||||
|  */ | ||||
| 
 | ||||
| var web3 = require('./web3'); // jshint ignore:line
 | ||||
| 
 | ||||
| /** | ||||
|  * Provider manager object prototype | ||||
|  * It's responsible for passing messages to providers | ||||
|  * If no provider is set it's responsible for queuing requests | ||||
|  * It's also responsible for polling the ethereum node for incoming messages | ||||
|  * Default poll timeout is 12 seconds | ||||
|  * If we are running ethereum.js inside ethereum browser, there are backend based tools responsible for polling, | ||||
|  * and provider manager polling mechanism is not used | ||||
|  */ | ||||
| var ProviderManager = function() { | ||||
|     this.polls = []; | ||||
|     this.provider = undefined; | ||||
|     this.id = 1; | ||||
| 
 | ||||
|     var self = this; | ||||
|     var poll = function () { | ||||
|         if (self.provider) { | ||||
|             self.polls.forEach(function (data) { | ||||
|                 data.data._id = self.id; | ||||
|                 self.id++; | ||||
|                 var result = self.provider.send(data.data); | ||||
|              | ||||
|                 result = JSON.parse(result); | ||||
|                  | ||||
|                 // dont call the callback if result is not an array, or empty one
 | ||||
|                 if (result.error || !(result.result instanceof Array) || result.result.length === 0) { | ||||
|                     return; | ||||
|                 } | ||||
| 
 | ||||
|                 data.callback(result.result); | ||||
|             }); | ||||
|         } | ||||
|         setTimeout(poll, 1000); | ||||
|     }; | ||||
|     poll(); | ||||
| }; | ||||
| 
 | ||||
| /// sends outgoing requests
 | ||||
| ProviderManager.prototype.send = function(data) { | ||||
| 
 | ||||
|     data.args = data.args || []; | ||||
|     data._id = this.id++; | ||||
| 
 | ||||
|     if (this.provider === undefined) { | ||||
|         console.error('provider is not set'); | ||||
|         return null;  | ||||
|     } | ||||
| 
 | ||||
|     //TODO: handle error here? 
 | ||||
|     var result = this.provider.send(data); | ||||
|     result = JSON.parse(result); | ||||
| 
 | ||||
|     if (result.error) { | ||||
|         console.log(result.error); | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     return result.result; | ||||
| }; | ||||
| 
 | ||||
| /// setups provider, which will be used for sending messages
 | ||||
| ProviderManager.prototype.set = function(provider) { | ||||
|     this.provider = provider; | ||||
| }; | ||||
| 
 | ||||
| /// this method is only used, when we do not have native qt bindings and have to do polling on our own
 | ||||
| /// should be callled, on start watching for eth/shh changes
 | ||||
| ProviderManager.prototype.startPolling = function (data, pollId, callback) { | ||||
|     this.polls.push({data: data, id: pollId, callback: callback}); | ||||
| }; | ||||
| 
 | ||||
| /// should be called to stop polling for certain watch changes
 | ||||
| ProviderManager.prototype.stopPolling = function (pollId) { | ||||
|     for (var i = this.polls.length; i--;) { | ||||
|         var poll = this.polls[i]; | ||||
|         if (poll.id === pollId) { | ||||
|             this.polls.splice(i, 1); | ||||
|         } | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| module.exports = ProviderManager; | ||||
| 
 | ||||
| @ -1,32 +0,0 @@ | ||||
| /* | ||||
|     This file is part of ethereum.js. | ||||
| 
 | ||||
|     ethereum.js is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU Lesser General Public License as published by | ||||
|     the Free Software Foundation, either version 3 of the License, or | ||||
|     (at your option) any later version. | ||||
| 
 | ||||
|     ethereum.js is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU Lesser General Public License for more details. | ||||
| 
 | ||||
|     You should have received a copy of the GNU Lesser General Public License | ||||
|     along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| */ | ||||
| /** @file qtsync.js | ||||
|  * @authors: | ||||
|  *   Marek Kotewicz <marek@ethdev.com> | ||||
|  *   Marian Oancea <marian@ethdev.com> | ||||
|  * @date 2014 | ||||
|  */ | ||||
| 
 | ||||
| var QtSyncProvider = function () { | ||||
| }; | ||||
| 
 | ||||
| QtSyncProvider.prototype.send = function (payload) { | ||||
|     return navigator.qt.callMethod(JSON.stringify(payload)); | ||||
| }; | ||||
| 
 | ||||
| module.exports = QtSyncProvider; | ||||
| 
 | ||||
| @ -1,327 +0,0 @@ | ||||
| /* | ||||
|     This file is part of ethereum.js. | ||||
| 
 | ||||
|     ethereum.js is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU Lesser General Public License as published by | ||||
|     the Free Software Foundation, either version 3 of the License, or | ||||
|     (at your option) any later version. | ||||
| 
 | ||||
|     ethereum.js is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU Lesser General Public License for more details. | ||||
| 
 | ||||
|     You should have received a copy of the GNU Lesser General Public License | ||||
|     along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| */ | ||||
| /** @file web3.js | ||||
|  * @authors: | ||||
|  *   Jeffrey Wilcke <jeff@ethdev.com> | ||||
|  *   Marek Kotewicz <marek@ethdev.com> | ||||
|  *   Marian Oancea <marian@ethdev.com> | ||||
|  *   Gav Wood <g@ethdev.com> | ||||
|  * @date 2014 | ||||
|  */ | ||||
| 
 | ||||
| if (process.env.NODE_ENV !== 'build') { | ||||
|     var BigNumber = require('bignumber.js'); | ||||
| } | ||||
| 
 | ||||
| var ETH_UNITS = [  | ||||
|     'wei',  | ||||
|     'Kwei',  | ||||
|     'Mwei',  | ||||
|     'Gwei',  | ||||
|     'szabo',  | ||||
|     'finney',  | ||||
|     'ether',  | ||||
|     'grand',  | ||||
|     'Mether',  | ||||
|     'Gether',  | ||||
|     'Tether',  | ||||
|     'Pether',  | ||||
|     'Eether',  | ||||
|     'Zether',  | ||||
|     'Yether',  | ||||
|     'Nether',  | ||||
|     'Dether',  | ||||
|     'Vether',  | ||||
|     'Uether'  | ||||
| ]; | ||||
| 
 | ||||
| /// @returns an array of objects describing web3 api methods
 | ||||
| var web3Methods = function () { | ||||
|     return [ | ||||
|     { name: 'sha3', call: 'web3_sha3' } | ||||
|     ]; | ||||
| }; | ||||
| 
 | ||||
| /// @returns an array of objects describing web3.eth api methods
 | ||||
| var ethMethods = function () { | ||||
|     var blockCall = function (args) { | ||||
|         return typeof args[0] === "string" ? "eth_blockByHash" : "eth_blockByNumber"; | ||||
|     }; | ||||
| 
 | ||||
|     var transactionCall = function (args) { | ||||
|         return typeof args[0] === "string" ? 'eth_transactionByHash' : 'eth_transactionByNumber'; | ||||
|     }; | ||||
| 
 | ||||
|     var uncleCall = function (args) { | ||||
|         return typeof args[0] === "string" ? 'eth_uncleByHash' : 'eth_uncleByNumber'; | ||||
|     }; | ||||
| 
 | ||||
|     var methods = [ | ||||
|     { name: 'balanceAt', call: 'eth_balanceAt' }, | ||||
|     { name: 'stateAt', call: 'eth_stateAt' }, | ||||
|     { name: 'storageAt', call: 'eth_storageAt' }, | ||||
|     { name: 'countAt', call: 'eth_countAt'}, | ||||
|     { name: 'codeAt', call: 'eth_codeAt' }, | ||||
|     { name: 'transact', call: 'eth_transact' }, | ||||
|     { name: 'call', call: 'eth_call' }, | ||||
|     { name: 'block', call: blockCall }, | ||||
|     { name: 'transaction', call: transactionCall }, | ||||
|     { name: 'uncle', call: uncleCall }, | ||||
|     { name: 'compilers', call: 'eth_compilers' }, | ||||
|     { name: 'flush', call: 'eth_flush' }, | ||||
|     { name: 'lll', call: 'eth_lll' }, | ||||
|     { name: 'solidity', call: 'eth_solidity' }, | ||||
|     { name: 'serpent', call: 'eth_serpent' }, | ||||
|     { name: 'logs', call: 'eth_logs' } | ||||
|     ]; | ||||
|     return methods; | ||||
| }; | ||||
| 
 | ||||
| /// @returns an array of objects describing web3.eth api properties
 | ||||
| var ethProperties = function () { | ||||
|     return [ | ||||
|     { name: 'coinbase', getter: 'eth_coinbase', setter: 'eth_setCoinbase' }, | ||||
|     { name: 'listening', getter: 'eth_listening', setter: 'eth_setListening' }, | ||||
|     { name: 'mining', getter: 'eth_mining', setter: 'eth_setMining' }, | ||||
|     { name: 'gasPrice', getter: 'eth_gasPrice' }, | ||||
|     { name: 'accounts', getter: 'eth_accounts' }, | ||||
|     { name: 'peerCount', getter: 'eth_peerCount' }, | ||||
|     { name: 'defaultBlock', getter: 'eth_defaultBlock', setter: 'eth_setDefaultBlock' }, | ||||
|     { name: 'number', getter: 'eth_number'} | ||||
|     ]; | ||||
| }; | ||||
| 
 | ||||
| /// @returns an array of objects describing web3.db api methods
 | ||||
| var dbMethods = function () { | ||||
|     return [ | ||||
|     { name: 'put', call: 'db_put' }, | ||||
|     { name: 'get', call: 'db_get' }, | ||||
|     { name: 'putString', call: 'db_putString' }, | ||||
|     { name: 'getString', call: 'db_getString' } | ||||
|     ]; | ||||
| }; | ||||
| 
 | ||||
| /// @returns an array of objects describing web3.shh api methods
 | ||||
| var shhMethods = function () { | ||||
|     return [ | ||||
|     { name: 'post', call: 'shh_post' }, | ||||
|     { name: 'newIdentity', call: 'shh_newIdentity' }, | ||||
|     { name: 'haveIdentity', call: 'shh_haveIdentity' }, | ||||
|     { name: 'newGroup', call: 'shh_newGroup' }, | ||||
|     { name: 'addToGroup', call: 'shh_addToGroup' } | ||||
|     ]; | ||||
| }; | ||||
| 
 | ||||
| /// @returns an array of objects describing web3.eth.watch api methods
 | ||||
| var ethWatchMethods = function () { | ||||
|     var newFilter = function (args) { | ||||
|         return typeof args[0] === 'string' ? 'eth_newFilterString' : 'eth_newFilter'; | ||||
|     }; | ||||
| 
 | ||||
|     return [ | ||||
|     { name: 'newFilter', call: newFilter }, | ||||
|     { name: 'uninstallFilter', call: 'eth_uninstallFilter' }, | ||||
|     { name: 'getMessages', call: 'eth_filterLogs' } | ||||
|     ]; | ||||
| }; | ||||
| 
 | ||||
| /// @returns an array of objects describing web3.shh.watch api methods
 | ||||
| var shhWatchMethods = function () { | ||||
|     return [ | ||||
|     { name: 'newFilter', call: 'shh_newFilter' }, | ||||
|     { name: 'uninstallFilter', call: 'shh_uninstallFilter' }, | ||||
|     { name: 'getMessages', call: 'shh_getMessages' } | ||||
|     ]; | ||||
| }; | ||||
| 
 | ||||
| /// creates methods in a given object based on method description on input
 | ||||
| /// setups api calls for these methods
 | ||||
| var setupMethods = function (obj, methods) { | ||||
|     methods.forEach(function (method) { | ||||
|         obj[method.name] = function () { | ||||
|             var args = Array.prototype.slice.call(arguments); | ||||
|             var call = typeof method.call === 'function' ? method.call(args) : method.call; | ||||
|             return web3.provider.send({ | ||||
|                 call: call, | ||||
|                 args: args | ||||
|             }); | ||||
|         }; | ||||
|     }); | ||||
| }; | ||||
| 
 | ||||
| /// creates properties in a given object based on properties description on input
 | ||||
| /// setups api calls for these properties
 | ||||
| var setupProperties = function (obj, properties) { | ||||
|     properties.forEach(function (property) { | ||||
|         var proto = {}; | ||||
|         proto.get = function () { | ||||
|             return web3.provider.send({ | ||||
|                 call: property.getter | ||||
|             }); | ||||
|         }; | ||||
| 
 | ||||
|         if (property.setter) { | ||||
|             proto.set = function (val) { | ||||
|                 return web3.provider.send({ | ||||
|                     call: property.setter, | ||||
|                     args: [val] | ||||
|                 }); | ||||
|             }; | ||||
|         } | ||||
|         Object.defineProperty(obj, property.name, proto); | ||||
|     }); | ||||
| }; | ||||
| 
 | ||||
| /// setups web3 object, and it's in-browser executed methods
 | ||||
| var web3 = { | ||||
|     _callbacks: {}, | ||||
|     _events: {}, | ||||
|     providers: {}, | ||||
| 
 | ||||
|     toHex: function(str) { | ||||
|         var hex = ""; | ||||
|         for(var i = 0; i < str.length; i++) { | ||||
|             var n = str.charCodeAt(i).toString(16); | ||||
|             hex += n.length < 2 ? '0' + n : n; | ||||
|         } | ||||
| 
 | ||||
|         return hex; | ||||
|     }, | ||||
| 
 | ||||
|     /// @returns ascii string representation of hex value prefixed with 0x
 | ||||
|     toAscii: function(hex) { | ||||
|         // Find termination
 | ||||
|         var str = ""; | ||||
|         var i = 0, l = hex.length; | ||||
|         if (hex.substring(0, 2) === '0x') | ||||
|             i = 2; | ||||
|         for(; i < l; i+=2) { | ||||
|             var code = parseInt(hex.substr(i, 2), 16); | ||||
|             if(code === 0) { | ||||
|                 break; | ||||
|             } | ||||
| 
 | ||||
|             str += String.fromCharCode(code); | ||||
|         } | ||||
| 
 | ||||
|         return str; | ||||
|     }, | ||||
| 
 | ||||
|     /// @returns hex representation (prefixed by 0x) of ascii string
 | ||||
|     fromAscii: function(str, pad) { | ||||
|         pad = pad === undefined ? 0 : pad; | ||||
|         var hex = this.toHex(str); | ||||
|         while(hex.length < pad*2) | ||||
|             hex += "00"; | ||||
|         return "0x" + hex; | ||||
|     }, | ||||
| 
 | ||||
|     /// @returns decimal representaton of hex value prefixed by 0x
 | ||||
|     toDecimal: function (val) { | ||||
|         // remove 0x and place 0, if it's required
 | ||||
|         val = val.length > 2 ? val.substring(2) : "0"; | ||||
|         return (new BigNumber(val, 16).toString(10)); | ||||
|     }, | ||||
| 
 | ||||
|     /// @returns hex representation (prefixed by 0x) of decimal value
 | ||||
|     fromDecimal: function (val) { | ||||
|         return "0x" + (new BigNumber(val).toString(16)); | ||||
|     }, | ||||
| 
 | ||||
|     /// used to transform value/string to eth string
 | ||||
|     /// TODO: use BigNumber.js to parse int
 | ||||
|     toEth: function(str) { | ||||
|         var val = typeof str === "string" ? str.indexOf('0x') === 0 ? parseInt(str.substr(2), 16) : parseInt(str) : str; | ||||
|         var unit = 0; | ||||
|         var units = ETH_UNITS; | ||||
|         while (val > 3000 && unit < units.length - 1) | ||||
|         { | ||||
|             val /= 1000; | ||||
|             unit++; | ||||
|         } | ||||
|         var s = val.toString().length < val.toFixed(2).length ? val.toString() : val.toFixed(2); | ||||
|         var replaceFunction = function($0, $1, $2) { | ||||
|             return $1 + ',' + $2; | ||||
|         }; | ||||
| 
 | ||||
|         while (true) { | ||||
|             var o = s; | ||||
|             s = s.replace(/(\d)(\d\d\d[\.\,])/, replaceFunction); | ||||
|             if (o === s) | ||||
|                 break; | ||||
|         } | ||||
|         return s + ' ' + units[unit]; | ||||
|     }, | ||||
| 
 | ||||
|     /// eth object prototype
 | ||||
|     eth: { | ||||
|         contractFromAbi: function (abi) { | ||||
|             return function(addr) { | ||||
|                 // Default to address of Config. TODO: rremove prior to genesis.
 | ||||
|                 addr = addr || '0xc6d9d2cd449a754c494264e1809c50e34d64562b'; | ||||
|                 var ret = web3.eth.contract(addr, abi); | ||||
|                 ret.address = addr; | ||||
|                 return ret; | ||||
|             }; | ||||
|         }, | ||||
|         watch: function (params) { | ||||
|             return new web3.filter(params, ethWatch); | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     /// db object prototype
 | ||||
|     db: {}, | ||||
| 
 | ||||
|     /// shh object prototype
 | ||||
|     shh: { | ||||
|         watch: function (params) { | ||||
|             return new web3.filter(params, shhWatch); | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     /// @returns true if provider is installed
 | ||||
|     haveProvider: function() { | ||||
|         return !!web3.provider.provider; | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| /// setups all api methods
 | ||||
| setupMethods(web3, web3Methods()); | ||||
| setupMethods(web3.eth, ethMethods()); | ||||
| setupProperties(web3.eth, ethProperties()); | ||||
| setupMethods(web3.db, dbMethods()); | ||||
| setupMethods(web3.shh, shhMethods()); | ||||
| 
 | ||||
| var ethWatch = { | ||||
|     changed: 'eth_changed' | ||||
| }; | ||||
| 
 | ||||
| setupMethods(ethWatch, ethWatchMethods()); | ||||
| 
 | ||||
| var shhWatch = { | ||||
|     changed: 'shh_changed' | ||||
| }; | ||||
| 
 | ||||
| setupMethods(shhWatch, shhWatchMethods()); | ||||
| 
 | ||||
| web3.setProvider = function(provider) { | ||||
|     //provider.onmessage = messageHandler; // there will be no async calls, to remove
 | ||||
|     web3.provider.set(provider); | ||||
| }; | ||||
| 
 | ||||
| module.exports = web3; | ||||
| 
 | ||||
| @ -1,69 +0,0 @@ | ||||
| { | ||||
|   "name": "ethereum.js", | ||||
|   "namespace": "ethereum", | ||||
|   "version": "0.0.10", | ||||
|   "description": "Ethereum Compatible JavaScript API", | ||||
|   "main": "./index.js", | ||||
|   "directories": { | ||||
|     "lib": "./lib" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "ws": "*", | ||||
|     "xmlhttprequest": "*", | ||||
|     "bignumber.js": ">=2.0.0" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "bower": ">=1.3.0", | ||||
|     "browserify": ">=6.0", | ||||
|     "del": ">=0.1.1", | ||||
|     "envify": "^3.0.0", | ||||
|     "exorcist": "^0.1.6", | ||||
|     "gulp": ">=3.4.0", | ||||
|     "gulp-jshint": ">=1.5.0", | ||||
|     "gulp-rename": ">=1.2.0", | ||||
|     "gulp-uglify": ">=1.0.0", | ||||
|     "jshint": ">=2.5.0", | ||||
|     "uglifyify": "^2.6.0", | ||||
|     "unreachable-branch-transform": "^0.1.0", | ||||
|     "vinyl-source-stream": "^1.0.0", | ||||
|     "mocha": ">=2.1.0" | ||||
|   }, | ||||
|   "scripts": { | ||||
|     "build": "gulp", | ||||
|     "watch": "gulp watch", | ||||
|     "lint": "gulp lint", | ||||
|     "test": "mocha" | ||||
|   }, | ||||
|   "repository": { | ||||
|     "type": "git", | ||||
|     "url": "https://github.com/ethereum/ethereum.js.git" | ||||
|   }, | ||||
|   "homepage": "https://github.com/ethereum/ethereum.js", | ||||
|   "bugs": { | ||||
|     "url": "https://github.com/ethereum/ethereum.js/issues" | ||||
|   }, | ||||
|   "keywords": [ | ||||
|     "ethereum", | ||||
|     "javascript", | ||||
|     "API" | ||||
|   ], | ||||
|   "author": "ethdev.com", | ||||
|   "authors": [ | ||||
|     { | ||||
|       "name": "Jeffery Wilcke", | ||||
|       "email": "jeff@ethdev.com", | ||||
|       "url": "https://github.com/obscuren" | ||||
|     }, | ||||
|     { | ||||
|       "name": "Marek Kotewicz", | ||||
|       "email": "marek@ethdev.com", | ||||
|       "url": "https://github.com/debris" | ||||
|     }, | ||||
|     { | ||||
|       "name": "Marian Oancea", | ||||
|       "email": "marian@ethdev.com", | ||||
|       "url": "https://github.com/cubedro" | ||||
|     } | ||||
|   ], | ||||
|   "license": "LGPL-3.0" | ||||
| } | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -1,30 +0,0 @@ | ||||
| // Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
 | ||||
| //
 | ||||
| // This library is free software; you can redistribute it and/or
 | ||||
| // modify it under the terms of the GNU General Public
 | ||||
| // License as published by the Free Software Foundation; either
 | ||||
| // version 2.1 of the License, or (at your option) any later version.
 | ||||
| //
 | ||||
| // This library is distributed in the hope that it will be useful,
 | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | ||||
| // General Public License for more details.
 | ||||
| //
 | ||||
| // You should have received a copy of the GNU General Public License
 | ||||
| // along with this library; if not, write to the Free Software
 | ||||
| // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 | ||||
| // MA 02110-1301  USA
 | ||||
| 
 | ||||
| function HandleMessage(data) { | ||||
| 	var message; | ||||
| 	try { message = JSON.parse(data) } catch(e) {}; | ||||
| 
 | ||||
| 	if(message) { | ||||
| 		switch(message.type) { | ||||
| 			case "coinbase": | ||||
| 				return eth.coinBase(); | ||||
| 			case "block": | ||||
| 				return eth.blockByNumber(0); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @ -1,38 +0,0 @@ | ||||
| // Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
 | ||||
| //
 | ||||
| // This library is free software; you can redistribute it and/or
 | ||||
| // modify it under the terms of the GNU General Public
 | ||||
| // License as published by the Free Software Foundation; either
 | ||||
| // version 2.1 of the License, or (at your option) any later version.
 | ||||
| //
 | ||||
| // This library is distributed in the hope that it will be useful,
 | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | ||||
| // General Public License for more details.
 | ||||
| //
 | ||||
| // You should have received a copy of the GNU General Public License
 | ||||
| // along with this library; if not, write to the Free Software
 | ||||
| // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 | ||||
| // MA 02110-1301  USA
 | ||||
| 
 | ||||
| window._messagingAdapter = function(data) { | ||||
| 	navigator.qt.postMessage(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) { | ||||
| 				cb.call(this, data.data) | ||||
| 
 | ||||
| 				// Remove the "trigger" callback
 | ||||
| 				delete eth._callbacks[ev._seed]; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @ -1,8 +0,0 @@ | ||||
| (function() { | ||||
|     if (typeof(Promise) === "undefined") | ||||
|         window.Promise = Q.Promise; | ||||
| 
 | ||||
|     var eth = web3.eth; | ||||
| 
 | ||||
|     web3.setProvider(new web3.providers.QtProvider()); | ||||
| })() | ||||
| @ -1,75 +0,0 @@ | ||||
| // Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved.
 | ||||
| //
 | ||||
| // This library is free software; you can redistribute it and/or
 | ||||
| // modify it under the terms of the GNU General Public
 | ||||
| // License as published by the Free Software Foundation; either
 | ||||
| // version 2.1 of the License, or (at your option) any later version.
 | ||||
| //
 | ||||
| // This library is distributed in the hope that it will be useful,
 | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | ||||
| // General Public License for more details.
 | ||||
| //
 | ||||
| // You should have received a copy of the GNU General Public License
 | ||||
| // along with this library; if not, write to the Free Software
 | ||||
| // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 | ||||
| // MA 02110-1301  USA
 | ||||
| 
 | ||||
| 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() | ||||
| } | ||||
| @ -1,44 +0,0 @@ | ||||
| <!doctype> | ||||
| <html> | ||||
| <head> | ||||
| <title>Tests</title> | ||||
| </head> | ||||
| 
 | ||||
| <body> | ||||
| <button onclick="test();">Test me</button> | ||||
| 
 | ||||
| <script type="text/javascript"> | ||||
| function test() { | ||||
| 	var filter = eth.watch({ | ||||
| 		latest: -1, | ||||
| 		from: "e6716f9544a56c530d868e4bfbacb172315bdead", | ||||
| 		altered: ["aabb", {id: "eeff", "at": "aabb"}], | ||||
| 	}); | ||||
| 
 | ||||
| 	filter.changed(function(messages) { | ||||
| 		console.log("messages", messages) | ||||
| 	}) | ||||
| 
 | ||||
| 	filter.getMessages(function(messages) { | ||||
| 			console.log("getMessages", messages) | ||||
| 			}); | ||||
| 
 | ||||
| 	eth.getEachStorageAt("9ef0f0d81e040012600b0c1abdef7c48f720f88a", function(entries) { | ||||
| 			for(var i = 0; i < entries.length; i++) { | ||||
| 				console.log(entries[i].key, " : ", entries[i].value) | ||||
| 			} | ||||
| 	}) | ||||
| 
 | ||||
| 	eth.getBlock("f70097659f329a09642a27f11338d9269de64f1d4485786e36bfc410832148cd", function(block) { | ||||
| 			console.log(block) | ||||
| 	}) | ||||
| 
 | ||||
| 	eth.mutan("var a = 10", function(code) { | ||||
| 			console.log("code", code) | ||||
| 	}); | ||||
| } | ||||
| </script> | ||||
| 
 | ||||
| </body> | ||||
| 
 | ||||
| </html> | ||||
| @ -1,860 +0,0 @@ | ||||
| var assert = require('assert'); | ||||
| var BigNumber = require('bignumber.js'); | ||||
| var abi = require('../lib/abi.js'); | ||||
| var clone = function (object) { return JSON.parse(JSON.stringify(object)); }; | ||||
| 
 | ||||
| var description =  [{ | ||||
|     "name": "test", | ||||
|     "inputs": [{ | ||||
|         "name": "a", | ||||
|         "type": "uint256" | ||||
|     } | ||||
|     ], | ||||
|     "outputs": [ | ||||
|     { | ||||
|         "name": "d", | ||||
|         "type": "uint256" | ||||
|     } | ||||
|     ] | ||||
| }]; | ||||
| 
 | ||||
| describe('abi', function() { | ||||
|     describe('inputParser', function() { | ||||
|         it('should parse input uint', function() { | ||||
| 
 | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].inputs = [ | ||||
|                 { type: "uint" } | ||||
|             ]; | ||||
|              | ||||
|             // when
 | ||||
|             var parser = abi.inputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal(parser.test(1), "0000000000000000000000000000000000000000000000000000000000000001"); | ||||
|             assert.equal(parser.test(10), "000000000000000000000000000000000000000000000000000000000000000a"); | ||||
|             assert.equal( | ||||
|                 parser.test("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),  | ||||
|                 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" | ||||
|                 ); | ||||
|             assert.equal( | ||||
|                 parser.test(new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16)), | ||||
|                 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" | ||||
|                 ); | ||||
|             assert.equal(parser.test(0.1), "0000000000000000000000000000000000000000000000000000000000000000"); | ||||
|             assert.equal(parser.test(3.9), "0000000000000000000000000000000000000000000000000000000000000003"); | ||||
|             assert.equal(parser.test('0.1'), "0000000000000000000000000000000000000000000000000000000000000000"); | ||||
|             assert.equal(parser.test('3.9'), "0000000000000000000000000000000000000000000000000000000000000003"); | ||||
| 
 | ||||
|         }); | ||||
| 
 | ||||
|         it('should parse input uint128', function() { | ||||
| 
 | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].inputs = [ | ||||
|                 { type: "uint128" } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.inputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal(parser.test(1), "0000000000000000000000000000000000000000000000000000000000000001"); | ||||
|             assert.equal(parser.test(10), "000000000000000000000000000000000000000000000000000000000000000a"); | ||||
|             assert.equal( | ||||
|                 parser.test("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),  | ||||
|                 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" | ||||
|                 ); | ||||
|             assert.equal( | ||||
|                 parser.test(new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16)), | ||||
|                 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" | ||||
|                 ); | ||||
|             assert.equal(parser.test(0.1), "0000000000000000000000000000000000000000000000000000000000000000"); | ||||
|             assert.equal(parser.test(3.9), "0000000000000000000000000000000000000000000000000000000000000003"); | ||||
|             assert.equal(parser.test('0.1'), "0000000000000000000000000000000000000000000000000000000000000000"); | ||||
|             assert.equal(parser.test('3.9'), "0000000000000000000000000000000000000000000000000000000000000003"); | ||||
| 
 | ||||
|         }); | ||||
|          | ||||
|         it('should parse input uint256', function() { | ||||
| 
 | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].inputs = [ | ||||
|                 { type: "uint256" } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.inputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal(parser.test(1), "0000000000000000000000000000000000000000000000000000000000000001"); | ||||
|             assert.equal(parser.test(10), "000000000000000000000000000000000000000000000000000000000000000a"); | ||||
|             assert.equal( | ||||
|                 parser.test("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),  | ||||
|                 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" | ||||
|                 ); | ||||
|             assert.equal( | ||||
|                 parser.test(new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16)), | ||||
|                 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" | ||||
|                 ); | ||||
|             assert.equal(parser.test(0.1), "0000000000000000000000000000000000000000000000000000000000000000"); | ||||
|             assert.equal(parser.test(3.9), "0000000000000000000000000000000000000000000000000000000000000003"); | ||||
|             assert.equal(parser.test('0.1'), "0000000000000000000000000000000000000000000000000000000000000000"); | ||||
|             assert.equal(parser.test('3.9'), "0000000000000000000000000000000000000000000000000000000000000003"); | ||||
|              | ||||
|         }); | ||||
| 
 | ||||
|         it('should parse input int', function() { | ||||
| 
 | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].inputs = [ | ||||
|                 { type: "int" } | ||||
|             ]; | ||||
|              | ||||
|             // when
 | ||||
|             var parser = abi.inputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal(parser.test(1), "0000000000000000000000000000000000000000000000000000000000000001"); | ||||
|             assert.equal(parser.test(10), "000000000000000000000000000000000000000000000000000000000000000a"); | ||||
|             assert.equal(parser.test(-1), "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); | ||||
|             assert.equal(parser.test(-2), "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"); | ||||
|             assert.equal(parser.test(-16), "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0"); | ||||
|             assert.equal( | ||||
|                 parser.test("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),  | ||||
|                 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" | ||||
|                 ); | ||||
|             assert.equal( | ||||
|                 parser.test(new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16)), | ||||
|                 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" | ||||
|                 ); | ||||
|             assert.equal(parser.test(0.1), "0000000000000000000000000000000000000000000000000000000000000000"); | ||||
|             assert.equal(parser.test(3.9), "0000000000000000000000000000000000000000000000000000000000000003"); | ||||
|             assert.equal(parser.test('0.1'), "0000000000000000000000000000000000000000000000000000000000000000"); | ||||
|             assert.equal(parser.test('3.9'), "0000000000000000000000000000000000000000000000000000000000000003"); | ||||
|         }); | ||||
| 
 | ||||
|         it('should parse input int128', function() { | ||||
| 
 | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].inputs = [ | ||||
|                 { type: "int128" } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.inputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal(parser.test(1), "0000000000000000000000000000000000000000000000000000000000000001"); | ||||
|             assert.equal(parser.test(10), "000000000000000000000000000000000000000000000000000000000000000a"); | ||||
|             assert.equal(parser.test(-1), "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); | ||||
|             assert.equal(parser.test(-2), "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"); | ||||
|             assert.equal(parser.test(-16), "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0"); | ||||
|             assert.equal( | ||||
|                 parser.test("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),  | ||||
|                 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" | ||||
|                 ); | ||||
|             assert.equal( | ||||
|                 parser.test(new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16)), | ||||
|                 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" | ||||
|                 ); | ||||
|             assert.equal(parser.test(0.1), "0000000000000000000000000000000000000000000000000000000000000000"); | ||||
|             assert.equal(parser.test(3.9), "0000000000000000000000000000000000000000000000000000000000000003"); | ||||
|             assert.equal(parser.test('0.1'), "0000000000000000000000000000000000000000000000000000000000000000"); | ||||
|             assert.equal(parser.test('3.9'), "0000000000000000000000000000000000000000000000000000000000000003"); | ||||
| 
 | ||||
|         }); | ||||
| 
 | ||||
|         it('should parse input int256', function() { | ||||
|          | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].inputs = [ | ||||
|                 { type: "int256" } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.inputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal(parser.test(1), "0000000000000000000000000000000000000000000000000000000000000001"); | ||||
|             assert.equal(parser.test(10), "000000000000000000000000000000000000000000000000000000000000000a"); | ||||
|             assert.equal(parser.test(-1), "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); | ||||
|             assert.equal(parser.test(-2), "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"); | ||||
|             assert.equal(parser.test(-16), "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0"); | ||||
|             assert.equal( | ||||
|                 parser.test("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),  | ||||
|                 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" | ||||
|                 ); | ||||
|             assert.equal( | ||||
|                 parser.test(new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16)), | ||||
|                 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" | ||||
|                 ); | ||||
|             assert.equal(parser.test(0.1), "0000000000000000000000000000000000000000000000000000000000000000"); | ||||
|             assert.equal(parser.test(3.9), "0000000000000000000000000000000000000000000000000000000000000003"); | ||||
|             assert.equal(parser.test('0.1'), "0000000000000000000000000000000000000000000000000000000000000000"); | ||||
|             assert.equal(parser.test('3.9'), "0000000000000000000000000000000000000000000000000000000000000003"); | ||||
|              | ||||
|         }); | ||||
| 
 | ||||
|         it('should parse input bool', function() { | ||||
|              | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].inputs = [ | ||||
|                 { type: 'bool' } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.inputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal(parser.test(true), "0000000000000000000000000000000000000000000000000000000000000001"); | ||||
|             assert.equal(parser.test(false), "0000000000000000000000000000000000000000000000000000000000000000"); | ||||
| 
 | ||||
|         }); | ||||
| 
 | ||||
|         it('should parse input hash', function() { | ||||
| 
 | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].inputs = [ | ||||
|                 { type: "hash" } | ||||
|             ]; | ||||
|              | ||||
|             // when
 | ||||
|             var parser = abi.inputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal(parser.test("0x407d73d8a49eeb85d32cf465507dd71d507100c1"), "000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1"); | ||||
| 
 | ||||
|         });  | ||||
| 
 | ||||
|         it('should parse input hash256', function() { | ||||
| 
 | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].inputs = [ | ||||
|                 { type: "hash256" } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.inputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal(parser.test("0x407d73d8a49eeb85d32cf465507dd71d507100c1"), "000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1"); | ||||
| 
 | ||||
|         }); | ||||
| 
 | ||||
| 
 | ||||
|         it('should parse input hash160', function() { | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].inputs = [ | ||||
|                 { type: "hash160" } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.inputParser(d); | ||||
|              | ||||
|             // then
 | ||||
|             assert.equal(parser.test("0x407d73d8a49eeb85d32cf465507dd71d507100c1"), "000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1"); | ||||
|         }); | ||||
| 
 | ||||
|         it('should parse input address', function () { | ||||
| 
 | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].inputs = [ | ||||
|                 { type: "address" } | ||||
|             ]; | ||||
|              | ||||
|             // when
 | ||||
|             var parser = abi.inputParser(d) | ||||
|              | ||||
|             // then
 | ||||
|             assert.equal(parser.test("0x407d73d8a49eeb85d32cf465507dd71d507100c1"), "000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1"); | ||||
| 
 | ||||
|         }); | ||||
| 
 | ||||
|         it('should parse input string', function () { | ||||
|              | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].inputs = [ | ||||
|                 { type: "string" } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.inputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal( | ||||
|                 parser.test('hello'),  | ||||
|                 "000000000000000000000000000000000000000000000000000000000000000568656c6c6f000000000000000000000000000000000000000000000000000000" | ||||
|                 ); | ||||
|             assert.equal( | ||||
|                 parser.test('world'), | ||||
|                 "0000000000000000000000000000000000000000000000000000000000000005776f726c64000000000000000000000000000000000000000000000000000000" | ||||
|                 ); | ||||
|         }); | ||||
| 
 | ||||
|         it('should use proper method name', function () { | ||||
|          | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
|             d[0].name = 'helloworld(int)'; | ||||
|             d[0].inputs = [ | ||||
|                 { type: "int" } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.inputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal(parser.helloworld(1), "0000000000000000000000000000000000000000000000000000000000000001"); | ||||
|             assert.equal(parser.helloworld['int'](1), "0000000000000000000000000000000000000000000000000000000000000001"); | ||||
| 
 | ||||
|         }); | ||||
|          | ||||
|         it('should parse multiple methods', function () { | ||||
|              | ||||
|             // given
 | ||||
|             var d =  [{ | ||||
|                 name: "test", | ||||
|                 inputs: [{ type: "int" }], | ||||
|                 outputs: [{ type: "int" }] | ||||
|             },{ | ||||
|                 name: "test2", | ||||
|                 inputs: [{ type: "string" }], | ||||
|                 outputs: [{ type: "string" }] | ||||
|             }]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.inputParser(d); | ||||
| 
 | ||||
|             //then
 | ||||
|             assert.equal(parser.test(1), "0000000000000000000000000000000000000000000000000000000000000001"); | ||||
|             assert.equal( | ||||
|                 parser.test2('hello'),  | ||||
|                 "000000000000000000000000000000000000000000000000000000000000000568656c6c6f000000000000000000000000000000000000000000000000000000" | ||||
|                 ); | ||||
| 
 | ||||
|         }); | ||||
| 
 | ||||
|         it('should parse input array of ints', function () { | ||||
|              | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].inputs = [ | ||||
|                 { type: "int[]" } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.inputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal( | ||||
|                 parser.test([5, 6]), | ||||
|                 "0000000000000000000000000000000000000000000000000000000000000002" +  | ||||
|                 "0000000000000000000000000000000000000000000000000000000000000005" +  | ||||
|                 "0000000000000000000000000000000000000000000000000000000000000006" | ||||
|                 ); | ||||
|         }); | ||||
| 
 | ||||
|         it('should parse input real', function () { | ||||
|              | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].inputs = [ | ||||
|                 { type: 'real' } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.inputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal(parser.test([1]),      "0000000000000000000000000000000100000000000000000000000000000000");  | ||||
|             assert.equal(parser.test([2.125]),  "0000000000000000000000000000000220000000000000000000000000000000");  | ||||
|             assert.equal(parser.test([8.5]),    "0000000000000000000000000000000880000000000000000000000000000000");  | ||||
|             assert.equal(parser.test([-1]),     "ffffffffffffffffffffffffffffffff00000000000000000000000000000000");  | ||||
|                  | ||||
|         }); | ||||
|          | ||||
|         it('should parse input ureal', function () { | ||||
|              | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].inputs = [ | ||||
|                 { type: 'ureal' } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.inputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal(parser.test([1]),      "0000000000000000000000000000000100000000000000000000000000000000");  | ||||
|             assert.equal(parser.test([2.125]),  "0000000000000000000000000000000220000000000000000000000000000000");  | ||||
|             assert.equal(parser.test([8.5]),    "0000000000000000000000000000000880000000000000000000000000000000");  | ||||
|                  | ||||
|         }); | ||||
| 
 | ||||
|     }); | ||||
| 
 | ||||
|     describe('outputParser', function() { | ||||
|         it('should parse output string', function() { | ||||
| 
 | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].outputs = [ | ||||
|                 { type: "string" } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.outputParser(d); | ||||
|              | ||||
|             // then
 | ||||
|             assert.equal( | ||||
|                 parser.test("0x" +  | ||||
|                     "0000000000000000000000000000000000000000000000000000000000000005" + | ||||
|                     "68656c6c6f000000000000000000000000000000000000000000000000000000")[0], | ||||
|                 'hello' | ||||
|                 ); | ||||
|             assert.equal( | ||||
|                 parser.test("0x" +  | ||||
|                     "0000000000000000000000000000000000000000000000000000000000000005" + | ||||
|                     "776f726c64000000000000000000000000000000000000000000000000000000")[0],  | ||||
|                 'world' | ||||
|                 ); | ||||
| 
 | ||||
|         }); | ||||
| 
 | ||||
|         it('should parse output uint', function() { | ||||
| 
 | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].outputs = [ | ||||
|                 { type: 'uint' } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.outputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal(parser.test("0x0000000000000000000000000000000000000000000000000000000000000001")[0], 1); | ||||
|             assert.equal(parser.test("0x000000000000000000000000000000000000000000000000000000000000000a")[0], 10); | ||||
|             assert.equal( | ||||
|                 parser.test("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")[0].toString(10),  | ||||
|                 new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16).toString(10) | ||||
|                 ); | ||||
|             assert.equal( | ||||
|                 parser.test("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0")[0].toString(10),  | ||||
|                 new BigNumber("fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0", 16).toString(10) | ||||
|                 ); | ||||
|         }); | ||||
|          | ||||
|         it('should parse output uint256', function() { | ||||
| 
 | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].outputs = [ | ||||
|                 { type: 'uint256' } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.outputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal(parser.test("0x0000000000000000000000000000000000000000000000000000000000000001")[0], 1); | ||||
|             assert.equal(parser.test("0x000000000000000000000000000000000000000000000000000000000000000a")[0], 10); | ||||
|             assert.equal( | ||||
|                 parser.test("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")[0].toString(10),  | ||||
|                 new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16).toString(10) | ||||
|                 ); | ||||
|             assert.equal( | ||||
|                 parser.test("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0")[0].toString(10),  | ||||
|                 new BigNumber("fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0", 16).toString(10) | ||||
|                 ); | ||||
|         }); | ||||
| 
 | ||||
|         it('should parse output uint128', function() { | ||||
| 
 | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].outputs = [ | ||||
|                 { type: 'uint128' } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.outputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal(parser.test("0x0000000000000000000000000000000000000000000000000000000000000001")[0], 1); | ||||
|             assert.equal(parser.test("0x000000000000000000000000000000000000000000000000000000000000000a")[0], 10); | ||||
|             assert.equal( | ||||
|                 parser.test("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")[0].toString(10),  | ||||
|                 new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16).toString(10) | ||||
|                 ); | ||||
|             assert.equal( | ||||
|                 parser.test("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0")[0].toString(10),  | ||||
|                 new BigNumber("fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0", 16).toString(10) | ||||
|                 ); | ||||
|         }); | ||||
| 
 | ||||
|         it('should parse output int', function() { | ||||
| 
 | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].outputs = [ | ||||
|                 { type: 'int' } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.outputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal(parser.test("0x0000000000000000000000000000000000000000000000000000000000000001")[0], 1); | ||||
|             assert.equal(parser.test("0x000000000000000000000000000000000000000000000000000000000000000a")[0], 10); | ||||
|             assert.equal(parser.test("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")[0], -1); | ||||
|             assert.equal(parser.test("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0")[0], -16); | ||||
|         }); | ||||
|          | ||||
|         it('should parse output int256', function() { | ||||
| 
 | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].outputs = [ | ||||
|                 { type: 'int256' } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.outputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal(parser.test("0x0000000000000000000000000000000000000000000000000000000000000001")[0], 1); | ||||
|             assert.equal(parser.test("0x000000000000000000000000000000000000000000000000000000000000000a")[0], 10); | ||||
|             assert.equal(parser.test("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")[0], -1); | ||||
|             assert.equal(parser.test("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0")[0], -16); | ||||
|         }); | ||||
| 
 | ||||
|         it('should parse output int128', function() { | ||||
| 
 | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].outputs = [ | ||||
|                 { type: 'int128' } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.outputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal(parser.test("0x0000000000000000000000000000000000000000000000000000000000000001")[0], 1); | ||||
|             assert.equal(parser.test("0x000000000000000000000000000000000000000000000000000000000000000a")[0], 10); | ||||
|             assert.equal(parser.test("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")[0], -1); | ||||
|             assert.equal(parser.test("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0")[0], -16); | ||||
|         }); | ||||
| 
 | ||||
|         it('should parse output hash', function() { | ||||
|              | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].outputs = [ | ||||
|                 { type: 'hash' } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.outputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal( | ||||
|                 parser.test("0x000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1")[0], | ||||
|                 "0x000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1" | ||||
|                 ); | ||||
|         }); | ||||
|          | ||||
|         it('should parse output hash256', function() { | ||||
|          | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].outputs = [ | ||||
|                 { type: 'hash256' } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.outputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal( | ||||
|                 parser.test("0x000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1")[0], | ||||
|                 "0x000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1" | ||||
|                 ); | ||||
|         }); | ||||
| 
 | ||||
|         it('should parse output hash160', function() { | ||||
|              | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].outputs = [ | ||||
|                 { type: 'hash160' } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.outputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal( | ||||
|                 parser.test("0x000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1")[0], | ||||
|                 "0x000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1" | ||||
|                 ); | ||||
|             // TODO shouldnt' the expected hash be shorter?
 | ||||
|         }); | ||||
| 
 | ||||
|         it('should parse output address', function() { | ||||
|              | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].outputs = [ | ||||
|                 { type: 'address' } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.outputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal( | ||||
|                 parser.test("0x000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1")[0], | ||||
|                 "0x407d73d8a49eeb85d32cf465507dd71d507100c1" | ||||
|                 ); | ||||
|         }); | ||||
| 
 | ||||
|         it('should parse output bool', function() { | ||||
|              | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].outputs = [ | ||||
|                 { type: 'bool' } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.outputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal(parser.test("0x0000000000000000000000000000000000000000000000000000000000000001")[0], true); | ||||
|             assert.equal(parser.test("0x0000000000000000000000000000000000000000000000000000000000000000")[0], false); | ||||
|              | ||||
| 
 | ||||
|         }); | ||||
| 
 | ||||
|         it('should parse output real', function() { | ||||
|              | ||||
|             // given
 | ||||
|             var d = clone(description);  | ||||
| 
 | ||||
|             d[0].outputs = [ | ||||
|                 { type: 'real' } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.outputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal(parser.test("0x0000000000000000000000000000000100000000000000000000000000000000")[0], 1); | ||||
|             assert.equal(parser.test("0x0000000000000000000000000000000220000000000000000000000000000000")[0], 2.125);  | ||||
|             assert.equal(parser.test("0x0000000000000000000000000000000880000000000000000000000000000000")[0], 8.5);  | ||||
|             assert.equal(parser.test("0xffffffffffffffffffffffffffffffff00000000000000000000000000000000")[0], -1);  | ||||
|              | ||||
|         }); | ||||
| 
 | ||||
|         it('should parse output ureal', function() { | ||||
| 
 | ||||
|             // given
 | ||||
|             var d = clone(description);  | ||||
| 
 | ||||
|             d[0].outputs = [ | ||||
|                 { type: 'ureal' } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.outputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal(parser.test("0x0000000000000000000000000000000100000000000000000000000000000000")[0], 1); | ||||
|             assert.equal(parser.test("0x0000000000000000000000000000000220000000000000000000000000000000")[0], 2.125);  | ||||
|             assert.equal(parser.test("0x0000000000000000000000000000000880000000000000000000000000000000")[0], 8.5);  | ||||
| 
 | ||||
|         }); | ||||
|          | ||||
| 
 | ||||
|         it('should parse multiple output strings', function() { | ||||
| 
 | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
| 
 | ||||
|             d[0].outputs = [ | ||||
|                 { type: "string" }, | ||||
|                 { type: "string" } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.outputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal( | ||||
|                 parser.test("0x" + | ||||
|                     "0000000000000000000000000000000000000000000000000000000000000005" + | ||||
|                     "0000000000000000000000000000000000000000000000000000000000000005" + | ||||
|                     "68656c6c6f000000000000000000000000000000000000000000000000000000" +  | ||||
|                     "776f726c64000000000000000000000000000000000000000000000000000000")[0], | ||||
|                 'hello' | ||||
|                 ); | ||||
|             assert.equal( | ||||
|                 parser.test("0x" + | ||||
|                     "0000000000000000000000000000000000000000000000000000000000000005" + | ||||
|                     "0000000000000000000000000000000000000000000000000000000000000005" + | ||||
|                     "68656c6c6f000000000000000000000000000000000000000000000000000000" +  | ||||
|                     "776f726c64000000000000000000000000000000000000000000000000000000")[1], | ||||
|                 'world' | ||||
|                 ); | ||||
| 
 | ||||
|         }); | ||||
|          | ||||
|         it('should use proper method name', function () { | ||||
|          | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
|             d[0].name = 'helloworld(int)'; | ||||
|             d[0].outputs = [ | ||||
|                 { type: "int" } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.outputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal(parser.helloworld("0x0000000000000000000000000000000000000000000000000000000000000001")[0], 1); | ||||
|             assert.equal(parser.helloworld['int']("0x0000000000000000000000000000000000000000000000000000000000000001")[0], 1); | ||||
| 
 | ||||
|         }); | ||||
| 
 | ||||
| 
 | ||||
|         it('should parse multiple methods', function () { | ||||
|              | ||||
|             // given
 | ||||
|             var d =  [{ | ||||
|                 name: "test", | ||||
|                 inputs: [{ type: "int" }], | ||||
|                 outputs: [{ type: "int" }] | ||||
|             },{ | ||||
|                 name: "test2", | ||||
|                 inputs: [{ type: "string" }], | ||||
|                 outputs: [{ type: "string" }] | ||||
|             }]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.outputParser(d); | ||||
| 
 | ||||
|             //then
 | ||||
|             assert.equal(parser.test("0000000000000000000000000000000000000000000000000000000000000001")[0], 1); | ||||
|             assert.equal(parser.test2("0x" +  | ||||
|                     "0000000000000000000000000000000000000000000000000000000000000005" + | ||||
|                     "68656c6c6f000000000000000000000000000000000000000000000000000000")[0], | ||||
|                 "hello" | ||||
|                 ); | ||||
| 
 | ||||
|         }); | ||||
| 
 | ||||
|         it('should parse output array', function () { | ||||
|              | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
|             d[0].outputs = [ | ||||
|                 { type: 'int[]' } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.outputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal(parser.test("0x" + | ||||
|                     "0000000000000000000000000000000000000000000000000000000000000002" +  | ||||
|                     "0000000000000000000000000000000000000000000000000000000000000005" +  | ||||
|                     "0000000000000000000000000000000000000000000000000000000000000006")[0][0], | ||||
|                 5 | ||||
|                 ); | ||||
|             assert.equal(parser.test("0x" + | ||||
|                     "0000000000000000000000000000000000000000000000000000000000000002" +  | ||||
|                     "0000000000000000000000000000000000000000000000000000000000000005" +  | ||||
|                     "0000000000000000000000000000000000000000000000000000000000000006")[0][1], | ||||
|                 6 | ||||
|                 ); | ||||
| 
 | ||||
|         }); | ||||
| 
 | ||||
|         it('should parse 0x value', function () { | ||||
|          | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
|             d[0].outputs = [ | ||||
|                 { type: 'int' } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.outputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal(parser.test("0x")[0], 0); | ||||
| 
 | ||||
|         }); | ||||
|          | ||||
|         it('should parse 0x value', function () { | ||||
|          | ||||
|             // given
 | ||||
|             var d = clone(description); | ||||
|             d[0].outputs = [ | ||||
|                 { type: 'uint' } | ||||
|             ]; | ||||
| 
 | ||||
|             // when
 | ||||
|             var parser = abi.outputParser(d); | ||||
| 
 | ||||
|             // then
 | ||||
|             assert.equal(parser.test("0x")[0], 0); | ||||
| 
 | ||||
|         }); | ||||
| 
 | ||||
|     }); | ||||
| }); | ||||
| 
 | ||||
| @ -1,14 +0,0 @@ | ||||
| 
 | ||||
| var assert = require('assert'); | ||||
| var web3 = require('../index.js'); | ||||
| var u = require('./utils.js'); | ||||
| 
 | ||||
| describe('web3', function() { | ||||
|     describe('db', function() { | ||||
|         u.methodExists(web3.db, 'put'); | ||||
|         u.methodExists(web3.db, 'get'); | ||||
|         u.methodExists(web3.db, 'putString'); | ||||
|         u.methodExists(web3.db, 'getString'); | ||||
|     }); | ||||
| }); | ||||
| 
 | ||||
| @ -1,34 +0,0 @@ | ||||
| var assert = require('assert'); | ||||
| var web3 = require('../index.js'); | ||||
| var u = require('./utils.js'); | ||||
| 
 | ||||
| describe('web3', function() { | ||||
|     describe('eth', function() { | ||||
|         u.methodExists(web3.eth, 'balanceAt'); | ||||
|         u.methodExists(web3.eth, 'stateAt'); | ||||
|         u.methodExists(web3.eth, 'storageAt'); | ||||
|         u.methodExists(web3.eth, 'countAt'); | ||||
|         u.methodExists(web3.eth, 'codeAt'); | ||||
|         u.methodExists(web3.eth, 'transact'); | ||||
|         u.methodExists(web3.eth, 'call'); | ||||
|         u.methodExists(web3.eth, 'block'); | ||||
|         u.methodExists(web3.eth, 'transaction'); | ||||
|         u.methodExists(web3.eth, 'uncle'); | ||||
|         u.methodExists(web3.eth, 'compilers'); | ||||
|         u.methodExists(web3.eth, 'lll'); | ||||
|         u.methodExists(web3.eth, 'solidity'); | ||||
|         u.methodExists(web3.eth, 'serpent'); | ||||
|         u.methodExists(web3.eth, 'logs'); | ||||
| 
 | ||||
|         u.propertyExists(web3.eth, 'coinbase'); | ||||
|         u.propertyExists(web3.eth, 'listening'); | ||||
|         u.propertyExists(web3.eth, 'mining'); | ||||
|         u.propertyExists(web3.eth, 'gasPrice'); | ||||
|         u.propertyExists(web3.eth, 'accounts'); | ||||
|         u.propertyExists(web3.eth, 'peerCount'); | ||||
|         u.propertyExists(web3.eth, 'defaultBlock'); | ||||
|         u.propertyExists(web3.eth, 'number'); | ||||
|     }); | ||||
| }); | ||||
| 
 | ||||
| 
 | ||||
| @ -1,2 +0,0 @@ | ||||
| --reporter spec  | ||||
| 
 | ||||
| @ -1,14 +0,0 @@ | ||||
| var assert = require('assert'); | ||||
| var web3 = require('../index.js'); | ||||
| var u = require('./utils.js'); | ||||
| 
 | ||||
| describe('web3', function() { | ||||
|     describe('shh', function() { | ||||
|         u.methodExists(web3.shh, 'post'); | ||||
|         u.methodExists(web3.shh, 'newIdentity'); | ||||
|         u.methodExists(web3.shh, 'haveIdentity'); | ||||
|         u.methodExists(web3.shh, 'newGroup'); | ||||
|         u.methodExists(web3.shh, 'addToGroup'); | ||||
|     }); | ||||
| }); | ||||
| 
 | ||||
| @ -1,19 +0,0 @@ | ||||
| var assert = require('assert'); | ||||
| 
 | ||||
| var methodExists = function (object, method) { | ||||
|     it('should have method ' + method + ' implemented', function() { | ||||
|         assert.equal('function', typeof object[method], 'method ' + method + ' is not implemented'); | ||||
|     }); | ||||
| }; | ||||
| 
 | ||||
| var propertyExists = function (object, property) { | ||||
|     it('should have property ' + property + ' implemented', function() { | ||||
|         assert.notEqual('undefined', typeof object[property], 'property ' + property + ' is not implemented'); | ||||
|     }); | ||||
| }; | ||||
| 
 | ||||
| module.exports = { | ||||
|     methodExists: methodExists, | ||||
|     propertyExists: propertyExists | ||||
| }; | ||||
| 
 | ||||
| @ -1,10 +0,0 @@ | ||||
| var assert = require('assert'); | ||||
| var web3 = require('../index.js'); | ||||
| var u = require('./utils.js'); | ||||
| 
 | ||||
| describe('web3', function() { | ||||
|     u.methodExists(web3, 'sha3'); | ||||
|     u.methodExists(web3, 'toAscii'); | ||||
|     u.methodExists(web3, 'fromAscii'); | ||||
| }); | ||||
| 
 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user