317 lines
11 KiB
Markdown
317 lines
11 KiB
Markdown
# É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-)
|