# 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 à forte valeur et de tenir votre communauté au courant.&#x20;

Avec un peu de configuration et de code, vous pouvez mettre en place 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](https://envio.dev/) est un puissant outil d'indexation 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 guide, vous verrez comment configurer le bot, capturer les événements pertinents et déclencher automatiquement des alertes Telegram, transformant ainsi votre configuration en « observateur de baleines » pour les transferts majeurs.

### Étape 1 : Installer les prérequis

Avant de commencer, assurez-vous d'avoir les [outils requis](https://docs.envio.dev/docs/HyperIndex/getting-started#prerequisites) installés :

* [pnpm](https://pnpm.io/)
* [Node.js](https://nodejs.org/en)
* [Docker](https://www.docker.com/)

{% hint style="info" %}
Le projet complet se trouve [sur ce dépôt GitHub](https://github.com/DenhamPreen/fc-barce-fan-token-indexer/tree/main).
{% endhint %}

### É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) :

```bash
pnpx envio init
```

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

<figure><img src="https://2383909840-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4L7rBH2rmyoBTn93MSdx%2Fuploads%2FMfIuODmwdOu9mMJ7yovi%2Fimage.png?alt=media&#x26;token=6d2237d3-4452-4e88-93c1-b27a09ec77da" alt=""><figcaption></figcaption></figure>

### Étape 3 : Configurer `config.yaml`

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

{% code overflow="wrap" lineNumbers="true" %}

```yaml
# 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"
```

{% endcode %}

**Remarque :** Nous supprimons l' `événement approval` 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 de comptes :

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

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

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.

{% code overflow="wrap" lineNumbers="true" %}

```typescript
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);
});
```

{% endcode %}

{% hint style="success" %}
Le dossier d'exemple `/libs/` peut être trouvé [juste ici sur GitHub](https://github.com/DenhamPreen/fc-barce-fan-token-indexer/tree/main/src/libs), y compris les `helpers.ts` et `ens.ts` fichiers.
{% endhint %}

### Étape 6 : Configurer les constantes

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

{% code overflow="wrap" lineNumbers="true" %}

```typescript
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;
```

{% endcode %}

### Étape 7 : Envoi des messages Telegram

Installez le [client HTTP Axios](https://axios-http.com/):

```bash
pnpm i axios
```

Créez une fonction helper dans `libs/telegram.ts` pour envoyer des messages en utilisant Axios :

{% code overflow="wrap" lineNumbers="true" %}

```typescript
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("Error sending message:", error);
  }
};
```

{% endcode %}

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

#### Configurez `.env` Fichier

```sh
cp .env.example .env
```

Éditez `.env` avec les identifiants de votre bot Telegram :

```sh
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 token 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.

{% hint style="success" %}
Si vous avez créé le nouveau groupe avec le bot et que vous n'obtenez que `{"ok":true,"result":[]}`, supprimez puis ajoutez à nouveau le bot au groupe.
{% endhint %}

#### Enfin, installez les dépendances et lancez l'indexeur

```sh
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.&#x20;

<figure><img src="https://2383909840-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4L7rBH2rmyoBTn93MSdx%2Fuploads%2FcU5SOaSqyMKRlKUXVFUM%2Fimage.png?alt=media&#x26;token=47f64ee3-0f18-41aa-9040-8e9ec8ddc619" alt=""><figcaption></figcaption></figure>

Pour aller plus loin, vous pouvez héberger l'indexeur vous-même ou le déployer sur le service hébergé d'Envio.&#x20;

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