Solidity
使用 Web3 讀取 Solidity 內部合約的事件
假設我有
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
事件擴展契約 ABIA
。A
在裡面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]
關於這種模式的任何想法?其他解決方案?