BlockLucky Documentation officielle GitHub

Accueil

BlockLucky est la loterie citoyenne de fin d'année de la Ville d'EtherBay. C'est un projet de l'Epitech Digital School (rush « BlockLucky, création d'un smart contract », promotion DIGI3), conçu comme un pilote pédagogique : les tickets s'achètent en ethers fictifs, sans aucune valeur monétaire, sur un vrai smart contract Solidity.

Cette documentation s'adresse aux développeurs de la Ville qui reprennent le code source et au jury de l'école. Elle décrit ce que fait réellement le code, la manière de le lancer, de le modifier et de l'exploiter, ainsi que ce qui reste simulé ou à faire.

Le projet en bref

Le cœur du projet est le contrat smart-contract/contracts/BlockLucky.sol. Il encaisse les tickets, ferme le tour quand il est complet ou quand sa durée est écoulée, demande un nombre aléatoire à Chainlink VRF v2.5, désigne le gagnant et lui réserve la cagnotte. Un second contrat, smart-contract/contracts/BlockLuckyPOAP.sol, frappe un badge de participation ERC-721 non transférable par participant et par tour.

Autour du contrat, le dépôt contient une plateforme complète :

  • un backend Express 5 en TypeScript (backend/src/app.ts) avec PostgreSQL, Redis, BullMQ et Socket.IO. Il crée pour chaque citoyen un portefeuille Ethereum intégré, chiffré en AES-256-GCM, lui verse une dotation de bienvenue en ethers fictifs, signe ses achats avec sa clé et projette les événements du contrat en base ;
  • un frontend web Next.js 16 avec trois espaces : citoyen, commerçant partenaire et dashboard de la Mairie, qui examine aussi les pièces d'identité envoyées pour la vérification d'âge ;
  • une application mobile Expo pour les citoyens, avec compte par mot de passe ou Google, vérification d'âge, salle d'attente et roue du tirage ;
  • un site vitrine statique de l'Office de Tourisme, livré en bonus ;
  • une blockchain locale en conteneur (nœud Hardhat, contrats déployés à des adresses fixes, oracle VRF simulé), une CI GitHub Actions et des scénarios de charge k6.

Les citoyens gagnent aussi des EtherPoints en participant (achat, cadeau, parrainage, quêtes). Ces points, tenus en base de données et non sur la chaîne, s'échangent contre des offres des commerçants partenaires.

Important

Le projet n'est pas encore en production. Aucun déploiement sur Sepolia n'a été réalisé et l'application n'est pas en ligne sur etherbay.tech. Tout fonctionne en local sur une blockchain Hardhat. La page Réel, simulé ou à venir fait l'inventaire exact.

flowchart LR
    C["Citoyen"] --> W["Web Next.js"]
    C --> M["Mobile Expo"]
    A["Mairie et partenaires"] --> W
    W --> B["Backend Express"]
    M --> B
    B --> P[("PostgreSQL")]
    B --> R[("Redis")]
    B --> K["Contrat BlockLucky"]
    B --> N["Contrat POAP"]
    K --> V["Chainlink VRF"]

Par où commencer

Le tableau suivant propose un parcours de lecture par profil. Chaque ligne liste les pages à lire dans l'ordre.

Profil Objectif Pages à lire
Nouveau développeur Comprendre le projet et le lancer en local Contexte, Prérequis, Infrastructure locale, Lancer les applications, Comptes de démonstration, Vue d'ensemble de l'architecture, Organisation du dépôt
Développeur backend Modifier l'API, la base ou les workers Structure et cycle d'une requête, Configuration, Modules métier, Référence de l'API, Modèle de données, Files et workers, Ajouter un endpoint
Développeur front web Faire évoluer les pages et les espaces Stack et structure, Pages et espaces, Authentification et routes protégées, État et appels API, Design system, Ajouter une page web
Développeur mobile Faire évoluer l'application Expo Stack et structure, Navigation et écrans, Tester sur un téléphone, Ajouter un écran mobile
Développeur smart contract Comprendre, tester et redéployer les contrats Vue d'ensemble des smart contracts, Contrat BlockLucky, Cycle de vie d'un tour, Sécurité du contrat, Tests, Intégration blockchain du backend, Modifier le contrat
Exploitation Déployer, surveiller, réagir Stack complète en conteneurs, Docker Compose, Environnements, Runbooks, Runbooks blockchain, Observabilité, Sauvegardes et reprise
Sécurité et conformité Vérifier les protections et le RGPD Modèle de menaces, Clés et garde des portefeuilles, RGPD, Crypto-actifs et MiCA, Registre des risques
Jury Évaluer la réponse au kickoff Contexte et kickoff, Besoins des parties prenantes, Objectifs et indicateurs, Réel, simulé ou à venir, Grille de compétences, Le projet en chiffres, Préparer la soutenance

Les questions les plus fréquentes

Question Réponse courte Page détaillée
Faut-il MetaMask ou acheter de la crypto ? Non. Le backend crée le portefeuille et la Mairie le dote en ethers fictifs. Portefeuilles intégrés
Qui choisit le gagnant ? Chainlink VRF. Ni la Mairie ni le backend ne peuvent influencer le tirage. Tirage Chainlink VRF
Que se passe-t-il si un tour est annulé ? Chaque mise est remboursable sur le contrat et le backend réclame le remboursement pour le citoyen. Annulation et remboursement
Comment se connecter en local ? Sur le web, par un code à 6 chiffres reçu dans Mailpit ; sur mobile, avec le mot de passe EtherBay2026demo des comptes de démonstration. Comptes de démonstration et connexion
La blockchain locale a redémarré, plus rien ne marche La chaîne a perdu son état : il faut réinitialiser la base. Dépannage
Qu'est-ce qui est encore fictif ? Notifications push, Sentry, libellé multi-signatures, paliers de la jauge, solde ETH en mode simulé, notamment.
Pourquoi l'achat répond-il 403 ? L'âge du compte n'est pas encore vérifié par la Mairie (AGE_VERIFICATION_REQUIRED). FAQ

Adresses locales utiles

Une fois l'environnement lancé comme décrit dans Lancer les applications :

Service Adresse
API et documentation Swagger http://localhost:2053/api/docs
Frontend web http://localhost:3000
Site de l'Office de Tourisme http://localhost:4000
Boîte mail de développement (Mailpit) http://localhost:8025
Nœud Hardhat (JSON-RPC, chain ID 31337) http://127.0.0.1:8545

Conventions de cette documentation

Les liens de la forme backend/src/app.ts ouvrent le fichier source sur GitHub. Certaines pages, comme la référence de l'API ou le dictionnaire de données, sont générées depuis le code à chaque construction du site. La page Comment lire cette documentation détaille l'organisation en 16 parties, les encadrés et la recherche.