Atomic Betting

septembre 2024 → août 2025

Code source

Atomic Betting permet à un groupe d'amis ou de collègues de parier entre eux sur à peu près n'importe quoi : un résultat sportif, l'issue d'un pari de bureau, une question ouverte. En monnaie fictive uniquement, c'est un jeu social, pas une plateforme de jeu d'argent.

L'idée est née d'une blague en cours : on se disait que ce serait drôle de parier sur qui allait arriver en retard. Je me suis dit autant le construire pour de vrai, pour expérimenter et apprendre. C'est mon premier projet avec une vraie modélisation de données et une authentification complète.

La modélisation, vraie difficulté du projet

C'est mon premier projet où le schéma de données a demandé plus de réflexion que l'interface. Il s'articule autour de quelques notions :

  • les équipes, avec des adhésions portant un rôle et un statut : un membre peut être en attente, actif, gestionnaire ou administrateur,
  • les paris, pour l'instant sous forme de questions à options, avec un type prévu pour être étendu plus tard,
  • les options, pour les paris qui ne sont pas de simples oui/non,
  • les transactions, qui tracent chaque mouvement de monnaie fictive.

Le point que je n'avais pas anticipé, et qui a demandé une reprise : un pari à choix multiples et un pari binaire ne se modélisent pas pareil, mais doivent se comporter pareil du point de vue du solde. La séparation entre le pari, ses options et les mises a mis du temps à se stabiliser.

Les cotes, un pari mutuel

Le point technique dont je suis le plus content. Les cotes ne sont pas fixées à l'avance : elles émergent de ce que les gens misent. La cote d'une option, c'est l'inverse de sa part dans le total des mises. Plus une option est misée, plus sa cote baisse, et inversement.

Sur un pari où cent jetons ont été misés au total :

Option Mises Part Cote Reçu pour 10 misés
A 60 60 % 1,67 16
B 30 30 % 3,33 33
C 10 10 % 10,0 100

Miser sur l'option que personne ne croit rapporte gros ; suivre la foule rapporte peu. À la clôture, un administrateur ou un gestionnaire désigne la bonne réponse, les cotes finales sont figées à partir de la répartition définitive des mises, et chaque gagnant reçoit sa mise multipliée par la cote, arrondie à l'entier inférieur.

C'est le seul module que j'ai couvert par des tests, avec Vitest, et ce n'est pas un hasard : c'est le cœur mathématique de l'application, celui où une erreur se voit immédiatement sur le solde des gens.

Le solde : stocké, mais tenu par un journal

Chaque adhésion porte son solde de jetons, et je le lis directement quand j'affiche une page. Un solde stocké se lit vite, sans recalcul.

Le risque d'un solde stocké, c'est qu'il diverge de l'historique : une opération interrompue au mauvais moment, et le chiffre affiché ne correspond plus à la somme réelle des mouvements. Je m'en protège par l'atomicité. Placer un pari écrit deux choses d'un seul bloc : une transaction dans le journal, et la décrémentation du solde. Les deux réussissent ou échouent ensemble, jamais l'une sans l'autre.

Le journal des transactions, lui, garde la trace de tout : les mises, les gains, les récompenses. Le solde est le chiffre qu'on lit, le journal est la mémoire qui permet de tout reconstituer et de comprendre comment on en est arrivé là.

L'authentification et les rôles

Pas de mot de passe à gérer : la connexion passe par trois fournisseurs OAuth, GitHub, Discord et Google, avec les sessions stockées en base, via Auth.js et son adapter Prisma.

Une équipe se rejoint par un lien d'invitation, et l'adhésion attend l'approbation d'un responsable avant de devenir active. À l'intérieur, trois rôles : membre, gestionnaire, administrateur. Les actions sensibles, créer un pari ou en désigner le gagnant, vérifient le rôle côté serveur avant de s'exécuter, pas seulement en cachant un bouton dans l'interface.

La récompense quotidienne

Pour donner une raison de revenir, chaque membre peut réclamer une récompense quotidienne, et une série de jours consécutifs rapporte un bonus. Le montant de base et celui de la série se règlent par équipe. La réclamation lâche une pluie de confettis, un détail gratuit mais qui fait sourire, et c'est un peu le but.

Les pages autour de l'application

Un an de développement par intermittence a laissé le temps de faire les pages qu'on saute souvent : une page d'accueil, une présentation des fonctionnalités, une FAQ, un parcours de bienvenue, les pages de confidentialité et de conditions. Sans elles, un nouvel arrivant tombe directement sur un écran de connexion sans savoir de quoi il s'agit.

Ce que le projet représente pour moi

C'est le projet charnière. Avant lui, j'écrivais des scripts et des interfaces ; c'est le premier où j'ai dû réfléchir à la cohérence d'un état partagé entre plusieurs utilisateurs, à ce qui se passe quand deux personnes agissent en même temps, et à comment garantir qu'un chiffre affiché est vrai.

Technologies utilisées