events
This commit is contained in:
parent
2491c99b37
commit
80c97ca21b
24
dist/ethereum.js
vendored
24
dist/ethereum.js
vendored
@ -504,32 +504,44 @@ 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;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (index === -1) {
|
if (index === -1) {
|
||||||
console.error('indexed param ' + name + ' not found in the abi');
|
console.error('indexed paray with name ' + name + ' not found');
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
return inputs[index];
|
return inputs[index];
|
||||||
};
|
};
|
||||||
|
|
||||||
var indexedParamsToTopics = function (inputs, indexed) {
|
var indexedParamsToTopics = function (event, indexed) {
|
||||||
Object.keys(indexed).map(function (key) {
|
// sort keys?
|
||||||
var inp = inputWithName(key);
|
return Object.keys(indexed).map(function (key) {
|
||||||
|
// TODO: simplify this!
|
||||||
|
var parser = abi.inputParser([{
|
||||||
|
name: 'test',
|
||||||
|
inputs: [inputWithName(event.inputs, key)]
|
||||||
|
}]);
|
||||||
|
|
||||||
var value = indexed[key];
|
var value = indexed[key];
|
||||||
if (value instanceof Array) {
|
if (value instanceof Array) {
|
||||||
|
return value.map(function (v) {
|
||||||
|
return parser.test(v);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
return parser.test(value);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
var implementationOfEvent = function (address, signature, event) {
|
var implementationOfEvent = 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) {
|
||||||
var o = options || {};
|
var o = options || {};
|
||||||
o.address = address;
|
o.address = address;
|
||||||
o.topic = [];
|
o.topic = [];
|
||||||
o.topic.push(signature);
|
o.topic.push(signature);
|
||||||
|
if (indexed) {
|
||||||
|
o.topic = o.topic.concat(indexedParamsToTopics(event, indexed));
|
||||||
|
}
|
||||||
return o;
|
return o;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
4
dist/ethereum.js.map
vendored
4
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
24
lib/event.js
24
lib/event.js
@ -27,32 +27,44 @@ 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;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (index === -1) {
|
if (index === -1) {
|
||||||
console.error('indexed param ' + name + ' not found in the abi');
|
console.error('indexed paray with name ' + name + ' not found');
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
return inputs[index];
|
return inputs[index];
|
||||||
};
|
};
|
||||||
|
|
||||||
var indexedParamsToTopics = function (inputs, indexed) {
|
var indexedParamsToTopics = function (event, indexed) {
|
||||||
Object.keys(indexed).map(function (key) {
|
// sort keys?
|
||||||
var inp = inputWithName(key);
|
return Object.keys(indexed).map(function (key) {
|
||||||
|
// TODO: simplify this!
|
||||||
|
var parser = abi.inputParser([{
|
||||||
|
name: 'test',
|
||||||
|
inputs: [inputWithName(event.inputs, key)]
|
||||||
|
}]);
|
||||||
|
|
||||||
var value = indexed[key];
|
var value = indexed[key];
|
||||||
if (value instanceof Array) {
|
if (value instanceof Array) {
|
||||||
|
return value.map(function (v) {
|
||||||
|
return parser.test(v);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
return parser.test(value);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
var implementationOfEvent = function (address, signature, event) {
|
var implementationOfEvent = 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) {
|
||||||
var o = options || {};
|
var o = options || {};
|
||||||
o.address = address;
|
o.address = address;
|
||||||
o.topic = [];
|
o.topic = [];
|
||||||
o.topic.push(signature);
|
o.topic.push(signature);
|
||||||
|
if (indexed) {
|
||||||
|
o.topic = o.topic.concat(indexedParamsToTopics(event, indexed));
|
||||||
|
}
|
||||||
return o;
|
return o;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
var assert = require('assert');
|
var assert = require('assert');
|
||||||
var event = require('../lib/event.js');
|
var event = require('../lib/event.js');
|
||||||
|
var f = require('../lib/formatters.js');
|
||||||
|
|
||||||
describe('event', function () {
|
describe('event', function () {
|
||||||
it('should create basic filter input object', function () {
|
it('should create basic filter input object', function () {
|
||||||
@ -7,9 +8,13 @@ describe('event', function () {
|
|||||||
// given
|
// given
|
||||||
var address = '0x012345';
|
var address = '0x012345';
|
||||||
var signature = '0x987654';
|
var signature = '0x987654';
|
||||||
|
var e = {
|
||||||
|
name: 'Event',
|
||||||
|
inputs: [{"name":"a","type":"uint256","indexed":true},{"name":"b","type":"hash256","indexed":false}]
|
||||||
|
};
|
||||||
|
|
||||||
// when
|
// when
|
||||||
var impl = event(address, signature);
|
var impl = event(address, signature, e);
|
||||||
var result = impl();
|
var result = impl();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
@ -19,7 +24,7 @@ describe('event', function () {
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should create basic filter input object', function () {
|
it('should create filter input object with options', function () {
|
||||||
|
|
||||||
// given
|
// given
|
||||||
var address = '0x012345';
|
var address = '0x012345';
|
||||||
@ -30,9 +35,13 @@ describe('event', function () {
|
|||||||
offset: 3,
|
offset: 3,
|
||||||
max: 4
|
max: 4
|
||||||
};
|
};
|
||||||
|
var e = {
|
||||||
|
name: 'Event',
|
||||||
|
inputs: [{"name":"a","type":"uint256","indexed":true},{"name":"b","type":"hash256","indexed":false}]
|
||||||
|
};
|
||||||
|
|
||||||
// when
|
// when
|
||||||
var impl = event(address, signature);
|
var impl = event(address, signature, e);
|
||||||
var result = impl({}, options);
|
var result = impl({}, options);
|
||||||
|
|
||||||
// then
|
// then
|
||||||
@ -46,5 +55,70 @@ describe('event', function () {
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user