# 2 - Jeu de prédiction sur Alephium

Cet article est la deuxième partie de "Construire sur Alephium". Pour retrouver l'article précédent qui explique le fonctionnement de la dApp et le contrat principal `PredictALPH`, rendez-vous ici : [https://blog.notrustverify.ch/1-jeu-de-prediction-sur-alephium](https://blog.notrustverify.ch/1-jeu-de-prediction-sur-alephium)

Pour tester l'application: [ALPH.bet](https://alph.bet)

Un rappel de ce qu'est [Alephium](https://alephium.org)

*Alephium est la première blockchain shardée de couche 1 extensible qui améliore les concepts de Proof of Work & UTXO. La décentralisation, l'auto-souveraineté et la sécurité rencontrent l'efficacité énergétique dans un réseau adapté aux développeurs optimisé pour les applications DeFi et les contrats intelligents.*

Dans cet article, le contrat `Round` sera à l'honneur. C'est lui qui va stocker les paris, les ALPH, le nombre de participants, les gains à la fin d'un tour, etc.

# Contrat Round.ral

Pour chaque nouveau round, un nouveau contrat est créé, et `Round.ral` est utilisé comme modèle pour cela. Voilà comment est initialisé un nouveau contrat et round dans `PredictALPH.ral`.

Le code complet se trouve sur [Github](https://github.com/notrustverify/predictalph-contracts/blob/fd94d87b7f7fa7555d70b4bead8a9330713daf31/contracts/round.ral)

Les lignes 5 à 7 vont encoder les états, les transformer en ByteVec afin de pouvoir les utiliser dans `CopyCreateSubContract!`. La première partie, de `selfContract!` à operator, représente des valeurs immuables, c'est-à-dire qu'elles ne pourront plus changer après la création.

Et le nouveau round est donc créé à la ligne 9 avec les variables créées précédemment.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1705654812345/8002315a-258e-4443-a356-6b07e560dbf9.png align="center")

[Github](https://github.com/notrustverify/predictalph-contracts/blob/fd94d87b7f7fa7555d70b4bead8a9330713daf31/contracts/predict.ral#L87)

## Etats

Le premier état, `prediction`, contient l'adresse du contrat `PredictALPH`. Cela permet d'autoriser uniquement les appels provenant de ce contrat et pas d'un autre. Ainsi, il n'est pas possible d'appeler `Round` directement.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1705655457593/3d260e67-4821-4ebc-a464-e4ac0fd075a6.png align="center")

[Github](https://github.com/notrustverify/predictalph-contracts/blob/fd94d87b7f7fa7555d70b4bead8a9330713daf31/contracts/round.ral#L1-L19)

## Fonctions

Cette série de fonctions est utile pour récupérer les informations sur différents états, comme par exemple lorsque le round se termine ou encore le montant total des frais récoltés.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1705657269852/d02045f1-2326-4993-bbff-edb5321be43a.png align="center")

[Github](https://github.com/notrustverify/predictalph-contracts/blob/fd94d87b7f7fa7555d70b4bead8a9330713daf31/contracts/round.ral#L31-L46)

Cette fonction est celle qui se charge de mettre à jour le nombre de ALPH pariés dans le round et de transférer les ALPH du parieur-euse-s dans le contrat du round.

La ligne 3, `checkCaller`, permet de valider que l'appel provient uniquement du contrat intelligent `PredictALPH`.

La variable `totalAmount` (l. 6) permet d'optimiser les coûts du contrat intelligent. Bien que la fonction `tokenRemaining!` puisse être utilisée, elle demande plus de [gas](https://docs.alephium.org/glossary/#gas-price). Ainsi, le montant total du contrat est stocké dans `totalAmount` pour le rendre plus efficient.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1705738725174/eea51090-dc42-4949-a489-98e1d9382d57.png align="center")

[Github](https://github.com/notrustverify/predictalph-contracts/blob/fd94d87b7f7fa7555d70b4bead8a9330713daf31/contracts/round.ral#L49-L65)

La fonction `calculateRewards` va calculer l'issue d'un round et les gains associés.

La variable `rewardBaseCalAmount` est utilisée pour stocker le montant total de celles et ceux qui ont parié correctement et calculer combien une personne a gagné au moment de la réclamation de ses gains.

`treasuryAmount` contient le montant total des frais pris par le contrat, actuellement 1% (en points de base 100).

Pour terminer, `rewardAmount` est le montant effectif qui sera partagé entre tous les gagnant-e-s.

Dans le cas où le prix final est le même que le prix du début, c'est la "maison qui gagne".

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1705739613778/3ce3a480-34e5-422f-a005-123ed32d87a9.png align="center")

[Github  
](https://github.com/notrustverify/predictalph-contracts/blob/fd94d87b7f7fa7555d70b4bead8a9330713daf31/contracts/round.ral#L67-L90)

Fonction qui permet simplement de "booster" un round, c'est-à-dire ajouter des ALPH pour le côté qui gagne. Cela permet d'encourager les gens à jouer, par exemple.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1705742461924/40cfce78-59a5-4feb-9c16-e137133165a1.png align="center")

[Github](https://github.com/notrustverify/predictalph-contracts/blob/fd94d87b7f7fa7555d70b4bead8a9330713daf31/contracts/round.ral#L94-L103)

Cette fonction permet de détruire un contrat intelligent sur Alephium et donc de libérer de l'espace sur la chaîne. Elle est appelée depuis `PredictALPH.ral` et ne peut être exécutée complètement, donc détruire le contrat uniquement si tous les joueur-euse-s ont réclamé leurs gains (l. 4).

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1705753100601/8335994f-8011-4008-9fcc-42d86c59006b.png align="center")

[Github](https://github.com/notrustverify/predictalph-contracts/blob/fd94d87b7f7fa7555d70b4bead8a9330713daf31/contracts/round.ral#L105-L111)

La dernière fonction est userClaimRewards qui permet aux participant-e-s de récupérer leur gain. La ligne 10 calcule le nombre de ALPH gagné :

$$(amountBid * rewardAmount) / rewardBaseCalAmount$$

* `amountBid` : nombre de ALPH parié par un participant-e-s
    
* `rewardAmount` : somme totale jouée (moins les frais)
    
* `rewardBaseCalAmount` : nombre total de ALPH pariés pour le côté
    

Si une personne parie 100 ALPH sur "Up", que le montant total des paris est de 1500 ALPH, avec 900 ALPH pour "Up", et que l'issue finale est correcte, alors le calcul des gains serait le suivant :

$$\frac{{100 \times (1500 - (1500*(100/10000))}}{{900}}$$

* `amountBid`: 100 ALPH
    
* `rewardAmount` : 1500 - 1% = 1485 ALPH
    
* `rewardBaseCalAmount` : 900 ALPH
    

Donc, la personne gagnerait un total de 165 ALPH, ce qui représente un gain net de 65 ALPH par rapport à sa mise initiale.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1705755590134/e9f3851d-6620-40f4-ab75-136b3a45f0f1.png align="center")

[Github](https://github.com/notrustverify/predictalph-contracts/blob/fd94d87b7f7fa7555d70b4bead8a9330713daf31/contracts/round.ral#L113-L129)

Cet article termine la deuxième partie sur [ALPH.bet](https://alph.bet). Le contrat `Round` est utilisé pour calculer les gains, contient les ALPH joués et les redistribue.

La troisième et dernière partie va se concentrer sur le contrat `Punter` qui permet de conserver les informations d'une personne participant à un round, ainsi que sur les [TxScript](https://docs.alephium.org/ralph/getting-started/#txscript), qui sont une particularité d'[Alephium](https://Alephium.org).

Pour relire le premier article de la série : [https://blog.notrustverify.ch/1-jeu-de-prediction-sur-alephium](https://blog.notrustverify.ch/1-jeu-de-prediction-sur-alephium)

---

%%[footer-french]
