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]
|
|
||||||
|
|
||||||
<!-- [![browser support](https://ci.testling.com/ethereum/ethereum.js.png)](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