WEB3DEV

Cover image for Buscando eventos históricos de um contrato inteligente.
Adriano P. Araujo
Adriano P. Araujo

Posted on

Buscando eventos históricos de um contrato inteligente.

Contratos inteligentes usam Eventos  para comunicar ou fornecer notificações ao mundo exterior. Na Ethereum, quando uma transação é concluída , contratos inteligentes podem emitir eventos e gravar logs na blockchain. Para entender melhor os registros de eventos na blockchain Ethereum, recomendo a leitura deste artigo: https://medium.com/mycrypto/understanding-event-logs-on-the-ethereum-blockchain-f4ae7ba50378.

Este artigo se concentra no consumo de eventos históricos emitidos por um contrato inteligente, o que pode ser útil na criação de aplicativos para fins de análise. Consumiremos eventos anteriores a cunhagem de um contrato específico da pool Uniswap V3 usando o pacote npm ethers. O contrato inteligente da pool emite o evento Mint (N.T.:cunhagem em português) sempre que a liquidez é cunhada para uma posição NFT.

Evento Uniswap V3 Mint

Pré-requisitos:

  • Node versão 16 ou superior com npm.

  • RPC url obtido de um provedor de nós de terceiros, como Infura, QuickNode ou Alchemy.

Implementação:

Vamos começar criando um novo diretório, instalando as dependências necessárias e criando dois arquivos.

  • .env — Para armazenar as variáveis de ambiente

  • index.js — Para escrever a lógica que buscará os eventos passados da cunhagem


mkdir eventos uniswap-pool-e && cd $ _

npm init -y

# ethers @ 5.7.2, @ uniswap / v3-core @ 1.0.1, dotenv @ 16.0.3

npm i ethers dotenv @uniswap / v3-core

toque .env index.js

Enter fullscreen mode Exit fullscreen mode

No arquivo .env, crie uma variável de ambiente para armazenar a RPC URL substituindo { { JSON_RPC_URL } } pela RPC URL obtida no provedor de nós.


RPC_URL={{JSON_RPC_URL}}



Enter fullscreen mode Exit fullscreen mode

No arquivo index.js, escreveremos a lógica para buscar eventos históricos da cunhagem em uma pool específica. Nesse caso, usaremos a pool USDC / ETH (https://info.uniswap.org/#/pools/0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8) com uma taxa de 0,3%.


import { ethers, Contract } from "ethers";

import UniswapV3Pool from "@uniswap/v3-core/artifacts/contracts/UniswapV3Pool.sol/UniswapV3Pool.json" assert { type: "json" };

import * as dotenv from "dotenv";

dotenv.config();



const PROVIDER = new ethers.providers.JsonRpcProvider(process.env.RPC_URL);



const getPoolMintEvents = async (poolId, startBlock, endBlock) => {

  const { abi } = UniswapV3Pool;

  const poolContract = new Contract(poolId, abi, PROVIDER);

  const mintFilter = poolContract.filters.Mint();

  console.log("Querying the Mint events...");

  const mintEvents = await poolContract.queryFilter(

    mintFilter,

    startBlock,

    endBlock

  );

  console.log(

    `${mintEvents.length} have been emitted by the pool with id ${poolId} between blocks ${startBlock} & ${endBlock}`

  );

  return mintEvents;

};

Enter fullscreen mode Exit fullscreen mode
  • Primeiro, importamos os módulos necessários, incluindo o UniswapV3Pool de @ uniswap / v3-core, que contém o ABI necessário para interagir com o contrato.

  • Segundo, nos conectamos ao nó Ethereum usando o RPC URL obtido do provedor de nós para obter uma instância do provedor.

  • Terceiro, definimos a função getPoolMintEvents, que usa três parâmetros: poolId, startBlock e endBlock. Desestruturamos o ABI do UniswapV3Pool e criamos uma instância do Contrato com o ID do pool, o ABI e o provedor. Como estamos interessados nos eventos de cunhagem, retornamos um filtro com o nome do evento (chamado aqui de Mint). Por fim, consultamos o contrato de pool com o filtro de cunhagem e iniciamos o primeiro e o último bloco para obter os eventos que correspondam a esse evento.

Eventos de busca:


const mintEvents = await getPoolMintEvents(

  "0x8ad599c3A0ff1De082011EFDDc58f1908eb6e6D8",

  16649859 - 5000,

  16649859

);

console.log(mintEvents);

Enter fullscreen mode Exit fullscreen mode

Invocamos a função getPoolMintEvents com um ID de pool igual a  0x8ad599c3A0ff1De082011EFDDc58f1908eb6e6D8, bloco inicial de 16644859 e bloco final de 16649859.

Saída:


[

  {

    "blockNumber": 16644960,

    "blockHash": "0xf78ca69459b1bcb9e32b54712719018466da40dd8c80e4582f3de8213f95f627",

    "transactionIndex": 0,

    "removed": false,

    "address": "0x8ad599c3A0ff1De082011EFDDc58f1908eb6e6D8",

    "data": "0x000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8800000000000000000000000000000000000000000000000df06c7f34a0f5addf00000000000000000000000000000000000000000000000000000e7bca0b9a220000000000000000000000000000000000000000000001f973c1dc7240b654ab",

    "topics": [

      "0x7a53080ba414158be7ec69b987b5fb7d07dee101fe85488f0853ae16239d0bde",

      "0x000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88",

      "0x00000000000000000000000000000000000000000000000000000000000315d8",

      "0x0000000000000000000000000000000000000000000000000000000000031614"

    ],

    "transactionHash": "0x4eb022504eafd6779a74a1f6f43808835c7d52de6673e698b4ebe7b3c95ba875",

    "logIndex": 4,

    "event": "Mint",

    "eventSignature": "Mint(address,address,int24,int24,uint128,uint256,uint256)",

    "args": [

      "0xC36442b4a4522E871399CD717aBDD847Ab11FE88",

      "0xC36442b4a4522E871399CD717aBDD847Ab11FE88",

      202200,

      202260,

      { "type": "BigNumber", "hex": "0x0df06c7f34a0f5addf" },

      { "type": "BigNumber", "hex": "0x0e7bca0b9a22" },

      { "type": "BigNumber", "hex": "0x01f973c1dc7240b654ab" }

    ]

  },

  {

    "blockNumber": 16645219,

    "blockHash": "0xb8bce1159cb0558f3429a6435b3f16a5d0cdfac54c458932de97ab1cc0ac4cd0",

    "transactionIndex": 96,

    "removed": false,

    "address": "0x8ad599c3A0ff1De082011EFDDc58f1908eb6e6D8",

    "data": "0x000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88000000000000000000000000000000000000000000000000002313838e7b78fc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004fcc1a89027eff299",

    "topics": [

      "0x7a53080ba414158be7ec69b987b5fb7d07dee101fe85488f0853ae16239d0bde",

      "0x000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88",

      "0x000000000000000000000000000000000000000000000000000000000002eeb4",

      "0x00000000000000000000000000000000000000000000000000000000000314ac"

    ],

    "transactionHash": "0xaef29a4cb23658c488ae035b1dc2d5589ba603165f506289a9bfef52c0f5cde8",

    "logIndex": 339,

    "event": "Mint",

    "eventSignature": "Mint(address,address,int24,int24,uint128,uint256,uint256)",

    "args": [

      "0xC36442b4a4522E871399CD717aBDD847Ab11FE88",

      "0xC36442b4a4522E871399CD717aBDD847Ab11FE88",

      192180,

      201900,

      { "type": "BigNumber", "hex": "0x2313838e7b78fc" },

      { "type": "BigNumber", "hex": "0x00" },

      { "type": "BigNumber", "hex": "0x04fcc1a89027eff299" }

    ]

  },

  ...

]

Enter fullscreen mode Exit fullscreen mode

Conclusão:

Consultar eventos passados é importante porque permite determinar o que ocorreu durante um período específico, o que pode ser útil na criação de painéis para análise de dados.

Referências:

Siga-me para obter mais atualizações relacionadas aos tópicos de programação de contratos inteligentes e segurança no espaço Blockchain. Isso me incentivará a continuar escrevendo e compartilhando meu conhecimento com a comunidade Medium. Então, o que você está esperando? Clique no botão “Follow” e entre nessa conversa!


Este artigo foi escrito por Harish Ramamurthy e traduzido por Adriano P. de Araujo. O original em inglês pode ser encontrado aqui.

Latest comments (0)