Le contrat : comment et pourquoi cela fonctionne
Tous les fonds et toutes les règles de FAIRDRUM se trouvent dans un seul programme du réseau Solana — un contrat intelligent. Le site ne fait que lui envoyer des commandes et afficher la réponse. Ci-dessous : ce que le contrat conserve, les commandes qu'il comprend, comment le nombre aléatoire devient un résultat, et ce que l'administrateur peut et ne peut pas faire.
Ce qu'est le contrat et où il se trouve
Un contrat intelligent est un programme exécuté par les nœuds du réseau Solana, et non sur le serveur du projet. Son code est le même pour tous, et chaque action est une transaction publique. Le contrat FAIRDRUM est écrit en Rust avec la bibliothèque Anchor ; son code source est ouvert.
L'adresse du programme apparaîtra ici lorsque le site sera connecté au contrat.
Conséquence importante : si le site fairdrum.to disparaît, les fonds des joueurs resteront dans le contrat et pourront être retirés avec n'importe quel programme capable d'envoyer la commande de retrait signée par votre portefeuille.
Ce que le contrat conserve
- Le coffre. Un seul compte en SOL enveloppé (wrapped SOL), dont seul le programme lui-même dispose. Tout s'y trouve : les soldes des joueurs, la banque des gains, les jackpots, la réserve et la part de l'administrateur pas encore prélevée.
- Le compte commun du jeu. Un enregistrement de la façon dont le montant du coffre est réparti : banque des gains, jackpot, mini-jackpot, super jackpot, réserve d'amorçage, part de l'administrateur, montants de départ des jackpots, compteurs de manches par jeu.
- Le compte du joueur. Il est créé par la commande register, que le site envoie avec la première recharge, et rattaché à l'adresse du portefeuille : solde de jeu, heure de la dernière recharge, manche inachevée, part de jackpot non encore versée.
- Le compte de session (si le « jeu sans signatures » est activé) : une clé temporaire, une durée et une limite de mises.
La comptabilité est construite de sorte que la somme de tous les soldes et cagnottes soit égale au montant du coffre. Un test vérifie cette égalité après chacune de dizaines de milliers d'opérations aléatoires.
Les commandes que le contrat comprend
| Commande | Qui peut l'appeler | Ce qu'elle fait |
|---|---|---|
register | joueur | Crée le compte du joueur. Le site l'envoie avec la première recharge. |
deposit | joueur | Recharge du solde de jeu. Enregistre l'heure : c'est à partir d'elle que courent les 12 heures avant le retrait. |
withdraw | joueur | Retrait vers son propre portefeuille. Refusé tant que 12 heures ne se sont pas écoulées depuis la dernière recharge. |
spin_commit | le joueur ou sa clé de session | Mise : débite la manche du solde, enregistre le jeu et les chances en vigueur, demande un nombre aléatoire à l'oracle. |
spin_settle | n'importe qui | Règlement : lit le nombre de l'oracle, calcule le gain et le crédite au joueur. N'importe qui peut l'appeler — le résultat n'en dépend pas. |
spin_expire | n'importe qui | Clôt une manche qui n'a pas été réglée en 20 minutes. Si l'oracle n'a pas répondu, la mise est restituée en totalité au joueur. Si l'oracle a répondu et que la manche est scellée, elle paie les gains ordinaires sans tirage des jackpots. |
spin_seal | n'importe qui | Scelle la manche : enregistre le hash du bloc de la mise tant qu'il est disponible (environ 3,5 minutes). Elle n'est nécessaire que si l'oracle met plus de temps à répondre ; en général, c'est le service gardien qui l'appelle. Une manche qui n'a été ni réglée ni scellée à temps est close sans résultat. |
skip_nonce | joueur | Décale le numéro de la prochaine demande d'aléa si l'adresse de la demande se révèle déjà occupée. |
session_open / session_close | joueur | Autorise une clé temporaire à miser dans la limite d'une durée et d'un plafond ; la clé ne peut ni retirer ni recharger. |
donate | n'importe qui | Verse des SOL dans la réserve d'amorçage des jackpots. Il n'existe pas de commande inverse. |
set_jackpot_starts | administrateur | Fixe de nouveaux montants de départ pour le jackpot et le super jackpot ; ils entrent en vigueur au bout de 24 heures. |
rescale_pools | administrateur | Transfère une partie de la réserve d'amorçage vers la banque des gains des jeux. Uniquement dans ce sens ; on ne peut pas transférer vers les jackpots : ils se réalimentent d'eux-mêmes depuis la réserve, après un gain. |
set_paused | administrateur | Suspend ou reprend l'acceptation de nouvelles mises — en cas de défaillance de l'oracle. Les mises déjà placées sont réglées, les paiements et le retrait fonctionnent comme d'habitude. |
set_guardian / guard_pause | administrateur | L'administrateur désigne une sentinelle — une clé du service gardien qui ne peut faire qu'une seule chose : suspendre l'acceptation de nouvelles mises si l'oracle a cessé de répondre. Seul l'administrateur peut lever la pause. |
propose_dev_authority / accept_dev_authority | administrateur | Transfert des droits d'administrateur à une autre clé en deux étapes : la clé actuelle désigne la nouvelle, et la nouvelle confirme elle-même. |
roll_epoch / checkin | n'importe qui | Commandes de service : elles mettent à jour les statistiques hebdomadaires et le repère du jour. Elles ne déplacent pas de fonds. |
claim_dev | administrateur | Prélève la part accumulée de l'administrateur — et elle seule. |
initialize / fund_pools | administrateur | Lancement unique. initialize crée les comptes (signée par le détenteur de l'autorité de mise à jour du programme) ; fund_pools inscrit une seule fois la banque de départ apportée, répartie entre les cagnottes, et l'excédent au-delà de celle-ci sur une ligne distincte, que l'administrateur peut prélever avec la commande promo_pay. |
Le code ne contient aucune commande qui transférerait à l'administrateur la banque des gains, les jackpots ou les soldes des joueurs.
La manche pas à pas
- Mise. La commande spin_commit débite la manche de votre solde et, dans la même transaction, crée auprès de l'oracle ORAO une demande de nombre aléatoire. L'adresse de la demande est calculée à partir de votre portefeuille et du numéro de la manche : il est donc impossible d'y substituer la demande de quelqu'un d'autre.
- Nombre. Plusieurs nœuds ORAO indépendants signent le nombre aléatoire et l'inscrivent sur le réseau. Avant cette inscription, personne ne le connaît : ni vous, ni le projet, ni un nœud isolé.
- Règlement. La commande spin_settle lit le nombre dans l'enregistrement de l'oracle, vérifie qu'il s'agit bien de la demande de votre manche et calcule le gain. Le site l'envoie lui-même ; si la page est fermée, c'est le programme de permanence du projet qui s'en charge, ou vous lors de votre prochaine visite.
- Affichage. Cartes, mines, fusée, pierres : ce sont des façons de montrer un gain déjà calculé. Vos clics dans le jeu n'ont aucun effet sur lui.
Pourquoi le résultat ne peut être ni connu à l'avance ni falsifié. Le nombre final de la manche est le nombre de l'oracle mélangé au hash du bloc dans lequel la mise est enregistrée. Au moment de la mise, ce hash n'existe pas encore, et le nombre de l'oracle arrive plus tard et d'un tiers : personne ne peut calculer l'issue à l'avance — ni le joueur, ni le projet, ni l'oracle lui-même. Le jeu, les montants de départ des jackpots et le plafond de gain sont enregistrés au moment de la mise, et la formule de calcul figure dans un code ouvert. Un règlement tardif n'est jamais plus avantageux qu'un règlement fait à temps. Les règles ne peuvent être modifiées qu'en remplaçant le code du programme, ce qui est visible de tous (voir la section sur l'administrateur).
Comment un nombre aléatoire devient un résultat
Une manche, c'est de 1 à 100 mises de 0,01 SOL (jusqu'à 1000 sur la roue). Le nombre de l'oracle est déployé en une valeur aléatoire indépendante pour chaque mise, et pour chacune le contrat répond dans l'ordre aux questions suivantes :
- Super jackpot, jackpot, mini-jackpot ? La chance de chaque cagnotte est égale à la contribution de la mise à cette cagnotte, divisée par son montant de départ. Une cagnotte n'est mise en jeu que lorsqu'elle contient au moins 25 % de son montant de départ.
- Un gain du jeu ? Chaque jeu a sa propre chance de gain et sa propre table de six paliers pondérés. Par exemple, sur la roue, un gain tombe dans 10 % des mises. Les tables de tous les jeux sont affichées sur leurs pages.
- « Rejouer » ? Avec une chance de 11,6 %, la mise est rejouée gratuitement aux frais de la banque des gains.
- Sinon, la mise est sans gain. Elle est répartie comme n'importe quelle autre : banque des gains, jackpots et part de l'administrateur.
Les tables des jeux diffèrent, mais le gain attendu est le même pour toutes (à quelques centièmes de point de pourcentage près ; avec une banque des gains d'au moins 40 SOL, quand les gains ne butent pas sur le plafond) : environ 77,5 % de la mise en gains ordinaires et, avec les relances « Rejouer », environ 88 % des mises payées. Cette égalité est vérifiée par le compilateur : si l'espérance d'un jeu se révèle supérieure à celle de la roue, ou inférieure de plus d'un demi-point de pourcentage, le programme ne compile pas.
Où le contrat place chaque mise
| Destination | Part de la mise payée | À quoi cela sert |
|---|---|---|
| Banque des gains | ≈88% | gains ordinaires de tous les jeux |
| Jackpot, mini-jackpot, super jackpot et amorçage | 2% | trois cagnottes communes |
| Administrateur | 10% | revenu du projet ; il n'y en a pas d'autre |
Dans le code, les parts sont exprimées par rapport à chaque mise exécutée, relances gratuites comprises ; c'est pourquoi on y lit 8,84 % et 1,77 % : rapporté aux mises payées, cela fait en moyenne 10 % et 2 %.
Les règles de limitation et leur raison d'être
- Un gain ne dépasse pas le quart de la banque des gains. Le contrat ne peut pas promettre plus qu'il n'a, et un seul gros gain ne vide pas la banque pour les autres. Ce qui n'est pas versé reste dans la banque.
- Retrait 12 heures après la dernière recharge. La règle est la même pour tous et inscrite sous forme de constante : seule une nouvelle version du programme peut la modifier.
- Les montants de départ des jackpots changent avec un délai de 24 heures. Les chances d'une manche sont figées au moment de la mise ; on ne peut donc pas les modifier « sur mesure pour une mise déjà faite ».
- 20 minutes pour le règlement. Si l'oracle n'a pas répondu, la mise est restituée en totalité au joueur : tant que le nombre n'existe pas, personne ne connaît l'issue, il est donc impossible d'échapper ainsi à une perte. S'il a répondu mais que le règlement a pris du retard, les gains ordinaires sont payés et les jackpots ne sont pas mis en jeu dans cette manche. Protection du coffre. Avant chaque paiement et après chaque règlement, le contrat vérifie que le coffre contient au moins ce qu'il doit aux joueurs et aux cagnottes ; sinon, l'opération est rejetée. Sentinelle. Si l'oracle a cessé de répondre, l'acceptation de nouvelles mises est suspendue automatiquement ; les règlements et le retrait continuent de fonctionner.
- Le jackpot est versé en plusieurs fois : le gagnant a droit à 95 % de la cagnotte, dont 20 % tout de suite puis 8 % par semaine. La part non encore versée est inscrite sur le compte du gagnant.
- Une seule manche inachevée par joueur. Tant que la manche n'est pas réglée, aucune nouvelle mise n'est acceptée.
Ce que l'administrateur peut et ne peut pas faire
Il peut
- prélever sa part — 10 % des mises payées ;
- verser des SOL dans la réserve et les transférer de la réserve vers la banque des gains ;
- prélever l'excédent qui s'est trouvé dans le coffre au lancement, au-delà de la banque de départ ;
- modifier les montants de départ des jackpots — avec un délai et dans des limites fixées ;
- suspendre l'acceptation de nouvelles mises si l'oracle ne répond pas, et transférer ses droits à une autre clé.
Il ne peut pas
- retirer la banque des gains, les jackpots, la réserve ou les soldes des joueurs (en tant que joueur, il gagne aux mêmes conditions que tout le monde) ;
- modifier les tables des gains, la chance de gain des jeux ni les parts de la mise : ce sont des constantes du code ;
- connaître le nombre aléatoire d'une manche avant la mise, ni le choisir ;
- arrêter le règlement des mises placées ou le retrait : la pause ne concerne que les nouvelles mises.
Une réserve honnête. Le programme a une autorité de mise à jour : tant qu'elle n'est pas révoquée, son détenteur peut remplacer le code par une nouvelle version, et tout ce qui précède s'appliquera alors au nouveau code. L'état de cette autorité et chaque mise à jour sont visibles dans un explorateur Solana. Il n'y a pas d'audit indépendant du contrat.
Ce qui a été testé, et comment
- Tests du contrat : part de l'administrateur de 10 % sur chaque jeu, retour très proche pour tous les jeux avec une banque de 50 SOL, règle du quart de la banque et plafond de gain au moment de la mise, verrou de retrait, changement différé des montants de départ, règlement tardif pas plus avantageux qu'un règlement à temps.
- Vérification de la conservation des fonds : des dizaines de milliers d'opérations aléatoires ; après chacune, le montant du coffre est comparé à la somme des soldes et des cagnottes.
- Longues simulations : deux millions de mises pour chaque jeu — combien a été versé aux joueurs, combien l'administrateur a reçu.
- De vraies transactions sur un nœud Solana local : recharge, retrait refusé avant l'échéance, versement dans la réserve, changement des montants de départ.
- Tests du site : le site calcule les chances avec les mêmes formules que le contrat et se compare à des échantillons enregistrés par le contrat.
Ce qui n'a été ni testé ni réalisé est énuméré sans fard sur la page « Pourquoi FAIRDRUM ». Comment vérifier vous-même n'importe quelle manche : sur la page « Vérifier une manche ».
Les paramètres du contrat en un tableau
- Mise unitaire
- 0,01 SOL
- Manche
- jusqu'à 100 mises dans les jeux, jusqu'à 1 000 sur la roue
- Jeux (modes)
- 16
- Chance de « Rejouer »
- 11,6%
- Plafond d'un gain
- 1/4 de la banque des gains
- Montant de départ minimal
- jackpot 0,2 SOL, super jackpot 2 SOL
- Mini-jackpot
- démarre à 1/10 du jackpot
- Au gagnant du jackpot
- 95% · 5 % vont au super jackpot
- Au gagnant du super jackpot
- 90%
- Verrou de retrait
- 12 heures après la dernière recharge
- Délai de règlement d'une manche
- 3 000 slots du réseau, environ 20 minutes
- Frais de réseau et d'oracle
- 0,005 SOL par manche, non prélevés par le projet