A la fin de ce notebook, vous saurez : 1. Installer et configurer Foundry (forge, cast, anvil) 2. Verifier l’installation de Solidity 3. Créer un premier projet Foundry 4. Compiler et tester un contrat simple
Prerequis
Python 3.10+ installe
curl ou PowerShell disponible
Git installe
Duree estimee : 30 minutes
1. Detection de l’environnement
# Detection de l'environnementimport sysimport platformimport subprocessfrom pathlib import PathOS_NAME = platform.system()PYTHON_VERSION = sys.version_infoprint(f"Systeme: {OS_NAME}")print(f"Python: {PYTHON_VERSION.major}.{PYTHON_VERSION.minor}.{PYTHON_VERSION.micro}")print(f"Repertoire de travail: {Path.cwd().name}")
Systeme: Windows
Python: 3.13.12
Repertoire de travail: 00-Foundations
Interprétation : Détection de l’environnement
Sortie obtenue : Affichage des informations système et Python.
Paramètre
Valeur
Signification
Système
Windows
OS hôte
Python
imprimée par la cellule — pré-requis : 3.10+
Version Python installée
Répertoire
imprimé par la cellule
Nom du répertoire de travail (basename), identique sur toutes les machines
Ni la version ni le nom du répertoire ne sont recopiés ici : la cellule les imprime, et sa sortie committée en est la source unique. Ce qui a une valeur pédagogique est le pré-requis3.10+ — il tient sur toutes les machines, là où la version installée change d’une machine à l’autre. Pour le répertoire, la cellule n’imprime que son basename (pathlib.Path.cwd().name) : le chemin absolu complet est un artefact de la machine hôte, sans valeur pédagogique, qui ne doit pas figurer dans les sorties committées (#9434).
Points clés : 1. Le pré-requis 3.10+ est satisfait : tous les outils de la série SmartContracts sont compatibles 2. Le basename du répertoire de travail suffit à situer le notebook dans la série ; aucun chemin absolu de la machine hôte n’est imprimé 3. La détection préalable évite les erreurs de compatibilité
Note technique : Si la version Python était < 3.10, certains packages (web3.py v7+) ne fonctionneraient pas.
2. Installation de Foundry
Foundry est une suite d’outils moderne pour le développement Ethereum.
Composants
Outil
Description
forge
Compilation, tests, deploiement
cast
Interactions avec les contrats
anvil
Noeud Ethereum local
Installation
# Windows (PowerShell)curl-L https://foundry.paradigm.xyz |bashfoundryup
# Verification de Foundrydef check_command(cmd):try: result = subprocess.run([cmd, '--version'], capture_output=True, text=True, timeout=10)if result.returncode ==0:returnTrue, result.stdout.strip()returnFalse, result.stderrexceptFileNotFoundError:returnFalse, "Non installe"exceptExceptionas e:returnFalse, str(e)print("Verification des outils Foundry...")print("="*50)for cmd in ['forge', 'cast', 'anvil']: ok, info = check_command(cmd) status ="OK"if ok else"MANQUANT"print(f"{cmd}: {status}")if ok:print(f" {info}")
Interprétation : Vérification de l’installation Foundry
Sortie obtenue : Les trois outils Foundry sont installés et fonctionnels.
Outil
Version
Statut
forge
imprimée par la cellule
OK
cast
imprimée par la cellule
OK
anvil
imprimée par la cellule
OK
Les versions ne sont pas recopiées ici : la sortie de la cellule en est la source unique, et elles changent d’une machine à l’autre (#9434).
Analyse des composants :
Composant
Rôle dans l’écosystème Foundry
forge
Gestion de projet, compilation, tests, déploiement
cast
Interactions avec la blockchain (lecture, écriture)
anvil
Nœud Ethereum local pour développement et tests
Points clés : 1. Les trois outils partagent la même version (visible dans la sortie) — cohérence garantie 2. Le build profile imprimé par la cellule indique le mode de compilation : dist = version de distribution (release), maxperf = build optimisé 3. Le commit SHA (visible dans la sortie) permet de reproduire exactement cette version si nécessaire
Note technique : Foundry est écrit en Rust, ce qui le rend beaucoup plus rapide que les outils basés sur JavaScript (comme Truffle ou Hardhat).
3. Solidity Compiler (solc)
Foundry inclut son propre compilateur Solidity.
# Verification de solc via forgeok, info = check_command('forge')if ok:print("Solidity est compile via forge build")print("Version Foundry:", info)else:print("Foundry non installe - solc non disponible")
Solidity est compile via forge build
Version Foundry: forge Version: 1.5.1-stable
Commit SHA: b0a9dd9ceda36f63e2326ce530c10e6916f4b8a2
Build Timestamp: 2025-12-22T11:40:33.870895500Z (1766403633)
Build Profile: maxperf
Interprétation : Vérification de Solidity via Foundry
Sortie obtenue : Foundry est installé et inclut le compilateur Solidity.
Composant
Valeur
Signification
Foundry
OK
La suite d’outils est disponible
Version
imprimée par la cellule
Version Foundry installée sur la machine
Points clés : 1. Foundry inclut son propre compilateur solc (pas besoin d’installation séparée) 2. La version Solidity est déterminée par le pragma dans les contrats (pragma solidity ^0.8.28) 3. Foundry gère automatiquement les dépendances via forge-std
Note technique : Contrairement aux anciens outils (Truffle, Hardhat) qui nécessitaient d’installer solc séparément, Foundry embarque tout le nécessaire. Cela simplifie considérablement le setup.
4. Premier projet Foundry
Creons un projet Foundry de demonstration.
# Creation d'un projet Foundry (demonstration)import tempfileimport os# Note: Cette cellule montre les commandes a executer# En pratique, executez ces commandes dans un terminalprint("Commandes pour creer un projet Foundry:")print("="*50)print("mkdir my-project && cd my-project")print("forge init")print("forge build")print("forge test")print("="*50)print("\nCes commandes creent:")print(" - src/ : Contrats Solidity")print(" - test/ : Tests Foundry")print(" - lib/ : Dependances (forge-std)")
Commandes pour creer un projet Foundry:
==================================================
mkdir my-project && cd my-project
forge init
forge build
forge test
==================================================
Ces commandes creent:
- src/ : Contrats Solidity
- test/ : Tests Foundry
- lib/ : Dependances (forge-std)
5. Premier contrat Solidity
Voici un contrat simple pour tester l’installation.
# Affichage du contrat Hello.solHELLO_CONTRACT ='''// SPDX-License-Identifier: MITpragma solidity ^0.8.28;contract Hello { string public message = "Hello, World!"; function setMessage(string memory _message) public { message = _message; } function getMessage() public view returns (string memory) { return message; }}'''print("Contrat Hello.sol:")print("="*50)print(HELLO_CONTRACT)
Contrat Hello.sol:
==================================================
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
contract Hello {
string public message = "Hello, World!";
function setMessage(string memory _message) public {
message = _message;
}
function getMessage() public view returns (string memory) {
return message;
}
}
Interprétation : Structure du contrat Hello.sol
Sortie obtenue : Affichage du code source d’un contrat Solidity simple.
Élément
Ligne
Description
SPDX-License-Identifier
1
Licence MIT (open source)
pragma solidity
2
Version du compilateur requise (0.8.28)
contract Hello
4
Déclaration du contrat
variable public
5
Variable d’état publique avec valeur initiale
setMessage()
7-9
Fonction pour modifier le message
getMessage()
11-13
Fonction pour lire le message
Analyse des patterns : - Variable publique : string public message crée automatiquement un getter - Fonction de modification : setMessage() permet de changer l’état - Fonction de lecture : getMessage() retourne la valeur (redondant avec le getter public)
Points clés : 1. Ce contrat illustre les bases de Solidity : variables, fonctions, visibilité 2. Le message est stocké dans le stockage du contrat (coûteux en gas) 3. En production, on utiliserait des events pour les changements d’état
Note technique : Le mot-clé public génère automatiquement une fonction getter. Donc message() (sans getMessage()) suffirait pour lire la valeur.
Structure du contrat
Élément
Description
pragma solidity
Version du compilateur
contract Hello
Nom du contrat
string public message
Variable d’etat publique
setMessage()
Fonction de modification
getMessage()
Fonction de lecture
6. Test Foundry
Les tests Foundry sont ecrits en Solidity.
# Affichage du test Hello.t.solTEST_CONTRACT ='''// SPDX-License-Identifier: MITpragma solidity ^0.8.28;import "forge-std/Test.sol";import "../src/Hello.sol";contract HelloTest is Test { Hello hello; function setUp() public { hello = new Hello(); } function testInitialMessage() public view { assertEq(hello.message(), "Hello, World!"); } function testSetMessage() public { hello.setMessage("Bonjour"); assertEq(hello.message(), "Bonjour"); }}'''print("Test Hello.t.sol:")print("="*50)print(TEST_CONTRACT)
Test Hello.t.sol:
==================================================
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
import "forge-std/Test.sol";
import "../src/Hello.sol";
contract HelloTest is Test {
Hello hello;
function setUp() public {
hello = new Hello();
}
function testInitialMessage() public view {
assertEq(hello.message(), "Hello, World!");
}
function testSetMessage() public {
hello.setMessage("Bonjour");
assertEq(hello.message(), "Bonjour");
}
}
Interprétation : Structure du test Hello.t.sol
Sortie obtenue : Affichage du code source d’un test Foundry.
Élément
Description
Import Test.sol
Bibliothèque de test Foundry (forge-std)
Import Hello.sol
Contrat à tester
setUp()
Initialisation avant chaque test
testInitialMessage()
Vérifie le message initial
testSetMessage()
Vérifie la modification du message
Patterns de test Foundry :
Pattern
Description
contract XTest is Test
Le contrat de test hérite de Test
setUp()
Exécuté avant chaque test (initialisation)
testXxx()
Les fonctions commençant par test sont exécutées
assertEq(a, b)
Assertion d’égalité (échoue si a != b)
Points clés : 1. Les tests Foundry sont écrits en Solidity (pas de JavaScript/TypeScript) 2. Le pattern setUp() + testXxx() est standard pour les tests unitaires 3. assertEq() est l’assertion la plus courante dans les tests Foundry
Note technique : Pour exécuter ces tests, utilisez forge test dans le terminal du projet Foundry. L’option -vvv permet d’afficher les traces détaillées en cas d’échec.
7. Resume de l’environnement
# Resumeprint("="*60)print("RESUME DE L'ENVIRONNEMENT SMART CONTRACTS")print("="*60)print(f"Systeme: {OS_NAME}")print(f"Python: {PYTHON_VERSION.major}.{PYTHON_VERSION.minor}.{PYTHON_VERSION.micro}")print("-"*60)forge_ok, _ = check_command('forge')print(f"Foundry: {'OK'if forge_ok else'MANQUANT (REQUIS)'}")print("="*60)if forge_ok:print("\nEnvironnement pret pour le developpement Smart Contracts.")else:print("\nInstallez Foundry: curl -L https://foundry.paradigm.xyz | bash && foundryup")
============================================================
RESUME DE L'ENVIRONNEMENT SMART CONTRACTS
============================================================
Systeme: Windows
Python: 3.13.12
------------------------------------------------------------
Foundry: OK
============================================================
Environnement pret pour le developpement Smart Contracts.
Interprétation : Résumé de l’environnement
Sortie obtenue : Résumé complet de l’environnement de développement Smart Contracts.
Composant
Statut
Détails
Système
Windows
OS compatible avec Foundry
Python
imprimé par la cellule
Pré-requis 3.10+ satisfait
Foundry
OK
Suite d’outils installée et fonctionnelle
État de préparation : - ✅ Outils Foundry disponibles (forge, cast, anvil) - ✅ Python compatible pour les outils web3.py - ✅ Environnement prêt pour le développement Smart Contracts
Prochaines étapes : 1. Installer VSCode et les extensions Solidity (recommandé) 2. Créer un premier projet avec forge init 3. Explorer les notebooks suivants de la série
Note technique : Si Foundry n’était pas installé, la commande d’installation Windows serait : curl -L https://foundry.paradigm.xyz | bash puis foundryup.
# Créez un nouveau répertoire et initialisez le projetmkdir mon-premier-projetcd mon-premier-projetforge init
Cette commande crée la structure de base avec src/, test/ et lib/.
Étape 2 - Implémentation du Counter
Variables d’état :
uint256 public count;
Fonction increment() : - Incrémente count de 1 - Pas de paramètres nécessaires - Utilisez count++ ou count += 1
Fonction decrement() : - Vérifie que count > 0 avant de décrémenter - Utilisez require(count > 0, "Cannot decrement below zero") - Décrémente ensuite
Fonction getCount() : - Retourne simplement count - Note : le mot-clé public génère déjà un getter automatique
Étape 3 - Tests
Structure du test :
contract CounterTest is Test {
Counter counter;
function setUp() public {
counter = new Counter();
}
function testIncrement() public {
counter.increment();
assertEq(counter.getCount(), 1);
}
function testDecrement() public {
counter.increment();
counter.increment();
counter.decrement();
assertEq(counter.getCount(), 1);
}
function testDecrementZero() public {
// Ce test doit vérifier que decrement() échoue si count == 0
// Indice : utilisez vm.expectRevert() avant l'appel
}
}
Étape 4 - Exécution
forge buildforge test -vvv
Note : Les fonctions public génèrent automatiquement des getters. counter.count() équivaut à counter.getCount().
Resume et perspectives
Ce notebook a guide l’installation et la verification de la suite Foundry (forge, cast, anvil), l’environnement de développement moderne pour les smart contracts Ethereum. Les trois composants couvrent l’ensemble du cycle de vie : forge pour la compilation, les tests et le deploiement des contrats Solidity ; cast pour les interactions avec la blockchain depuis la ligne de commande ; et anvil comme noeud Ethereum local fournissant 10 comptes pre-finances pour le développement et les tests. L’ecriture de tests en Solidity natif (plutot qu’en JavaScript) est l’un des avantages majeurs de Foundry par rapport aux alternatives comme Hardhat ou Truffle.
Le contrat Hello.sol et son test Hello.t.sol ont illustre les conventions fondamentales de Foundry : le pattern setUp() + testXxx() pour les tests unitaires, les assertions assertEq() pour la verification, et la structure de projet src/ / test/ / lib/. Le mot-cle public generant automatiquement un getter est un premier apercu de la magie Solidity qui sera detaillee dans les notebooks suivants. L’exercice du contrat Counter avec increment(), decrement() et vm.expectRevert() prepare aux patterns de test avance.
L’environnement etant operationnel, le notebook suivant SC-02-Setup-Web3py-Python complete la chaîne d’outils en ajoutant l’interaction Python avec Ethereum via web3.py, permettant de compiler, deployer et appeler des contrats Solidity entierement depuis un notebook Jupyter.