> For the complete documentation index, see [llms.txt](https://docs.chiliz.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.chiliz.com/fr/developper/notions-de-base/rediger-un-smart-contract.md).

# Rédiger un smart contract

Dès lors que 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 EVM, la traiter exactement comme Ethereum peut entraîner des problèmes d'utilisabilité, notamment en ce qui concerne les décimales des tokens et la mécanique du gas.

Explorons cela ensemble !

## Prérequis

### Environnement

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

Premièrement, vous devez disposer d'un portefeuille configuré pour le Spicy Testnet (pour le développement) ou pour le Mainnet de Chiliz Chain (pour la production).

{% content-ref url="/pages/SUDzlfjuLwC8I9SdfXY1" %}
[Se connecter à Chiliz Chain](/fr/developper/notions-de-base/se-connecter-a-chiliz-chain.md)
{% endcontent-ref %}

Deuxièmement, vous aurez besoin de $CHZ pour payer le déploiement sur le Testnet et le Mainnet. Si vous pouvez acheter des $CHZ Mainnet sur n'importe quel exchange crypto, vous pouvez vous appuyer sur des faucets pour les tokens Testnet.

{% content-ref url="/pages/JXRq29guBPy3PxBcXmwT" %}
[Obtenir des tokens de testnet gratuits](/fr/developper/notions-de-base/faucet-du-testnet.md)
{% endcontent-ref %}

En termes d'outils, vous pouvez utiliser Hardhat ou Remix. Voir par exemple :

{% content-ref url="/pages/mfigqRC489LNxRseIzdQ" %}
[Déployer avec Remix](/fr/developper/notions-de-base/deployer-un-smart-contract/deployer-avec-remix.md)
{% endcontent-ref %}

Enfin, les contrats Chiliz Chain sont rédigés 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 le standard CAP-20, utilisé pour les Fan Tokens.

Bien que techniquement identique au code du standard ERC-20, les tokens CAP-20 ont une configuration spécifique pour les décimales. En résumé : il utilise 0 décimale, tandis que les tokens ERC-20 classiques utilisent 18 décimales.

{% content-ref url="/pages/J9REmK360UrcvTGsrXdE" %}
[À propos des Fan Tokens](/fr/apprendre/a-propos-des-fan-tokens.md)
{% endcontent-ref %}

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

## Bonnes pratiques pour la rédaction d'un smart contract

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

Ne partez pas de zéro pour créer votre contrat.\
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 vérifiées par la communauté pour les contrats de tokens.

En utilisant des contrats standards, vous assurez la compatibilité de vos tokens avec les portefeuilles connus (comme MetaMask) et l'écosystème Chiliz (Socios.com).

### Bonnes pratiques EVM générales

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

#### Le modèle "Checks-Effects-Interactions"

Il s'agit de votre principale défense contre les [attaques de réentrance](https://solidity-by-example.org/hacks/re-entrancy/). Structurez toujours vos fonctions dans cet ordre précis :

1. Vérifications (Checks) : Valider les entrées et les conditions (ex. : instructions `require`).
2. Effets (Effects) : Mettre à jour l'état du contrat (ex. : réduire les soldes).
3. Interactions : Interagir avec d'autres contrats ou envoyer des fonds (ex. : `transfer`).

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

Ne laissez jamais des fonctions sensibles non protégées. Si une fonction crée des tokens, modifie des frais ou met à jour la logique, elle doit être restreinte.

* Simple : Utilisez `Ownable` pour les contrats à administration unique.
* Complexe : Utilisez `AccessControl` pour les contrats nécessitant plusieurs rôles (ex. : `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 de tableaux correspondent si vous passez plusieurs tableaux.
* etc.

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

Bien que Chiliz Chain soit compatible EVM, certaines "règles locales" s'appliquent, notamment concernant les décimales des tokens et les versions EVM.

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

Si vous rédigez un contrat qui interagit avec des Fan Tokens (ex. : un pool de staking pour $PSG ou $BAR), vous devez gérer 0 décimale.

Cela signifie :

* Ne supposez pas que `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 la fonction `token.decimals()` de manière dynamique.

#### Version EVM et compilateur

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

### Optimisation du gas sur Chiliz

Les transactions sur Chiliz Chain sont nettement moins chères qu'Ethereum, mais un code non optimisé peut tout de même entraîner des congestions ou des transactions échouées lors d'événements à fort trafic (ex. : pendant un match en direct).

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

* Utilisez des erreurs personnalisées : Au lieu de messages de chaîne de caractères longs dans `require`, utilisez des définitions `error` pour économiser du gas.
* Ordonnez vos variables d'état pour qu'elles tiennent dans des slots de 32 octets. Placez les `uint128`, `address` et `bool` côte à côte autant que possible.
* Préférez `external` pour les fonctions qui ne sont jamais appelées en interne par le contrat lui-même.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## 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/developper/notions-de-base/rediger-un-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.
