Skip to content

Commit fe4bfaf

Browse files
committed
i18n(french): sync Anchor Flash Loan challenge
1 parent 60b6138 commit fe4bfaf

File tree

49 files changed

+723
-239
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+723
-239
lines changed

src/app/content/challenges/anchor-escrow/fr/pages/make.mdx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,6 @@ Ici, nous ajoutons deux contrôles de validation. Un sur l'argument `amount` et
142142

143143
Certaines extensions de SPL Token-2022, par exemple les hooks de transfert, les transferts confidentiels, les états de compte par défaut, peuvent introduire des vulnérabilités telles que le blocage des transferts, le verrouillage des fonds et provoquer des rug pulls dans la logique des escrows, des vaults ou des CPIs.
144144

145-
146145
- Assurez-vous que `mint_a` et `mint_b` appartiennent au même programme de jetons afin d'éviter les échecs de CPI.
147146
- Utilisez des jetons correctement audités (par exemple, USDC, wSOL) issus du programme standard SPL-Token.
148147
- Évitez les mints de Token-2022 non vérifiées ou complexes.

src/app/content/challenges/anchor-flash-loan/fr/challenge.mdx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import { ArticleSection } from "../../../../components/ArticleSection/ArticleSec
22

33
# Prêt Flash avec Anchor
44

5+
![Anchor Flash Loan](/graphics/challenge-banners/anchor-flash-loan.png)
6+
57
L'introspection des instructions est une fonctionnalité puissante qui permet à un programme d'examiner et d'analyser d'autres instructions au sein de la même transactions. Cela inclut les instructions qui n'ont pas encore été exécutées, donnant à votre programme la possibilité de "regarder dans le futur" et de prendre des décisions basées sur ce qui se passera plus tard dans la transaction.
68

79
C'est un peu comme si vous aviez une vision à rayons X pour les transactions : votre programme peut voir l'ensemble de la transaction pour comprendre la séquence complète des opérations avant de décider de la marche à suivre.

src/app/content/challenges/anchor-flash-loan/fr/pages/borrow.mdx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ Vient maintenant la partie critique de la sécurité : l'utilisation de l'intros
4242

4343
Nous commençons par accéder au sysvar `instructions` qui contient les informations sur toutes les instructions de la transaction actuelle :
4444

45-
4645
```rust
4746
/*
4847
Instruction Introspection
@@ -56,6 +55,7 @@ let ixs = ctx.accounts.instructions.to_account_info();
5655

5756
Enfin, nous effectuons la vérification la plus critique : nous nous assurons que la dernière instruction de la transaction est une instruction de remboursement valide :
5857
- Nous commençons par vérifier le nombre d'instructions et nous nous assurons que nous chargeons la dernière instruction de la transaction
58+
- Ensuite, nous vérifions le nombre d'instructions et nous assurons que nous chargeons la dernière instruction de la transaction
5959
- TNous vérifions ensuite qu'il s'agit bien de l'instruction de remboursement en vérifiant l'ID du programme et le discriminateur de l'instruction
6060
- Nous terminons en vérifiant que les ATAs passés dans l'instruction de remboursement sont les mêmes que ceux que nous passons dans notre instruction `Borrow`
6161

@@ -66,6 +66,10 @@ Enfin, nous effectuons la vérification la plus critique : nous nous assurons qu
6666
Make sure that the last instruction of this transaction is a repay instruction
6767
*/
6868

69+
// Check if this is the first instruction in the transaction.
70+
let current_index = load_current_index_checked(&ctx.accounts.sysvar_instructions)?;
71+
require_eq!(current_index, 0, ProtocolError::InvalidIx);
72+
6973
// Check how many instruction we have in this transaction
7074
let instruction_sysvar = ixs.try_borrow_data()?;
7175
let len = u16::from_le_bytes(instruction_sysvar[0..2].try_into().unwrap());

src/app/content/challenges/anchor-flash-loan/fr/verify.mdx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,3 @@ Maintenant, mettez en pratique ce que vous avez appris. Créez un programme de p
1515
Votre programme doit vérifier le `borrowed_amount` à la fin de la transaction et rembourser le protocole avec le montant correct.
1616
</Requirement>
1717
</RequirementList>
18-

src/app/content/challenges/assembly-timeout/fr/challenge.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ call sol_get_clock_sysvar
7171
ldxdw r1, [r1+0x0000]
7272
```
7373

74-
L'appel système `sol_get_clock_sysvar` écrit les données actuelles de `Clock` dans `r1`.
74+
L'appel système `sol_get_clock_sysvar` écrit les données `Clock` actuelles à l'adresse mémoire spécifiée dans `r1`.
7575

7676
Comme la structure Clock fait 40 octets (trop grande pour les registres qui ne contiennent que 8 octets chacun), nous utilisons la pile pour un stockage rapide sans allocation avec nettoyage automatique.
7777

src/app/content/challenges/assembly-timeout/fr/verify.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Créez un programme qui n'a qu'une seule instruction. Il doit :
1212
- Utiliser les 8 premiers octets du compte `Clock` pour récupérer le slot actuel.
1313
- Vérifier si le slot actuel est supérieur au slot passé dans l'instruction. Si c'est le cas, renvoyer le code d'erreur 1.
1414

15-
> Pour obtenir le bon décalage des données d'instruction, vous pouvez utiliser notre [outil](https://sbpf.xyz). N'oubliez pas d'ajouter un compte et de définir sa longueur de données à 40 !
15+
> Pour obtenir le bon décalage des données d'instruction, vous pouvez utiliser notre [outil](https://sbpf.xyz). N'oubliez pas d'ajouter un compte et de définir sa longueur de données à 40 !
1616
1717
Commencez par installer le package sBPF comme expliqué dans la [section outillage](/en/courses/introduction-to-assembly/tooling) du cours Introduction à l'Assembly et compilez votre programme en utilisant la commande suivante dans votre terminal :
1818

src/app/content/challenges/pinocchio-amm/fr/challenge.mdx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import ArticleSection from "../../../../components/ArticleSection/ArticleSection";
2+
13
![Pinocchio Amm Challenge](/graphics/challenge-banners/pinocchio-amm.png)
24

35
# L'Amm
@@ -48,7 +50,7 @@ Au cœur de la plupart des AMM se trouve une formule simple mais puissante connu
4850

4951
### La formule
5052

51-
La formule AMM la plus courante est : `x * y = k` où :
53+
La formule AMM la plus courante est : `x * y = k` où :
5254
- `x` = quantité de jetons X dans la *pool*
5355
- `y` = quantité de jetons Y dans la *pool*
5456
- `k` = une constante (ne change jamais)
@@ -59,7 +61,7 @@ Chaque fois qu'une personne échange un jeton contre un autre, la *pool* ajuste
5961

6062
Supposons que la *pool* commence avec 100 jetons X et 100 jetons Y : `100 * 100 = 10,000`.
6163

62-
Si un utilisateur souhaite échanger 10 jetons X contre des jetons Y, la *pool* doit conserver `k = 10,000`. Donc, si `x_new` = 110 (après le dépôt), on résout `y_new`: `110 * y_new = 10,000` donc `y_new = 10,000 / 110 ≈ 90.91`.
64+
Si un utilisateur souhaite échanger 10 jetons X contre des jetons Y, la *pool* doit conserver `k = 10,000`. Donc, si `x_new` = 110 (après le dépôt), on résout `y_new`: `110 * y_new = 10,000` donc `y_new = 10,000 / 110 ≈ 90.91`.
6365

6466
L'utilisateur recevra `100 - 90.91 = 9.09` jetons Y (moins les frais éventuels).
6567

@@ -69,7 +71,7 @@ Lorsque des utilisateurs déposent les deux jetons dans la *pool*, ils deviennen
6971
- Les jetons LP sont émis proportionnellement à la quantité de liquidités que vous ajoutez.
7072
- Lorsque vous effectuez un retrait, vous brûlez vos jetons LP afin de récupérer votre part des deux jetons (plus une part des frais perçus sur les échanges).
7173

72-
Le premier fournisseur de liquidités fixe le ratio initial. Par exemple, si vous déposez 100 X et 100 Y, vous pourriez recevoir 100 jetons LP.
74+
Le premier fournisseur de liquidités fixe le ratio initial. Par exemple, si vous déposez 100 X et 100 Y, vous pourriez recevoir 100 jetons LP.
7375

7476
Ensuite, si la *pool* contient déjà 100 X et 100 Y, et que vous ajoutez 10 X et 10 Y, vous obtenez des jetons LP proportionnels à votre contribution : `share = deposit_x / total_x = 10 / 100 = 10%` donc l'Amm créera dans le portefeuille de l'utilisateur 10 % du total de l'offre du LP.
7577

@@ -174,7 +176,7 @@ L'attribut `#[repr(C)]` garantit que notre structure dispose d'une disposition m
174176
Nous stockons `seed` (u64) et `fee` (u16) sous forme de tableaux d'octets plutôt que sous leur type natif afin de garantir une désérialisation sûre. Lorsque les données sont lues à partir du compte, il n'y a aucune garantie quant à l'alignement de la mémoire, et la lecture d'un `u64` à partir d'une adresse mémoire non alignée est un comportement indéfini. En utilisant des tableaux d'octets et en effectuant la conversion avec `from_le_bytes()`, nous garantissons que les données peuvent être lues en toute sécurité, quel que soit leur alignement, tout en assurant un ordre des octets *little-endian* cohérent sur toutes les plateformes.
175177

176178
Chaque champ de la structure `Config` a une fonction spécifique :
177-
- **state**: Suit l'état actuel de l'AMM (par exemple, non initialisé (*uninitialized*), initialisé (*initialized*), désactivé (*disabled*), ou retrait uniquement (*withdraw-only*)).
179+
- **state**: Suit l'état actuel de l'AMM (par exemple, non initialisé (*uninitialized*), initialisé (*initialized*), désactivé (*disabled*), ou retrait uniquement (*withdraw-only*)).
178180
- **seed**: Une valeur unique utilisée pour la génération d'Adresse Dérivées de Programme (PDA), permettant à plusieurs AMM d'exister avec différentes configurations.
179181
- **authority**: La clé publique avec contrôle administratif sur l'AMM (par exemple, pour mettre en pause ou mettre à jour la *pool*). Peut être défini comme immutable en passant `[0u8; 32]`.
180182
- **mint_x**: L'adresse de mint du jeton SPL pour le jeton X de la *pool*.

src/app/content/challenges/pinocchio-amm/fr/pages/initialize.mdx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ Voici les comptes nécessaires pour ce contexte :
1515
- `system` et `token` programs: Comptes de programme requis pour initialiser les comptes ci-dessus. Doit être `executable`.
1616

1717
> Avec l'expérience, vous remarquerez que bon nombre de ces vérifications peuvent être omises en vous appuyant plutôt sur les contraintes imposées par les CPI eux-mêmes. Par exemple, pour cette structure de compte, aucun contrôle explicite n'est nécessaire. En effet, si les contraintes ne sont pas respectées, le programme échouera par défaut. Je soulignerai ces nuances au fur et à mesure que nous avancerons dans la logique.
18+
1819
Comme il n'y a pas beaucoup de changements par rapport à la structure habituelle que nous créons, je vous laisse le soin de l'implémentation :
1920

2021
```rust
@@ -47,6 +48,7 @@ Voici les données d'instruction que nous devons transmettre :
4748
- `authority`: La clé publique qui aura l'autorité administrative sur l'AMM. Si elle n'est pas fournie, la *pool* peut être définie comme immuable. Doit être un `[u8; 32]`
4849

4950
> Comme vous pouvez le constater, plusieurs de ces champs pourraient être dérivés différemment. Par exemple, nous pourrions obtenir le `mint_x` en passant le compte de `Mint` et en le lisant directement ou générer la valeur `bump` dans le programme. Cependant, en les passant explicitement, nous visons à créer le programme le plus optimisé et le plus efficace possible.
51+
5052
Dans cette implémentation, nous traitons le parsing des données d'instruction de manière plus flexible et à un niveau plus bas que d'habitude. C'est pourquoi nous allons expliquer les raisons qui nous poussent à prendre les décisions suivantes :
5153

5254
```rust
@@ -113,7 +115,7 @@ let config_seeds = [
113115
];
114116
```
115117
- Remplissez le compte `Config` en le chargeant à l'aide de `Config::load_mut_unchecked()` puis en le remplissant avec toutes les données nécessaires à l'aide de l'aide `config.set_inner()`.
116-
- Créez le compte de `Mint` pour la LP à l'aide des instructions `CreateAccount` et `InitializeMint2` et des *seeds* suivantes :
118+
- Créez le compte de `Mint` pour la LP à l'aide des instructions `CreateAccount` et `InitializeMint2` et des *seeds* suivantes :
117119
```rust
118120
let mint_lp_seeds = [
119121
Seed::from(b"mint_lp"),
@@ -123,6 +125,7 @@ let mint_lp_seeds = [
123125
```
124126

125127
> La `mint_authority` de `mint_lp` est le compte `config`
128+
126129
Vous devriez être suffisamment compétent pour le faire vous-même, je vous laisse donc le soin de l'implémenter :
127130

128131
```rust

src/app/content/challenges/pinocchio-escrow/fr/challenge.mdx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
![Pinocchio Escrow Challenge](/graphics/challenge-banners/pinocchio-escrow.png)
1+
import ArticleSection from "../../../../components/ArticleSection/ArticleSection";
22

33
# L'Escrow
44

5+
![Pinocchio Escrow Challenge](/graphics/challenge-banners/pinocchio-escrow.png)
6+
57
Un *escrow* est un outil financier puissant qui permet des échanges sécurisés de jetons entre deux parties.
68

7-
Imaginez un coffre-fort numérique où un utilisateur peut bloquer un jeton A en attendant qu'un autre utilisateur dépose un jeton B avant que l'échange ne soit terminé.
9+
Imaginez un coffre-fort numérique où un utilisateur peut bloquer un jeton A en attendant qu'un autre utilisateur dépose un jeton B avant que l'échange ne soit terminé.
810

911
Cela crée un environnement sans confiance où aucune des parties n'a à craindre que l'autre ne revienne sur sa décision.
1012

@@ -124,10 +126,10 @@ Examinons maintenant l'implémentation et toutes ses fonctions d'aide :
124126

125127
```rust
126128
impl Escrow {
127-
pub const LEN: usize = size_of::<u64>()
128-
+ size_of::<Pubkey>()
129-
+ size_of::<Pubkey>()
130-
+ size_of::<Pubkey>()
129+
pub const LEN: usize = size_of::<u64>()
130+
+ size_of::<Pubkey>()
131+
+ size_of::<Pubkey>()
132+
+ size_of::<Pubkey>()
131133
+ size_of::<u64>()
132134
+ size_of::<[u8;1]>();
133135

src/app/content/challenges/pinocchio-escrow/fr/pages/make.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Voici les comptes dont le contexte a besoin :
1818
- system_program: le programme système. Doit être executable
1919
- token_program: le programme de jeton. Doit être executable
2020

21-
**Remarque** : Nous allons utiliser les types introduits dans l'[Introduction à Pinocchio](/en/courses/introduction-to-pinocchio/pinocchio-accounts).
21+
**Remarque** : Nous allons utiliser les assistants que nous avons présentés dans l'[Introduction à Pinocchio](/en/courses/introduction-to-pinocchio/pinocchio-accounts).
2222

2323
Cela se présente donc ainsi :
2424

0 commit comments

Comments
 (0)