event outputParser && tests
This commit is contained in:
parent
9d9c23e315
commit
03faec9d41
28
dist/ethereum.js
vendored
28
dist/ethereum.js
vendored
@ -409,7 +409,7 @@ var addEventsToContract = function (contract, desc, address) {
|
|||||||
var impl = function () {
|
var impl = function () {
|
||||||
var params = Array.prototype.slice.call(arguments);
|
var params = Array.prototype.slice.call(arguments);
|
||||||
var signature = abi.eventSignatureFromAscii(e.name);
|
var signature = abi.eventSignatureFromAscii(e.name);
|
||||||
var event = eventImpl(address, signature, e);
|
var event = eventImpl.inputParser(address, signature, e);
|
||||||
var o = event.apply(null, params);
|
var o = event.apply(null, params);
|
||||||
return web3.eth.watch(o);
|
return web3.eth.watch(o);
|
||||||
};
|
};
|
||||||
@ -504,6 +504,16 @@ module.exports = contract;
|
|||||||
var abi = require('./abi');
|
var abi = require('./abi');
|
||||||
var utils = require('./utils');
|
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 inputs.indexed === indexed;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
var inputWithName = function (inputs, name) {
|
var inputWithName = function (inputs, name) {
|
||||||
var index = utils.findIndex(inputs, function (input) {
|
var index = utils.findIndex(inputs, function (input) {
|
||||||
return input.name === name;
|
return input.name === name;
|
||||||
@ -519,7 +529,7 @@ var inputWithName = function (inputs, name) {
|
|||||||
var indexedParamsToTopics = function (event, indexed) {
|
var indexedParamsToTopics = function (event, indexed) {
|
||||||
// sort keys?
|
// sort keys?
|
||||||
return Object.keys(indexed).map(function (key) {
|
return Object.keys(indexed).map(function (key) {
|
||||||
var inputs = [inputWithName(event.inputs, key)];
|
var inputs = [inputWithName(filterInputs(event.inputs, true), key)];
|
||||||
|
|
||||||
var value = indexed[key];
|
var value = indexed[key];
|
||||||
if (value instanceof Array) {
|
if (value instanceof Array) {
|
||||||
@ -531,7 +541,7 @@ var indexedParamsToTopics = function (event, indexed) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
var implementationOfEvent = function (address, signature, event) {
|
var inputParser = function (address, signature, event) {
|
||||||
|
|
||||||
// valid options are 'earliest', 'latest', 'offset' and 'max', as defined for 'eth.watch'
|
// valid options are 'earliest', 'latest', 'offset' and 'max', as defined for 'eth.watch'
|
||||||
return function (indexed, options) {
|
return function (indexed, options) {
|
||||||
@ -546,7 +556,17 @@ var implementationOfEvent = function (address, signature, event) {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = implementationOfEvent;
|
var outputParser = function (event) {
|
||||||
|
|
||||||
|
return function (output) {
|
||||||
|
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
inputParser: inputParser,
|
||||||
|
outputParser: outputParser
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
},{"./abi":1,"./utils":11}],5:[function(require,module,exports){
|
},{"./abi":1,"./utils":11}],5:[function(require,module,exports){
|
||||||
|
6
dist/ethereum.js.map
vendored
6
dist/ethereum.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/ethereum.min.js
vendored
2
dist/ethereum.min.js
vendored
File diff suppressed because one or more lines are too long
@ -138,7 +138,7 @@ var addEventsToContract = function (contract, desc, address) {
|
|||||||
var impl = function () {
|
var impl = function () {
|
||||||
var params = Array.prototype.slice.call(arguments);
|
var params = Array.prototype.slice.call(arguments);
|
||||||
var signature = abi.eventSignatureFromAscii(e.name);
|
var signature = abi.eventSignatureFromAscii(e.name);
|
||||||
var event = eventImpl(address, signature, e);
|
var event = eventImpl.inputParser(address, signature, e);
|
||||||
var o = event.apply(null, params);
|
var o = event.apply(null, params);
|
||||||
return web3.eth.watch(o);
|
return web3.eth.watch(o);
|
||||||
};
|
};
|
||||||
|
56
lib/event.js
56
lib/event.js
@ -23,6 +23,16 @@
|
|||||||
var abi = require('./abi');
|
var abi = require('./abi');
|
||||||
var utils = require('./utils');
|
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 inputWithName = function (inputs, name) {
|
||||||
var index = utils.findIndex(inputs, function (input) {
|
var index = utils.findIndex(inputs, function (input) {
|
||||||
return input.name === name;
|
return input.name === name;
|
||||||
@ -38,7 +48,7 @@ var inputWithName = function (inputs, name) {
|
|||||||
var indexedParamsToTopics = function (event, indexed) {
|
var indexedParamsToTopics = function (event, indexed) {
|
||||||
// sort keys?
|
// sort keys?
|
||||||
return Object.keys(indexed).map(function (key) {
|
return Object.keys(indexed).map(function (key) {
|
||||||
var inputs = [inputWithName(event.inputs, key)];
|
var inputs = [inputWithName(filterInputs(event.inputs, true), key)];
|
||||||
|
|
||||||
var value = indexed[key];
|
var value = indexed[key];
|
||||||
if (value instanceof Array) {
|
if (value instanceof Array) {
|
||||||
@ -50,7 +60,7 @@ var indexedParamsToTopics = function (event, indexed) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
var implementationOfEvent = function (address, signature, event) {
|
var inputParser = function (address, signature, event) {
|
||||||
|
|
||||||
// valid options are 'earliest', 'latest', 'offset' and 'max', as defined for 'eth.watch'
|
// valid options are 'earliest', 'latest', 'offset' and 'max', as defined for 'eth.watch'
|
||||||
return function (indexed, options) {
|
return function (indexed, options) {
|
||||||
@ -65,5 +75,45 @@ var implementationOfEvent = function (address, signature, event) {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = implementationOfEvent;
|
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
|
||||||
|
};
|
||||||
|
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
inputParser: inputParser,
|
||||||
|
outputParser: outputParser
|
||||||
|
};
|
||||||
|
|
||||||
|
125
test/event.inputParser.js
Normal file
125
test/event.inputParser.js
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
var assert = require('assert');
|
||||||
|
var event = require('../lib/event.js');
|
||||||
|
var f = require('../lib/formatters.js');
|
||||||
|
|
||||||
|
describe('event', function () {
|
||||||
|
describe('inputParser', function () {
|
||||||
|
it('should create basic filter input object', function () {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var address = '0x012345';
|
||||||
|
var signature = '0x987654';
|
||||||
|
var e = {
|
||||||
|
name: 'Event',
|
||||||
|
inputs: [{"name":"a","type":"uint256","indexed":true},{"name":"b","type":"hash256","indexed":false}]
|
||||||
|
};
|
||||||
|
|
||||||
|
// when
|
||||||
|
var impl = event.inputParser(address, signature, e);
|
||||||
|
var result = impl();
|
||||||
|
|
||||||
|
// then
|
||||||
|
assert.equal(result.address, address);
|
||||||
|
assert.equal(result.topic.length, 1);
|
||||||
|
assert.equal(result.topic[0], signature);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create filter input object with options', function () {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var address = '0x012345';
|
||||||
|
var signature = '0x987654';
|
||||||
|
var options = {
|
||||||
|
earliest: 1,
|
||||||
|
latest: 2,
|
||||||
|
offset: 3,
|
||||||
|
max: 4
|
||||||
|
};
|
||||||
|
var e = {
|
||||||
|
name: 'Event',
|
||||||
|
inputs: [{"name":"a","type":"uint256","indexed":true},{"name":"b","type":"hash256","indexed":false}]
|
||||||
|
};
|
||||||
|
|
||||||
|
// when
|
||||||
|
var impl = event.inputParser(address, signature, e);
|
||||||
|
var result = impl({}, options);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assert.equal(result.address, address);
|
||||||
|
assert.equal(result.topic.length, 1);
|
||||||
|
assert.equal(result.topic[0], signature);
|
||||||
|
assert.equal(result.earliest, options.earliest);
|
||||||
|
assert.equal(result.latest, options.latest);
|
||||||
|
assert.equal(result.offset, options.offset);
|
||||||
|
assert.equal(result.max, options.max);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create filter input object with indexed params', function () {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var address = '0x012345';
|
||||||
|
var signature = '0x987654';
|
||||||
|
var options = {
|
||||||
|
earliest: 1,
|
||||||
|
latest: 2,
|
||||||
|
offset: 3,
|
||||||
|
max: 4
|
||||||
|
};
|
||||||
|
var e = {
|
||||||
|
name: 'Event',
|
||||||
|
inputs: [{"name":"a","type":"uint256","indexed":true},{"name":"b","type":"hash256","indexed":false}]
|
||||||
|
};
|
||||||
|
|
||||||
|
// when
|
||||||
|
var impl = event.inputParser(address, signature, e);
|
||||||
|
var result = impl({a: 4}, options);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assert.equal(result.address, address);
|
||||||
|
assert.equal(result.topic.length, 2);
|
||||||
|
assert.equal(result.topic[0], signature);
|
||||||
|
assert.equal(result.topic[1], f.formatInputInt(4));
|
||||||
|
assert.equal(result.earliest, options.earliest);
|
||||||
|
assert.equal(result.latest, options.latest);
|
||||||
|
assert.equal(result.offset, options.offset);
|
||||||
|
assert.equal(result.max, options.max);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create filter input object with an array of indexed params', function () {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var address = '0x012345';
|
||||||
|
var signature = '0x987654';
|
||||||
|
var options = {
|
||||||
|
earliest: 1,
|
||||||
|
latest: 2,
|
||||||
|
offset: 3,
|
||||||
|
max: 4
|
||||||
|
};
|
||||||
|
var e = {
|
||||||
|
name: 'Event',
|
||||||
|
inputs: [{"name":"a","type":"uint256","indexed":true},{"name":"b","type":"hash256","indexed":false}]
|
||||||
|
};
|
||||||
|
|
||||||
|
// when
|
||||||
|
var impl = event.inputParser(address, signature, e);
|
||||||
|
var result = impl({a: [4, 69]}, options);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assert.equal(result.address, address);
|
||||||
|
assert.equal(result.topic.length, 2);
|
||||||
|
assert.equal(result.topic[0], signature);
|
||||||
|
assert.equal(result.topic[1][0], f.formatInputInt(4));
|
||||||
|
assert.equal(result.topic[1][1], f.formatInputInt(69));
|
||||||
|
assert.equal(result.earliest, options.earliest);
|
||||||
|
assert.equal(result.latest, options.latest);
|
||||||
|
assert.equal(result.offset, options.offset);
|
||||||
|
assert.equal(result.max, options.max);
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
124
test/event.js
124
test/event.js
@ -1,124 +0,0 @@
|
|||||||
var assert = require('assert');
|
|
||||||
var event = require('../lib/event.js');
|
|
||||||
var f = require('../lib/formatters.js');
|
|
||||||
|
|
||||||
describe('event', function () {
|
|
||||||
it('should create basic filter input object', function () {
|
|
||||||
|
|
||||||
// given
|
|
||||||
var address = '0x012345';
|
|
||||||
var signature = '0x987654';
|
|
||||||
var e = {
|
|
||||||
name: 'Event',
|
|
||||||
inputs: [{"name":"a","type":"uint256","indexed":true},{"name":"b","type":"hash256","indexed":false}]
|
|
||||||
};
|
|
||||||
|
|
||||||
// when
|
|
||||||
var impl = event(address, signature, e);
|
|
||||||
var result = impl();
|
|
||||||
|
|
||||||
// then
|
|
||||||
assert.equal(result.address, address);
|
|
||||||
assert.equal(result.topic.length, 1);
|
|
||||||
assert.equal(result.topic[0], signature);
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should create filter input object with options', function () {
|
|
||||||
|
|
||||||
// given
|
|
||||||
var address = '0x012345';
|
|
||||||
var signature = '0x987654';
|
|
||||||
var options = {
|
|
||||||
earliest: 1,
|
|
||||||
latest: 2,
|
|
||||||
offset: 3,
|
|
||||||
max: 4
|
|
||||||
};
|
|
||||||
var e = {
|
|
||||||
name: 'Event',
|
|
||||||
inputs: [{"name":"a","type":"uint256","indexed":true},{"name":"b","type":"hash256","indexed":false}]
|
|
||||||
};
|
|
||||||
|
|
||||||
// when
|
|
||||||
var impl = event(address, signature, e);
|
|
||||||
var result = impl({}, options);
|
|
||||||
|
|
||||||
// then
|
|
||||||
assert.equal(result.address, address);
|
|
||||||
assert.equal(result.topic.length, 1);
|
|
||||||
assert.equal(result.topic[0], signature);
|
|
||||||
assert.equal(result.earliest, options.earliest);
|
|
||||||
assert.equal(result.latest, options.latest);
|
|
||||||
assert.equal(result.offset, options.offset);
|
|
||||||
assert.equal(result.max, options.max);
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should create filter input object with indexed params', function () {
|
|
||||||
|
|
||||||
// given
|
|
||||||
var address = '0x012345';
|
|
||||||
var signature = '0x987654';
|
|
||||||
var options = {
|
|
||||||
earliest: 1,
|
|
||||||
latest: 2,
|
|
||||||
offset: 3,
|
|
||||||
max: 4
|
|
||||||
};
|
|
||||||
var e = {
|
|
||||||
name: 'Event',
|
|
||||||
inputs: [{"name":"a","type":"uint256","indexed":true},{"name":"b","type":"hash256","indexed":false}]
|
|
||||||
};
|
|
||||||
|
|
||||||
// when
|
|
||||||
var impl = event(address, signature, e);
|
|
||||||
var result = impl({a: 4}, options);
|
|
||||||
|
|
||||||
// then
|
|
||||||
assert.equal(result.address, address);
|
|
||||||
assert.equal(result.topic.length, 2);
|
|
||||||
assert.equal(result.topic[0], signature);
|
|
||||||
assert.equal(result.topic[1], f.formatInputInt(4));
|
|
||||||
assert.equal(result.earliest, options.earliest);
|
|
||||||
assert.equal(result.latest, options.latest);
|
|
||||||
assert.equal(result.offset, options.offset);
|
|
||||||
assert.equal(result.max, options.max);
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should create filter input object with an array of indexed params', function () {
|
|
||||||
|
|
||||||
// given
|
|
||||||
var address = '0x012345';
|
|
||||||
var signature = '0x987654';
|
|
||||||
var options = {
|
|
||||||
earliest: 1,
|
|
||||||
latest: 2,
|
|
||||||
offset: 3,
|
|
||||||
max: 4
|
|
||||||
};
|
|
||||||
var e = {
|
|
||||||
name: 'Event',
|
|
||||||
inputs: [{"name":"a","type":"uint256","indexed":true},{"name":"b","type":"hash256","indexed":false}]
|
|
||||||
};
|
|
||||||
|
|
||||||
// when
|
|
||||||
var impl = event(address, signature, e);
|
|
||||||
var result = impl({a: [4, 69]}, options);
|
|
||||||
|
|
||||||
// then
|
|
||||||
assert.equal(result.address, address);
|
|
||||||
assert.equal(result.topic.length, 2);
|
|
||||||
assert.equal(result.topic[0], signature);
|
|
||||||
assert.equal(result.topic[1][0], f.formatInputInt(4));
|
|
||||||
assert.equal(result.topic[1][1], f.formatInputInt(69));
|
|
||||||
assert.equal(result.earliest, options.earliest);
|
|
||||||
assert.equal(result.latest, options.latest);
|
|
||||||
assert.equal(result.offset, options.offset);
|
|
||||||
assert.equal(result.max, options.max);
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
81
test/event.outputParser.js
Normal file
81
test/event.outputParser.js
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
var assert = require('assert');
|
||||||
|
var event = require('../lib/event.js');
|
||||||
|
|
||||||
|
describe('event', function () {
|
||||||
|
describe('outputParser', function () {
|
||||||
|
it('should parse basic event output object', function () {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var output = {
|
||||||
|
"address":"0x78dfc5983baecf65f73e3de3a96cee24e6b7981e",
|
||||||
|
"data":"0x000000000000000000000000000000000000000000000000000000000000004b",
|
||||||
|
"number":2,
|
||||||
|
"topic":[
|
||||||
|
"0x6e61ef44ac2747ff8b84d353a908eb8bd5c3fb118334d57698c5cfc7041196ad",
|
||||||
|
"0x0000000000000000000000000000000000000000000000000000000000000001"
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
var e = {
|
||||||
|
name: 'Event',
|
||||||
|
inputs: [{"name":"a","type":"bool","indexed":true},{"name":"b","type":"uint256","indexed":false}]
|
||||||
|
};
|
||||||
|
|
||||||
|
// when
|
||||||
|
var impl = event.outputParser(e);
|
||||||
|
var result = impl(output);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assert.equal(result.event, 'Event');
|
||||||
|
assert.equal(result.number, 2);
|
||||||
|
assert.equal(Object.keys(result.args).length, 2);
|
||||||
|
assert.equal(result.args.a, true);
|
||||||
|
assert.equal(result.args.b, 75);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse event output object arguments in correct order', function () {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var output = {
|
||||||
|
"address":"0x78dfc5983baecf65f73e3de3a96cee24e6b7981e",
|
||||||
|
"data": "0x" +
|
||||||
|
"000000000000000000000000000000000000000000000000000000000000004b" +
|
||||||
|
"000000000000000000000000000000000000000000000000000000000000004c" +
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001",
|
||||||
|
"number":3,
|
||||||
|
"topic":[
|
||||||
|
"0x6e61ef44ac2747ff8b84d353a908eb8bd5c3fb118334d57698c5cfc7041196ad",
|
||||||
|
"0x0000000000000000000000000000000000000000000000000000000000000001",
|
||||||
|
"0x0000000000000000000000000000000000000000000000000000000000000005"
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
var e = {
|
||||||
|
name: 'Event2',
|
||||||
|
inputs: [
|
||||||
|
{"name":"a","type":"bool","indexed":true},
|
||||||
|
{"name":"b","type":"int","indexed":false},
|
||||||
|
{"name":"c","type":"int","indexed":false},
|
||||||
|
{"name":"d","type":"int","indexed":true},
|
||||||
|
{"name":"e","type":"bool","indexed":false}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
// when
|
||||||
|
var impl = event.outputParser(e);
|
||||||
|
var result = impl(output);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assert.equal(result.event, 'Event2');
|
||||||
|
assert.equal(result.number, 3);
|
||||||
|
assert.equal(Object.keys(result.args).length, 5);
|
||||||
|
assert.equal(result.args.a, true);
|
||||||
|
assert.equal(result.args.b, 75);
|
||||||
|
assert.equal(result.args.c, 76);
|
||||||
|
assert.equal(result.args.d, 5);
|
||||||
|
assert.equal(result.args.e, true);
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
Loading…
Reference in New Issue
Block a user