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

@@ -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,9 +36,10 @@ 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

@@ -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. |
| **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).
---