監聽與過濾

Yan Ru Su

過濾

尋找過去特定的 Event
利用 Ethers v6 的 .queryFilter

1
contract.queryFilter(contract.filters.Transfer(null, null),fromblock,toblock);

第一欄放 Event 名稱與指定的參數,第二欄放區塊起始,第三欄放區塊終止,需要注意的是 ALCHEMY API 的搜尋區塊範圍只有 10 個區塊。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
require('dotenv').config();
const { ethers } = require("hardhat");

const provider = new ethers.JsonRpcProvider(`https://eth-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}`);
const contractaddr = "0xdAC17F958D2ee523a2206206994597C13D831ec7";
const contractABI = ["event Transfer(address indexed from, address indexed to, uint256 value)"];
const fromblock = 24230331
const toblock = 24230332

async function main(){
//作法1
const contract = new ethers.Contract(contractaddr,contractABI,provider);
const log = await contract.queryFilter(contract.filters.Transfer(null, null),fromblock,toblock);
// const log = await contract.queryFilter("Transfer",fromblock,toblock)
console.log("From:", log[0].args[0], "To:", log[0].args[1], "Value:", Number(log[0].args[2]/1000000n));
console.log(log[0]);

//作法2
const iface = new ethers.Interface(contractABI);
const from = "0x3C02290922a3618A4646E3BbCa65853eA45FE7C6";
const to = "0xFAdEf4c677C2f31F43f09e239b34D0F6905a3085"
const filter = {
address: contractaddr,
topics: [
iface.getEvent("Transfer").topicHash,
ethers.zeroPadValue(from, 32),
ethers.zeroPadValue(to, 32),
],
fromBlock: fromblock,
toBlock: toblock
};

const log = await provider.getLogs(filter);
console.log(log[0]);
console.log(Number(log[0].data) / 1e6);

}
main().catch(console.error);

監聽

即時監聽鏈上事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
async function listen() {
const provider = new ethers.WebSocketProvider(`https://eth-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}`);
const contract = new ethers.Contract(contractaddr,contractABI,provider);
contract.once('Transfer', (from, to, value, event) => {
console.log({
from,
to,
value: ethers.formatUnits(value, 6),
blockNumber: event.log.blockNumber,
txHash: event.log.transactionHash
});
});

}
listen().catch(console.error)
On this page
監聽與過濾