endprojetnobonus

This commit is contained in:
2026-10-20 15:09:41 +02:00
parent b374c4a68f
commit cdbd7c2eee
13 changed files with 170 additions and 121 deletions

View File

@@ -1,83 +1,50 @@
# Reprise du projet — où nous en sommes
> Dernière mise à jour : démarrage parcours guidé — **étape 1 en cours**.
> Dernière mise à jour : **2026-10-20** — partie obligatoire Tokenizer **terminée** ; bonus multisig **non retenu**.
## En bref
| | |
|---|---|
| **Fait** | Dépôt de travail, sujet FR v1.1, captures PDF, plan pédagogique, paquet `tokenizerRendu/` |
| **Fait** | **Étape 1** — FGC42Forge / FG42, wallet **FGC_account**, **0,1 tBNB** (Telegram faucet) |
| **En cours** | **[Étape 2](etapes/etape-02-init-hardhat.md)** — projet Hardhat dans `tokenizerRendu/code/` |
| **Prochaine action** | Suivre le guide étape 2 puis demander vérification |
| **Fait** | Token **FGC42Forge** / **FG42**, BSC Testnet, deploy + BscScan vérifié |
| **Fait** | `code/` (contrat commenté, tests, Hardhat), `deployment/`, `documentation/` |
| **Fait** | Démo transfer MetaMask (FGC_account → demo_account) |
| **Non retenu** | Bonus multisig (manque de temps) |
| **Avant Vogosphere** | Push `tokenizerRendu/`, checklist [demo](checklist-demo-evaluation.md), pas de `.env` |
## Arborescence actuelle
## Contrat (référence rapide)
```
tokenizer/ ← dépôt Git de TRAVAIL (perso)
├── README.md
├── .gitignore
├── tokenizer.pdf ← copie locale du sujet (optionnel)
├── docs/
│ ├── README.md
│ ├── sujets/
│ │ ├── tokenizer.md
│ │ ├── originaux/tokenizer_subject.pdf
│ │ └── captures/page-01.png … page-10.png
│ └── pedagogie/
│ ├── README.md
│ ├── 00-reprise-et-etat.md ← ce fichier
│ ├── parcours-etape-par-etape.md
│ ├── decisions-projet.md ← suivi étape 1+ (travail)
│ ├── etapes/etape-01-…md
│ ├── 01-apports-pedagogiques.md
│ ├── 02-web3-comprendre.md
│ └── guide-realisation.md
└── tokenizerRendu/ ← futur dépôt ÉCOLE (racine Vogosphere)
├── README.md
├── code/
├── deployment/
└── documentation/
```
| Champ | Valeur |
|-------|--------|
| Adresse | `0x0c76df26A1149fDc22C8f994975705271b070fF4` |
| Réseau | BSC Testnet, chainId `97` |
| Code commenté | `tokenizerRendu/code/contracts/FGC42Forge.sol` |
## Décisions à prendre (non figées)
| Sujet | Options | Recommandation doc |
|-------|---------|-------------------|
| Chaîne | BSC testnet, Sepolia, autre EVM | **BSC testnet** (partenariat BNB, faucet tBNB) |
| Toolchain | Hardhat, Foundry, Remix seul | **Hardhat** pour scripts reproductibles dans `deployment/` |
| Lib | OpenZeppelin ERC20 → BEP-20 | **OpenZeppelin** pour ownership et standard éprouvé |
| Nom / symbole | Doit contenir `42` | **`FGC42Forge`** / **`FG42`** — voir [decisions-projet.md](decisions-projet.md) |
| Bonus multisig | Gnosis Safe, contrat custom | Seulement après obligatoire **parfaite** |
## Avancement par étape (parcours guidé)
## Avancement par étape
→ Détail : [parcours-etape-par-etape.md](parcours-etape-par-etape.md)
| Étape | Contenu | Statut |
|-------|---------|--------|
| **0** | Structure, traduction, séparation travail / école | ✅ **Terminé** |
| **1** | Cadrage + wallet + tBNB + `decisions-projet.md` | ✅ **Validée** (0,1 tBNB, tx BscScan) |
| **2** | Init Hardhat dans `tokenizerRendu/code/` | 🔄 **À démarrer** |
| **3** | Contrat BEP-20 + tests | ⏳ |
| **4** | `deployment/` + deploy testnet + BscScan | ⏳ |
| **5** | `tokenizerRendu/documentation/` + README école | ⏳ |
| **6** | Démo + code review (préparation soutenance) | ⏳ |
| **7** | Bonus multisig | ⏳ |
| **0–1** | Structure, wallet, tBNB | ✅ |
| **2** | Hardhat 3 dans `code/` | ✅ |
| **3** | Contrat + tests | ✅ |
| **4** | Deploy + `deployment/` + BscScan verify | ✅ |
| **5** | `documentation/` + README choix techniques | ✅ |
| **6** | Démo + commentaires code (revue) | ✅ |
| **7** | Bonus multisig | ❌ Non retenu |
## Reprendre le travail (checklist)
## Reprendre avant correction
1. Ouvrir le dépôt : `~/projets/42School/tokenizer`
2. Relire la [partie obligatoire](../sujets/tokenizer.md#chapitre-iv--partie-obligatoire)
3. Suivre [guide-realisation.md](guide-realisation.md) depuis l’étape en cours
4. Ne committer **aucune clé privée** — `.env` local uniquement (voir `.gitignore` rendu)
5. Après déploiement : mettre à jour **ce fichier** + `tokenizerRendu/README.md` avec adresse et réseau
1. `cd tokenizerRendu/code && npx hardhat test mocha --grep FGC42Forge`
2. Parcourir [checklist-demo-evaluation.md](checklist-demo-evaluation.md)
3. Ouvrir `FGC42Forge.sol` + README racine rendu pour la soutenance
## Fichiers à renseigner après le code
## Fichiers clés
| Fichier | Quand |
|---------|--------|
| `tokenizerRendu/README.md` | Choix techniques + adresse contrat + réseau |
| `tokenizerRendu/deployment/` | Scripts et éventuellement `deployed.json` |
| `tokenizerRendu/documentation/` | Guide d’usage du token |
| Ce fichier | À chaque jalon important |
| Fichier | Rôle |
|---------|------|
| `tokenizerRendu/README.md` | Vue école + choix techniques |
| `tokenizerRendu/code/README.md` | Index code commenté pour correcteur |
| `tokenizerRendu/deployment/BSCSCAN_VERIFICATION.md` | Vérif explorateur |
| `docs/pedagogie/decisions-projet.md` | Suivi perso (hors rendu) |

View File

@@ -30,7 +30,7 @@
| **B4** | MetaMask **FGC_account** → transfer **100 FG42** → **demo_account** | `transfer` ERC-20 ; gas en **tBNB** |
| **B5** | BscScan transfers + solde **demo_account** | Preuve on-chain |
| **B6** | `documentation/README.md` | Un évaluateur peut importer le token et transférer sans ton aide |
| **B7** | (Optionnel) `code/contracts/FGC42Forge.sol` | OpenZeppelin **ERC20 + Ownable** ; `_mint` **uniquement** au constructeur — **pas de mint** public |
| **B7** | `code/contracts/FGC42Forge.sol` (commenté) | OpenZeppelin **ERC20 + Ownable** ; supply fixe ; index : `code/README.md` § relecture |
| **B8** | (Optionnel) `npx hardhat test` | Tests automatisés avant deploy |
---

View File

@@ -22,7 +22,7 @@
| Champ | Valeur | Concept | Référence |
|-------|--------|---------|-----------|
| **Date** | 2026-10-19 | Date de gel des décisions de cadrage (reprise projet). | [00-reprise-et-etat.md](00-reprise-et-etat.md) |
| **Étape** | **1 validée** (2026-10-20) | Wallet + **0,1 tBNB** via Telegram @bnbchain_official_bot. | [etape-01](etapes/etape-01-cadrage-wallet-testnet.md) |
| **Étape** | **Obligatoire terminée** (2026-10-20) | Deploy `0x0c76…0fF4` · doc · vérif BscScan · bonus non retenu | [parcours](parcours-etape-par-etape.md) |
| **Auteur / initiales** | FGC | Contexte perso du nom du token (pas une exigence du PDF). | — |
---

View File

@@ -21,8 +21,8 @@
| **3** | *(contrat + tests)* | `FGC42Forge.sol` + tests Mocha | ✅ |
| **4** | [etapes/etape-04-deploy-testnet.md](etapes/etape-04-deploy-testnet.md) | Dossier `deployment/` + deploy + BscScan | ✅ |
| **5** | `tokenizerRendu/documentation/README.md` | Doc utilisateur + choix techniques README | ✅ |
| **6** | [checklist-demo-evaluation.md](checklist-demo-evaluation.md) | Démo minimale + préparation code review | 🔄 |
| **7** | *(à venir)* | Bonus multisig (optionnel) | ⏳ |
| **6** | [checklist-demo-evaluation.md](checklist-demo-evaluation.md) | Démo + code commenté (`FGC42Forge.sol`, config, tests) | ✅ |
| **7** | — | Bonus multisig (optionnel) | ❌ Non retenu |
## Fichier de suivi (travail)

View File

@@ -13,6 +13,7 @@ Projet 42 — création et déploiement d’un **token** sur blockchain publique
| Smart contract (`code/`) | **FGC42Forge** + tests Hardhat |
| Déploiement (`deployment/`) | **Testnet** — voir [`deployment/addresses.json`](deployment/addresses.json) |
| Documentation utilisateur (`documentation/`) | **Rédigée** — [`documentation/README.md`](documentation/README.md) |
| Code review (commentaires) | **`contracts/FGC42Forge.sol`** + index [`code/README.md`](code/README.md) |
## Token
@@ -81,7 +82,7 @@ npx hardhat ignition deploy --network bscTestnet ignition/modules/FGC42Forge.ts
## Bonus
*(Si implémenté : multisig — décrire ici où se trouve le code et comment le tester.)*
**Non implémenté** (choix volontaire : priorité à une partie obligatoire stable et documentée). Le sujet propose un **multisig** en bonus ; non requis pour la correction du token BEP-20.
## Vidéo démo (optionnel)

View File

@@ -1,2 +1,8 @@
# Copier ce fichier vers `.env` (ignoré par Git) et remplir PRIVATE_KEY.
# Compte de TEST uniquement — jamais de fonds mainnet / seed phrase dans le dépôt.
# Point d'accès RPC BNB Smart Chain Testnet (chainId 97)
BSC_TESTNET_RPC=https://data-seed-prebsc-1-s1.binance.org:8545/
# Clé privée du compte qui déploie (64 caractères hex après 0x) — PAS l'adresse publique 0x...
PRIVATE_KEY=

View File

@@ -1,81 +1,85 @@
# Code — FGC42Forge (Hardhat 3)
Sources du token **FGC42Forge** (symbole **FG42**), standard **BEP-20**, déploiement prévu sur **BNB Smart Chain Testnet** (chainId **97**).
Sources du token **FGC42Forge** (symbole **FG42**), standard **BEP-20**, déployé sur **BNB Smart Chain Testnet** (chainId **97**).
Stack : **Solidity**, **Hardhat 3**, **OpenZeppelin**, tests **Mocha + ethers** et tests Solidity (`.t.sol`).
Stack : **Solidity 0.8.34**, **Hardhat 3**, **OpenZeppelin 5**, tests **Mocha + ethers**.
Adresse déployée et vérif BscScan : [`../deployment/addresses.json`](../deployment/addresses.json) · [`../deployment/BSCSCAN_VERIFICATION.md`](../deployment/BSCSCAN_VERIFICATION.md)
---
## Guide relecture (correcteur / code review)
| Fichier | Contenu commenté |
|---------|------------------|
| **`contracts/FGC42Forge.sol`** | **Contrat principal** — NatSpec, contraintes sujet, supply fixe, sécurité, fonctions héritées |
| `test/FGC42Forge.ts` | Tests du token (métadonnées, transfer, supply) |
| `ignition/modules/FGC42Forge.ts` | Module de déploiement Ignition |
| `hardhat.config.ts` | Compilateur, réseau `bscTestnet`, variables d’environnement |
Fichiers **hors livrable token** (template Hardhat) : `contracts/Counter.sol`, `Counter.t.sol`, `test/Counter.ts` — le jeton évalué est **FGC42Forge** uniquement.
---
### BEP-20 vs `ERC20` dans le code
- **Rendu / soutenance :** token **BEP-20** sur **BNB Smart Chain Testnet** (chainId 97).
- **Code :** héritage **OpenZeppelin `ERC20`** — norme EVM identique en pratique ; pas de bibliothèque `BEP20` séparée.
- **Après deploy :** BscScan classera le contrat en **BEP-20** ; le **code source** utilise toujours `import {ERC20} from "@openzeppelin/contracts/..."`.
- **Soutenance :** jeton **BEP-20** sur BSC Testnet.
- **Code :** héritage **OpenZeppelin `ERC20`** (interface EVM identique ; pas de module `BEP20` séparé).
- **BscScan :** affiche BEP-20 après déploiement ; vérification du **code source** via `deployment/FGC42Forge_flat.sol`.
> Le dossier peut encore contenir l’exemple **Counter** (template Hardhat) en attendant nettoyage.
---
## Prérequis
- Node.js ≥ 18 (Hardhat 3 recommande v22+)
- Compte testnet avec **tBNB** (ex. MetaMask, réseau BSC Testnet)
- Compte testnet avec **tBNB** pour deploy / gas
## Installation
```shell
cd code
npm install
```
## Variables d’environnement
Copier le modèle et remplir les valeurs **localement** (ne jamais committer `.env`) :
```shell
cp .env.example .env
# Éditer .env : PRIVATE_KEY = clé privée (pas l'adresse wallet)
```
| Variable | Description |
|----------|-------------|
| `BSC_TESTNET_RPC` | URL RPC du testnet BSC (défaut dans `.env.example`) |
| `PRIVATE_KEY` | Clé privée du compte de **test** uniquement (préfixe `0x`) |
Hardhat lit ces variables via `hardhat.config.ts` et `dotenv`.
| `BSC_TESTNET_RPC` | URL RPC BSC Testnet |
| `PRIVATE_KEY` | Signataire des transactions Hardhat (deploy) |
## Commandes utiles
Compiler les contrats :
```shell
npx hardhat build
npx hardhat test mocha --grep FGC42Forge
```
Lancer tous les tests (exemple Counter, en attendant FGC42Forge) :
Tous les tests (inclut l’exemple Counter du template) :
```shell
npx hardhat test
```
Tests séparés :
```shell
npx hardhat test solidity
npx hardhat test mocha
```
## Réseau `bscTestnet`
Le réseau **`bscTestnet`** est déclaré dans `hardhat.config.ts`. Pour un déploiement (plus tard, avec Ignition ou un script) :
## Déploiement (déjà effectué — reproduction)
```shell
npx hardhat ignition deploy --network bscTestnet ignition/modules/FGC42Forge.ts
```
Voir aussi [`../deployment/README.md`](../deployment/README.md).
Détails : [`../deployment/README.md`](../deployment/README.md)
## Structure
## Arborescence
```
contracts/ Contrats Solidity (+ tests .t.sol)
test/ Tests TypeScript (Mocha)
ignition/ Modules de déploiement Hardhat Ignition
scripts/ Scripts `hardhat run`
hardhat.config.ts
contracts/
FGC42Forge.sol ← token BEP-20 (commenté pour la soutenance)
Counter.* ← exemple Hardhat (optionnel)
test/
FGC42Forge.ts ← tests du token
ignition/modules/
FGC42Forge.ts ← deploy Ignition
hardhat.config.ts ← réseau bscTestnet + Solidity 0.8.34
```
Documentation utilisateur (wallet, transfers) : [`../documentation/README.md`](../documentation/README.md)

View File

@@ -1,17 +1,51 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.34;
// --- Imports (OpenZeppelin 5.x) ---
// ERC20 : implémentation standard d’un jeton fongible (transfer, balanceOf, totalSupply, …).
// Sur BNB Smart Chain, l’explorateur qualifie ce type de jeton en BEP-20.
// Ownable : un compte « owner » pour l’administration du contrat (sans mint dans ce projet).
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
/// @title FGC42Forge — jeton fongible pour BNB Smart Chain Testnet
/// @notice Standard **BEP-20** (exigé sur BSC) : même interface que l’ERC-20 sur l’EVM.
/// On importe OpenZeppelin `ERC20` ; après déploiement sur BSC, BscScan affiche un token BEP-20.
/// Phrase soutenance : « BEP-20 sur la chaîne, implémenté via ERC20 OpenZeppelin. »
/**
* @title FGC42Forge
* @notice Jeton pédagogique du projet 42 Tokenizer — réseau BNB Smart Chain Testnet uniquement.
*
* Contraintes sujet :
* - Nom contenant « 42 » : FGC42Forge (symbole FG42).
* - Standard de la chaîne : BEP-20 (code via OpenZeppelin ERC20).
* - Supply fixe : 1 000 000 jetons, créés une seule fois au déploiement (pas de mint public).
*
* Sécurité (soutenance) :
* - Toute la supply est mintée au constructeur vers le déployeur (msg.sender).
* - Aucune fonction publique permettant d’augmenter totalSupply après deploy.
* - owner() peut gérer le rôle admin OpenZeppelin (ex. transferOwnership), pas créer de FG42.
*/
contract FGC42Forge is ERC20, Ownable {
/**
* @dev Offre initiale en plus petite unité (18 décimales, convention ERC-20).
* 1 FG42 affiché dans un wallet = 1 * 10^18 unités internes.
* Literal : 1_000_000 * 10^18 (lisible ; équivalent à 1_000_000 * 10**decimals()).
*/
uint256 private constant INITIAL_SUPPLY = 1_000_000 * (10 ** 18);
/**
* @notice Déploie le token et forge toute la supply pour le compte qui envoie la transaction.
*
* @dev Ordre des initialiseurs de héritage :
* 1. ERC20("FGC42Forge", "FG42") — nom et symbole on-chain (MetaMask, BscScan).
* 2. Ownable(msg.sender) — le déployeur devient owner (admin du contrat).
* 3. _mint(msg.sender, INITIAL_SUPPLY) — émission unique ; pas d’appel mint ultérieur prévu.
*/
constructor() ERC20("FGC42Forge", "FG42") Ownable(msg.sender) {
_mint(msg.sender, INITIAL_SUPPLY);
}
// -------------------------------------------------------------------------
// Fonctions ERC-20 héritées (non redéfinies ici) — utilisables telles quelles :
// name(), symbol(), decimals(), totalSupply(), balanceOf(), transfer(),
// approve(), transferFrom(), allowance(), événements Transfer / Approval.
// Fonctions Ownable héritées : owner(), transferOwnership(), renounceOwnership().
// -------------------------------------------------------------------------
}

View File

@@ -1,10 +1,24 @@
/**
* Configuration Hardhat 3 — projet FGC42Forge (Tokenizer 42).
*
* - Compile Solidity (profils default / production).
* - Tests Mocha + ethers via hardhat-toolbox-mocha-ethers.
* - Déploiement testnet : réseau `bscTestnet` (BNB Smart Chain, chainId 97).
*
* Secrets : variables lues depuis `code/.env` (voir `.env.example`).
* Ne jamais committer PRIVATE_KEY.
*/
import hardhatToolboxMochaEthersPlugin from "@nomicfoundation/hardhat-toolbox-mocha-ethers";
import { configVariable, defineConfig } from "hardhat/config";
// Charge BSC_TESTNET_RPC et PRIVATE_KEY depuis le fichier .env local.
import "dotenv/config";
export default defineConfig({
plugins: [hardhatToolboxMochaEthersPlugin],
solidity: {
// Deux profils : dev (default) et production (optimizer activé — proche du deploy Ignition).
profiles: {
default: {
version: "0.8.34",
@@ -20,7 +34,9 @@ export default defineConfig({
},
},
},
networks: {
// Chaînes simulées locales (template Hardhat 3 — utiles pour tests génériques).
hardhatMainnet: {
type: "edr-simulated",
chainType: "l1",
@@ -29,6 +45,9 @@ export default defineConfig({
type: "edr-simulated",
chainType: "op",
},
// Réseau public de test — déploiement réel du token (gas en tBNB).
// Usage : npx hardhat ignition deploy --network bscTestnet ignition/modules/FGC42Forge.ts
bscTestnet: {
type: "http",
chainType: "l1",

View File

@@ -1,9 +1,14 @@
/**
* Module Hardhat Ignition — déploiement de FGC42Forge sur le réseau cible.
*
* Usage (depuis code/) :
* npx hardhat ignition deploy --network bscTestnet ignition/modules/FGC42Forge.ts
*
* Le constructeur du contrat mint 1 000 000 FG42 vers l’adresse qui signe la tx (PRIVATE_KEY dans .env).
* Adresse enregistrée : deployment/addresses.json
*/
import { buildModule } from "@nomicfoundation/hardhat-ignition/modules";
/**
* Déploie FGC42Forge sur le réseau passé à `ignition deploy` (ex. bscTestnet).
* Le constructeur mint toute la supply au compte qui signe le déploiement.
*/
export default buildModule("FGC42ForgeModule", (m) => {
const token = m.contract("FGC42Forge");

View File

@@ -1,8 +1,14 @@
import { expect } from "chai"; // pour les assertions
import { network } from "hardhat"; // pour les tests
/**
* Tests d’intégration Hardhat 3 (chaîne simulée locale) pour le contrat FGC42Forge.
* Complète la revue de code : vérifie le comportement BEP-20 attendu avant / après deploy testnet.
*/
import { expect } from "chai";
import { network } from "hardhat";
// Connexion réseau Hardhat 3 (équivalent Ethers pour deploy et appels de contrat).
const { ethers } = await network.create();
// Supply attendue : 1 million de jetons avec 18 décimales (unités minimales on-chain).
const INITIAL_SUPPLY = 1_000_000n * 10n ** 18n;
describe("FGC42Forge", function () {
@@ -10,9 +16,12 @@ describe("FGC42Forge", function () {
const [deployer] = await ethers.getSigners();
const token = await ethers.deployContract("FGC42Forge");
// Métadonnées imposées par le constructeur Solidity.
expect(await token.name()).to.equal("FGC42Forge");
expect(await token.symbol()).to.equal("FG42");
expect(await token.decimals()).to.equal(18n);
// Toute la supply doit exister et être détenue par le compte qui a déployé.
expect(await token.totalSupply()).to.equal(INITIAL_SUPPLY);
expect(await token.balanceOf(deployer.address)).to.equal(INITIAL_SUPPLY);
expect(await token.owner()).to.equal(deployer.address);
@@ -27,6 +36,7 @@ describe("FGC42Forge", function () {
.to.emit(token, "Transfer")
.withArgs(deployer.address, recipient.address, amount);
// Conservation de la masse monétaire : totalSupply inchangé, soldes déplacés.
expect(await token.balanceOf(recipient.address)).to.equal(amount);
expect(await token.balanceOf(deployer.address)).to.equal(
INITIAL_SUPPLY - amount,

View File

@@ -1,6 +1,8 @@
# Déploiement — FGC42Forge (BSC Testnet)
Scripts et **trace** du déploiement public. Le déploiement lui-même s’exécute depuis **`code/`** (Hardhat Ignition).
Scripts et **trace** du déploiement public. Le déploiement s’exécute depuis **`code/`** (Hardhat Ignition).
**Code du token (commenté pour la revue)** : [`../code/contracts/FGC42Forge.sol`](../code/contracts/FGC42Forge.sol)
## Prérequis

View File

@@ -113,6 +113,7 @@ Le compte qui a **déployé** le contrat détient initialement **1 000 000 FG42*
| **Clés privées** | Ne jamais partager seed phrase ni clé privée ; ne pas les committer dans Git. |
Pour le modèle technique (Hardhat, OpenZeppelin, choix BSC), voir le [README racine](../README.md#choix-techniques).
**Code commenté (revue en évaluation)** : [`../code/contracts/FGC42Forge.sol`](../code/contracts/FGC42Forge.sol) · index [`../code/README.md`](../code/README.md).
---