# É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-)