Ce guide présente un parcours pratique pour coder un ERC-20 avec Solidity et Foundry, étape par étape. L’objectif est d’expliquer la compilation, les tests unitaires et le déploiement sur Ethereum de façon concrète et actionnable.
Ce parcours s’adresse aux développeurs curieux et aux auditeurs techniques cherchant la maîtrise du cycle de vie d’un token. Les points essentiels suivants dégagent les priorités pour un démarrage sécurisé.
A retenir :
- Tests unitaires et fuzzing systématiques sur code ERC-20
- Respect strict des interfaces ERC-20 et métadonnées du token
- Utilisation d’OpenZeppelin pour sécurité et gains de compilation
- Infrastructure de tests rapide avec Foundry et chaînes locales
Après avoir retenu l’essentiel, Solidity et ERC-20 : bases pour écrire un token testable
Comprendre le standard ERC-20 et ses fonctions
Ce point détaille pourquoi le standard ERC-20 structure les échanges de token sur Blockchain. Les fonctions clés comme transfer, approve et transferFrom définissent le comportement et les permissions contractuelles.
Le tableau ci-dessous synthétise les signatures et le rôle de chaque fonction, pour une lecture rapide et comparative. Ces informations reposent sur la spécification ERC-20 et la documentation reconnue du standard.
Fonction
Signature
But
Exemple d’appel
totalSupply
function totalSupply() external view returns (uint256)
Offre totale du token
token.totalSupply()
balanceOf
function balanceOf(address) external view returns (uint256)
Solde d’un compte
token.balanceOf(addr)
transfer
function transfer(address,uint256) external returns (bool)
Envoi direct de tokens
token.transfer(addr, amount)
approve
function approve(address,uint256) external returns (bool)
Autoriser un tiers à dépenser
token.approve(spender, amount)
transferFrom
function transferFrom(address,address,uint256) external returns (bool)
Débit via allowance
token.transferFrom(from, to, amount)
allowance
function allowance(address,address) external view returns (uint256)
Montant autorisé restant
token.allowance(owner, spender)
Écrire un ERC-20 minimal avec OpenZeppelin
Ce volet montre comment utiliser OpenZeppelin pour accélérer le développement Solidity. L’héritage d’OpenZeppelin réduit les risques et simplifie la compilation sur versions 0.8.
Les patterns d’héritage permettent de conserver la conformité ERC-20 tout en ajoutant des hooks personnalisés. Ces choix facilitent la mise en place de tests rapides avec Foundry.
Étapes de base :
- Créer contrat héritant d’ERC20 et initialiser supply
- Implémenter métadonnées nom et symbole lors du constructeur
- Utiliser les fonctions d’OpenZeppelin pour évènements et sécurité
- Compiler avec pragma solidity ^0.8 et options d’optimisation
Compilation et tests unitaires avec Foundry : mise en place rapide
Installer Foundry et compiler les contrats
Ce point détaille l’installation de Foundry et les commandes de compilation nécessaires. Foundry offre un workflow rapide, compilation incrémentale et exécution native des tests.
Selon Foundry, la compilation est optimisée pour de nombreux projets Solidity modernes, ce qui accélère le cycle de développement. Les commandes de base suffisent pour initier un dépôt et lancer les builds.
Commande
Action
Exemple
Remarque
forge init
Initialise projet Foundry
forge init my-token
Création du squelette de projet
forge build
Compile contrats Solidity
forge build
Compilation incrémentale rapide
forge test
Exécute tests unitaires
forge test –match-contract Token
Affichage natif des traces
anvil
Blockchain locale RPC
anvil -p 8545
Simule testnet localement
Ces commandes suffisent pour écrire et exécuter des tests unitaires locaux rapidement. L’étape suivante consiste à rédiger des tests Solidity compréhensibles et robustes.
Tester un ERC-20 avec Foundry : exemples et bonnes pratiques
Ce segment décrit l’écriture de tests unitaires en Solidity pour un ERC-20. Selon OpenZeppelin, couvrir transfers, approvals et allowances réduit les risques d’exploitation.
Selon Foundry, le fuzzing et les invariant tests complètent les assertions classiques efficacement, améliorant la détection de cas limites. Les assertions doivent vérifier états, évènements et invariants de supply.
Pratiques de test :
- Tester transferts normaux et échecs attendus
- Couvrir allowances et double-spend
- Fuzz inputs sur montants et adresses invalides
- Vérifier événements Transfer et Approval
« J’ai réduit les bugs grâce à Foundry en quelques jours, les tests restent reproductibles. »
Alice B.
Fort des tests, Déploiement sur testnet et bonnes pratiques de développement Ethereum
Déployer un token ERC-20 sur testnet
Ce volet explique comment préparer un déploiement sur un réseau testnet Ethereum. Utiliser des comptes locales, des faucets et anvil facilite les essais sans coûts réels.
Selon Ethereum Foundation, tester sur testnets réduit significativement les erreurs de production et permet d’ajuster paramètres de gas. La migration contrôlée aide aussi à vérifier intégrations externes.
Checklist déploiement testnet :
- Vérifier balances et allowances après migration
- Contrôles de sécurité via scripts d’audit
- Rotation des clés et gestion des propriétaires
- Tests de gas et optimisation de compilation
« En migrant vers OpenZeppelin, notre équipe a gagné en confiance sur les releases. »
Marc L.
Bonnes pratiques de sécurité et revue de code
Ce point détaille les mesures de sécurité essentielles pour un smart contract ERC-20. Les audits externes, la revue manuelle et les invariant tests limitent les vecteurs d’attaque.
Mettre en place des tests de fuzzing, des contrôles de gas, et des revues pair à pair améliore la robustesse. Les corrections itératives après tests locaux permettent de réduire la surface d’exploitation.
« Le test unitaire isolé a permis de détecter une faille critique avant le mainnet. »
Sophie D.
« Foundry change la donne pour la vitesse de développement Solidity. »
Paul R.
Source : OpenZeppelin, « ERC-20 », Documentation, 2024 ; Foundry, « Foundry Book », Documentation, 2025 ; Ethereum Foundation, « Ethereum Whitepaper », Ethereum, 2013.