# Recevoir des notifications Telegram pour les transferts de Fan Token

Surveiller les transferts de Fan Token™ qui se produisent 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 mettre en place un bot Telegram pour avertir un groupe chaque fois qu’un transfert de Fan Token™ dépasse un certain seuil.

## Comment faire avec 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’effectuer une action en fonction de l’événement.

Dans ce guide pratique, vous verrez comment configurer le bot, capturer les événements pertinents et déclencher automatiquement des alertes Telegram, transformant ainsi votre installation en un « whale watcher » pour les gros transferts.

### É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 [dans 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 lorsque vous y êtes invité :

<figure><img src="/files/fa3f65b0330eb34a47ad08dec61e0ebf4cefc376" alt=""><figcaption></figcaption></figure>

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

Modifiez le `config.yaml` fichier pour spécifier l’adresse du contrat du FC Barcelona Fan Token™ (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 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 des 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.

Ajoutons maintenant la logique pour publier des notifications Telegram.

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

Modifiez le `/src/EventHandlers.ts` fichier afin d’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 = `ALERTE WHALE FC Barcelona 🐋 : un nouveau transfert a été effectué par <a href="${explorerUrlAddress(
      event.params.from
     )}">${ensHandleOrFromAddress}</a> vers <a href="${explorerUrlAddress(
      event.params.to
     )}">${ensHandleOrToAddress}</a> pour ${event.params.value} FC Barcelona ! 🔥 - <a href="${explorerUrlTx(
      event.transaction.hash
     )}">transaction</a>`;

    await sendMessageToTelegram(msg);
  }

  await indexBalances(context, event);
});
```

{% endcode %}

{% hint style="success" %}
L’exemple `/libs/` dossier se trouve [ici sur GitHub](https://github.com/DenhamPreen/fc-barce-fan-token-indexer/tree/main/src/libs), y compris les fichiers `helpers.ts` et le `ens.ts` .
{% endhint %}

### Étape 6 : Configurer les constantes

Créer une `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 de messages Telegram

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

```bash
pnpm i axios
```

Créez une fonction d’aide dans `libs/telegram.ts` pour envoyer des messages à l’aide d’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("Erreur lors de l’envoi du message :", error);
  }
};
```

{% endcode %}

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

#### Configurez `.env` le fichier

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

Modifiez `.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 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 du groupe.

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

#### Enfin, installez les dépendances et démarrez l’indexeur

```sh
pnpm i
pnpm envio dev
```

Avec cette configuration, vous disposez maintenant d’un indexeur propulsé par Envio qui écoute les transferts de Fan Token et publie des alertes whale sur Telegram.

<figure><img src="/files/9066bb80385a9348c0f90c847b14bb6c0b572b4a" alt=""><figcaption></figcaption></figure>

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

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.chiliz.com/fr-ai/develop/advanced/get-telegram-notifications-for-fan-token-transfers.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
