Browse Source
Merge branch 'develop' of github.com:ethereum/cpp-ethereum into develop Conflicts: libweb3jsonrpc/WebThreeStubServerBase.cppcl-refactor
Gav Wood
10 years ago
98 changed files with 5667 additions and 2786 deletions
@ -1,13 +1,17 @@ |
|||
language: node_js |
|||
node_js: |
|||
- "0.12" |
|||
- "0.11" |
|||
- "0.10" |
|||
before_script: |
|||
- npm install |
|||
- npm install jshint |
|||
- export DISPLAY=:99.0 |
|||
- sh -e /etc/init.d/xvfb start |
|||
script: |
|||
- "jshint *.js lib" |
|||
after_script: |
|||
- npm run-script build |
|||
- npm run-script karma |
|||
- npm run-script test-coveralls |
|||
|
|||
|
@ -0,0 +1,4 @@ |
|||
3stack:bignumber@2.0.0 |
|||
ethereum:js@0.0.15-rc12 |
|||
meteor@1.1.4 |
|||
underscore@1.0.2 |
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
@ -1,7 +1,7 @@ |
|||
var web3 = require('./lib/web3'); |
|||
web3.providers.HttpSyncProvider = require('./lib/httpsync'); |
|||
web3.providers.QtSyncProvider = require('./lib/qtsync'); |
|||
web3.eth.contract = require('./lib/contract'); |
|||
web3.abi = require('./lib/abi'); |
|||
web3.providers.HttpProvider = require('./lib/web3/httpprovider'); |
|||
web3.providers.QtSyncProvider = require('./lib/web3/qtsync'); |
|||
web3.eth.contract = require('./lib/web3/contract'); |
|||
web3.abi = require('./lib/solidity/abi'); |
|||
|
|||
module.exports = web3; |
|||
|
@ -0,0 +1,96 @@ |
|||
// Karma configuration
|
|||
// Generated on Thu Feb 19 2015 19:57:47 GMT+0100 (W. Europe Standard Time)
|
|||
|
|||
module.exports = function (config) { |
|||
config.set({ |
|||
|
|||
// base path that will be used to resolve all patterns (eg. files, exclude)
|
|||
basePath: '', |
|||
|
|||
// level of logging
|
|||
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
|
|||
|
|||
// Continuous Integration mode
|
|||
// if true, Karma captures browsers, runs the tests and exits
|
|||
singleRun: true, logLevel: config.LOG_INFO, |
|||
//singleRun: true, logLevel: config.LOG_DEBUG,
|
|||
|
|||
// frameworks to use
|
|||
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
|
|||
frameworks: ['browserify', 'mocha'], |
|||
|
|||
|
|||
// list of files / patterns to load in the browser
|
|||
files: [ |
|||
'node_modules/bignumber.js/bignumber.js', |
|||
'test/*.js', |
|||
], |
|||
|
|||
|
|||
// list of files to exclude
|
|||
exclude: [ |
|||
], |
|||
|
|||
client: { |
|||
mocha: { |
|||
//ui: 'tdd'
|
|||
timeout: 5000 // especially for the post requests
|
|||
} |
|||
}, |
|||
browserify: { |
|||
bundleDelay: 750, |
|||
debug: true |
|||
// transform: [],
|
|||
// //extensions: ['.js']
|
|||
}, |
|||
|
|||
// preprocess matching files before serving them to the browser
|
|||
// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
|
|||
preprocessors: { |
|||
'test/*.js': ['browserify'] |
|||
}, |
|||
|
|||
|
|||
// test results reporter to use
|
|||
// possible values: 'dots', 'progress'
|
|||
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
|
|||
reporters: ['dots'], |
|||
|
|||
|
|||
// web server port
|
|||
port: 9876, |
|||
|
|||
|
|||
// enable / disable colors in the output (reporters and logs)
|
|||
colors: true, |
|||
|
|||
|
|||
// enable / disable watching file and executing tests whenever any file changes
|
|||
autoWatch: true, |
|||
|
|||
|
|||
// start these browsers
|
|||
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
|
|||
// // Chrome
|
|||
// // PhantomJS
|
|||
browsers: ['Chrome', 'Safari', 'Firefox'], |
|||
browserNoActivityTimeout: 10000, |
|||
browserDisconnectTimeout: 5000, |
|||
|
|||
customLaunchers: { |
|||
chromeWithoutSecurity: { |
|||
base: 'Chrome', |
|||
flags: ['--disable-web-security'] |
|||
}, |
|||
|
|||
IE9: { |
|||
base: 'IE', |
|||
'x-ua-compatible': 'IE=EmulateIE9' |
|||
}, |
|||
IE8: { |
|||
base: 'IE', |
|||
'x-ua-compatible': 'IE=EmulateIE8' |
|||
} |
|||
} |
|||
}); |
|||
}; |
@ -1,85 +0,0 @@ |
|||
/* |
|||
This file is part of ethereum.js. |
|||
|
|||
ethereum.js is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU Lesser General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
ethereum.js is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU Lesser General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU Lesser General Public License |
|||
along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
/** @file eth.js |
|||
* @authors: |
|||
* Marek Kotewicz <marek@ethdev.com> |
|||
* @date 2015 |
|||
*/ |
|||
|
|||
/// @returns an array of objects describing web3.eth api methods
|
|||
var methods = function () { |
|||
var blockCall = function (args) { |
|||
return typeof args[0] === "string" ? "eth_blockByHash" : "eth_blockByNumber"; |
|||
}; |
|||
|
|||
var transactionCall = function (args) { |
|||
return typeof args[0] === "string" ? 'eth_transactionByHash' : 'eth_transactionByNumber'; |
|||
}; |
|||
|
|||
var uncleCall = function (args) { |
|||
return typeof args[0] === "string" ? 'eth_uncleByHash' : 'eth_uncleByNumber'; |
|||
}; |
|||
|
|||
var transactionCountCall = function (args) { |
|||
return typeof args[0] === "string" ? 'eth_transactionCountByHash' : 'eth_transactionCountByNumber'; |
|||
}; |
|||
|
|||
var uncleCountCall = function (args) { |
|||
return typeof args[0] === "string" ? 'eth_uncleCountByHash' : 'eth_uncleCountByNumber'; |
|||
}; |
|||
|
|||
return [ |
|||
{ name: 'balanceAt', call: 'eth_balanceAt' }, |
|||
{ name: 'stateAt', call: 'eth_stateAt' }, |
|||
{ name: 'storageAt', call: 'eth_storageAt' }, |
|||
{ name: 'countAt', call: 'eth_countAt'}, |
|||
{ name: 'codeAt', call: 'eth_codeAt' }, |
|||
{ name: 'transact', call: 'eth_transact' }, |
|||
{ name: 'call', call: 'eth_call' }, |
|||
{ name: 'block', call: blockCall }, |
|||
{ name: 'transaction', call: transactionCall }, |
|||
{ name: 'uncle', call: uncleCall }, |
|||
{ name: 'compilers', call: 'eth_compilers' }, |
|||
{ name: 'flush', call: 'eth_flush' }, |
|||
{ name: 'lll', call: 'eth_lll' }, |
|||
{ name: 'solidity', call: 'eth_solidity' }, |
|||
{ name: 'serpent', call: 'eth_serpent' }, |
|||
{ name: 'logs', call: 'eth_logs' }, |
|||
{ name: 'transactionCount', call: transactionCountCall }, |
|||
{ name: 'uncleCount', call: uncleCountCall } |
|||
]; |
|||
}; |
|||
|
|||
/// @returns an array of objects describing web3.eth api properties
|
|||
var properties = function () { |
|||
return [ |
|||
{ name: 'coinbase', getter: 'eth_coinbase', setter: 'eth_setCoinbase' }, |
|||
{ name: 'listening', getter: 'eth_listening', setter: 'eth_setListening' }, |
|||
{ name: 'mining', getter: 'eth_mining', setter: 'eth_setMining' }, |
|||
{ name: 'gasPrice', getter: 'eth_gasPrice' }, |
|||
{ name: 'accounts', getter: 'eth_accounts' }, |
|||
{ name: 'peerCount', getter: 'eth_peerCount' }, |
|||
{ name: 'defaultBlock', getter: 'eth_defaultBlock', setter: 'eth_setDefaultBlock' }, |
|||
{ name: 'number', getter: 'eth_number'} |
|||
]; |
|||
}; |
|||
|
|||
module.exports = { |
|||
methods: methods, |
|||
properties: properties |
|||
}; |
|||
|
@ -1,18 +0,0 @@ |
|||
var addressName = {"0x12378912345789": "Gav", "0x57835893478594739854": "Jeff"}; |
|||
var nameAddress = {}; |
|||
|
|||
for (var prop in addressName) { |
|||
if (addressName.hasOwnProperty(prop)) { |
|||
nameAddress[addressName[prop]] = prop; |
|||
} |
|||
} |
|||
|
|||
var local = { |
|||
addressBook:{ |
|||
byName: addressName, |
|||
byAddress: nameAddress |
|||
} |
|||
}; |
|||
|
|||
if (typeof(module) !== "undefined") |
|||
module.exports = local; |
@ -1,112 +0,0 @@ |
|||
/* |
|||
This file is part of ethereum.js. |
|||
|
|||
ethereum.js is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU Lesser General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
ethereum.js is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU Lesser General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU Lesser General Public License |
|||
along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
/** @file requestmanager.js |
|||
* @authors: |
|||
* Jeffrey Wilcke <jeff@ethdev.com> |
|||
* Marek Kotewicz <marek@ethdev.com> |
|||
* Marian Oancea <marian@ethdev.com> |
|||
* Gav Wood <g@ethdev.com> |
|||
* @date 2014 |
|||
*/ |
|||
|
|||
var jsonrpc = require('./jsonrpc'); |
|||
var c = require('./const'); |
|||
|
|||
/** |
|||
* It's responsible for passing messages to providers |
|||
* It's also responsible for polling the ethereum node for incoming messages |
|||
* Default poll timeout is 1 second |
|||
*/ |
|||
var requestManager = function() { |
|||
var polls = []; |
|||
var timeout = null; |
|||
var provider; |
|||
|
|||
var send = function (data) { |
|||
var payload = jsonrpc.toPayload(data.method, data.params); |
|||
|
|||
if (!provider) { |
|||
console.error('provider is not set'); |
|||
return null; |
|||
} |
|||
|
|||
var result = provider.send(payload); |
|||
|
|||
if (!jsonrpc.isValidResponse(result)) { |
|||
console.log(result); |
|||
return null; |
|||
} |
|||
|
|||
return result.result; |
|||
}; |
|||
|
|||
var setProvider = function (p) { |
|||
provider = p; |
|||
}; |
|||
|
|||
/*jshint maxparams:4 */ |
|||
var startPolling = function (data, pollId, callback, uninstall) { |
|||
polls.push({data: data, id: pollId, callback: callback, uninstall: uninstall}); |
|||
}; |
|||
/*jshint maxparams:3 */ |
|||
|
|||
var stopPolling = function (pollId) { |
|||
for (var i = polls.length; i--;) { |
|||
var poll = polls[i]; |
|||
if (poll.id === pollId) { |
|||
polls.splice(i, 1); |
|||
} |
|||
} |
|||
}; |
|||
|
|||
var reset = function () { |
|||
polls.forEach(function (poll) { |
|||
poll.uninstall(poll.id); |
|||
}); |
|||
polls = []; |
|||
|
|||
if (timeout) { |
|||
clearTimeout(timeout); |
|||
timeout = null; |
|||
} |
|||
poll(); |
|||
}; |
|||
|
|||
var poll = function () { |
|||
polls.forEach(function (data) { |
|||
var result = send(data.data); |
|||
if (!(result instanceof Array) || result.length === 0) { |
|||
return; |
|||
} |
|||
data.callback(result); |
|||
}); |
|||
timeout = setTimeout(poll, c.ETH_POLLING_TIMEOUT); |
|||
}; |
|||
|
|||
poll(); |
|||
|
|||
return { |
|||
send: send, |
|||
setProvider: setProvider, |
|||
startPolling: startPolling, |
|||
stopPolling: stopPolling, |
|||
reset: reset |
|||
}; |
|||
}; |
|||
|
|||
module.exports = requestManager; |
|||
|
@ -1,143 +0,0 @@ |
|||
/* |
|||
This file is part of ethereum.js. |
|||
|
|||
ethereum.js is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU Lesser General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
ethereum.js is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU Lesser General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU Lesser General Public License |
|||
along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
/** @file utils.js |
|||
* @authors: |
|||
* Marek Kotewicz <marek@ethdev.com> |
|||
* @date 2015 |
|||
*/ |
|||
|
|||
var c = require('./const'); |
|||
|
|||
/// Finds first index of array element matching pattern
|
|||
/// @param array
|
|||
/// @param callback pattern
|
|||
/// @returns index of element
|
|||
var findIndex = function (array, callback) { |
|||
var end = false; |
|||
var i = 0; |
|||
for (; i < array.length && !end; i++) { |
|||
end = callback(array[i]); |
|||
} |
|||
return end ? i - 1 : -1; |
|||
}; |
|||
|
|||
/// @returns ascii string representation of hex value prefixed with 0x
|
|||
var toAscii = function(hex) { |
|||
// Find termination
|
|||
var str = ""; |
|||
var i = 0, l = hex.length; |
|||
if (hex.substring(0, 2) === '0x') { |
|||
i = 2; |
|||
} |
|||
for (; i < l; i+=2) { |
|||
var code = parseInt(hex.substr(i, 2), 16); |
|||
if (code === 0) { |
|||
break; |
|||
} |
|||
|
|||
str += String.fromCharCode(code); |
|||
} |
|||
|
|||
return str; |
|||
}; |
|||
|
|||
var toHex = function(str) { |
|||
var hex = ""; |
|||
for(var i = 0; i < str.length; i++) { |
|||
var n = str.charCodeAt(i).toString(16); |
|||
hex += n.length < 2 ? '0' + n : n; |
|||
} |
|||
|
|||
return hex; |
|||
}; |
|||
|
|||
/// @returns hex representation (prefixed by 0x) of ascii string
|
|||
var fromAscii = function(str, pad) { |
|||
pad = pad === undefined ? 0 : pad; |
|||
var hex = toHex(str); |
|||
while (hex.length < pad*2) |
|||
hex += "00"; |
|||
return "0x" + hex; |
|||
}; |
|||
|
|||
/// @returns display name for function/event eg. multiply(uint256) -> multiply
|
|||
var extractDisplayName = function (name) { |
|||
var length = name.indexOf('('); |
|||
return length !== -1 ? name.substr(0, length) : name; |
|||
}; |
|||
|
|||
/// @returns overloaded part of function/event name
|
|||
var extractTypeName = function (name) { |
|||
/// TODO: make it invulnerable
|
|||
var length = name.indexOf('('); |
|||
return length !== -1 ? name.substr(length + 1, name.length - 1 - (length + 1)).replace(' ', '') : ""; |
|||
}; |
|||
|
|||
/// Filters all function from input abi
|
|||
/// @returns abi array with filtered objects of type 'function'
|
|||
var filterFunctions = function (json) { |
|||
return json.filter(function (current) { |
|||
return current.type === 'function'; |
|||
}); |
|||
}; |
|||
|
|||
/// Filters all events form input abi
|
|||
/// @returns abi array with filtered objects of type 'event'
|
|||
var filterEvents = function (json) { |
|||
return json.filter(function (current) { |
|||
return current.type === 'event'; |
|||
}); |
|||
}; |
|||
|
|||
/// used to transform value/string to eth string
|
|||
/// TODO: use BigNumber.js to parse int
|
|||
/// TODO: add tests for it!
|
|||
var toEth = function (str) { |
|||
/*jshint maxcomplexity:7 */ |
|||
var val = typeof str === "string" ? str.indexOf('0x') === 0 ? parseInt(str.substr(2), 16) : parseInt(str) : str; |
|||
var unit = 0; |
|||
var units = c.ETH_UNITS; |
|||
while (val > 3000 && unit < units.length - 1) |
|||
{ |
|||
val /= 1000; |
|||
unit++; |
|||
} |
|||
var s = val.toString().length < val.toFixed(2).length ? val.toString() : val.toFixed(2); |
|||
var replaceFunction = function($0, $1, $2) { |
|||
return $1 + ',' + $2; |
|||
}; |
|||
|
|||
while (true) { |
|||
var o = s; |
|||
s = s.replace(/(\d)(\d\d\d[\.\,])/, replaceFunction); |
|||
if (o === s) |
|||
break; |
|||
} |
|||
return s + ' ' + units[unit]; |
|||
}; |
|||
|
|||
module.exports = { |
|||
findIndex: findIndex, |
|||
toAscii: toAscii, |
|||
fromAscii: fromAscii, |
|||
extractDisplayName: extractDisplayName, |
|||
extractTypeName: extractTypeName, |
|||
filterFunctions: filterFunctions, |
|||
filterEvents: filterEvents, |
|||
toEth: toEth |
|||
}; |
|||
|
@ -0,0 +1,448 @@ |
|||
/* |
|||
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 utils.js |
|||
* @authors: |
|||
* Marek Kotewicz <marek@ethdev.com> |
|||
* @date 2015 |
|||
*/ |
|||
|
|||
/** |
|||
* Utils |
|||
* |
|||
* @module utils |
|||
*/ |
|||
|
|||
/** |
|||
* Utility functions |
|||
* |
|||
* @class [utils] utils |
|||
* @constructor |
|||
*/ |
|||
|
|||
if (process.env.NODE_ENV !== 'build') { |
|||
var BigNumber = require('bignumber.js'); // jshint ignore:line
|
|||
} |
|||
|
|||
var unitMap = { |
|||
'wei': '1', |
|||
'kwei': '1000', |
|||
'ada': '1000', |
|||
'mwei': '1000000', |
|||
'babbage': '1000000', |
|||
'gwei': '1000000000', |
|||
'shannon': '1000000000', |
|||
'szabo': '1000000000000', |
|||
'finney': '1000000000000000', |
|||
'ether': '1000000000000000000', |
|||
'kether': '1000000000000000000000', |
|||
'grand': '1000000000000000000000', |
|||
'einstein': '1000000000000000000000', |
|||
'mether': '1000000000000000000000000', |
|||
'gether': '1000000000000000000000000000', |
|||
'tether': '1000000000000000000000000000000' |
|||
}; |
|||
|
|||
|
|||
/** Finds first index of array element matching pattern |
|||
* |
|||
* @method findIndex |
|||
* @param {Array} |
|||
* @param {Function} pattern |
|||
* @returns {Number} index of element |
|||
*/ |
|||
var findIndex = function (array, callback) { |
|||
var end = false; |
|||
var i = 0; |
|||
for (; i < array.length && !end; i++) { |
|||
end = callback(array[i]); |
|||
} |
|||
return end ? i - 1 : -1; |
|||
}; |
|||
|
|||
/** |
|||
* Should be called to get sting from it's hex representation |
|||
* |
|||
* @method toAscii |
|||
* @param {String} string in hex |
|||
* @returns {String} ascii string representation of hex value |
|||
*/ |
|||
var toAscii = function(hex) { |
|||
// Find termination
|
|||
var str = ""; |
|||
var i = 0, l = hex.length; |
|||
if (hex.substring(0, 2) === '0x') { |
|||
i = 2; |
|||
} |
|||
for (; i < l; i+=2) { |
|||
var code = parseInt(hex.substr(i, 2), 16); |
|||
if (code === 0) { |
|||
break; |
|||
} |
|||
|
|||
str += String.fromCharCode(code); |
|||
} |
|||
|
|||
return str; |
|||
}; |
|||
|
|||
/** |
|||
* Shold be called to get hex representation (prefixed by 0x) of ascii string |
|||
* |
|||
* @method fromAscii |
|||
* @param {String} string |
|||
* @returns {String} hex representation of input string |
|||
*/ |
|||
var toHexNative = function(str) { |
|||
var hex = ""; |
|||
for(var i = 0; i < str.length; i++) { |
|||
var n = str.charCodeAt(i).toString(16); |
|||
hex += n.length < 2 ? '0' + n : n; |
|||
} |
|||
|
|||
return hex; |
|||
}; |
|||
|
|||
/** |
|||
* Shold be called to get hex representation (prefixed by 0x) of ascii string |
|||
* |
|||
* @method fromAscii |
|||
* @param {String} string |
|||
* @param {Number} optional padding |
|||
* @returns {String} hex representation of input string |
|||
*/ |
|||
var fromAscii = function(str, pad) { |
|||
pad = pad === undefined ? 0 : pad; |
|||
var hex = toHexNative(str); |
|||
while (hex.length < pad*2) |
|||
hex += "00"; |
|||
return "0x" + hex; |
|||
}; |
|||
|
|||
/** |
|||
* Should be called to get display name of contract function |
|||
* |
|||
* @method extractDisplayName |
|||
* @param {String} name of function/event |
|||
* @returns {String} display name for function/event eg. multiply(uint256) -> multiply |
|||
*/ |
|||
var extractDisplayName = function (name) { |
|||
var length = name.indexOf('('); |
|||
return length !== -1 ? name.substr(0, length) : name; |
|||
}; |
|||
|
|||
/// @returns overloaded part of function/event name
|
|||
var extractTypeName = function (name) { |
|||
/// TODO: make it invulnerable
|
|||
var length = name.indexOf('('); |
|||
return length !== -1 ? name.substr(length + 1, name.length - 1 - (length + 1)).replace(' ', '') : ""; |
|||
}; |
|||
|
|||
/** |
|||
* Filters all functions from input abi |
|||
* |
|||
* @method filterFunctions |
|||
* @param {Array} abi |
|||
* @returns {Array} abi array with filtered objects of type 'function' |
|||
*/ |
|||
var filterFunctions = function (json) { |
|||
return json.filter(function (current) { |
|||
return current.type === 'function'; |
|||
}); |
|||
}; |
|||
|
|||
/** |
|||
* Filters all events from input abi |
|||
* |
|||
* @method filterEvents |
|||
* @param {Array} abi |
|||
* @returns {Array} abi array with filtered objects of type 'event' |
|||
*/ |
|||
var filterEvents = function (json) { |
|||
return json.filter(function (current) { |
|||
return current.type === 'event'; |
|||
}); |
|||
}; |
|||
|
|||
/** |
|||
* Converts value to it's decimal representation in string |
|||
* |
|||
* @method toDecimal |
|||
* @param {String|Number|BigNumber} |
|||
* @return {String} |
|||
*/ |
|||
var toDecimal = function (value) { |
|||
return toBigNumber(value).toNumber(); |
|||
}; |
|||
|
|||
/** |
|||
* Converts value to it's hex representation |
|||
* |
|||
* @method fromDecimal |
|||
* @param {String|Number|BigNumber} |
|||
* @return {String} |
|||
*/ |
|||
var fromDecimal = function (value) { |
|||
var number = toBigNumber(value); |
|||
var result = number.toString(16); |
|||
|
|||
return number.lessThan(0) ? '-0x' + result.substr(1) : '0x' + result; |
|||
}; |
|||
|
|||
/** |
|||
* Auto converts any given value into it's hex representation. |
|||
* |
|||
* And even stringifys objects before. |
|||
* |
|||
* @method toHex |
|||
* @param {String|Number|BigNumber|Object} |
|||
* @return {String} |
|||
*/ |
|||
var toHex = function (val) { |
|||
/*jshint maxcomplexity:7 */ |
|||
|
|||
if(isBoolean(val)) |
|||
return val; |
|||
|
|||
if(isBigNumber(val)) |
|||
return fromDecimal(val); |
|||
|
|||
if(isObject(val)) |
|||
return fromAscii(JSON.stringify(val)); |
|||
|
|||
// if its a negative number, pass it through fromDecimal
|
|||
if (isString(val)) { |
|||
if (val.indexOf('-0x') === 0) |
|||
return fromDecimal(val); |
|||
else if (!isFinite(val)) |
|||
return fromAscii(val); |
|||
} |
|||
|
|||
return fromDecimal(val); |
|||
}; |
|||
|
|||
/** |
|||
* Returns value of unit in Wei |
|||
* |
|||
* @method getValueOfUnit |
|||
* @param {String} unit the unit to convert to, default ether |
|||
* @returns {BigNumber} value of the unit (in Wei) |
|||
* @throws error if the unit is not correct:w |
|||
*/ |
|||
var getValueOfUnit = function (unit) { |
|||
unit = unit ? unit.toLowerCase() : 'ether'; |
|||
var unitValue = unitMap[unit]; |
|||
if (unitValue === undefined) { |
|||
throw new Error('This unit doesn\'t exists, please use the one of the following units' + JSON.stringify(unitMap, null, 2)); |
|||
} |
|||
return new BigNumber(unitValue, 10); |
|||
}; |
|||
|
|||
/** |
|||
* Takes a number of wei and converts it to any other ether unit. |
|||
* |
|||
* Possible units are: |
|||
* - kwei/ada |
|||
* - mwei/babbage |
|||
* - gwei/shannon |
|||
* - szabo |
|||
* - finney |
|||
* - ether |
|||
* - kether/grand/einstein |
|||
* - mether |
|||
* - gether |
|||
* - tether |
|||
* |
|||
* @method fromWei |
|||
* @param {Number|String} number can be a number, number string or a HEX of a decimal |
|||
* @param {String} unit the unit to convert to, default ether |
|||
* @return {String|Object} When given a BigNumber object it returns one as well, otherwise a number |
|||
*/ |
|||
var fromWei = function(number, unit) { |
|||
var returnValue = toBigNumber(number).dividedBy(getValueOfUnit(unit)); |
|||
|
|||
return isBigNumber(number) ? returnValue : returnValue.toString(10); |
|||
}; |
|||
|
|||
/** |
|||
* Takes a number of a unit and converts it to wei. |
|||
* |
|||
* Possible units are: |
|||
* - kwei/ada |
|||
* - mwei/babbage |
|||
* - gwei/shannon |
|||
* - szabo |
|||
* - finney |
|||
* - ether |
|||
* - kether/grand/einstein |
|||
* - mether |
|||
* - gether |
|||
* - tether |
|||
* |
|||
* @method toWei |
|||
* @param {Number|String|BigNumber} number can be a number, number string or a HEX of a decimal |
|||
* @param {String} unit the unit to convert from, default ether |
|||
* @return {String|Object} When given a BigNumber object it returns one as well, otherwise a number |
|||
*/ |
|||
var toWei = function(number, unit) { |
|||
var returnValue = toBigNumber(number).times(getValueOfUnit(unit)); |
|||
|
|||
return isBigNumber(number) ? returnValue : returnValue.toString(10); |
|||
}; |
|||
|
|||
/** |
|||
* Takes an input and transforms it into an bignumber |
|||
* |
|||
* @method toBigNumber |
|||
* @param {Number|String|BigNumber} a number, string, HEX string or BigNumber |
|||
* @return {BigNumber} BigNumber |
|||
*/ |
|||
var toBigNumber = function(number) { |
|||
/*jshint maxcomplexity:5 */ |
|||
number = number || 0; |
|||
if (isBigNumber(number)) |
|||
return number; |
|||
|
|||
if (isString(number) && (number.indexOf('0x') === 0 || number.indexOf('-0x') === 0)) { |
|||
return new BigNumber(number.replace('0x',''), 16); |
|||
} |
|||
|
|||
return new BigNumber(number.toString(10), 10); |
|||
}; |
|||
|
|||
/** |
|||
* Takes and input transforms it into bignumber and if it is negative value, into two's complement |
|||
* |
|||
* @method toTwosComplement |
|||
* @param {Number|String|BigNumber} |
|||
* @return {BigNumber} |
|||
*/ |
|||
var toTwosComplement = function (number) { |
|||
var bigNumber = toBigNumber(number); |
|||
if (bigNumber.lessThan(0)) { |
|||
return new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16).plus(bigNumber).plus(1); |
|||
} |
|||
return bigNumber; |
|||
}; |
|||
|
|||
/** |
|||
* Checks if the given string has proper length |
|||
* |
|||
* @method isAddress |
|||
* @param {String} address the given HEX adress |
|||
* @return {Boolean} |
|||
*/ |
|||
var isAddress = function(address) { |
|||
if (!isString(address)) { |
|||
return false; |
|||
} |
|||
|
|||
return ((address.indexOf('0x') === 0 && address.length === 42) || |
|||
(address.indexOf('0x') === -1 && address.length === 40)); |
|||
}; |
|||
|
|||
/** |
|||
* Returns true if object is BigNumber, otherwise false |
|||
* |
|||
* @method isBigNumber |
|||
* @param {Object} |
|||
* @return {Boolean} |
|||
*/ |
|||
var isBigNumber = function (object) { |
|||
return object instanceof BigNumber || |
|||
(object && object.constructor && object.constructor.name === 'BigNumber'); |
|||
}; |
|||
|
|||
/** |
|||
* Returns true if object is string, otherwise false |
|||
* |
|||
* @method isString |
|||
* @param {Object} |
|||
* @return {Boolean} |
|||
*/ |
|||
var isString = function (object) { |
|||
return typeof object === 'string' || |
|||
(object && object.constructor && object.constructor.name === 'String'); |
|||
}; |
|||
|
|||
/** |
|||
* Returns true if object is function, otherwise false |
|||
* |
|||
* @method isFunction |
|||
* @param {Object} |
|||
* @return {Boolean} |
|||
*/ |
|||
var isFunction = function (object) { |
|||
return typeof object === 'function'; |
|||
}; |
|||
|
|||
/** |
|||
* Returns true if object is Objet, otherwise false |
|||
* |
|||
* @method isObject |
|||
* @param {Object} |
|||
* @return {Boolean} |
|||
*/ |
|||
var isObject = function (object) { |
|||
return typeof object === 'object'; |
|||
}; |
|||
|
|||
/** |
|||
* Returns true if object is boolean, otherwise false |
|||
* |
|||
* @method isBoolean |
|||
* @param {Object} |
|||
* @return {Boolean} |
|||
*/ |
|||
var isBoolean = function (object) { |
|||
return typeof object === 'boolean'; |
|||
}; |
|||
|
|||
/** |
|||
* Returns true if object is array, otherwise false |
|||
* |
|||
* @method isArray |
|||
* @param {Object} |
|||
* @return {Boolean} |
|||
*/ |
|||
var isArray = function (object) { |
|||
return object instanceof Array; |
|||
}; |
|||
|
|||
module.exports = { |
|||
findIndex: findIndex, |
|||
toHex: toHex, |
|||
toDecimal: toDecimal, |
|||
fromDecimal: fromDecimal, |
|||
toAscii: toAscii, |
|||
fromAscii: fromAscii, |
|||
extractDisplayName: extractDisplayName, |
|||
extractTypeName: extractTypeName, |
|||
filterFunctions: filterFunctions, |
|||
filterEvents: filterEvents, |
|||
toWei: toWei, |
|||
fromWei: fromWei, |
|||
toBigNumber: toBigNumber, |
|||
toTwosComplement: toTwosComplement, |
|||
isBigNumber: isBigNumber, |
|||
isAddress: isAddress, |
|||
isFunction: isFunction, |
|||
isString: isString, |
|||
isObject: isObject, |
|||
isBoolean: isBoolean, |
|||
isArray: isArray |
|||
}; |
|||
|
@ -0,0 +1,148 @@ |
|||
/* |
|||
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 eth.js |
|||
* @authors: |
|||
* Marek Kotewicz <marek@ethdev.com> |
|||
* @date 2015 |
|||
*/ |
|||
|
|||
/** |
|||
* Web3 |
|||
* |
|||
* @module web3 |
|||
*/ |
|||
|
|||
/** |
|||
* Eth methods and properties |
|||
* |
|||
* An example method object can look as follows: |
|||
* |
|||
* { |
|||
* name: 'getBlock', |
|||
* call: blockCall, |
|||
* outputFormatter: formatters.outputBlockFormatter, |
|||
* inputFormatter: [ // can be a formatter funciton or an array of functions. Where each item in the array will be used for one parameter
|
|||
* utils.toHex, // formats paramter 1
|
|||
* function(param){ if(!param) return false; } // formats paramter 2
|
|||
* ] |
|||
* }, |
|||
* |
|||
* @class [web3] eth |
|||
* @constructor |
|||
*/ |
|||
|
|||
|
|||
var formatters = require('./formatters'); |
|||
var utils = require('../utils/utils'); |
|||
|
|||
|
|||
var blockCall = function (args) { |
|||
return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? "eth_getBlockByHash" : "eth_getBlockByNumber"; |
|||
}; |
|||
|
|||
var transactionFromBlockCall = function (args) { |
|||
return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getTransactionByBlockHashAndIndex' : 'eth_getTransactionByBlockNumberAndIndex'; |
|||
}; |
|||
|
|||
var uncleCall = function (args) { |
|||
return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getUncleByBlockHashAndIndex' : 'eth_getUncleByBlockNumberAndIndex'; |
|||
}; |
|||
|
|||
var getBlockTransactionCountCall = function (args) { |
|||
return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getBlockTransactionCountByHash' : 'eth_getBlockTransactionCountByNumber'; |
|||
}; |
|||
|
|||
var uncleCountCall = function (args) { |
|||
return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getUncleCountByBlockHash' : 'eth_getUncleCountByBlockNumber'; |
|||
}; |
|||
|
|||
/// @returns an array of objects describing web3.eth api methods
|
|||
var methods = [ |
|||
{ name: 'getBalance', call: 'eth_getBalance', addDefaultblock: 2, |
|||
outputFormatter: formatters.convertToBigNumber}, |
|||
{ name: 'getStorage', call: 'eth_getStorage', addDefaultblock: 2}, |
|||
{ name: 'getStorageAt', call: 'eth_getStorageAt', addDefaultblock: 3, |
|||
inputFormatter: utils.toHex}, |
|||
{ name: 'getData', call: 'eth_getData', addDefaultblock: 2}, |
|||
{ name: 'getBlock', call: blockCall, |
|||
outputFormatter: formatters.outputBlockFormatter, |
|||
inputFormatter: [utils.toHex, function(param){ return (!param) ? false : true; }]}, |
|||
{ name: 'getUncle', call: uncleCall, |
|||
outputFormatter: formatters.outputBlockFormatter, |
|||
inputFormatter: [utils.toHex, utils.toHex, function(param){ return (!param) ? false : true; }]}, |
|||
{ name: 'getCompilers', call: 'eth_getCompilers' }, |
|||
{ name: 'getBlockTransactionCount', call: getBlockTransactionCountCall, |
|||
outputFormatter: utils.toDecimal, |
|||
inputFormatter: utils.toHex }, |
|||
{ name: 'getBlockUncleCount', call: uncleCountCall, |
|||
outputFormatter: utils.toDecimal, |
|||
inputFormatter: utils.toHex }, |
|||
{ name: 'getTransaction', call: 'eth_getTransactionByHash', |
|||
outputFormatter: formatters.outputTransactionFormatter }, |
|||
{ name: 'getTransactionFromBlock', call: transactionFromBlockCall, |
|||
outputFormatter: formatters.outputTransactionFormatter, |
|||
inputFormatter: utils.toHex }, |
|||
{ name: 'getTransactionCount', call: 'eth_getTransactionCount', addDefaultblock: 2, |
|||
outputFormatter: utils.toDecimal}, |
|||
{ name: 'sendTransaction', call: 'eth_sendTransaction', |
|||
inputFormatter: formatters.inputTransactionFormatter }, |
|||
{ name: 'call', call: 'eth_call', addDefaultblock: 2, |
|||
inputFormatter: formatters.inputCallFormatter }, |
|||
{ name: 'compile.solidity', call: 'eth_compileSolidity', inputFormatter: utils.toHex }, |
|||
{ name: 'compile.lll', call: 'eth_compileLLL', inputFormatter: utils.toHex }, |
|||
{ name: 'compile.serpent', call: 'eth_compileSerpent', inputFormatter: utils.toHex }, |
|||
{ name: 'flush', call: 'eth_flush' }, |
|||
|
|||
// deprecated methods
|
|||
{ name: 'balanceAt', call: 'eth_balanceAt', newMethod: 'eth.getBalance' }, |
|||
{ name: 'stateAt', call: 'eth_stateAt', newMethod: 'eth.getStorageAt' }, |
|||
{ name: 'storageAt', call: 'eth_storageAt', newMethod: 'eth.getStorage' }, |
|||
{ name: 'countAt', call: 'eth_countAt', newMethod: 'eth.getTransactionCount' }, |
|||
{ name: 'codeAt', call: 'eth_codeAt', newMethod: 'eth.getData' }, |
|||
{ name: 'transact', call: 'eth_transact', newMethod: 'eth.sendTransaction' }, |
|||
{ name: 'block', call: blockCall, newMethod: 'eth.getBlock' }, |
|||
{ name: 'transaction', call: transactionFromBlockCall, newMethod: 'eth.getTransaction' }, |
|||
{ name: 'uncle', call: uncleCall, newMethod: 'eth.getUncle' }, |
|||
{ name: 'compilers', call: 'eth_compilers', newMethod: 'eth.getCompilers' }, |
|||
{ name: 'solidity', call: 'eth_solidity', newMethod: 'eth.compile.solidity' }, |
|||
{ name: 'lll', call: 'eth_lll', newMethod: 'eth.compile.lll' }, |
|||
{ name: 'serpent', call: 'eth_serpent', newMethod: 'eth.compile.serpent' }, |
|||
{ name: 'transactionCount', call: getBlockTransactionCountCall, newMethod: 'eth.getBlockTransactionCount' }, |
|||
{ name: 'uncleCount', call: uncleCountCall, newMethod: 'eth.getBlockUncleCount' }, |
|||
{ name: 'logs', call: 'eth_logs' } |
|||
]; |
|||
|
|||
/// @returns an array of objects describing web3.eth api properties
|
|||
var properties = [ |
|||
{ name: 'coinbase', getter: 'eth_coinbase'}, |
|||
{ name: 'mining', getter: 'eth_mining'}, |
|||
{ name: 'gasPrice', getter: 'eth_gasPrice', outputFormatter: formatters.convertToBigNumber}, |
|||
{ name: 'accounts', getter: 'eth_accounts' }, |
|||
{ name: 'blockNumber', getter: 'eth_blockNumber', outputFormatter: utils.toDecimal}, |
|||
|
|||
// deprecated properties
|
|||
{ name: 'listening', getter: 'net_listening', setter: 'eth_setListening', newProperty: 'net.listening'}, |
|||
{ name: 'peerCount', getter: 'net_peerCount', newProperty: 'net.peerCount'}, |
|||
{ name: 'number', getter: 'eth_number', newProperty: 'eth.blockNumber'} |
|||
]; |
|||
|
|||
|
|||
module.exports = { |
|||
methods: methods, |
|||
properties: properties |
|||
}; |
|||
|
@ -0,0 +1,203 @@ |
|||
/* |
|||
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 formatters.js |
|||
* @authors: |
|||
* Marek Kotewicz <marek@ethdev.com> |
|||
* Fabian Vogelsteller <fabian@ethdev.com> |
|||
* @date 2015 |
|||
*/ |
|||
|
|||
var utils = require('../utils/utils'); |
|||
|
|||
/** |
|||
* Should the input to a big number |
|||
* |
|||
* @method convertToBigNumber |
|||
* @param {String|Number|BigNumber} |
|||
* @returns {BigNumber} object |
|||
*/ |
|||
var convertToBigNumber = function (value) { |
|||
return utils.toBigNumber(value); |
|||
}; |
|||
|
|||
/** |
|||
* Formats the input of a transaction and converts all values to HEX |
|||
* |
|||
* @method inputTransactionFormatter |
|||
* @param {Object} transaction options |
|||
* @returns object |
|||
*/ |
|||
var inputTransactionFormatter = function (options){ |
|||
|
|||
// make code -> data
|
|||
if (options.code) { |
|||
options.data = options.code; |
|||
delete options.code; |
|||
} |
|||
|
|||
['gasPrice', 'gas', 'value'].forEach(function(key){ |
|||
options[key] = utils.fromDecimal(options[key]); |
|||
}); |
|||
|
|||
return options; |
|||
}; |
|||
|
|||
/** |
|||
* Formats the output of a transaction to its proper values |
|||
* |
|||
* @method outputTransactionFormatter |
|||
* @param {Object} transaction |
|||
* @returns {Object} transaction |
|||
*/ |
|||
var outputTransactionFormatter = function (tx){ |
|||
tx.gas = utils.toDecimal(tx.gas); |
|||
tx.gasPrice = utils.toBigNumber(tx.gasPrice); |
|||
tx.value = utils.toBigNumber(tx.value); |
|||
return tx; |
|||
}; |
|||
|
|||
/** |
|||
* Formats the input of a call and converts all values to HEX |
|||
* |
|||
* @method inputCallFormatter |
|||
* @param {Object} transaction options |
|||
* @returns object |
|||
*/ |
|||
var inputCallFormatter = function (options){ |
|||
|
|||
// make code -> data
|
|||
if (options.code) { |
|||
options.data = options.code; |
|||
delete options.code; |
|||
} |
|||
|
|||
return options; |
|||
}; |
|||
|
|||
|
|||
/** |
|||
* Formats the output of a block to its proper values |
|||
* |
|||
* @method outputBlockFormatter |
|||
* @param {Object} block object |
|||
* @returns {Object} block object |
|||
*/ |
|||
var outputBlockFormatter = function(block){ |
|||
|
|||
// transform to number
|
|||
block.gasLimit = utils.toDecimal(block.gasLimit); |
|||
block.gasUsed = utils.toDecimal(block.gasUsed); |
|||
block.size = utils.toDecimal(block.size); |
|||
block.timestamp = utils.toDecimal(block.timestamp); |
|||
block.number = utils.toDecimal(block.number); |
|||
|
|||
block.minGasPrice = utils.toBigNumber(block.minGasPrice); |
|||
block.difficulty = utils.toBigNumber(block.difficulty); |
|||
block.totalDifficulty = utils.toBigNumber(block.totalDifficulty); |
|||
|
|||
if(block.transactions instanceof Array) { |
|||
block.transactions.forEach(function(item){ |
|||
if(!utils.isString(item)) |
|||
return outputTransactionFormatter(item); |
|||
}); |
|||
} |
|||
|
|||
return block; |
|||
}; |
|||
|
|||
/** |
|||
* Formats the output of a log |
|||
* |
|||
* @method outputLogFormatter |
|||
* @param {Object} log object |
|||
* @returns {Object} log |
|||
*/ |
|||
var outputLogFormatter = function(log){ |
|||
log.blockNumber = utils.toDecimal(log.blockNumber); |
|||
log.transactionIndex = utils.toDecimal(log.transactionIndex); |
|||
log.logIndex = utils.toDecimal(log.logIndex); |
|||
|
|||
return log; |
|||
}; |
|||
|
|||
|
|||
/** |
|||
* Formats the input of a whisper post and converts all values to HEX |
|||
* |
|||
* @method inputPostFormatter |
|||
* @param {Object} transaction object |
|||
* @returns {Object} |
|||
*/ |
|||
var inputPostFormatter = function(post){ |
|||
|
|||
post.payload = utils.toHex(post.payload); |
|||
post.ttl = utils.fromDecimal(post.ttl); |
|||
post.priority = utils.fromDecimal(post.priority); |
|||
|
|||
if(!(post.topics instanceof Array)) |
|||
post.topics = [post.topics]; |
|||
|
|||
|
|||
// format the following options
|
|||
post.topics = post.topics.map(function(topic){ |
|||
return utils.fromAscii(topic); |
|||
}); |
|||
|
|||
return post; |
|||
}; |
|||
|
|||
/** |
|||
* Formats the output of a received post message |
|||
* |
|||
* @method outputPostFormatter |
|||
* @param {Object} |
|||
* @returns {Object} |
|||
*/ |
|||
var outputPostFormatter = function(post){ |
|||
|
|||
post.expiry = utils.toDecimal(post.expiry); |
|||
post.sent = utils.toDecimal(post.sent); |
|||
post.ttl = utils.toDecimal(post.ttl); |
|||
post.workProved = utils.toDecimal(post.workProved); |
|||
post.payloadRaw = post.payload; |
|||
post.payload = utils.toAscii(post.payload); |
|||
|
|||
if(post.payload.indexOf('{') === 0 || post.payload.indexOf('[') === 0) { |
|||
try { |
|||
post.payload = JSON.parse(post.payload); |
|||
} catch (e) { } |
|||
} |
|||
|
|||
// format the following options
|
|||
post.topics = post.topics.map(function(topic){ |
|||
return utils.toAscii(topic); |
|||
}); |
|||
|
|||
return post; |
|||
}; |
|||
|
|||
module.exports = { |
|||
convertToBigNumber: convertToBigNumber, |
|||
inputTransactionFormatter: inputTransactionFormatter, |
|||
outputTransactionFormatter: outputTransactionFormatter, |
|||
inputCallFormatter: inputCallFormatter, |
|||
outputBlockFormatter: outputBlockFormatter, |
|||
outputLogFormatter: outputLogFormatter, |
|||
inputPostFormatter: inputPostFormatter, |
|||
outputPostFormatter: outputPostFormatter |
|||
}; |
|||
|
@ -0,0 +1,41 @@ |
|||
/* |
|||
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 eth.js |
|||
* @authors: |
|||
* Marek Kotewicz <marek@ethdev.com> |
|||
* @date 2015 |
|||
*/ |
|||
|
|||
var utils = require('../utils/utils'); |
|||
|
|||
/// @returns an array of objects describing web3.eth api methods
|
|||
var methods = [ |
|||
// { name: 'getBalance', call: 'eth_balanceAt', outputFormatter: formatters.convertToBigNumber},
|
|||
]; |
|||
|
|||
/// @returns an array of objects describing web3.eth api properties
|
|||
var properties = [ |
|||
{ name: 'listening', getter: 'net_listening'}, |
|||
{ name: 'peerCount', getter: 'net_peerCount', outputFormatter: utils.toDecimal }, |
|||
]; |
|||
|
|||
|
|||
module.exports = { |
|||
methods: methods, |
|||
properties: properties |
|||
}; |
|||
|
@ -0,0 +1,161 @@ |
|||
/* |
|||
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 requestmanager.js |
|||
* @authors: |
|||
* Jeffrey Wilcke <jeff@ethdev.com> |
|||
* Marek Kotewicz <marek@ethdev.com> |
|||
* Marian Oancea <marian@ethdev.com> |
|||
* Gav Wood <g@ethdev.com> |
|||
* @date 2014 |
|||
*/ |
|||
|
|||
var jsonrpc = require('./jsonrpc'); |
|||
var c = require('../utils/config'); |
|||
|
|||
/** |
|||
* It's responsible for passing messages to providers |
|||
* It's also responsible for polling the ethereum node for incoming messages |
|||
* Default poll timeout is 1 second |
|||
*/ |
|||
var requestManager = function() { |
|||
var polls = []; |
|||
var timeout = null; |
|||
var provider; |
|||
|
|||
var send = function (data, callback) { |
|||
/*jshint maxcomplexity: 8 */ |
|||
|
|||
// FORMAT BASED ON ONE FORMATTER function
|
|||
if(typeof data.inputFormatter === 'function') { |
|||
data.params = Array.prototype.map.call(data.params, function(item, index){ |
|||
// format everything besides the defaultblock, which is already formated
|
|||
return (!data.addDefaultblock || index+1 < data.addDefaultblock) ? data.inputFormatter(item) : item; |
|||
}); |
|||
|
|||
// FORMAT BASED ON the input FORMATTER ARRAY
|
|||
} else if(data.inputFormatter instanceof Array) { |
|||
data.params = Array.prototype.map.call(data.inputFormatter, function(formatter, index){ |
|||
// format everything besides the defaultblock, which is already formated
|
|||
return (!data.addDefaultblock || index+1 < data.addDefaultblock) ? formatter(data.params[index]) : data.params[index]; |
|||
}); |
|||
} |
|||
|
|||
|
|||
var payload = jsonrpc.toPayload(data.method, data.params); |
|||
|
|||
if (!provider) { |
|||
console.error('provider is not set'); |
|||
return null; |
|||
} |
|||
|
|||
// HTTP ASYNC (only when callback is given, and it a HttpProvidor)
|
|||
if(typeof callback === 'function' && provider.name === 'HTTP'){ |
|||
provider.send(payload, function(result, status){ |
|||
|
|||
if (!jsonrpc.isValidResponse(result)) { |
|||
if(typeof result === 'object' && result.error && result.error.message) { |
|||
console.error(result.error.message); |
|||
callback(result.error); |
|||
} else { |
|||
callback(new Error({ |
|||
status: status, |
|||
error: result, |
|||
message: 'Bad Request' |
|||
})); |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
// format the output
|
|||
callback(null, (typeof data.outputFormatter === 'function') ? data.outputFormatter(result.result) : result.result); |
|||
}); |
|||
|
|||
// SYNC
|
|||
} else { |
|||
var result = provider.send(payload); |
|||
|
|||
if (!jsonrpc.isValidResponse(result)) { |
|||
console.log(result); |
|||
if(typeof result === 'object' && result.error && result.error.message) |
|||
console.error(result.error.message); |
|||
return null; |
|||
} |
|||
|
|||
// format the output
|
|||
return (typeof data.outputFormatter === 'function') ? data.outputFormatter(result.result) : result.result; |
|||
} |
|||
|
|||
}; |
|||
|
|||
var setProvider = function (p) { |
|||
provider = p; |
|||
}; |
|||
|
|||
/*jshint maxparams:4 */ |
|||
var startPolling = function (data, pollId, callback, uninstall) { |
|||
polls.push({data: data, id: pollId, callback: callback, uninstall: uninstall}); |
|||
}; |
|||
/*jshint maxparams:3 */ |
|||
|
|||
var stopPolling = function (pollId) { |
|||
for (var i = polls.length; i--;) { |
|||
var poll = polls[i]; |
|||
if (poll.id === pollId) { |
|||
polls.splice(i, 1); |
|||
} |
|||
} |
|||
}; |
|||
|
|||
var reset = function () { |
|||
polls.forEach(function (poll) { |
|||
poll.uninstall(poll.id); |
|||
}); |
|||
polls = []; |
|||
|
|||
if (timeout) { |
|||
clearTimeout(timeout); |
|||
timeout = null; |
|||
} |
|||
poll(); |
|||
}; |
|||
|
|||
var poll = function () { |
|||
polls.forEach(function (data) { |
|||
// send async
|
|||
send(data.data, function(result){ |
|||
if (!(result instanceof Array) || result.length === 0) { |
|||
return; |
|||
} |
|||
data.callback(result); |
|||
}); |
|||
}); |
|||
timeout = setTimeout(poll, c.ETH_POLLING_TIMEOUT); |
|||
}; |
|||
|
|||
poll(); |
|||
|
|||
return { |
|||
send: send, |
|||
setProvider: setProvider, |
|||
startPolling: startPolling, |
|||
stopPolling: stopPolling, |
|||
reset: reset |
|||
}; |
|||
}; |
|||
|
|||
module.exports = requestManager; |
|||
|
@ -0,0 +1,7 @@ |
|||
/* jshint ignore:start */ |
|||
|
|||
if(typeof web3 === 'undefined') { |
|||
web3 = require('web3'); |
|||
} |
|||
|
|||
/* jshint ignore:end */ |
@ -0,0 +1,29 @@ |
|||
/* jshint ignore:start */ |
|||
Package.describe({ |
|||
name: 'ethereum:js', |
|||
version: '0.1.1', |
|||
summary: 'Ethereum JavaScript API, middleware to talk to a ethreum node over RPC', |
|||
git: 'https://github.com/ethereum/ethereum.js', |
|||
// By default, Meteor will default to using README.md for documentation.
|
|||
// To avoid submitting documentation, set this field to null.
|
|||
documentation: 'README.md' |
|||
}); |
|||
|
|||
Package.onUse(function(api) { |
|||
api.versionsFrom('1.0.3.2'); |
|||
|
|||
api.use('3stack:bignumber@2.0.0', 'client'); |
|||
|
|||
api.export('BigNumber', 'client'); |
|||
api.export('web3', 'client'); |
|||
|
|||
api.addFiles('dist/ethereum.js', 'client'); |
|||
api.addFiles('package-init.js', 'client'); |
|||
}); |
|||
|
|||
// Package.onTest(function(api) {
|
|||
// api.use('tinytest');
|
|||
// api.use('test');
|
|||
// api.addFiles('test-tests.js');
|
|||
// });
|
|||
/* jshint ignore:end */ |
@ -0,0 +1,28 @@ |
|||
var chai = require('chai'); |
|||
var formatters = require('../lib/web3/formatters.js'); |
|||
var assert = chai.assert; |
|||
|
|||
describe('formatters', function () { |
|||
describe('inputPostFormatter', function () { |
|||
it('should return the correct value', function () { |
|||
|
|||
// input as strings and numbers
|
|||
assert.deepEqual(formatters.inputPostFormatter({ |
|||
from: '0x00000', |
|||
to: '0x00000', |
|||
payload: {test: 'test'}, |
|||
ttl: 200, |
|||
priority: 1000, |
|||
topics: ['hello','mytopics'] |
|||
}), { |
|||
from: '0x00000', |
|||
to: '0x00000', |
|||
payload: '0x7b2274657374223a2274657374227d', |
|||
ttl: '0xc8', |
|||
priority: '0x3e8', |
|||
topics: ['0x68656c6c6f','0x6d79746f70696373'] |
|||
}); |
|||
|
|||
}); |
|||
}); |
|||
}); |
@ -0,0 +1,26 @@ |
|||
var assert = require('assert'); |
|||
var formatters = require('../lib/web3/formatters.js'); |
|||
var BigNumber = require('bignumber.js'); |
|||
|
|||
describe('formatters', function () { |
|||
describe('inputTransactionFormatter', function () { |
|||
it('should return the correct value', function () { |
|||
|
|||
assert.deepEqual(formatters.inputTransactionFormatter({ |
|||
data: '0x34234kjh23kj4234', |
|||
value: new BigNumber(100), |
|||
from: '0x00000', |
|||
to: '0x00000', |
|||
gas: 1000, |
|||
gasPrice: new BigNumber(1000), |
|||
}), { |
|||
data: '0x34234kjh23kj4234', |
|||
value: '0x64', |
|||
from: '0x00000', |
|||
to: '0x00000', |
|||
gas: '0x3e8', |
|||
gasPrice: '0x3e8', |
|||
}); |
|||
}); |
|||
}); |
|||
}); |
@ -0,0 +1,48 @@ |
|||
var assert = require('assert'); |
|||
var formatters = require('../lib/web3/formatters.js'); |
|||
var BigNumber = require('bignumber.js'); |
|||
|
|||
describe('formatters', function () { |
|||
describe('outputBlockFormatter', function () { |
|||
it('should return the correct value', function () { |
|||
|
|||
assert.deepEqual(formatters.outputBlockFormatter({ |
|||
hash: '0x34234kjh23kj4234', |
|||
parentHash: '0x34234kjh23kj4234', |
|||
miner: '0x34234kjh23kj4234', |
|||
stateRoot: '0x34234kjh23kj4234', |
|||
sha3Uncles: '0x34234kjh23kj4234', |
|||
bloom: '0x34234kjh23kj4234', |
|||
difficulty: '0x3e8', |
|||
totalDifficulty: '0x3e8', |
|||
number: '0x3e8', |
|||
minGasPrice: '0x3e8', |
|||
gasLimit: '0x3e8', |
|||
gasUsed: '0x3e8', |
|||
timestamp: '0x3e8', |
|||
extraData: '0x34234kjh23kj4234', |
|||
nonce: '0x34234kjh23kj4234', |
|||
children: ['0x34234kjh23kj4234'], |
|||
size: '0x3e8' |
|||
}), { |
|||
hash: '0x34234kjh23kj4234', |
|||
parentHash: '0x34234kjh23kj4234', |
|||
miner: '0x34234kjh23kj4234', |
|||
stateRoot: '0x34234kjh23kj4234', |
|||
sha3Uncles: '0x34234kjh23kj4234', |
|||
bloom: '0x34234kjh23kj4234', |
|||
difficulty: new BigNumber(1000), |
|||
totalDifficulty: new BigNumber(1000), |
|||
number: 1000, |
|||
minGasPrice: new BigNumber(1000), |
|||
gasLimit: 1000, |
|||
gasUsed: 1000, |
|||
timestamp: 1000, |
|||
extraData: '0x34234kjh23kj4234', |
|||
nonce: '0x34234kjh23kj4234', |
|||
children: ['0x34234kjh23kj4234'], |
|||
size: 1000 |
|||
}); |
|||
}); |
|||
}); |
|||
}); |
@ -0,0 +1,27 @@ |
|||
var assert = require('assert'); |
|||
var formatters = require('../lib/web3/formatters.js'); |
|||
|
|||
describe('formatters', function () { |
|||
describe('outputLogFormatter', function () { |
|||
it('should return the correct value', function () { |
|||
|
|||
assert.deepEqual(formatters.outputLogFormatter({ |
|||
transactionIndex: '0x3e8', |
|||
logIndex: '0x3e8', |
|||
blockNumber: '0x3e8', |
|||
transactionHash: '0x7b2274657374223a2274657374227d', |
|||
blockHash: '0x7b2274657374223a2274657374227d', |
|||
data: '0x7b2274657374223a2274657374227d', |
|||
topics: ['0x68656c6c6f','0x6d79746f70696373'] |
|||
}), { |
|||
transactionIndex: 1000, |
|||
logIndex: 1000, |
|||
blockNumber: 1000, |
|||
transactionHash: '0x7b2274657374223a2274657374227d', |
|||
blockHash: '0x7b2274657374223a2274657374227d', |
|||
data: '0x7b2274657374223a2274657374227d', |
|||
topics: ['0x68656c6c6f','0x6d79746f70696373'] |
|||
}); |
|||
}); |
|||
}); |
|||
}); |
@ -0,0 +1,26 @@ |
|||
var assert = require('assert'); |
|||
var formatters = require('../lib/web3/formatters.js'); |
|||
|
|||
describe('formatters', function () { |
|||
describe('outputPostFormatter', function () { |
|||
it('should return the correct value', function () { |
|||
|
|||
assert.deepEqual(formatters.outputPostFormatter({ |
|||
expiry: '0x3e8', |
|||
sent: '0x3e8', |
|||
ttl: '0x3e8', |
|||
workProved: '0x3e8', |
|||
payload: '0x7b2274657374223a2274657374227d', |
|||
topics: ['0x68656c6c6f','0x6d79746f70696373'] |
|||
}), { |
|||
expiry: 1000, |
|||
sent: 1000, |
|||
ttl: 1000, |
|||
workProved: 1000, |
|||
payload: {test: 'test'}, |
|||
payloadRaw: '0x7b2274657374223a2274657374227d', |
|||
topics: ['hello','mytopics'] |
|||
}); |
|||
}); |
|||
}); |
|||
}); |
@ -0,0 +1,26 @@ |
|||
var assert = require('assert'); |
|||
var formatters = require('../lib/web3/formatters.js'); |
|||
var BigNumber = require('bignumber.js'); |
|||
|
|||
describe('formatters', function () { |
|||
describe('outputTransactionFormatter', function () { |
|||
it('should return the correct value', function () { |
|||
|
|||
assert.deepEqual(formatters.outputTransactionFormatter({ |
|||
input: '0x34234kjh23kj4234', |
|||
from: '0x00000', |
|||
to: '0x00000', |
|||
value: '0x3e8', |
|||
gas: '0x3e8', |
|||
gasPrice: '0x3e8' |
|||
}), { |
|||
input: '0x34234kjh23kj4234', |
|||
from: '0x00000', |
|||
to: '0x00000', |
|||
value: new BigNumber(1000), |
|||
gas: 1000, |
|||
gasPrice: new BigNumber(1000), |
|||
}); |
|||
}); |
|||
}); |
|||
}); |
@ -0,0 +1,10 @@ |
|||
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,43 @@ |
|||
var chai = require('chai'); |
|||
var utils = require('../lib/utils/utils.js'); |
|||
var assert = chai.assert; |
|||
|
|||
var tests = [ |
|||
{ value: 1, expected: '0x1' }, |
|||
{ value: '1', expected: '0x1' }, |
|||
{ value: '0x1', expected: '0x1'}, |
|||
{ value: '0x01', expected: '0x1'}, |
|||
{ value: 15, expected: '0xf'}, |
|||
{ value: '15', expected: '0xf'}, |
|||
{ value: '0xf', expected: '0xf'}, |
|||
{ value: '0x0f', expected: '0xf'}, |
|||
{ value: -1, expected: '-0x1'}, |
|||
{ value: '-1', expected: '-0x1'}, |
|||
{ value: '-0x1', expected: '-0x1'}, |
|||
{ value: '-0x01', expected: '-0x1'}, |
|||
{ value: -15, expected: '-0xf'}, |
|||
{ value: '-15', expected: '-0xf'}, |
|||
{ value: '-0xf', expected: '-0xf'}, |
|||
{ value: '-0x0f', expected: '-0xf'}, |
|||
{ value: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', expected: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'}, |
|||
{ value: '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', expected: '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd'}, |
|||
{ value: '-0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', expected: '-0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'}, |
|||
{ value: '-0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', expected: '-0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd'}, |
|||
{ value: 0, expected: '0x0'}, |
|||
{ value: '0', expected: '0x0'}, |
|||
{ value: '0x0', expected: '0x0'}, |
|||
{ value: -0, expected: '0x0'}, |
|||
{ value: '-0', expected: '0x0'}, |
|||
{ value: '-0x0', expected: '0x0'} |
|||
]; |
|||
|
|||
describe('utils', function () { |
|||
describe('fromDecimal', function () { |
|||
tests.forEach(function (test) { |
|||
it('should turn ' + test.value + ' to ' + test.expected, function () { |
|||
assert.equal(utils.fromDecimal(test.value), test.expected); |
|||
}); |
|||
}); |
|||
}); |
|||
}); |
|||
|
@ -0,0 +1,22 @@ |
|||
var assert = require('assert'); |
|||
var utils = require('../lib/utils/utils.js'); |
|||
|
|||
describe('utils', function () { |
|||
describe('fromWei', function () { |
|||
it('should return the correct value', function () { |
|||
|
|||
assert.equal(utils.fromWei(1000000000000000000, 'wei'), '1000000000000000000'); |
|||
assert.equal(utils.fromWei(1000000000000000000, 'kwei'), '1000000000000000'); |
|||
assert.equal(utils.fromWei(1000000000000000000, 'mwei'), '1000000000000'); |
|||
assert.equal(utils.fromWei(1000000000000000000, 'gwei'), '1000000000'); |
|||
assert.equal(utils.fromWei(1000000000000000000, 'szabo'), '1000000'); |
|||
assert.equal(utils.fromWei(1000000000000000000, 'finney'), '1000'); |
|||
assert.equal(utils.fromWei(1000000000000000000, 'ether'), '1'); |
|||
assert.equal(utils.fromWei(1000000000000000000, 'kether'), '0.001'); |
|||
assert.equal(utils.fromWei(1000000000000000000, 'grand'), '0.001'); |
|||
assert.equal(utils.fromWei(1000000000000000000, 'mether'), '0.000001'); |
|||
assert.equal(utils.fromWei(1000000000000000000, 'gether'), '0.000000001'); |
|||
assert.equal(utils.fromWei(1000000000000000000, 'tether'), '0.000000000001'); |
|||
}); |
|||
}); |
|||
}); |
@ -0,0 +1,23 @@ |
|||
var chai = require('chai'); |
|||
var utils = require('../lib/utils/utils.js'); |
|||
var assert = chai.assert; |
|||
|
|||
var tests = [ |
|||
{ value: function () {}, is: false}, |
|||
{ value: new Function(), is: false}, |
|||
{ value: 'function', is: false}, |
|||
{ value: {}, is: false}, |
|||
{ value: '0xc6d9d2cd449a754c494264e1809c50e34d64562b', is: true }, |
|||
{ value: 'c6d9d2cd449a754c494264e1809c50e34d64562b', is: true } |
|||
]; |
|||
|
|||
describe('utils', function () { |
|||
describe('isAddress', function () { |
|||
tests.forEach(function (test) { |
|||
it('shoud test if value ' + test.value + ' is address: ' + test.is, function () { |
|||
assert.equal(utils.isAddress(test.value), test.is); |
|||
}); |
|||
}); |
|||
}); |
|||
}); |
|||
|
@ -0,0 +1,26 @@ |
|||
var chai = require('chai'); |
|||
var utils = require('../lib/utils/utils.js'); |
|||
var BigNumber = require('bignumber.js'); |
|||
var assert = chai.assert; |
|||
|
|||
var tests = [ |
|||
{ value: function () {}, is: false}, |
|||
{ value: new Function(), is: false}, |
|||
{ value: 'function', is: false}, |
|||
{ value: {}, is: false}, |
|||
{ value: new String('hello'), is: false}, |
|||
{ value: new BigNumber(0), is: true}, |
|||
{ value: 132, is: false}, |
|||
{ value: '0x12', is: false}, |
|||
|
|||
]; |
|||
|
|||
describe('utils', function () { |
|||
describe('isBigNumber', function () { |
|||
tests.forEach(function (test) { |
|||
it('shoud test if value ' + test.func + ' is BigNumber: ' + test.is, function () { |
|||
assert.equal(utils.isBigNumber(test.value), test.is); |
|||
}); |
|||
}); |
|||
}); |
|||
}); |
@ -0,0 +1,21 @@ |
|||
var chai = require('chai'); |
|||
var utils = require('../lib/utils/utils.js'); |
|||
var assert = chai.assert; |
|||
|
|||
var tests = [ |
|||
{ func: function () {}, is: true}, |
|||
{ func: new Function(), is: true}, |
|||
{ func: 'function', is: false}, |
|||
{ func: {}, is: false} |
|||
]; |
|||
|
|||
describe('utils', function () { |
|||
describe('isFunction', function () { |
|||
tests.forEach(function (test) { |
|||
it('shoud test if value ' + test.func + ' is function: ' + test.is, function () { |
|||
assert.equal(utils.isFunction(test.func), test.is); |
|||
}); |
|||
}); |
|||
}); |
|||
}); |
|||
|
@ -0,0 +1,22 @@ |
|||
var chai = require('chai'); |
|||
var utils = require('../lib/utils/utils.js'); |
|||
var assert = chai.assert; |
|||
|
|||
var tests = [ |
|||
{ value: function () {}, is: false}, |
|||
{ value: new Function(), is: false}, |
|||
{ value: 'function', is: true}, |
|||
{ value: {}, is: false}, |
|||
{ value: new String('hello'), is: true} |
|||
]; |
|||
|
|||
describe('utils', function () { |
|||
describe('isString', function () { |
|||
tests.forEach(function (test) { |
|||
it('shoud test if value ' + test.func + ' is string: ' + test.is, function () { |
|||
assert.equal(utils.isString(test.value), test.is); |
|||
}); |
|||
}); |
|||
}); |
|||
}); |
|||
|
@ -0,0 +1,45 @@ |
|||
var chai = require('chai'); |
|||
var utils = require('../lib/utils/utils.js'); |
|||
var BigNumber = require('bignumber.js'); |
|||
var assert = chai.assert; |
|||
|
|||
var tests = [ |
|||
{ value: 1, expected: '1' }, |
|||
{ value: '1', expected: '1' }, |
|||
{ value: '0x1', expected: '1'}, |
|||
{ value: '0x01', expected: '1'}, |
|||
{ value: 15, expected: '15'}, |
|||
{ value: '15', expected: '15'}, |
|||
{ value: '0xf', expected: '15'}, |
|||
{ value: '0x0f', expected: '15'}, |
|||
{ value: new BigNumber('f', 16), expected: '15'}, |
|||
{ value: -1, expected: '-1'}, |
|||
{ value: '-1', expected: '-1'}, |
|||
{ value: '-0x1', expected: '-1'}, |
|||
{ value: '-0x01', expected: '-1'}, |
|||
{ value: -15, expected: '-15'}, |
|||
{ value: '-15', expected: '-15'}, |
|||
{ value: '-0xf', expected: '-15'}, |
|||
{ value: '-0x0f', expected: '-15'}, |
|||
{ value: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', expected: '115792089237316195423570985008687907853269984665640564039457584007913129639935'}, |
|||
{ value: '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', expected: '115792089237316195423570985008687907853269984665640564039457584007913129639933'}, |
|||
{ value: '-0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', expected: '-115792089237316195423570985008687907853269984665640564039457584007913129639935'}, |
|||
{ value: '-0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', expected: '-115792089237316195423570985008687907853269984665640564039457584007913129639933'}, |
|||
{ value: 0, expected: '0'}, |
|||
{ value: '0', expected: '0'}, |
|||
{ value: '0x0', expected: '0'}, |
|||
{ value: -0, expected: '0'}, |
|||
{ value: '-0', expected: '0'}, |
|||
{ value: '-0x0', expected: '0'}, |
|||
{ value: new BigNumber(0), expected: '0'} |
|||
]; |
|||
|
|||
describe('utils', function () { |
|||
describe('toBigNumber', function () { |
|||
tests.forEach(function (test) { |
|||
it('should turn ' + test.value + ' to ' + test.expected, function () { |
|||
assert.equal(utils.toBigNumber(test.value).toString(10), test.expected); |
|||
}); |
|||
}); |
|||
}); |
|||
}); |
@ -0,0 +1,14 @@ |
|||
var assert = require('assert'); |
|||
var utils = require('../lib/utils/utils.js'); |
|||
|
|||
describe('utils', function () { |
|||
describe('toDecimal', function () { |
|||
it('should return the correct value', function () { |
|||
|
|||
assert.equal(utils.toDecimal("0x3e8"), '1000'); |
|||
// allow compatiblity
|
|||
assert.equal(utils.toDecimal(100000), '100000'); |
|||
assert.equal(utils.toDecimal('100000'), '100000'); |
|||
}); |
|||
}); |
|||
}); |
@ -0,0 +1,42 @@ |
|||
var chai = require('chai'); |
|||
var utils = require('../lib/utils/utils'); |
|||
var BigNumber = require('bignumber.js'); |
|||
var assert = chai.assert; |
|||
|
|||
var tests = [ |
|||
{ value: 1, expected: '0x1' }, |
|||
{ value: '1', expected: '0x1' }, |
|||
{ value: '0x1', expected: '0x1'}, |
|||
{ value: '15', expected: '0xf'}, |
|||
{ value: '0xf', expected: '0xf'}, |
|||
{ value: -1, expected: '-0x1'}, |
|||
{ value: '-1', expected: '-0x1'}, |
|||
{ value: '-0x1', expected: '-0x1'}, |
|||
{ value: '-15', expected: '-0xf'}, |
|||
{ value: '-0xf', expected: '-0xf'}, |
|||
{ value: '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', expected: '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd'}, |
|||
{ value: '-0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', expected: '-0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'}, |
|||
{ value: '-0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', expected: '-0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd'}, |
|||
{ value: 0, expected: '0x0'}, |
|||
{ value: '0', expected: '0x0'}, |
|||
{ value: '0x0', expected: '0x0'}, |
|||
{ value: -0, expected: '0x0'}, |
|||
{ value: '-0', expected: '0x0'}, |
|||
{ value: '-0x0', expected: '0x0'}, |
|||
{ value: [1,2,3,{test: 'data'}], expected: '0x5b312c322c332c7b2274657374223a2264617461227d5d'}, |
|||
{ value: {test: 'test'}, expected: '0x7b2274657374223a2274657374227d'}, |
|||
{ value: '{"test": "test"}', expected: '0x7b2274657374223a202274657374227d'}, |
|||
{ value: 'myString', expected: '0x6d79537472696e67'}, |
|||
{ value: new BigNumber(15), expected: '0xf'} |
|||
]; |
|||
|
|||
describe('utils', function () { |
|||
describe('toHex', function () { |
|||
tests.forEach(function (test) { |
|||
it('should turn ' + test.value + ' to ' + test.expected, function () { |
|||
assert.equal(utils.toHex(test.value), test.expected); |
|||
}); |
|||
}); |
|||
}); |
|||
}); |
|||
|
@ -0,0 +1,25 @@ |
|||
var chai = require('chai'); |
|||
var utils = require('../lib/utils/utils'); |
|||
var assert = chai.assert; |
|||
|
|||
describe('utils', function () { |
|||
describe('toWei', function () { |
|||
it('should return the correct value', function () { |
|||
|
|||
assert.equal(utils.toWei(1, 'wei'), '1'); |
|||
assert.equal(utils.toWei(1, 'kwei'), '1000'); |
|||
assert.equal(utils.toWei(1, 'mwei'), '1000000'); |
|||
assert.equal(utils.toWei(1, 'gwei'), '1000000000'); |
|||
assert.equal(utils.toWei(1, 'szabo'), '1000000000000'); |
|||
assert.equal(utils.toWei(1, 'finney'), '1000000000000000'); |
|||
assert.equal(utils.toWei(1, 'ether'), '1000000000000000000'); |
|||
assert.equal(utils.toWei(1, 'kether'), '1000000000000000000000'); |
|||
assert.equal(utils.toWei(1, 'grand'), '1000000000000000000000'); |
|||
assert.equal(utils.toWei(1, 'mether'), '1000000000000000000000000'); |
|||
assert.equal(utils.toWei(1, 'gether'), '1000000000000000000000000000'); |
|||
assert.equal(utils.toWei(1, 'tether'), '1000000000000000000000000000000'); |
|||
|
|||
assert.throws(function () {utils.toWei(1, 'wei1');}, Error); |
|||
}); |
|||
}); |
|||
}); |
File diff suppressed because it is too large
@ -1,73 +1,60 @@ |
|||
[ |
|||
{ "name": "web3_sha3", "params": [""], "order": [], "returns" : "" }, |
|||
|
|||
{ "name": "net_peerCount", "params": [], "order": [], "returns" : "" }, |
|||
{ "name": "net_listening", "params": [], "order": [], "returns" : false }, |
|||
|
|||
{ "name": "eth_coinbase", "params": [], "order": [], "returns" : "" }, |
|||
{ "name": "eth_setCoinbase", "params": [""], "order": [], "returns" : true }, |
|||
{ "name": "eth_listening", "params": [], "order": [], "returns" : false }, |
|||
{ "name": "eth_setListening", "params": [false], "order" : [], "returns" : true }, |
|||
{ "name": "eth_mining", "params": [], "order": [], "returns" : false }, |
|||
{ "name": "eth_setMining", "params": [false], "order" : [], "returns" : true }, |
|||
{ "name": "eth_gasPrice", "params": [], "order": [], "returns" : "" }, |
|||
{ "name": "eth_accounts", "params": [], "order": [], "returns" : [] }, |
|||
{ "name": "eth_peerCount", "params": [], "order": [], "returns" : 0 }, |
|||
{ "name": "eth_defaultBlock", "params": [], "order": [], "returns" : 0}, |
|||
{ "name": "eth_setDefaultBlock", "params": [0], "order": [], "returns" : true}, |
|||
{ "name": "eth_number", "params": [], "order": [], "returns" : 0}, |
|||
|
|||
{ "name": "eth_balanceAt", "params": [""], "order": [], "returns" : ""}, |
|||
{ "name": "eth_stateAt", "params": ["", ""], "order": [], "returns": ""}, |
|||
{ "name": "eth_storageAt", "params": [""], "order": [], "returns": {}}, |
|||
{ "name": "eth_countAt", "params": [""], "order": [], "returns" : 0.0}, |
|||
{ "name": "eth_transactionCountByHash", "params": [""], "order": [], "returns" : 0.0}, |
|||
{ "name": "eth_transactionCountByNumber", "params": [0], "order": [], "returns" : 0.0}, |
|||
{ "name": "eth_uncleCountByHash", "params": [""], "order": [], "returns" : 0.0}, |
|||
{ "name": "eth_uncleCountByNumber", "params": [0], "order": [], "returns" : 0.0}, |
|||
{ "name": "eth_codeAt", "params": [""], "order": [], "returns": ""}, |
|||
|
|||
{ "name": "eth_transact", "params": [{}], "order": [], "returns": ""}, |
|||
{ "name": "eth_call", "params": [{}], "order": [], "returns": ""}, |
|||
{ "name": "eth_blockNumber", "params": [], "order": [], "returns" : ""}, |
|||
{ "name": "eth_getBalance", "params": ["", ""], "order": [], "returns" : ""}, |
|||
{ "name": "eth_getStorage", "params": ["", ""], "order": [], "returns": {}}, |
|||
{ "name": "eth_getStorageAt", "params": ["", "", ""], "order": [], "returns": ""}, |
|||
{ "name": "eth_getTransactionCount", "params": ["", ""], "order": [], "returns" : ""}, |
|||
{ "name": "eth_getBlockTransactionCountByHash", "params": [""], "order": [], "returns" : ""}, |
|||
{ "name": "eth_getBlockTransactionCountByNumber", "params": [""], "order": [], "returns" : ""}, |
|||
{ "name": "eth_getUncleCountByBlockHash", "params": [""], "order": [], "returns" : ""}, |
|||
{ "name": "eth_getUncleCountByBlockNumber", "params": [""], "order": [], "returns" : ""}, |
|||
{ "name": "eth_getData", "params": ["", ""], "order": [], "returns": ""}, |
|||
{ "name": "eth_sendTransaction", "params": [{}], "order": [], "returns": ""}, |
|||
{ "name": "eth_call", "params": [{}, ""], "order": [], "returns": ""}, |
|||
{ "name": "eth_flush", "params": [], "order": [], "returns" : true}, |
|||
|
|||
{ "name": "eth_blockByHash", "params": [""],"order": [], "returns": {}}, |
|||
{ "name": "eth_blockByNumber", "params": [0],"order": [], "returns": {}}, |
|||
{ "name": "eth_transactionByHash", "params": ["", 0], "order": [], "returns": {}}, |
|||
{ "name": "eth_transactionByNumber", "params": [0, 0], "order": [], "returns": {}}, |
|||
{ "name": "eth_uncleByHash", "params": ["", 0], "order": [], "returns": {}}, |
|||
{ "name": "eth_uncleByNumber", "params": [0, 0], "order": [], "returns": {}}, |
|||
|
|||
{ "name": "eth_compilers", "params": [], "order": [], "returns": []}, |
|||
{ "name": "eth_lll", "params": [""], "order": [], "returns": ""}, |
|||
{ "name": "eth_solidity", "params": [""], "order": [], "returns": ""}, |
|||
{ "name": "eth_serpent", "params": [""], "order": [], "returns": ""}, |
|||
|
|||
{ "name": "eth_newFilter", "params": [{}], "order": [], "returns": 0}, |
|||
{ "name": "eth_newFilterString", "params": [""], "order": [], "returns": 0}, |
|||
{ "name": "eth_uninstallFilter", "params": [0], "order": [], "returns": true}, |
|||
{ "name": "eth_changed", "params": [0], "order": [], "returns": []}, |
|||
{ "name": "eth_filterLogs", "params": [0], "order": [], "returns": []}, |
|||
{ "name": "eth_logs", "params": [{}], "order": [], "returns": []}, |
|||
|
|||
{ "name": "eth_getBlockByHash", "params": ["", false],"order": [], "returns": {}}, |
|||
{ "name": "eth_getBlockByNumber", "params": ["", false],"order": [], "returns": {}}, |
|||
{ "name": "eth_getTransactionByHash", "params": [""], "order": [], "returns": {}}, |
|||
{ "name": "eth_getTransactionByBlockHashAndIndex", "params": ["", ""], "order": [], "returns": {}}, |
|||
{ "name": "eth_getTransactionByBlockNumberAndIndex", "params": ["", ""], "order": [], "returns": {}}, |
|||
{ "name": "eth_getUncleByBlockHashAndIndex", "params": ["", ""], "order": [], "returns": {}}, |
|||
{ "name": "eth_getUncleByBlockNumberAndIndex", "params": ["", ""], "order": [], "returns": {}}, |
|||
{ "name": "eth_getCompilers", "params": [], "order": [], "returns": []}, |
|||
{ "name": "eth_compileLLL", "params": [""], "order": [], "returns": ""}, |
|||
{ "name": "eth_compileSerpent", "params": [""], "order": [], "returns": ""}, |
|||
{ "name": "eth_compileSolidity", "params": [""], "order": [], "returns": ""}, |
|||
{ "name": "eth_newFilter", "params": [{}], "order": [], "returns": ""}, |
|||
{ "name": "eth_newBlockFilter", "params": [""], "order": [], "returns": ""}, |
|||
{ "name": "eth_uninstallFilter", "params": [""], "order": [], "returns": true}, |
|||
{ "name": "eth_getFilterChanges", "params": [""], "order": [], "returns": []}, |
|||
{ "name": "eth_getFilterLogs", "params": [""], "order": [], "returns": []}, |
|||
{ "name": "eth_getLogs", "params": [{}], "order": [], "returns": []}, |
|||
{ "name": "eth_getWork", "params": [], "order": [], "returns": []}, |
|||
{ "name": "eth_submitWork", "params": ["", ""], "order": [], "returns": true}, |
|||
|
|||
{ "name": "eth_register", "params": [""], "order": [], "returns": 0}, |
|||
{ "name": "eth_unregister", "params": [0], "order": [], "returns": true}, |
|||
{ "name": "eth_queuedTransactions", "params": [0], "order": [], "returns": []}, |
|||
{ "name": "eth_register", "params": [""], "order": [], "returns": ""}, |
|||
{ "name": "eth_unregister", "params": [""], "order": [], "returns": true}, |
|||
{ "name": "eth_fetchQueuedTransactions", "params": [""], "order": [], "returns": []}, |
|||
|
|||
{ "name": "db_put", "params": ["", "", ""], "order": [], "returns": true}, |
|||
{ "name": "db_get", "params": ["", ""], "order": [], "returns": ""}, |
|||
{ "name": "db_putString", "params": ["", "", ""], "order": [], "returns": true}, |
|||
{ "name": "db_getString", "params": ["", ""], "order": [], "returns": ""}, |
|||
|
|||
{ "name": "shh_post", "params": [{}], "order": [], "returns": true}, |
|||
{ "name": "shh_newIdentity", "params": [], "order": [], "returns": ""}, |
|||
{ "name": "shh_haveIdentity", "params": [""], "order": [], "returns": false}, |
|||
{ "name": "shh_hasIdentity", "params": [""], "order": [], "returns": false}, |
|||
{ "name": "shh_newGroup", "params": ["", ""], "order": [], "returns": ""}, |
|||
{ "name": "shh_addToGroup", "params": ["", ""], "order": [], "returns": ""}, |
|||
|
|||
{ "name": "shh_newFilter", "params": [{}], "order": [], "returns": 0}, |
|||
{ "name": "shh_uninstallFilter", "params": [0], "order": [], "returns": true}, |
|||
{ "name": "shh_changed", "params": [0], "order": [], "returns": []}, |
|||
{ "name": "shh_getMessages", "params": [0], "order": [], "returns": []} |
|||
{ "name": "shh_newFilter", "params": [{}], "order": [], "returns": ""}, |
|||
{ "name": "shh_uninstallFilter", "params": [""], "order": [], "returns": true}, |
|||
{ "name": "shh_getFilterChanges", "params": [""], "order": [], "returns": []}, |
|||
{ "name": "shh_getMessages", "params": [""], "order": [], "returns": []} |
|||
] |
|||
|
|||
|
Loading…
Reference in new issue