# Écrire un contrat intelligent

À partir du moment où vous décidez de créer une dApp sur Chiliz Chain, vous devez prendre en compte les spécificités de notre blockchain.

Bien que Chiliz Chain soit compatible avec l’EVM, le traiter exactement comme Ethereum peut entraîner des problèmes d’utilisabilité, notamment en ce qui concerne les décimales des jetons et les mécanismes de gas.

Explorons !

## Prérequis

### Environnement

Avant de commencer à écrire votre contrat, assurez-vous que votre environnement est prêt.

Tout d’abord, vous devez avoir un wallet configuré pour Spicy Testnet (pour le développement) ou Chiliz Chain Mainnet (pour la production).

{% content-ref url="/pages/507c6dbda543af1f79ffccfb17a131c008cffa1c" %}
[Se connecter à Chiliz Chain](/fr-ai/develop/basics/connect-to-chiliz-chain.md)
{% endcontent-ref %}

Ensuite, vous aurez besoin de $CHZ pour payer le gas de déploiement sur Testnet et Mainnet. Bien que vous puissiez acheter du $CHZ Mainnet sur n’importe quelle plateforme d’échange crypto, vous pouvez compter sur des faucets pour les jetons de Testnet.

{% content-ref url="/pages/7bdad2784d1166dec8dd1109628bd487af79f83d" %}
[Obtenir des jetons de testnet gratuits](/fr-ai/develop/basics/obtain-free-testnet-tokens.md)
{% endcontent-ref %}

En matière d’outillage, vous pouvez compter sur Hardhat ou Remix. Voir par exemple :

{% content-ref url="/pages/598301814e454fc663e5d17fcc3a7e4c582bca0f" %}
[Déployer avec Remix](/fr-ai/develop/basics/deploy-a-smart-contract/deploy-with-remix.md)
{% endcontent-ref %}

Enfin, les contrats Chiliz Chain sont écrits en langage Solidity :

{% embed url="<https://www.soliditylang.org/>" %}

{% embed url="<https://solidity-by-example.org/>" %}

### Fan Tokens / CAP-20

L’aspect le plus spécifique de Chiliz Chain est la norme CAP-20, utilisée pour les Fan Tokens.

Bien que techniquement identiques à la norme ERC-20 en termes de code, les jetons CAP-20 ont une configuration spécifique pour les décimales. En bref : elle utilise 0 décimale, tandis que les jetons ERC-20 classiques utilisent 18 décimales.

{% content-ref url="/pages/b27e4d1d73fd1d15e8622b24879f7ca6e3aa5cb3" %}
[À propos des Fan Tokens](/fr-ai/learn/about-fan-tokens.md)
{% endcontent-ref %}

Par conséquent, si vous déployez un Fan Token avec 18 décimales, il peut ne pas s’afficher correctement dans les wallets de l’écosystème ou être compatible avec les futures intégrations de Socios.com.

## Bonnes pratiques pour écrire un smart contract

### Utiliser des bibliothèques éprouvées au combat (OpenZeppelin)

Ne commencez pas par créer votre contrat à partir de zéro.\
La pratique de sécurité la plus efficace consiste à baser votre code sur des standards audités par la communauté, afin de réduire le risque de vulnérabilités

Pour le développement sur Chiliz Chain, nous recommandons fortement d’utiliser [OpenZeppelin Contracts](https://docs.openzeppelin.com/contracts). Ils fournissent des implémentations sécurisées et validées par la communauté pour les contrats de jetons.

En utilisant des contrats standards, vous garantissez que vos jetons sont compatibles avec les wallets connus (comme MetaMask) et l’écosystème Chiliz (Socios.com).

### Bonnes pratiques EVM générales

Quelle que soit la chaîne, ces trois schémas sont non négociables pour un développement Solidity sécurisé.

#### Le schéma « Checks-Effects-Interactions »

C’est votre principale défense contre les [attaques par réentrance](https://solidity-by-example.org/hacks/re-entrancy/). Structurez toujours vos fonctions dans cet ordre exact :

1. Vérifications : validez les entrées et les conditions (par exemple, `require` ).
2. Effets : mettez à jour l’état du contrat (par exemple, réduisez les soldes).
3. Interactions : interagissez avec d’autres contrats ou envoyez des fonds (par exemple, `transfert`).

#### Contrôle d’accès robuste

Ne laissez jamais des fonctions sensibles sans protection. Si une fonction frappe des jetons, modifie des frais ou met à niveau la logique, elle doit être restreinte.

* Simple : utilisez `Ownable` pour les contrats à administrateur unique.
* Complexe : utilisez `AccessControl` pour les contrats nécessitant plusieurs rôles (par exemple, `MINTER_ROLE`, `ADMIN_ROLE`).

#### Validation des entrées

Considérez que toutes les entrées sont malveillantes. Utilisez des instructions `require()` au tout début de vos fonctions pour valider les paramètres.

Par exemple :

* Vérifiez les adresses nulles (`address(0)`).
* Vérifiez les montants nuls lors des transferts.
* Vérifiez que les longueurs des tableaux correspondent si vous transmettez plusieurs tableaux.
* etc.

### Détails d’implémentation spécifiques à Chiliz

Bien que Chiliz Chain soit compatible avec l’EVM, certaines « règles locales » s’appliquent, notamment en ce qui concerne les décimales des jetons et les versions de l’EVM.

#### Conformité CAP-20 (Fan Tokens)

Si vous écrivez un contrat qui interagit avec des Fan Tokens (par exemple, un Staking Pool pour $PSG ou $BAR), vous devez gérer 0 décimale.

Cela signifie :

* Ne supposez pas `1 Token = 10^18 unités`. Pour les Fan Tokens, `1 Token = 1 unité`.
* Évitez de coder en dur `1e18` dans vos calculs si votre contrat est censé être générique. Utilisez dynamiquement la fonction `token.decimals()` .

#### Version EVM et compilateur

Chiliz Chain est compatible avec la version EVM « Shanghai ».\
La version recommandée de Solidity est `0.8.24`.

### Optimisation du gas sur Chiliz

Les transactions sur Chiliz Chain sont nettement moins chères que sur Ethereum, mais un code non optimisé peut tout de même entraîner de la congestion ou des transactions échouées lors d’événements à forte affluence (par exemple, pendant un match en direct).

Voici trois façons d’économiser du gas :

* Utilisez des erreurs personnalisées : au lieu de longs messages textuels dans `require`, utilisez `error` définitions pour économiser du gas.
* Ordonnez vos variables d’état pour qu’elles tiennent dans des emplacements de 32 octets. Placez `uint128`, `address` , et `bool` les uns à côté des autres lorsque c’est possible.
* Préférez `externe` pour les fonctions qui ne sont jamais appelées en interne par le contrat lui-même.


---

# 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/basics/write-a-smart-contract.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.
