Files
tokenizer/docs/pedagogie/etapes/etape-02-init-hardhat.md
2026-10-20 12:30:12 +02:00

317 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Étape 2 — Initialiser Hardhat dans `tokenizerRendu/code/`
> **Sujet (ch. IV) :** dossier **`code/`** à la racine du dépôt école ; maîtriser la toolchain (Hardhat cité) ; code commenté plus tard (étape 3).
> **Prérequis :** étape 1 ✅ (réseau BSC Testnet 97, tBNB sur **FGC_account**).
> **Lire d’abord (recommandé) :** [Hardhat et alternatives](../03-hardhat-et-alternatives.md) · [Ressources Solidity / Hardhat](../ressources-solidity-hardhat.md) (§ 2 + § 8 plan minimum).
---
## Objectif (en une phrase)
Tu installes sur ta machine une **chaîne d’outils** (Node + Hardhat) qui va **compiler** du Solidity, **lancer des tests** et **déployer** sur BSC Testnet — sans écrire encore ton token **FGC42Forge** (étape 3).
### Rappel pédagogique : qui fait quoi ?
| Élément | Rôle |
|--------|------|
| **Solidity** | Langage des contrats (`FGC42Forge.sol`, plus tard). |
| **Hardhat** | Programme Node.js : compile, tests, scripts de déploiement. |
| **OpenZeppelin** | Bibliothèque de contrats éprouvés (`ERC20`, `Ownable`) — installée maintenant, utilisée à l’étape 3. |
| **`.env`** | Fichier local avec RPC + clé privée — lu par `hardhat.config.js`, **jamais** dans Git. |
---
## Vue d’ensemble des sous-étapes
1. **A** — Vérifier Node.js et se placer dans `tokenizerRendu/code/`
2. **B** — Créer `package.json` et installer Hardhat
3. **C** — Lancer `npx hardhat init` (assistant interactif)
4. **D** — Installer OpenZeppelin + `dotenv`
5. **E** — Configurer `hardhat.config.js` pour **BSC Testnet (chainId 97)**
6. **F** — Créer `.env` (secret) et `.env.example` (modèle pour le rendu)
7. **G** — `npx hardhat compile` (preuve que tout fonctionne)
8. **H** — Compléter `code/README.md`
Durée indicative : **30–45 min** la première fois (surtout la lecture des menus `hardhat init`).
---
## A. Environnement
### Où travailler ?
Le sujet demande le code dans **`tokenizerRendu/code/`** (dépôt de rendu), pas à la racine `tokenizer/` du dépôt de travail.
```bash
cd /home/fgras-ca/projets/42School/tokenizer/tokenizerRendu/code
pwd # doit finir par .../tokenizerRendu/code
```
### Node.js
```bash
node -v # idéalement ≥ 18 (ex. v20, v22)
npm -v
```
Si `node` est introuvable : installer [Node.js LTS](https://nodejs.org/) ou utiliser `nvm`.
**Checklist :**
- [ ] `node -v` OK
- [ ] Tu es dans `tokenizerRendu/code/`
---
## B. Créer le projet npm
`npm init -y` crée un **`package.json`** minimal : nom du projet, scripts, liste des dépendances.
```bash
npm init -y
```
Tu dois voir un fichier `package.json` apparaître dans `code/`.
Puis installer Hardhat et le **toolbox** (plugins officiels : tests, Ethers, etc.) :
```bash
npm install --save-dev hardhat @nomicfoundation/hardhat-toolbox
```
- `--save-dev` = outils de développement uniquement (pas besoin sur la blockchain).
- Première install : **téléchargement** depuis le registre npm → connexion Internet requise.
**Checklist :**
- [ ] `package.json` présent
- [ ] Dossier `node_modules/` créé (ignoré par Git via `.gitignore` parent)
---
## C. Assistant d’initialisation Hardhat
Tu as installé **Hardhat 3** (ex. `3.20.x` via `npm install hardhat`). À partir de la v3, la commande a changé :
```bash
npx hardhat --init
```
> **Erreur HHE3** avec `npx hardhat init` ? C’est normal : l’ancienne sous-commande `init` n’existe plus. Le message te dit d’utiliser **`--init`** (avec deux tirets).
Lance **`npx hardhat --init` dans ton terminal** (pas dans un environnement non interactif) : Hardhat affiche le logo et te pose des questions.
`npx` exécute le binaire Hardhat **sans** l’installer globalement.
### Variante (tutos Hardhat 2 uniquement)
Si tu veux coller aux vieux tutos (`hardhat init` + `hardhat.config.js` + `npx hardhat compile`), tu peux **épingler Hardhat 2** avant d’initialiser :
```bash
npm uninstall hardhat @nomicfoundation/hardhat-toolbox
npm install --save-dev hardhat@2.22.19 @nomicfoundation/hardhat-toolbox@5
npx hardhat init
```
Pour ce projet 42, **Hardhat 3 + `--init`** convient très bien ; on adaptera la config réseau BSC après l’assistant (souvent `hardhat.config.ts` + `npx hardhat build` au lieu de `compile`).
### Choix recommandés (JavaScript, plus simple pour ce projet)
Les libellés peuvent varier légèrement selon la version de Hardhat ; l’idée :
| Question | Choix conseillé | Pourquoi |
|----------|-----------------|----------|
| Type de projet | **Create a JavaScript project** | Moins de config TypeScript pour commencer |
| Emplacement du config | **Oui** / racine de `code/` | `hardhat.config.js` à côté de `package.json` |
| Projet vide ou exemple ? | **Oui, exemple** (Lock) | Tu vérifies compile + tests ; Lock supprimé à l’étape 3 |
| `.gitignore` dans `code/` ? | **Non** si déjà couvert par `tokenizerRendu/.gitignore` | Évite les doublons ; le parent ignore déjà `node_modules`, `cache`, `artifacts` |
### Arborescence typique après init
```
tokenizerRendu/code/
├── contracts/
│ └── Lock.sol # exemple — temporaire
├── test/
│ └── Lock.js # tests de l’exemple
├── scripts/
│ └── (deploy Lock, etc.)
├── hardhat.config.js
├── package.json
└── package-lock.json
```
**Checklist :**
- [ ] `hardhat.config.js` existe
- [ ] `contracts/Lock.sol` existe (pour l’instant)
---
## D. OpenZeppelin et dotenv
```bash
npm install @openzeppelin/contracts
npm install dotenv
```
- **OpenZeppelin** : tu n’importes rien encore ; c’est pour l’étape 3 (`import "@openzeppelin/contracts/..."`).
- **dotenv** : charge les variables du fichier `.env` dans `process.env` au lancement de Hardhat.
**Checklist :**
- [ ] Les deux paquets listés dans `package.json` → `dependencies` ou `devDependencies`
---
## E. Configurer BSC Testnet dans `hardhat.config.js`
Ouvre `hardhat.config.js` et remplace son contenu par (ou fusionne proprement si tu préfères) :
```javascript
require("@nomicfoundation/hardhat-toolbox");
require("dotenv").config();
/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
solidity: "0.8.24",
networks: {
bscTestnet: {
url: process.env.BSC_TESTNET_RPC || "https://data-seed-prebsc-1-s1.binance.org:8545/",
chainId: 97,
accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : [],
},
},
};
```
### Ce que signifient les lignes importantes
- **`solidity: "0.8.24"`** : version du compilateur pour tous les contrats (alignée avec OpenZeppelin récent).
- **`bscTestnet`** : nom **local** du réseau ; tu l’utiliseras plus tard avec `--network bscTestnet`.
- **`chainId: 97`** : identifiant officiel BNB Smart Chain **Testnet** (doit correspondre à MetaMask).
- **`accounts`** : si `PRIVATE_KEY` est vide, tableau vide → compile/tests locaux OK ; **déploiement** testnet nécessitera la clé (étape déploiement).
Tu ne déploies **pas** sur le testnet dans cette étape : tu prépares seulement la config.
**Checklist :**
- [ ] `require("dotenv").config();` présent
- [ ] `chainId: 97` présent
---
## F. Fichiers `.env` et `.env.example`
### Sécurité (à lire une fois pour toute la suite)
- La **clé privée** = contrôle total du compte → **compte de test uniquement** (FGC_account).
- **Ne jamais** : commit Git, capture d’écran publique, message Discord/chat avec la clé.
- Si tu as un `.env` à la racine `tokenizer/` (dépôt travail), le secret pour Hardhat doit vivre dans **`tokenizerRendu/code/.env`** (celui que lit `hardhat.config.js`).
### `tokenizerRendu/code/.env` (local, ignoré par Git)
Crée le fichier à la main :
```env
BSC_TESTNET_RPC=https://data-seed-prebsc-1-s1.binance.org:8545/
PRIVATE_KEY=0x................................................................
```
**Obtenir la clé (MetaMask)** : compte **FGC_account** → ⋮ → **Détails du compte** → **Afficher la clé privée** (mot de passe MetaMask) → copier **avec** le préfixe `0x`.
### `tokenizerRendu/code/.env.example` (à committer)
Même structure, **sans** vraie clé :
```env
BSC_TESTNET_RPC=https://data-seed-prebsc-1-s1.binance.org:8545/
PRIVATE_KEY=
```
Le `.gitignore` du rendu (`tokenizerRendu/.gitignore`) contient déjà `.env` et autorise `.env.example` via `!.env.example`.
**Checklist :**
- [ ] `.env` créé dans **`code/`** (pas seulement à la racine tokenizer)
- [ ] `.env.example` créé
- [ ] `git status` ne liste **pas** `.env` comme fichier à committer
---
## G. Vérifier la compilation
```bash
npx hardhat compile
```
### Sortie attendue (succès)
Quelque chose comme :
```
Compiled 1 Solidity file successfully (evm target: paris).
```
Des dossiers **`cache/`** et **`artifacts/`** apparaissent (déjà ignorés par Git).
### Tests optionnels (exemple Lock)
```bash
npx hardhat test
```
Si les tests passent, Hardhat + toolbox sont bien branchés. Ce n’est pas obligatoire pour valider l’étape 2, mais c’est rassurant.
### Dépannage rapide
| Problème | Piste |
|----------|--------|
| **HHE3** — `No Hardhat config` + « run with **--init** » | Utiliser `npx hardhat --init` (Hardhat 3), pas `npx hardhat init` |
| **HHE11** — pas de shell interactif | Lancer `--init` dans **ton** terminal Cursor / système |
| `Cannot find module '@nomicfoundation/hardhat-toolbox'` | Relancer `npm install` dans `code/` |
| Erreur Solidity / version | Vérifier `solidity` dans `hardhat.config.js` et la version en tête de `Lock.sol` |
| `PRIVATE_KEY` / invalid account | Normal si clé mal formatée ; **compile** ne nécessite pas la clé. Corriger avant déploiement. |
| Permission réseau npm | Vérifier proxy / réseau ; réessayer `npm install` |
**Checklist :**
- [ ] `npx hardhat compile` **sans erreur**
---
## H. Mettre à jour `code/README.md`
Ajoute une section courte (en français pour ton suivi ; README école final plus tard si besoin) :
- Prérequis : Node ≥ 18
- `cd code && npm install`
- Copier `.env.example` → `.env` et remplir `PRIVATE_KEY`
- `npx hardhat compile`
- Prochaine étape : contrat **FGC42Forge** (étape 3)
---
## Livrable pour vérification (dans le chat)
1. « Étape 2 terminée »
2. Copier **uniquement** la dernière ligne de succès de `npx hardhat compile` (pas de `.env`)
3. Confirmer : `.env.example` présent, `.env` **non** commité
**Ne pas envoyer** la clé privée.
---
## Après cette étape
- **Étape 3** : supprimer `Lock.sol`, ajouter `FGC42Forge.sol` (supply 1 000 000, pas de mint, `Ownable`), tests.
- **Déploiement testnet** : plus tard, avec `npx hardhat run scripts/... --network bscTestnet`.
---
## Références
- [decisions-projet.md](../decisions-projet.md) — FGC42Forge / FG42
- [guide-realisation.md](../guide-realisation.md) — étape 2
- Sujet : dossier `code/` — [tokenizer.md](../../sujets/tokenizer.md#code-)