24 de Abril, 2024

Vigilante de novos pares 👀

Vigilante de novos pares 👀

Neste artigo, ensino como criar um programa em golang que "vigia" eventos da blockchain, para identificar novos pares listados em exchanges descentralizadas

Uma característica muito interessante de dexes é a liberdade que oferece às pessoas de colocar à venda seus tokens, sem pedir pra ninguém (não sabe o que é dex? leia este artigo). Obviamente, 99% dos tokens colocados à venda são puro lixo, scams, honeypots e rugpulls.

Então quer dizer que HarryPotterObamaSonic10Inu não é um projeto sério?

Ainda sim, me propus o desafio de implementar um programa em golang que "vigiasse" o registro aberto e distribuído de transações da blockchain e me avisasse quando um par novo fosse criado na UniswapV2 da Basechain. Completando este pequeno projeto pretendo:

  1. Aprender golang na prática (depois de fazer o excelente tour of go)
  2. Aprender detalhes de como interfacear com blockchains baseados na EVM
  3. Implementar isso utilizando websocket, abrindo um canal de comunicação contínua e processar o evento de forma assíncrona
  4. Identificar a próxima 1000x 🚀 (ok talvez no próximo artigo 😂)

Como qualquer pessoa em 2024 que valoriza o próprio tempo, comecei pedindo para o ChatGPT criar o básico, para que eu possa construir em cima.

O código gerado tem algumas idiossincrasias (o select com um statement só, no fim do código por exemplo), mas é utilizável.

As principais alterações irão ocorrer logo antes do loop de recebimento de mensagens (L31) e na interpretação das mensagens (L37):

  1. Precisamos escrever no websocket para que o servidor comece a nos enviar eventos que nos interessam.
  2. Interpretar as mensagens recebidas

Mas calma, me precipitei, que servidor? Qual é o endpoint (L16)?

Se você não está rodando seu próprio geth (provavelmente não está) é mais interessante utilizar algum serviço online que te ofereça acesso à um node.

Utilizei o Alchemy no plano gratuito mesmo.

Não é publi, mas se vc usar meu link e comprar um plano eu ganho um crédito 🎩

Dito isso, vamos escrever no websocket a instrução para que o servidor nos informe de eventos de criação de pares novos, pelo contrato da Uniswap_V2_Factory da Basechain. Ou seja, queremos ser avisados quando forem emitidos logs com o evento PairCreated.

Pela documentação:

  • Method é "eth_subscribe"
  • Params são "logs" seguido de um objeto com filtros opcionais
    • "address" para indicar o contrato da fábrica da Uniswap
    • "topicId" para indicar o evento de interesse

O endereço do contrato está na documentação da Uniswap enquanto o topicId hexadecimal de um PairCreated pode ser verificado pelo block explorer.

O programa acima irá imprimir cada evento de criação de pares, por exemplo:

Received message: {"jsonrpc":"2.0","method":"eth_subscription","params":{"result":{"address":"0x8909dc15e40173ff4699343b6eb8132c65e18ec6","topics":["0x0d3648bd0f6ba80134a33ba9275ac585d9d315f0ad8355cddefde31afa28d0e9","0x000000000000000000000000326290c965ac884a1d6c01c5e98659801b242ca5","0x0000000000000000000000004200000000000000000000000000000000000006"],"data":"0x000000000000000000000000eaf510e3a42a3a69599fbd4a0773c0993de9c981000000000000000000000000000000000000000000000000000000000001c02e","blockNumber":"0xcfab00","transactionHash":"0xf363c55b9f47d7dfcf4c69e8747a7c46b2529610bfc2ec349e9cf2f60bd6466e","transactionIndex":"0x28","blockHash":"0xa260a77ed6d94751275001dcb4216a23f606ca50fdc1845759ab2571a394044b","logIndex":"0xdb","removed":false},"subscription":"0x5e79d2949319404db380912d2c471ce6"}}

Analisando a maneira como é montado o evento , vemos que o array topics contém o id do evento na posição 0, e o endereço dos dois tokens do par nas posições 1 e 2.

Curiosidade: o endereço do token wETH é 0x420...06, no caso acima, o segundo token do par.

O endereço do par criado também é relatado, porém como address no campo data, para interpretar isso vamos precisar do ABI do contrato.