Смотреть несколько контрактов/событий?

Есть ли способ отслеживать события из нескольких контрактов только с одним оператором наблюдения (что-то вроде [contract1.event, contract2.event, ...].watchAll()) в Javascript?

Код предназначен только для иллюстрации:

   var event = contract.EventName({from: address}); // watching multiple contracts/events possible?
   event.watch(function(err, result) {
         ...
   });

Ответы (2)

Существует встроенная функция для прослушивания всех событий в одном операторе наблюдения.

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(ошибка, результат) {
}
Спасибо за ответ, буду исходить из того, что нельзя смотреть разные контракты и их события (только все события из одного контракта соответственно).
извините, я неправильно понял ваш вопрос. Я прочитал его слишком быстро и только сейчас узнаю, что вы говорили о разных контрактах. В этом случае вы можете взглянуть на web3.eth.filter. Возможно, это поможет вам github.com/ethereum/wiki/wiki/JavaScript-API#web3ethfilter

метод 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». Если у кого-то есть альтернатива, поделитесь.