Solidity

使用 Web3 讀取 Solidity 內部合約的事件

  • May 9, 2019

假設我有

contract A {
   event E();

   function a() public {
       emit E();
   }
}

contract B {
   A private a;

   function b() public {
       a();
   }
}

現在我的 Dapp 正在呼叫該方法b

const contractB = new web3.eth.Contract(BAbi, address)
const receipt = await contractB.methods.B().send({ /* options */ })
const {events, logs} = receipt

events將包含一個編碼事件。該事件將沒有事件名稱,也沒有解碼參數(在returnValues欄位中)。考慮一下這是有道理的,因為事件描述沒有放入契約的 ABI 中,B而是放入A. 所以事件描述不是提供給契約的事件。

我找到了一種直接的方法來解決這個問題,方法是使用契約B事件擴展契約 ABI AA在裡面B,所以B可以呼叫A方法和触發A事件。雖然A’s 方法被封裝,但A’s 事件沒有。通過這種構想,將A’s 事件包含在中是有意義的B

這可以通過複製粘貼或程式碼手動完成:

const eventsA = extractEvents(AAbi)
const extendedAbi = [...BAbi, ...eventsA]
const contractB = new web3.eth.Contract(extendedAbi, address)
const receipt = await contractB.methods.B().send({ /* options */ })

甚至以更不謹慎的方式:

const extendedAbi = [...BAbi, ...AAbi]

關於這種模式的任何想法?其他解決方案?

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