Recevoir des notifications Telegram pour les transferts de Fan Tokens

Surveiller les transferts de Fan Token™ qui ont lieu sur Chiliz Chain est un excellent moyen de rester informé des mouvements de grande valeur et de tenir votre communauté au courant.

Avec un peu de configuration et de code, vous pouvez configurer un bot Telegram pour notifier un groupe chaque fois qu'un transfert de Fan Token™ dépasse un certain seuil.

Comment le faire en utilisant Envio ?

Envio est un outil d'indexation puissant qui permet aux développeurs d'écouter les événements des contrats intelligents sur Chiliz et d'exécuter une action basée sur l'événement.

Dans ce didacticiel, vous verrez comment configurer le bot, capturer les événements pertinents et déclencher automatiquement des alertes Telegram, transformant ainsi votre configuration en un « observateur de baleines » pour les transferts importants.

Étape 1 : Installer les prérequis

Avant de commencer, assurez-vous d'avoir les outils requis installés :

Le projet complet se trouve sur ce dépôt GitHub.

Étape 2 : Initialiser l'indexeur Envio

Exécutez la commande suivante pour initialiser un indexeur Envio et suivez les invites pour générer un modèle ERC20 sur Chiliz Chain (qui est une blockchain compatible EVM) :

pnpx envio init

Voici les différentes sélections que vous devez faire lorsqu'on vous les demande :

Étape 3 : Configurer config.yaml

Modifiez le config.yaml fichier pour spécifier l'adresse du contrat du Fan Token™ du FC Barcelone (ou tout autre Fan Token™ que vous souhaitez suivre) :

# yaml-language-server: $schema=./node_modules/envio/evm.schema.json
name: fan-token-watcher
description: Un indexeur simple pour les Fan Tokens qui publie des notifications sur Telegram lors de gros transferts
networks:
  - id: 8888 # Chiliz
    start_block: 0
    contracts:
      - name: ERC20
        address: "0xFD3C73b3B09D418841dd6Aff341b2d6e3abA433b" # FC Barcelona
        handler: src/EventHandlers.ts
        events:          
          - event: "Transfer(address indexed from, address indexed to, uint256 value)"
field_selection:
  transaction_fields:
    - "hash"

Remarque : Nous supprimons l' approval événement car nous ne nous intéressons qu'aux transferts.

Étape 4 : Simplifier le schéma GraphQL

Modifiez le schema.graphql fichier pour ne suivre que les soldes des comptes :

type Account {
  id: ID!   # Adresse du compte
  balance: BigInt! # Solde du compte en tokens
}

À ce stade, nous avons un indexeur ERC20 qui écoute les événements.

Maintenant, ajoutons la logique pour publier des notifications Telegram.

Étape 5 : Implémenter la logique de notification Telegram

Modifiez le /src/EventHandlers.ts fichier pour inclure la logique de détection des gros transferts et d'envoi d'alertes Telegram.

import { ERC20 } from "generated";
import { isIndexingAtHead, indexBalances } from "./libs/helpers";
import { fetchEnsHandle } from "./libs/ens";
import { sendMessageToTelegram } from "./libs/telegram";
import { WHALE_THRESHOLD, explorerUrlAddress, explorerUrlTx } from "./constants";

ERC20.Transfer.handler(async ({ event, context }) => {
  if (isIndexingAtHead(event.block.timestamp) && event.params.value >= BigInt(WHALE_THRESHOLD)) {
    const ensHandleOrFromAddress = await fetchEnsHandle(event.params.from); 
    const ensHandleOrToAddress = await fetchEnsHandle(event.params.to);
    const msg = `FC Barcelona WHALE ALERT 🐋: A new transfer has been made by <a href="${explorerUrlAddress("
      event.params.from
    )}">${ensHandleOrFromAddress}</a> to <a href="${explorerUrlAddress("
      event.params.to
    )}">${ensHandleOrToAddress}</a> for ${event.params.value} FC Barcelona! 🔥 - <a href="${explorerUrlTx("
      event.transaction.hash
    )}">transaction</a>`;

    await sendMessageToTelegram(msg);
  }

  await indexBalances(context, event);
});

Étape 6 : Configurer les constantes

Créer un constants.ts fichier pour stocker les variables d'environnement :

export const EXPLORER_URL_MONAD = process.env.ENVIO_EXPLORER_URL_MONAD;
export const WHALE_THRESHOLD: string = process.env.ENVIO_WHALE_THRESHOLD ?? "1000";
export const BOT_TOKEN = process.env.ENVIO_BOT_TOKEN;
export const CHANNEL_ID = process.env.ENVIO_TELEGRAM_CHANNEL_ID;
export const MESSAGE_THREAD_ID = process.env.ENVIO_TELEGRAM_MESSAGE_THREAD_ID;

export const explorerUrlAddress = (address: string) =>
  EXPLORER_URL_MONAD + "address/" + address;
export const explorerUrlTx = (txHash: string) =>
  EXPLORER_URL_MONAD + "tx/" + txHash;

Étape 7 : Envoi des messages Telegram

Installez le client HTTP Axios:

pnpm i axios

Créez une fonction d'aide dans libs/telegram.ts pour envoyer des messages en utilisant Axios :

import axios from "axios";
import { CHANNEL_ID, MESSAGE_THREAD_ID, BOT_TOKEN } from "../constants";

export const sendMessageToTelegram = async (message: string): Promise<void> => {
  try {
    const apiUrl = `https://api.telegram.org/bot${BOT_TOKEN}/sendMessage`;
    await axios.post(apiUrl, {
      chat_id: CHANNEL_ID,
      text: message,
      parse_mode: "HTML",
    });
  } catch (error) {
    console.error("Erreur lors de l'envoi du message :", error);
  }
};

Étape 8 : Configuration finale et exécution de l'indexeur

Configurez .env Fichier

cp .env.example .env

Modifiez .env avec les informations d'identification de votre bot Telegram :

ENVIO_BOT_TOKEN=
ENVIO_TELEGRAM_CHANNEL_ID=
ENVIO_TELEGRAM_MESSAGE_THREAD_ID=
ENVIO_EXPLORER_URL="https://chiliscan.com/"
ENVIO_WHALE_THRESHOLD=1000

Créer un bot Telegram

  1. Message @BotFather sur Telegram et exécutez :

    /newbot
  2. Suivez les invites pour obtenir le jeton de votre bot.

  3. Ajoutez le bot à votre groupe Telegram et exécutez /start.

  4. Visitez https://api.telegram.org/bot<YourBOTToken>/getUpdates pour trouver l'ID du chat de groupe.

Enfin, installez les dépendances et démarrez l'indexeur

pnpm i
pnpm envio dev

Avec cette configuration, vous disposez désormais d'un indexeur propulsé par Envio qui écoute les transferts de Fan Token et publie des alertes « baleine » sur Telegram.

Pour aller plus loin, vous pouvez auto-héberger l'indexeur ou le déployer sur le service hébergé d'Envio.

Et puisque nous sauvegardons les soldes, il peut également être utilisé comme une API GraphQL de soldes.

Mis à jour

Ce contenu vous a-t-il été utile ?