Ethers.js-检索事件

Ethers.js-检索事件

事件Event

智能合约释放出的事件存储于以太坊虚拟机的日志中。日志分为两个主题topics和数据data部分,其中事件哈希和indexed变量存储在topics中,作为索引方便以后搜索;没有indexed变量存储在data中,不能被直接检索,但可以存储更复杂的数据结构。
以ERC20代币中的Transfer转账事件为例,在合约中它是这样声明的:

event Transfer(address indexed from, address indexed to, uint256 amount);

它共记录了3个变量from,to和amount,分别对应代币的发出地址,接收地址和转账数量,其中from和to前面带有indexed关键字。转账时,Transfer事件会被记录,可以在etherscan中查到。

检索事件

const transferEvents = await contract.queryFilter('事件名', 起始区块, 结束区块)

queryFilter()包含3个参数,分别是事件名(必填),起始区块(选填),和结束区块(选填)。检索结果会以数组的方式返回。
注意:要检索的事件必须包含在合约的abi中。

代码示例

import {
    
     ethers } from "ethers";

// 利用Alchemy的rpc节点连接以太坊网络
// 连接sepolia测试网
const ALCHEMY_SEPOLIA_URL = '';
const provider = new ethers.providers.JsonRpcProvider(ALCHEMY_SEPOLIA_URL);

// WETH ABI,只包含我们关心的Transfer事件
const abiWETH = [
    "event Transfer(address indexed from, address indexed to, uint amount)"
];

// Sepolia测试网WETH地址
const addressWETH = '0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9'
// 声明合约实例
const contract = new ethers.Contract(addressWETH, abiWETH, provider)

// 得到当前block
const block = await provider.getBlockNumber()
console.log(`当前区块高度: ${
      
      block}`);
console.log(`打印事件详情:`);
const transferEvents = await contract.queryFilter('Transfer', block - 10, block)
// 打印第1个Transfer事件
console.log(transferEvents[0])

// 解析Transfer事件的数据(变量在args中)
console.log("\n2. 解析事件:")
const amount = ethers.utils.formatUnits(ethers.utils.parseUnits(transferEvents[0].args["amount"].toString(), "ether"), "ether");
console.log(`地址 ${
      
      transferEvents[0].args["from"]} 转账${
      
      amount} WETH 到地址 ${
      
      transferEvents[0].args["to"]}`)

猜你喜欢

转载自blog.csdn.net/Geoffrey_Zhu/article/details/142843568