Есть ли способ отслеживать события из нескольких контрактов только с одним оператором наблюдения (что-то вроде [contract1.event, contract2.event, ...].watchAll()
) в Javascript?
Код предназначен только для иллюстрации:
var event = contract.EventName({from: address}); // watching multiple contracts/events possible?
event.watch(function(err, result) {
...
});
Существует встроенная функция для прослушивания всех событий в одном операторе наблюдения.
var events = myContractInstance.allEvents([additionalFilterObject]); // следим за изменениями events.watch (функция (ошибка, результат) { если (! ошибка) console.log(результат); });
additionalFilterObject
может использоваться для фильтрации результатов; пример добавления адреса будет{address: myAddress}
С другой стороны, не представляется возможным фильтровать события, используя имена, если вы не укажете темы, где additionalFilterObject
адреса тем являются хэшем события/функции (например, keccak256 имени вашего события keccak256('EventName1(uint)')
), тогда у вас будет что-то вроде:
var events = myContractInstance.allEvents({адрес: мой адрес, темы: [['0x1234...', '0x5678...']]}); // следим за изменениями events.watch (функция (ошибка, результат) { если (! ошибка) console.log(результат); });
но вы можете проверить результат события и отфильтровать имя события в соответствии с событиями, которые вы хотите прослушать:
var events = myContractInstance.allEvents([additionalFilterObject]); // следим за изменениями events.watch (функция (ошибка, результат) { если (! ошибка) { if(['EventName1', 'EventName2'].includes(result.event)) { //делать } } });
и это было бы более читабельно, может быть. Другим менее элегантным решением может быть
var event1 = contract.EventName1 ({от: адрес}); var event2 = contract.EventName2 ({от: адрес}); event1.watch(мойCallback); event2.watch(мойCallback); функция myCallback(ошибка, результат) { }
метод allEvents() не будет работать. "web3": "^1.0.0-beta.36".
Это вызовет ошибку
allEvents is not a function
Это не будет работать даже для некоторых других версий. См. здесь https://github.com/ethereum/web3.js/issues/989. У меня это тоже не сработало, я использую «web3»: «^ 1.0.0-beta.36». Если у кого-то есть альтернатива, поделитесь.
AirUp
мирг