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.
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
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}}
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;
};
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);
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" }
]
},
...
]
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:
https://docs.ethers.org/v5/api/contract/contract/#Contract--events
https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolEvents#mint
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)