arkpar
10 years ago
167 changed files with 16332 additions and 2012 deletions
@ -1,5 +1,5 @@ |
|||||
{ |
{ |
||||
"directory": "example/js/", |
"directory": "bower", |
||||
"cwd": "./", |
"cwd": "./", |
||||
"analytics": false |
"analytics": false |
||||
} |
} |
||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -0,0 +1,153 @@ |
|||||
|
<!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; |
||||
|
} |
||||
|
-!> |
@ -1,7 +1,14 @@ |
|||||
var web3 = require('./lib/web3'); |
// dont override global variable
|
||||
|
if (typeof web3 !== 'undefined') { |
||||
|
var web3; |
||||
|
} |
||||
|
|
||||
|
web3 = require('./lib/web3'); |
||||
web3.providers.HttpProvider = require('./lib/web3/httpprovider'); |
web3.providers.HttpProvider = require('./lib/web3/httpprovider'); |
||||
web3.providers.QtSyncProvider = require('./lib/web3/qtsync'); |
web3.providers.QtSyncProvider = require('./lib/web3/qtsync'); |
||||
web3.eth.contract = require('./lib/web3/contract'); |
web3.eth.contract = require('./lib/web3/contract'); |
||||
web3.abi = require('./lib/solidity/abi'); |
web3.abi = require('./lib/solidity/abi'); |
||||
|
|
||||
|
|
||||
|
|
||||
module.exports = web3; |
module.exports = web3; |
||||
|
@ -0,0 +1,4 @@ |
|||||
|
'use strict'; |
||||
|
|
||||
|
module.exports = BigNumber; // jshint ignore:line
|
||||
|
|
@ -0,0 +1,9 @@ |
|||||
|
'use strict'; |
||||
|
|
||||
|
// go env doesn't have and need XMLHttpRequest
|
||||
|
if (typeof XMLHttpRequest === 'undefined') { |
||||
|
exports.XMLHttpRequest = {}; |
||||
|
} else { |
||||
|
exports.XMLHttpRequest = XMLHttpRequest; // jshint ignore:line
|
||||
|
} |
||||
|
|
@ -0,0 +1,3 @@ |
|||||
|
{ |
||||
|
"version": "0.2.5" |
||||
|
} |
@ -0,0 +1,38 @@ |
|||||
|
/* |
||||
|
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 errors.js |
||||
|
* @author Marek Kotewicz <marek@ethdev.com> |
||||
|
* @date 2015 |
||||
|
*/ |
||||
|
|
||||
|
var utils = require('../utils/utils'); |
||||
|
|
||||
|
module.exports = { |
||||
|
InvalidNumberOfParams: new Error('Invalid number of input parameters'), |
||||
|
InvalidProvider: new Error('Providor not set or invalid'), |
||||
|
InvalidResponse: function(result){ |
||||
|
var message = 'Invalid JSON RPC response'; |
||||
|
|
||||
|
if(utils.isObject(result) && result.error && result.error.message) { |
||||
|
message = result.error.message; |
||||
|
} |
||||
|
|
||||
|
return new Error(message); |
||||
|
} |
||||
|
}; |
||||
|
|
@ -0,0 +1,159 @@ |
|||||
|
/* |
||||
|
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 method.js |
||||
|
* @author Marek Kotewicz <marek@ethdev.com> |
||||
|
* @date 2015 |
||||
|
*/ |
||||
|
|
||||
|
var RequestManager = require('./requestmanager'); |
||||
|
var utils = require('../utils/utils'); |
||||
|
var errors = require('./errors'); |
||||
|
|
||||
|
var Method = function (options) { |
||||
|
this.name = options.name; |
||||
|
this.call = options.call; |
||||
|
this.params = options.params || 0; |
||||
|
this.inputFormatter = options.inputFormatter; |
||||
|
this.outputFormatter = options.outputFormatter; |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Should be used to determine name of the jsonrpc method based on arguments |
||||
|
* |
||||
|
* @method getCall |
||||
|
* @param {Array} arguments |
||||
|
* @return {String} name of jsonrpc method |
||||
|
*/ |
||||
|
Method.prototype.getCall = function (args) { |
||||
|
return utils.isFunction(this.call) ? this.call(args) : this.call; |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Should be used to extract callback from array of arguments. Modifies input param |
||||
|
* |
||||
|
* @method extractCallback |
||||
|
* @param {Array} arguments |
||||
|
* @return {Function|Null} callback, if exists |
||||
|
*/ |
||||
|
Method.prototype.extractCallback = function (args) { |
||||
|
if (utils.isFunction(args[args.length - 1])) { |
||||
|
return args.pop(); // modify the args array!
|
||||
|
} |
||||
|
return null; |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Should be called to check if the number of arguments is correct |
||||
|
* |
||||
|
* @method validateArgs |
||||
|
* @param {Array} arguments |
||||
|
* @throws {Error} if it is not |
||||
|
*/ |
||||
|
Method.prototype.validateArgs = function (args) { |
||||
|
if (args.length !== this.params) { |
||||
|
throw errors.InvalidNumberOfParams; |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Should be called to format input args of method |
||||
|
* |
||||
|
* @method formatInput |
||||
|
* @param {Array} |
||||
|
* @return {Array} |
||||
|
*/ |
||||
|
Method.prototype.formatInput = function (args) { |
||||
|
if (!this.inputFormatter) { |
||||
|
return args; |
||||
|
} |
||||
|
|
||||
|
return this.inputFormatter.map(function (formatter, index) { |
||||
|
return formatter ? formatter(args[index]) : args[index]; |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Should be called to format output(result) of method |
||||
|
* |
||||
|
* @method formatOutput |
||||
|
* @param {Object} |
||||
|
* @return {Object} |
||||
|
*/ |
||||
|
Method.prototype.formatOutput = function (result) { |
||||
|
return this.outputFormatter && result !== null ? this.outputFormatter(result) : result; |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Should attach function to method |
||||
|
* |
||||
|
* @method attachToObject |
||||
|
* @param {Object} |
||||
|
* @param {Function} |
||||
|
*/ |
||||
|
Method.prototype.attachToObject = function (obj) { |
||||
|
var func = this.send.bind(this); |
||||
|
func.call = this.call; // that's ugly. filter.js uses it
|
||||
|
var name = this.name.split('.'); |
||||
|
if (name.length > 1) { |
||||
|
obj[name[0]] = obj[name[0]] || {}; |
||||
|
obj[name[0]][name[1]] = func; |
||||
|
} else { |
||||
|
obj[name[0]] = func; |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Should create payload from given input args |
||||
|
* |
||||
|
* @method toPayload |
||||
|
* @param {Array} args |
||||
|
* @return {Object} |
||||
|
*/ |
||||
|
Method.prototype.toPayload = function (args) { |
||||
|
var call = this.getCall(args); |
||||
|
var callback = this.extractCallback(args); |
||||
|
var params = this.formatInput(args); |
||||
|
this.validateArgs(params); |
||||
|
|
||||
|
return { |
||||
|
method: call, |
||||
|
params: params, |
||||
|
callback: callback |
||||
|
}; |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Should send request to the API |
||||
|
* |
||||
|
* @method send |
||||
|
* @param list of params |
||||
|
* @return result |
||||
|
*/ |
||||
|
Method.prototype.send = function () { |
||||
|
var payload = this.toPayload(Array.prototype.slice.call(arguments)); |
||||
|
if (payload.callback) { |
||||
|
var self = this; |
||||
|
return RequestManager.getInstance().sendAsync(payload, function (err, result) { |
||||
|
payload.callback(null, self.formatOutput(result)); |
||||
|
}); |
||||
|
} |
||||
|
return this.formatOutput(RequestManager.getInstance().send(payload)); |
||||
|
}; |
||||
|
|
||||
|
module.exports = Method; |
||||
|
|
@ -0,0 +1,104 @@ |
|||||
|
/* |
||||
|
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 property.js |
||||
|
* @author Fabian Vogelsteller <fabian@frozeman.de> |
||||
|
* @author Marek Kotewicz <marek@ethdev.com> |
||||
|
* @date 2015 |
||||
|
*/ |
||||
|
|
||||
|
var RequestManager = require('./requestmanager'); |
||||
|
|
||||
|
var Property = function (options) { |
||||
|
this.name = options.name; |
||||
|
this.getter = options.getter; |
||||
|
this.setter = options.setter; |
||||
|
this.outputFormatter = options.outputFormatter; |
||||
|
this.inputFormatter = options.inputFormatter; |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Should be called to format input args of method |
||||
|
* |
||||
|
* @method formatInput |
||||
|
* @param {Array} |
||||
|
* @return {Array} |
||||
|
*/ |
||||
|
Property.prototype.formatInput = function (arg) { |
||||
|
return this.inputFormatter ? this.inputFormatter(arg) : arg; |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Should be called to format output(result) of method |
||||
|
* |
||||
|
* @method formatOutput |
||||
|
* @param {Object} |
||||
|
* @return {Object} |
||||
|
*/ |
||||
|
Property.prototype.formatOutput = function (result) { |
||||
|
return this.outputFormatter && result !== null ? this.outputFormatter(result) : result; |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Should attach function to method |
||||
|
* |
||||
|
* @method attachToObject |
||||
|
* @param {Object} |
||||
|
* @param {Function} |
||||
|
*/ |
||||
|
Property.prototype.attachToObject = function (obj) { |
||||
|
var proto = { |
||||
|
get: this.get.bind(this), |
||||
|
set: this.set.bind(this) |
||||
|
}; |
||||
|
|
||||
|
var name = this.name.split('.'); |
||||
|
if (name.length > 1) { |
||||
|
obj[name[0]] = obj[name[0]] || {}; |
||||
|
Object.defineProperty(obj[name[0]], name[1], proto); |
||||
|
} else { |
||||
|
Object.defineProperty(obj, name[0], proto); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Should be used to get value of the property |
||||
|
* |
||||
|
* @method get |
||||
|
* @return {Object} value of the property |
||||
|
*/ |
||||
|
Property.prototype.get = function () { |
||||
|
return this.formatOutput(RequestManager.getInstance().send({ |
||||
|
method: this.getter |
||||
|
})); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Should be used to set value of the property |
||||
|
* |
||||
|
* @method set |
||||
|
* @param {Object} new value of the property |
||||
|
*/ |
||||
|
Property.prototype.set = function (value) { |
||||
|
return RequestManager.getInstance().send({ |
||||
|
method: this.setter, |
||||
|
params: [this.formatInput(value)] |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
module.exports = Property; |
||||
|
|
@ -1,7 +1,8 @@ |
|||||
/* jshint ignore:start */ |
/* jshint ignore:start */ |
||||
|
|
||||
if(typeof web3 === 'undefined') { |
if(typeof web3 === 'undefined') { |
||||
web3 = require('web3'); |
web3 = require('ethereum.js'); |
||||
|
BigNumber = require('bignumber.js'); |
||||
} |
} |
||||
|
|
||||
/* jshint ignore:end */ |
/* jshint ignore:end */ |
@ -0,0 +1,229 @@ |
|||||
|
var chai = require('chai'); |
||||
|
var assert = chai.assert; |
||||
|
var web3 = require('../index'); |
||||
|
var FakeHttpProvider = require('./helpers/FakeHttpProvider'); |
||||
|
var utils = require('../lib/utils/utils'); |
||||
|
|
||||
|
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}, |
||||
|
{"name":"t1","type":"uint256","indexed":false}, |
||||
|
{"name":"t2","type":"uint256","indexed":false} |
||||
|
], |
||||
|
}]; |
||||
|
|
||||
|
var address = '0x1234567890123456789012345678901234567890'; |
||||
|
|
||||
|
describe('web3.eth.contract', function () { |
||||
|
describe('event', function () { |
||||
|
it('should create event filter', function (done) { |
||||
|
var provider = new FakeHttpProvider(); |
||||
|
web3.setProvider(provider); |
||||
|
web3.reset(); // reset different polls
|
||||
|
var sha3 = '0x5131231231231231231231'; |
||||
|
provider.injectResult(sha3); |
||||
|
var step = 0; |
||||
|
provider.injectValidation(function (payload) { |
||||
|
if (step === 0) { |
||||
|
step = 1; |
||||
|
assert.equal(payload.jsonrpc, '2.0'); |
||||
|
assert.equal(payload.method, 'web3_sha3'); |
||||
|
assert.equal(payload.params[0], web3.fromAscii('Changed(address,uint256,uint256,uint256)')); |
||||
|
} else if (step === 1) { |
||||
|
step = 2; |
||||
|
provider.injectResult(3); |
||||
|
assert.equal(payload.jsonrpc, '2.0'); |
||||
|
assert.equal(payload.method, 'eth_newFilter'); |
||||
|
assert.deepEqual(payload.params[0], { |
||||
|
topics: [ |
||||
|
sha3, |
||||
|
'0x1234567890123456789012345678901234567890' |
||||
|
], |
||||
|
address: '0x1234567890123456789012345678901234567890' |
||||
|
}); |
||||
|
} else if (step === 2 && utils.isArray(payload)) { |
||||
|
provider.injectBatchResults([[{ |
||||
|
address: address, |
||||
|
topics: [ |
||||
|
sha3, |
||||
|
'0x0000000000000000000000001234567890123456789012345678901234567890', |
||||
|
'0x0000000000000000000000000000000000000000000000000000000000000001' |
||||
|
], |
||||
|
number: 2, |
||||
|
data: '0x0000000000000000000000000000000000000000000000000000000000000001' + |
||||
|
'0000000000000000000000000000000000000000000000000000000000000008' |
||||
|
}]]); |
||||
|
var r = payload.filter(function (p) { |
||||
|
return p.jsonrpc === '2.0' && p.method === 'eth_getFilterChanges' && p.params[0] === 3; |
||||
|
}); |
||||
|
assert.equal(r.length > 0, true); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
var Contract = web3.eth.contract(desc); |
||||
|
var contract = new Contract(address); |
||||
|
|
||||
|
contract.Changed({from: address}).watch(function(err, result) { |
||||
|
assert.equal(result.args.from, address); |
||||
|
assert.equal(result.args.amount, 1); |
||||
|
assert.equal(result.args.t1, 1); |
||||
|
assert.equal(result.args.t2, 8); |
||||
|
done(); |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
it('should call constant function', function () { |
||||
|
var provider = new FakeHttpProvider(); |
||||
|
web3.setProvider(provider); |
||||
|
web3.reset(); |
||||
|
var sha3 = '0x5131231231231231231231'; |
||||
|
var address = '0x1234567890123456789012345678901234567890'; |
||||
|
provider.injectResult(sha3); |
||||
|
var step = 0; |
||||
|
provider.injectValidation(function (payload) { |
||||
|
if (step === 0) { |
||||
|
step = 1; |
||||
|
assert.equal(payload.jsonrpc, '2.0'); |
||||
|
assert.equal(payload.method, 'web3_sha3'); |
||||
|
assert.equal(payload.params[0], web3.fromAscii('balance(address)')); |
||||
|
} else if (step === 1) { |
||||
|
assert.equal(payload.method, 'eth_call'); |
||||
|
assert.deepEqual(payload.params, [{ |
||||
|
data: sha3.slice(0, 10) + '0000000000000000000000001234567890123456789012345678901234567890', |
||||
|
to: address |
||||
|
}, 'latest']); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
var Contract = web3.eth.contract(desc); |
||||
|
var contract = new Contract(address); |
||||
|
|
||||
|
contract.balance(address); |
||||
|
}); |
||||
|
|
||||
|
it('should sendTransaction to contract function', function () { |
||||
|
var provider = new FakeHttpProvider(); |
||||
|
web3.setProvider(provider); |
||||
|
web3.reset(); |
||||
|
var sha3 = '0x5131231231231231231231'; |
||||
|
var address = '0x1234567890123456789012345678901234567890'; |
||||
|
provider.injectResult(sha3); |
||||
|
var step = 0; |
||||
|
provider.injectValidation(function (payload) { |
||||
|
if (step === 0) { |
||||
|
step = 1; |
||||
|
assert.equal(payload.jsonrpc, '2.0'); |
||||
|
assert.equal(payload.method, 'web3_sha3'); |
||||
|
assert.equal(payload.params[0], web3.fromAscii('send(address,uint256)')); |
||||
|
} else if (step === 1) { |
||||
|
assert.equal(payload.method, 'eth_sendTransaction'); |
||||
|
assert.deepEqual(payload.params, [{ |
||||
|
data: sha3.slice(0, 10) + |
||||
|
'0000000000000000000000001234567890123456789012345678901234567890' + |
||||
|
'0000000000000000000000000000000000000000000000000000000000000011' , |
||||
|
to: address |
||||
|
}]); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
var Contract = web3.eth.contract(desc); |
||||
|
var contract = new Contract(address); |
||||
|
|
||||
|
contract.send(address, 17); |
||||
|
}); |
||||
|
|
||||
|
it('should make a call with optional params', function () { |
||||
|
|
||||
|
var provider = new FakeHttpProvider(); |
||||
|
web3.setProvider(provider); |
||||
|
web3.reset(); |
||||
|
var sha3 = '0x5131231231231231231231'; |
||||
|
var address = '0x1234567890123456789012345678901234567890'; |
||||
|
provider.injectResult(sha3); |
||||
|
var step = 0; |
||||
|
provider.injectValidation(function (payload) { |
||||
|
if (step === 0) { |
||||
|
step = 1; |
||||
|
assert.equal(payload.jsonrpc, '2.0'); |
||||
|
assert.equal(payload.method, 'web3_sha3'); |
||||
|
assert.equal(payload.params[0], web3.fromAscii('balance(address)')); |
||||
|
} else if (step === 1) { |
||||
|
assert.equal(payload.method, 'eth_call'); |
||||
|
assert.deepEqual(payload.params, [{ |
||||
|
data: sha3.slice(0, 10) + '0000000000000000000000001234567890123456789012345678901234567890', |
||||
|
to: address, |
||||
|
from: address, |
||||
|
gas: '0xc350' |
||||
|
}, 'latest']); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
var Contract = web3.eth.contract(desc); |
||||
|
var contract = new Contract(address); |
||||
|
|
||||
|
contract.call({from: address, gas: 50000}).balance(address); |
||||
|
|
||||
|
}); |
||||
|
|
||||
|
it('should sendTransaction with optional params', function () { |
||||
|
var provider = new FakeHttpProvider(); |
||||
|
web3.setProvider(provider); |
||||
|
web3.reset(); |
||||
|
var sha3 = '0x5131231231231231231231'; |
||||
|
var address = '0x1234567890123456789012345678901234567890'; |
||||
|
provider.injectResult(sha3); |
||||
|
var step = 0; |
||||
|
provider.injectValidation(function (payload) { |
||||
|
if (step === 0) { |
||||
|
step = 1; |
||||
|
assert.equal(payload.jsonrpc, '2.0'); |
||||
|
assert.equal(payload.method, 'web3_sha3'); |
||||
|
assert.equal(payload.params[0], web3.fromAscii('send(address,uint256)')); |
||||
|
} else if (step === 1) { |
||||
|
assert.equal(payload.method, 'eth_sendTransaction'); |
||||
|
assert.deepEqual(payload.params, [{ |
||||
|
data: sha3.slice(0, 10) + |
||||
|
'0000000000000000000000001234567890123456789012345678901234567890' + |
||||
|
'0000000000000000000000000000000000000000000000000000000000000011' , |
||||
|
to: address, |
||||
|
from: address, |
||||
|
gas: '0xc350', |
||||
|
gasPrice: '0xbb8', |
||||
|
value: '0x2710' |
||||
|
}]); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
var Contract = web3.eth.contract(desc); |
||||
|
var contract = new Contract(address); |
||||
|
|
||||
|
contract.sendTransaction({from: address, gas: 50000, gasPrice: 3000, value: 10000}).send(address, 17); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
@ -1,24 +0,0 @@ |
|||||
var assert = require('assert'); |
|
||||
var filter = require('../lib/web3/filter'); |
|
||||
var u = require('./test.utils.js'); |
|
||||
|
|
||||
var empty = function () {}; |
|
||||
var implementation = { |
|
||||
newFilter: empty, |
|
||||
getLogs: empty, |
|
||||
uninstallFilter: empty, |
|
||||
startPolling: empty, |
|
||||
stopPolling: empty, |
|
||||
}; |
|
||||
|
|
||||
describe('web3', function () { |
|
||||
describe('eth', function () { |
|
||||
describe('filter', function () { |
|
||||
var f = filter({}, implementation); |
|
||||
|
|
||||
u.methodExists(f, 'watch'); |
|
||||
u.methodExists(f, 'stopWatching'); |
|
||||
u.methodExists(f, 'get'); |
|
||||
}); |
|
||||
}); |
|
||||
}); |
|
@ -0,0 +1,24 @@ |
|||||
|
var chai = require('chai'); |
||||
|
var assert = chai.assert; |
||||
|
var formatters = require('../lib/web3/formatters'); |
||||
|
|
||||
|
var tests = [ |
||||
|
{ value: 'latest', expected: 'latest' }, |
||||
|
{ value: 'pending', expected: 'pending' }, |
||||
|
{ value: 'earliest', expected: 'earliest' }, |
||||
|
{ value: 1, expected: '0x1' }, |
||||
|
{ value: '0x1', expected: '0x1' } |
||||
|
]; |
||||
|
|
||||
|
describe('lib/web3/formatters', function () { |
||||
|
describe('inputDefaultBlockNumberFormatter', function () { |
||||
|
tests.forEach(function (test) { |
||||
|
it('should turn ' + test.value + ' to ' + test.expected, function () { |
||||
|
assert.strictEqual(formatters.inputDefaultBlockNumberFormatter(test.value), test.expected); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
|
||||
|
|
@ -0,0 +1,68 @@ |
|||||
|
var chai = require('chai'); |
||||
|
var assert = require('assert'); |
||||
|
var utils = require('../../lib/utils/utils'); |
||||
|
|
||||
|
var getResponseStub = function () { |
||||
|
return { |
||||
|
jsonrpc: '2.0', |
||||
|
id: 1, |
||||
|
result: 0 |
||||
|
}; |
||||
|
}; |
||||
|
|
||||
|
var FakeHttpProvider = function () { |
||||
|
this.response = getResponseStub(); |
||||
|
this.error = null; |
||||
|
this.validation = null; |
||||
|
}; |
||||
|
|
||||
|
FakeHttpProvider.prototype.send = function (payload) { |
||||
|
assert.equal(utils.isArray(payload) || utils.isObject(payload), true); |
||||
|
// TODO: validate jsonrpc request
|
||||
|
if (this.error) { |
||||
|
throw this.error; |
||||
|
} |
||||
|
if (this.validation) { |
||||
|
// imitate plain json object
|
||||
|
this.validation(JSON.parse(JSON.stringify(payload))); |
||||
|
} |
||||
|
return this.response; |
||||
|
}; |
||||
|
|
||||
|
FakeHttpProvider.prototype.sendAsync = function (payload, callback) { |
||||
|
assert.equal(utils.isArray(payload) || utils.isObject(payload), true); |
||||
|
assert.equal(utils.isFunction(callback), true); |
||||
|
if (this.validation) { |
||||
|
// imitate plain json object
|
||||
|
this.validation(JSON.parse(JSON.stringify(payload)), callback); |
||||
|
} |
||||
|
callback(this.error, this.response); |
||||
|
}; |
||||
|
|
||||
|
FakeHttpProvider.prototype.injectResponse = function (response) { |
||||
|
this.response = response; |
||||
|
}; |
||||
|
|
||||
|
FakeHttpProvider.prototype.injectResult = function (result) { |
||||
|
this.response = getResponseStub(); |
||||
|
this.response.result = result; |
||||
|
}; |
||||
|
|
||||
|
FakeHttpProvider.prototype.injectBatchResults = function (results) { |
||||
|
this.response = results.map(function (r) { |
||||
|
var response = getResponseStub(); |
||||
|
response.result = r; |
||||
|
return response; |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
FakeHttpProvider.prototype.injectError = function (error) { |
||||
|
this.error = error; |
||||
|
}; |
||||
|
|
||||
|
FakeHttpProvider.prototype.injectValidation = function (callback) { |
||||
|
this.validation = callback; |
||||
|
}; |
||||
|
|
||||
|
module.exports = FakeHttpProvider; |
||||
|
|
@ -0,0 +1,11 @@ |
|||||
|
|
||||
|
var navigator = { |
||||
|
qt: { |
||||
|
callMethod: function (payload) { |
||||
|
return "{}"; |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
module.exports = navigator; |
||||
|
|
@ -0,0 +1,31 @@ |
|||||
|
var chai = require('chai'); |
||||
|
var assert = chai.assert; |
||||
|
|
||||
|
var FakeXMLHttpRequest = function () { |
||||
|
this.responseText = "{}"; |
||||
|
this.readyState = 4; |
||||
|
this.onreadystatechange = null; |
||||
|
this.async = false; |
||||
|
}; |
||||
|
|
||||
|
FakeXMLHttpRequest.prototype.open = function (method, host, async) { |
||||
|
assert.equal(method, 'POST'); |
||||
|
assert.notEqual(host, null); |
||||
|
assert.equal(async === false || async === true, true); |
||||
|
this.async = async; |
||||
|
}; |
||||
|
|
||||
|
FakeXMLHttpRequest.prototype.send = function (payload) { |
||||
|
assert.equal(typeof payload, 'string'); |
||||
|
if (this.async) { |
||||
|
assert.equal(typeof this.onreadystatechange, 'function'); |
||||
|
this.onreadystatechange(); |
||||
|
return; |
||||
|
} |
||||
|
return this.responseText; |
||||
|
}; |
||||
|
|
||||
|
module.exports = { |
||||
|
XMLHttpRequest: FakeXMLHttpRequest |
||||
|
}; |
||||
|
|
@ -0,0 +1,68 @@ |
|||||
|
var chai = require('chai'); |
||||
|
var assert = chai.assert; |
||||
|
var web3 = require('../../index'); |
||||
|
var FakeHttpProvider = require('./FakeHttpProvider'); |
||||
|
|
||||
|
var runTests = function (obj, method, tests) { |
||||
|
|
||||
|
var testName = obj ? 'web3.' + obj : 'web'; |
||||
|
|
||||
|
describe(testName, function () { |
||||
|
describe(method, function () { |
||||
|
tests.forEach(function (test, index) { |
||||
|
it('sync test: ' + index, function () { |
||||
|
|
||||
|
// given
|
||||
|
var provider = new FakeHttpProvider(); |
||||
|
web3.setProvider(provider); |
||||
|
provider.injectResult(test.result); |
||||
|
provider.injectValidation(function (payload) { |
||||
|
assert.equal(payload.jsonrpc, '2.0'); |
||||
|
assert.equal(payload.method, test.call); |
||||
|
assert.deepEqual(payload.params, test.formattedArgs); |
||||
|
}); |
||||
|
|
||||
|
// when
|
||||
|
var result = (obj) |
||||
|
? web3[obj][method].apply(null, test.args.slice(0)) |
||||
|
: web3[method].apply(null, test.args.slice(0)); |
||||
|
|
||||
|
// then
|
||||
|
assert.deepEqual(test.formattedResult, result); |
||||
|
}); |
||||
|
|
||||
|
it('async test: ' + index, function (done) { |
||||
|
|
||||
|
// given
|
||||
|
var provider = new FakeHttpProvider(); |
||||
|
web3.setProvider(provider); |
||||
|
provider.injectResult(test.result); |
||||
|
provider.injectValidation(function (payload) { |
||||
|
assert.equal(payload.jsonrpc, '2.0'); |
||||
|
assert.equal(payload.method, test.call); |
||||
|
assert.deepEqual(payload.params, test.formattedArgs); |
||||
|
}); |
||||
|
|
||||
|
var args = test.args.slice(0); |
||||
|
// add callback
|
||||
|
args.push(function (err, result) { |
||||
|
assert.deepEqual(test.formattedResult, result); |
||||
|
done(); |
||||
|
}); |
||||
|
|
||||
|
// when
|
||||
|
if(obj) |
||||
|
web3[obj][method].apply(null, args); |
||||
|
else |
||||
|
web3[method].apply(null, args); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
}; |
||||
|
|
||||
|
module.exports = { |
||||
|
runTests: runTests |
||||
|
} |
||||
|
|
@ -1,13 +1,20 @@ |
|||||
var assert = require('assert'); |
var chai = require('chai'); |
||||
|
var assert = chai.assert; |
||||
|
var web3 = require('../../index'); |
||||
|
|
||||
|
var FakeHttpProvider = require('./FakeHttpProvider'); |
||||
|
|
||||
var methodExists = function (object, method) { |
var methodExists = function (object, method) { |
||||
it('should have method ' + method + ' implemented', function() { |
it('should have method ' + method + ' implemented', function() { |
||||
|
web3.setProvider(null); |
||||
assert.equal('function', typeof object[method], 'method ' + method + ' is not implemented'); |
assert.equal('function', typeof object[method], 'method ' + method + ' is not implemented'); |
||||
}); |
}); |
||||
}; |
}; |
||||
|
|
||||
var propertyExists = function (object, property) { |
var propertyExists = function (object, property) { |
||||
it('should have property ' + property + ' implemented', function() { |
it('should have property ' + property + ' implemented', function() { |
||||
|
// set dummy providor, to prevent error
|
||||
|
web3.setProvider(new FakeHttpProvider()); |
||||
assert.notEqual('undefined', typeof object[property], 'property ' + property + ' is not implemented'); |
assert.notEqual('undefined', typeof object[property], 'property ' + property + ' is not implemented'); |
||||
}); |
}); |
||||
}; |
}; |
@ -0,0 +1,33 @@ |
|||||
|
var chai = require('chai'); |
||||
|
var assert = chai.assert; |
||||
|
var SandboxedModule = require('sandboxed-module'); |
||||
|
|
||||
|
SandboxedModule.registerBuiltInSourceTransformer('istanbul'); |
||||
|
var HttpProvider = SandboxedModule.require('../lib/web3/httpprovider', { |
||||
|
requires: { |
||||
|
'xmlhttprequest': require('./helpers/FakeXMLHttpRequest') |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
describe('lib/web3/httpprovider', function () { |
||||
|
describe('send', function () { |
||||
|
it('should send basic request', function () { |
||||
|
var provider = new HttpProvider(); |
||||
|
var result = provider.send({}); |
||||
|
|
||||
|
assert.equal(typeof result, 'object'); |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
describe('sendAsync', function () { |
||||
|
it('should send basic async request', function (done) { |
||||
|
var provider = new HttpProvider(); |
||||
|
|
||||
|
provider.sendAsync({}, function (err, result) { |
||||
|
assert.equal(typeof result, 'object'); |
||||
|
done(); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
|
@ -0,0 +1,23 @@ |
|||||
|
var chai = require('chai'); |
||||
|
var assert = chai.assert; |
||||
|
var Jsonrpc = require('../lib/web3/jsonrpc'); |
||||
|
|
||||
|
describe('lib/web3/jsonrpc', function () { |
||||
|
describe('id', function () { |
||||
|
it('should increment the id', function () { |
||||
|
|
||||
|
// given
|
||||
|
var a = Jsonrpc.getInstance(); |
||||
|
var b = Jsonrpc.getInstance(); |
||||
|
var method = 'm'; |
||||
|
|
||||
|
// when
|
||||
|
var p1 = a.toPayload(method); |
||||
|
var p2 = b.toPayload(method); |
||||
|
|
||||
|
// then
|
||||
|
assert.equal(p2.id, p1.id + 1); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
|
@ -0,0 +1,44 @@ |
|||||
|
var chai = require('chai'); |
||||
|
var assert = chai.assert; |
||||
|
var Method = require('../lib/web3/method'); |
||||
|
var utils = require('../lib/utils/utils'); |
||||
|
|
||||
|
describe('lib/web3/method', function () { |
||||
|
describe('attachToObject', function () { |
||||
|
//it('attach simple function to an object', function () {
|
||||
|
|
||||
|
//// given
|
||||
|
//var method = new Method({
|
||||
|
//name: 'hello'
|
||||
|
//});
|
||||
|
//var object = {};
|
||||
|
//var func = function () { return 1; };
|
||||
|
|
||||
|
//// when
|
||||
|
//method.attachToObject(object, func);
|
||||
|
|
||||
|
//// then
|
||||
|
//assert.equal(utils.isFunction(object.hello), true);
|
||||
|
//assert.equal(object.hello(), 1);
|
||||
|
//});
|
||||
|
|
||||
|
//it('attach nested function to an object', function () {
|
||||
|
|
||||
|
//// given
|
||||
|
//var method = new Method({
|
||||
|
//name: 'hello.world'
|
||||
|
//});
|
||||
|
//var object = {};
|
||||
|
//var func = function () { return 1; };
|
||||
|
|
||||
|
//// when
|
||||
|
//method.attachToObject(object, func);
|
||||
|
|
||||
|
//// then
|
||||
|
//assert.equal(utils.isObject(object.hello), true);
|
||||
|
//assert.equal(utils.isFunction(object.hello.world), true);
|
||||
|
//assert.equal(object.hello.world(), 1);
|
||||
|
//});
|
||||
|
}); |
||||
|
}); |
||||
|
|
@ -0,0 +1,52 @@ |
|||||
|
var chai = require('chai'); |
||||
|
var assert = chai.assert; |
||||
|
var Method = require('../lib/web3/method'); |
||||
|
|
||||
|
describe('lib/web3/method', function () { |
||||
|
describe('extractCallback', function () { |
||||
|
it('should extract callback', function () { |
||||
|
|
||||
|
// given
|
||||
|
var method = new Method({}); |
||||
|
var callback = function () { }; |
||||
|
var args = [1, callback] |
||||
|
|
||||
|
// when
|
||||
|
var result = method.extractCallback(args); |
||||
|
|
||||
|
// then
|
||||
|
assert.equal(args.length, 1); |
||||
|
assert.equal(callback, result); |
||||
|
}); |
||||
|
|
||||
|
it('should extract callback created using newFunction', function () { |
||||
|
|
||||
|
// given
|
||||
|
var method = new Method({}); |
||||
|
var callback = new Function (); |
||||
|
var args = [1, callback] |
||||
|
|
||||
|
// when
|
||||
|
var result = method.extractCallback(args); |
||||
|
|
||||
|
// then
|
||||
|
assert.equal(args.length, 1); |
||||
|
assert.equal(callback, result); |
||||
|
}); |
||||
|
|
||||
|
it('should not extract the callback', function () { |
||||
|
|
||||
|
// given
|
||||
|
var method = new Method({}); |
||||
|
var args = [1, 2] |
||||
|
|
||||
|
// when
|
||||
|
var result = method.extractCallback(args); |
||||
|
|
||||
|
// then
|
||||
|
assert.equal(args.length, 2); |
||||
|
assert.equal(result, null); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
|
@ -0,0 +1,41 @@ |
|||||
|
var chai = require('chai'); |
||||
|
var assert = chai.assert; |
||||
|
var Method = require('../lib/web3/method'); |
||||
|
|
||||
|
describe('lib/web3/method', function () { |
||||
|
describe('formatInput', function () { |
||||
|
it('should format plain input', function () { |
||||
|
|
||||
|
// given
|
||||
|
var star = function (arg) { |
||||
|
return arg + '*'; |
||||
|
}; |
||||
|
|
||||
|
var method = new Method({ |
||||
|
inputFormatter: [star, star, star] |
||||
|
}); |
||||
|
var args = ['1','2','3']; |
||||
|
var expectedArgs = ['1*', '2*', '3*']; |
||||
|
|
||||
|
// when
|
||||
|
var result = method.formatInput(args); |
||||
|
|
||||
|
// then
|
||||
|
assert.deepEqual(result, expectedArgs); |
||||
|
}); |
||||
|
|
||||
|
it('should do nothing if there is no formatter', function () { |
||||
|
|
||||
|
// given
|
||||
|
var method = new Method({}); |
||||
|
var args = [1,2,3]; |
||||
|
|
||||
|
// when
|
||||
|
var result = method.formatInput(args); |
||||
|
|
||||
|
// then
|
||||
|
assert.deepEqual(result, args); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
|
@ -0,0 +1,43 @@ |
|||||
|
var chai = require('chai'); |
||||
|
var assert = chai.assert; |
||||
|
var Method = require('../lib/web3/method'); |
||||
|
|
||||
|
describe('lib/web3/method', function () { |
||||
|
describe('formatOutput', function () { |
||||
|
it('should format plain output', function () { |
||||
|
|
||||
|
// given
|
||||
|
var formatter = function (args) { |
||||
|
return args.map(function (arg) { |
||||
|
return arg + '*'; |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
var method = new Method({ |
||||
|
outputFormatter: formatter |
||||
|
}); |
||||
|
var args = ['1','2','3']; |
||||
|
var expectedArgs = ['1*', '2*', '3*']; |
||||
|
|
||||
|
// when
|
||||
|
var result = method.formatOutput(args); |
||||
|
|
||||
|
// then
|
||||
|
assert.deepEqual(result, expectedArgs); |
||||
|
}); |
||||
|
|
||||
|
it('should do nothing if there is no formatter', function () { |
||||
|
|
||||
|
// given
|
||||
|
var method = new Method({}); |
||||
|
var args = [1,2,3]; |
||||
|
|
||||
|
// when
|
||||
|
var result = method.formatOutput(args); |
||||
|
|
||||
|
// then
|
||||
|
assert.deepEqual(result, args); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
|
@ -0,0 +1,46 @@ |
|||||
|
var chai = require('chai'); |
||||
|
var assert = chai.assert; |
||||
|
var Method = require('../lib/web3/method'); |
||||
|
|
||||
|
describe('lib/web3/method', function () { |
||||
|
describe('getCall', function () { |
||||
|
it('should return call name', function () { |
||||
|
|
||||
|
// given
|
||||
|
var call = 'hello_call_world'; |
||||
|
var method = new Method({ |
||||
|
call: call |
||||
|
}); |
||||
|
|
||||
|
// when
|
||||
|
var result = method.getCall(); |
||||
|
|
||||
|
// then
|
||||
|
assert.equal(call, result); |
||||
|
}); |
||||
|
|
||||
|
it('should return call based on args', function () { |
||||
|
|
||||
|
// given
|
||||
|
var call = function (args) { |
||||
|
return args ? args.length.toString() : '0'; |
||||
|
}; |
||||
|
|
||||
|
var method = new Method({ |
||||
|
call: call |
||||
|
}); |
||||
|
|
||||
|
// when
|
||||
|
var r0 = method.getCall(); |
||||
|
var r1 = method.getCall([1]); |
||||
|
var r2 = method.getCall([1, 2]); |
||||
|
|
||||
|
// then
|
||||
|
assert.equal(r0, '0'); |
||||
|
assert.equal(r1, '1'); |
||||
|
assert.equal(r2, '2'); |
||||
|
|
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
|
@ -0,0 +1,47 @@ |
|||||
|
var chai = require('chai'); |
||||
|
var assert = chai.assert; |
||||
|
var Method = require('../lib/web3/method'); |
||||
|
var errors = require('../lib/web3/errors'); |
||||
|
|
||||
|
describe('lib/web3/method', function () { |
||||
|
describe('validateArgs', function () { |
||||
|
it('should pass', function () { |
||||
|
|
||||
|
// given
|
||||
|
var method = new Method({ |
||||
|
params: 1 |
||||
|
}); |
||||
|
|
||||
|
var args = [1]; |
||||
|
var args2 = ['heloas']; |
||||
|
|
||||
|
// when
|
||||
|
var test = function () { method.validateArgs(args); }; |
||||
|
var test2 = function () { method.validateArgs(args2); }; |
||||
|
|
||||
|
// then
|
||||
|
assert.doesNotThrow(test); |
||||
|
assert.doesNotThrow(test2); |
||||
|
}); |
||||
|
|
||||
|
it('should return call based on args', function () { |
||||
|
|
||||
|
// given
|
||||
|
var method = new Method({ |
||||
|
params: 2 |
||||
|
}); |
||||
|
|
||||
|
var args = [1]; |
||||
|
var args2 = ['heloas', '12', 3]; |
||||
|
|
||||
|
// when
|
||||
|
var test = function () { method.validateArgs(args); }; |
||||
|
var test2 = function () { method.validateArgs(args2); }; |
||||
|
|
||||
|
// then
|
||||
|
assert.throws(test, errors.InvalidNumberOfParams); |
||||
|
assert.throws(test2, errors.InvalidNumberOfParams); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
|
@ -1,2 +1 @@ |
|||||
--reporter spec |
--reporter spec |
||||
|
|
||||
|
@ -1,10 +0,0 @@ |
|||||
var assert = require('assert'); |
|
||||
var web3 = require('../index.js'); |
|
||||
var u = require('./test.utils.js'); |
|
||||
|
|
||||
describe('web3', function() { |
|
||||
describe('net', function() { |
|
||||
u.propertyExists(web3.net, 'listening'); |
|
||||
u.propertyExists(web3.net, 'peerCount'); |
|
||||
}); |
|
||||
}); |
|
@ -0,0 +1,5 @@ |
|||||
|
var web3 = require('ethereum.js'); |
||||
|
|
||||
|
console.log(web3.version.api); |
||||
|
|
||||
|
|
@ -0,0 +1,14 @@ |
|||||
|
{ |
||||
|
"name": "node", |
||||
|
"version": "1.0.0", |
||||
|
"description": "", |
||||
|
"main": "app.js", |
||||
|
"scripts": { |
||||
|
"test": "echo \"Error: no test specified\" && exit 1" |
||||
|
}, |
||||
|
"author": "", |
||||
|
"license": "ISC", |
||||
|
"dependencies": { |
||||
|
"ethereum.js": "ethereum/ethereum.js#master" |
||||
|
} |
||||
|
} |
@ -0,0 +1,69 @@ |
|||||
|
var chai = require('chai'); |
||||
|
var assert = chai.assert; |
||||
|
var web3 = require('../index'); |
||||
|
var FakeHttpProvider = require('./helpers/FakeHttpProvider'); |
||||
|
var utils = require('../lib/utils/utils'); |
||||
|
|
||||
|
var tests = [{ |
||||
|
protocol: 'eth', |
||||
|
args: ['pending'], |
||||
|
firstResult: 1, |
||||
|
firstPayload: { |
||||
|
method: "eth_newBlockFilter", |
||||
|
params: [ |
||||
|
"pending" |
||||
|
] |
||||
|
}, |
||||
|
secondResult: [null], |
||||
|
secondPayload: { |
||||
|
method: "eth_getFilterChanges" |
||||
|
} |
||||
|
}]; |
||||
|
|
||||
|
|
||||
|
var testPolling = function (tests) { |
||||
|
|
||||
|
describe('web3.eth.filter.polling', function () { |
||||
|
tests.forEach(function (test, index) { |
||||
|
it('should create && successfully poll filter', function (done) { |
||||
|
|
||||
|
// given
|
||||
|
var provider = new FakeHttpProvider(); |
||||
|
web3.setProvider(provider); |
||||
|
web3.reset(); |
||||
|
provider.injectResult(test.firstResult); |
||||
|
var step = 0; |
||||
|
provider.injectValidation(function (payload) { |
||||
|
if (step === 0) { |
||||
|
step = 1; |
||||
|
assert.equal(payload.jsonrpc, '2.0'); |
||||
|
assert.equal(payload.method, test.firstPayload.method); |
||||
|
assert.deepEqual(payload.params, test.firstPayload.params); |
||||
|
} else if (step === 1 && utils.isArray(payload)) { |
||||
|
var r = payload.filter(function (p) { |
||||
|
return p.jsonrpc === '2.0' && p.method === test.secondPayload.method && p.params[0] === test.firstResult; |
||||
|
}); |
||||
|
assert.equal(r.length > 0, true); |
||||
|
} |
||||
|
|
||||
|
}); |
||||
|
|
||||
|
// when
|
||||
|
var filter = web3[test.protocol].filter.apply(null, test.args); |
||||
|
provider.injectBatchResults([test.secondResult]); |
||||
|
filter.watch(function (err, result) { |
||||
|
if (test.err) { |
||||
|
// todo
|
||||
|
} else { |
||||
|
assert.equal(result, test.secondResult[0]); |
||||
|
} |
||||
|
done(); |
||||
|
|
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
testPolling(tests); |
||||
|
|
@ -0,0 +1,22 @@ |
|||||
|
var chai = require('chai'); |
||||
|
var assert = chai.assert; |
||||
|
var SandboxedModule = require('sandboxed-module'); |
||||
|
|
||||
|
SandboxedModule.registerBuiltInSourceTransformer('istanbul'); |
||||
|
var QtSyncProvider = SandboxedModule.require('../lib/web3/qtsync', { |
||||
|
globals: { |
||||
|
navigator: require('./helpers/FakeQtNavigator') |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
describe('/lib/web3/qtsyncprovider', function () { |
||||
|
describe('send', function () { |
||||
|
it('should send basic request', function () { |
||||
|
var provider = new QtSyncProvider(); |
||||
|
var result = provider.send({}); |
||||
|
|
||||
|
assert.equal(typeof result, 'object'); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
|
@ -0,0 +1,44 @@ |
|||||
|
var chai = require('chai'); |
||||
|
var assert = chai.assert; |
||||
|
var RequestManager = require('../lib/web3/requestmanager'); |
||||
|
var FakeHttpProvider = require('./helpers/FakeHttpProvider'); |
||||
|
|
||||
|
// TODO: handling errors!
|
||||
|
// TODO: validation of params!
|
||||
|
|
||||
|
describe('lib/web3/requestmanager', function () { |
||||
|
describe('send', function () { |
||||
|
it('should return expected result synchronously', function () { |
||||
|
var provider = new FakeHttpProvider(); |
||||
|
var manager = RequestManager.getInstance(); |
||||
|
manager.setProvider(provider); |
||||
|
var expected = 'hello_world'; |
||||
|
provider.injectResult(expected); |
||||
|
|
||||
|
var result = manager.send({ |
||||
|
method: 'test', |
||||
|
params: [1,2,3] |
||||
|
}); |
||||
|
|
||||
|
assert.equal(expected, result); |
||||
|
}); |
||||
|
|
||||
|
it('should return expected result asynchronously', function (done) { |
||||
|
var provider = new FakeHttpProvider(); |
||||
|
var manager = RequestManager.getInstance(); |
||||
|
manager.setProvider(provider); |
||||
|
var expected = 'hello_world'; |
||||
|
provider.injectResult(expected); |
||||
|
|
||||
|
manager.sendAsync({ |
||||
|
method: 'test', |
||||
|
params: [1,2,3] |
||||
|
}, function (error, result) { |
||||
|
assert.equal(error, null); |
||||
|
assert.equal(expected, result); |
||||
|
done(); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
|
@ -0,0 +1,45 @@ |
|||||
|
var chai = require('chai'); |
||||
|
var web3 = require('../index'); |
||||
|
var assert = chai.assert; |
||||
|
var FakeHttpProvider = require('./helpers/FakeHttpProvider'); |
||||
|
|
||||
|
var method = 'filter'; |
||||
|
|
||||
|
var tests = [{ |
||||
|
args: [{ |
||||
|
to: '0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', |
||||
|
topics: ['0x324f5435', '0x564b4566f3453'] |
||||
|
}], |
||||
|
formattedArgs: [{ |
||||
|
to: '0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', |
||||
|
topics: ['0x324f5435', '0x564b4566f3453'] |
||||
|
}], |
||||
|
result: '0xf', |
||||
|
formattedResult: '0xf', |
||||
|
call: 'shh_newFilter' |
||||
|
}]; |
||||
|
|
||||
|
describe('shh', function () { |
||||
|
describe(method, function () { |
||||
|
tests.forEach(function (test, index) { |
||||
|
it('property test: ' + index, function () { |
||||
|
|
||||
|
// given
|
||||
|
var provider = new FakeHttpProvider(); |
||||
|
web3.setProvider(provider); |
||||
|
provider.injectResult(test.result); |
||||
|
provider.injectValidation(function (payload) { |
||||
|
assert.equal(payload.jsonrpc, '2.0'); |
||||
|
assert.equal(payload.method, test.call); |
||||
|
assert.deepEqual(payload.params, test.formattedArgs); |
||||
|
}); |
||||
|
|
||||
|
// call
|
||||
|
web3.shh[method].apply(null, test.args); |
||||
|
|
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
|
@ -0,0 +1,16 @@ |
|||||
|
var chai = require('chai'); |
||||
|
var web3 = require('../index'); |
||||
|
var testMethod = require('./helpers/test.method.js'); |
||||
|
|
||||
|
var method = 'hasIdentity'; |
||||
|
|
||||
|
var tests = [{ |
||||
|
args: ['0x2dbab4c0612bf9caf4c195085547dc0612bf9caf4c1950855'], |
||||
|
formattedArgs: ['0x2dbab4c0612bf9caf4c195085547dc0612bf9caf4c1950855'], |
||||
|
result: true, |
||||
|
formattedResult: true, |
||||
|
call: 'shh_'+ method |
||||
|
}]; |
||||
|
|
||||
|
testMethod.runTests('shh', method, tests); |
||||
|
|
@ -0,0 +1,48 @@ |
|||||
|
var chai = require('chai'); |
||||
|
var assert = chai.assert; |
||||
|
var utils = require('../lib/utils/utils'); |
||||
|
var FakeHttpProvider = require('./helpers/FakeHttpProvider'); |
||||
|
var signature = require('../lib/web3/signature'); |
||||
|
var web3 = require('../index'); |
||||
|
|
||||
|
var tests = [{ |
||||
|
method: 'functionSignatureFromAscii', |
||||
|
call: 'web3_sha3', |
||||
|
request: 'multiply', |
||||
|
formattedRequest: utils.fromAscii('multiply'), |
||||
|
result: '0x255d31552d29a21e93334e96055c6dca7cd329f5420ae74ec166d0c47f9f9843', |
||||
|
formattedResult: '0x255d3155' |
||||
|
},{ |
||||
|
method: 'eventSignatureFromAscii', |
||||
|
call: 'web3_sha3', |
||||
|
request: 'multiply', |
||||
|
formattedRequest: utils.fromAscii('multiply'), |
||||
|
result: '0x255d31552d29a21e93334e96055c6dca7cd329f5420ae74ec166d0c47f9f9843', |
||||
|
formattedResult: '0x255d31552d29a21e93334e96055c6dca7cd329f5420ae74ec166d0c47f9f9843' |
||||
|
}]; |
||||
|
|
||||
|
describe('lib/web3/signature', function () { |
||||
|
tests.forEach(function (test, index) { |
||||
|
describe(test.method, function () { |
||||
|
it('should properly format and return signature of solidity functioni ' + index, function () { |
||||
|
|
||||
|
// given
|
||||
|
var provider = new FakeHttpProvider(); |
||||
|
web3.setProvider(provider); |
||||
|
provider.injectResult(test.result); |
||||
|
provider.injectValidation(function (payload) { |
||||
|
assert.equal(payload.method, test.call); |
||||
|
assert.equal(payload.jsonrpc, '2.0'); |
||||
|
assert.equal(payload.params[0], test.formattedRequest); |
||||
|
}); |
||||
|
|
||||
|
// when
|
||||
|
var result = signature[test.method].call(null, test.request); |
||||
|
|
||||
|
// then
|
||||
|
assert.equal(result, test.formattedResult); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
|
@ -0,0 +1,26 @@ |
|||||
|
var chai = require('chai'); |
||||
|
var utils = require('../lib/utils/utils.js'); |
||||
|
var assert = chai.assert; |
||||
|
|
||||
|
var tests = [ |
||||
|
{ obj: function () {}, is: false}, |
||||
|
{ obj: new Function(), is: false}, |
||||
|
{ obj: 'function', is: false}, |
||||
|
{ obj: {}, is: false}, |
||||
|
{ obj: '[]', is: true}, |
||||
|
{ obj: '[1, 2]', is: true}, |
||||
|
{ obj: '{}', is: true}, |
||||
|
{ obj: '{"a": 123, "b" :3,}', is: false}, |
||||
|
{ obj: '{"c" : 2}', is: true} |
||||
|
]; |
||||
|
|
||||
|
describe('lib/utils/utils', function () { |
||||
|
describe('isJson', function () { |
||||
|
tests.forEach(function (test) { |
||||
|
it('shoud test if value ' + test.obj + ' is json: ' + test.is, function () { |
||||
|
assert.equal(utils.isJson(test.obj), test.is); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
|
@ -0,0 +1,14 @@ |
|||||
|
var testMethod = require('./helpers/test.method.js'); |
||||
|
|
||||
|
var method = 'getHex'; |
||||
|
|
||||
|
var tests = [{ |
||||
|
args: ['myDB', 'myKey'], |
||||
|
formattedArgs: ['myDB', 'myKey'], |
||||
|
result: '0xf', |
||||
|
formattedResult: '0xf', |
||||
|
call: 'db_'+ method |
||||
|
}]; |
||||
|
|
||||
|
testMethod.runTests('db', method, tests); |
||||
|
|
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue