Solidity

觀看多個契約/事件?

  • October 23, 2018

[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(函式(錯誤,結果){
如果(!錯誤)
控制台.log(結果);
});

additionalFilterObject可用於過濾結果;添加地址的範例是{address: myAddress}

另一方面,似乎不可能使用名稱過濾事件,除非您在additionalFilterObject主題地址是事件/函式雜湊(例如,您的事件名稱的 keccak256 keccak256('EventName1(uint)'))上指定主題,那麼您將有類似的內容:

var events = myContractInstance.allEvents({address: myAddress, topic: [['0x1234...', '0x5678...']]});

// 觀察變化
events.watch(函式(錯誤,結果){
如果(!錯誤)
控制台.log(結果);
});

但是您可以檢查事件結果並根據要偵聽的事件過濾事件名稱:

var events = myContractInstance.allEvents ([additionalFilterObject]);

// 觀察變化
events.watch(函式(錯誤,結果){
如果(!錯誤){
if(['EventName1', 'EventName2'].includes(result.event)) {
//做
}
}
});

這可能更具可讀性。另一個不太優雅的解決方案可能是

var event1 = contract.EventName1({from: address});
var event2 = contract.EventName2({from: address});
event1.watch(myCallback);
event2.watch(myCallback);

函式我的回調(錯誤,結果){
}

引用自:https://ethereum.stackexchange.com/questions/42539