web3获取所有事件日志与解码

获取所有事件&解析参数

封装获取所有事件的方法

const getEvents = (address, topic0, fromBlock = 1) => {
    return new Promise((resolve, reject) => {
      axios({
        method: 'get',
        url: `https://api.hecoinfo.com/api?module=logs&action=getLogs
&fromBlock=${fromBlock}
&toBlock=latest
&address=${address}
&topic0=${topic0}
&apikey=982S8JF95E4K4J46SMA2Y4I93UZH5WRMIC`
      }).then(async res => {
        let result = res.data.result
        if (result.length >= 1000) {
          result = result.concat(await getEvents(address, topic0, Number(result[result.length - 1].blockNumber+1)))
        } else {
          resolve(result)
        }
      }).catch((e) => {
        reject()
      })
    })
  }

使用

import {getWeb3 as getClientWeb3, Contract as ClientContract} from '@chainstarter/multicall-client.js'

//事件名称
const eventName = 'CreatePropose'
const web3 = getClientWeb3(ChainId.HECO)
// 事件abi
const eventAbi = abis.find(item => item.name === eventName && item.type === 'event')
// 获取事件topic0
const topic0 = web3.eth.abi.encodeEventSignature(eventAbi)
// 获取eventName所有事件
const datas = await getEvents(voteMain.address, topic0, 1)

const eventsData= []
// 解析参数
for (let i = 0; i < datas.length; i++) {
      const eventItem = web3.eth.abi.decodeLog(eventAbi.inputs, datas[i].data,
        datas[i].topics.slice(1))
      eventsData.push(eventItem)
      calls.push(voteNFTContract.tokenURI(eventItem.NFTtokenId))
    }

获取所有事件,用的是浏览器api

文档地址:https://hecoinfo.com/apis#logs

虽然不限制块高度,但是api数据返回最高1000条,值得注意的是,一个块中可能存在多个事件,如果要严谨一点,将 Number(result[result.length - 1].blockNumber+1) 的+1去掉,然后将结果进行去重即可


获取topic0,encodeEventSignature

通过web3.eth.abi.encodeEventSignature(eventName);


解析log data 使用 decodeLog

通过web3.eth.abi.decodeLog(inputs, hexString, topics);

注意,参数 3 topics,带有日志索引参数的topic的数组,如果是非匿名事件则不带topics[0],否则带topics[0]

像以下这种,是带有日志索引参数的 indexed

event CreatePropose(uint indexed propID, string  subject,string  content,uint NFTtokenId,  uint iwoAmountUSDT,uint warPrice,uint stakeAmount,uint begin);

通过getPastEvents获取事件

import {getWeb3} from "@chainstarter/multicall-client.js";
const web3 = getWeb3(ChainId.BSC)
var contract = new web3.eth.Contract(contractABI, adderss);
//get event
contract.getPastEvents('EventA', {filter: {}, fromBlock: 10000, toBlock: 'latest'}).then((res) => {
  console.log(res)
})

获取所有事件同理,先获取最新的块高度,因为每次最多只能查5000个块,所以每次fromBlock与toBlock递增查询,当需要查询很多块的时候,这将不适用,不建议使用,但是用来监听最新块,用这个方法还是挺好的

方法参数解码

const funcName = 'claim'
const funcAbi = abis.find(item => item.name === funcName && item.type === 'function')
const encodeFunS = web3.eth.abi.encodeFunctionSignature(funcAbi)
const paramsData = '0x' + decodeParams.replace(encodeFunS, '')
const data = web3.eth.abi.decodeParameters(funcAbi.inputs, '0x0.........')
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值