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.
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:
- Aprender golang na prática (depois de fazer o excelente tour of go)
- Aprender detalhes de como interfacear com blockchains baseados na EVM
- Implementar isso utilizando websocket, abrindo um canal de comunicação contínua e processar o evento de forma assíncrona
- 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):
- Precisamos escrever no websocket para que o servidor comece a nos enviar eventos que nos interessam.
- 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.
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.