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 params = Array.prototype.slice.call(arguments);
|
||||
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);
|
||||
return web3.eth.watch(o);
|
||||
};
|
||||
@ -504,6 +504,16 @@ module.exports = contract;
|
||||
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 inputs.indexed === indexed;
|
||||
});
|
||||
};
|
||||
|
||||
var inputWithName = function (inputs, name) {
|
||||
var index = utils.findIndex(inputs, function (input) {
|
||||
return input.name === name;
|
||||
@ -519,7 +529,7 @@ var inputWithName = function (inputs, name) {
|
||||
var indexedParamsToTopics = function (event, indexed) {
|
||||
// sort keys?
|
||||
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];
|
||||
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'
|
||||
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){
|
||||
|
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 params = Array.prototype.slice.call(arguments);
|
||||
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);
|
||||
return web3.eth.watch(o);
|
||||
};
|
||||
|
56
lib/event.js
56
lib/event.js
@ -23,6 +23,16 @@
|
||||
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;
|
||||
@ -38,7 +48,7 @@ var inputWithName = function (inputs, name) {
|
||||
var indexedParamsToTopics = function (event, indexed) {
|
||||
// sort keys?
|
||||
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];
|
||||
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'
|
||||
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