# Plutus.V1.Ledger.Examples

### Table des matières

1. 📜 Overview
2. 🔧 LANGUAGE PRAGMAS AND IMPORTS
3. ⚙️ Example Scripts
   * ✅ alwaysSucceedingNAryFunction
   * ❌ alwaysFailingNAryFunction
   * ➕ summingFunction
   * 🧂 saltFunction
4. 📚 Glossary

***

### 1 📜 Overview

Le module `Plutus.V1.Ledger.Examples` fournit des scripts Plutus Core faits main pour le test :

* Scripts n-aires qui réussissent toujours ou échouent toujours, paramétrés par le nombre d’arguments lambda.
* Un script simple d’addition.
* Un wrapper de "salage" (salt) pour changer le hash d’un script sans modifier son comportement.

Ces fonctions produisent des valeurs `SerializedScript` adaptées pour des exercices ou des tests de régression, et ne doivent **jamais** être utilisées en production.

***

### 2 🔧 LANGUAGE PRAGMAS AND IMPORTS

Pragmas :

* `TypeApplications` : pour les constantes littérales dans `summingFunction`.
* `StrictData` : évite toute paresse inattendue dans les données (peu utilisé ici).

Imports pour la sérialisation CBOR, la conversion des bytes, les nombres naturels et Plutus Core.

***

### 3 ⚙️ Example Scripts

#### 3.1 ✅ alwaysSucceedingNAryFunction

Entrées : arité `n :: Natural`.

Traitement : construit une chaîne de n lambdas dont le corps retourne toujours son premier paramètre, garantissant le succès.

Sortie : un script sérialisé qui réussit toujours lorsqu’il est appliqué à n arguments.

Exemple :

```haskell
let script1 = alwaysSucceedingNAryFunction 3
-- script1 attend 3 arguments ; retourne toujours le premier.
```

***

#### 3.2 ❌ alwaysFailingNAryFunction

Entrées : arité `n :: Natural`.

Traitement : construit une chaîne de n lambdas dont le corps termine sur une erreur, échouant systématiquement.

Sortie : script sérialisé qui échoue quel que soit l’argument.

Exemple :

```haskell
let scriptFail = alwaysFailingNAryFunction 1
-- scriptFail x == Error
```

***

#### 3.3 ➕ summingFunction

Entrées : aucune.

Traitement : applique la fonction intégrée `AddInteger` aux constantes 1 et 2.

Sortie : script sérialisé qui calcule 1 + 2.

Exemple :

```haskell
-- Lors de l’exécution, ce script retourne l’entier 3.
```

***

#### 3.4 🧂 saltFunction

Entrées : `salt :: Integer` et un script existant `b0`.

Traitement : désérialise `b0`, l’entoure d’un nouveau lambda acceptant le salt, puis l’applique à la constante salt — le comportement ne change pas mais le hash du script on-chain est différent.

Sortie : nouveau script sérialisé avec un hash on-chain différent mais une logique identique.

Exemple :

```haskell
let salted = saltFunction 42 summingFunction
-- `salted` agit comme `summingFunction`, mais avec un hash de script différent.
```

***

### 4 📚 Glossary

* **SerializedScript :** un `ShortByteString` représentant un programme Plutus Core.
* **DeBruijn index :** représentation de variable sans nom, par profondeur d’entier.
* **LamAbs :** abstraction lambda dans UPLC.
* **Error :** échec d’exécution à l’exécution dans UPLC.
* **Builtin :** fonctions intégrées de Plutus Core (ex : AddInteger).
* **Script hash :** hash calculé du script, utilisé pour la référence on-chain.
* **Salt :** argument additionnel pour modifier le hash d’un script sans changer la logique.
