- Published on
ethers.jsでemitされたeventをlistenする方法
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のイベントかつ、その後の引数にあったものだけを
フィルター(選定)することができます。今回だと、from
をmyAddress
としているので、
自分から送ったlogをフィルターすることができます。
次に、contract.on
で購読する対象を決めます。
上記のように設定済みのfilterを購読することで、無駄なlogを購読せずにフィルターしたものみ
を購読できるようになります。
contract.on(filter, (arg) => {})
という形で、argはTransfer Eventでemitされる際のイベントの引数に対応します。
他のemitされるイベントも同じ要領で購読できるようになります。