Published on

ethers.jsでemitされたeventをlistenする方法

Authors
  • avatar
    Name
    ssu
    Twitter

smart contractでeventをemitした際に、 ethers.jsでeventをlistenして、 何らかのアクションを取りたい時があります。

その際のやり方を紹介したいと思います。 たとえば、ERC20のtokenをtransferして、 そのeventを購読して、transferされたらそれをconsoleに表示するには たとえば、下記のようなコードになります。(reactを想定)

abi = [ "event Transfer(address indexed src, address indexed dst, uint val)" ]; useEffect(() => { const contract = new Contract(tokenAddress, abi, provider); const filter = contract.filters.Transfer(myAddress, null, null) contract.on(filter, (from, to, amount) => { console.log(`send to: ${to} ${amount}`) }) , []}

contract.filters.Transferでtransferのイベントかつ、その後の引数にあったものだけを フィルター(選定)することができます。今回だと、frommyAddressとしているので、 自分から送ったlogをフィルターすることができます。

次に、contract.onで購読する対象を決めます。 上記のように設定済みのfilterを購読することで、無駄なlogを購読せずにフィルターしたものみ を購読できるようになります。

contract.on(filter, (arg) => {})という形で、argはTransfer Eventでemitされる際のイベントの引数に対応します。

他のemitされるイベントも同じ要領で購読できるようになります。

参考: Listening to Events

参考: events logs and filtering

参考: ERC20 interface

参考: Contract-on