endprojetnobonus
This commit is contained in:
@@ -1,83 +1,50 @@
|
|||||||
# Reprise du projet — où nous en sommes
|
# 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
|
## En bref
|
||||||
|
|
||||||
| | |
|
| | |
|
||||||
|---|---|
|
|---|---|
|
||||||
| **Fait** | Dépôt de travail, sujet FR v1.1, captures PDF, plan pédagogique, paquet `tokenizerRendu/` |
|
| **Fait** | Token **FGC42Forge** / **FG42**, BSC Testnet, deploy + BscScan vérifié |
|
||||||
| **Fait** | **Étape 1** — FGC42Forge / FG42, wallet **FGC_account**, **0,1 tBNB** (Telegram faucet) |
|
| **Fait** | `code/` (contrat commenté, tests, Hardhat), `deployment/`, `documentation/` |
|
||||||
| **En cours** | **[Étape 2](etapes/etape-02-init-hardhat.md)** — projet Hardhat dans `tokenizerRendu/code/` |
|
| **Fait** | Démo transfer MetaMask (FGC_account → demo_account) |
|
||||||
| **Prochaine action** | Suivre le guide étape 2 puis demander vérification |
|
| **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)
|
||||||
|
|
||||||
```
|
| Champ | Valeur |
|
||||||
tokenizer/ ← dépôt Git de TRAVAIL (perso)
|
|-------|--------|
|
||||||
├── README.md
|
| Adresse | `0x0c76df26A1149fDc22C8f994975705271b070fF4` |
|
||||||
├── .gitignore
|
| Réseau | BSC Testnet, chainId `97` |
|
||||||
├── tokenizer.pdf ← copie locale du sujet (optionnel)
|
| Code commenté | `tokenizerRendu/code/contracts/FGC42Forge.sol` |
|
||||||
├── 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/
|
|
||||||
```
|
|
||||||
|
|
||||||
## Décisions à prendre (non figées)
|
## Avancement par étape
|
||||||
|
|
||||||
| 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é)
|
|
||||||
|
|
||||||
→ Détail : [parcours-etape-par-etape.md](parcours-etape-par-etape.md)
|
→ Détail : [parcours-etape-par-etape.md](parcours-etape-par-etape.md)
|
||||||
|
|
||||||
| Étape | Contenu | Statut |
|
| Étape | Contenu | Statut |
|
||||||
|-------|---------|--------|
|
|-------|---------|--------|
|
||||||
| **0** | Structure, traduction, séparation travail / école | ✅ **Terminé** |
|
| **0–1** | Structure, wallet, tBNB | ✅ |
|
||||||
| **1** | Cadrage + wallet + tBNB + `decisions-projet.md` | ✅ **Validée** (0,1 tBNB, tx BscScan) |
|
| **2** | Hardhat 3 dans `code/` | ✅ |
|
||||||
| **2** | Init Hardhat dans `tokenizerRendu/code/` | 🔄 **À démarrer** |
|
| **3** | Contrat + tests | ✅ |
|
||||||
| **3** | Contrat BEP-20 + tests | ⏳ |
|
| **4** | Deploy + `deployment/` + BscScan verify | ✅ |
|
||||||
| **4** | `deployment/` + deploy testnet + BscScan | ⏳ |
|
| **5** | `documentation/` + README choix techniques | ✅ |
|
||||||
| **5** | `tokenizerRendu/documentation/` + README école | ⏳ |
|
| **6** | Démo + commentaires code (revue) | ✅ |
|
||||||
| **6** | Démo + code review (préparation soutenance) | ⏳ |
|
| **7** | Bonus multisig | ❌ Non retenu |
|
||||||
| **7** | Bonus multisig | ⏳ |
|
|
||||||
|
|
||||||
## Reprendre le travail (checklist)
|
## Reprendre avant correction
|
||||||
|
|
||||||
1. Ouvrir le dépôt : `~/projets/42School/tokenizer`
|
1. `cd tokenizerRendu/code && npx hardhat test mocha --grep FGC42Forge`
|
||||||
2. Relire la [partie obligatoire](../sujets/tokenizer.md#chapitre-iv--partie-obligatoire)
|
2. Parcourir [checklist-demo-evaluation.md](checklist-demo-evaluation.md)
|
||||||
3. Suivre [guide-realisation.md](guide-realisation.md) depuis l’étape en cours
|
3. Ouvrir `FGC42Forge.sol` + README racine rendu pour la soutenance
|
||||||
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
|
|
||||||
|
|
||||||
## Fichiers à renseigner après le code
|
## Fichiers clés
|
||||||
|
|
||||||
| Fichier | Quand |
|
| Fichier | Rôle |
|
||||||
|---------|--------|
|
|---------|------|
|
||||||
| `tokenizerRendu/README.md` | Choix techniques + adresse contrat + réseau |
|
| `tokenizerRendu/README.md` | Vue école + choix techniques |
|
||||||
| `tokenizerRendu/deployment/` | Scripts et éventuellement `deployed.json` |
|
| `tokenizerRendu/code/README.md` | Index code commenté pour correcteur |
|
||||||
| `tokenizerRendu/documentation/` | Guide d’usage du token |
|
| `tokenizerRendu/deployment/BSCSCAN_VERIFICATION.md` | Vérif explorateur |
|
||||||
| Ce fichier | À chaque jalon important |
|
| `docs/pedagogie/decisions-projet.md` | Suivi perso (hors rendu) |
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
| **B4** | MetaMask **FGC_account** → transfer **100 FG42** → **demo_account** | `transfer` ERC-20 ; gas en **tBNB** |
|
| **B4** | MetaMask **FGC_account** → transfer **100 FG42** → **demo_account** | `transfer` ERC-20 ; gas en **tBNB** |
|
||||||
| **B5** | BscScan transfers + solde **demo_account** | Preuve on-chain |
|
| **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 |
|
| **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 |
|
| **B8** | (Optionnel) `npx hardhat test` | Tests automatisés avant deploy |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
| Champ | Valeur | Concept | Référence |
|
| 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) |
|
| **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). | — |
|
| **Auteur / initiales** | FGC | Contexte perso du nom du token (pas une exigence du PDF). | — |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -21,8 +21,8 @@
|
|||||||
| **3** | *(contrat + tests)* | `FGC42Forge.sol` + tests Mocha | ✅ |
|
| **3** | *(contrat + tests)* | `FGC42Forge.sol` + tests Mocha | ✅ |
|
||||||
| **4** | [etapes/etape-04-deploy-testnet.md](etapes/etape-04-deploy-testnet.md) | Dossier `deployment/` + deploy + BscScan | ✅ |
|
| **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 | ✅ |
|
| **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 | 🔄 |
|
| **6** | [checklist-demo-evaluation.md](checklist-demo-evaluation.md) | Démo + code commenté (`FGC42Forge.sol`, config, tests) | ✅ |
|
||||||
| **7** | *(à venir)* | Bonus multisig (optionnel) | ⏳ |
|
| **7** | — | Bonus multisig (optionnel) | ❌ Non retenu |
|
||||||
|
|
||||||
## Fichier de suivi (travail)
|
## Fichier de suivi (travail)
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ Projet 42 — création et déploiement d’un **token** sur blockchain publique
|
|||||||
| Smart contract (`code/`) | **FGC42Forge** + tests Hardhat |
|
| Smart contract (`code/`) | **FGC42Forge** + tests Hardhat |
|
||||||
| Déploiement (`deployment/`) | **Testnet** — voir [`deployment/addresses.json`](deployment/addresses.json) |
|
| Déploiement (`deployment/`) | **Testnet** — voir [`deployment/addresses.json`](deployment/addresses.json) |
|
||||||
| Documentation utilisateur (`documentation/`) | **Rédigée** — [`documentation/README.md`](documentation/README.md) |
|
| 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
|
## Token
|
||||||
|
|
||||||
@@ -81,7 +82,7 @@ npx hardhat ignition deploy --network bscTestnet ignition/modules/FGC42Forge.ts
|
|||||||
|
|
||||||
## Bonus
|
## 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)
|
## Vidéo démo (optionnel)
|
||||||
|
|
||||||
|
|||||||
@@ -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/
|
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=
|
PRIVATE_KEY=
|
||||||
|
|||||||
@@ -1,81 +1,85 @@
|
|||||||
# Code — FGC42Forge (Hardhat 3)
|
# 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
|
### BEP-20 vs `ERC20` dans le code
|
||||||
|
|
||||||
- **Rendu / soutenance :** token **BEP-20** sur **BNB Smart Chain Testnet** (chainId 97).
|
- **Soutenance :** jeton **BEP-20** sur BSC Testnet.
|
||||||
- **Code :** héritage **OpenZeppelin `ERC20`** — norme EVM identique en pratique ; pas de bibliothèque `BEP20` séparée.
|
- **Code :** héritage **OpenZeppelin `ERC20`** (interface EVM identique ; pas de module `BEP20` séparé).
|
||||||
- **Après deploy :** BscScan classera le contrat en **BEP-20** ; le **code source** utilise toujours `import {ERC20} from "@openzeppelin/contracts/..."`.
|
- **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
|
## Prérequis
|
||||||
|
|
||||||
- Node.js ≥ 18 (Hardhat 3 recommande v22+)
|
- 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
|
## Installation
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
cd code
|
cd code
|
||||||
npm install
|
npm install
|
||||||
```
|
|
||||||
|
|
||||||
## Variables d’environnement
|
|
||||||
|
|
||||||
Copier le modèle et remplir les valeurs **localement** (ne jamais committer `.env`) :
|
|
||||||
|
|
||||||
```shell
|
|
||||||
cp .env.example .env
|
cp .env.example .env
|
||||||
|
# Éditer .env : PRIVATE_KEY = clé privée (pas l'adresse wallet)
|
||||||
```
|
```
|
||||||
|
|
||||||
| Variable | Description |
|
| Variable | Description |
|
||||||
|----------|-------------|
|
|----------|-------------|
|
||||||
| `BSC_TESTNET_RPC` | URL RPC du testnet BSC (défaut dans `.env.example`) |
|
| `BSC_TESTNET_RPC` | URL RPC BSC Testnet |
|
||||||
| `PRIVATE_KEY` | Clé privée du compte de **test** uniquement (préfixe `0x`) |
|
| `PRIVATE_KEY` | Signataire des transactions Hardhat (deploy) |
|
||||||
|
|
||||||
Hardhat lit ces variables via `hardhat.config.ts` et `dotenv`.
|
|
||||||
|
|
||||||
## Commandes utiles
|
## Commandes utiles
|
||||||
|
|
||||||
Compiler les contrats :
|
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
npx hardhat build
|
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
|
```shell
|
||||||
npx hardhat test
|
npx hardhat test
|
||||||
```
|
```
|
||||||
|
|
||||||
Tests séparés :
|
## Déploiement (déjà effectué — reproduction)
|
||||||
|
|
||||||
```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) :
|
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
npx hardhat ignition deploy --network bscTestnet ignition/modules/FGC42Forge.ts
|
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)
|
contracts/
|
||||||
test/ Tests TypeScript (Mocha)
|
FGC42Forge.sol ← token BEP-20 (commenté pour la soutenance)
|
||||||
ignition/ Modules de déploiement Hardhat Ignition
|
Counter.* ← exemple Hardhat (optionnel)
|
||||||
scripts/ Scripts `hardhat run`
|
test/
|
||||||
hardhat.config.ts
|
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)
|
||||||
|
|||||||
@@ -1,17 +1,51 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
pragma solidity ^0.8.34;
|
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 {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
|
||||||
import {Ownable} from "@openzeppelin/contracts/access/Ownable.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.
|
* @title FGC42Forge
|
||||||
/// On importe OpenZeppelin `ERC20` ; après déploiement sur BSC, BscScan affiche un token BEP-20.
|
* @notice Jeton pédagogique du projet 42 Tokenizer — réseau BNB Smart Chain Testnet uniquement.
|
||||||
/// Phrase soutenance : « BEP-20 sur la chaîne, implémenté via ERC20 OpenZeppelin. »
|
*
|
||||||
|
* 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 {
|
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);
|
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) {
|
constructor() ERC20("FGC42Forge", "FG42") Ownable(msg.sender) {
|
||||||
_mint(msg.sender, INITIAL_SUPPLY);
|
_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().
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
}
|
||||||
|
|||||||
@@ -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 hardhatToolboxMochaEthersPlugin from "@nomicfoundation/hardhat-toolbox-mocha-ethers";
|
||||||
import { configVariable, defineConfig } from "hardhat/config";
|
import { configVariable, defineConfig } from "hardhat/config";
|
||||||
|
|
||||||
|
// Charge BSC_TESTNET_RPC et PRIVATE_KEY depuis le fichier .env local.
|
||||||
import "dotenv/config";
|
import "dotenv/config";
|
||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
plugins: [hardhatToolboxMochaEthersPlugin],
|
plugins: [hardhatToolboxMochaEthersPlugin],
|
||||||
|
|
||||||
solidity: {
|
solidity: {
|
||||||
|
// Deux profils : dev (default) et production (optimizer activé — proche du deploy Ignition).
|
||||||
profiles: {
|
profiles: {
|
||||||
default: {
|
default: {
|
||||||
version: "0.8.34",
|
version: "0.8.34",
|
||||||
@@ -20,7 +34,9 @@ export default defineConfig({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
networks: {
|
networks: {
|
||||||
|
// Chaînes simulées locales (template Hardhat 3 — utiles pour tests génériques).
|
||||||
hardhatMainnet: {
|
hardhatMainnet: {
|
||||||
type: "edr-simulated",
|
type: "edr-simulated",
|
||||||
chainType: "l1",
|
chainType: "l1",
|
||||||
@@ -29,6 +45,9 @@ export default defineConfig({
|
|||||||
type: "edr-simulated",
|
type: "edr-simulated",
|
||||||
chainType: "op",
|
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: {
|
bscTestnet: {
|
||||||
type: "http",
|
type: "http",
|
||||||
chainType: "l1",
|
chainType: "l1",
|
||||||
|
|||||||
@@ -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";
|
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) => {
|
export default buildModule("FGC42ForgeModule", (m) => {
|
||||||
const token = m.contract("FGC42Forge");
|
const token = m.contract("FGC42Forge");
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
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;
|
const INITIAL_SUPPLY = 1_000_000n * 10n ** 18n;
|
||||||
|
|
||||||
describe("FGC42Forge", function () {
|
describe("FGC42Forge", function () {
|
||||||
@@ -10,9 +16,12 @@ describe("FGC42Forge", function () {
|
|||||||
const [deployer] = await ethers.getSigners();
|
const [deployer] = await ethers.getSigners();
|
||||||
const token = await ethers.deployContract("FGC42Forge");
|
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.name()).to.equal("FGC42Forge");
|
||||||
expect(await token.symbol()).to.equal("FG42");
|
expect(await token.symbol()).to.equal("FG42");
|
||||||
expect(await token.decimals()).to.equal(18n);
|
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.totalSupply()).to.equal(INITIAL_SUPPLY);
|
||||||
expect(await token.balanceOf(deployer.address)).to.equal(INITIAL_SUPPLY);
|
expect(await token.balanceOf(deployer.address)).to.equal(INITIAL_SUPPLY);
|
||||||
expect(await token.owner()).to.equal(deployer.address);
|
expect(await token.owner()).to.equal(deployer.address);
|
||||||
@@ -27,9 +36,10 @@ describe("FGC42Forge", function () {
|
|||||||
.to.emit(token, "Transfer")
|
.to.emit(token, "Transfer")
|
||||||
.withArgs(deployer.address, recipient.address, amount);
|
.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(recipient.address)).to.equal(amount);
|
||||||
expect(await token.balanceOf(deployer.address)).to.equal(
|
expect(await token.balanceOf(deployer.address)).to.equal(
|
||||||
INITIAL_SUPPLY - amount,
|
INITIAL_SUPPLY - amount,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
# Déploiement — FGC42Forge (BSC Testnet)
|
# 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
|
## Prérequis
|
||||||
|
|
||||||
|
|||||||
@@ -112,7 +112,8 @@ Le compte qui a **déployé** le contrat détient initialement **1 000 000 FG42*
|
|||||||
| **Owner** | Le contrat utilise **OpenZeppelin `Ownable`** : une adresse `owner()` (le déployeur au lancement) peut gérer le rôle admin (ex. `transferOwnership`), mais **sans** pouvoir mint des FG42 supplémentaires via ce contrat. |
|
| **Owner** | Le contrat utilise **OpenZeppelin `Ownable`** : une adresse `owner()` (le déployeur au lancement) peut gérer le rôle admin (ex. `transferOwnership`), mais **sans** pouvoir mint des FG42 supplémentaires via ce contrat. |
|
||||||
| **Clés privées** | Ne jamais partager seed phrase ni clé privée ; ne pas les committer dans Git. |
|
| **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).
|
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).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user