mirror of https://github.com/ethereum/go-ethereum
commit
292f7ada8e
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,76 @@ |
||||
<!doctype> |
||||
<html> |
||||
|
||||
<head> |
||||
<script type="text/javascript" src="js/bignumber.js/bignumber.min.js"></script> |
||||
<script type="text/javascript" src="../dist/ethereum.js"></script> |
||||
<script type="text/javascript"> |
||||
|
||||
var web3 = require('web3'); |
||||
web3.setProvider(new web3.providers.HttpSyncProvider()); |
||||
|
||||
// solidity source code |
||||
var source = "" + |
||||
"contract test {\n" + |
||||
" function multiply(uint[] a) returns(uint d) {\n" + |
||||
" return a[0] + a[1];\n" + |
||||
" }\n" + |
||||
"}\n"; |
||||
|
||||
// contract description, this will be autogenerated somehow |
||||
var desc = [{ |
||||
"name": "multiply(uint256[])", |
||||
"type": "function", |
||||
"inputs": [ |
||||
{ |
||||
"name": "a", |
||||
"type": "uint256[]" |
||||
} |
||||
], |
||||
"outputs": [ |
||||
{ |
||||
"name": "d", |
||||
"type": "uint256" |
||||
} |
||||
] |
||||
}]; |
||||
|
||||
var contract; |
||||
|
||||
function createExampleContract() { |
||||
// hide create button |
||||
document.getElementById('create').style.visibility = 'hidden'; |
||||
document.getElementById('source').innerText = source; |
||||
|
||||
// create contract |
||||
var address = web3.eth.transact({code: web3.eth.solidity(source)}); |
||||
contract = web3.eth.contract(address, desc); |
||||
document.getElementById('call').style.visibility = 'visible'; |
||||
} |
||||
|
||||
function callExampleContract() { |
||||
// this should be generated by ethereum |
||||
var param = parseInt(document.getElementById('value').value); |
||||
var param2 = parseInt(document.getElementById('value2').value); |
||||
|
||||
// call the contract |
||||
var res = contract.call().multiply([param, param2]); |
||||
document.getElementById('result').innerText = res.toString(10); |
||||
} |
||||
|
||||
</script> |
||||
</head> |
||||
<body> |
||||
<h1>contract</h1> |
||||
<div id="source"></div> |
||||
<div id='create'> |
||||
<button type="button" onClick="createExampleContract();">create example contract</button> |
||||
</div> |
||||
<div id='call' style='visibility: hidden;'> |
||||
<input type="number" id="value" onkeyup='callExampleContract()'></input> |
||||
<input type="number" id="value2" onkeyup='callExampleContract()'></input> |
||||
</div> |
||||
<div id="result"></div> |
||||
</body> |
||||
</html> |
||||
|
@ -0,0 +1,120 @@ |
||||
<!doctype> |
||||
<html> |
||||
<head> |
||||
<script type="text/javascript" src="js/bignumber.js/bignumber.min.js"></script> |
||||
<script type="text/javascript" src="../dist/ethereum.js"></script> |
||||
<script type="text/javascript"> |
||||
var web3 = require('web3'); |
||||
web3.setProvider(new web3.providers.HttpSyncProvider('http://localhost:8080')); |
||||
|
||||
var desc = [{ |
||||
"type":"event", |
||||
"inputs": [{"name":"a","type":"uint256","indexed":true},{"name":"b","type":"hash256","indexed":false}], |
||||
"name":"Event" |
||||
}, { |
||||
"type":"event", |
||||
"inputs": [{"name":"a","type":"uint256","indexed":true},{"name":"b","type":"hash256","indexed":false}], |
||||
"name":"Event2" |
||||
}, { |
||||
"type":"function", |
||||
"inputs": [{"name":"a","type":"uint256"}], |
||||
"name":"foo", |
||||
"outputs": [] |
||||
}]; |
||||
|
||||
var address = '0x01'; |
||||
|
||||
var contract = web3.eth.contract(address, desc); |
||||
|
||||
function test1() { |
||||
// "{"topic":["0x83c9849c","0xc4d76332"],"address":"0x01"}" |
||||
web3.eth.watch(contract).changed(function (res) { |
||||
|
||||
}); |
||||
}; |
||||
|
||||
function test2() { |
||||
// "{"topic":["0x83c9849c"],"address":"0x01"}" |
||||
web3.eth.watch(contract.Event).changed(function (res) { |
||||
|
||||
}); |
||||
}; |
||||
|
||||
function test3() { |
||||
// "{"topic":["0x83c9849c"],"address":"0x01"}" |
||||
contract.Event().changed(function (res) { |
||||
|
||||
}); |
||||
}; |
||||
|
||||
function test4() { |
||||
// "{"topic":["0x83c9849c","0000000000000000000000000000000000000000000000000000000000000045"],"address":"0x01"}" |
||||
contract.Event({a: 69}).changed(function (res) { |
||||
|
||||
}); |
||||
}; |
||||
|
||||
function test5() { |
||||
// "{"topic":["0x83c9849c",["0000000000000000000000000000000000000000000000000000000000000045","000000000000000000000000000000000000000000000000000000000000002a"]],"address":"0x01"}" |
||||
contract.Event({a: [69, 42]}).changed(function (res) { |
||||
|
||||
}); |
||||
}; |
||||
|
||||
function test6() { |
||||
// "{"topic":["0x83c9849c","000000000000000000000000000000000000000000000000000000000000001e"],"max":100,"address":"0x01"}" |
||||
contract.Event({a: 30}, {max: 100}).changed(function (res) { |
||||
|
||||
}); |
||||
}; |
||||
|
||||
function test7() { |
||||
// "{"topic":["0x83c9849c","000000000000000000000000000000000000000000000000000000000000001e"],"address":"0x01"}" |
||||
web3.eth.watch(contract.Event, {a: 30}).changed(function (res) { |
||||
|
||||
}); |
||||
}; |
||||
|
||||
function test8() { |
||||
// "{"topic":["0x83c9849c","000000000000000000000000000000000000000000000000000000000000001e"],"max":100,"address":"0x01"}" |
||||
web3.eth.watch(contract.Event, {a: 30}, {max: 100}).changed(function (res) { |
||||
|
||||
}); |
||||
}; |
||||
|
||||
// not valid |
||||
// function testX() { |
||||
// web3.eth.watch([contract.Event, contract.Event2]).changed(function (res) { |
||||
// }); |
||||
// }; |
||||
|
||||
</script> |
||||
</head> |
||||
|
||||
<body> |
||||
<div> |
||||
<button type="button" onClick="test1();">test1</button> |
||||
</div> |
||||
<div> |
||||
<button type="button" onClick="test2();">test2</button> |
||||
</div> |
||||
<div> |
||||
<button type="button" onClick="test3();">test3</button> |
||||
</div> |
||||
<div> |
||||
<button type="button" onClick="test4();">test4</button> |
||||
</div> |
||||
<div> |
||||
<button type="button" onClick="test5();">test5</button> |
||||
</div> |
||||
<div> |
||||
<button type="button" onClick="test6();">test6</button> |
||||
</div> |
||||
<div> |
||||
<button type="button" onClick="test7();">test7</button> |
||||
</div> |
||||
<div> |
||||
<button type="button" onClick="test8();">test8</button> |
||||
</div> |
||||
</body> |
||||
</html> |
@ -0,0 +1,66 @@ |
||||
<!doctype> |
||||
<html> |
||||
<head> |
||||
<script type="text/javascript" src="js/bignumber.js/bignumber.min.js"></script> |
||||
<script type="text/javascript" src="../dist/ethereum.js"></script> |
||||
<script type="text/javascript"> |
||||
var web3 = require('web3'); |
||||
web3.setProvider(new web3.providers.HttpSyncProvider('http://localhost:8080')); |
||||
|
||||
var source = "" + |
||||
"contract Contract { " + |
||||
" event Incremented(bool indexed odd, uint x); " + |
||||
" function Contract() { " + |
||||
" x = 69; " + |
||||
" } " + |
||||
" function inc() { " + |
||||
" ++x; " + |
||||
" Incremented(x % 2 == 1, x); " + |
||||
" } " + |
||||
" uint x; " + |
||||
"}"; |
||||
|
||||
var desc = [{ |
||||
"type":"event", |
||||
"name":"Incremented", |
||||
"inputs": [{"name":"odd","type":"bool","indexed":true},{"name":"x","type":"uint","indexed":false}], |
||||
}, { |
||||
"type":"function", |
||||
"name":"inc", |
||||
"inputs": [], |
||||
"outputs": [] |
||||
}]; |
||||
|
||||
var address; |
||||
var contract; |
||||
|
||||
var update = function (x) { |
||||
document.getElementById('result').innerText = JSON.stringify(x); |
||||
}; |
||||
|
||||
var createContract = function () { |
||||
address = web3.eth.transact({code: web3.eth.solidity(source)}); |
||||
contract = web3.eth.contract(address, desc); |
||||
contract.Incremented({odd: true}).changed(update); |
||||
|
||||
}; |
||||
|
||||
var callContract = function () { |
||||
contract.call().inc(); |
||||
}; |
||||
|
||||
|
||||
</script> |
||||
</head> |
||||
|
||||
<body> |
||||
<div> |
||||
<button type="button" onClick="createContract();">create contract</button> |
||||
</div> |
||||
<div> |
||||
<button type="button" onClick="callContract();">test1</button> |
||||
</div> |
||||
<div id="result"> |
||||
</div> |
||||
</body> |
||||
</html> |
@ -0,0 +1,56 @@ |
||||
/* |
||||
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 const.js |
||||
* @authors: |
||||
* Marek Kotewicz <marek@ethdev.com> |
||||
* @date 2015 |
||||
*/ |
||||
|
||||
/// required to define ETH_BIGNUMBER_ROUNDING_MODE
|
||||
if (process.env.NODE_ENV !== 'build') { |
||||
var BigNumber = require('bignumber.js'); // jshint ignore:line
|
||||
} |
||||
|
||||
var ETH_UNITS = [
|
||||
'wei',
|
||||
'Kwei',
|
||||
'Mwei',
|
||||
'Gwei',
|
||||
'szabo',
|
||||
'finney',
|
||||
'ether',
|
||||
'grand',
|
||||
'Mether',
|
||||
'Gether',
|
||||
'Tether',
|
||||
'Pether',
|
||||
'Eether',
|
||||
'Zether',
|
||||
'Yether',
|
||||
'Nether',
|
||||
'Dether',
|
||||
'Vether',
|
||||
'Uether'
|
||||
]; |
||||
|
||||
module.exports = { |
||||
ETH_PADDING: 32, |
||||
ETH_SIGNATURE_LENGTH: 4, |
||||
ETH_UNITS: ETH_UNITS, |
||||
ETH_BIGNUMBER_ROUNDING_MODE: { ROUNDING_MODE: BigNumber.ROUND_DOWN } |
||||
}; |
||||
|
@ -0,0 +1,135 @@ |
||||
/* |
||||
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 event.js |
||||
* @authors: |
||||
* Marek Kotewicz <marek@ethdev.com> |
||||
* @date 2014 |
||||
*/ |
||||
|
||||
var abi = require('./abi'); |
||||
var utils = require('./utils'); |
||||
|
||||
/// filter inputs array && returns only indexed (or not) inputs
|
||||
/// @param inputs array
|
||||
/// @param bool if result should be an array of indexed params on not
|
||||
/// @returns array of (not?) indexed params
|
||||
var filterInputs = function (inputs, indexed) { |
||||
return inputs.filter(function (current) { |
||||
return current.indexed === indexed; |
||||
}); |
||||
}; |
||||
|
||||
var inputWithName = function (inputs, name) { |
||||
var index = utils.findIndex(inputs, function (input) { |
||||
return input.name === name; |
||||
}); |
||||
|
||||
if (index === -1) { |
||||
console.error('indexed param with name ' + name + ' not found'); |
||||
return undefined; |
||||
} |
||||
return inputs[index]; |
||||
}; |
||||
|
||||
var indexedParamsToTopics = function (event, indexed) { |
||||
// sort keys?
|
||||
return Object.keys(indexed).map(function (key) { |
||||
var inputs = [inputWithName(filterInputs(event.inputs, true), key)]; |
||||
|
||||
var value = indexed[key]; |
||||
if (value instanceof Array) { |
||||
return value.map(function (v) { |
||||
return abi.formatInput(inputs, [v]); |
||||
});
|
||||
} |
||||
return abi.formatInput(inputs, [value]); |
||||
}); |
||||
}; |
||||
|
||||
var inputParser = function (address, signature, event) { |
||||
|
||||
// valid options are 'earliest', 'latest', 'offset' and 'max', as defined for 'eth.watch'
|
||||
return function (indexed, options) { |
||||
var o = options || {}; |
||||
o.address = address; |
||||
o.topic = []; |
||||
o.topic.push(signature); |
||||
if (indexed) { |
||||
o.topic = o.topic.concat(indexedParamsToTopics(event, indexed)); |
||||
} |
||||
return o; |
||||
}; |
||||
}; |
||||
|
||||
var getArgumentsObject = function (inputs, indexed, notIndexed) { |
||||
var indexedCopy = indexed.slice(); |
||||
var notIndexedCopy = notIndexed.slice(); |
||||
return inputs.reduce(function (acc, current) { |
||||
var value; |
||||
if (current.indexed) |
||||
value = indexed.splice(0, 1)[0]; |
||||
else |
||||
value = notIndexed.splice(0, 1)[0]; |
||||
|
||||
acc[current.name] = value; |
||||
return acc; |
||||
}, {});
|
||||
}; |
||||
|
||||
var outputParser = function (event) { |
||||
|
||||
return function (output) { |
||||
var result = { |
||||
event: utils.extractDisplayName(event.name), |
||||
number: output.number, |
||||
args: {} |
||||
}; |
||||
|
||||
if (!output.topic) { |
||||
return result; |
||||
} |
||||
|
||||
var indexedOutputs = filterInputs(event.inputs, true); |
||||
var indexedData = "0x" + output.topic.slice(1, output.topic.length).map(function (topic) { return topic.slice(2); }).join(""); |
||||
var indexedRes = abi.formatOutput(indexedOutputs, indexedData); |
||||
|
||||
var notIndexedOutputs = filterInputs(event.inputs, false); |
||||
var notIndexedRes = abi.formatOutput(notIndexedOutputs, output.data); |
||||
|
||||
result.args = getArgumentsObject(event.inputs, indexedRes, notIndexedRes); |
||||
|
||||
return result; |
||||
}; |
||||
}; |
||||
|
||||
var getMatchingEvent = function (events, payload) { |
||||
for (var i = 0; i < events.length; i++) { |
||||
var signature = abi.eventSignatureFromAscii(events[i].name);
|
||||
if (signature === payload.topic[0]) { |
||||
return events[i]; |
||||
} |
||||
} |
||||
return undefined; |
||||
}; |
||||
|
||||
|
||||
module.exports = { |
||||
inputParser: inputParser, |
||||
outputParser: outputParser, |
||||
getMatchingEvent: getMatchingEvent |
||||
}; |
||||
|
@ -0,0 +1,154 @@ |
||||
/* |
||||
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> |
||||
* @date 2015 |
||||
*/ |
||||
|
||||
if (process.env.NODE_ENV !== 'build') { |
||||
var BigNumber = require('bignumber.js'); // jshint ignore:line
|
||||
} |
||||
|
||||
var utils = require('./utils'); |
||||
var c = require('./const'); |
||||
|
||||
/// @param string string to be padded
|
||||
/// @param number of characters that result string should have
|
||||
/// @param sign, by default 0
|
||||
/// @returns right aligned string
|
||||
var padLeft = function (string, chars, sign) { |
||||
return new Array(chars - string.length + 1).join(sign ? sign : "0") + string; |
||||
}; |
||||
|
||||
/// Formats input value to byte representation of int
|
||||
/// If value is negative, return it's two's complement
|
||||
/// If the value is floating point, round it down
|
||||
/// @returns right-aligned byte representation of int
|
||||
var formatInputInt = function (value) { |
||||
var padding = c.ETH_PADDING * 2; |
||||
if (value instanceof BigNumber || typeof value === 'number') { |
||||
if (typeof value === 'number') |
||||
value = new BigNumber(value); |
||||
BigNumber.config(c.ETH_BIGNUMBER_ROUNDING_MODE); |
||||
value = value.round(); |
||||
|
||||
if (value.lessThan(0))
|
||||
value = new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16).plus(value).plus(1); |
||||
value = value.toString(16); |
||||
} |
||||
else if (value.indexOf('0x') === 0) |
||||
value = value.substr(2); |
||||
else if (typeof value === 'string') |
||||
value = formatInputInt(new BigNumber(value)); |
||||
else |
||||
value = (+value).toString(16); |
||||
return padLeft(value, padding); |
||||
}; |
||||
|
||||
/// Formats input value to byte representation of string
|
||||
/// @returns left-algined byte representation of string
|
||||
var formatInputString = function (value) { |
||||
return utils.fromAscii(value, c.ETH_PADDING).substr(2); |
||||
}; |
||||
|
||||
/// Formats input value to byte representation of bool
|
||||
/// @returns right-aligned byte representation bool
|
||||
var formatInputBool = function (value) { |
||||
return '000000000000000000000000000000000000000000000000000000000000000' + (value ? '1' : '0'); |
||||
}; |
||||
|
||||
/// Formats input value to byte representation of real
|
||||
/// Values are multiplied by 2^m and encoded as integers
|
||||
/// @returns byte representation of real
|
||||
var formatInputReal = function (value) { |
||||
return formatInputInt(new BigNumber(value).times(new BigNumber(2).pow(128)));
|
||||
}; |
||||
|
||||
|
||||
/// Check if input value is negative
|
||||
/// @param value is hex format
|
||||
/// @returns true if it is negative, otherwise false
|
||||
var signedIsNegative = function (value) { |
||||
return (new BigNumber(value.substr(0, 1), 16).toString(2).substr(0, 1)) === '1'; |
||||
}; |
||||
|
||||
/// Formats input right-aligned input bytes to int
|
||||
/// @returns right-aligned input bytes formatted to int
|
||||
var formatOutputInt = function (value) { |
||||
value = value || "0"; |
||||
// check if it's negative number
|
||||
// it it is, return two's complement
|
||||
if (signedIsNegative(value)) { |
||||
return new BigNumber(value, 16).minus(new BigNumber('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 16)).minus(1); |
||||
} |
||||
return new BigNumber(value, 16); |
||||
}; |
||||
|
||||
/// Formats big right-aligned input bytes to uint
|
||||
/// @returns right-aligned input bytes formatted to uint
|
||||
var formatOutputUInt = function (value) { |
||||
value = value || "0"; |
||||
return new BigNumber(value, 16); |
||||
}; |
||||
|
||||
/// @returns input bytes formatted to real
|
||||
var formatOutputReal = function (value) { |
||||
return formatOutputInt(value).dividedBy(new BigNumber(2).pow(128));
|
||||
}; |
||||
|
||||
/// @returns input bytes formatted to ureal
|
||||
var formatOutputUReal = function (value) { |
||||
return formatOutputUInt(value).dividedBy(new BigNumber(2).pow(128));
|
||||
}; |
||||
|
||||
/// @returns right-aligned input bytes formatted to hex
|
||||
var formatOutputHash = function (value) { |
||||
return "0x" + value; |
||||
}; |
||||
|
||||
/// @returns right-aligned input bytes formatted to bool
|
||||
var formatOutputBool = function (value) { |
||||
return value === '0000000000000000000000000000000000000000000000000000000000000001' ? true : false; |
||||
}; |
||||
|
||||
/// @returns left-aligned input bytes formatted to ascii string
|
||||
var formatOutputString = function (value) { |
||||
return utils.toAscii(value); |
||||
}; |
||||
|
||||
/// @returns right-aligned input bytes formatted to address
|
||||
var formatOutputAddress = function (value) { |
||||
return "0x" + value.slice(value.length - 40, value.length); |
||||
}; |
||||
|
||||
|
||||
module.exports = { |
||||
formatInputInt: formatInputInt, |
||||
formatInputString: formatInputString, |
||||
formatInputBool: formatInputBool, |
||||
formatInputReal: formatInputReal, |
||||
formatOutputInt: formatOutputInt, |
||||
formatOutputUInt: formatOutputUInt, |
||||
formatOutputReal: formatOutputReal, |
||||
formatOutputUReal: formatOutputUReal, |
||||
formatOutputHash: formatOutputHash, |
||||
formatOutputBool: formatOutputBool, |
||||
formatOutputString: formatOutputString, |
||||
formatOutputAddress: formatOutputAddress |
||||
}; |
||||
|
@ -0,0 +1,65 @@ |
||||
/* |
||||
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 jsonrpc.js |
||||
* @authors: |
||||
* Marek Kotewicz <marek@ethdev.com> |
||||
* @date 2015 |
||||
*/ |
||||
|
||||
var messageId = 1; |
||||
|
||||
/// Should be called to valid json create payload object
|
||||
/// @param method of jsonrpc call, required
|
||||
/// @param params, an array of method params, optional
|
||||
/// @returns valid jsonrpc payload object
|
||||
var toPayload = function (method, params) { |
||||
if (!method) |
||||
console.error('jsonrpc method should be specified!'); |
||||
|
||||
return { |
||||
jsonrpc: '2.0', |
||||
method: method, |
||||
params: params || [], |
||||
id: messageId++ |
||||
};
|
||||
}; |
||||
|
||||
/// Should be called to check if jsonrpc response is valid
|
||||
/// @returns true if response is valid, otherwise false
|
||||
var isValidResponse = function (response) { |
||||
return !!response && |
||||
!response.error && |
||||
response.jsonrpc === '2.0' && |
||||
typeof response.id === 'number' && |
||||
response.result !== undefined; // only undefined is not valid json object
|
||||
}; |
||||
|
||||
/// Should be called to create batch payload object
|
||||
/// @param messages, an array of objects with method (required) and params (optional) fields
|
||||
var toBatchPayload = function (messages) { |
||||
return messages.map(function (message) { |
||||
return toPayload(message.method, message.params); |
||||
});
|
||||
}; |
||||
|
||||
module.exports = { |
||||
toPayload: toPayload, |
||||
isValidResponse: isValidResponse, |
||||
toBatchPayload: toBatchPayload |
||||
}; |
||||
|
||||
|
@ -0,0 +1,79 @@ |
||||
/* |
||||
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 types.js |
||||
* @authors: |
||||
* Marek Kotewicz <marek@ethdev.com> |
||||
* @date 2015 |
||||
*/ |
||||
|
||||
var f = require('./formatters'); |
||||
|
||||
/// @param expected type prefix (string)
|
||||
/// @returns function which checks if type has matching prefix. if yes, returns true, otherwise false
|
||||
var prefixedType = function (prefix) { |
||||
return function (type) { |
||||
return type.indexOf(prefix) === 0; |
||||
}; |
||||
}; |
||||
|
||||
/// @param expected type name (string)
|
||||
/// @returns function which checks if type is matching expected one. if yes, returns true, otherwise false
|
||||
var namedType = function (name) { |
||||
return function (type) { |
||||
return name === type; |
||||
}; |
||||
}; |
||||
|
||||
/// Setups input formatters for solidity types
|
||||
/// @returns an array of input formatters
|
||||
var inputTypes = function () { |
||||
|
||||
return [ |
||||
{ type: prefixedType('uint'), format: f.formatInputInt }, |
||||
{ type: prefixedType('int'), format: f.formatInputInt }, |
||||
{ type: prefixedType('hash'), format: f.formatInputInt }, |
||||
{ type: prefixedType('string'), format: f.formatInputString },
|
||||
{ type: prefixedType('real'), format: f.formatInputReal }, |
||||
{ type: prefixedType('ureal'), format: f.formatInputReal }, |
||||
{ type: namedType('address'), format: f.formatInputInt }, |
||||
{ type: namedType('bool'), format: f.formatInputBool } |
||||
]; |
||||
}; |
||||
|
||||
/// Setups output formaters for solidity types
|
||||
/// @returns an array of output formatters
|
||||
var outputTypes = function () { |
||||
|
||||
return [ |
||||
{ type: prefixedType('uint'), format: f.formatOutputUInt }, |
||||
{ type: prefixedType('int'), format: f.formatOutputInt }, |
||||
{ type: prefixedType('hash'), format: f.formatOutputHash }, |
||||
{ type: prefixedType('string'), format: f.formatOutputString }, |
||||
{ type: prefixedType('real'), format: f.formatOutputReal }, |
||||
{ type: prefixedType('ureal'), format: f.formatOutputUReal }, |
||||
{ type: namedType('address'), format: f.formatOutputAddress }, |
||||
{ type: namedType('bool'), format: f.formatOutputBool } |
||||
]; |
||||
}; |
||||
|
||||
module.exports = { |
||||
prefixedType: prefixedType, |
||||
namedType: namedType, |
||||
inputTypes: inputTypes, |
||||
outputTypes: outputTypes |
||||
}; |
||||
|
@ -0,0 +1,142 @@ |
||||
/* |
||||
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) { |
||||
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,31 @@ |
||||
{ |
||||
"randomVMtest" : { |
||||
"env" : { |
||||
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", |
||||
"currentDifficulty" : "115792089237316195423570985008687907853269984665640564039457584007913129639935", |
||||
"currentGasLimit" : "1000000", |
||||
"currentNumber" : "300", |
||||
"currentTimestamp" : "2", |
||||
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" |
||||
}, |
||||
"exec" : { |
||||
"address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", |
||||
"caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", |
||||
"code" : "0x404544420855", |
||||
"data" : "0x", |
||||
"gas" : "10000", |
||||
"gasPrice" : "100000000000000", |
||||
"origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", |
||||
"value" : "1000000000000000000" |
||||
}, |
||||
"pre" : { |
||||
"0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { |
||||
"balance" : "1000000000000000000", |
||||
"code" : "0x404544420855", |
||||
"nonce" : "0", |
||||
"storage" : { |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,59 @@ |
||||
{ |
||||
"randomVMtest" : { |
||||
"callcreates" : [ |
||||
{ |
||||
"data" : "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", |
||||
"destination" : "", |
||||
"gasLimit" : "9872", |
||||
"value" : "2" |
||||
}, |
||||
{ |
||||
"data" : "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", |
||||
"destination" : "", |
||||
"gasLimit" : "9770", |
||||
"value" : "9870" |
||||
} |
||||
], |
||||
"env" : { |
||||
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", |
||||
"currentDifficulty" : "115792089237316195423570985008687907853269984665640564039457584007913129639935", |
||||
"currentGasLimit" : "1000000", |
||||
"currentNumber" : "300", |
||||
"currentTimestamp" : "2", |
||||
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" |
||||
}, |
||||
"exec" : { |
||||
"address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", |
||||
"caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", |
||||
"code" : "0x424443444243434383f0155af055", |
||||
"data" : "0x", |
||||
"gas" : "10000", |
||||
"gasPrice" : "100000000000000", |
||||
"origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", |
||||
"value" : "1000000000000000000" |
||||
}, |
||||
"gas" : "9470", |
||||
"logs" : [ |
||||
], |
||||
"out" : "0x", |
||||
"post" : { |
||||
"0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { |
||||
"balance" : "999999999999990128", |
||||
"code" : "0x424443444243434383f0155af055", |
||||
"nonce" : "0", |
||||
"storage" : { |
||||
"0x945304eb96065b2a98b57a48a06ae28d285a71b5" : "0x02" |
||||
} |
||||
} |
||||
}, |
||||
"pre" : { |
||||
"0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { |
||||
"balance" : "1000000000000000000", |
||||
"code" : "0x424443444243434383f0155af055", |
||||
"nonce" : "0", |
||||
"storage" : { |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue