Introduction
Ethers.js est la bibliothèque JavaScript la plus populaire pour interagir avec la blockchain Ethereum. Elle permet aux développeurs de lire des données on-chain, d'appeler des contrats intelligents et d'envoyer des transactions de manière simple et sécurisée. Contrairement à Web3.js, Ethers.js met l'accent sur la lisibilité du code et la sécurité. En 2026, elle reste essentielle pour toute dApp moderne. Ce tutoriel vous guide pas à pas depuis l'installation jusqu'à l'envoi d'une transaction. Vous apprendrez à connecter un provider, à lire un solde et à interagir avec un contrat ERC-20. Chaque étape inclut du code complet et fonctionnel que vous pouvez copier-coller directement.
Prérequis
- Node.js 18 ou supérieur
- Connaissances de base en JavaScript/TypeScript
- Un portefeuille comme MetaMask avec des ETH de test (Sepolia)
Installation du projet
npm init -y
npm install ethersCette commande initialise un projet Node.js et installe la dernière version d'Ethers.js. Vérifiez toujours que vous utilisez la version 6 pour bénéficier des dernières améliorations de sécurité et de performance.
Connexion au provider
import { ethers } from 'ethers';
const provider = new ethers.JsonRpcProvider('https://rpc.sepolia.org');
const network = await provider.getNetwork();
console.log('Connecté au réseau:', network.name);Ce code crée une connexion à un nœud Ethereum via JSON-RPC. Le provider permet de lire des données de la blockchain sans clé privée. Utilisez toujours un RPC public de testnet pour vos premiers essais.
Lire le solde d'une adresse
import { ethers } from 'ethers';
const provider = new ethers.JsonRpcProvider('https://rpc.sepolia.org');
const address = '0x742d35Cc6634C0532925a3b844Bc454e4438f44e';
const balance = await provider.getBalance(address);
console.log('Solde:', ethers.formatEther(balance), 'ETH');La méthode getBalance retourne le solde en wei. La fonction formatEther convertit automatiquement en ETH pour une lecture humaine. C'est la première opération utile dans toute dApp.
Interagir avec un contrat ERC-20
import { ethers } from 'ethers';
const provider = new ethers.JsonRpcProvider('https://rpc.sepolia.org');
const abi = ['function balanceOf(address) view returns (uint256)'];
const contract = new ethers.Contract('0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984', abi, provider);
const balance = await contract.balanceOf('0x742d35Cc6634C0532925a3b844Bc454e4438f44e');
console.log('Tokens:', ethers.formatUnits(balance, 18));On fournit uniquement l'ABI minimal nécessaire. Cela réduit la surface d'attaque et améliore la lisibilité. Le contrat est en lecture seule grâce au provider.
Écouter un événement Transfer
import { ethers } from 'ethers';
const provider = new ethers.JsonRpcProvider('https://rpc.sepolia.org');
const abi = ['event Transfer(address indexed from, address indexed to, uint256 value)'];
const contract = new ethers.Contract('0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984', abi, provider);
contract.on('Transfer', (from, to, value) => {
console.log(`Transfert de ${from} vers ${to} : ${ethers.formatUnits(value, 18)} UNI`);
});L'écoute d'événements permet de réagir en temps réel aux transferts. Ce pattern est fondamental pour les dashboards et les notifications dans les dApps.
Bonnes pratiques
- Toujours utiliser des variables d'environnement pour les clés privées et les URLs RPC
- Valider les adresses avec ethers.isAddress avant toute opération
- Gérer les erreurs réseau avec try/catch et des timeouts
- Utiliser le pattern de connexion unique au provider dans toute l'application
- Préférer les fonctions view aux appels on-chain coûteux
Erreurs courantes à éviter
- Oublier de convertir les unités (wei ↔ ether) avec formatEther ou parseEther
- Utiliser un provider sans signer pour des transactions qui nécessitent un wallet
- Ignorer les rejets de promesse lors des appels réseau
- Hardcoder des adresses de contrat sans vérifier le réseau
Pour aller plus loin
Découvrez nos formations complètes sur la blockchain et le développement Web3 sur Learni Group.