Modifications du Code
=====================

Cette section explique en détail les ajouts et modifications spécifiques apportés au contrat de base pour répondre aux tâches du projet.

Partie 1 Tâche 1 : Initialiser le Bénéficiaire
----------------------------------------------

.. code-block:: solidity

    // Part 1 Task 1. Initialize beneficiary with address of smart contract’s owner
    // Hint: In the constructor, "msg.sender" is the address of the owner.
    // ** Start code here. 1 line approximately. **/
    beneficiary = msg.sender;
    // ** End code here. **/

**Explication :**

- **But** : Assigner l'adresse du déployeur du contrat (le propriétaire) à la variable `beneficiary`.
- **Détails** :
  - `msg.sender` représente l'adresse de l'entité qui déploie le contrat.
  - En définissant `beneficiary = msg.sender;`, nous nous assurons que le propriétaire est enregistré comme bénéficiaire, qui peut effectuer certaines actions restreintes dans le contrat.
  - Cela permet de mettre en place des contrôles d'accès pour des fonctions sensibles, comme la révélation des gagnants.

---

Partie 1 Tâche 2 : Initialiser les Articles aux Index 1 et 2
------------------------------------------------------------

.. code-block:: solidity

    // Part 1 Task 2. Initialize two items at index 1 and 2.
    // ** Start code here. 2 lines approximately. **/
    items[1] = Item({ itemId: 1, itemTokens: emptyArray });
    items[2] = Item({ itemId: 2, itemTokens: emptyArray });
    // ** End code here **/

**Explication :**

- **But** : Initialiser les articles aux indices 1 et 2 dans le tableau `items`.
- **Détails** :
  - Crée deux instances de `Item` avec `itemId` défini à 1 et 2, respectivement.
  - `emptyArray` est un tableau vide de `itemTokens`, indiquant qu'aucune enchère n'a encore été placée.
  - Cette étape complète l'initialisation des trois articles (indices 0, 1 et 2) pour l'enchère.

---

Partie 1 Tâche 3 : Initialiser l'Adresse de l'Enchérisseur
----------------------------------------------------------

.. code-block:: solidity

    // Part 1 Task 3. Initialize the address of the bidder
    /* Hint: Here the bidders[bidderCount].addr should be initialized with the address of the registrant. */
    // ** Start code here. 1 line approximately. **/
    bidders[bidderCount].addr = msg.sender;
    // ** End code here. **

**Explication :**

- **But** : Enregistrer l'adresse Ethereum de l'enchérisseur qui s'inscrit.
- **Détails** :
  - `bidders[bidderCount]` accède à la structure `Person` à l'index courant `bidderCount`.
  - `msg.sender` est l'adresse de l'enchérisseur appelant la fonction `register()`.
  - En assignant `msg.sender` à `bidders[bidderCount].addr`, nous lions l'identité de l'enchérisseur à son adresse Ethereum dans le contrat.

---

Partie 1 Tâche 4 : Implémenter les Conditions dans la Fonction `bid`
--------------------------------------------------------------------

.. code-block:: solidity

    /*
    Part 1 Task 4. Implement the three conditions below.
    4.1 If the number of tokens remaining with the bidder is less than the count of tokens bid, revert.
    4.2 If there are no tokens remaining with the bidder, revert.
    4.3 If the id of the item for which the bid is placed is greater than 2, revert.

    Hint: "tokenDetails[msg.sender].remainingTokens" gives the number of tokens remaining with the bidder.
    */

    // ** Start code here. 2 lines approximately. **/
    require(tokenDetails[msg.sender].remainingTokens >= _count, "Not enough tokens remaining");
    require(_itemId <= 2, "Invalid item id");
    // ** End code here. **

**Explication :**

- **But** : Assurer que les enchères sont valides en appliquant les conditions nécessaires avant de procéder.
- **Détails** :
  - **Condition 1 & 2** :
    - `require(tokenDetails[msg.sender].remainingTokens >= _count, "Not enough tokens remaining");`
    - Vérifie si l'enchérisseur a suffisamment de jetons pour placer l'enchère.
    - Si l'enchérisseur a zéro ou un nombre insuffisant de jetons, la transaction est annulée avec un message d'erreur.
  - **Condition 3** :
    - `require(_itemId <= 2, "Invalid item id");`
    - Assure que `_itemId` est dans la plage valide (0 à 2), correspondant aux articles initialisés.
- En appliquant ces conditions, le contrat empêche les enchères invalides et maintient l'intégrité des données.

---

Partie 1 Tâche 5 : Décrémenter les Jetons Restants et Mettre à Jour le Solde
----------------------------------------------------------------------------

.. code-block:: solidity

    /* Part 1 Task 5. Decrement the remainingTokens by the number of tokens bid and store the value in the balance variable.
    Hint: "tokenDetails[msg.sender].remainingTokens" should be decremented by "_count". */

    // ** Start code here. 1 line approximately. **
    uint balance = tokenDetails[msg.sender].remainingTokens - _count;
    // ** End code here. **

**Explication :**

- **But** : Mettre à jour le solde de jetons de l'enchérisseur après avoir placé une enchère.
- **Détails** :
  - Calcule le nouveau solde en soustrayant `_count` (le nombre de jetons misés) de `remainingTokens`.
  - Stocke le résultat dans la variable `balance` pour une utilisation ultérieure.
  - Cela garantit que le nombre de jetons de l'enchérisseur reflète avec précision les jetons qu'il lui reste pour les futures enchères.

---

Partie 1 Tâche 6 : Assigner les Gagnants
----------------------------------------

.. code-block:: solidity

    /* Part 1 Task 6. Assign the winners.
    Hint: "bidders[winnerId]" will give you the Person object with the winnerId.
    You need to assign the address of the person obtained above to winners[id]. */

    // ** Start coding here *** 1 line approximately.
    winners[id] = bidders[winnerId].addr;
    // ** end code here *

**Explication :**

- **But** : Enregistrer l'adresse du gagnant pour chaque article après la fin de l'enchère.
- **Détails** :
  - `winnerId` est l'identifiant de l'enchérisseur gagnant, obtenu à partir des `itemTokens` sélectionnés aléatoirement.
  - `bidders[winnerId].addr` récupère l'adresse Ethereum de l'enchérisseur gagnant.
  - En assignant cette adresse à `winners[id]`, nous stockons l'adresse du gagnant dans le tableau `winners` à l'index correspondant à l'article.
- Cette étape finalise l'enchère en liant chaque article à son gagnant.

---

Partie 2 Tâche 1 : Créer le Modificateur `onlyOwner`
----------------------------------------------------

.. code-block:: solidity

    // Part 2 Task 1. Create a modifier named "onlyOwner" to ensure that only the owner is allowed to reveal winners
    // Hint: Use require to validate if "msg.sender" is equal to the "beneficiary".
    modifier onlyOwner {
        // ** Start code here. 2 lines approximately. **
        require(msg.sender == beneficiary);
        _;
        // ** End code here. **
    }

**Explication :**

- **But** : Restreindre l'accès à certaines fonctions pour que seul le propriétaire du contrat (bénéficiaire) puisse les exécuter.
- **Détails** :
  - `modifier onlyOwner` définit un modificateur personnalisé qui peut être appliqué aux fonctions.
  - `require(msg.sender == beneficiary);` vérifie si l'appelant de la fonction est le bénéficiaire.
    - Si ce n'est pas le cas, la transaction est annulée, empêchant tout accès non autorisé.
  - Le `_`; indique où le corps de la fonction modifiée sera inséré.
  - Ce modificateur est appliqué à la fonction `revealWinners()` pour s'assurer que seul le propriétaire peut révéler les résultats de l'enchère.

**Utilisation du Modificateur `onlyOwner` :**

.. code-block:: solidity

    function revealWinners() public onlyOwner {
        // Implémentation de la fonction...
    }

- En ajoutant `onlyOwner` après la déclaration de la fonction, nous appliquons le contrôle d'accès défini dans le modificateur.

---

En intégrant ces modifications, le contrat assure une fonctionnalité complète et sécurisée pour la gestion de l'enchère.

