Browse Source

Merge pull request #2260 from debris/web3.js.6.0

web3.js.6.0 + web3.admin extension
cl-refactor
Gav Wood 10 years ago
parent
commit
087e6a21cc
  1. 2
      alethzero/DappLoader.cpp
  2. 120
      libjsqrc/admin.js
  3. 8
      libjsqrc/ethereumjs/LICENSE
  4. 2
      libjsqrc/ethereumjs/README.md
  5. 2
      libjsqrc/ethereumjs/bower.json
  6. 5683
      libjsqrc/ethereumjs/dist/web3-light.js
  7. 2
      libjsqrc/ethereumjs/dist/web3-light.min.js
  8. 260
      libjsqrc/ethereumjs/dist/web3.js
  9. 85
      libjsqrc/ethereumjs/dist/web3.js.map
  10. 4
      libjsqrc/ethereumjs/dist/web3.min.js
  11. 153
      libjsqrc/ethereumjs/example/coin.html
  12. 5
      libjsqrc/ethereumjs/example/event_inc.html
  13. 2
      libjsqrc/ethereumjs/gulpfile.js
  14. 2
      libjsqrc/ethereumjs/lib/utils/config.js
  15. 2
      libjsqrc/ethereumjs/lib/version.json
  16. 33
      libjsqrc/ethereumjs/lib/web3.js
  17. 10
      libjsqrc/ethereumjs/lib/web3/eth.js
  18. 99
      libjsqrc/ethereumjs/lib/web3/filter.js
  19. 22
      libjsqrc/ethereumjs/lib/web3/formatters.js
  20. 13
      libjsqrc/ethereumjs/lib/web3/function.js
  21. 4
      libjsqrc/ethereumjs/lib/web3/httpprovider.js
  22. 1
      libjsqrc/ethereumjs/lib/web3/property.js
  23. 59
      libjsqrc/ethereumjs/lib/web3/requestmanager.js
  24. 4
      libjsqrc/ethereumjs/lib/web3/watches.js
  25. 2
      libjsqrc/ethereumjs/package.js
  26. 6
      libjsqrc/ethereumjs/package.json
  27. 55
      libjsqrc/ethereumjs/test/contract.js
  28. 70
      libjsqrc/ethereumjs/test/formatters.outputBlockFormatter.js
  29. 32
      libjsqrc/ethereumjs/test/formatters.outputLogFormatter.js
  30. 35
      libjsqrc/ethereumjs/test/formatters.outputTransactionFormatter.js
  31. 10
      libjsqrc/ethereumjs/test/helpers/FakeHttpProvider2.js
  32. 7
      libjsqrc/ethereumjs/test/helpers/FakeXMLHttpRequest.js
  33. 76
      libjsqrc/ethereumjs/test/web3.extend.js
  34. 1
      libjsqrc/js.qrc

2
alethzero/DappLoader.cpp

@ -193,6 +193,8 @@ QByteArray const& DappLoader::web3Content()
code += "\n"; code += "\n";
code += contentsOfQResource(":/js/setup.js"); code += contentsOfQResource(":/js/setup.js");
code += "\n"; code += "\n";
code += contentsOfQResource(":/js/admin.js");
code += "\n";
m_web3Js = code.toLatin1(); m_web3Js = code.toLatin1();
} }
return m_web3Js; return m_web3Js;

120
libjsqrc/admin.js

@ -0,0 +1,120 @@
web3.admin = {};
web3.admin.setSessionKey = function(s) { web3.admin.sessionKey = s; };
var getSessionKey = function () { return web3.admin.sessionKey; };
web3._extend({
property: 'admin',
methods: [new web3._extend.Method({
name: 'web3.setVerbosity',
call: 'admin_web3_setVerbosity',
inputFormatter: [null, getSessionKey],
params: 2
}), new web3._extend.Method({
name: 'net.start',
call: 'admin_net_start',
inputFormatter: [getSessionKey],
params: 1
}), new web3._extend.Method({
name: 'net.stop',
call: 'admin_net_stop',
inputFormatter: [getSessionKey],
params: 1
}), new web3._extend.Method({
name: 'net.connect',
call: 'admin_net_connect',
inputFormatter: [null, getSessionKey],
params: 2
}), new web3._extend.Method({
name: 'net.peers',
call: 'admin_net_peers',
inputFormatter: [getSessionKey],
params: 1
}), new web3._extend.Method({
name: 'eth.blockQueueStatus',
call: 'admin_eth_blockQueueStatus',
inputFormatter: [getSessionKey],
params: 1
}), new web3._extend.Method({
name: 'eth.setAskPrice',
call: 'admin_eth_setAskPrice',
inputFormatter: [null, getSessionKey],
params: 2
}), new web3._extend.Method({
name: 'eth.setBidPrice',
call: 'admin_eth_setBidPrice',
inputFormatter: [null, getSessionKey],
params: 2
}), new web3._extend.Method({
name: 'eth.setReferencePrice',
call: 'admin_eth_setReferencePrice',
inputFormatter: [null, getSessionKey],
params: 2
}), new web3._extend.Method({
name: 'eth.setPriority',
call: 'admin_eth_setPriority',
inputFormatter: [null, getSessionKey],
params: 2
}), new web3._extend.Method({
name: 'eth.setMining',
call: 'admin_eth_setMining',
inputFormatter: [null, getSessionKey],
params: 2
}), new web3._extend.Method({
name: 'eth.findBlock',
call: 'admin_eth_findBlock',
inputFormatter: [null, getSessionKey],
params: 2
}), new web3._extend.Method({
name: 'eth.blockQueueFirstUnknown',
call: 'admin_eth_blockQueueFirstUnknown',
inputFormatter: [getSessionKey],
params: 1
}), new web3._extend.Method({
name: 'eth.blockQueueRetryUnknown',
call: 'admin_eth_blockQueueRetryUnknown',
inputFormatter: [getSessionKey],
params: 1
}), new web3._extend.Method({
name: 'eth.allAccounts',
call: 'admin_eth_allAccounts',
inputFormatter: [getSessionKey],
params: 1
}), new web3._extend.Method({
name: 'eth.newAccount',
call: 'admin_eth_newAccount',
inputFormatter: [null, getSessionKey],
params: 2
}), new web3._extend.Method({
name: 'eth.setSigningKey',
call: 'admin_eth_setSigningKey',
inputFormatter: [null, getSessionKey],
params: 2
}), new web3._extend.Method({
name: 'eth.setMiningBenefactor',
call: 'admin_eth_setMiningBenefactor',
inputFormatter: [null, getSessionKey],
params: 2
}), new web3._extend.Method({
name: 'eth.inspect',
call: 'admin_eth_inspect',
inputFormatter: [null, getSessionKey],
params: 2
}), new web3._extend.Method({
name: 'eth.reprocess',
call: 'admin_eth_reprocess',
inputFormatter: [null, getSessionKey],
params: 2
}), new web3._extend.Method({
name: 'eth.vmTrace',
call: 'admin_eth_vmTrace',
inputFormatter: [null, null, getSessionKey],
params: 3
}), new web3._extend.Method({
name: 'eth.getReceiptByHashAndIndex',
call: 'admin_eth_getReceiptByHashAndIndex',
inputFormatter: [null, null, getSessionKey],
params: 3
})]
});

8
libjsqrc/ethereumjs/LICENSE

@ -1,14 +1,14 @@
This file is part of ethereum.js. This file is part of web3.js.
ethereum.js is free software: you can redistribute it and/or modify web3.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 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 the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
ethereum.js is distributed in the hope that it will be useful, web3.js is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details. GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License 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/>. along with web3.js. If not, see <http://www.gnu.org/licenses/>.

2
libjsqrc/ethereumjs/README.md

@ -108,7 +108,7 @@ eth -j
[travis-url]: https://travis-ci.org/ethereum/web3.js [travis-url]: https://travis-ci.org/ethereum/web3.js
[dep-image]: https://david-dm.org/ethereum/web3.js.svg [dep-image]: https://david-dm.org/ethereum/web3.js.svg
[dep-url]: https://david-dm.org/ethereum/web3.js [dep-url]: https://david-dm.org/ethereum/web3.js
[dep-dev-image]: https://david-dm.org/ethereum/web.js/dev-status.svg [dep-dev-image]: https://david-dm.org/ethereum/web3.js/dev-status.svg
[dep-dev-url]: https://david-dm.org/ethereum/web3.js#info=devDependencies [dep-dev-url]: https://david-dm.org/ethereum/web3.js#info=devDependencies
[coveralls-image]: https://coveralls.io/repos/ethereum/web3.js/badge.svg?branch=master [coveralls-image]: https://coveralls.io/repos/ethereum/web3.js/badge.svg?branch=master
[coveralls-url]: https://coveralls.io/r/ethereum/web3.js?branch=master [coveralls-url]: https://coveralls.io/r/ethereum/web3.js?branch=master

2
libjsqrc/ethereumjs/bower.json

@ -1,7 +1,7 @@
{ {
"name": "web3", "name": "web3",
"namespace": "ethereum", "namespace": "ethereum",
"version": "0.5.0", "version": "0.6.0",
"description": "Ethereum Compatible JavaScript API", "description": "Ethereum Compatible JavaScript API",
"main": [ "main": [
"./dist/web3.js", "./dist/web3.js",

5683
libjsqrc/ethereumjs/dist/web3-light.js

File diff suppressed because it is too large

2
libjsqrc/ethereumjs/dist/web3-light.min.js

File diff suppressed because one or more lines are too long

260
libjsqrc/ethereumjs/dist/web3.js

File diff suppressed because one or more lines are too long

85
libjsqrc/ethereumjs/dist/web3.js.map

File diff suppressed because one or more lines are too long

4
libjsqrc/ethereumjs/dist/web3.min.js

File diff suppressed because one or more lines are too long

153
libjsqrc/ethereumjs/example/coin.html

@ -1,153 +0,0 @@
<!doctype>
<html>
<title>JevCoin</title>
<head>
<script type="text/javascript" src="../dist/web3.js"></script>
</head>
<body>
<h1>JevCoin <code id="contract_addr"></code></h1>
<div>
<strong>Balance</strong>
<span id="balance"></strong>
</div>
<div>
<span>Address:</span>
<input type="text" id="address" style="width:200px">
<span>Amount:</span>
<input type="text" id="amount" style="width:200px">
<button onclick="transact()">Send</button>
<span id="message"></span>
</div>
<hr>
<table width="100%" id="table">
<tr><td style="width:40%;">Address</td><td>Balance</td></tr>
<tbody id="table_body"></tbody>
</table>
</body>
<script type="text/javascript">
var web3 = require('web3');
var eth = web3.eth;
web3.setProvider(new web3.providers.HttpProvider('http://localhost:8080'));
var desc = [{
"name": "balance(address)",
"type": "function",
"inputs": [{
"name": "who",
"type": "address"
}],
"constant": true,
"outputs": [{
"name": "value",
"type": "uint256"
}]
}, {
"name": "send(address,uint256)",
"type": "function",
"inputs": [{
"name": "to",
"type": "address"
}, {
"name": "value",
"type": "uint256"
}],
"outputs": []
}, {
"name":"Changed",
"type":"event",
"inputs": [
{"name":"from","type":"address","indexed":true},
{"name":"amount","type":"uint256","indexed":true},
],
}];
var address = localStorage.getItem("address");
// deploy if not exist
if(address === null) {
var code = "0x60056013565b61014f8061003a6000396000f35b620f42406000600033600160a060020a0316815260200190815260200160002081905550560060e060020a600035048063d0679d3414610020578063e3d670d71461003457005b61002e600435602435610049565b60006000f35b61003f600435610129565b8060005260206000f35b806000600033600160a060020a03168152602001908152602001600020541061007157610076565b610125565b806000600033600160a060020a03168152602001908152602001600020908154039081905550806000600084600160a060020a031681526020019081526020016000209081540190819055508033600160a060020a03167fb52dda022b6c1a1f40905a85f257f689aa5d69d850e49cf939d688fbe5af594660006000a38082600160a060020a03167fb52dda022b6c1a1f40905a85f257f689aa5d69d850e49cf939d688fbe5af594660006000a35b5050565b60006000600083600160a060020a0316815260200190815260200160002054905091905056";
address = web3.eth.transact({from: eth.coinbase, data: code, gas: "1000000"});
localStorage.setItem("address", address);
}
document.querySelector("#contract_addr").innerHTML = address;
var Contract = web3.eth.contract(desc);
contract = new Contract(address);
contract.Changed({from: eth.accounts[0]}).changed(function() {
refresh();
});
function refresh() {
document.querySelector("#balance").innerHTML = contract.balance(eth.coinbase);
var table = document.querySelector("#table_body");
table.innerHTML = ""; // clear
/*var storage = eth.getStorage(address);*/
/*table.innerHTML = "";*/
/*for( var item in storage ) {*/
/*table.innerHTML += "<tr><td>"+item+"</td><td>"+web3.toDecimal(storage[item])+"</td></tr>";*/
/*}*/
}
function transact() {
var to = document.querySelector("#address");
if( to.value.length == 0 ) {
to = "0x4205b06c2cfa0e30359edcab94543266cb6fa1d3";
} else {
if (to.value.substr(0,2) != "0x")
to.value = "0x"+to.value;
}
var value = document.querySelector("#amount");
var amount = parseInt( value.value );
console.log("transact: ", to.value, " => ", amount)
contract.sendTransaction({from: eth.accounts[0]}).send( to.value, amount );
to.value = "";
value.value = "";
var message = document.querySelector("#message")
message.innerHTML = "Submitted";
setTimeout(function() {
message.innerHTML = "";
}, 1000);
}
refresh();
</script>
</html>
<!--
contract JevCoin {
function JevCoin()
{
balances[msg.sender] = 1000000;
}
event Changed(address indexed from, uint indexed amount);
function send(address to, uint value)
{
if( balances[msg.sender] < value ) return;
balances[msg.sender] -= value;
balances[to] += value;
Changed(msg.sender, value);
Changed(to, value);
}
function balance(address who) constant returns(uint t)
{
t = balances[who];
}
mapping(address => uint256) balances;
}
-!>

5
libjsqrc/ethereumjs/example/event_inc.html

@ -25,6 +25,7 @@
var address; var address;
var contract; var contract;
var inc;
var update = function (err, x) { var update = function (err, x) {
document.getElementById('result').textContent = JSON.stringify(x, null, 2); document.getElementById('result').textContent = JSON.stringify(x, null, 2);
@ -55,8 +56,8 @@
} }
}); });
contract.Incremented({odd: true}).watch(update); inc = contract.Incremented({odd: true});
inc.watch(update);
}; };
var counter = 0; var counter = 0;

2
libjsqrc/ethereumjs/gulpfile.js

@ -73,7 +73,7 @@ gulp.task('buildLight', ['clean'], function () {
.pipe(gulp.dest( DEST )); .pipe(gulp.dest( DEST ));
}); });
gulp.task('buildStandalone', [], function () { gulp.task('buildStandalone', ['clean'], function () {
return browserify(browserifyOptions) return browserify(browserifyOptions)
.require('./' + src + '.js', {expose: 'web3'}) .require('./' + src + '.js', {expose: 'web3'})
.require('bignumber.js') // expose it to dapp users .require('bignumber.js') // expose it to dapp users

2
libjsqrc/ethereumjs/lib/utils/config.js

@ -71,7 +71,7 @@ module.exports = {
ETH_SIGNATURE_LENGTH: 4, ETH_SIGNATURE_LENGTH: 4,
ETH_UNITS: ETH_UNITS, ETH_UNITS: ETH_UNITS,
ETH_BIGNUMBER_ROUNDING_MODE: { ROUNDING_MODE: BigNumber.ROUND_DOWN }, ETH_BIGNUMBER_ROUNDING_MODE: { ROUNDING_MODE: BigNumber.ROUND_DOWN },
ETH_POLLING_TIMEOUT: 1000, ETH_POLLING_TIMEOUT: 1000/2,
defaultBlock: 'latest', defaultBlock: 'latest',
defaultAccount: undefined defaultAccount: undefined
}; };

2
libjsqrc/ethereumjs/lib/version.json

@ -1,3 +1,3 @@
{ {
"version": "0.5.0" "version": "0.6.0"
} }

33
libjsqrc/ethereumjs/lib/web3.js

@ -34,7 +34,6 @@ var Filter = require('./web3/filter');
var utils = require('./utils/utils'); var utils = require('./utils/utils');
var formatters = require('./web3/formatters'); var formatters = require('./web3/formatters');
var RequestManager = require('./web3/requestmanager'); var RequestManager = require('./web3/requestmanager');
var Method = require('./web3/method');
var c = require('./utils/config'); var c = require('./utils/config');
var Property = require('./web3/property'); var Property = require('./web3/property');
var Batch = require('./web3/batch'); var Batch = require('./web3/batch');
@ -94,8 +93,7 @@ web3.eth.filter = function (fil, eventParams, options, formatter) {
return fil(eventParams, options); return fil(eventParams, options);
} }
// what outputLogFormatter? that's wrong // output logs works for blockFilter and pendingTransaction filters?
//return new Filter(fil, watches.eth(), formatters.outputLogFormatter);
return new Filter(fil, watches.eth(), formatter || formatters.outputLogFormatter); return new Filter(fil, watches.eth(), formatter || formatters.outputLogFormatter);
}; };
/*jshint maxparams:3 */ /*jshint maxparams:3 */
@ -150,6 +148,23 @@ Object.defineProperty(web3.eth, 'defaultAccount', {
} }
}); });
// EXTEND
web3._extend = function(extension){
/*jshint maxcomplexity: 6 */
if(extension.property && !web3[extension.property])
web3[extension.property] = {};
setupMethods(web3[extension.property] || web3, extension.methods || []);
setupProperties(web3[extension.property] || web3, extension.properties || []);
};
web3._extend.formatters = formatters;
web3._extend.utils = utils;
web3._extend.Method = require('./web3/method');
web3._extend.Property = require('./web3/property');
/// setups all api methods /// setups all api methods
setupProperties(web3, web3Properties); setupProperties(web3, web3Properties);
setupMethods(web3.net, net.methods); setupMethods(web3.net, net.methods);
@ -159,17 +174,5 @@ setupProperties(web3.eth, eth.properties);
setupMethods(web3.db, db.methods); setupMethods(web3.db, db.methods);
setupMethods(web3.shh, shh.methods); setupMethods(web3.shh, shh.methods);
web3.admin = {};
web3.admin.setSessionKey = function(s) { web3.admin.sessionKey = s; };
var blockQueueStatus = new Property({
name: 'blockQueueStatus',
call: 'admin_eth_blockQueueStatus',
params: 1,
inputFormatter: [function() { return web3.admin.sessionKey; }]
});
setupMethods(web3.admin, [blockQueueStatus]);
module.exports = web3; module.exports = web3;

10
libjsqrc/ethereumjs/lib/web3/eth.js

@ -77,11 +77,11 @@ var uncleCountCall = function (args) {
/// @returns an array of objects describing web3.eth api methods /// @returns an array of objects describing web3.eth api methods
var getBalance = new Method({ var getBalance = new Method({
name: 'getBalance', name: 'getBalance',
call: 'eth_getBalance', call: 'eth_getBalance',
params: 2, params: 2,
inputFormatter: [utils.toAddress, formatters.inputDefaultBlockNumberFormatter], inputFormatter: [utils.toAddress, formatters.inputDefaultBlockNumberFormatter],
outputFormatter: formatters.outputBigNumberFormatter outputFormatter: formatters.outputBigNumberFormatter
}); });
var getStorageAt = new Method({ var getStorageAt = new Method({

99
libjsqrc/ethereumjs/lib/web3/filter.js

@ -74,21 +74,36 @@ var getOptions = function (options) {
}; };
}; };
var Filter = function (options, methods, formatter) { /**
var implementation = {}; Adds the callback and sets up the methods, to iterate over the results.
methods.forEach(function (method) {
method.attachToObject(implementation); @method getLogsAtStart
}); @param {Object} self
this.options = getOptions(options); @param {funciton}
this.implementation = implementation; */
this.callbacks = []; var getLogsAtStart = function(self, callback){
this.formatter = formatter; // call getFilterLogs for the first watch callback start
this.filterId = this.implementation.newFilter(this.options); if (!utils.isString(self.options)) {
self.get(function (err, messages) {
// don't send all the responses to all the watches again... just to self one
if (err) {
callback(err);
}
messages.forEach(function (message) {
callback(null, message);
});
});
}
}; };
Filter.prototype.watch = function (callback) { /**
this.callbacks.push(callback); Adds the callback and sets up the methods, to iterate over the results.
var self = this;
@method pollFilter
@param {Object} self
*/
var pollFilter = function(self) {
var onMessage = function (error, messages) { var onMessage = function (error, messages) {
if (error) { if (error) {
@ -105,29 +120,55 @@ Filter.prototype.watch = function (callback) {
}); });
}; };
// call getFilterLogs on start RequestManager.getInstance().startPolling({
if (!utils.isString(this.options)) { method: self.implementation.poll.call,
this.get(function (err, messages) { params: [self.filterId],
// don't send all the responses to all the watches again... just to this one }, self.filterId, onMessage, self.stopWatching.bind(self));
if (err) {
callback(err);
}
messages.forEach(function (message) { };
callback(null, message);
var Filter = function (options, methods, formatter) {
var self = this;
var implementation = {};
methods.forEach(function (method) {
method.attachToObject(implementation);
});
this.options = getOptions(options);
this.implementation = implementation;
this.callbacks = [];
this.pollFilters = [];
this.formatter = formatter;
this.implementation.newFilter(this.options, function(error, id){
if(error) {
self.callbacks.forEach(function(callback){
callback(error);
}); });
}); } else {
self.filterId = id;
// get filter logs at start
self.callbacks.forEach(function(callback){
getLogsAtStart(self, callback);
});
pollFilter(self);
}
});
};
Filter.prototype.watch = function (callback) {
this.callbacks.push(callback);
if(this.filterId) {
getLogsAtStart(this, callback);
pollFilter(this);
} }
RequestManager.getInstance().startPolling({ return this;
method: this.implementation.poll.call,
params: [this.filterId],
}, this.filterId, onMessage, this.stopWatching.bind(this));
}; };
Filter.prototype.stopWatching = function () { Filter.prototype.stopWatching = function () {
RequestManager.getInstance().stopPolling(this.filterId); RequestManager.getInstance().stopPolling(this.filterId);
this.implementation.uninstallFilter(this.filterId); // remove filter async
this.implementation.uninstallFilter(this.filterId, function(){});
this.callbacks = []; this.callbacks = [];
}; };
@ -149,6 +190,8 @@ Filter.prototype.get = function (callback) {
return self.formatter ? self.formatter(log) : log; return self.formatter ? self.formatter(log) : log;
}); });
} }
return this;
}; };
module.exports = Filter; module.exports = Filter;

22
libjsqrc/ethereumjs/lib/web3/formatters.js

@ -89,8 +89,10 @@ var inputTransactionFormatter = function (options){
* @returns {Object} transaction * @returns {Object} transaction
*/ */
var outputTransactionFormatter = function (tx){ var outputTransactionFormatter = function (tx){
tx.blockNumber = utils.toDecimal(tx.blockNumber); if(tx.blockNumber !== null)
tx.transactionIndex = utils.toDecimal(tx.transactionIndex); tx.blockNumber = utils.toDecimal(tx.blockNumber);
if(tx.transactionIndex !== null)
tx.transactionIndex = utils.toDecimal(tx.transactionIndex);
tx.nonce = utils.toDecimal(tx.nonce); tx.nonce = utils.toDecimal(tx.nonce);
tx.gas = utils.toDecimal(tx.gas); tx.gas = utils.toDecimal(tx.gas);
tx.gasPrice = utils.toBigNumber(tx.gasPrice); tx.gasPrice = utils.toBigNumber(tx.gasPrice);
@ -112,7 +114,8 @@ var outputBlockFormatter = function(block) {
block.gasUsed = utils.toDecimal(block.gasUsed); block.gasUsed = utils.toDecimal(block.gasUsed);
block.size = utils.toDecimal(block.size); block.size = utils.toDecimal(block.size);
block.timestamp = utils.toDecimal(block.timestamp); block.timestamp = utils.toDecimal(block.timestamp);
block.number = utils.toDecimal(block.number); if(block.number !== null)
block.number = utils.toDecimal(block.number);
block.difficulty = utils.toBigNumber(block.difficulty); block.difficulty = utils.toBigNumber(block.difficulty);
block.totalDifficulty = utils.toBigNumber(block.totalDifficulty); block.totalDifficulty = utils.toBigNumber(block.totalDifficulty);
@ -135,13 +138,12 @@ var outputBlockFormatter = function(block) {
* @returns {Object} log * @returns {Object} log
*/ */
var outputLogFormatter = function(log) { var outputLogFormatter = function(log) {
if (log === null) { // 'pending' && 'latest' filters are nulls if(log.blockNumber !== null)
return null; log.blockNumber = utils.toDecimal(log.blockNumber);
} if(log.transactionIndex !== null)
log.transactionIndex = utils.toDecimal(log.transactionIndex);
log.blockNumber = utils.toDecimal(log.blockNumber); if(log.logIndex !== null)
log.transactionIndex = utils.toDecimal(log.transactionIndex); log.logIndex = utils.toDecimal(log.logIndex);
log.logIndex = utils.toDecimal(log.logIndex);
return log; return log;
}; };

13
libjsqrc/ethereumjs/lib/web3/function.js

@ -23,6 +23,7 @@
var web3 = require('../web3'); var web3 = require('../web3');
var coder = require('../solidity/coder'); var coder = require('../solidity/coder');
var utils = require('../utils/utils'); var utils = require('../utils/utils');
var formatters = require('./formatters');
var sha3 = require('../utils/sha3'); var sha3 = require('../utils/sha3');
/** /**
@ -46,6 +47,12 @@ SolidityFunction.prototype.extractCallback = function (args) {
} }
}; };
SolidityFunction.prototype.extractDefaultBlock = function (args) {
if (args.length > this._inputTypes.length && !utils.isObject(args[args.length -1])) {
return formatters.inputDefaultBlockNumberFormatter(args.pop()); // modify the args array!
}
};
/** /**
* Should be used to create payload from arguments * Should be used to create payload from arguments
* *
@ -97,15 +104,17 @@ SolidityFunction.prototype.unpackOutput = function (output) {
SolidityFunction.prototype.call = function () { SolidityFunction.prototype.call = function () {
var args = Array.prototype.slice.call(arguments).filter(function (a) {return a !== undefined; }); var args = Array.prototype.slice.call(arguments).filter(function (a) {return a !== undefined; });
var callback = this.extractCallback(args); var callback = this.extractCallback(args);
var defaultBlock = this.extractDefaultBlock(args);
var payload = this.toPayload(args); var payload = this.toPayload(args);
if (!callback) { if (!callback) {
var output = web3.eth.call(payload); var output = web3.eth.call(payload, defaultBlock);
return this.unpackOutput(output); return this.unpackOutput(output);
} }
var self = this; var self = this;
web3.eth.call(payload, function (error, output) { web3.eth.call(payload, defaultBlock, function (error, output) {
callback(error, self.unpackOutput(output)); callback(error, self.unpackOutput(output));
}); });
}; };

4
libjsqrc/ethereumjs/lib/web3/httpprovider.js

@ -35,6 +35,7 @@ HttpProvider.prototype.send = function (payload) {
var request = new XMLHttpRequest(); var request = new XMLHttpRequest();
request.open('POST', this.host, false); request.open('POST', this.host, false);
request.setRequestHeader('Content-type','application/json');
try { try {
request.send(JSON.stringify(payload)); request.send(JSON.stringify(payload));
@ -78,7 +79,8 @@ HttpProvider.prototype.sendAsync = function (payload, callback) {
}; };
request.open('POST', this.host, true); request.open('POST', this.host, true);
request.setRequestHeader('Content-type','application/json');
try { try {
request.send(JSON.stringify(payload)); request.send(JSON.stringify(payload));
} catch(error) { } catch(error) {

1
libjsqrc/ethereumjs/lib/web3/property.js

@ -29,7 +29,6 @@ var Property = function (options) {
this.setter = options.setter; this.setter = options.setter;
this.outputFormatter = options.outputFormatter; this.outputFormatter = options.outputFormatter;
this.inputFormatter = options.inputFormatter; this.inputFormatter = options.inputFormatter;
this.params = options.params;
}; };
/** /**

59
libjsqrc/ethereumjs/lib/web3/requestmanager.js

@ -43,9 +43,9 @@ var RequestManager = function (provider) {
arguments.callee._singletonInstance = this; arguments.callee._singletonInstance = this;
this.provider = provider; this.provider = provider;
this.polls = []; this.polls = {};
this.timeout = null; this.timeout = null;
this.poll(); this.isPolling = false;
}; };
/** /**
@ -140,6 +140,11 @@ RequestManager.prototype.sendBatch = function (data, callback) {
*/ */
RequestManager.prototype.setProvider = function (p) { RequestManager.prototype.setProvider = function (p) {
this.provider = p; this.provider = p;
if (this.provider && !this.isPolling) {
this.poll();
this.isPolling = true;
}
}; };
/*jshint maxparams:4 */ /*jshint maxparams:4 */
@ -156,7 +161,7 @@ RequestManager.prototype.setProvider = function (p) {
* @todo cleanup number of params * @todo cleanup number of params
*/ */
RequestManager.prototype.startPolling = function (data, pollId, callback, uninstall) { RequestManager.prototype.startPolling = function (data, pollId, callback, uninstall) {
this.polls.push({data: data, id: pollId, callback: callback, uninstall: uninstall}); this.polls['poll_'+ pollId] = {data: data, id: pollId, callback: callback, uninstall: uninstall};
}; };
/*jshint maxparams:3 */ /*jshint maxparams:3 */
@ -167,24 +172,19 @@ RequestManager.prototype.startPolling = function (data, pollId, callback, uninst
* @param {Number} pollId * @param {Number} pollId
*/ */
RequestManager.prototype.stopPolling = function (pollId) { RequestManager.prototype.stopPolling = function (pollId) {
for (var i = this.polls.length; i--;) { delete this.polls['poll_'+ pollId];
var poll = this.polls[i];
if (poll.id === pollId) {
this.polls.splice(i, 1);
}
}
}; };
/** /**
* Should be called to reset polling mechanism of request manager * Should be called to reset the polling mechanism of the request manager
* *
* @method reset * @method reset
*/ */
RequestManager.prototype.reset = function () { RequestManager.prototype.reset = function () {
this.polls.forEach(function (poll) { for (var key in this.polls) {
poll.uninstall(poll.id); this.polls[key].uninstall();
}); }
this.polls = []; this.polls = {};
if (this.timeout) { if (this.timeout) {
clearTimeout(this.timeout); clearTimeout(this.timeout);
@ -199,9 +199,10 @@ RequestManager.prototype.reset = function () {
* @method poll * @method poll
*/ */
RequestManager.prototype.poll = function () { RequestManager.prototype.poll = function () {
/*jshint maxcomplexity: 6 */
this.timeout = setTimeout(this.poll.bind(this), c.ETH_POLLING_TIMEOUT); this.timeout = setTimeout(this.poll.bind(this), c.ETH_POLLING_TIMEOUT);
if (!this.polls.length) { if (Object.keys(this.polls).length === 0) {
return; return;
} }
@ -210,9 +211,18 @@ RequestManager.prototype.poll = function () {
return; return;
} }
var payload = Jsonrpc.getInstance().toBatchPayload(this.polls.map(function (data) { var pollsData = [];
return data.data; var pollsKeys = [];
})); for (var key in this.polls) {
pollsData.push(this.polls[key].data);
pollsKeys.push(key);
}
if (pollsData.length === 0) {
return;
}
var payload = Jsonrpc.getInstance().toBatchPayload(pollsData);
var self = this; var self = this;
this.provider.sendAsync(payload, function (error, results) { this.provider.sendAsync(payload, function (error, results) {
@ -220,14 +230,21 @@ RequestManager.prototype.poll = function () {
if (error) { if (error) {
return; return;
} }
if (!utils.isArray(results)) { if (!utils.isArray(results)) {
throw errors.InvalidResponse(results); throw errors.InvalidResponse(results);
} }
results.map(function (result, index) { results.map(function (result, index) {
result.callback = self.polls[index].callback; var key = pollsKeys[index];
return result; // make sure the filter is still installed after arrival of the request
if (self.polls[key]) {
result.callback = self.polls[key].callback;
return result;
} else
return false;
}).filter(function (result) {
return !!result;
}).filter(function (result) { }).filter(function (result) {
var valid = Jsonrpc.getInstance().isValidResponse(result); var valid = Jsonrpc.getInstance().isValidResponse(result);
if (!valid) { if (!valid) {

4
libjsqrc/ethereumjs/lib/web3/watches.js

@ -29,11 +29,11 @@ var eth = function () {
switch(type) { switch(type) {
case 'latest': case 'latest':
args.pop(); args.shift();
this.params = 0; this.params = 0;
return 'eth_newBlockFilter'; return 'eth_newBlockFilter';
case 'pending': case 'pending':
args.pop(); args.shift();
this.params = 0; this.params = 0;
return 'eth_newPendingTransactionFilter'; return 'eth_newPendingTransactionFilter';
default: default:

2
libjsqrc/ethereumjs/package.js

@ -1,7 +1,7 @@
/* jshint ignore:start */ /* jshint ignore:start */
Package.describe({ Package.describe({
name: 'ethereum:web3', name: 'ethereum:web3',
version: '0.5.0', version: '0.6.0',
summary: 'Ethereum JavaScript API, middleware to talk to a ethreum node over RPC', summary: 'Ethereum JavaScript API, middleware to talk to a ethreum node over RPC',
git: 'https://github.com/ethereum/ethereum.js', git: 'https://github.com/ethereum/ethereum.js',
// By default, Meteor will default to using README.md for documentation. // By default, Meteor will default to using README.md for documentation.

6
libjsqrc/ethereumjs/package.json

@ -1,7 +1,7 @@
{ {
"name": "web3", "name": "web3",
"namespace": "ethereum", "namespace": "ethereum",
"version": "0.5.0", "version": "0.6.0",
"description": "Ethereum JavaScript API, middleware to talk to a ethereum node over RPC", "description": "Ethereum JavaScript API, middleware to talk to a ethereum node over RPC",
"main": "./index.js", "main": "./index.js",
"directories": { "directories": {
@ -17,11 +17,11 @@
}, },
"devDependencies": { "devDependencies": {
"bower": ">=1.3.0", "bower": ">=1.3.0",
"browserify": ">=6.0", "browserify": ">=10.0",
"chai": "^2.1.1", "chai": "^2.1.1",
"coveralls": "^2.11.2", "coveralls": "^2.11.2",
"del": ">=0.1.1", "del": ">=0.1.1",
"exorcist": "^0.1.6", "exorcist": "^0.4.0",
"gulp": ">=3.4.0", "gulp": ">=3.4.0",
"gulp-jshint": ">=1.5.0", "gulp-jshint": ">=1.5.0",
"gulp-rename": ">=1.2.0", "gulp-rename": ">=1.2.0",

55
libjsqrc/ethereumjs/test/contract.js

@ -66,7 +66,7 @@ describe('web3.eth.contract', function () {
provider.injectValidation(function (payload) { provider.injectValidation(function (payload) {
if (step === 0) { if (step === 0) {
step = 1; step = 1;
provider.injectResult(3); provider.injectResult('0x3');
assert.equal(payload.jsonrpc, '2.0'); assert.equal(payload.jsonrpc, '2.0');
assert.equal(payload.method, 'eth_newFilter'); assert.equal(payload.method, 'eth_newFilter');
assert.deepEqual(payload.params[0], { assert.deepEqual(payload.params[0], {
@ -105,7 +105,7 @@ describe('web3.eth.contract', function () {
'0000000000000000000000000000000000000000000000000000000000000008' '0000000000000000000000000000000000000000000000000000000000000008'
}]]); }]]);
var r = payload.filter(function (p) { var r = payload.filter(function (p) {
return p.jsonrpc === '2.0' && p.method === 'eth_getFilterChanges' && p.params[0] === 3; return p.jsonrpc === '2.0' && p.method === 'eth_getFilterChanges' && p.params[0] === '0x3';
}); });
assert.equal(r.length > 0, true); assert.equal(r.length > 0, true);
} }
@ -114,7 +114,8 @@ describe('web3.eth.contract', function () {
var contract = web3.eth.contract(desc).at(address); var contract = web3.eth.contract(desc).at(address);
var res = 0; var res = 0;
contract.Changed({from: address}).watch(function(err, result) { var event = contract.Changed({from: address});
event.watch(function(err, result) {
assert.equal(result.args.from, address); assert.equal(result.args.from, address);
assert.equal(result.args.amount, 1); assert.equal(result.args.amount, 1);
assert.equal(result.args.t1, 1); assert.equal(result.args.t1, 1);
@ -133,6 +134,7 @@ describe('web3.eth.contract', function () {
provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000032'); provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000032');
var signature = 'balance(address)' var signature = 'balance(address)'
var address = '0x1234567890123456789012345678901234567890'; var address = '0x1234567890123456789012345678901234567890';
provider.injectValidation(function (payload) { provider.injectValidation(function (payload) {
assert.equal(payload.method, 'eth_call'); assert.equal(payload.method, 'eth_call');
assert.deepEqual(payload.params, [{ assert.deepEqual(payload.params, [{
@ -147,6 +149,28 @@ describe('web3.eth.contract', function () {
assert.deepEqual(new BigNumber(0x32), r); assert.deepEqual(new BigNumber(0x32), r);
}); });
it('should call constant function with default block', function () {
var provider = new FakeHttpProvider();
web3.setProvider(provider);
web3.reset();
provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000032');
var signature = 'balance(address)'
var address = '0x1234567890123456789012345678901234567890';
provider.injectValidation(function (payload) {
assert.equal(payload.method, 'eth_call');
assert.deepEqual(payload.params, [{
data: '0x' + sha3(signature).slice(0, 8) + '0000000000000000000000001234567890123456789012345678901234567890',
to: address
}, '0xb']);
});
var contract = web3.eth.contract(desc).at(address);
var r = contract.balance(address, 11);
assert.deepEqual(new BigNumber(0x32), r);
});
it('should sendTransaction to contract function', function () { it('should sendTransaction to contract function', function () {
var provider = new FakeHttpProvider(); var provider = new FakeHttpProvider();
web3.setProvider(provider); web3.setProvider(provider);
@ -218,6 +242,31 @@ describe('web3.eth.contract', function () {
}); });
it('should explicitly make a call with optional params and defaultBlock', function () {
var provider = new FakeHttpProvider();
web3.setProvider(provider);
web3.reset();
provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000032');
var signature = 'balance(address)';
var address = '0x1234567890123456789012345678901234567890';
provider.injectValidation(function (payload) {
assert.equal(payload.method, 'eth_call');
assert.deepEqual(payload.params, [{
data: '0x' + sha3(signature).slice(0, 8) + '0000000000000000000000001234567890123456789012345678901234567890',
to: address,
from: address,
gas: '0xc350'
}, '0xb']);
});
var contract = web3.eth.contract(desc).at(address);
var r = contract.balance.call(address, {from: address, gas: 50000}, 11);
assert.deepEqual(new BigNumber(0x32), r);
});
it('should sendTransaction with optional params', function () { it('should sendTransaction with optional params', function () {
var provider = new FakeHttpProvider(); var provider = new FakeHttpProvider();
web3.setProvider(provider); web3.setProvider(provider);

70
libjsqrc/ethereumjs/test/formatters.outputBlockFormatter.js

@ -8,38 +8,72 @@ describe('formatters', function () {
it('should return the correct value', function () { it('should return the correct value', function () {
assert.deepEqual(formatters.outputBlockFormatter({ assert.deepEqual(formatters.outputBlockFormatter({
hash: '0x34234kjh23kj4234', hash: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265',
parentHash: '0x34234kjh23kj4234', parentHash: '0x83ffb245cfced97ccc5c75253d6960376d6c6dea93647397a543a72fdaea5265',
miner: '0x34234kjh23kj4234', miner: '0xdcc6960376d6c6dea93647383ffb245cfced97cf',
stateRoot: '0x34234kjh23kj4234', stateRoot: '0x54dda68af07643f68739a6e9612ad157a26ae7e2ce81f77842bb5835fbcde583',
sha3Uncles: '0x34234kjh23kj4234', sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347',
bloom: '0x34234kjh23kj4234', bloom: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265',
difficulty: '0x3e8', difficulty: '0x3e8',
totalDifficulty: '0x3e8', totalDifficulty: '0x3e8',
number: '0x3e8', number: '0x3e8',
gasLimit: '0x3e8', gasLimit: '0x3e8',
gasUsed: '0x3e8', gasUsed: '0x3e8',
timestamp: '0x3e8', timestamp: '0x3e8',
extraData: '0x34234kjh23kj4234', extraData: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265',
nonce: '0x34234kjh23kj4234', nonce: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265',
children: ['0x34234kjh23kj4234'],
size: '0x3e8' size: '0x3e8'
}), { }), {
hash: '0x34234kjh23kj4234', hash: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265',
parentHash: '0x34234kjh23kj4234', parentHash: '0x83ffb245cfced97ccc5c75253d6960376d6c6dea93647397a543a72fdaea5265',
miner: '0x34234kjh23kj4234', miner: '0xdcc6960376d6c6dea93647383ffb245cfced97cf',
stateRoot: '0x34234kjh23kj4234', stateRoot: '0x54dda68af07643f68739a6e9612ad157a26ae7e2ce81f77842bb5835fbcde583',
sha3Uncles: '0x34234kjh23kj4234', sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347',
bloom: '0x34234kjh23kj4234', bloom: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265',
difficulty: new BigNumber(1000), difficulty: new BigNumber(1000),
totalDifficulty: new BigNumber(1000), totalDifficulty: new BigNumber(1000),
number: 1000, number: 1000,
gasLimit: 1000, gasLimit: 1000,
gasUsed: 1000, gasUsed: 1000,
timestamp: 1000, timestamp: 1000,
extraData: '0x34234kjh23kj4234', extraData: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265',
nonce: '0x34234kjh23kj4234', nonce: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265',
children: ['0x34234kjh23kj4234'], size: 1000
});
});
it('should return the correct value, when null values are present', function () {
assert.deepEqual(formatters.outputBlockFormatter({
hash: null,
parentHash: '0x83ffb245cfced97ccc5c75253d6960376d6c6dea93647397a543a72fdaea5265',
miner: null,
stateRoot: '0x54dda68af07643f68739a6e9612ad157a26ae7e2ce81f77842bb5835fbcde583',
sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347',
bloom: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265',
difficulty: '0x3e8',
totalDifficulty: '0x3e8',
number: null,
gasLimit: '0x3e8',
gasUsed: '0x3e8',
timestamp: '0x3e8',
extraData: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265',
nonce: null,
size: '0x3e8'
}), {
hash: null,
parentHash: '0x83ffb245cfced97ccc5c75253d6960376d6c6dea93647397a543a72fdaea5265',
miner: null,
stateRoot: '0x54dda68af07643f68739a6e9612ad157a26ae7e2ce81f77842bb5835fbcde583',
sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347',
bloom: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265',
difficulty: new BigNumber(1000),
totalDifficulty: new BigNumber(1000),
number: null,
gasLimit: 1000,
gasUsed: 1000,
timestamp: 1000,
extraData: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265',
nonce: null,
size: 1000 size: 1000
}); });
}); });

32
libjsqrc/ethereumjs/test/formatters.outputLogFormatter.js

@ -9,17 +9,37 @@ describe('formatters', function () {
transactionIndex: '0x3e8', transactionIndex: '0x3e8',
logIndex: '0x3e8', logIndex: '0x3e8',
blockNumber: '0x3e8', blockNumber: '0x3e8',
transactionHash: '0x7b2274657374223a2274657374227d', transactionHash: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265',
blockHash: '0x7b2274657374223a2274657374227d', blockHash: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265',
data: '0x7b2274657374223a2274657374227d', data: '0x7b2274657374223a2274657374227',
topics: ['0x68656c6c6f','0x6d79746f70696373'] topics: ['0x68656c6c6f','0x6d79746f70696373']
}), { }), {
transactionIndex: 1000, transactionIndex: 1000,
logIndex: 1000, logIndex: 1000,
blockNumber: 1000, blockNumber: 1000,
transactionHash: '0x7b2274657374223a2274657374227d', transactionHash: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265',
blockHash: '0x7b2274657374223a2274657374227d', blockHash: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265',
data: '0x7b2274657374223a2274657374227d', data: '0x7b2274657374223a2274657374227',
topics: ['0x68656c6c6f','0x6d79746f70696373']
});
});
it('should return the correct value, when null values are present', function () {
assert.deepEqual(formatters.outputLogFormatter({
transactionIndex: null,
logIndex: null,
blockNumber: null,
transactionHash: null,
blockHash: null,
data: '0x7b2274657374223a2274657374227',
topics: ['0x68656c6c6f','0x6d79746f70696373']
}), {
transactionIndex: null,
logIndex: null,
blockNumber: null,
transactionHash: null,
blockHash: null,
data: '0x7b2274657374223a2274657374227',
topics: ['0x68656c6c6f','0x6d79746f70696373'] topics: ['0x68656c6c6f','0x6d79746f70696373']
}); });
}); });

35
libjsqrc/ethereumjs/test/formatters.outputTransactionFormatter.js

@ -7,7 +7,7 @@ describe('formatters', function () {
it('should return the correct value', function () { it('should return the correct value', function () {
assert.deepEqual(formatters.outputTransactionFormatter({ assert.deepEqual(formatters.outputTransactionFormatter({
input: '0x34234kjh23kj4234', input: '0x3454645634534',
from: '0x00000', from: '0x00000',
to: '0x00000', to: '0x00000',
value: '0x3e8', value: '0x3e8',
@ -16,9 +16,9 @@ describe('formatters', function () {
nonce: '0xb', nonce: '0xb',
transactionIndex: '0x1', transactionIndex: '0x1',
blockNumber: '0x3e8', blockNumber: '0x3e8',
blockHash: '0x34234bf23bf4234' blockHash: '0xc9b9cdc2092a9d6589d96662b1fd6949611163fb3910cf8a173cd060f17702f9'
}), { }), {
input: '0x34234kjh23kj4234', input: '0x3454645634534',
from: '0x00000', from: '0x00000',
to: '0x00000', to: '0x00000',
value: new BigNumber(1000), value: new BigNumber(1000),
@ -26,9 +26,36 @@ describe('formatters', function () {
gasPrice: new BigNumber(1000), gasPrice: new BigNumber(1000),
nonce: 11, nonce: 11,
blockNumber: 1000, blockNumber: 1000,
blockHash: '0x34234bf23bf4234', blockHash: '0xc9b9cdc2092a9d6589d96662b1fd6949611163fb3910cf8a173cd060f17702f9',
transactionIndex: 1 transactionIndex: 1
}); });
}); });
it('should return the correct value, when null values are present', function () {
assert.deepEqual(formatters.outputTransactionFormatter({
input: '0x3454645634534',
from: '0x00000',
to: null,
value: '0x3e8',
gas: '0x3e8',
gasPrice: '0x3e8',
nonce: '0xb',
transactionIndex: null,
blockNumber: null,
blockHash: null
}), {
input: '0x3454645634534',
from: '0x00000',
to: null,
value: new BigNumber(1000),
gas: 1000,
gasPrice: new BigNumber(1000),
nonce: 11,
blockNumber: null,
blockHash: null,
transactionIndex: null
});
});
}); });
}); });

10
libjsqrc/ethereumjs/test/helpers/FakeHttpProvider2.js

@ -15,11 +15,21 @@ FakeHttpProvider2.prototype.injectResultList = function (list) {
FakeHttpProvider2.prototype.getResponse = function () { FakeHttpProvider2.prototype.getResponse = function () {
var result = this.resultList[this.counter]; var result = this.resultList[this.counter];
this.counter++; this.counter++;
// add fallback result value
if(!result)
result = {
result: undefined
};
if (result.type === 'batch') { if (result.type === 'batch') {
this.injectBatchResults(result.result); this.injectBatchResults(result.result);
} else { } else {
this.injectResult(result.result); this.injectResult(result.result);
} }
this.counter = 0;
return this.response; return this.response;
}; };

7
libjsqrc/ethereumjs/test/helpers/FakeXMLHttpRequest.js

@ -6,6 +6,9 @@ var FakeXMLHttpRequest = function () {
this.readyState = 4; this.readyState = 4;
this.onreadystatechange = null; this.onreadystatechange = null;
this.async = false; this.async = false;
this.headers = {
'Content-Type': 'text/plain'
};
}; };
FakeXMLHttpRequest.prototype.open = function (method, host, async) { FakeXMLHttpRequest.prototype.open = function (method, host, async) {
@ -15,6 +18,10 @@ FakeXMLHttpRequest.prototype.open = function (method, host, async) {
this.async = async; this.async = async;
}; };
FakeXMLHttpRequest.prototype.setRequestHeader = function(name, value) {
this.headers[name] = value;
};
FakeXMLHttpRequest.prototype.send = function (payload) { FakeXMLHttpRequest.prototype.send = function (payload) {
assert.equal(typeof payload, 'string'); assert.equal(typeof payload, 'string');
if (this.async) { if (this.async) {

76
libjsqrc/ethereumjs/test/web3.extend.js

@ -0,0 +1,76 @@
var chai = require('chai');
var assert = chai.assert;
var FakeHttpProvider = require('./helpers/FakeHttpProvider');
var web3 = require('../lib/web3');
var tests = [{
properties: [new web3._extend.Property({
name: 'gasPrice',
getter: 'eth_gasPrice',
outputFormatter: web3._extend.formatters.outputBigNumberFormatter
})]
},{
methods: [new web3._extend.Method({
name: 'getBalance',
call: 'eth_getBalance',
params: 2,
inputFormatter: [web3._extend.utils.toAddress, web3._extend.formatters.inputDefaultBlockNumberFormatter],
outputFormatter: web3._extend.formatters.outputBigNumberFormatter
})]
},{
property: 'admin',
properties: [new web3._extend.Property({
name: 'gasPrice',
getter: 'eth_gasPrice',
outputFormatter: web3._extend.formatters.outputBigNumberFormatter
})],
methods: [new web3._extend.Method({
name: 'getBalance',
call: 'eth_getBalance',
params: 2,
inputFormatter: [web3._extend.utils.toAddress, web3._extend.formatters.inputDefaultBlockNumberFormatter],
outputFormatter: web3._extend.formatters.outputBigNumberFormatter
})]
}];
describe('web3', function () {
describe('_extend', function () {
tests.forEach(function (test, index) {
it('test no: ' + index, function () {
web3._extend(test);
if(test.properties)
test.properties.forEach(function(property){
var provider = new FakeHttpProvider();
web3.setProvider(provider);
provider.injectResult('');
provider.injectValidation(function (payload) {
assert.equal(payload.jsonrpc, '2.0');
assert.equal(payload.method, property.getter);
});
if(test.property) {
assert.isObject(web3[test.property][property.name]);
assert.isFunction(web3[test.property]['get'+ property.name.charAt(0).toUpperCase() + property.name.slice(1)]);
} else {
assert.isObject(web3[property.name]);
assert.isFunction(web3['get'+ property.name.charAt(0).toUpperCase() + property.name.slice(1)]);
}
});
if(test.methods)
test.methods.forEach(function(property){
if(test.property)
assert.isFunction(web3[test.property][property.name]);
else
assert.isFunction(web3[property.name]);
});
});
});
});
});

1
libjsqrc/js.qrc

@ -2,6 +2,7 @@
<qresource prefix="/js"> <qresource prefix="/js">
<file>bignumber.min.js</file> <file>bignumber.min.js</file>
<file>setup.js</file> <file>setup.js</file>
<file>admin.js</file>
<file alias="webthree.js">ethereumjs/dist/web3.js</file> <file alias="webthree.js">ethereumjs/dist/web3.js</file>
</qresource> </qresource>
</RCC> </RCC>

Loading…
Cancel
Save