From 24273eab0d127c17f3ba7058ec6b545b9388b6f0 Mon Sep 17 00:00:00 2001
From: Joshua <62268199+minimalsm@users.noreply.github.com>
Date: Fri, 13 Feb 2026 23:52:02 +0000
Subject: [PATCH] i18n(fr): translation import part 09 of 13 (23 files)
---
.../secure-development-workflow/index.md | 30 +-
.../tutorials/send-token-ethersjs/index.md | 66 +-
.../index.md | 174 +++---
.../tutorials/server-components/index.md | 295 +++++++++
.../index.md | 30 +-
.../developers/tutorials/short-abi/index.md | 307 +++++----
.../index.md | 79 ++-
.../tutorials/stealth-addr/index.md | 443 +++++++++++++
.../index.md | 2 +-
.../index.md | 131 ++--
.../token-integration-checklist/index.md | 88 +--
.../index.md | 102 +--
.../index.md | 44 +-
.../uniswap-v2-annotated-code/index.md | 587 +++++++++---------
.../tutorials/using-websockets/index.md | 74 ++-
.../index.md | 110 ++--
.../index.md | 76 +--
.../index.md | 92 +--
.../tutorials/yellow-paper-evm/index.md | 266 ++++----
public/content/translations/fr/eips/index.md | 41 +-
.../fr/energy-consumption/index.md | 65 +-
.../translations/fr/eth/supply/index.md | 80 +++
.../translations/fr/ethereum-forks/index.md | 320 +++++-----
23 files changed, 2182 insertions(+), 1320 deletions(-)
create mode 100644 public/content/translations/fr/developers/tutorials/server-components/index.md
create mode 100644 public/content/translations/fr/developers/tutorials/stealth-addr/index.md
create mode 100644 public/content/translations/fr/eth/supply/index.md
diff --git a/public/content/translations/fr/developers/tutorials/secure-development-workflow/index.md b/public/content/translations/fr/developers/tutorials/secure-development-workflow/index.md
index 5cf6f987b11..50c1eaa8aae 100644
--- a/public/content/translations/fr/developers/tutorials/secure-development-workflow/index.md
+++ b/public/content/translations/fr/developers/tutorials/secure-development-workflow/index.md
@@ -1,15 +1,12 @@
---
-title: Liste de contrôle de sécurité des contrats intelligents
-description: Un flux de travail suggéré pour la rédaction de contrats intelligents sécurisés
+title: "Liste de contrôle de sécurité des contrats intelligents"
+description: "Un flux de travail suggéré pour la rédaction de contrats intelligents sécurisés"
author: "Trailofbits"
-tags:
- - "contrats intelligents"
- - "sécurité"
- - "solidity"
+tags: [ "contrats intelligents", "sécurité", "solidité" ]
skill: intermediate
lang: fr
published: 2020-09-07
-source: Créer des contrats sécurisés
+source: Building secure contracts
sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/workflow.md
---
@@ -19,26 +16,25 @@ Voici un processus de haut niveau que nous vous recommandons de suivre lors de l
Recherchez les vulnérabilités connues :
-- Vérifiez vos contrats avec [Slither](https://github.com/crytic/slither). Cet outil intègre plus de 40 détecteurs pour les vulnérabilités connues. Exécutez-le à chaque enregistrement d'un nouveau code et assurez-vous que son rapport soit positif (ou utilisez le mode triage pour mettre sous silence certains problèmes).
-- Vérifiez vos contrats avec [Crytic](https://crytic.io/). Il vérifie 50 vulnérabilités que Slither ne détecte pas. Cryptic peut également aider votre équipe à rester le maître du jeu en faisant apparaître facilement les problèmes de sécurité dans les Pull Requests sur GitHub.
+- Examinez vos contrats avec [Slither](https://github.com/crytic/slither). Cet outil intègre plus de 40 détecteurs pour les vulnérabilités connues. Exécutez-le à chaque enregistrement d'un nouveau code et assurez-vous que son rapport soit positif (ou utilisez le mode triage pour mettre sous silence certains problèmes).
+- Examinez vos contrats avec [Crytic](https://crytic.io/). Il vérifie 50 vulnérabilités que Slither ne détecte pas. Cryptic peut également aider votre équipe à rester le maître du jeu en faisant apparaître facilement les problèmes de sécurité dans les Pull Requests sur GitHub.
Considérez les caractéristiques spéciales de votre contrat :
-- Vos contrats sont-ils évolutifs ? Vérifiez votre code de mise à niveau pour les défauts avec [`slither-check-upgradeability`](https://github.com/crytic/slither/wiki/Upgradeability-Checks) ou [Crytic](https://blog.trailofbits.com/2020/06/12/upgradeable-contracts-made-safer-with-crytic/). Nous avons documenté 17 façons dont les mises à niveau peuvent mal tourner.
+- Vos contrats sont-ils évolutifs ? Examinez votre code de mise à niveau pour y déceler des failles avec [`slither-check-upgradeability`](https://github.com/crytic/slither/wiki/Upgradeability-Checks) ou [Crytic](https://blog.trailofbits.com/2020/06/12/upgradeable-contracts-made-safer-with-crytic/). Nous avons documenté 17 façons dont les mises à niveau peuvent mal tourner.
- Est-ce que vos contrats doivent se conformer aux ERC? Vérifiez-les avec [`slither-check-erc`](https://github.com/crytic/slither/wiki/ERC-Conformance). Cet outil identifie instantanément les écarts de six spécifications courantes.
-- Avez-vous des tests unitaires dans Truffe ? Enrichissez-les avec [`slither-prop`](https://github.com/crytic/slither/wiki/Property-generation). Il génère automatiquement une suite de propriétés de sécurité robustes pour les fonctionnalités de l'ERC20 en fonction de votre code spécifique.
-- Intégrez-vous des jetons tiers ? Consultez notre [liste de contrôle d'intégration de jetons](/developers/tutorials/token-integration-checklist/) avant de vous fier à des contrats externes.
+- Intégrez-vous des jetons tiers ? Examinez notre [liste de contrôle d'intégration de jetons](/developers/tutorials/token-integration-checklist/) avant de dépendre de contrats externes.
Inspectez visuellement les fonctions de sécurité critiques de votre code :
-- Examinez l'afficheur [inheritance-graph](https://github.com/trailofbits/slither/wiki/Printer-documentation#inheritance-graph) de Slither. Évitez les surcharges involontaires et les problèmes de linéarisation C3.
-- Examinez l'afficheur [résumé de fonction](https://github.com/trailofbits/slither/wiki/Printer-documentation#function-summary) de Slither. Il signale la visibilité des fonctions et les contrôles d'accès.
-- Examinez l'afficheur [variables et accès](https://github.com/trailofbits/slither/wiki/Printer-documentation#variables-written-and-authorization) de Slither. Il signale les contrôles d'accès aux variables d'état.
+- Examinez l'imprimante [inheritance-graph](https://github.com/trailofbits/slither/wiki/Printer-documentation#inheritance-graph) de Slither. Évitez les surcharges involontaires et les problèmes de linéarisation C3.
+- Examinez l'imprimante [function-summary](https://github.com/trailofbits/slither/wiki/Printer-documentation#function-summary) de Slither. Il signale la visibilité des fonctions et les contrôles d'accès.
+- Examinez l'imprimante [vars-and-auth](https://github.com/trailofbits/slither/wiki/Printer-documentation#variables-written-and-authorization) de Slither. Il signale les contrôles d'accès aux variables d'état.
Documentez les propriétés critiques de sécurité et utilisez des générateurs de tests automatisés pour les évaluer :
- Apprenez à [documenter les propriétés de sécurité de votre code](/developers/tutorials/guide-to-smart-contract-security-tools/). C'est difficile au départ, mais c'est l'activité la plus importante pour obtenir un bon résultat. C'est également un prérequis à l'utilisation des techniques avancées de ce tutoriel.
-- Definissez les propriétés de sécurité en Solidity, pour les utiliser avec [Echidna](https://github.com/crytic/echidna) et [Manticore](https://manticore.readthedocs.io/en/latest/verifier.html). Concentrez-vous sur votre automate, les contrôles d'accès, les opérations arithmétiques, les interactions externes et la conformité aux normes.
+- Définissez les propriétés de sécurité dans Solidity, pour les utiliser avec [Echidna](https://github.com/crytic/echidna) et [Manticore](https://manticore.readthedocs.io/en/latest/verifier.html). Concentrez-vous sur votre automate, les contrôles d'accès, les opérations arithmétiques, les interactions externes et la conformité aux normes.
- Définissez les propriétés de sécurité avec [l'API Python de Slither](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/). Concentrez-vous sur l'héritage, les dépendances des variables, les contrôles d'accès et d'autres problèmes structurels.
- Exécutez vos tests de propriété sur chaque commit avec [Crytic](https://crytic.io). Crytic peut consommer et évaluer les tests de propriétés de sécurité pour que tout le monde dans votre équipe puisse facilement voir qu'ils passent sur GitHub. Les tests en échec peuvent bloquer les commits.
@@ -51,6 +47,6 @@ Enfin, soyez attentifs aux problèmes que les outils automatisés ne peuvent pas
## Demandez de l'aide {#ask-for-help}
-[Les heures de bureau d'Ethereum](https://calendly.com/dan-trailofbits/office-hours) se déroulent tous les mardis après-midi. Ces sessions en tête à tête sont l'occasion de nous poser toutes vos questions sur la sécurité, de dépannage à l'aide de nos outils et d'obtenir des commentaires d'experts sur votre approche actuelle. Nous vous aiderons à travailler à travers ce guide.
+Les [heures de permanence Ethereum](https://calendly.com/dan-trailofbits/office-hours) ont lieu tous les mardis après-midi. Ces sessions en tête à tête sont l'occasion de nous poser toutes vos questions sur la sécurité, de dépannage à l'aide de nos outils et d'obtenir des commentaires d'experts sur votre approche actuelle. Nous vous aiderons à travailler à travers ce guide.
Rejoignez notre Slack : [Empire Hacking](https://join.slack.com/t/empirehacking/shared_invite/zt-h97bbrj8-1jwuiU33nnzg67JcvIciUw). Nous sommes toujours disponibles dans les canaux #crytic et #ethereum si vous avez des questions.
diff --git a/public/content/translations/fr/developers/tutorials/send-token-ethersjs/index.md b/public/content/translations/fr/developers/tutorials/send-token-ethersjs/index.md
index 8352a365b03..985479e5f4e 100644
--- a/public/content/translations/fr/developers/tutorials/send-token-ethersjs/index.md
+++ b/public/content/translations/fr/developers/tutorials/send-token-ethersjs/index.md
@@ -1,27 +1,25 @@
---
-title: Envoyer des jetons avec ethers.js
-description: Guide à l'intention des débutants sur l'envoi de jetons à l'aide d'ether.js.
+title: "Envoyer des jetons à l'aide d'ethers.js"
+description: "Guide pour débutants sur l'envoi de jetons à l'aide d'ethers.js."
author: Kim YongJun
-tags:
- - "ETHERS.JS"
- - "ERC-20"
- - "JETONS"
+tags: [ "ETHERS.JS", "ERC-20", "JETONS" ]
skill: beginner
lang: fr
published: 2021-04-06
---
-## Envoyer un jeton avec ethers.js (5.0) {#send-token}
+## Envoyer un jeton avec ethers.js(5.0) {#send-token}
-### Dans ce tutoriel, vous allez apprendre à {#you-learn-about}
+### Dans ce tutoriel, vous apprendrez comment {#you-learn-about}
- Importer ethers.js
- Transférer un jeton
-- Définir le prix du gaz en fonction de l'état du trafic réseau
+- Définir le prix du gaz en fonction de l'état du trafic du réseau
### Pour commencer {#to-get-started}
-Pour commencer, nous devons d'abord importer la bibliothèque ethers.js dans notre JavaScript en intégrant ethers.js (5.0)
+Pour commencer, nous devons d'abord importer la bibliothèque ethers.js dans notre JavaScript.
+Inclure ethers.js(5.0)
### Installation {#install-ethersjs}
@@ -29,16 +27,16 @@ Pour commencer, nous devons d'abord importer la bibliothèque ethers.js dans not
/home/ricmoo> npm install --save ethers
```
-ES6 dans le navigateur :
+ES6 dans le navigateur
```html
```
-ES3 (UMD) dans le navigateur :
+ES3 (UMD) dans le navigateur
```html
@@ -27,19 +25,19 @@ Si vous préférez installer la bibliothèque pour l'utiliser dans votre back-en
npm install web3 --save
```
-Ensuite, pour importer Web3.js dans un script Node.js ou un projet frontend, vous pouvez utiliser l'instruction JavaScript suivante :
+Ensuite, pour importer Web3.js dans un script Node.js ou un projet frontend Browserify, vous pouvez utiliser la ligne JavaScript suivante :
```js
const Web3 = require("web3")
```
-Maintenant que nous avons importé la bibliothèque au sein du projet, nous devons l'initialiser. Notre projet doit être en mesure de communiquer avec la blockchain. La plupart des librairies Ethereum communiquent avec un [nœud](/developers/docs/nodes-and-clients/) via des appels RPC. Pour lancer notre fournisseur Web3, nous instancierons une instance Web3 en passant comme constructeur l'URL du fournisseur. Si vous disposez d'un nœud ou [d'une instance Ganache qui s'exécute sur votre ordinateur](https://ethereumdev.io/testing-your-smart-contract-with-existing-protocols-ganache-fork/) cela ressemblera à ça :
+Maintenant que nous avons inclus la bibliothèque dans le projet, nous devons l'initialiser. Votre projet doit pouvoir communiquer avec la blockchain. La plupart des bibliothèques Ethereum communiquent avec un [nœud](/developers/docs/nodes-and-clients/) via des appels RPC. Pour lancer notre fournisseur Web3, nous instancierons une instance Web3 en passant comme constructeur l'URL du fournisseur. Si vous avez un nœud ou une [instance de ganache qui s'exécute sur votre ordinateur](https://ethereumdev.io/testing-your-smart-contract-with-existing-protocols-ganache-fork/), cela ressemblera à ceci :
```js
const web3 = new Web3("http://localhost:8545")
```
-Si vous souhaitez accéder directement à un nœud hébergé, vous pouvez utiliser Infura. Vous pouvez également utiliser les programmes gratuits fournis par [Cloudflare](https://cloudflare-eth.com/), [Moralis](https://moralis.io), ou [Alchimie](https://alchemy.com/ethereum):
+Si vous souhaitez accéder directement à un nœud hébergé, vous trouverez des options sur les [nœuds en tant que service](/developers/docs/nodes-and-clients/nodes-as-a-service).
```js
const web3 = new Web3("https://cloudflare-eth.com")
@@ -56,7 +54,7 @@ web3.eth.getBlockNumber(function (error, result) {
})
```
-Si vous exécutez ce programme, il affichera simplement le dernier numéro de bloc : le haut de la blockchain. Vous pouvez également utiliser les appels de fonctions `await/async` pour éviter d'imbriquer les rappels dans votre code :
+Si vous exécutez ce programme, il affichera simplement le dernier numéro de bloc : le sommet de la blockchain. Vous pouvez également utiliser les appels de fonction `await/async` pour éviter d'imbriquer des callbacks dans votre code :
```js
async function getBlockNumber() {
@@ -68,27 +66,27 @@ async function getBlockNumber() {
getBlockNumber()
```
-Vous pouvez consulter toutes les fonctions disponibles sur l'instance Web3 dans la [documentation officielle de Web3.js](https://docs.web3js.org/).
+Vous pouvez voir toutes les fonctions disponibles sur l'instance Web3 dans [la documentation officielle de web3.js](https://docs.web3js.org/).
-La plupart des bibliothèques Web3 sont asynchrones parce qu'en arrière-plan, la bibliothèque fait appel au serveur JSON RPC pour accéder au noeud qui renvoie le résultat.
+La plupart des bibliothèques Web3 sont asynchrones car, en arrière-plan, la bibliothèque effectue des appels JSON-RPC au nœud qui renvoie le résultat.
Si vous travaillez dans le navigateur, certains portefeuilles injectent directement une instance Web3 et vous devriez essayer de l'utiliser dans la mesure du possible, surtout si vous prévoyez d'interagir avec l'adresse Ethereum de l'utilisateur pour effectuer des transactions.
-Voici le snippet pour détecter si un portefeuille MetaMask est disponible et si c'est le cas, tenter de l'activer. Cela vous permettra plus tard de lire le solde de l'utilisateur et de valider les transactions que vous souhaitez faire sur la blockchain Ethereum :
+Voici l'extrait de code pour détecter si un portefeuille MetaMask est disponible et essayer de l'activer si c'est le cas. Cela vous permettra par la suite de lire le solde de l'utilisateur et de lui permettre de valider les transactions que vous souhaitez lui faire effectuer sur la blockchain Ethereum :
```js
if (window.ethereum != null) {
state.web3 = new Web3(window.ethereum)
try {
- // Request account access if needed
+ // Demander l'accès au compte si nécessaire
await window.ethereum.enable()
- // Accounts now exposed
+ // Comptes maintenant exposés
} catch (error) {
- // User denied account access...
+ // L'utilisateur a refusé l'accès au compte...
}
}
```
-Des alternatives aux web3.js comme [Ethers.js](https://docs.ethers.io/) existent et sont également couramment utilisées. Dans le prochain tutoriel, nous verrons [comment prendre en charge facilement les nouveaux blocs entrants sur la blockchain et voir ce qu'ils contiennent](https://ethereumdev.io/listening-to-new-transactions-happening-on-the-blockchain/).
+Des alternatives à web3.js comme [Ethers.js](https://docs.ethers.io/) existent et sont également couramment utilisées. Dans le prochain tutoriel, nous verrons [comment écouter facilement les nouveaux blocs entrants sur la blockchain et voir ce qu'ils contiennent](https://ethereumdev.io/listening-to-new-transactions-happening-on-the-blockchain/).
diff --git a/public/content/translations/fr/developers/tutorials/short-abi/index.md b/public/content/translations/fr/developers/tutorials/short-abi/index.md
index 1d49f96f1bc..3e8966bc61c 100644
--- a/public/content/translations/fr/developers/tutorials/short-abi/index.md
+++ b/public/content/translations/fr/developers/tutorials/short-abi/index.md
@@ -1,85 +1,106 @@
---
-title: "Minimiser les ABIs pour l'optimisation des données d'appel"
-description: Optimisation des contrats intelligents pour les Rollups optimistes
+title: "ABI courtes pour l'optimisation des données d'appel"
+description: Optimisation des contrats intelligents pour les rollups optimistes
author: Ori Pomerantz
lang: fr
-tags:
- - "Couche 2"
+tags: [ "couche 2" ]
skill: intermediate
published: 2022-04-01
---
## Introduction {#introduction}
-Dans cet article, vous en apprendrez plus sur les [Rollups optimistes](/developers/docs/scaling/optimistic-rollups), le coût des transactions qui leur est appliqué, et comment la structure de coûts distincte nous oblige à optimiser différents éléments sur le réseau principal Ethereum. Vous apprendrez également à implémenter cette optimisation.
+Dans cet article, vous en apprendrez plus sur les [rollups optimistes](/developers/docs/scaling/optimistic-rollups), le coût des transactions qui leur est appliqué et la manière dont cette structure de coûts différente nous oblige à optimiser pour des éléments différents de ceux du réseau principal d'Ethereum.
+Vous apprendrez également comment mettre en œuvre cette optimisation.
-### Devoir de transparence {#full-disclosure}
+### Transparence totale {#full-disclosure}
-Je suis un employé à temps plein chez [Optimism](https://www.optimism.io/), les exemples illustrant cet article seront donc exécutés sur Optimism. Cependant, la technique expliquée ici devrait aussi bien fonctionner pour d'autres rollups.
+Je suis un employé à temps plein d'[Optimism](https://www.optimism.io/), les exemples de cet article seront donc exécutés sur Optimism.
+Cependant, la technique expliquée ici devrait aussi bien fonctionner pour d'autres rollups.
### Terminologie {#terminology}
-Lorsque l'on parle des rollups, le terme 'Couche 1' (L1) est généralement utilisé pour le réseau principal, le réseau Ethereum de production. Le terme 'Couche 2' (L2) est utilisé pour les rollups ou tout autre système qui se base sur L1 pour la sécurité, mais qui réalise son traitement hors chaîne.
+Lorsque l'on parle des rollups, le terme « couche 1 » (L1) est utilisé pour le réseau principal, le réseau de production Ethereum.
+Le terme « couche 2 » (L2) est utilisé pour le rollup ou tout autre système qui s'appuie sur L1 pour la sécurité, mais qui effectue la plupart de son traitement hors chaîne.
-## Comment pouvons-nous encore réduire le coût des transactions L2 ? {#how-can-we-further-reduce-the-cost-of-L2-transactions}
+## Comment pouvons-nous réduire davantage le coût des transactions L2 ? {#how-can-we-further-reduce-the-cost-of-L2-transactions}
-[Les Rollups optimistes](/developers/docs/scaling/optimistic-rollups) doivent conserver un registre de chaque historique de transaction afin que toute personne qui le souhaite puisse le passer en revue et vérifier que l'état actuel est correct. La façon la plus économique de récupérer des données sur le réseau principal Ethereum est de les écrire en tant que données d'appel. Cette solution a été choisie à la fois par [Optimism](https://help.optimism.io/hc/en-us/articles/4413163242779-What-is-a-rollup-) et [Arbitrum](https://developer.offchainlabs.com/docs/rollup_basics#intro-to-rollups).
+Les [rollups optimistes](/developers/docs/scaling/optimistic-rollups) doivent conserver un enregistrement de chaque transaction historique afin que n'importe qui puisse les parcourir et vérifier que l'état actuel est correct.
+Le moyen le plus économique d'inscrire des données sur le réseau principal d'Ethereum est de les écrire en tant que données d'appel.
+Cette solution a été choisie à la fois par [Optimism](https://help.optimism.io/hc/en-us/articles/4413163242779-What-is-a-rollup-) et [Arbitrum](https://developer.offchainlabs.com/docs/rollup_basics#intro-to-rollups).
### Coût des transactions L2 {#cost-of-l2-transactions}
-Le coût des transactions L2 est composé de deux éléments :
+Le coût des transactions L2 se compose de deux éléments :
1. Le traitement L2, qui est généralement extrêmement bon marché
-2. Le stockage L1, lié aux coûts de gaz du réseau principal
+2. Le stockage L1, qui est lié aux coûts de gaz du réseau principal
-Au moment d'écrire cet article, le coût de gaz L2 sur Optimism est de 0,001 [Gwei](/developers/docs/gas/#pre-london) Le coût de gaz L1, en revanche, est d'environ 40 gwei. [Vous pouvez voir les prix actuels ici](https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&refresh=5m).
+Au moment où j'écris ces lignes, sur Optimism, le coût du gaz L2 est de 0,001 [Gwei](/developers/docs/gas/#pre-london).
+Le coût du gaz L1, en revanche, est d'environ 40 gwei.
+[Vous pouvez voir les prix actuels ici](https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&refresh=5m).
-Un octet de données d'appel coûte soit 4 gaz (s'il est nul) soit 16 gaz (s'il s'agit d'une autre valeur). L'une des opérations les plus coûteuses de l'EVM est d'écrire sur le stockage. Le coût maximum d'écriture d'un mot de 32 octets pour un stockage sur L2 est de 22 100 gaz. Soit actuellement 22,1 gwei. Si nous parvenons à sauvegarder un seul octet zéro de données d'appel, nous pourrons écrire environ 200 octets de stockage et sortir gagnants de l'opération.
+Un octet de données d'appel coûte soit 4 gaz (s'il est nul), soit 16 gaz (s'il s'agit de n'importe quelle autre valeur).
+L'une des opérations les plus coûteuses sur l'EVM est l'écriture sur le stockage.
+Le coût maximum de l'écriture d'un mot de 32 octets sur le stockage en L2 est de 22 100 gaz. Actuellement, cela représente 22,1 gwei.
+Ainsi, si nous pouvons économiser un seul octet nul de données d'appel, nous pourrons écrire environ 200 octets sur le stockage et être tout de même gagnants.
### L'ABI {#the-abi}
-La grande majorité des transactions accèdent à un contrat provenant d'un compte externe. La plupart des contrats sont écrits en Solidity et interprètent leur champ de données conformément à l'[interface binaire d'application (ABI)](https://docs.soliditylang.org/en/latest/abi-spec.html#formal-specification-of-the-encoding).
+La grande majorité des transactions accèdent à un contrat provenant d'un compte externe.
+La plupart des contrats sont écrits en Solidity et interprètent leur champ de données selon [l'interface binaire de l'application (ABI)](https://docs.soliditylang.org/en/latest/abi-spec.html#formal-specification-of-the-encoding).
-Cependant, l'ABI a été conçu pour L1, où un octet de données d'appels coûte approximativement la même chose que quatre opérations arithmétiques, et non pas pour L2 où un octet de données d'appel coûte plus de mille opérations arithmétiques. Par exemple, [voici une transaction de transfert ERC-20](https://kovan-optimistic.etherscan.io/tx/0x7ce4c144ebfce157b4de99d8ad53a352ae91b57b3fa06d8a1c79439df6bfa998). Les données d'appel sont divisées ainsi :
+Cependant, l'ABI a été conçue pour L1, où un octet de données d'appel coûte approximativement la même chose que quatre opérations arithmétiques, et non pour L2 où un octet de données d'appel coûte plus de mille opérations arithmétiques.
+Les données d'appel sont divisées comme suit :
-| Section | Longueur | Bytes | Octets gaspillés | Gaz gaspillé | Octets nécessaires | Gaz nécessaire |
-| ---------------------- | -------: | ----: | ---------------: | -----------: | -----------------: | -------------: |
-| Sélecteur de fonction | 4 | 0-3 | 3 | 48 | 1 | 16 |
-| Zéros | 12 | 4-15 | 12 | 48 | 0 | 0 |
-| Adresse de destination | 20 | 16-35 | 0 | 0 | 20 | 320 |
-| Montant | 32 | 36-67 | 17 | 64 | 15 | 240 |
-| Total | 68 | | | 160 | | 576 |
+| Section | Longueur | Octets | Octets gaspillés | Gaz gaspillé | Octets nécessaires | Gaz nécessaire |
+| ---------------------- | -------: | -----: | ---------------: | -----------: | -----------------: | -------------: |
+| Sélecteur de fonction | 4 | 0-3 | 3 | 48 | 1 | 16 |
+| Zéros | 12 | 4-15 | 12 | 48 | 0 | 0 |
+| Adresse de destination | 20 | 16-35 | 0 | 0 | 20 | 320 |
+| Montant | 32 | 36-67 | 17 | 64 | 15 | 240 |
+| Total | 68 | | | 160 | | 576 |
-Explication :
+Explication :
-- **Sélecteur de fonction** : Le contrat a moins de 256 fonctions, nous pouvons donc les caractériser avec un seul octet. Ces octets sont typiquement non nuls et [coûtent donc seize gaz](https://eips.ethereum.org/EIPS/eip-2028).
-- **Zéros** : Ces octets sont toujours nuls car une adresse de vingt-quatre octets ne nécessite pas un mot de trente-deux octets pour la contenir. Les octets qui contiennent la valeur zéro ont un coût de quatre gaz ([voir le Livre Jaune](https://ethereum.github.io/yellowpaper/paper.pdf), Annexe G, p. 27, la valeur de `G``txdatazero` ).
-- **Montant** : Si nous supposons que dans ce contrat `les décimales` sont de dix-huit (la valeur normale) et que le nombre maximum de jetons que nous transférons sera de 1018 , nous obtenons un montant maximum de 1036 . 25615 > 1036 , donc 15 octets suffisent.
+- **Sélecteur de fonction** : Le contrat a moins de 256 fonctions, nous pouvons donc les distinguer avec un seul octet.
+ Ces octets sont généralement non nuls et [coûtent donc seize gaz](https://eips.ethereum.org/EIPS/eip-2028).
+- **Zéros** : Ces octets sont toujours nuls car une adresse de vingt octets ne nécessite pas un mot de trente-deux octets pour la contenir.
+ Les octets qui contiennent la valeur zéro coûtent quatre gaz ([voir le Livre Jaune](https://ethereum.github.io/yellowpaper/paper.pdf), Annexe G,
+ p. 27, la valeur pour `G``txdatazero` ).
+- **Montant** : Si nous supposons que dans ce contrat `decimals` est de dix-huit (la valeur normale) et que le montant maximum de jetons que nous transférons sera de 1018 , nous obtenons un montant maximum de 1036 .
+ 25615 > 1036 , donc quinze octets suffisent.
-Le gaspillage de 160 gaz sur L1 est normalement négligeable. Une transaction coûte un minimum de [21 000 gaz](https://yakkomajuri.medium.com/blockchain-definition-of-the-week-ethereum-gas-2f976af774ed), ainsi, un supplément de 0,8 % n'a pas grande importance. Cependant, sur L2, les choses sont différentes. La quasi-totalité du coût de la transaction consiste à l'écrire sur L1. En plus des données d'appel de la transaction, il y a 109 octets d'en-tête de la transaction (adresse de destination, signature, etc.). Le coût total est donc `109*16+576+160=2480`, et nous en gaspillons environ 6,5%.
+Un gaspillage de 160 gaz sur L1 est normalement négligeable. Une transaction coûte au moins [21 000 gaz](https://yakkomajuri.medium.com/blockchain-definition-of-the-week-ethereum-gas-2f976af774ed), donc 0,8 % supplémentaires n'ont pas d'importance.
+Cependant, sur L2, les choses sont différentes. La quasi-totalité du coût de la transaction consiste à l'écrire sur L1.
+En plus des données d'appel de la transaction, il y a 109 octets d'en-tête de transaction (adresse de destination, signature, etc.).
+Le coût total est donc `109*16+576+160=2480`, et nous en gaspillons environ 6,5 %.
## Réduire les coûts lorsque vous ne contrôlez pas la destination {#reducing-costs-when-you-dont-control-the-destination}
-En supposant que vous n'ayez pas de contrôle sur le contrat de destination, vous pouvez toujours utiliser une solution similaire à [celle-ci](https://github.com/qbzzt/ethereum.org-20220330-shortABI). Passons en revue les fichiers pertinents.
+En supposant que vous n'ayez pas le contrôle sur le contrat de destination, vous pouvez toujours utiliser une solution similaire à [celle-ci](https://github.com/qbzzt/ethereum.org-20220330-shortABI).
+Passons en revue les fichiers pertinents.
### Token.sol {#token-sol}
-[Ceci est le contrat de destination](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/Token.sol). Il s'agit d'un contrat standard ERC-20, avec une fonction supplémentaire. Cette fonction `faucet` permet à n'importe quel utilisateur d'obtenir un jeton à utiliser. Elle rendrait inutile la création d'un contrat ERC-20, mais elle facilite la vie quand un ERC-20 existe uniquement pour faciliter les tests.
+[Ceci est le contrat de destination](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/Token.sol).
+Il s'agit d'un contrat standard ERC-20, avec une fonction supplémentaire.
+Cette fonction `faucet` permet à n'importe quel utilisateur d'obtenir un jeton à utiliser.
+Elle rendrait inutile la création d'un contrat ERC-20, mais elle facilite la vie quand un ERC-20 existe uniquement pour faciliter les tests.
```solidity
/**
- * @dev Gives the caller 1000 tokens to play with
+ * @dev Donne à l'appelant 1000 jetons avec lesquels jouer
*/
function faucet() external {
_mint(msg.sender, 1000);
} // function faucet
```
-[Vous pouvez voir un exemple de ce contrat en cours de déploiement ici](https://kovan-optimistic.etherscan.io/address/0x950c753c0edbde44a74d3793db738a318e9c8ce8).
-
### CalldataInterpreter.sol {#calldatainterpreter-sol}
-[Ceci est le contrat que les transactions sont censées appeler au moyen de données d'appel plus courtes](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/CalldataInterpreter.sol). Revenons dessus ligne par ligne.
+[Ceci est le contrat que les transactions sont censées appeler avec des données d'appel plus courtes](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/CalldataInterpreter.sol).
+Revenons dessus ligne par ligne.
```solidity
//SPDX-License-Identifier: Unlicense
@@ -89,7 +110,7 @@ pragma solidity ^0.8.0;
import { OrisUselessToken } from "./Token.sol";
```
-Nous avons besoin de savoir comment appeler la fonction token.
+Nous avons besoin de la fonction du jeton pour savoir comment l'appeler.
```solidity
contract CalldataInterpreter {
@@ -97,19 +118,19 @@ contract CalldataInterpreter {
OrisUselessToken public immutable token;
```
-L'adresse du jeton pour lequel nous sommes un proxy.
+L'adresse du jeton pour lequel nous sommes un mandataire (proxy).
```solidity
/**
- * @dev Specify the token address
- * @param tokenAddr_ ERC-20 contract address
+ * @dev Spécifier l'adresse du jeton
+ * @param tokenAddr_ Adresse du contrat ERC-20
*/
constructor(
address tokenAddr_
) {
token = OrisUselessToken(tokenAddr_);
- } // constructor
+ } // constructeur
```
L'adresse du jeton est le seul paramètre que nous devons spécifier.
@@ -119,19 +140,21 @@ L'adresse du jeton est le seul paramètre que nous devons spécifier.
private pure returns (uint) {
```
-Lire une valeur dans les données d'appel.
+Lire une valeur à partir des données d'appel.
```solidity
uint _retVal;
require(length < 0x21,
- "calldataVal length limit is 32 bytes");
+ "La limite de longueur de calldataVal est de 32 octets");
require(length + startByte <= msg.data.length,
- "calldataVal trying to read beyond calldatasize");
+ "calldataVal essaie de lire au-delà de calldatasize");
```
-Nous allons charger en mémoire un unique mot de 32 octets (256 bits) et supprimer les octets qui ne font pas partie du champ souhaité. Cet algorithme ne fonctionne pas pour des valeurs de plus de 32 octets, et bien sûr nous ne pouvons lire au-delà de la fin des données d'appel. Sur L1, il serait pertinent de ne pas réaliser ces tests pour économiser du gaz, mais sur L2, le gaz est extrêmement bon marché, ce qui permet de réaliser toutes les vérifications possibles.
+Nous allons charger un unique mot de 32 octets (256 bits) en mémoire et supprimer les octets qui ne font pas partie du champ que nous voulons.
+Cet algorithme ne fonctionne pas pour des valeurs de plus de 32 octets, et bien sûr nous ne pouvons pas lire au-delà de la fin des données d'appel.
+Sur L1, il peut être nécessaire d'ignorer ces tests pour économiser du gaz, mais sur L2, le gaz est extrêmement bon marché, ce qui permet toutes les vérifications de cohérence auxquelles nous pouvons penser.
```solidity
assembly {
@@ -141,14 +164,16 @@ Nous allons charger en mémoire un unique mot de 32 octets (256 bits) et supprim
Nous aurions pu copier les données de l'appel à `fallback()` (voir ci-dessous), mais il est plus facile d'utiliser [Yul](https://docs.soliditylang.org/en/v0.8.12/yul.html), le langage d'assemblage de l'EVM.
-Nous utilisons ici [l'opcode CALLDATALOAD](https://www.evm.codes/#35) pour lire les octets `startByte` à `startByte+31` dans la pile. En général, la syntaxe d'un opcode dans Yul est `(,...)`.
+Ici, nous utilisons [l'opcode CALLDATALOAD](https://www.evm.codes/#35) pour lire les octets `startByte` à `startByte+31` dans la pile.
+En général, la syntaxe d'un opcode dans Yul est `(,...)`.
```solidity
_retVal = _retVal >> (256-length*8);
```
-Seuls les octets de `longueur` les plus significatives font partie du champ, donc nous [décalons vers la droite](https://en.wikipedia.org/wiki/Logical_shift) pour nous débarrasser des autres valeurs. Ceci présente l'avantage supplémentaire de déplacer la valeur à droite du champ, il s'agit donc de la valeur elle-même plutôt que la valeur multipliée par 256quelque chose .
+Seuls les octets de `longueur` les plus significatifs font partie du champ, donc nous effectuons un [décalage à droite](https://en.wikipedia.org/wiki/Logical_shift) pour nous débarrasser des autres valeurs.
+Ceci présente l'avantage supplémentaire de déplacer la valeur à droite du champ, il s'agit donc de la valeur elle-même plutôt que la valeur multipliée par 256quelque chose .
```solidity
@@ -159,7 +184,8 @@ Seuls les octets de `longueur` les plus significatives font partie du champ, don
fallback() external {
```
-Lorsqu'un appel à un contrat Solidity ne correspond à aucune des signatures de fonction, il appelle [la fonction `fallback()`](https://docs.soliditylang.org/en/v0.8.12/contracts.html#fallback-function) (en supposant qu'il y en ait une). Dans le cas de `CalldataInterpreter`, _tous les appels_ arrivent ici car il n'y a pas d'autres fonctions `external` ou `public`.
+Lorsqu'un appel à un contrat Solidity ne correspond à aucune des signatures de fonction, il appelle [la fonction `fallback()`](https://docs.soliditylang.org/en/v0.8.12/contracts.html#fallback-function) (en supposant qu'il y en ait une).
+Dans le cas de `CalldataInterpreter`, n'importe quel appel arrive ici car il n'y a pas d'autres fonctions `external` ou `public`.
```solidity
uint _func;
@@ -167,23 +193,27 @@ Lorsqu'un appel à un contrat Solidity ne correspond à aucune des signatures de
_func = calldataVal(0, 1);
```
-Lit le premier octet des données d'appel, qui nous indique la fonction. Il y a deux raisons pour lesquelles une fonction ne serait pas disponible ici :
+Lit le premier octet des données d'appel, qui nous indique la fonction.
+Il y a deux raisons pour lesquelles une fonction ne serait pas disponible ici :
-1. Les fonctions `pure` ou `view` ne changent pas l'état et ne coûtent pas de gaz (lorsqu'elles sont appelées hors chaîne). Essayer de réduire leur coût en gaz n'a aucun sens.
-2. Les fonctions reposent sur [`msg.sender`](https://docs.soliditylang.org/en/v0.8.12/units-and-global-variables.html#block-and-transaction-properties). La valeur de `msg.sender` va être l'adresse du `CalldataInterpreter`, pas celle de l'appelant.
+1. Les fonctions `pure` ou `view` ne modifient pas l'état et ne coûtent pas de gaz (lorsqu'elles sont appelées hors chaîne).
+ Essayer de réduire leur coût en gaz n'a aucun sens.
+2. Fonctions qui s'appuient sur [`msg.sender`](https://docs.soliditylang.org/en/v0.8.12/units-and-global-variables.html#block-and-transaction-properties).
+ La valeur de `msg.sender` sera l'adresse de `CalldataInterpreter`, et non celle de l'appelant.
-Malheureusement, [au regard des spécifications ERC-20](https://eips.ethereum.org/EIPS/eip-20), cela ne laisse qu'une seule fonction, `transfer`. Cela nous laisse avec uniquement deux fonctions : `transfer` (parce que nous pouvons appeler `transferFrom`) et `faucet` (parce que nous pouvons retourner les jetons à celui qui nous a appelés).
+Malheureusement, [en examinant les spécifications ERC-20](https://eips.ethereum.org/EIPS/eip-20), cela ne laisse qu'une seule fonction, `transfer`.
+Cela nous laisse avec uniquement deux fonctions : `transfer` (parce que nous pouvons appeler `transferFrom`) et `faucet` (parce que nous pouvons retourner les jetons à celui qui nous a appelés).
```solidity
- // Call the state changing methods of token using
- // information from the calldata
+ // Appeler les méthodes de changement d'état du jeton en utilisant
+ // les informations des données d'appel
// faucet
if (_func == 1) {
```
-Un appel à la fonction `faucet()`, qui n'a pas de paramètres.
+Un appel à `faucet()`, qui n'a pas de paramètres.
```solidity
token.faucet();
@@ -192,10 +222,12 @@ Un appel à la fonction `faucet()`, qui n'a pas de paramètres.
}
```
-Après avoir appelé `token.faucet()`, nous obtenons des jetons. Cependant, comme pour le contrat proxy, nous n'avons pas **besoin** des jetons. L'EOA (compte détenu en externe) ou le contrat qui nous appelait en a besoin. Nous transférons donc tous nos jetons à ceux qui nous ont appelés.
+Après avoir appelé `token.faucet()`, nous obtenons des jetons. Cependant, en tant que contrat mandataire, nous n'avons pas **besoin** de jetons.
+L'EOA (compte détenu en externe) ou le contrat qui nous a appelés en a besoin.
+Nous transférons donc tous nos jetons à ceux qui nous ont appelés.
```solidity
- // transfer (assume we have an allowance for it)
+ // transfer (supposons que nous ayons une allocation pour cela)
if (_func == 2) {
```
@@ -212,26 +244,27 @@ Nous autorisons uniquement les appelants à transférer les jetons qu'ils possè
address(uint160(calldataVal(1, 20))),
```
-L'adresse de destination commence à l'octet #1 (l'octet #0 est la fonction). En tant qu'adresse, elle fait 20 octets de long.
+L'adresse de destination commence à l'octet n° 1 (l'octet n° 0 est la fonction).
+En tant qu'adresse, elle fait 20 octets de long.
```solidity
calldataVal(21, 2)
```
-Pour ce contrat particulier, nous supposons que le nombre maximum de jetons que n'importe qui voudra transférer tiendra dans deux octets (moins de 65536).
+Pour ce contrat particulier, nous supposons que le nombre maximum de jetons que n'importe qui voudra transférer tiendra dans deux octets (moins de 65 536).
```solidity
);
}
```
-Dans l'ensemble, un transfert prend 35 octets de données d'appel :
+Dans l'ensemble, un transfert prend 35 octets de données d'appel :
-| Section | Longueur | Bytes |
-| ---------------------- | -------: | ----: |
-| Sélecteur de fonction | 1 | 0 |
-| Adresse de destination | 32 | 1-32 |
-| Montant | 2 | 33-34 |
+| Section | Longueur | Octets |
+| ---------------------- | -------: | -----: |
+| Sélecteur de fonction | 1 | 0 |
+| Adresse de destination | 32 | 1-32 |
+| Montant | 2 | 33-34 |
```solidity
} // fallback
@@ -241,22 +274,23 @@ Dans l'ensemble, un transfert prend 35 octets de données d'appel :
### test.js {#test-js}
-[Ce test unitaire JavaScript](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/test/test.js) nous montre comment utiliser ce mécanisme (et comment vérifier qu'il fonctionne correctement). Je vais supposer que vous comprenez [chai](https://www.chaijs.com/) et [ethers](https://docs.ethers.io/v5/) et uniquement vous expliquer les parties applicables spécifiquement au contrat.
+[Ce test unitaire JavaScript](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/test/test.js) nous montre comment utiliser ce mécanisme (et comment vérifier qu'il fonctionne correctement).
+Je vais supposer que vous comprenez [chai](https://www.chaijs.com/) et [ethers](https://docs.ethers.io/v5/) et que je n'expliquerai que les parties qui s'appliquent spécifiquement au contrat.
```js
const { expect } = require("chai");
describe("CalldataInterpreter", function () {
- it("Should let us use tokens", async function () {
+ it("Devrait nous permettre d'utiliser des jetons", async function () {
const Token = await ethers.getContractFactory("OrisUselessToken")
const token = await Token.deploy()
await token.deployed()
- console.log("Token addr:", token.address)
+ console.log("Adresse du jeton :", token.address)
const Cdi = await ethers.getContractFactory("CalldataInterpreter")
const cdi = await Cdi.deploy(token.address)
await cdi.deployed()
- console.log("CalldataInterpreter addr:", cdi.address)
+ console.log("Adresse CalldataInterpreter :", cdi.address)
const signer = await ethers.getSigner()
```
@@ -264,21 +298,24 @@ describe("CalldataInterpreter", function () {
Nous commençons par déployer les deux contrats.
```javascript
- // Get tokens to play with
+ // Obtenir des jetons pour jouer avec
const faucetTx = {
```
-Nous ne pouvons pas utiliser les fonctions de haut niveau que nous utiliserions normalement (comme `token.faucet()`) pour créer des transactions, car nous ne suivons pas l'ABI. Au lieu de cela, nous devons construire nous-mêmes la transaction et ensuite l'envoyer.
+Nous ne pouvons pas utiliser les fonctions de haut niveau que nous utiliserions normalement (telles que `token.faucet()`) pour créer des transactions, car nous ne suivons pas l'ABI.
+Au lieu de cela, nous devons construire nous-mêmes la transaction et ensuite l'envoyer.
```javascript
to: cdi.address,
data: "0x01"
```
-Nous devons fournir deux paramètres pour la transaction :
+Nous devons fournir deux paramètres pour la transaction :
-1. `to`, l'adresse de destination. Il s'agit de l'interpréteur des données d'appel du contrat.
-2. `data`, les données d'appel à envoyer. Dans le cas d'un appel faucet, les données sont un octet unique, `0x01`.
+1. `to`, l'adresse de destination.
+ Il s'agit du contrat d'interprétation des données d'appel.
+2. `data`, les données d'appel à envoyer.
+ Dans le cas d'un appel au faucet, les données sont un octet unique, `0x01`.
```javascript
@@ -286,26 +323,27 @@ Nous devons fournir deux paramètres pour la transaction :
await (await signer.sendTransaction(faucetTx)).wait()
```
-Nous appelons la [méthode du signataire `sendTransaction`](https://docs.ethers.io/v5/api/signer/#Signer-sendTransaction) car nous avons déjà spécifié la destination (`faucetTx.to`) et nous avons besoin que la transaction soit signée.
+Nous appelons la méthode `sendTransaction` [du signataire](https://docs.ethers.io/v5/api/signer/#Signer-sendTransaction) car nous avons déjà spécifié la destination (`faucetTx.to`) et nous avons besoin que la transaction soit signée.
```javascript
-// Check the faucet provides the tokens correctly
+// Vérifier que le faucet fournit les jetons correctement
expect(await token.balanceOf(signer.address)).to.equal(1000)
```
-Ici, nous vérifions le solde. Il n'est pas nécessaire d'économiser du gaz pour les fonctions `view`, nous les exécutons donc normalement.
+Ici, nous vérifions le solde.
+Il n'est pas nécessaire d'économiser du gaz sur les fonctions de `vue`, nous les exécutons donc normalement.
```javascript
-// Give the CDI an allowance (approvals cannot be proxied)
+// Donner une allocation au CDI (les approbations ne peuvent pas être mandatées)
const approveTX = await token.approve(cdi.address, 10000)
await approveTX.wait()
expect(await token.allowance(signer.address, cdi.address)).to.equal(10000)
```
-Donner à l'interprète des données d'appel une allocation pour pouvoir effectuer des transferts.
+Donner à l'interprète de données d'appel une allocation pour pouvoir effectuer des transferts.
```javascript
-// Transfer tokens
+// Transférer des jetons
const destAddr = "0xf5a6ead936fb47f342bb63e676479bddf26ebe1d"
const transferTx = {
to: cdi.address,
@@ -313,53 +351,50 @@ const transferTx = {
}
```
-Créer une transaction de transfert. Le premier octet est "0x02", suivi de l'adresse de destination, et enfin du montant (0x0100, qui est de 256 décimal).
+Créer une transaction de transfert. Le premier octet est « 0x02 », suivi de l'adresse de destination, et enfin du montant (0x0100, qui correspond à 256 en décimal).
```javascript
await (await signer.sendTransaction(transferTx)).wait()
- // Check that we have 256 tokens less
+ // Vérifier que nous avons 256 jetons en moins
expect (await token.balanceOf(signer.address)).to.equal(1000-256)
- // And that our destination got them
+ // Et que notre destination les a reçus
expect (await token.balanceOf(destAddr)).to.equal(256)
}) // it
}) // describe
```
-### Exemple {#example}
-
-Si vous souhiatez voir ces fichiers en action sans les exécuter vous-même, suivez ces liens :
-
-1. [Déploiement de `OrisUselessToken`](https://kovan-optimistic.etherscan.io/tx/1410744) sur l'[adresse `0x950c753c0edbde44a74d3793db738a318e9c8ce8`](https://kovan-optimistic.etherscan.io/address/0x950c753c0edbde44a74d3793db738a318e9c8ce8).
-2. [Déploiement de `CalldataInterpreter`](https://kovan-optimistic.etherscan.io/tx/1410745) sur l'[adresse `0x16617fea670aefe3b9051096c0eb4aeb4b3a5f55`](https://kovan-optimistic.etherscan.io/address/0x16617fea670aefe3b9051096c0eb4aeb4b3a5f55).
-3. [Appel de `faucet()`](https://kovan-optimistic.etherscan.io/tx/1410746).
-4. [Appel de `OrisUselessToken.approve()`](https://kovan-optimistic.etherscan.io/tx/1410747). Cet appel doit aller directement au contrat de jeton car le traitement repose sur `msg.sender`.
-5. [Appel de `transfer()`](https://kovan-optimistic.etherscan.io/tx/1410748).
-
-## Réduire les coûts lorsque vous contrôlez le contrat de destination {#reducing-the-cost-when-you-do-control-the-destination-contract}
+## Réduire le coût lorsque vous contrôlez le contrat de destination {#reducing-the-cost-when-you-do-control-the-destination-contract}
-Si vous avez le contrôle sur le contrat de destination, vous pouvez créer des fonctions qui contournent la vérification `msg.sender` dans la mesure où elles font confiance à l'interpréteur des données d'appel. [Vous pouvez voir un exemple de comment cela fonctionne ici, dans la branche `control-contract`](https://github.com/qbzzt/ethereum.org-20220330-shortABI/tree/control-contract).
+Si vous avez le contrôle sur le contrat de destination, vous pouvez créer des fonctions qui contournent la vérification de `msg.sender` dans la mesure où elles font confiance à l'interpréteur des données d'appel.
+[Vous pouvez voir un exemple de la façon dont cela fonctionne ici, dans la branche `control-contract`](https://github.com/qbzzt/ethereum.org-20220330-shortABI/tree/control-contract).
-Si le contrat ne répondait qu'à des transactions externes, nous pourrions nous contenter d'un seul contrat. Cependant, cela casserait [la composabilité](/developers/docs/smart-contracts/composability/). Il est préférable d'avoir un contrat capable de répondre aux appels traditionnels ERC-20 et un autre contrat destiné aux transactions avec de courts appels de données.
+Si le contrat ne répondait qu'à des transactions externes, nous pourrions nous contenter d'un seul contrat.
+Cependant, cela briserait [la composabilité](/developers/docs/smart-contracts/composability/).
+Il est préférable d'avoir un contrat qui répond aux appels ERC-20 normaux, et un autre contrat qui répond aux transactions avec des données d'appel courtes.
### Token.sol {#token-sol-2}
-Dans cet exemple, nous pouvons modifier `Token.sol`. Cela nous permet d'avoir un certain nombre de fonctions que seul le proxy peut appeler. Voici les nouveaux éléments :
+Dans cet exemple, nous pouvons modifier `Token.sol`.
+Cela nous permet d'avoir un certain nombre de fonctions que seul le mandataire peut appeler.
+Voici les nouvelles parties :
```solidity
- // The only address allowed to specify the CalldataInterpreter address
+ // La seule adresse autorisée à spécifier l'adresse CalldataInterpreter
address owner;
- // The CalldataInterpreter address
+ // L'adresse CalldataInterpreter
address proxy = address(0);
```
-Le contrat ERC-20 doit connaître l'identité du proxy autorisé. Cependant, nous ne pouvons pas définir cette variable dans le constructeur, car nous n'en connaissons pas encore la valeur. Ce contrat est instauré en premier car le proxy attend l'adresse du jeton dans son constructeur.
+Le contrat ERC-20 doit connaître l'identité du mandataire autorisé.
+Cependant, nous ne pouvons pas définir cette variable dans le constructeur, car nous n'en connaissons pas encore la valeur.
+Ce contrat est instancié en premier car le mandataire attend l'adresse du jeton dans son constructeur.
```solidity
/**
- * @dev Calls the ERC20 constructor.
+ * @dev Appelle le constructeur ERC20.
*/
constructor(
) ERC20("Oris useless token-2", "OUT-2") {
@@ -367,47 +402,50 @@ Le contrat ERC-20 doit connaître l'identité du proxy autorisé. Cependant, nou
}
```
-L'adresse du créateur (appelé `owner`) est stockée ici car c'est la seule adresse autorisée à définir le proxy.
+L'adresse du créateur (appelé `propriétaire`) est stockée ici car c'est la seule adresse autorisée à définir le mandataire.
```solidity
/**
- * @dev set the address for the proxy (the CalldataInterpreter).
- * Can only be called once by the owner
+ * @dev définit l'adresse pour le mandataire (le CalldataInterpreter).
+ * Ne peut être appelé qu'une seule fois par le propriétaire
*/
function setProxy(address _proxy) external {
- require(msg.sender == owner, "Can only be called by owner");
- require(proxy == address(0), "Proxy is already set");
+ require(msg.sender == owner, "Ne peut être appelé que par le propriétaire");
+ require(proxy == address(0), "Le mandataire est déjà défini");
proxy = _proxy;
} // function setProxy
```
-Le proxy dispose d'un accès privilégié, car il peut contourner les contrôles de sécurité. Pour être sûr de pouvoir faire confiance au proxy, nous ne laissons que `le propriétaire` appeler cette fonction, et qu'une seule fois. Une fois que le `proxy` dispose d'une valeur réelle (pas zéro), cette valeur ne peut pas changer, donc même si le propriétaire décide de jouer au voyou, ou si l'élément mnémonique est révélé, nous restons en sécurité.
+Le mandataire dispose d'un accès privilégié, car il peut contourner les contrôles de sécurité.
+Pour être sûr de pouvoir faire confiance au mandataire, nous ne laissons que le `propriétaire` appeler cette fonction, et une seule fois.
+Une fois que `proxy` a une valeur réelle (non nulle), cette valeur ne peut pas changer, donc même si le propriétaire décide de devenir malveillant, ou si la mnémonique pour celui-ci est révélée, nous sommes toujours en sécurité.
```solidity
/**
- * @dev Some functions may only be called by the proxy.
+ * @dev Certaines fonctions ne peuvent être appelées que par le mandataire.
*/
modifier onlyProxy {
```
-Ceci est une [fonction `modifier`](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm), qui modifie la façon dont les autres fonctions marchent.
+Ceci est une [fonction `modificatrice`](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm), elle modifie le fonctionnement des autres fonctions.
```solidity
require(msg.sender == proxy);
```
-Tout d'abord, vérifier que nous avons été appelés par le proxy et personne d'autre. Dans le cas contraire, `annuler`.
+Tout d'abord, vérifiez que nous avons été appelés par le mandataire et personne d'autre.
+Sinon, `revert`.
```solidity
_;
}
```
-Si c'est le cas, exécuter la fonction que nous modifions.
+Si c'est le cas, exécutez la fonction que nous modifions.
```solidity
- /* Functions that allow the proxy to actually proxy for accounts */
+ /* Fonctions qui permettent au mandataire de servir de mandataire pour les comptes */
function transferProxy(address from, address to, uint256 amount)
public virtual onlyProxy() returns (bool)
@@ -436,17 +474,18 @@ Si c'est le cas, exécuter la fonction que nous modifions.
}
```
-Il s'agit de trois opérations pour lesquelles le message doit normalement provenir directement de l'entité qui transfère les jetons ou approuve une allocation. Nous avons ici une version proxy de ces opérations qui :
+Il s'agit de trois opérations qui nécessitent normalement que le message provienne directement de l'entité qui transfère les jetons ou qui approuve une allocation.
+Nous avons ici une version mandataire de ces opérations qui :
-1. Est modifiée par `onlyProxy()` afin que personne d'autre ne soit autorisé à les contrôler.
+1. est modifiée par `onlyProxy()` afin que personne d'autre ne soit autorisé à les contrôler.
2. Récupère l'adresse qui serait normalement `msg.sender` en tant que paramètre supplémentaire.
### CalldataInterpreter.sol {#calldatainterpreter-sol-2}
-L'interpréteur de données d'appel est presque identique à celui ci-dessus, à la différence que les fonctions proxy reçoivent un paramètre `msg.sender` et qu'il n'est pas nécessaire d'effectuer d'allocation pour le `transfert`.
+L'interpréteur de données d'appel est presque identique à celui ci-dessus, à la différence que les fonctions mandatées reçoivent un paramètre `msg.sender` et qu'il n'est pas nécessaire d'effectuer d'allocation pour le `transfert`.
```solidity
- // transfer (no need for allowance)
+ // transfert (pas besoin d'allocation)
if (_func == 2) {
token.transferProxy(
msg.sender,
@@ -455,7 +494,7 @@ L'interpréteur de données d'appel est presque identique à celui ci-dessus, à
);
}
- // approve
+ // approbation
if (_func == 3) {
token.approveProxy(
msg.sender,
@@ -486,21 +525,22 @@ await cdi.deployed()
await token.setProxy(cdi.address)
```
-Nous devons indiquer au contrat ERC-20 à quel proxy faire confiance
+Nous devons indiquer au contrat ERC-20 à quel mandataire faire confiance
```js
-console.log("CalldataInterpreter addr:", cdi.address)
+console.log("Adresse CalldataInterpreter :", cdi.address)
-// Need two signers to verify allowances
+// Besoin de deux signataires pour vérifier les allocations
const signers = await ethers.getSigners()
const signer = signers[0]
const poorSigner = signers[1]
```
-Pour vérifier `approve()` et `transferFrom()`, nous avons besoin d'un second signataire. Nous l'appelons `poorSigner` car il ne récupère aucun de nos jetons (il a bien entendu besoin d'ETH).
+Pour vérifier `approve()` et `transferFrom()`, nous avons besoin d'un second signataire.
+Nous l'appelons `poorSigner` car il ne reçoit aucun de nos jetons (il doit bien sûr avoir de l'ETH).
```js
-// Transfer tokens
+// Transférer des jetons
const destAddr = "0xf5a6ead936fb47f342bb63e676479bddf26ebe1d"
const transferTx = {
to: cdi.address,
@@ -509,10 +549,10 @@ const transferTx = {
await (await signer.sendTransaction(transferTx)).wait()
```
-Dans la mesure où le contrat ERC-20 fait confiance au proxy (`cdi`), nous n'avons pas besoin d'une allocation pour relayer les transferts.
+Étant donné que le contrat ERC-20 fait confiance au mandataire (`cdi`), nous n'avons pas besoin d'une allocation pour relayer les transferts.
```js
-// approval and transferFrom
+// approbation et transferFrom
const approveTx = {
to: cdi.address,
data: "0x03" + poorSigner.address.slice(2, 42) + "00FF",
@@ -527,24 +567,19 @@ const transferFromTx = {
}
await (await poorSigner.sendTransaction(transferFromTx)).wait()
-// Check the approve / transferFrom combo was done correctly
+// Vérifier que la combinaison approbation / transferFrom a été effectuée correctement
expect(await token.balanceOf(destAddr2)).to.equal(255)
```
-Tester les deux nouvelles fonctions. Notez que `transferFromTx` nécessite deux paramètres d'adresse : le donneur de l'allocation et le destinataire.
+Tester les deux nouvelles fonctions.
+Notez que `transferFromTx` nécessite deux paramètres d'adresse : le donneur de l'allocation et le destinataire.
-### Exemple {#example-2}
-
-Si vous souhiatez voir ces fichiers en action sans les exécuter vous-même, suivez ces liens :
+## Conclusion {#conclusion}
-1. [Déploiement de `OrisUselessToken-2`](https://kovan-optimistic.etherscan.io/tx/1475397) à l'adresse [`0xb47c1f550d8af70b339970c673bbdb2594011696`](https://kovan-optimistic.etherscan.io/address/0xb47c1f550d8af70b339970c673bbdb2594011696).
-2. [Déploiement de `CalldataInterpreter`](https://kovan-optimistic.etherscan.io/tx/1475400) à l'adresse [`0x0dccfd03e3aaba2f8c4ea4008487fd0380815892`](https://kovan-optimistic.etherscan.io/address/0x0dccfd03e3aaba2f8c4ea4008487fd0380815892).
-3. [Appel de `setProxy()`](https://kovan-optimistic.etherscan.io/tx/1475402).
-4. [Appel de `faucet()`](https://kovan-optimistic.etherscan.io/tx/1475409).
-5. [Appel de `transferProxy()`](https://kovan-optimistic.etherscan.io/tx/1475416).
-6. [Appel de `approveProxy()`](https://kovan-optimistic.etherscan.io/tx/1475419).
-7. [Appel de `transferProxy()`](https://kovan-optimistic.etherscan.io/tx/1475421). Notez que cet appel provient d'une adresse différente des autres, `poorSigner` au lieu du `signer`.
+[Optimism](https://medium.com/ethereum-optimism/the-road-to-sub-dollar-transactions-part-2-compression-edition-6bb2890e3e92) et [Arbitrum](https://developer.offchainlabs.com/docs/special_features) cherchent tous deux des moyens de réduire la taille des données d'appel écrites sur L1 et donc le coût des transactions.
+Cependant, en tant que fournisseurs d'infrastructures à la recherche de solutions génériques, nos capacités sont limitées.
+En tant que développeur de dapps, vous avez des connaissances spécifiques à l'application, ce qui vous permet d'optimiser vos données d'appel bien mieux que nous ne pourrions le faire avec une solution générique.
+Nous espérons que cet article vous aidera à trouver la solution idéale pour vos besoins.
-## Conclusion {#conclusion}
+[Voir ici pour plus de mon travail](https://cryptodocguy.pro/).
-[Optimism](https://medium.com/ethereum-optimism/the-road-to-sub-dollar-transactions-part-2-compression-edition-6bb2890e3e92) et [Arbitrum](https://developer.offchainlabs.com/docs/special_features) recherchent des moyens de réduire la taille des données d'appel écrites en L1 et donc le coût des transactions. Cependant, en tant que fournisseurs d'infrastructures pour des solutions génériques, nos capacités sont limitées. En tant que développeur dApp, vous avez des connaissances spécifiques concernant l'application, ce qui vous permet d'optimiser vos données d'appel bien mieux que nous ne pourrions le faire avec une solution générique. J'espère que cet article vous aidera à trouver la solution idéale pour vos besoins.
diff --git a/public/content/translations/fr/developers/tutorials/smart-contract-security-guidelines/index.md b/public/content/translations/fr/developers/tutorials/smart-contract-security-guidelines/index.md
index b84fbff256d..2e5d8d3c749 100644
--- a/public/content/translations/fr/developers/tutorials/smart-contract-security-guidelines/index.md
+++ b/public/content/translations/fr/developers/tutorials/smart-contract-security-guidelines/index.md
@@ -1,15 +1,12 @@
---
-title: Directives de sécurité pour les contrats intelligents
-description: Une liste de contrôle des consignes de sécurité à prendre en compte lors de la création de votre DApp
+title: "Directives de sécurité pour les contrats intelligents"
+description: "Une liste de contrôle des consignes de sécurité à prendre en compte lors de la création de votre DApp"
author: "Trailofbits"
-tags:
- - "solidity"
- - "contrats intelligents"
- - "sécurité"
+tags: [ "solidité", "contrats intelligents", "sécurité" ]
skill: intermediate
lang: fr
published: 2020-09-06
-source: Créer des contrats sécurisés
+source: Building secure contracts
sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/guidelines.md
---
@@ -23,72 +20,72 @@ La conception du contrat doit être discutée à l'avance, avant de rédiger une
La documentation peut être écrite à différents niveaux et devrait être mise à jour lors de l'implémentation des contrats :
-- **Une description simple du système en anglais**, décrivant ce que font les contrats et toutes hypothèses sur le code base.
-- **Schéma et diagrammes architecturaux**, y compris les interactions contractuelles et la machine d'état du système. [Slither printers](https://github.com/crytic/slither/wiki/Printer-documentation) peut aider à générer ces schémas.
-- **Documentation de code approfondi**, le [format Natspec](https://solidity.readthedocs.io/en/develop/natspec-format.html) peut être utilisé pour Solidity.
+- **Une description simple du système**, décrivant ce que font les contrats et les hypothèses concernant la base de code.
+- **Schémas et diagrammes d'architecture**, incluant les interactions entre contrats et la machine à états du système. [Les imprimantes de Slither](https://github.com/crytic/slither/wiki/Printer-documentation) peuvent vous aider à générer ces schémas.
+- **Documentation de code approfondie**, le format [Natspec](https://docs.soliditylang.org/en/develop/natspec-format.html) peut être utilisé pour Solidity.
-### Calcul On-chain vs Off-chain {#on-chain-vs-off-chain-computation}
+### Calcul en chaîne ou hors chaîne {#onchain-vs-offchain-computation}
-- **Conserver le plus de code que vous pouvez hors chaîne.** Garder la couche en chaîne petite. Pré-traiter les données avec du code hors chaîne de telle façon que la vérification en chaîne soit simple. Avez-vous besoin d'une liste ordonnée ? Trier la liste hors chaîne, puis ne vérifier que son ordre en chaîne.
+- **Gardez autant de code que possible hors chaîne.** Gardez la couche en chaîne de petite taille. Prétraitez les données avec du code hors chaîne de manière à ce que la vérification en chaîne soit simple. Avez-vous besoin d'une liste ordonnée ? Trier la liste hors chaîne, puis ne vérifier que son ordre en chaîne.
-### Mise à jour {#upgradeability}
+### Évolutivité {#upgradeability}
-Nous avons discuté des différentes solutions de mise à niveau dans [notre blogpost](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/). Faites un choix délibéré de prendre en charge la possibilité de mise à niveau ou non avant de rédiger un code. La décision influencera la façon dont vous structurerez notre code. En général, nous recommandons :
+Nous avons abordé les différentes solutions d'évolutivité dans [notre article de blog](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/). Faites un choix délibéré de prendre en charge la possibilité de mise à niveau ou non avant de rédiger un code. La décision influencera la façon dont vous structurerez notre code. En général, nous recommandons :
-- **Favoriser [la migration de contract](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/) plutôt que la mise à niveau.** Le système de migration présente bon nombre des mêmes avantages que l'évolutif, sans ses inconvénients.
-- **Utilisation du modèle de séparation des données par rapport à celui du delegatecallproxy.** Si votre projet a une séparation d'abstraction claire, la possibilité de mise à niveau à l'aide de la séparation des données ne nécessitera que quelques ajustements. Le delegatecallproxy nécessite une expertise EVM et est très exposé aux erreurs.
-- **Documentez la procédure de migration/mise à niveau avant le déploiement.** Si vous devez réagir sous pression sans aucune instructions, vous ferez des erreurs. Écrivez la procédure à suivre à l'avance. Cela devrait inclure :
+- **Privilégiez la [migration de contrat](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/) plutôt que l'évolutivité.** Les systèmes de migration présentent bon nombre des mêmes avantages que les systèmes évolutifs, sans leurs inconvénients.
+- **Utilisez le modèle de séparation des données plutôt que celui de delegatecallproxy.** Si votre projet présente une séparation claire de l'abstraction, l'évolutivité utilisant la séparation des données ne nécessitera que quelques ajustements. Le delegatecallproxy nécessite une expertise EVM et est très exposé aux erreurs.
+- **Documentez la procédure de migration/mise à niveau avant le déploiement.** Si vous devez réagir dans l'urgence sans directives, vous ferez des erreurs. Écrivez la procédure à suivre à l'avance. Cela devrait inclure :
- Les appels qui initient les nouveaux contrats
- Où sont stockées les clés et comment y accéder
- Comment vérifier le déploiement ! Développez et testez un script de post-déploiement.
-## Directives d'exécution {#implementation-guidelines}
+## Directives d'implémentation {#implementation-guidelines}
-**Opter pour la simplicité.** Utilisez toujours la solution la plus simple qui correspond à votre but. Tout membre de votre équipe devrait être en mesure de comprendre votre solution.
+**Recherchez la simplicité.** Utilisez toujours la solution la plus simple et adaptée à votre objectif. Tout membre de votre équipe devrait être en mesure de comprendre votre solution.
-### Composition de la fonction {#function-composition}
+### Composition de fonctions {#function-composition}
L'architecture de votre code de base devrait rendre votre code facile à vérifier. Évitez les choix architecturaux qui réduisent la capacité à raisonner sur son exactitude.
-- **Séparer la logique de votre système**, soit par des contrats multiples, soit en regroupant des fonctions similaires (par exemple, authentification, arithmétique, ...).
-- **Écrire de petites fonctions, avec un objectif clair.** Cela facilitera la révision et permettra le test de composantes individuelles.
+- **Divisez la logique de votre système**, soit à travers plusieurs contrats, soit en regroupant des fonctions similaires (par exemple, l'authentification, l'arithmétique, etc.).
+- **Écrivez des fonctions courtes avec un objectif clair.** Cela facilitera la revue et permettra de tester les composants individuels.
### Héritage {#inheritance}
-- **Gardez l'héritage gérable.** L'héritage doit être utilisé pour diviser la logique, cependant, votre projet devrait viser à minimiser la profondeur et la largeur de l'arbre d'héritage.
-- **Utilisez l'imprimante [d'héritage de Slither](https://github.com/crytic/slither/wiki/Printer-documentation#inheritance-graph) pour vérifier la hiérarchie des contrats.** L'imprimante d'héritage vous aidera à revoir la taille de la hiérarchie.
+- **Maintenez l'héritage gérable.** L'héritage doit être utilisé pour diviser la logique, cependant, votre projet doit viser à minimiser la profondeur et la largeur de l'arborescence d'héritage.
+- **Utilisez l'[imprimante d'héritage](https://github.com/crytic/slither/wiki/Printer-documentation#inheritance-graph) de Slither pour vérifier la hiérarchie des contrats.** L'imprimante d'héritage vous aidera à examiner la taille de la hiérarchie.
### Événements {#events}
-- **Enregistre toutes les opérations cruciales.** Les événements aideront à déboguer le contrat pendant le développement, et à le surveiller après le déploiement.
+- **Journalisez toutes les opérations cruciales.** Les événements vous aideront à déboguer le contrat pendant le développement et à le surveiller après le déploiement.
-### Éviter les pièges connus {#avoid-known-pitfalls}
+### Évitez les pièges connus {#avoid-known-pitfalls}
-- **Soyez conscient des problèmes de sécurité les plus courants.** Il existe beaucoup de ressources en ligne à apprendre sur les problèmes communs, tels que [Ethernaut CTF](https://ethernaut.openzeppelin.com/), [Capturez l'Ether](https://capturetheether.com/), ou [Les contrats Not-so-smart](https://github.com/crytic/not-so-smart-contracts/).
-- **Soyez conscient des sections d'avertissements dans la [documentation Solidity](https://solidity.readthedocs.io/en/latest/).** Les sections d'avertissements vous informeront du comportement non-évident du langage.
+- **Soyez conscient des problèmes de sécurité les plus courants.** Il existe de nombreuses ressources en ligne pour en apprendre davantage sur les problèmes courants, telles que [Ethernaut CTF](https://ethernaut.openzeppelin.com/), [Capture the Ether](https://capturetheether.com/) ou [Not so smart contracts](https://github.com/crytic/not-so-smart-contracts/).
+- **Prenez connaissance des sections d'avertissement dans la [documentation de Solidity](https://docs.soliditylang.org/en/latest/).** Les sections d'avertissement vous informeront sur les comportements non évidents du langage.
### Dépendances {#dependencies}
-- **Utilisez des bibliothèques logicielles bien testées.** Importer du code depuis des bibliothèques bien testées réduira la probabilité d'écrire du code bogué. Si vous voulez écrire un contrat ERC20, utilisez [OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20).
-- **Utilisez un dependency manager; évitez le code copier-coller** Si vous comptez sur une source externe, vous devez la tenir à jour avec la source originale.
+- **Utilisez des bibliothèques bien testées.** L'importation de code à partir de bibliothèques bien testées réduira la probabilité d'écrire du code bogué. Si vous voulez écrire un contrat ERC20, utilisez [OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20).
+- **Utilisez un gestionnaire de dépendances ; évitez de copier-coller du code.** Si vous dépendez d'une source externe, vous devez la maintenir à jour par rapport à la source d'origine.
-### Tests et vérification {#testing-and-verification}
+### Test et vérification {#testing-and-verification}
-- **Écrivez des tests unitaires approfondis.** Une suite de tests étendue est cruciale pour construire des logiciels de haute qualité.
-- **Écrivez [Slither](https://github.com/crytic/slither), [Echidna](https://github.com/crytic/echidna) et [Manticore](https://github.com/trailofbits/manticore) vérifications et propriétés personnalisées.** Des outils automatisés vous aideront à sécuriser votre contrat. Examinez le reste de ce guide pour savoir comment écrire des vérifications et des propriétés efficaces.
-- **Utilisez [crytic.io](https://crytic.io/).** Crytic intégré avec GitHub, fournit un accès aux détecteurs privés de Slither et effectue des vérifications de propriétés personnalisées depuis Echidna.
+- **Rédigez des tests unitaires approfondis.** Une suite de tests complète est essentielle pour créer un logiciel de haute qualité.
+- **Rédigez des vérifications et des propriétés personnalisées pour [Slither](https://github.com/crytic/slither), [Echidna](https://github.com/crytic/echidna) et [Manticore](https://github.com/trailofbits/manticore).** Les outils automatisés vous aideront à garantir la sécurité de votre contrat. Examinez le reste de ce guide pour savoir comment écrire des vérifications et des propriétés efficaces.
+- **Utilisez [crytic.io](https://crytic.io/).** Crytic s'intègre à GitHub, fournit un accès à des détecteurs Slither privés et exécute des vérifications de propriétés personnalisées à partir d'Echidna.
### Solidity {#solidity}
-- **Favoriser Solidity 0.5 plutôt que 0.4 et 0.6.** Selon nous, Solidity 0.5 est plus sécurisée et a de meilleures pratiques intégrées que 0.4. Solidity 0.6 s'est révélée trop instable pour la production et a besoin de temps pour se développer.
-- **Utilisez une version stable pour la compilation ; utilisez la dernière version pour vérifier les avertissements.** Vérifiez que votre code n'a aucun problème rapporté avec la dernière version du compilateur. Cependant, Solidity a un cycle de publication rapide et a un historique de bogues du compilateur, donc nous ne recommandons pas la dernière version pour le déploiement (voir la [recommandation de version solc](https://github.com/crytic/slither/wiki/Detector-Documentation#recommendation-33) de Slither ).
-- **N'utilisez pas d'assemblage Inline.** L'assemblage nécessite une expertise EVM. N'écrivez pas de code EVM si vous n'avez pas maîtrisé _le Livre jaune_.
+- **Privilégiez Solidity 0.5 par rapport aux versions 0.4 et 0.6.** À notre avis, Solidity 0.5 est plus sécurisé et intègre de meilleures pratiques que la version 0.4. Solidity 0.6 s'est révélée trop instable pour la production et a besoin de temps pour se développer.
+- **Utilisez une version stable pour la compilation ; utilisez la dernière version pour vérifier les avertissements.** Vérifiez que votre code ne présente aucun problème signalé avec la dernière version du compilateur. Cependant, Solidity a un cycle de publication rapide et un historique de bogues du compilateur, nous ne recommandons donc pas la dernière version pour le déploiement (voir la [recommandation de version solc](https://github.com/crytic/slither/wiki/Detector-Documentation#recommendation-33) de Slither).
+- **N'utilisez pas l'assembly en ligne.** L'assembly nécessite une expertise de l'EVM. N'écrivez pas de code EVM si vous ne _maîtrisez_ pas le Livre jaune.
## Directives de déploiement {#deployment-guidelines}
Une fois le contrat développé et déployé :
-- **Surveillez vos contrats.** Surveillez les logs et soyez prêt à réagir en cas de contrat ou de portefeuille compromis.
-- **Ajoutez vos informations de contact à [blockchain-security-contacts](https://github.com/crytic/blockchain-security-contacts).** Cette liste aide des tiers à vous contacter si une faille de sécurité est découverte.
-- **Sécurisez les portefeuilles d'utilisateurs privilégiés.** Suivez nos [meilleures pratiques](https://blog.trailofbits.com/2018/11/27/10-rules-for-the-secure-use-of-cryptocurrency-hardware-wallets/) si vous stockez des clés dans des hardware wallets.
-- **Ayez une réponse au plan d'incident.** Considérez que vos contrats intelligents peuvent être compromis. Même si vos contrats sont exempts de bogues, un attaquant peut prendre le contrôle des clés du propriétaire du contrat.
+- **Surveillez vos contrats.** Surveillez les journaux et soyez prêt à réagir en cas de compromission d'un contrat ou d'un portefeuille.
+- **Ajoutez vos coordonnées à [blockchain-security-contacts](https://github.com/crytic/blockchain-security-contacts).** Cette liste aide les tierces parties à vous contacter si une faille de sécurité est découverte.
+- **Sécurisez les portefeuilles des utilisateurs à privilèges.** Suivez nos [meilleures pratiques](https://blog.trailofbits.com/2018/11/27/10-rules-for-the-secure-use-of-cryptocurrency-hardware-wallets/) si vous stockez des clés dans des portefeuilles matériels.
+- **Ayez un plan d'intervention en cas d'incident.** Tenez compte du fait que vos contrats intelligents peuvent être compromis. Même si vos contrats sont exempts de bogues, un attaquant peut prendre le contrôle des clés du propriétaire du contrat.
diff --git a/public/content/translations/fr/developers/tutorials/stealth-addr/index.md b/public/content/translations/fr/developers/tutorials/stealth-addr/index.md
new file mode 100644
index 00000000000..b84c3087e17
--- /dev/null
+++ b/public/content/translations/fr/developers/tutorials/stealth-addr/index.md
@@ -0,0 +1,443 @@
+---
+title: "Utilisation des adresses furtives"
+description: "Les adresses furtives permettent aux utilisateurs de transférer des actifs de manière anonyme. Après avoir lu cet article, vous serez en mesure de : expliquer ce que sont les adresses furtives et comment elles fonctionnent, comprendre comment utiliser les adresses furtives d'une manière qui préserve l'anonymat et écrire une application web qui utilise des adresses furtives."
+author: Ori Pomerantz
+tags:
+ [
+ "Adresse furtive",
+ "confidentialité",
+ "cryptographie",
+ "rust",
+ "wasm"
+ ]
+skill: intermediate
+published: 2025-11-30
+lang: fr
+sidebarDepth: 3
+---
+
+Vous êtes Bill. Pour des raisons que nous n'aborderons pas, vous voulez faire un don à la campagne "Alice pour la Reine du Monde" et que Alice sache que vous avez fait un don afin qu'elle vous récompense si elle gagne. Malheureusement, sa victoire n'est pas garantie. Il existe une campagne concurrente, "Carol pour l'Impératrice du Système solaire". Si Carol gagne et qu'elle découvre que vous avez fait un don à Alice, vous aurez des ennuis. Vous ne pouvez donc pas simplement transférer 200 ETH de votre compte à celui d'Alice.
+
+[ERC-5564](https://eips.ethereum.org/EIPS/eip-5564) apporte la solution. Cet ERC explique comment utiliser les [adresses furtives](https://nerolation.github.io/stealth-utils) pour un transfert anonyme.
+
+**Avertissement** : La cryptographie derrière les adresses furtives est, à notre connaissance, solide. Cependant, il existe des attaques potentielles par canal auxiliaire. [Ci-dessous](#go-wrong), vous verrez ce que vous pouvez faire pour réduire ce risque.
+
+## Comment fonctionnent les adresses furtives {#how}
+
+Cet article tentera d'expliquer les adresses furtives de deux manières. La première est [comment les utiliser](#how-use). Cette partie est suffisante pour comprendre le reste de l'article. Ensuite, il y a [une explication des mathématiques sous-jacentes](#how-math). Si la cryptographie vous intéresse, lisez également cette partie.
+
+### La version simple (comment utiliser les adresses furtives) {#how-use}
+
+Alice crée deux clés privées et publie les clés publiques correspondantes (qui peuvent être combinées en une seule méta-adresse de double longueur). Bill crée également une clé privée et publie la clé publique correspondante.
+
+En utilisant la clé publique d'une partie et la clé privée de l'autre, vous pouvez dériver un secret partagé connu uniquement d'Alice et de Bill (il ne peut pas être dérivé des seules clés publiques). À l'aide de ce secret partagé, Bill obtient l'adresse furtive et peut y envoyer des actifs.
+
+Alice obtient également l'adresse à partir du secret partagé, mais comme elle connaît les clés privées des clés publiques qu'elle a publiées, elle peut également obtenir la clé privée qui lui permet de retirer des fonds de cette adresse.
+
+### Les mathématiques (pourquoi les adresses furtives fonctionnent de cette manière) {#how-math}
+
+Les adresses furtives standard utilisent la [cryptographie sur les courbes elliptiques (ECC)](https://blog.cloudflare.com/a-relatively-easy-to-understand-primer-on-elliptic-curve-cryptography/#elliptic-curves-building-blocks-of-a-better-trapdoor) pour obtenir de meilleures performances avec moins de bits de clé, tout en conservant le même niveau de sécurité. Mais pour la plupart, nous pouvons ignorer cela et prétendre que nous utilisons l'arithmétique ordinaire.
+
+Il y a un nombre que tout le monde connaît, _G_. Vous pouvez multiplier par _G_. Mais en raison de la nature de l'ECC, il est pratiquement impossible de diviser par _G_. La façon dont la cryptographie à clé publique fonctionne généralement dans Ethereum est que vous pouvez utiliser une clé privée, _Ppriv _, pour signer des transactions qui sont ensuite vérifiées par une clé publique, _Ppub = GPpriv _.
+
+Alice crée deux clés privées, _Kpriv _ et _Vpriv _. _Kpriv _ sera utilisée pour dépenser l'argent de l'adresse furtive, et _Vpriv _ pour voir les adresses qui appartiennent à Alice. Alice publie ensuite les clés publiques : _Kpub = GKpriv _ et _Vpub = GVpriv _
+
+Bill crée une troisième clé privée, _Rpriv _, et publie _Rpub = GRpriv _ dans un registre central (Bill aurait pu aussi l'envoyer à Alice, mais nous supposons que Carol écoute).
+
+Bill calcule _Rpriv Vpub = GRpriv Vpriv _, ce qu'il s'attend à ce qu'Alice sache aussi (expliqué ci-dessous). Cette valeur est appelée _S_, le secret partagé. Ceci donne à Bill une clé publique, _Ppub = Kpub +G\*hachage(S)_. À partir de cette clé publique, il peut calculer une adresse et y envoyer toutes les ressources qu'il souhaite. À l'avenir, si Alice gagne, Bill peut lui communiquer _Rpriv _ pour prouver que les ressources proviennent de lui.
+
+Alice calcule _Rpub Vpriv = GRpriv Vpriv _. Ceci lui donne le même secret partagé, _S_. Comme elle connaît la clé privée, _Kpriv _, elle peut calculer _Ppriv = Kpriv +hachage(S)_. Cette clé lui permet d'accéder aux actifs dans l'adresse qui résulte de _Ppub = GPpriv = GKpriv +G\*hachage(S) = Kpub +G\*hachage(S)_.
+
+Nous avons une clé de visualisation distincte pour permettre à Alice de sous-traiter aux services de campagne de domination mondiale de Dave. Alice est prête à faire connaître à Dave les adresses publiques et à l'informer lorsque plus d'argent est disponible, mais elle ne veut pas qu'il dépense l'argent de sa campagne.
+
+Parce que la visualisation et la dépense utilisent des clés distinctes, Alice peut donner à Dave _Vpriv _. Alors Dave peut calculer _S = Rpub Vpriv = GRpriv Vpriv _ et de cette façon obtenir les clés publiques (_Ppub = Kpub +G\*hachage(S)_). Mais sans _Kpriv _, Dave ne peut pas obtenir la clé privée.
+
+Pour résumer, voici les valeurs connues des différents participants.
+
+| Alice | Publié | Bill | Dave | |
+| ------------------------------------------------------------------------- | ----------------- | ------------------------------------------------------------------------- | --------------------------------------------------------------------------- | ----------------------------------------------- |
+| G | G | G | G | |
+| _Kpriv _ | – | – | – | |
+| _Vpriv _ | – | – | _Vpriv _ | |
+| _Kpub = GKpriv _ | _Kpub _ | _Kpub _ | _Kpub _ | |
+| _Vpub = GVpriv _ | _Vpub _ | _Vpub _ | _Vpub _ | |
+| – | – | _Rpriv _ | – | |
+| _Rpub _ | _Rpub _ | _Rpub = GRpriv _ | _Rpub _ | |
+| _S = Rpub Vpriv = GRpriv Vpriv _ | – | _S = Rpriv Vpub = GRpriv Vpriv _ | _S = _Rpub Vpriv _ = GRpriv Vpriv _ | |
+| _Ppub = Kpub +G\*hachage(S)_ | – | _Ppub = Kpub +G\*hachage(S)_ | _Ppub = Kpub +G\*hachage(S)_ | |
+| _Adresse=f(Ppub )_ | – | _Adresse=f(Ppub )_ | _Adresse=f(Ppub )_ | _Adresse=f(Ppub )_ |
+| _Ppriv = Kpriv +hachage(S)_ | – | – | – | |
+
+## Quand les adresses furtives tournent mal {#go-wrong}
+
+_Il n'y a pas de secrets sur la blockchain_. Bien que les adresses furtives puissent vous offrir une certaine confidentialité, cette confidentialité est sensible à l'analyse du trafic. Pour prendre un exemple trivial, imaginez que Bill finance une adresse et envoie immédiatement une transaction pour publier une valeur _Rpub _. Sans le _Vpriv _ d'Alice, nous ne pouvons pas être sûrs qu'il s'agit d'une adresse furtive, mais c'est le pari à faire. Ensuite, nous voyons une autre transaction qui transfère tous les ETH de cette adresse vers l'adresse du fonds de campagne d'Alice. Nous ne pourrons peut-être pas le prouver, mais il est probable que Bill vient de faire un don à la campagne d'Alice. Carol le penserait certainement.
+
+Il est facile pour Bill de séparer la publication de _Rpub _ du financement de l'adresse furtive (en les faisant à des moments différents, à partir d'adresses différentes). Cependant, cela est insuffisant. Le schéma que Carol recherche est que Bill finance une adresse, et qu'ensuite le fonds de campagne d'Alice retire des fonds de celle-ci.
+
+Une solution consiste à ce que la campagne d'Alice ne retire pas l'argent directement, mais l'utilise pour payer un tiers. Si la campagne d'Alice envoie 10 ETH aux services de campagne de domination mondiale de Dave, Carol sait seulement que Bill a fait un don à l'un des clients de Dave. Si Dave a suffisamment de clients, Carol ne serait pas en mesure de savoir si Bill a fait un don à Alice, qui est sa concurrente, ou à Adam, Albert ou Abigail dont Carol se moque. Alice peut inclure une valeur de hachage avec le paiement, puis fournir à Dave la pré-image, pour prouver que c'était bien son don. Alternativement, comme indiqué ci-dessus, si Alice donne à Dave son _Vpriv _, il sait déjà de qui provient le paiement.
+
+Le principal problème de cette solution est qu'elle exige qu'Alice se soucie du secret alors que ce secret profite à Bill. Alice peut vouloir maintenir sa réputation afin que l'ami de Bill, Bob, fasse également un don. Mais il est aussi possible qu'elle n'hésite pas à dénoncer Bill, car il aura alors peur de ce qui arrivera si Carol gagne. Bill pourrait finir par apporter encore plus de soutien à Alice.
+
+### Utilisation de plusieurs couches furtives {#multi-layer}
+
+Au lieu de compter sur Alice pour préserver la vie privée de Bill, Bill peut le faire lui-même. Il peut générer plusieurs méta-adresses pour des personnages de fiction, Bob et Bella. Bill envoie ensuite des ETH à Bob, et « Bob » (qui est en fait Bill) les envoie à Bella. « Bella » (également Bill) les envoie à Alice.
+
+Carol peut toujours faire une analyse du trafic et voir le pipeline Bill-Bob-Bella-Alice. Cependant, si « Bob » et « Bella » utilisent également des ETH à d'autres fins, il n'apparaîtra pas que Bill ait transféré quoi que ce soit à Alice, même si Alice retire immédiatement de l'adresse furtive vers l'adresse connue de sa campagne.
+
+## Écrire une application d'adresse furtive {#write-app}
+
+Cet article explique une application d'adresse furtive [disponible sur GitHub](https://github.com/qbzzt/251022-stealth-addresses.git).
+
+### Outils {#tools}
+
+Il existe [une bibliothèque d'adresses furtives typescript](https://github.com/ScopeLift/stealth-address-sdk) que nous pourrions utiliser. Cependant, les opérations cryptographiques peuvent être gourmandes en ressources de l'unité centrale. Je préfère les implémenter dans un langage compilé, tel que [Rust](https://rust-lang.org/), et utiliser [WASM](https://webassembly.org/) pour exécuter le code dans le navigateur.
+
+Nous allons utiliser [Vite](https://vite.dev/) et [React](https://react.dev/). Ce sont des outils standard de l'industrie ; si vous ne les connaissez pas, vous pouvez utiliser [ce tutoriel](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/). Pour utiliser Vite, nous avons besoin de Node.
+
+### Voir les adresses furtives en action {#in-action}
+
+1. Installez les outils nécessaires : [Rust](https://rust-lang.org/tools/install/) et [Node](https://nodejs.org/en/download).
+
+2. Clonez le dépôt GitHub.
+
+ ```sh
+ git clone https://github.com/qbzzt/251022-stealth-addresses.git
+ cd 251022-stealth-addresses
+ ```
+
+3. Installez les prérequis et compilez le code Rust.
+
+ ```sh
+ cd src/rust-wasm
+ rustup target add wasm32-unknown-unknown
+ cargo install wasm-pack
+ wasm-pack build --target web
+ ```
+
+4. Démarrez le serveur web.
+
+ ```sh
+ cd ../..
+ npm install
+ npm run dev
+ ```
+
+5. Accédez à [l'application](http://localhost:5173/). Cette page d'application comporte deux cadres : l'un pour l'interface utilisateur d'Alice et l'autre pour celle de Bill. Les deux cadres ne communiquent pas ; ils ne sont sur la même page que pour des raisons de commodité.
+
+6. En tant qu'Alice, cliquez sur **Generate a Stealth Meta-Address**. Cela affichera la nouvelle adresse furtive et les clés privées correspondantes. Copiez la méta-adresse furtive dans le presse-papiers.
+
+7. En tant que Bill, collez la nouvelle méta-adresse furtive et cliquez sur **Generate an address**. Cela vous donne l'adresse à financer pour Alice.
+
+8. Copiez l'adresse et la clé publique de Bill et collez-les dans la zone "Clé privée pour l'adresse générée par Bill" de l'interface utilisateur d'Alice. Une fois ces champs remplis, vous verrez la clé privée pour accéder aux actifs à cette adresse.
+
+9. Vous pouvez utiliser [un calculateur en ligne](https://iancoleman.net/ethereum-private-key-to-address/) pour vous assurer que la clé privée correspond à l'adresse.
+
+### Comment le programme fonctionne {#how-the-program-works}
+
+#### Le composant WASM {#wasm}
+
+Le code source qui se compile en WASM est écrit en [Rust](https://rust-lang.org/). Vous pouvez le voir dans [`src/rust_wasm/src/lib.rs`](https://github.com/qbzzt/251022-stealth-addresses/blob/main/src/rust-wasm/src/lib.rs). Ce code est principalement une interface entre le code JavaScript et [la bibliothèque `eth-stealth-addresses`](https://github.com/kassandraoftroy/eth-stealth-addresses).
+
+**`Cargo.toml`**
+
+[`Cargo.toml`](https://doc.rust-lang.org/cargo/reference/manifest.html) en Rust est analogue à [`package.json`](https://docs.npmjs.com/cli/v9/configuring-npm/package-json) en JavaScript. Il contient les informations sur le paquet, les déclarations de dépendance, etc.
+
+```toml
+[package]
+name = "rust-wasm"
+version = "0.1.0"
+edition = "2024"
+
+[dependencies]
+eth-stealth-addresses = "0.1.0"
+hex = "0.4.3"
+wasm-bindgen = "0.2.104"
+getrandom = { version = "0.2", features = ["js"] }
+```
+
+Le paquet [`getrandom`](https://docs.rs/getrandom/latest/getrandom/) doit générer des valeurs aléatoires. Cela ne peut pas être fait par des moyens purement algorithmiques ; cela nécessite l'accès à un processus physique comme source d'entropie. Cette définition spécifie que nous obtiendrons cette entropie en interrogeant le navigateur dans lequel nous nous exécutons.
+
+```toml
+console_error_panic_hook = "0.1.7"
+```
+
+[Cette bibliothèque](https://docs.rs/console_error_panic_hook/latest/console_error_panic_hook/) nous donne des messages d'erreur plus significatifs lorsque le code WASM panique et ne peut pas continuer.
+
+```toml
+[lib]
+crate-type = ["cdylib", "rlib"]
+```
+
+Le type de sortie requis pour produire du code WASM.
+
+**`lib.rs`**
+
+Ceci est le vrai code Rust.
+
+```rust
+use wasm_bindgen::prelude::*;
+```
+
+Les définitions pour créer un paquet WASM à partir de Rust. Elles sont documentées [ici](https://wasm-bindgen.github.io/wasm-bindgen/reference/attributes/index.html).
+
+```rust
+use eth_stealth_addresses::{
+ generate_stealth_meta_address,
+ generate_stealth_address,
+ compute_stealth_key
+};
+```
+
+Les fonctions dont nous avons besoin de [la bibliothèque `eth-stealth-addresses`](https://github.com/kassandraoftroy/eth-stealth-addresses).
+
+```rust
+use hex::{decode,encode};
+```
+
+Rust utilise généralement des [tableaux](https://doc.rust-lang.org/std/primitive.array.html) d'octets (`[u8; ]`) pour les valeurs. Mais en JavaScript, nous utilisons généralement des chaînes de caractères hexadécimales. [La bibliothèque `hex`](https://docs.rs/hex/latest/hex/) traduit pour nous d'une représentation à l'autre.
+
+```rust
+#[wasm_bindgen]
+```
+
+Générer des liaisons WASM pour pouvoir appeler cette fonction depuis JavaScript.
+
+```rust
+pub fn wasm_generate_stealth_meta_address() -> String {
+```
+
+La manière la plus simple de renvoyer un objet avec plusieurs champs est de renvoyer une chaîne JSON.
+
+```rust
+ let (address, spend_private_key, view_private_key) =
+ generate_stealth_meta_address();
+```
+
+La [`generate_stealth_meta_address`](https://docs.rs/eth-stealth-addresses/latest/eth_stealth_addresses/fn.generate_stealth_meta_address.html) renvoie trois champs :
+
+- La méta-adresse (_Kpub _ et _Vpub _)
+- La clé privée de visualisation (_Vpriv _)
+- La clé privée de dépense (_Kpriv _)
+
+La syntaxe [tuple](https://doc.rust-lang.org/std/primitive.tuple.html) nous permet de séparer à nouveau ces valeurs.
+
+```rust
+ format!("{{\"address\":\"{}\",\"view_private_key\":\"{}\",\"spend_private_key\":\"{}\"}}",
+ encode(address),
+ encode(view_private_key),
+ encode(spend_private_key)
+ )
+}
+```
+
+Utilisez la macro [`format!`](https://doc.rust-lang.org/std/fmt/index.html) pour générer la chaîne codée en JSON. Utilisez [`hex::encode`](https://docs.rs/hex/latest/hex/fn.encode.html) pour transformer les tableaux en chaînes hexadécimales.
+
+```rust
+fn str_to_array(s: &str) -> Option<[u8; N]> {
+```
+
+Cette fonction transforme une chaîne hexadécimale (fournie par JavaScript) en un tableau d'octets. Nous l'utilisons pour analyser les valeurs fournies par le code JavaScript. Cette fonction est compliquée en raison de la façon dont Rust gère les tableaux et les vecteurs.
+
+L'expression `` est appelée une [générique](https://doc.rust-lang.org/book/ch10-01-syntax.html). `N` est un paramètre qui contrôle la longueur du tableau retourné. La fonction est en fait appelée `str_to_array::`, où `n` est la longueur du tableau.
+
+La valeur de retour est `Option<[u8; N]>`, ce qui signifie que le tableau retourné est [facultatif](https://doc.rust-lang.org/std/option/). C'est un modèle typique en Rust pour les fonctions qui peuvent échouer.
+
+Par exemple, si nous appelons `str_to_array::10("bad060a7")`, la fonction est censée renvoyer un tableau de dix valeurs, mais l'entrée n'est que de quatre octets. La fonction doit échouer, et elle le fait en renvoyant `None`. La valeur de retour pour `str_to_array::4("bad060a7")` serait `Some<[0xba, 0xd0, 0x60, 0xa7]>`.
+
+```rust
+ // decode renvoie Result, _>
+ let vec = decode(s).ok()?;
+```
+
+La fonction [`hex::decode`](https://docs.rs/hex/latest/hex/fn.decode.html) renvoie un `Result, FromHexError>`. Le type [`Result`](https://doc.rust-lang.org/std/result/) peut contenir soit un résultat réussi (`Ok(valeur)`) soit une erreur (`Err(erreur)`).
+
+La méthode `.ok()` transforme le `Result` en une `Option`, dont la valeur est soit la valeur `Ok()` en cas de succès, soit `None` dans le cas contraire. Enfin, [l'opérateur point d'interrogation](https://doc.rust-lang.org/std/option/#the-question-mark-operator-) interrompt les fonctions actuelles et renvoie un `None` si l'`Option` est vide. Sinon, il déballe la valeur et la renvoie (dans ce cas, pour assigner une valeur à `vec`).
+
+Cela ressemble à une méthode étrangement alambiquée pour gérer les erreurs, mais `Result` et `Option` garantissent que toutes les erreurs sont gérées, d'une manière ou d'une autre.
+
+```rust
+ if vec.len() != N { return None; }
+```
+
+Si le nombre d'octets est incorrect, c'est un échec, et nous retournons `None`.
+
+```rust
+ // try_into consomme vec et tente de créer [u8; N]
+ let array: [u8; N] = vec.try_into().ok()?;
+```
+
+Rust a deux types de tableaux. Les [tableaux](https://doc.rust-lang.org/std/primitive.array.html) ont une taille fixe. Les [vecteurs](https://doc.rust-lang.org/std/vec/index.html) peuvent s'agrandir et se réduire. `hex::decode` renvoie un vecteur, mais la bibliothèque `eth_stealth_addresses` veut recevoir des tableaux. [`.try_into()`](https://doc.rust-lang.org/std/convert/trait.TryInto.html#required-methods) convertit une valeur en un autre type, par exemple, un vecteur en un tableau.
+
+```rust
+ Some(array)
+}
+```
+
+Rust ne vous oblige pas à utiliser le mot-clé [`return`](https://doc.rust-lang.org/std/keyword.return.html) lorsque vous retournez une valeur à la fin d'une fonction.
+
+```rust
+#[wasm_bindgen]
+pub fn wasm_generate_stealth_address(stealth_address: &str) -> Option {
+```
+
+Cette fonction reçoit une méta-adresse publique, qui inclut à la fois _Vpub _ et _Kpub _. Elle renvoie l'adresse furtive, la clé publique à publier (_Rpub _), et une valeur d'analyse d'un octet qui accélère l'identification des adresses publiées qui peuvent appartenir à Alice.
+
+La valeur de l'analyse fait partie du secret partagé (_S = GRpriv Vpriv _). Cette valeur est disponible pour Alice, et sa vérification est beaucoup plus rapide que de vérifier si _f(Kpub +G\*hachage(S))_ est égal à l'adresse publiée.
+
+```rust
+ let (address, r_pub, scan) =
+ generate_stealth_address(&str_to_array::<66>(stealth_address)?);
+```
+
+Nous utilisons la fonction [`generate_stealth_address`](https://docs.rs/eth-stealth-addresses/latest/eth_stealth_addresses/fn.generate_stealth_address.html) de la bibliothèque.
+
+```rust
+ format!("{{\"address\":\"{}\",\"rPub\":\"{}\",\"scan\":\"{}\"}}",
+ encode(address),
+ encode(r_pub),
+ encode(&[scan])
+ ).into()
+}
+```
+
+Préparer la chaîne de sortie codée en JSON.
+
+```rust
+#[wasm_bindgen]
+pub fn wasm_compute_stealth_key(
+ address: &str,
+ bill_pub_key: &str,
+ view_private_key: &str,
+ spend_private_key: &str
+) -> Option {
+ .
+ .
+ .
+}
+```
+
+Cette fonction utilise la fonction [`compute_stealth_key`](https://docs.rs/eth-stealth-addresses/latest/eth_stealth_addresses/fn.compute_stealth_key.html) de la bibliothèque pour calculer la clé privée permettant de retirer des fonds de l'adresse (_Rpriv _). Ce calcul nécessite ces valeurs :
+
+- L'adresse (_Adresse=f(Ppub )_)
+- La clé publique générée par Bill (_Rpub _)
+- La clé privée de visualisation (_Vpriv _)
+- La clé privée de dépense (_Kpriv _)
+
+```rust
+#[wasm_bindgen(start)]
+```
+
+[`#[wasm_bindgen(start)]`](https://wasm-bindgen.github.io/wasm-bindgen/reference/attributes/on-rust-exports/start.html) spécifie que la fonction est exécutée lorsque le code WASM est initialisé.
+
+```rust
+pub fn main() {
+ console_error_panic_hook::set_once();
+}
+```
+
+Ce code spécifie que la sortie de la panique soit envoyée à la console JavaScript. Pour le voir en action, utilisez l'application et donnez à Bill une méta-adresse invalide (il suffit de changer un chiffre hexadécimal). Vous verrez cette erreur dans la console JavaScript :
+
+```
+rust_wasm.js:236 panicked at /home/ori/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/subtle-2.6.1/src/lib.rs:701:9:
+assertion `left == right` failed
+ left: 0
+ right: 1
+```
+
+Suivi d'une trace de la pile d'exécution. Donnez ensuite à Bill la méta-adresse valide, et à Alice une adresse ou une clé publique invalide. Vous verrez cette erreur :
+
+```
+rust_wasm.js:236 panicked at /home/ori/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/eth-stealth-addresses-0.1.0/src/lib.rs:78:9:
+keys do not generate stealth address
+```
+
+Encore une fois, suivi d'une trace de pile.
+
+#### L'interface utilisateur {#ui}
+
+L'interface utilisateur est écrite en utilisant [React](https://react.dev/) et servie par [Vite](https://vite.dev/). Vous pouvez en apprendre davantage sur eux en utilisant [ce tutoriel](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/). Il n'y a pas besoin de [WAGMI](https://wagmi.sh/) ici car nous n'interagissons pas directement avec une blockchain ou un portefeuille.
+
+La seule partie non évidente de l'interface utilisateur est la connectivité WASM. Voici comment ça marche.
+
+**`vite.config.js`**
+
+Ce fichier contient [la configuration de Vite](https://vite.dev/config/).
+
+```js
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react'
+import wasm from "vite-plugin-wasm";
+
+// https://vite.dev/config/
+export default defineConfig({
+ plugins: [react(), wasm()],
+})
+```
+
+Nous avons besoin de deux plugins Vite : [react](https://www.npmjs.com/package/@vitejs/plugin-react) et [wasm](https://github.com/Menci/vite-plugin-wasm#readme).
+
+**`App.jsx`**
+
+Ce fichier est le composant principal de l'application. C'est un conteneur qui inclut deux composants : `Alice` et `Bill`, les interfaces utilisateur pour ces utilisateurs. La partie pertinente pour WASM est le code d'initialisation.
+
+```jsx
+import init from './rust-wasm/pkg/rust_wasm.js'
+```
+
+Lorsque nous utilisons [`wasm-pack`](https://rustwasm.github.io/docs/wasm-pack/), il crée deux fichiers que nous utilisons ici : un fichier wasm avec le code réel (ici, `src/rust-wasm/pkg/rust_wasm_bg.wasm`) et un fichier JavaScript avec les définitions pour l'utiliser (ici, `src/rust_wasm/pkg/rust_wasm.js`). L'exportation par défaut de ce fichier JavaScript est le code qui doit être exécuté pour initialiser WASM.
+
+```jsx
+function App() {
+ .
+ .
+ .
+ useEffect(() => {
+ const loadWasm = async () => {
+ try {
+ await init();
+ setWasmReady(true)
+ } catch (err) {
+ console.error('Error loading wasm:', err)
+ alert("Wasm error: " + err)
+ }
+ }
+
+ loadWasm()
+ }, []
+ )
+```
+
+Le [hook `useEffect`](https://react.dev/reference/react/useEffect) vous permet de spécifier une fonction qui s'exécute lorsque les variables d'état changent. Ici, la liste des variables d'état est vide (`[]`), donc cette fonction n'est exécutée qu'une seule fois lorsque la page se charge.
+
+La fonction d'effet doit retourner immédiatement. Pour utiliser du code asynchrone, tel que le `init` de WASM (qui doit charger le fichier `.wasm` et prend donc du temps), nous définissons une fonction interne [`async`](https://en.wikipedia.org/wiki/Async/await) et l'exécutons sans `await`.
+
+**`Bill.jsx`**
+
+C'est l'interface utilisateur pour Bill. Elle a une seule action, créer une adresse basée sur la méta-adresse furtive fournie par Alice.
+
+```jsx
+import { wasm_generate_stealth_address } from './rust-wasm/pkg/rust_wasm.js'
+```
+
+En plus de l'exportation par défaut, le code JavaScript généré par `wasm-pack` exporte une fonction pour chaque fonction dans le code WASM.
+
+```jsx
+ {
+ setPublicAddress(JSON.parse(wasm_generate_stealth_address(stealthMetaAddress)))
+ }}>
+```
+
+Pour appeler les fonctions WASM, il suffit d'appeler la fonction exportée par le fichier JavaScript créé par `wasm-pack`.
+
+**`Alice.jsx`**
+
+Le code dans `Alice.jsx` est analogue, sauf qu'Alice a deux actions :
+
+- Générer une méta-adresse
+- Obtenir la clé privée pour une adresse publiée par Bill
+
+## Conclusion {#conclusion}
+
+Les adresses furtives ne sont pas la panacée ; elles doivent être [utilisées correctement](#go-wrong). Mais lorsqu'elles sont utilisées correctement, elles peuvent permettre la confidentialité sur une blockchain publique.
+
+[Voir ici pour plus de mon travail](https://cryptodocguy.pro/).
\ No newline at end of file
diff --git a/public/content/translations/fr/developers/tutorials/testing-erc-20-tokens-with-waffle/index.md b/public/content/translations/fr/developers/tutorials/testing-erc-20-tokens-with-waffle/index.md
index 88a567b45fd..3e992f41c33 100644
--- a/public/content/translations/fr/developers/tutorials/testing-erc-20-tokens-with-waffle/index.md
+++ b/public/content/translations/fr/developers/tutorials/testing-erc-20-tokens-with-waffle/index.md
@@ -1,6 +1,6 @@
---
title: Tester les jetons ERC-20 avec Waffle
-description: Découvrez comment tester les contrats intelligents Solidity et utiliser des correspondances de contrats intelligents avec Waffle.
+description: "Découvrez comment tester les contrats intelligents Solidity et utiliser des correspondances de contrats intelligents avec Waffle."
author: Vladislav Starostenko
tags:
- "waffle"
diff --git a/public/content/translations/fr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/fr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md
index a3bc9c409bc..abf644d2e28 100644
--- a/public/content/translations/fr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md
+++ b/public/content/translations/fr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md
@@ -1,26 +1,27 @@
---
-title: "The Graph : Résoudre le problème des requêtes de données du Web3"
-description: La blockchain est comme une base de données mais sans SQL. Toutes les données y sont présentes mais aucun moyen d'y accéder. Laissez-moi vous montrer comment résoudre cela avec The Graph et GraphQL.
+title: "The Graph : résoudre les problèmes de requêtes de données Web3"
+description: "La blockchain est comme une base de données mais sans SQL. Toutes les données y sont présentes mais il n'y a aucun moyen d'y accéder. Laissez-moi vous montrer comment résoudre cela avec The Graph et GraphQL."
author: Markus Waas
lang: fr
tags:
- - "solidity"
- - "contrats intelligents"
- - "requêtes"
- - "the graph"
- - "create-eth-app"
- - "react"
+ [
+ "solidité",
+ "contrats intelligents",
+ "requêtes",
+ "the graph",
+ "react"
+ ]
skill: intermediate
published: 2020-09-06
source: soliditydeveloper.com
sourceUrl: https://soliditydeveloper.com/thegraph
---
-Nous allons nous intéresser de plus près à The Graph qui, depuis l'année dernière, fait essentiellement partie intégrante du stack standard pour le développement de dApps. Voyons d'abord comment nous ferions les choses de façon traditionnelle...
+Cette fois, nous allons nous intéresser de plus près à The Graph, qui est devenu au cours de l'année dernière un élément essentiel du stack standard pour le développement de dapps. Voyons d'abord comment nous ferions les choses de façon traditionnelle...
## Sans The Graph... {#without-the-graph}
-Prenons donc un exemple simple à titre d'illustration. Nous aimons tous les jeux, alors imaginez un jeu simple avec des utilisateurs qui placent des paris :
+Prenons donc un exemple simple à titre d'illustration. Nous aimons tous les jeux, alors imaginez un jeu simple avec des utilisateurs qui placent des paris :
```solidity
pragma solidity 0.7.1;
@@ -35,7 +36,7 @@ contract Game {
if (hasWon) {
(bool success, ) = msg.sender.call{ value: msg.value * 2 }('');
- require(success, "Transfer failed");
+ require(success, "Échec du transfert");
totalGamesPlayerWon++;
} else {
totalGamesPlayerLost++;
@@ -46,90 +47,90 @@ contract Game {
}
```
-Maintenant, disons que dans notre dApp, nous voulons afficher le total des mises, le total des parties perdues/gagnées et également le mettre à jour chaque fois que quelqu'un joue à nouveau. L'approche serait :
+Maintenant, disons que dans notre dapp, nous voulons afficher le total des paris, le total des parties perdues/gagnées et également mettre à jour ces informations chaque fois que quelqu'un joue à nouveau. L'approche serait :
1. Récupérer `totalGamesPlayerWon`.
2. Récupérer `totalGamesPlayerLost`.
3. S'abonner aux événements `BetPlaced`.
-Nous pouvons considérer [l'événement sur Web3](https://docs.web3js.org/api/web3/class/Contract#events) comme indiqué sur la droite, mais cela nécessite de traiter pas mal de cas.
+Nous pouvons écouter l'[événement dans Web3](https://docs.web3js.org/api/web3/class/Contract#events) comme illustré à droite, mais cela nécessite de gérer un certain nombre de cas.
```solidity
GameContract.events.BetPlaced({
fromBlock: 0
}, function(error, event) { console.log(event); })
.on('data', function(event) {
- // event fired
+ // événement déclenché
})
.on('changed', function(event) {
- // event was removed again
+ // l'événement a été retiré
})
.on('error', function(error, receipt) {
- // tx rejected
+ // transaction rejetée
});
```
-C'est plutôt bien pour notre simple exemple. Mais disons que nous voulons maintenant afficher les quantités de paris perdus / gagnés uniquement pour le joueur actuel. Eh bien, pas de chance, vous devriez déployer un nouveau contrat qui stocke ces valeurs et les récupère. Et maintenant, imaginez un contrat intelligent et une dApp beaucoup plus complexes, les choses peuvent se gâter rapidement.
+Cela reste acceptable pour notre exemple simple. Mais disons que nous voulons maintenant afficher les montants des paris perdus/gagnés uniquement pour le joueur actuel. Eh bien, pas de chance, vous feriez mieux de déployer un nouveau contrat qui stocke ces valeurs et les récupère. Et maintenant, imaginez un contrat intelligent et une dapp beaucoup plus complexes, les choses peuvent vite se compliquer.
-
+
-Vous pouvez voir pourquoi ce n'est pas optimal :
+Vous pouvez voir en quoi cette approche n'est pas optimale :
- Ne fonctionne pas pour les contrats déjà déployés.
-- Frais supplémentaires (gaz) pour le stockage de ces valeurs.
+- Coûts de gaz supplémentaires pour stocker ces valeurs.
- Nécessite un autre appel pour récupérer les données d'un nœud Ethereum.
-
+
Voyons maintenant une meilleure solution.
## Laissez-moi vous présenter GraphQL {#let-me-introduce-to-you-graphql}
-Commençons par parler de GraphQL, initialement conçu et implémenté par Facebook. Vous connaissez peut-être le modèle d'API REST traditionnel. Imaginez maintenant que vous puissiez écrire une requête pour obtenir exactement les données que vous voulez :
+Commençons par parler de GraphQL, initialement conçu et implémenté par Facebook. Vous connaissez peut-être le modèle d'API REST traditionnel. Imaginez maintenant que vous puissiez écrire une requête pour obtenir exactement les données que vous voulez :
-
+
-
+
-Ces deux images illustrent bien l'essence de GraphQL. Avec la requête de droite, nous pouvons définir exactement les données que nous voulons. Ainsi, nous récupérons tout en une seule requête et rien de plus que ce dont nous avons exactement besoin. Un serveur GraphQL gère la récupération de toutes les données requises, il est ainsi incroyablement facile à utiliser côté consommateur. [Voici une bonne explication](https://www.apollographql.com/blog/graphql-explained) de la façon dont le serveur gère exactement une requête si vous êtes intéressé.
+Ces deux images illustrent bien l'essence de GraphQL. Avec la requête de droite, nous pouvons définir exactement les données que nous voulons. Ainsi, nous récupérons tout en une seule requête et rien de plus que ce dont nous avons exactement besoin. Un serveur GraphQL gère la récupération de toutes les données requises, ce qui le rend incroyablement facile à utiliser côté frontend. [Voici une bonne explication](https://www.apollographql.com/blog/graphql-explained) de la manière exacte dont le serveur gère une requête, si le sujet vous intéresse.
-Maintenant, avec cette connaissance, parlons enfin de blockchain et de The Graph.
+Maintenant, avec ces connaissances, parlons enfin de la blockchain et de The Graph.
-## Qu'est-ce que The Graph ? {#what-is-the-graph}
+## Qu'est-ce que The Graph ? {#what-is-the-graph}
-Une blockchain est une base de données décentralisée, mais contrairement à ce qui est généralement le cas, nous n'avons pas de langage de requête pour cette base de données. Les solutions pour récupérer les données sont pénibles ou totalement impossibles. The Graph est un protocole décentralisé pour l'indexation et la requête de données blockchain. Et vous l'aurez peut-être deviné, il utilise GraphQL comme langue de requête.
+Une blockchain est une base de données décentralisée, mais contrairement à ce qui est généralement le cas, nous n'avons pas de langage de requête pour cette base de données. Les solutions pour récupérer les données sont pénibles ou totalement impossibles. The Graph est un protocole décentralisé pour l'indexation et l'interrogation des données de la blockchain. Et vous l'aurez peut-être deviné, il utilise GraphQL comme langage de requête.

Rien de tel que quelques exemples pour comprendre une chose, alors utilisons The Graph pour notre exemple de GameContract.
-## Comment créer un Subgraph {#how-to-create-a-subgraph}
+## Comment créer un sous-graphe {#how-to-create-a-subgraph}
-La définition de comment indexer les données est appelée subgraph. Il nécessite trois composants :
+La définition de la manière d'indexer les données s'appelle un sous-graphe. Il nécessite trois composants :
1. Manifeste (`subgraph.yaml`)
2. Schéma (`schema.graphql`)
-3. Mapping (`mapping.ts`)
+3. Mappage (`mapping.ts`)
### Manifeste (`subgraph.yaml`) {#manifest}
-Le manifeste est notre fichier de configuration et définit :
+Le manifeste est notre fichier de configuration et définit :
- quels contrats intelligents indexer (adresse, réseau, ABI...)
-- quels évènements écouter
-- d'autres éléments à prendre en compte comme des appels de fonction ou des blocs
-- les fonctions de mapping étant appelées (voir `mapping.ts` ci-dessous)
+- quels événements écouter
+- d'autres éléments à écouter, comme les appels de fonction ou les blocs
+- les fonctions de mappage qui sont appelées (voir `mapping.ts` ci-dessous)
-Ici, vous pouvez définir plusieurs contrats et handlers. Une configuration typique a un dossier de sous-graphes à l'intérieur du projet Hardhat avec son propre dépôt. Ensuite, vous pouvez facilement référencer l'ABI.
+Ici, vous pouvez définir plusieurs contrats et handlers. Une configuration typique aurait un dossier de sous-graphe à l'intérieur du projet Hardhat avec son propre dépôt. Ensuite, vous pouvez facilement référencer l'ABI.
-Pour des raisons de commodité, vous pouvez également utiliser un outil de template comme Mustache. Ensuite, vous allez créer un template `subgraph.template.yaml` et y insérez les adresses basées sur les derniers déploiements. Pour un exemple plus avancé, vous pouvez consulter le [répertoire de subgraphs Aave](https://github.com/aave/aave-protocol/tree/master/thegraph).
+Pour des raisons de commodité, vous pouvez également utiliser un outil de template comme Mustache. Ensuite, vous créez un fichier `subgraph.template.yaml` et y insérez les adresses en fonction des derniers déploiements. Pour un exemple de configuration plus avancé, voir par exemple le [dépôt du sous-graphe Aave](https://github.com/aave/aave-protocol/tree/master/thegraph).
Et la documentation complète peut être consultée [ici](https://thegraph.com/docs/en/developing/creating-a-subgraph/#the-subgraph-manifest).
```yaml
specVersion: 0.0.1
-description: Placing Bets on Ethereum
-repository: - GitHub link -
+description: Placer des paris sur Ethereum
+repository: - Lien GitHub -
schema:
file: ./schema.graphql
dataSources:
@@ -157,17 +158,17 @@ dataSources:
### Schéma (`schema.graphql`) {#schema}
-Le schéma est la définition des données GraphQL. Il vous permettra de définir quelles entités existent et leurs types. Les types pris en charge par The Graph sont :
+Le schéma est la définition des données GraphQL. Il vous permettra de définir quelles entités existent et leurs types. Les types pris en charge par The Graph sont :
-- Bytes
+- Octets
- ID
-- String (Chaîne de caractères)
+- String
- Boolean
- Int
- BigInt
- BigDecimal
-Vous pouvez également utiliser des entités comme type pour définir des relations. Dans notre exemple, nous définissons une relation « un à plusieurs » pour les paris d'un joueur. Le ! signifie que la valeur ne peut pas être vide. La documentation complète peut être consultée [ici](https://thegraph.com/docs/en/developing/creating-a-subgraph/#the-subgraph-manifest).
+Vous pouvez également utiliser des entités comme type pour définir des relations. Dans notre exemple, nous définissons une relation « un à plusieurs » entre un joueur et ses paris. Le `!` signifie que la valeur ne peut pas être vide. La documentation complète est disponible [ici](https://thegraph.com/docs/en/developing/creating-a-subgraph/#the-subgraph-manifest).
```graphql
type Bet @entity {
@@ -188,15 +189,15 @@ type Player @entity {
### Mappage (`mapping.ts`) {#mapping}
-Le fichier de mapping dans The Graph définit nos fonctions qui transforment les événements entrants en entités. Il est écrit en AssemblyScript, un sous-ensemble de Typescript. Cela signifie qu'il peut être compilé en WASM (WebAssembly) pour une exécution plus efficace et portable du mapping.
+Le fichier de mappage dans The Graph définit nos fonctions qui transforment les événements entrants en entités. Il est écrit en AssemblyScript, un sous-ensemble de Typescript. Cela signifie qu'il peut être compilé en WASM (WebAssembly) pour une exécution plus efficace et portable du mappage.
-Vous devrez définir chaque fonction nommée dans le fichier `subgraph.yaml`. Ainsi dans notre cas, nous n'avons besoin que d'une seule : `handleNewBet`. Nous essayons d'abord de charger l'entité Player depuis l'adresse de l'expéditeur en tant qu'identifiant. Si elle n'existe pas, nous créons une nouvelle entité et la remplissons avec des valeurs de départ.
+Vous devrez définir chaque fonction nommée dans le fichier `subgraph.yaml`, donc dans notre cas, nous n'en avons besoin que d'une seule : `handleNewBet`. Nous essayons d'abord de charger l'entité Player depuis l'adresse de l'expéditeur en tant qu'identifiant. Si elle n'existe pas, nous créons une nouvelle entité et la remplissons avec des valeurs de départ.
-Puis nous créons une nouvelle entité Bet. L'ID pour cela sera `event.transaction.hash.toHex() + "-" + event.logIndex.toString()` assurant toujours une valeur unique. Utiliser uniquement le hachage n'est pas suffisant, car quelqu'un peut appeler la fonction placeBet plusieurs fois dans une transaction via un contrat intelligent.
+Puis nous créons une nouvelle entité Bet. L'identifiant pour cela sera `event.transaction.hash.toHex() + "-" + event.logIndex.toString()` ce qui garantit une valeur toujours unique. Utiliser uniquement le hachage n'est pas suffisant, car quelqu'un peut appeler la fonction placeBet plusieurs fois dans une transaction via un contrat intelligent.
-Enfin, nous pouvons mettre à jour l'entité du Player avec toutes les données. Les tableaux ne peuvent pas être poussés directement, mais doivent être mis à jour comme indiqué ici. Nous utilisons l'ID pour référencer le pari. Et `.save()` est requis à la fin pour stocker une entité.
+Enfin, nous pouvons mettre à jour l'entité Player avec toutes les données. Les tableaux ne peuvent pas être poussés directement, mais doivent être mis à jour comme indiqué ici. Nous utilisons l'ID pour référencer le pari. Et `.save()` est requis à la fin pour stocker une entité.
-La documentation complète est disponible ici : https://thegraph.com/docs/en/developing/creating-a-subgraph/#writing-mappings. Vous pouvez également ajouter une sortie de journalisation au fichier de mapping, voir [ici](https://thegraph.com/docs/en/subgraphs/developing/creating/graph-ts/api/#api-reference).
+La documentation complète est disponible ici : https://thegraph.com/docs/en/developing/creating-a-subgraph/#writing-mappings. Vous pouvez également ajouter une sortie de journalisation au fichier de mappage, voir [ici](https://thegraph.com/docs/en/subgraphs/developing/creating/graph-ts/api/#api-reference).
```typescript
import { Bet, Player } from "../generated/schema"
@@ -206,7 +207,7 @@ export function handleNewBet(event: PlacedBet): void {
let player = Player.load(event.transaction.from.toHex())
if (player == null) {
- // create if doesn't exist yet
+ // créer si elle n'existe pas encore
player = new Player(event.transaction.from.toHex())
player.bets = new Array(0)
player.totalPlayedCount = 0
@@ -229,7 +230,7 @@ export function handleNewBet(event: PlacedBet): void {
player.hasLostCount++
}
- // update array like this
+ // mettre à jour le tableau comme ceci
let bets = player.bets
bets.push(bet.id)
player.bets = bets
@@ -238,12 +239,12 @@ export function handleNewBet(event: PlacedBet): void {
}
```
-## L'utiliser dans le Frontend {#using-it-in-the-frontend}
+## Utilisation dans le frontend {#using-it-in-the-frontend}
-En utilisant quelque chose comme Apollo Boost, vous pouvez facilement intégrer The Graph dans votre dApp React (ou Apollo-Vue). Surtout lorsque vous utilisez des hooks React et Apollo, récupérer des données est aussi simple que d'écrire une requête GraphQL dans votre composant. Une configuration type pourrait ressembler à ceci :
+En utilisant quelque chose comme Apollo Boost, vous pouvez facilement intégrer The Graph dans votre dapp React (ou Apollo-Vue). Surtout lorsque vous utilisez des hooks React et Apollo, récupérer des données est aussi simple que d'écrire une requête GraphQL dans votre composant. Une configuration type pourrait ressembler à ceci :
```javascript
-// See all subgraphs: https://thegraph.com/explorer/
+// Voir tous les sous-graphes : https://thegraph.com/explorer/
const client = new ApolloClient({
uri: "{{ subgraphUrl }}",
})
@@ -256,11 +257,11 @@ ReactDOM.render(
)
```
-Et maintenant, nous pouvons écrire par exemple une requête comme celle-ci. Elle nous retournera :
+Et maintenant, nous pouvons écrire par exemple une requête comme celle-ci. Elle nous récupérera :
- combien de fois l'utilisateur actuel a gagné
- combien de fois l'utilisateur actuel a perdu
-- une liste horodatée de tous ses paris précédents
+- une liste d'horodatages de tous ses paris précédents
Le tout en une seule requête au serveur GraphQL.
@@ -285,29 +286,29 @@ React.useEffect(() => {
}, [loading, error, data])
```
-
+
Mais il nous manque une dernière pièce du puzzle et c'est le serveur. Vous pouvez soit l'exécuter vous-même, soit utiliser le service hébergé.
-## Serveur The Graph {#the-graph-server}
+## Le serveur The Graph {#the-graph-server}
### Graph Explorer : le service hébergé {#graph-explorer-the-hosted-service}
-Le moyen le plus simple est d'utiliser le service hébergé. Suivez les instructions [ici](https://thegraph.com/docs/en/deploying/deploying-a-subgraph-to-hosted/) pour déployer un subgraph. Pour de nombreux projets, vous pouvez trouver des subgraphs existants dans [l'explorateur](https://thegraph.com/explorer/).
+Le moyen le plus simple est d'utiliser le service hébergé. Suivez les instructions [ici](https://thegraph.com/docs/en/deploying/deploying-a-subgraph-to-hosted/) pour déployer un sous-graphe. Pour de nombreux projets, vous pouvez trouver des sous-graphes existants dans l'[explorateur](https://thegraph.com/explorer/).
-
+
### Exécuter votre propre nœud {#running-your-own-node}
-Sinon, vous pouvez faire tourner votre propre nœud. Documentation [ici](https://github.com/graphprotocol/graph-node#quick-start). Une raison d'agir de la sorte peut être d'utiliser un réseau qui n'est pas pris en charge par le service hébergé. Les réseaux actuellement pris en charge [sont disponibles ici](https://thegraph.com/docs/en/developing/supported-networks/).
+Sinon, vous pouvez faire tourner votre propre nœud. La documentation se trouve [ici](https://github.com/graphprotocol/graph-node#quick-start). Une raison d'agir de la sorte peut être d'utiliser un réseau qui n'est pas pris en charge par le service hébergé. Les réseaux actuellement pris en charge [se trouvent ici](https://thegraph.com/docs/en/developing/supported-networks/).
-## Un avenir décentralisé {#the-decentralized-future}
+## L'avenir décentralisé {#the-decentralized-future}
-GraphQL prend également en charge les flux pour les nouveaux événements à venir. Ceux-ci sont pris en charge par The Graph par le biais de [Substreams](https://thegraph.com/docs/en/substreams/) qui est actuellement en version bêta ouverte.
+GraphQL prend également en charge les flux pour les nouveaux événements entrants. Ces derniers sont pris en charge sur The Graph par le biais de [Substreams](https://thegraph.com/docs/en/substreams/), qui sont actuellement en bêta ouverte.
-En [2021](https://thegraph.com/blog/mainnet-migration/), The Graph a commencé sa transition vers un réseau d'indexation décentralisé. Vous pouvez en savoir plus sur l'architecture de ce réseau d'indexation décentralisé [ici](https://thegraph.com/docs/en/network/explorer/).
+En [2021](https://thegraph.com/blog/mainnet-migration/), The Graph a entamé sa transition vers un réseau d'indexation décentralisé. Vous pouvez en savoir plus sur l'architecture de ce réseau d'indexation décentralisé [ici](https://thegraph.com/docs/en/network/explorer/).
-Les deux aspects clés sont :
+Les deux aspects clés sont :
1. Les utilisateurs paient les indexeurs pour les requêtes.
-2. Les indexeurs mettront en jeu des jetons The Graph (GRT).
+2. Les indexeurs mettent en jeu des jetons Graph (GRT).
diff --git a/public/content/translations/fr/developers/tutorials/token-integration-checklist/index.md b/public/content/translations/fr/developers/tutorials/token-integration-checklist/index.md
index 10529fa6b07..5dfd9f786ca 100644
--- a/public/content/translations/fr/developers/tutorials/token-integration-checklist/index.md
+++ b/public/content/translations/fr/developers/tutorials/token-integration-checklist/index.md
@@ -1,84 +1,86 @@
---
-title: Liste des contrôles pour l'intégration de jetons
-description: Une liste des contrôles à réaliser lors d’interactions avec des jetons
+title: "Liste de contrôle pour l'intégration de jetons"
+description: "Une liste de contrôle des points à prendre en compte lors de l'interaction avec des jetons"
author: "Trailofbits"
lang: fr
tags:
- - "solidity"
- - "contrats intelligents"
- - "sécurité"
- - "jetons"
+ [
+ "solidité",
+ "contrats intelligents",
+ "sécurité",
+ "jetons"
+ ]
skill: intermediate
published: 2020-08-13
-source: Créer des contrats sécurisés
+source: Building secure contracts
sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/token_integration.md
---
-Suivez cette liste de contrôle lorsque vous interagissez avec des jetons arbitraires. Assurez-vous de comprendre les risques associés à chaque élément et d'être capable de justifier toutes exceptions à ces règles.
+Suivez cette liste de contrôle lorsque vous interagissez avec des jetons arbitraires. Assurez-vous de bien comprendre les risques associés à chaque élément et de justifier toute exception à ces règles.
-Pour plus de commodité, tous les [services Slither](https://github.com/crytic/slither#tools) peuvent être directement exécutés sur une adresse de jeton, tel que :
+Pour plus de commodité, tous les [utilitaires](https://github.com/crytic/slither#tools) Slither peuvent être exécutés directement sur une adresse de jeton, comme suit :
-[Utilisation du tutoriel Slither](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/)
+[Tutoriel sur l'utilisation de Slither](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/)
```bash
slither-check-erc 0xdac17f958d2ee523a2206206994597c13d831ec7 TetherToken
```
-Pour suivre cette liste de vérification, vous voudrez avoir cette sortie de Slither pour le jeton :
+Pour suivre cette liste de contrôle, vous aurez besoin de cette sortie de Slither pour le jeton :
```bash
- slither-check-erc [target] [contractName] [optional: --erc ERC_NUMBER]
- slither [target] --print human-summary
- slither [target] --print contract-summary
-- slither-prop . --contract ContractName # requires configuration, and use of Echidna and Manticore
+- slither-prop . --contract ContractName # nécessite une configuration et l'utilisation d'Echidna et de Manticore
```
## Considérations générales {#general-considerations}
-- **Le contrat fait l'objet d'un contrôle de sécurité.** Évitez d'interagir avec des contrats qui ne font pas l'objet d'un quelconque contrôle de sécurité. Vérifiez la durée de l'évaluation (c'est-à-dire le « niveau d'effort »), la réputation de la société de sécurité, le nombre et la gravité des découvertes.
-- **Vous avez contacté les développeurs**. Vous devrez peut-être avertir leur équipe d'un incident. Recherchez des contacts appropriés sur[ blockchain-security-contacts](https://github.com/crytic/blockchain-security-contacts).
-- **Ils ont une liste de diffusions de sécurité pour les annonces critiques.** Leur équipe devrait informer les utilisateurs (comme vous !) lorsque des problèmes critiques sont trouvés ou lorsque des mises à jour se produisent.
+- **Le contrat a fait l'objet d'un audit de sécurité.** Évitez d'interagir avec des contrats qui n'ont pas fait l'objet d'un audit de sécurité. Vérifiez la durée de l'évaluation (c'est-à-dire le « niveau d'effort »), la réputation de l'entreprise de sécurité, ainsi que le nombre et la gravité des résultats.
+- **Vous avez contacté les développeurs.** Vous devrez peut-être alerter leur équipe en cas d'incident. Recherchez les contacts appropriés sur [blockchain-security-contacts](https://github.com/crytic/blockchain-security-contacts).
+- **Ils disposent d'une liste de diffusion de sécurité pour les annonces critiques.** Leur équipe doit informer les utilisateurs (comme vous !) lorsque des problèmes critiques sont découverts ou que des mises à jour ont lieu.
## Conformité ERC {#erc-conformity}
-Slither inclut un utilitaire, [slither-check-erc](https://github.com/crytic/slither/wiki/ERC-Conformance), qui vérifie la conformité d'un token à de nombreuses normes ERC connexes. Utilisez slither-check-erc pour vérifier ceci:
+Slither inclut un utilitaire, [slither-check-erc](https://github.com/crytic/slither/wiki/ERC-Conformance), qui examine la conformité d'un jeton à de nombreuses normes ERC connexes. Utilisez slither-check-erc pour vérifier que :
-- **Transfer et transferFrom renvoient un booléen** Plusieurs token ne retournent pas un booléen sur ces fonctions. En conséquence, leurs appels au contrat pourraient échouer.
-- **Le nom, les décimales et les fonctions symbole sont présents si utilisés**. Ces fonctions sont optionnelles dans le standard ERC20 et pourraient ne pas être présentes.
-- **Les décimales retournent un uint8**. Plusieurs tokens retournent incorrectement un uint256. Si c'est le cas, assurez-vous que la valeur retournée est inférieure à 255.
-- **Le jeton atténue les risques connus [Problèmes de concurrence ERC20](https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729).** Le standard ERC20 a un problème de concurrence bien connu qui doit être atténué pour empêcher les attaquants de voler des jetons.
-- **Le jeton n'est pas un jeton ERC777 et n'a pas d'appel de fonction externe dans le transfert et le transferFrom.** Les appels externes dans les fonctions de transfert peuvent conduire à des réentrances.
+- **`transfer` et `transferFrom` renvoient une valeur booléenne.** Plusieurs jetons ne renvoient pas de valeur booléenne sur ces fonctions. Par conséquent, leurs appels dans le contrat pourraient échouer.
+- **Les fonctions `name`, `decimals` et `symbol` sont présentes si elles sont utilisées.** Ces fonctions sont facultatives dans la norme ERC20 et peuvent ne pas être présentes.
+- **`decimals` renvoie un `uint8`.** Plusieurs jetons renvoient incorrectement un `uint256`. Si c'est le cas, assurez-vous que la valeur renvoyée est inférieure à 255.
+- **Le jeton atténue la [condition de concurrence ERC20](https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729) connue.** La norme ERC20 présente une condition de concurrence connue qui doit être atténuée pour empêcher les attaquants de voler des jetons.
+- **Le jeton n'est pas un jeton ERC777 et n'a pas d'appel de fonction externe dans `transfer` et `transferFrom`.** Les appels externes dans les fonctions de transfert peuvent conduire à des réentrances.
-Slither inclut un utilitaire, [slither-popo](https://github.com/crytic/slither/wiki/Property-generation), qui génère des tests unitaires et des propriétés de sécurité qui peuvent découvrir de nombreuses failles ERC courantes. Utilisez slither-pop pour vérifier ceci :
+Slither inclut un utilitaire, [slither-prop](https://github.com/crytic/slither/wiki/Property-generation), qui génère des tests unitaires et des propriétés de sécurité permettant de découvrir de nombreuses failles ERC courantes. Utilisez slither-prop pour vérifier que :
-- **Le contrat passe tous les tests unitaires et propriétés de sécurités de slither-prop.** Exécutez ces tests unitaires générés puis vérifiez les propriétés avec [Echidna](https://github.com/crytic/echidna) et [Manticore](https://manticore.readthedocs.io/en/latest/verifier.html).
+- **Le contrat réussit tous les tests unitaires et les propriétés de sécurité de slither-prop.** Exécutez les tests unitaires générés, puis vérifiez les propriétés avec [Echidna](https://github.com/crytic/echidna) et [Manticore](https://manticore.readthedocs.io/en/latest/verifier.html).
-Enfin, il y a certaines caractéristiques qui sont difficiles à détecter automatiquement. Vérifiez ces conditions manuellement :
+Enfin, certaines caractéristiques sont difficiles à identifier automatiquement. Examinez manuellement ces conditions :
-- **Transfer et transferFrom ne doivent pas prendre de frais.** Les tokens déflationnistes peuvent conduire à des comportements inattendus.
-- **L'intérêt potentiel gagné à partir d'un token est pris en compte.** Certains tokens distribuent des intérêts aux détenteurs de jetons. Cet intérêt pourrait être pris au piège dans un contrat s'il n'est pas pris en compte.
+- **`transfer` et `transferFrom` ne doivent pas prélever de frais.** Les jetons déflationnistes peuvent entraîner un comportement inattendu.
+- **Les intérêts potentiels générés par le jeton sont pris en compte.** Certains jetons distribuent des intérêts aux détenteurs de jetons. Ces intérêts pourraient être bloqués dans le contrat s'ils ne sont pas pris en compte.
-## Composition de contrat {#contract-composition}
+## Composition du contrat {#contract-composition}
-- **Le contrat évite la complexité inutile.** Le jeton devrait être un simple contrat ; un jeton avec un code compliqué nécessite un niveau de contrôle accru. Utilisez [l'imprimante human-summary](https://github.com/crytic/slither/wiki/Printer-documentation#human-summary) de Slither pour identifier les codes complexes.
-- **Le contrat utilise SafeMath.** Les contrats qui n'utilisent pas SafeMath nécessitent un examen approfondi. Inspectez le contrat manuellement pour l'utilisation de SafeMath.
-- **Le contrat ne possède que quelques fonctions non liées au jeton.** Les fonctions non relatives au jeton augmentent la probabilité d'un problème dans le contrat. Utilisez [l'afficheur contract-summary](https://github.com/crytic/slither/wiki/Printer-documentation#contract-summary) de Slither pour revoir largement le code utilisé dans le contrat.
-- **Le jeton n'a qu'une seule adresse.** Les jetons avec plusieurs points d'entrée pour les mises à jour de solde peuvent casser la comptabilité interne basée sur l'adresse (ex. `balances[token_address][msg.sender]` pourrait ne pas refléter le solde réel).
+- **Le contrat évite toute complexité inutile.** Le jeton doit être un contrat simple ; un jeton avec un code complexe nécessite un niveau d'examen plus élevé. Utilisez le [rapport de résumé pour humains](https://github.com/crytic/slither/wiki/Printer-documentation#human-summary) de Slither pour identifier le code complexe.
+- **Le contrat utilise SafeMath.** Les contrats qui n'utilisent pas SafeMath nécessitent un niveau d'examen plus élevé. Inspectez manuellement le contrat pour vérifier l'utilisation de SafeMath.
+- **Le contrat ne comporte que quelques fonctions non liées aux jetons.** Les fonctions non liées aux jetons augmentent la probabilité d'un problème dans le contrat. Utilisez le [rapport de résumé de contrat](https://github.com/crytic/slither/wiki/Printer-documentation#contract-summary) de Slither pour examiner globalement le code utilisé dans le contrat.
+- **Le jeton ne possède qu'une seule adresse.** Les jetons avec plusieurs points d'entrée pour les mises à jour de solde peuvent perturber la comptabilité interne basée sur l'adresse (par exemple, `balances[token_address][msg.sender]` pourrait ne pas refléter le solde réel).
## Privilèges du propriétaire {#owner-privileges}
-- **Le jeton ne peut pas être mis à niveau.** Les contrats modifiables peuvent changer leurs règles au fil du temps. Utilisez l'imprimante [l'imprimante human-summary](https://github.com/crytic/slither/wiki/Printer-documentation#contract-summary) de Slither pour déterminer si une mise à niveau du contrat est possible.
-- **Le propriétaire a des capacités de frappe limitées.** Les propriétaires malveillants ou compromis peuvent abuser des capacités de frappe. Utilisez [l'imprimante human-summary](https://github.com/crytic/slither/wiki/Printer-documentation#contract-summary) de Slither pour examiner les capacités de frappe et envisagez de revoir le code manuellement .
-- **Le jeton ne peut pas être mis en pause.** Les propriétaires malveillants ou compromis peuvent piéger des contrats en mettant les jetons en pause. Identifiez manuellement le code en pause.
-- **Le propriétaire ne peut pas mettre sur liste noire le contrat.** Les propriétaires malveillants ou compromis peuvent piéger des contrats en s'appuyant sur des jetons avec une liste noire. Identifiez manuellement les fonctionnalités de la liste noire.
-- **L'équipe derrière le jeton est connue et peut être tenue responsable d'abus.** Les contrats ayant des équipes de développement anonymes, ou qui résident dans des juridictions douteuses nécessitent un niveau d'examen plus rigoureux.
+- **Le jeton ne peut pas être mis à niveau.** Les contrats pouvant être mis à niveau peuvent changer leurs règles au fil du temps. Utilisez le [rapport de résumé pour humains](https://github.com/crytic/slither/wiki/Printer-documentation#contract-summary) de Slither pour déterminer si le contrat peut être mis à niveau.
+- **Le propriétaire dispose de capacités de frappe limitées.** Des propriétaires malveillants ou compromis peuvent abuser des capacités de frappe. Utilisez le [rapport de résumé pour humains](https://github.com/crytic/slither/wiki/Printer-documentation#contract-summary) de Slither pour examiner les capacités de frappe et envisagez d'examiner manuellement le code.
+- **Le jeton ne peut pas être mis en pause.** Des propriétaires malveillants ou compromis peuvent bloquer les contrats qui dépendent de jetons pouvant être mis en pause. Identifiez manuellement le code pouvant être mis en pause.
+- **Le propriétaire ne peut pas mettre le contrat sur liste noire.** Des propriétaires malveillants ou compromis peuvent bloquer des contrats qui dépendent de jetons dotés d'une liste noire. Identifiez manuellement les fonctionnalités de mise sur liste noire.
+- **L'équipe derrière le jeton est connue et peut être tenue pour responsable en cas d'abus.** Les contrats dont les équipes de développement sont anonymes ou qui résident dans des paradis juridiques devraient exiger un niveau d'examen plus élevé.
-## Rareté des jetons {#token-scarcity}
+## Rareté du jeton {#token-scarcity}
-Rechercher des problèmes liés à la rareté des jetons nécessite un examen manuel. Vérifiez les conditions suivantes :
+L'examen des problèmes de rareté des jetons nécessite un examen manuel. Vérifiez les conditions suivantes :
-- **Personne ne possède la plupart de l'approvisionnement.** Si quelques utilisateurs possèdent la plupart des jetons, ils peuvent influencer les opérations basées sur la répartition du jeton.
-- **L'approvisionnement total est suffisant.** Les jetons avec un faible volume total peuvent être facilement manipulés.
-- **Les jetons sont disponibles sur de nombreuses plateformes d'échanges.** Si tous les jetons sont sur une seule plateforme, sa compromission peut affecter le contrat s'appuyant sur le jeton.
-- **Les utilisateurs comprennent les risques associés aux grands volumes de fonds ou aux prêts éclair.** Les contrats s'appuyant sur le solde de jetons doivent être soigneusement analysés notamment au regard des attaquants avec des fonds importants ou des attaques par le biais de prêts éclair .
-- **Le jeton n'autorise pas la frappe éclair**. Les frappes éclair peuvent entraîner des fluctuations substantielles du solde et de l'approvisionnement total, ce qui exige des contrôles stricts et complets sur les risques de débordement dans le fonctionnement du jeton.
+- **Aucun utilisateur ne détient la majorité de l'offre.** Si quelques utilisateurs détiennent la plupart des jetons, ils peuvent influencer les opérations en fonction de la répartition du jeton.
+- **L'offre totale est suffisante.** Les jetons dont l'offre totale est faible peuvent être facilement manipulés.
+- **Les jetons sont disponibles sur plus que quelques plateformes d'échange.** Si tous les jetons se trouvent sur une seule plateforme d'échange, une compromission de celle-ci peut compromettre le contrat qui dépend du jeton.
+- **Les utilisateurs comprennent les risques associés aux fonds importants ou aux prêts flash.** Les contrats qui dépendent du solde des jetons doivent soigneusement prendre en considération les attaquants disposant de fonds importants ou les attaques par prêts flash.
+- **Le jeton ne permet pas la frappe flash**. La frappe flash peut entraîner des fluctuations importantes du solde et de l'offre totale, ce qui nécessite des vérifications de dépassement strictes et complètes dans le fonctionnement du jeton.
diff --git a/public/content/translations/fr/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md b/public/content/translations/fr/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md
index fed3fe3d9ac..58e26ac8d73 100644
--- a/public/content/translations/fr/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md
+++ b/public/content/translations/fr/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md
@@ -1,12 +1,14 @@
---
-title: Transferts et approbation des jetons ERC-20 à partir d'un contrat intelligent de solidity
-description: Comment utiliser un contrat intelligent pour interagir avec un jeton en utilisant le langage Solidity
+title: "Transferts et approbation de jetons ERC-20 à partir d'un contrat intelligent Solidity"
+description: "Construire un contrat intelligent DEX qui gère les transferts et les approbations de jetons ERC-20 en utilisant Solidity."
author: "jdourlens"
tags:
- - "contrats intelligents"
- - "jetons"
- - "solidity"
- - "erc-20"
+ [
+ "contrats intelligents",
+ "jetons",
+ "solidité",
+ "erc-20"
+ ]
skill: intermediate
lang: fr
published: 2020-04-07
@@ -15,16 +17,16 @@ sourceUrl: https://ethereumdev.io/transfers-and-approval-or-erc20-tokens-from-a-
address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"
---
-Dans le tutoriel précédent, nous avons étudié [l'anatomie d'un jeton ERC-20 dans Solidity](/developers/tutorials/understand-the-erc-20-token-smart-contract/) sur la blockchain Ethereum. Dans cet article, nous allons voir comment nous pouvons utiliser un contrat intelligent pour interagir avec un jeton en utilisant le langage Solidity.
+Dans le tutoriel précédent, nous avons étudié [l'anatomie d'un jeton ERC-20 dans Solidity](/developers/tutorials/understand-the-erc-20-token-smart-contract/) sur la blockchain Ethereum. Dans cet article, nous verrons comment nous pouvons utiliser un contrat intelligent pour interagir avec un jeton en utilisant le langage Solidity.
-Pour ce contrat intelligent, nous allons créer un échange décentralisé très rudimentaire où un utilisateur pourra échanger de l'Ether contre notre nouveau [jeton ERC-20](/developers/docs/standards/tokens/erc-20/) récemment déployé.
+Pour ce contrat intelligent, nous allons créer un véritable échange décentralisé factice où un utilisateur pourra échanger de l'éther contre notre [jeton ERC-20](/developers/docs/standards/tokens/erc-20/) nouvellement déployé.
-Pour ce tutoriel, nous utiliserons le code que nous avons écrit dans le tutoriel précédent comme base. Notre DEX instanciera une instance du contrat dans son constructeur et effectuera les opérations de :
+Pour ce tutoriel, nous utiliserons le code que nous avons écrit dans le tutoriel précédent comme base. Notre DEX instanciera une instance du contrat dans son constructeur et effectuera les opérations suivantes :
-- échange de jetons en ethers
-- échange d'ethers contre des jetons
+- échanger des jetons contre de l'éther
+- échanger de l'éther contre des jetons
-Nous allons commencer notre code d'échange décentralisé en ajoutant notre simple base de code ERC20 :
+Nous allons commencer le code de notre échange décentralisé en ajoutant notre base de code ERC20 simple :
```solidity
pragma solidity ^0.8.0;
@@ -60,11 +62,11 @@ contract ERC20Basic is IERC20 {
constructor() {
- balances[msg.sender] = totalSupply_;
+ balances[msg.sender] = totalSupply_;
}
function totalSupply() public override view returns (uint256) {
- return totalSupply_;
+ return totalSupply_;
}
function balanceOf(address tokenOwner) public override view returns (uint256) {
@@ -104,7 +106,7 @@ contract ERC20Basic is IERC20 {
```
-Notre nouveau contrat intelligent DEX déploiera l'ERC-20 et fera tout le nécessaire :
+Notre nouveau contrat intelligent DEX déploiera l'ERC-20 et obtiendra toute la réserve de jetons :
```solidity
contract DEX {
@@ -129,82 +131,82 @@ contract DEX {
}
```
-Nous avons à présent notre DEX et il possède toute la réserve de jetons disponibles. Le contrat a deux fonctions :
+Nous avons donc maintenant notre DEX et il dispose de toute la réserve de jetons. Le contrat a deux fonctions :
-- `Acheter` : L'utilisateur peut envoyer des ethers et obtenir des jetons en échange
-- `sell` : L'utilisateur peut décider d'envoyer des jetons pour récupérer des ethers
+- `buy` : L'utilisateur peut envoyer de l'éther et obtenir des jetons en échange
+- `sell` : L'utilisateur peut envoyer des jetons pour récupérer de l'éther
-## La fonction d'achat {#the-buy-function}
+## La fonction buy {#the-buy-function}
-Codons la fonction achat. Nous devrons d'abord vérifier la quantité d'ethers que le message contient et vérifier que les contrats possèdent suffisamment de jetons et que le message contient un peu d'ethers dedans. Si le contrat possède suffisamment de jetons, il enverra le nombre de jetons à l'utilisateur et émettra l'événement `Acheté`.
+Codons la fonction buy. Nous devrons d'abord vérifier la quantité d'éther que le message contient et vérifier que le contrat possède suffisamment de jetons et que le message contient bien de l'éther. Si le contrat possède suffisamment de jetons, il enverra le nombre de jetons à l'utilisateur et émettra l'événement `Bought`.
-Notez que si nous appelons la fonction require dans le cas d'une erreur, l'ether envoyé sera directement restauré et restitué à l'utilisateur.
+Notez que si nous appelons la fonction `require`, en cas d'erreur, l'éther envoyé sera directement annulé et rendu à l'utilisateur.
-Pour garder les choses simples, il suffit d'échanger 1 jeton contre 1 Wei.
+Pour simplifier, nous échangeons simplement 1 jeton contre 1 wei.
```solidity
function buy() payable public {
uint256 amountTobuy = msg.value;
uint256 dexBalance = token.balanceOf(address(this));
- require(amountTobuy > 0, "You need to send some ether");
- require(amountTobuy <= dexBalance, "Not enough tokens in the reserve");
+ require(amountTobuy > 0, "Vous devez envoyer de l'éther");
+ require(amountTobuy <= dexBalance, "Pas assez de jetons dans la réserve");
token.transfer(msg.sender, amountTobuy);
emit Bought(amountTobuy);
}
```
-Dans le cas où l'achat est réussi, nous devrions voir deux événements dans la transaction : le jeton `Transfert` et l'événement `Achat`.
+Si l'achat réussit, nous devrions voir deux événements dans la transaction : l'événement de jeton `Transfer` et l'événement `Bought`.
-
+
-## La fonction de vente {#the-sell-function}
+## La fonction sell {#the-sell-function}
-La fonction responsable de la vente demandera d'abord à l'utilisateur d'avoir approuvé le montant en appelant la fonction d'approbation au préalable. L'approbation du transfert nécessite que le jeton ERC20Basic, instancié par le DEX, soit appelé par l'utilisateur. Ceci peut être réalisé en appelant d'abord la fonction `token()` du contrat DEX pour récupérer l'adresse où DEX a déployé le contrat ERC20Basic appelé `token`. Ensuite, nous créons une instance de ce contrat dans notre session et appelons sa fonction `approve`. Ensuite, nous pouvons appeler la fonction DEX `sell` et échanger nos jetons contre des ethers. Par exemple, voici à quoi cela ressemble dans une session de navigation interactive :
+La fonction responsable de la vente exigera d'abord que l'utilisateur ait approuvé le montant en appelant au préalable la fonction `approve`. L'approbation du transfert exige que le jeton ERC20Basic instancié par le DEX soit appelé par l'utilisateur. Cela peut être réalisé en appelant d'abord la fonction `token()` du contrat DEX pour récupérer l'adresse où le DEX a déployé le contrat ERC20Basic appelé `token`. Ensuite, nous créons une instance de ce contrat dans notre session et appelons sa fonction `approve`. Ensuite, nous pouvons appeler la fonction `sell` du DEX et échanger nos jetons contre de l'éther. Par exemple, voici à quoi cela ressemble dans une session interactive de Brownie :
```python
#### Python in interactive brownie console...
-# deploy the DEX
+# déployer le DEX
dex = DEX.deploy({'from':account1})
-# call the buy function to swap ether for token
-# 1e18 is 1 ether denominated in wei
+# appeler la fonction buy pour échanger de l'éther contre un jeton
+# 1e18 correspond à 1 éther exprimé en wei
dex.buy({'from': account2, 1e18})
-# get the deployment address for the ERC20 token
-# that was deployed during DEX contract creation
-# dex.token() returns the deployed address for token
+# obtenir l'adresse de déploiement du jeton ERC20
+# qui a été déployé lors de la création du contrat DEX
+# dex.token() renvoie l'adresse déployée pour le jeton
token = ERC20Basic.at(dex.token())
-# call the token's approve function
-# approve the dex address as spender
-# and how many of your tokens it is allowed to spend
+# appeler la fonction approve du jeton
+# approuver l'adresse du dex en tant que dépensier
+# et le nombre de vos jetons qu'il est autorisé à dépenser
token.approve(dex.address, 3e18, {'from':account2})
```
-Ensuite, lorsque la fonction de vente est appelée, nous vérifierons si le transfert de l’adresse de l’appelant à l’adresse du contrat a été réussi et nous retournerons ensuite les ethers à l’adresse de l’appelant.
+Ensuite, lorsque la fonction `sell` est appelée, nous vérifierons si le transfert depuis l'adresse de l'appelant vers l'adresse du contrat a réussi, puis nous renverrons l'éther à l'adresse de l'appelant.
```solidity
function sell(uint256 amount) public {
- require(amount > 0, "You need to sell at least some tokens");
+ require(amount > 0, "Vous devez vendre au moins quelques jetons");
uint256 allowance = token.allowance(msg.sender, address(this));
- require(allowance >= amount, "Check the token allowance");
+ require(allowance >= amount, "Vérifiez l'allocation de jetons");
token.transferFrom(msg.sender, address(this), amount);
payable(msg.sender).transfer(amount);
emit Sold(amount);
}
```
-Si tout fonctionne correctement, vous devriez voir 2 événements (un `Transfer` et `Sold`) dans la transaction, ainsi que la mise à jour de votre solde de jetons et de votre solde d'Ether.
+Si tout fonctionne, vous devriez voir 2 événements (un `Transfer` et un `Sold`) dans la transaction, et votre solde de jetons ainsi que votre solde d'éther mis à jour.
-
+
-À partir de ce tutoriel, nous avons vu comment vérifier le solde et la provision d'un jeton ERC-20 et comment appeler `Transfer` et `TransferFrom` d'un contrat intelligent ERC20 à l'aide de l'interface.
+Dans ce tutoriel, nous avons vu comment vérifier le solde et l'allocation d'un jeton ERC-20, ainsi que la manière d'appeler `Transfer` et `TransferFrom` d'un contrat intelligent ERC20 en utilisant l'interface.
-Une fois que vous avez effectué une transaction, nous avons un tutoriel JavaScript pour [attendre et obtenir des détails sur les transactions](https://ethereumdev.io/waiting-for-a-transaction-to-be-mined-on-ethereum-with-js/) qui ont été réalisées dans votre contrat et un [tutoriel pour décoder les événements générés par des transferts de jetons ou tout autre événement](https://ethereumdev.io/how-to-decode-event-logs-in-javascript-using-abi-decoder/) tant que vous disposez de l'ABI.
+Une fois que vous avez effectué une transaction, nous avons un tutoriel JavaScript pour [attendre et obtenir les détails sur les transactions](https://ethereumdev.io/waiting-for-a-transaction-to-be-mined-on-ethereum-with-js/) qui ont été effectuées sur votre contrat et un [tutoriel pour décoder les événements générés par les transferts de jetons ou tout autre événement](https://ethereumdev.io/how-to-decode-event-logs-in-javascript-using-abi-decoder/) tant que vous avez l'ABI.
Voici le code complet du tutoriel :
@@ -242,11 +244,11 @@ contract ERC20Basic is IERC20 {
constructor() {
- balances[msg.sender] = totalSupply_;
+ balances[msg.sender] = totalSupply_;
}
function totalSupply() public override view returns (uint256) {
- return totalSupply_;
+ return totalSupply_;
}
function balanceOf(address tokenOwner) public override view returns (uint256) {
@@ -299,16 +301,16 @@ contract DEX {
function buy() payable public {
uint256 amountTobuy = msg.value;
uint256 dexBalance = token.balanceOf(address(this));
- require(amountTobuy > 0, "You need to send some ether");
- require(amountTobuy <= dexBalance, "Not enough tokens in the reserve");
+ require(amountTobuy > 0, "Vous devez envoyer de l'éther");
+ require(amountTobuy <= dexBalance, "Pas assez de jetons dans la réserve");
token.transfer(msg.sender, amountTobuy);
emit Bought(amountTobuy);
}
function sell(uint256 amount) public {
- require(amount > 0, "You need to sell at least some tokens");
+ require(amount > 0, "Vous devez vendre au moins quelques jetons");
uint256 allowance = token.allowance(msg.sender, address(this));
- require(allowance >= amount, "Check the token allowance");
+ require(allowance >= amount, "Vérifiez l'allocation de jetons");
token.transferFrom(msg.sender, address(this), amount);
payable(msg.sender).transfer(amount);
emit Sold(amount);
diff --git a/public/content/translations/fr/developers/tutorials/understand-the-erc-20-token-smart-contract/index.md b/public/content/translations/fr/developers/tutorials/understand-the-erc-20-token-smart-contract/index.md
index c952de2380e..8c0038853cc 100644
--- a/public/content/translations/fr/developers/tutorials/understand-the-erc-20-token-smart-contract/index.md
+++ b/public/content/translations/fr/developers/tutorials/understand-the-erc-20-token-smart-contract/index.md
@@ -1,12 +1,14 @@
---
title: Comprendre le contrat intelligent de jeton ERC-20
-description: Introduction au déploiement de votre premier contrat intelligent sur un réseau de test Ethereum
+description: "Apprenez à mettre en œuvre la norme de jeton ERC-20 avec un exemple complet de contrat intelligent Solidity et son explication."
author: "jdourlens"
tags:
- - "contrats intelligents"
- - "jetons"
- - "solidity"
- - "erc-20"
+ [
+ "contrats intelligents",
+ "jetons",
+ "solidité",
+ "erc-20"
+ ]
skill: beginner
lang: fr
published: 2020-04-05
@@ -15,11 +17,11 @@ sourceUrl: https://ethereumdev.io/understand-the-erc20-token-smart-contract/
address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"
---
-L'un des plus importantes [normes de contrat intelligent](/developers/docs/standards/) sur Ethereum est connue sous le nom de [ERC-20](/developers/docs/standards/tokens/ERC-20/), qui est apparu comme le standard technique de référence pour tous les contrats intelligents sur la blockchain Ethereum pour les implémentations de jetons fongibles.
+L'une des [normes de contrat intelligent](/developers/docs/standards/) les plus importantes sur Ethereum est connue sous le nom d'[ERC-20](/developers/docs/standards/tokens/erc-20/). Elle s'est imposée comme la norme technique utilisée pour tous les contrats intelligents sur la blockchain Ethereum pour les implémentations de jetons fongibles.
-ERC-20 définit une liste commune de règles auxquelles tous les jetons Ethereum fongibles devraient adhérer. Par conséquent, cette norme de jeton permet aux développeurs de tous types de prédire avec précision comment de nouveaux jetons fonctionneront au sein du système Ethereum dans son ensemble. Cela simplifie et facilite les tâches des développeurs, car ils peuvent se concentrer sur leur travail tout en sachant que chacun de leurs projets et chaque nouveau projet n'aura pas besoin d'être refait ou modifié à chaque fois qu'un nouveau jeton est publié, à condition que le jeton respecte les règles.
+L'ERC-20 définit une liste commune de règles auxquelles tous les jetons Ethereum fongibles doivent adhérer. Par conséquent, cette norme de jeton permet aux développeurs de tous types de prédire avec précision comment les nouveaux jetons fonctionneront au sein du système Ethereum. Cela simplifie et facilite la tâche des développeurs, car ils peuvent poursuivre leur travail, sachant que les projets n'auront pas besoin d'être refaits à chaque sortie d'un nouveau jeton, tant que ce dernier respecte les règles.
-Voici les fonctions, présentées comme une interface, que tout jeton ERC-20 doit implémenter. Si vous n'êtes pas sûr de ce qu'est une interface : consultez notre article sur la programmation [orientée objet dans Solidity](https://ethereumdev.io/inheritance-in-solidity-contracts-are-classes/).
+Voici, présentées sous forme d'interface, les fonctions qu'un ERC-20 doit mettre en œuvre. Si vous n'êtes pas sûr de ce qu'est une interface, consultez notre article sur [la programmation orientée objet dans Solidity](https://ethereumdev.io/inheritance-in-solidity-contracts-are-classes/).
```solidity
pragma solidity ^0.6.0;
@@ -48,19 +50,19 @@ Voici une explication ligne par ligne de ce à quoi sert chaque fonction. Après
function totalSupply() external view returns (uint256);
```
-Renvoie le nombre total de jetons existants. Cette fonction est un getter et ne modifie pas l'état du contrat. Gardez à l'esprit qu'il n'y a pas de nombres décimaux dans Solidity. C'est pourquoi la plupart des jetons adoptent 18 décimales et retournent le total des jetons ainsi que d'autres résultats sous la forme de 1000000000000000000 pour 1 jeton. Tous les jetons n'ont pas nécessairement 18 décimales et c'est donc un élément à surveiller lorsqu'on manipule des jetons.
+Renvoie le nombre total de jetons existants. Cette fonction est un getter et ne modifie pas l'état du contrat. Gardez à l'esprit qu'il n'y a pas de nombres à virgule flottante dans Solidity. Par conséquent, la plupart des jetons adoptent 18 décimales et renvoient l'offre totale et d'autres résultats sous la forme 1000000000000000000 pour 1 jeton. Tous les jetons n'ont pas 18 décimales, et c'est un point auquel vous devez vraiment faire attention lorsque vous manipulez des jetons.
```solidity
function balanceOf(address account) external view returns (uint256);
```
-Renvoie le nombre de jetons détenus par une adresse (`compte`). Cette fonction est un getter et ne modifie pas l'état du contrat.
+Renvoie la quantité de jetons détenus par une adresse (`compte`). Cette fonction est un getter et ne modifie pas l'état du contrat.
```solidity
function allowance(address owner, address spender) external view returns (uint256);
```
-La norme ERC-20 permet à une adresse de donner une allocation (« allowance ») à une autre adresse pour pouvoir récupérer des jetons à partir de celle-ci. Ce getter retourne le nombre restant de jetons que le `dépenseur` sera autorisé à dépenser au nom du `propriétaire`. Cette fonction est un getter et ne modifie pas l'état du contrat et doit retourner 0 par défaut.
+La norme ERC-20 permet à une adresse de donner une allocation (« allowance ») à une autre adresse afin que cette dernière puisse en retirer des jetons. Ce getter renvoie le nombre de jetons restants que le `spender` sera autorisé à dépenser au nom du `owner`. Cette fonction est un getter, ne modifie pas l'état du contrat et doit renvoyer 0 par défaut.
## Fonctions {#functions}
@@ -68,19 +70,19 @@ La norme ERC-20 permet à une adresse de donner une allocation (« allowance »)
function transfer(address recipient, uint256 amount) external returns (bool);
```
-Déplace le montant `amount` de jetons de l'adresse de l'appelant de la fonction (`msg.sender`) à l'adresse du destinataire. Cette fonction émet l'événement `Transfert` que nous expliquerons plus tard. Il renvoie « vrai » si le transfert a été possible.
+Déplace la quantité (`amount`) de jetons de l'adresse de l'appelant de la fonction (`msg.sender`) à l'adresse du destinataire. Cette fonction émet l'événement `Transfer` défini plus loin. Elle renvoie `true` si le transfert a été possible.
```solidity
function approve(address spender, uint256 amount) external returns (bool);
```
-Définit le montant de `l'allocation` que le dépenseur `spender` est autorisé à transférer à partir du solde de l'appelant de la fonction (`msg.sender`). Cette fonction émet l'événement d'approbation « Approval ». La fonction retourne si l'allocation a été mise en place avec succès.
+Définit le montant de l'`allowance` que le `spender` est autorisé à transférer depuis le solde de l'appelant de la fonction (`msg.sender`). Cette fonction émet l'événement `Approval`. La fonction renvoie une valeur indiquant si l'allocation a été définie avec succès.
```solidity
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
```
-Déplace le montant `amount` de jetons de `l'expéditeur` vers `le destinataire` en utilisant le mécanisme de provision « allowance ». le montant est ensuite déduit de la provision « allowance » de l'appelant. Cette fonction émet l'événement `Transfert` .
+Déplace la quantité (`amount`) de jetons de `sender` à `recipient` en utilisant le mécanisme d'allocation. La quantité `amount` est ensuite déduite de l'allocation de l'appelant. Cette fonction émet l'événement `Transfer`.
## Événements {#events}
@@ -88,19 +90,19 @@ Déplace le montant `amount` de jetons de `l'expéditeur` vers `le destinataire`
event Transfer(address indexed from, address indexed to, uint256 value);
```
-Cet événement est émis lorsque le nombre de jetons (valeur) est envoyé depuis l'adresse `de` à l'adresse `à`.
+Cet événement est émis lorsque la quantité de jetons (`value`) est envoyée de l'adresse `from` à l'adresse `to`.
-Dans le cas du minage de nouveaux jetons, le transfert s'opère généralement `depuis` l'adresse 0x00..000 alors que dans le cas d'une destruction de jetons, le transfert s'opère `vers` l'adresse 0x00..0000.
+En cas de frappe de nouveaux jetons, le transfert est généralement `from` l'adresse 0x00..0000, tandis qu'en cas de destruction (« burn ») de jetons, le transfert est `to` l'adresse 0x00..0000.
```solidity
event Approval(address indexed owner, address indexed spender, uint256 value);
```
-Cet événement est émis lorsque le nombre de jetons (`value`) est approuvé par le propriétaire `owner` pour etre utilisé par le dépenseur `spender`.
+Cet événement est émis lorsque la quantité de jetons (`value`) est approuvée par le `owner` pour être utilisée par le `spender`.
## Une implémentation basique des jetons ERC-20 {#a-basic-implementation-of-erc-20-tokens}
-Voici le code le plus simple possible à prendre comme base pour votre jeton ERC-20 :
+Voici le code le plus simple sur lequel baser votre jeton ERC-20 :
```solidity
pragma solidity ^0.8.0;
@@ -136,11 +138,11 @@ contract ERC20Basic is IERC20 {
constructor() {
- balances[msg.sender] = totalSupply_;
+ balances[msg.sender] = totalSupply_;
}
function totalSupply() public override view returns (uint256) {
- return totalSupply_;
+ return totalSupply_;
}
function balanceOf(address tokenOwner) public override view returns (uint256) {
@@ -178,4 +180,4 @@ contract ERC20Basic is IERC20 {
}
```
-Une autre excellente implémentation de la norme de jeton ERC-20 est l'implémentation [OpenZeppelin ERC-20](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20).
+Une autre excellente implémentation de la norme de jeton ERC-20 est l'[implémentation ERC-20 d'OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20).
diff --git a/public/content/translations/fr/developers/tutorials/uniswap-v2-annotated-code/index.md b/public/content/translations/fr/developers/tutorials/uniswap-v2-annotated-code/index.md
index ffd0da82b7c..04a33065977 100644
--- a/public/content/translations/fr/developers/tutorials/uniswap-v2-annotated-code/index.md
+++ b/public/content/translations/fr/developers/tutorials/uniswap-v2-annotated-code/index.md
@@ -1,9 +1,8 @@
---
title: "Visite guidée du contrat Uniswap-v2"
-description: Comment fonctionne le contrat Uniswap-v2 ? Pourquoi est-il écrit de cette façon ?
+description: "Comment fonctionne le contrat Uniswap-v2 ? Pourquoi est-il écrit de cette façon ?"
author: Ori Pomerantz
-tags:
- - "solidity"
+tags: [ "solidité" ]
skill: intermediate
published: 2021-05-01
lang: fr
@@ -11,81 +10,82 @@ lang: fr
## Introduction {#introduction}
-[Uniswap v2](https://uniswap.org/whitepaper.pdf) permet de créer un marché d'échange entre deux jetons ERC-20 quels qu'ils soient. Dans cet article nous allons passer en revue le code source des contrats qui implémentent ce protocole et voir pourquoi ils sont écrits comme ils le sont.
+[Uniswap v2](https://app.uniswap.org/whitepaper.pdf) peut créer un marché d'échange entre deux jetons ERC-20, quels qu'ils soient. Dans cet article, nous allons passer en revue le code source des contrats qui implémentent ce protocole et voir pourquoi ils sont écrits comme ils le sont.
### Que fait Uniswap ? {#what-does-uniswap-do}
-Fondamentalement, il existe deux types d'utilisateurs : les fournisseurs de liquidités et les négociants également appelés traders.
+Fondamentalement, il existe deux types d'utilisateurs : les fournisseurs de liquidités et les traders.
-Les _fournisseurs de liquidités_ fournissent la réserve (« pool ») avec les deux jetons qui peuvent être échangés (nous les appellerons **Jeton0** et **Jeton1**). En retour, ils reçoivent un troisième jeton, appelé un _jeton de liquidité_, qui représente la détention partielle du pool.
+Les _fournisseurs de liquidités_ fournissent le pool avec les deux jetons qui peuvent être échangés (nous les appellerons **Jeton0** et **Jeton1**). En retour, ils reçoivent un troisième jeton qui représente une propriété partielle du pool, appelé un _jeton de liquidité_.
-Les _traders_ envoient un type de jeton au pool et reçoivent l'autre (par exemple, envoie le **Jeton0** et reçoit le **Jeton1**) du pool, mis à disposition par les fournisseurs de liquidités. Le taux de change est déterminé par le nombre relatif de **Jeton0** et de **Jeton1** que le pool possède. En outre, le pool récupère un petit pourcentage en guise de récompense pour le pool de liquidités.
+Les _traders_ envoient un type de jeton au pool et reçoivent l'autre (par exemple, envoient le **Jeton0** et reçoivent le **Jeton1**) hors du pool fourni par les fournisseurs de liquidités. Le taux de change est déterminé par le nombre relatif de **Jeton0** et de **Jeton1** que le pool possède. En outre, le pool prélève un petit pourcentage en guise de récompense pour le pool de liquidités.
-Lorsque les fournisseurs de liquidités veulent récupérer leurs actifs, ils peuvent brûler les jetons du pool et récupérer leurs jetons, y compris leur part des récompenses.
+Lorsque les fournisseurs de liquidités veulent récupérer leurs actifs, ils peuvent brûler les jetons du pool et recevoir en retour leurs jetons, y compris leur part des récompenses.
[Cliquez ici pour une description plus complète](https://docs.uniswap.org/contracts/v2/concepts/core-concepts/swaps/).
### Pourquoi v2 ? Pourquoi pas v3 ? {#why-v2}
-[Uniswap v3](https://uniswap.org/whitepaper-v3.pdf) est une mise à jour beaucoup plus complexe que la v2. Il est plus facile de découvrir d'abord la v2, puis de passer à la v3.
+[Uniswap v3](https://app.uniswap.org/whitepaper-v3.pdf) est une mise à niveau bien plus compliquée que la v2. Il est plus facile d'apprendre d'abord la v2, puis de passer à la v3.
-### Contrats de base vs Contrats périphériques {#contract-types}
+### Contrats de base et contrats périphériques {#contract-types}
-Uniswap v2 est divisé en deux composants, un noyau et une périphérie. Cette division permet aux contrats de base, qui détiennent les actifs et _doivent_ donc être sécurisés, d'être plus simples et plus faciles à vérifier. Toutes les fonctionnalités supplémentaires requises par les traders peuvent alors être fournies par des contrats périphériques.
+Uniswap v2 est divisé en deux composants, un noyau et une périphérie. Cette division permet aux contrats de base, qui détiennent les actifs et doivent donc être _sécurisés_, d'être plus simples et plus faciles à auditer. Toutes les fonctionnalités supplémentaires requises par les traders peuvent alors être fournies par des contrats périphériques.
## Flux de données et de contrôle {#flows}
-Ce sont les flux de données et de contrôle qui se produisent lorsque vous effectuez les trois actions principales d'Uniswap :
+Voici le flux de données et de contrôle qui se produit lorsque vous effectuez les trois actions principales d'Uniswap :
-1. Échanger différents jetons
-2. Ajouter des liquidités sur le marché et obtenir des récompenses sous forme de jetons de liquidité ERC
-3. Brûler des jetons de liquidité ERC-20 et récupérer des jetons ERC-20 que l'échange en paire permet aux traders d'échanger
+1. Échanger entre différents jetons
+2. Ajouter de la liquidité au marché et être récompensé par des jetons de liquidité ERC-20 d'échange de paires
+3. Brûler des jetons de liquidité ERC-20 et récupérer les jetons ERC-20 que l'échange de paires permet aux traders d'échanger
-### Échanger {#swap-flow}
+### Échange {#swap-flow}
-C'est le flux le plus fréquemment utilisé par les traders :
+C'est le flux le plus courant, utilisé par les traders :
#### Appelant {#caller}
-1. Fournir au compte périphérique une provision correspondant au montant à échanger.
-2. Appeler l'une des nombreuses fonctions d'échange du contrat périphérique (celui dont on dépend si ETH est impliqué ou non, si le trader spécifie le nombre de jetons à déposer ou le nombre de jetons à récupérer, etc). Chaque fonction d'échange accepte un chemin `path`, un tableau d'échanges à parcourir.
+1. Fournir au compte périphérique une provision pour le montant à échanger.
+2. Appeler l'une des nombreuses fonctions d'échange du contrat périphérique (la fonction utilisée dépend de si l'ETH est impliqué ou non, si le trader spécifie le montant de jetons à déposer ou le montant de jetons à récupérer, etc.).
+ Chaque fonction d'échange accepte un `path` (chemin), un tableau d'échanges à parcourir.
#### Dans le contrat périphérique (UniswapV2Router02.sol) {#in-the-periphery-contract-uniswapv2router02-sol}
-3. Identifier les montants qui doivent être négociés à chaque échange tout au long du chemin.
-4. Itèrer sur le chemin. Pour chaque échange réalisé en cours de route, il envoie le jeton d'entrée puis appelle la fonction `swap` pour l'échange. Dans la plupart des cas, l'adresse de destination des jetons est la prochaine paire d'échange sur le chemin. Dans l'échange final, c'est l'adresse fournie par le trader.
+3. Identifier les montants qui doivent être échangés sur chaque échange le long du chemin.
+4. Itère sur le chemin. Pour chaque échange le long du chemin, il envoie le jeton d'entrée, puis appelle la fonction `swap` de l'échange.
+ Dans la plupart des cas, l'adresse de destination des jetons est le prochain échange de paires sur le chemin. Pour l'échange final, il s'agit de l'adresse fournie par le trader.
-#### Dans le contrat de base (UniswapV2Pair.sol) {#in-the-core-contract-uniswapv2pairsol-2}
+#### Dans le contrat de base (UniswapV2Pair.sol) {#in-the-core-contract-uniswapv2pairsol-2}5. Vérifier que le contrat de base ne fait pas l'objet d'une tricherie et peut maintenir une liquidité suffisante après l'échange.
-5. Vérifier que le contrat de base n'est pas faussé et qu'il dispose de suffisamment de liquidités après l'échange.
-6. Constater combien de jetons supplémentaires nous avons en plus des réserves connues. Ce montant est le nombre de jetons d'entrée que nous avons reçus et à échanger.
+6. Voir combien de jetons supplémentaires ont été reçus en plus des réserves connues. Ce montant correspond au nombre de jetons d'entrée reçus pour l'échange.
7. Envoyer les jetons de sortie à la destination.
-8. Appeler `_update` pour mettre à jour les montants de la réserve
+8. Appeler `_update` pour mettre à jour les montants de la réserve.
-#### Retour au contrat périphérique (UniswapV2Router02.sol) {#back-in-the-periphery-contract-uniswapv2router02-sol}
+#### Retour dans le contrat périphérique (UniswapV2Router02.sol) {#back-in-the-periphery-contract-uniswapv2router02-sol}
-9. Effectuer tout nettoyage nécessaire (par exemple, brûler des jetons WETH pour récupérer des ETH à envoyer au trader)
+9. Effectuer tout nettoyage nécessaire (par exemple, brûler des jetons WETH pour récupérer des ETH à envoyer au trader).
-### Ajouter des liquidités {#add-liquidity-flow}
+### Ajout de liquidité {#add-liquidity-flow}
#### Appelant {#caller-2}
-1. Fournir au compte périphérique une provision à ajouter à la réserve de liquidités.
+1. Fournir au compte périphérique une provision pour les montants à ajouter au pool de liquidités.
2. Appeler l'une des fonctions `addLiquidity` du contrat périphérique.
#### Dans le contrat périphérique (UniswapV2Router02.sol) {#in-the-periphery-contract-uniswapv2router02sol-2}
-3. Créer un nouvel échange de paires si nécessaire
-4. S'il existe un échange de paires existant, calculer le nombre de jetons à ajouter. La valeur est sensée être identique pour les deux jetons, soit le même ratio entre les nouveaux jetons et les jetons existants.
-5. Vérifier si les montants sont acceptables (les appelants peuvent spécifier un montant minimum en-dessous duquel ils préfèrent ne pas ajouter de liquidité)
+3. Créer un nouvel échange de paires si nécessaire.
+4. S'il existe un échange de paires, calculer le montant des jetons à ajouter. La valeur est censée être identique pour les deux jetons, donc le ratio des nouveaux jetons par rapport aux jetons existants doit être le même.
+5. Vérifier si les montants sont acceptables (les appelants peuvent spécifier un montant minimum en dessous duquel ils préfèrent ne pas ajouter de liquidité).
6. Appeler le contrat de base.
#### Dans le contrat de base (UniswapV2Pair.sol) {#in-the-core-contract-uniswapv2pairsol-2}
-7. Frapper des jetons de liquidité et les envoyer à l'appelant
-8. Appeler `_update` pour mettre à jour les montants de la réserve
+7. Frapper des jetons de liquidité et les envoyer à l'appelant.
+8. Appeler `_update` pour mettre à jour les montants de la réserve.
-### Retirer la liquidité {#remove-liquidity-flow}
+### Retrait de liquidité {#remove-liquidity-flow}
#### Appelant {#caller-3}
@@ -94,21 +94,21 @@ C'est le flux le plus fréquemment utilisé par les traders :
#### Dans le contrat périphérique (UniswapV2Router02.sol) {#in-the-periphery-contract-uniswapv2router02sol-3}
-3. Envoyer les jetons de liquidité à l'échange de paire
+3. Envoyer les jetons de liquidité à l'échange de paires.
#### Dans le contrat de base (UniswapV2Pair.sol) {#in-the-core-contract-uniswapv2pairsol-3}
-4. Envoie l'adresse de destination des jetons sous-jacents en proportion des jetons brûlés. Par exemple s'il y a 1 000 jetons A dans le pool, 500 jetons B, 90 jetons de liquidité, et que nous recevons 9 jetons à brûler, nous brûlons 10 % des jetons de liquidité et nous renvoyons donc à l'utilisateur 100 jetons A et 50 jetons B.
-5. Brûler les jetons de liquidité
-6. Appeler `_update` pour mettre à jour les montants de la réserve
+4. Envoyer à l'adresse de destination les jetons sous-jacents en proportion des jetons brûlés. Par exemple, s'il y a 1 000 jetons A dans le pool, 500 jetons B et 90 jetons de liquidité, et que nous recevons 9 jetons à brûler, nous brûlons 10 % des jetons de liquidité, nous renvoyons donc à l'utilisateur 100 jetons A et 50 jetons B.
+5. Brûler les jetons de liquidité.
+6. Appeler `_update` pour mettre à jour les montants de la réserve.
## Les contrats de base {#core-contracts}
-Ce sont les contrats sécurisés qui détiennent les liquidités.
+Ce sont les contrats sécurisés qui détiennent la liquidité.
### UniswapV2Pair.sol {#UniswapV2Pair}
-[Ce contrat](https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2Pair.sol) implémente le pool d'échange effectif des jetons. C'est une fonctionnalité de base d'Uniswap.
+[Ce contrat](https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2Pair.sol) met en œuvre le pool réel qui échange les jetons. C'est la fonctionnalité principale d'Uniswap.
```solidity
pragma solidity =0.5.16;
@@ -128,21 +128,22 @@ Ce sont toutes les interfaces que le contrat doit connaître, soit parce que le
contract UniswapV2Pair is IUniswapV2Pair, UniswapV2ERC20 {
```
-Ce contrat hérite de `UniswapV2ERC20`, qui fournit les fonctions ERC-20 pour les jetons de liquidité.
+Ce contrat hérite d'UniswapV2ERC20, qui fournit les fonctions ERC-20 pour les jetons de liquidité.
```solidity
using SafeMath for uint;
```
-La bibliothèque [SafeMath](https://docs.openzeppelin.com/contracts/2.x/api/math) est utilisée pour éviter les dépassements et soupassements. C'est important car sinon nous pourrions nous retrouver dans une situation où une valeur devrait être `-1`, mais est en réalité `2^256-1`.
+La [bibliothèque SafeMath](https://docs.openzeppelin.com/contracts/2.x/api/math) est utilisée pour éviter les dépassements de capacité (overflow) et les sous-dépassements (underflow). Ceci est important car sinon, nous pourrions nous retrouver dans une situation où une valeur devrait être `-1`, mais est en fait `2^256-1`.
```solidity
using UQ112x112 for uint224;
```
-De nombreux calculs dans le contrat de pool nécessitent des fractions. Cependant, les fractions ne sont pas prises en charge par l'EVM. La solution trouvée par Uniswap est d'utiliser des valeurs de 224 bits, avec 112 bits pour la partie entière, et 112 bits pour la fraction. Ainsi, `1.0` est représenté par `2^112`, `1.5` est représenté par `2^112 + 2^111`, etc.
+De nombreux calculs dans le contrat de pool nécessitent des fractions. Cependant, les fractions ne sont pas prises en charge par l'EVM.
+La solution trouvée par Uniswap est d'utiliser des valeurs de 224 bits, avec 112 bits pour la partie entière et 112 bits pour la fraction. Ainsi, `1,0` est représenté par `2^112`, `1,5` est représenté par `2^112 + 2^111`, etc.
-D'autres informations sur cette bibliothèque sont disponibles [plus bas dans ce document](#FixedPoint).
+Plus de détails sur cette bibliothèque sont disponibles [plus loin dans le document](#FixedPoint).
#### Variables {#pair-vars}
@@ -150,103 +151,104 @@ D'autres informations sur cette bibliothèque sont disponibles [plus bas dans ce
uint public constant MINIMUM_LIQUIDITY = 10**3;
```
-Pour éviter les cas de division par zéro, il existe toujours un nombre minimum de jetons de liquidité (mais détenus par le compte zéro). Ce nombre est **LIQUIDITÉ_MINIMUM**, un millier.
+Pour éviter les cas de division par zéro, il existe toujours un nombre minimum de jetons de liquidité (mais ils sont détenus par le compte zéro). Ce nombre est **MINIMUM_LIQUIDITY**, soit un millier.
```solidity
bytes4 private constant SELECTOR = bytes4(keccak256(bytes('transfer(address,uint256)')));
```
-C'est le sélecteur ABI pour la fonction de transfert ERC-20. Il est utilisé pour transférer les jetons ERC-20 dans les deux comptes de jetons.
+C'est le sélecteur ABI pour la fonction de transfert ERC-20. Il est utilisé pour transférer des jetons ERC-20 sur les deux comptes de jetons.
```solidity
address public factory;
```
-C'est le contrat d'usine qui a créé ce pool. Chaque pool est un échange entre deux jetons ERC-20, l'usine étant le point central qui relie tous ces pools.
+C'est le contrat d'usine qui a créé ce pool. Chaque pool est un échange entre deux jetons ERC-20, l'usine est le point central qui relie tous ces pools.
```solidity
address public token0;
address public token1;
```
-Il y a les adresses des contrats pour les deux types de jetons ERC-20 qui peuvent être échangés par ce pool.
+Ce sont les adresses des contrats pour les deux types de jetons ERC-20 qui peuvent être échangés par ce pool.
```solidity
uint112 private reserve0; // uses single storage slot, accessible via getReserves
uint112 private reserve1; // uses single storage slot, accessible via getReserves
```
-La réserve dont dispose le pool pour chaque type de jeton. Nous supposons que les deux ensembles représentent le même montant de valeur, et ainsi que chaque jeton0 vaut le jeton1 reserve1/reserve0.
+La réserve du pool pour chaque type de jeton. Nous supposons que les deux représentent le même montant de valeur, et donc que chaque jeton0 vaut la valeur de jeton1 multipliée par reserve1/reserve0.
```solidity
uint32 private blockTimestampLast; // uses single storage slot, accessible via getReserves
```
-L'horodatage du dernier bloc dans lequel un échange a eu lieu, utilisé pour suivre les taux de change auu fil du temps.
+L'horodatage du dernier bloc dans lequel un échange a eu lieu, utilisé pour suivre les taux de change dans le temps.
-L'une des dépenses de gaz les plus importantes des contrats Ethereum est relative au stockage, qui persiste d'un appel de contrat à l'autre. Chaque cellule de stockage fait 256 bits de long. Ainsi, trois variables, `reserve0`, `reserve1` et `blockTimestampLast`, sont allouées de manière à ce qu'une seule valeur de stockage puisse inclure les trois (112+112+32=256).
+L'une des plus grandes dépenses de gaz des contrats Ethereum est le stockage, qui persiste d'un appel de contrat à l'autre. Chaque cellule de stockage fait 256 bits de long. Ainsi, trois variables, `reserve0`, `reserve1` et `blockTimestampLast`, sont allouées de manière à ce qu'une seule valeur de stockage puisse inclure les trois (112+112+32=256).
```solidity
uint public price0CumulativeLast;
uint public price1CumulativeLast;
```
-Ces variables contiennent les coûts cumulatifs pour chaque jeton (chacune en fonction de l'autre). Ils peuvent être utilisés pour calculer le taux de change moyen sur une période de temps.
+Ces variables contiennent les coûts cumulatifs pour chaque jeton (chacun en fonction de l'autre). Elles peuvent être utilisées pour calculer le taux de change moyen sur une période de temps.
```solidity
uint public kLast; // reserve0 * reserve1, as of immediately after the most recent liquidity event
```
-Dans le cadre de l'échange de paires, le taux de change entre le jeton0 et jeton 1 est déterminé en gardant le multiple des deux réserves constant lors des échanges. `kLast` est cette valeur. Elle change lors du dépot de liquidités par un fournisseur ou des retraits de jetons et augmente légèrement à cause des frais de marché de 0,3 %.
+Pour décider du taux de change entre jeton0 et jeton1, l'échange de paires maintient le multiple des deux réserves constant pendant les transactions. `kLast` est cette valeur. Elle change lorsqu'un fournisseur de liquidités dépose ou retire des jetons, et elle augmente légèrement en raison des frais de marché de 0,3 %.
-Voici un exemple simple. Notez que pour des raisons de simplicité, le tableau n'affiche que trois chiffres après la virgule et que nous ignorons le taux de change de 0,3 % et qu'ainsi, les chiffres présentés sont inexacts.
+Voici un exemple simple. Notez que par souci de simplicité, le tableau ne comporte que trois chiffres après la virgule, et que nous ignorons les frais de transaction de 0,3 %, de sorte que les chiffres ne sont pas exacts.
-| Evénement | reserve0 | reserve1 | reserve0 \* reserve1 | Taux de change moyen (jeton1 / jeton0) |
-| ----------------------------------------------------- | ---------:| ---------:| ----------------------:| -------------------------------------- |
-| Configuration initiale | 1.000,000 | 1.000,000 | 1.000.000 | |
-| Le trader A échange 50 jetons0 contre 47,619 jetons1 | 1.050,000 | 952,381 | 1.000.000 | 0,952 |
-| Le trader B échange 10 jetons0 contre 8,984 jetons1 | 1.060,000 | 943,396 | 1.000.000 | 0,898 |
-| Le trader C échange 40 jetons0 pcontre 34,305 jetons1 | 1.100,000 | 909,090 | 1.000.000 | 0,858 |
-| Le trader D échange 100 jetons1 contre 109,01 jetons0 | 990,990 | 1.009,090 | 1.000.000 | 0,917 |
-| Le trader E échange 10 jetons0 contre 10,079 jetons1 | 1.000.990 | 999.010 | 1.000,000 | 1,008 |
+| Événement | réserve0 | réserve1 | réserve0 \* réserve1 | Taux de change moyen (jeton1 / jeton0) |
+| ----------------------------------------------------- | --------: | --------: | -------------------: | --------------------------------------------------------- |
+| Configuration initiale | 1 000,000 | 1 000,000 | 1 000 000 | |
+| Le trader A échange 50 jetons0 contre 47,619 jetons1 | 1 050,000 | 952,381 | 1 000 000 | 0,952 |
+| Le trader B échange 10 jetons0 contre 8,984 jetons1 | 1 060,000 | 943,396 | 1 000 000 | 0,898 |
+| Le trader C échange 40 jetons0 contre 34,305 jetons1 | 1 100,000 | 909,090 | 1 000 000 | 0,858 |
+| Le trader D échange 100 jetons1 contre 109,01 jetons0 | 990,990 | 1 009,090 | 1 000 000 | 0,917 |
+| Le trader E échange 10 jetons0 contre 10,079 jetons1 | 1 000,990 | 999,010 | 1 000 000 | 1,008 |
-Comme les traders fournissent plus de jetons0, la valeur relative du jeton1 augmente et vice versa, en fonction de l'offre et de la demande.
+Plus les traders fournissent de jetons0, plus la valeur relative du jeton1 augmente, et vice versa, en fonction de l'offre et de la demande.
-#### Verrouiller {#pair-lock}
+#### Verrouillage {#pair-lock}
```solidity
uint private unlocked = 1;
```
-Il existe une classe de vulnérabilités de sécurité liées à la [faille de réentrance](https://medium.com/coinmonks/ethernaut-lvl-10-re-entrancy-walkthrough-how-to-abuse-execution-ordering-and-reproduce-the-dao-7ec88b912c14). Uniswap doit transférer arbitrairement des jetons ERC-20, ce qui signifie appler des contrats ERC-20 qui pourraient tenter d'utiliser à mauvais escient le marché Uniswap. En disposant d'une variable `unlocked` comme partie du contrat, nous pouvons empêcher les fonctions d'être appelées pendant qu'elles sont en cours d'exécution (au cours de la même transaction).
+Il existe une catégorie de vulnérabilités de sécurité basées sur [l'abus de réentrance](https://medium.com/coinmonks/ethernaut-lvl-10-re-entrancy-walkthrough-how-to-abuse-execution-ordering-and-reproduce-the-dao-7ec88b912c14). Uniswap doit transférer des jetons ERC-20 arbitraires, ce qui signifie appeler des contrats ERC-20 qui pourraient tenter d'abuser du marché Uniswap qui les appelle.
+En intégrant une variable `unlocked` au contrat, nous pouvons empêcher l'appel de fonctions pendant qu'elles sont en cours d'exécution (dans la même transaction).
```solidity
modifier lock() {
```
-Cette fonction est un [modificateur](https://docs.soliditylang.org/en/v0.8.3/contracts.html#function-modifiers), une fonction qui entoure une fonction normale pour changer son comportement d'une manière ou d'une autre.
+Cette fonction est un [modificateur](https://docs.soliditylang.org/en/v0.8.3/contracts.html#function-modifiers), une fonction qui enveloppe une fonction normale pour en modifier le comportement d'une manière ou d'une autre.
```solidity
require(unlocked == 1, 'UniswapV2: LOCKED');
unlocked = 0;
```
-Si `unlocked` est égal à un, définissez-la à zéro. Si elle est déjà à zéro, faites échouer l'appel.
+Si `unlocked` est égal à un, le définir à zéro. S'il est déjà à zéro, annuler l'appel, le faire échouer.
```solidity
_;
```
-Dans un modificateur `_ ;` est l'appel à la fonction originale (avec tous les paramètres). Ici, cela signifie que l'appel de fonction ne se produit que si `unlocked` était un paramètre appelé, et que, lors de son exécution, la valeur de `unlocked` est zéro.
+Dans un modificateur, `_;` est l'appel de fonction d'origine (avec tous les paramètres). Ici, cela signifie que l'appel de fonction ne se produit que si `unlocked` valait un lorsqu'il a été appelé, et que pendant son exécution, la valeur de `unlocked` est nulle.
```solidity
unlocked = 1;
}
```
-Après le retour de la fonction principale, déverrouillez.
+Une fois que la fonction principale est retournée, libérer le verrou.
-#### Misc. fonctions {#pair-misc}
+#### Divers fonctions {#pair-misc}
```solidity
function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {
@@ -256,37 +258,37 @@ Après le retour de la fonction principale, déverrouillez.
}
```
-Cette fonction fournit aux appelants l'état courant de l'échange. Notez que les fonctions Solidity [peuvent faire remonter des valeurs multiples](https://docs.soliditylang.org/en/v0.8.3/contracts.html#returning-multiple-values).
+Cette fonction fournit aux appelants l'état actuel de l'échange. Notez que les fonctions Solidity [peuvent retourner plusieurs valeurs](https://docs.soliditylang.org/en/v0.8.3/contracts.html#returning-multiple-values).
```solidity
function _safeTransfer(address token, address to, uint value) private {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));
```
-Cette fonction interne transfère un montant de jetons ERC20 de l'échange à une autre personne. `SELECTOR` spécifie que la fonction que nous appelons est `transfer(address,uint)` (voir définition ci-dessus).
+Cette fonction interne transfère un montant de jetons ERC20 de l'échange à une autre personne. `SELECTOR` spécifie que la fonction que nous appelons est `transfer(address,uint)` (voir la définition ci-dessus).
-Pour éviter d'avoir à importer une interface pour la fonction jeton, nous créons « manuellement » l'appel en utilisant l'une des [fonctions ABI](https://docs.soliditylang.org/en/v0.8.3/units-and-global-variables.html#abi-encoding-and-decoding-functions).
+Pour éviter d'avoir à importer une interface pour la fonction de jeton, nous créons « manuellement » l'appel en utilisant l'une des [fonctions ABI](https://docs.soliditylang.org/en/v0.8.3/units-and-global-variables.html#abi-encoding-and-decoding-functions).
```solidity
require(success && (data.length == 0 || abi.decode(data, (bool))), 'UniswapV2: TRANSFER_FAILED');
}
```
-Un appel de transfert ERC-20 peut signaler un échec de deux façons :
+Un appel de transfert ERC-20 peut signaler un échec de deux manières :
-1. Rétablir. Lorsque l'appel à un contrat externe indique que la valeur de retour booléen est `false`
-2. Terminer normalement mais signaler un échec. Dans ce cas, le tampon de valeur de retour a une longueur non nulle et, lorsque décodé comme une valeur booléenne, est `false`
+1. Annuler. Si un appel à un contrat externe est annulé, alors la valeur de retour booléenne est `false`.
+2. Se terminer normalement mais signaler un échec. Dans ce cas, le tampon de valeur de retour a une longueur non nulle et, lorsqu'il est décodé en tant que valeur booléenne, il est `false`.
-Si l'une ou l'autre de ces conditions se produit, revenez en arrière.
+Si l'une de ces conditions se produit, annuler.
-#### Évènements {#pair-events}
+#### Événements {#pair-events}
```solidity
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
```
-Ces deux événements sont émis lorsqu'un fournisseur de liquidités dépose des liquidités (`Mint`) ou les retire (`Burn`). Dans les deux cas, les montants des jetons0 et jetons1 déposés ou retirés font partie de l'événement, comme également l'identité du compte qui les a appelés (`sender`). Dans le cas d'un retrait, l'événement inclut également la cible qui a reçu les jetons (`to`), qui peut ne pas être la même que l'expéditeur.
+Ces deux événements sont émis lorsqu'un fournisseur de liquidités dépose des liquidités (`Mint`) ou les retire (`Burn`). Dans les deux cas, les montants des jetons0 et jetons1 déposés ou retirés font partie de l'événement, tout comme l'identité du compte qui nous a appelés (`sender`). Dans le cas d'un retrait, l'événement inclut également la cible qui a reçu les jetons (`to`), qui peut ne pas être la même que l'expéditeur.
```solidity
event Swap(
@@ -299,17 +301,18 @@ Ces deux événements sont émis lorsqu'un fournisseur de liquidités dépose de
);
```
-Cet événement est émis lorsqu'un trader échange un jeton contre un autre. Encore une fois, l'expéditeur et le destinataire peuvent ne pas être les mêmes. Chaque jeton peut être soit envoyé à l’échange, soit reçu de celui-ci.
+Cet événement est émis lorsqu'un trader échange un jeton contre un autre. Encore une fois, l'expéditeur et le destinataire peuvent ne pas être les mêmes.
+Chaque jeton peut être soit envoyé à l’échange, soit reçu de celui-ci.
```solidity
event Sync(uint112 reserve0, uint112 reserve1);
```
-Enfin, `Sync` est émis chaque fois que des jetons sont ajoutés ou retirés, quelle que soit la raison, pour fournir les dernières informations de réserve (et donc le taux de change).
+Enfin, `Sync` est émis chaque fois que des jetons sont ajoutés ou retirés, quelle qu'en soit la raison, pour fournir les dernières informations de réserve (et donc le taux de change).
#### Fonctions de configuration {#pair-setup}
-Ces fonctions sont censées être appelées une fois, lors de la mise en place de la nouvelle paire d’échange.
+Ces fonctions sont censées être appelées une fois, lors de la mise en place du nouvel échange de paires.
```solidity
constructor() public {
@@ -317,7 +320,7 @@ Ces fonctions sont censées être appelées une fois, lors de la mise en place d
}
```
-Le constructeur s'assure que nous garderons une trace de l'adresse de l'usine qui a créé la paire. Ces informations sont requises pour `initialiser` et pour les frais d'usine (s'il y en a)
+Le constructeur s'assure que nous garderons une trace de l'adresse de l'usine qui a créé la paire. Ces informations sont requises pour `initialize` et pour les frais d'usine (s'il y en a).
```solidity
// called once by the factory at time of deployment
@@ -328,7 +331,7 @@ Le constructeur s'assure que nous garderons une trace de l'adresse de l'usine qu
}
```
-Cette fonction permet à l'usine (et seulement à l'usine) de spécifier les deux jetons ERC-20 que cette paire va échanger.
+Cette fonction permet à l'usine (et seulement à l'usine) de spécifier les deux jetons ERC-20 que cette paire échangera.
#### Fonctions de mise à jour interne {#pair-update-internal}
@@ -345,7 +348,7 @@ Cette fonction est appelée chaque fois que des jetons sont déposés ou retiré
require(balance0 <= uint112(-1) && balance1 <= uint112(-1), 'UniswapV2: OVERFLOW');
```
-Si solde0 ou solde1 (uint256) est supérieur à uint112(-1) (=2^112-1) (donc il déborde et se retrouve à 0 lorsqu'il est converti en uint112), refusez de continuer la \_update pour éviter les débordements. Avec un jeton normal qui peut être subdivisé en 10^18 unités, cela signifie que chaque échange est limité à environ 5,1\*10^15 de chaque jeton. Jusqu'à présent, cela n'a posé aucun problème.
+Si balance0 ou balance1 (uint256) est supérieur à uint112(-1) (=2^112-1) (donc il déborde et revient à 0 lorsqu'il est converti en uint112), refuser de continuer le \_update pour éviter les débordements. Avec un jeton normal qui peut être subdivisé en 10^18 unités, cela signifie que chaque échange est limité à environ 5,1\*10^15 de chaque jeton. Jusqu'à présent, cela n'a pas posé de problème.
```solidity
uint32 blockTimestamp = uint32(block.timestamp % 2**32);
@@ -362,20 +365,20 @@ Si le temps écoulé n'est pas nul, cela signifie que nous sommes la première t
}
```
-Chaque accumulateur de coûts est mis à jour en tenant compte du coût le plus récent (réserve de l'autre jeton/réserve de ce jeton) multiplié par le temps écoulé en secondes. Pour obtenir un prix moyen, vous prenez le prix cumulé de deux points dans le temps et le divisez par la différence de temps entre ces deux points. Par exemple, supposons cette séquence d'événements :
+Chaque accumulateur de coûts est mis à jour avec le coût le plus récent (réserve de l'autre jeton/réserve de ce jeton) multiplié par le temps écoulé en secondes. Pour obtenir un prix moyen, vous lisez le prix cumulé à deux moments donnés et vous divisez par la différence de temps entre eux. Par exemple, supposons la séquence d'événements suivante :
-| Evénement | réserve0 | réserve1 | horodatage | Taux de change marginal (réserve1 / réserve0) | DernierprixCumulé0 |
-| --------------------------------------------------------- | ---------:| ---------:| ---------- | ---------------------------------------------:| ----------------------------:|
-| Configuration initiale | 1.000,000 | 1.000,000 | 5.000 | 1,000 | 0 |
-| Le Trader A dépose 50 jetons0 et récupère 47,619 jetons1 | 1.050,000 | 952,381 | 5.020 | 0,907 | 20 |
-| Le Trader B dépose 10 jetons0 et récupère 8,984 jetons1 | 1.060,000 | 943,396 | 5.030 | 0,890 | 20+10\*0,907 = 29,07 |
-| Le Trader C dépose 40 jetons0 et récupère 34,305 jetons1 | 1.100,000 | 909,090 | 5.100 | 0,826 | 29,07+70\*0,890 = 91,37 |
-| Le Trader D dépose 100 jetons1 et récupère 109,01 jetons0 | 990,990 | 1.009,090 | 5.110 | 1,018 | 91,37+10\*0,826 = 99,63 |
-| Le Trader E dépose 10 jetons0 et récupère 10,079 jetons1 | 1.000,990 | 999,010 | 5.150 | 0,998 | 99,63+40\*1,1018 = 143,702 |
+| Événement | réserve0 | réserve1 | horodatage | Taux de change marginal (réserve1 / réserve0) | price0CumulativeLast |
+| --------------------------------------------------------- | --------: | --------: | ---------- | ---------------------------------------------------------------: | -------------------------: |
+| Configuration initiale | 1 000,000 | 1 000,000 | 5 000 | 1,000 | 0 |
+| Le trader A dépose 50 jetons0 et récupère 47,619 jetons1 | 1 050,000 | 952,381 | 5 020 | 0,907 | 20 |
+| Le trader B dépose 10 jetons0 et récupère 8,984 jetons1 | 1 060,000 | 943,396 | 5 030 | 0,890 | 20+10\*0,907 = 29,07 |
+| Le trader C dépose 40 jetons0 et récupère 34,305 jetons1 | 1 100,000 | 909,090 | 5 100 | 0,826 | 29,07+70\*0,890 = 91,37 |
+| Le trader D dépose 100 jetons1 et récupère 109,01 jetons0 | 990,990 | 1 009,090 | 5 110 | 1,018 | 91,37+10\*0,826 = 99,63 |
+| Le trader E dépose 10 jetons0 et récupère 10,079 jetons1 | 1 000,990 | 999,010 | 5 150 | 0,998 | 99,63+40\*1,1018 = 143,702 |
-Disons que nous souhaitons calculer le prix moyen du **Jeton** entre les horodatages 5.030 et 5.150. La différence de valeur du `price0Cumulative` est 143,702-29,07=114,632. Il s'agit de la moyenne sur deux minutes (120 secondes). Donc le prix moyen est 114,632/120 = 0,955.
+Disons que nous souhaitons calculer le prix moyen du **Jeton0** entre les horodatages 5 030 et 5 150. La différence de la valeur de `price0Cumulative` est 143,702-29,07=114,632. Il s'agit de la moyenne sur deux minutes (120 secondes). Le prix moyen est donc 114,632/120 = 0,955.
-Ce calcul de prix est la raison pour laquelle nous avons besoin de connaître les anciennes tailles de réserve.
+Ce calcul de prix est la raison pour laquelle nous devons connaître les anciennes tailles de réserve.
```solidity
reserve0 = uint112(balance0);
@@ -385,7 +388,7 @@ Ce calcul de prix est la raison pour laquelle nous avons besoin de connaître le
}
```
-Enfin, mettez à jour les variables globales et émettez un événement `Sync`.
+Enfin, mettre à jour les variables globales et émettre un événement `Sync`.
##### \_mintFee
@@ -394,29 +397,30 @@ Enfin, mettez à jour les variables globales et émettez un événement `Sync`.
function _mintFee(uint112 _reserve0, uint112 _reserve1) private returns (bool feeOn) {
```
-Dans Uniswap 2.0, les traders paient des frais de 0,30 % pour utiliser le marché. La plus grande partie de ces frais (0,25 % de la transaction) va toujours aux fournisseurs de liquidités. Les 0,05 % restants peuvent être distribués soit aux fournisseurs de liquidités, soit à une adresse spécifiée par l'usine en tant que frais de protocole, qui paie Uniswap pour leurs efforts de développement.
+Dans Uniswap 2.0, les traders paient des frais de 0,30 % pour utiliser le marché. La plus grande partie de ces frais (0,25 % de la transaction) va toujours aux fournisseurs de liquidités. Les 0,05 % restants peuvent être versés soit aux fournisseurs de liquidités, soit à une adresse spécifiée par l'usine en tant que frais de protocole, qui rémunère Uniswap pour ses efforts de développement.
-Pour réduire les calculs (et donc les frais de gaz), ces frais ne sont calculés que lorsque la liquidité est ajoutée ou retirée du pool plutôt que lors de chaque transaction.
+Pour réduire les calculs (et donc les frais de gaz), ces frais ne sont calculés que lorsque la liquidité est ajoutée ou retirée du pool, plutôt qu'à chaque transaction.
```solidity
address feeTo = IUniswapV2Factory(factory).feeTo();
feeOn = feeTo != address(0);
```
-Regardez les frais de destination de l'usine. S'ils sont de zéro, alors il n'y aura pas de frais de protocole et donc nul besoin de les calculer.
+Lire la destination des frais de l'usine. S'ils sont nuls, alors il n'y a pas de frais de protocole et il n'est pas nécessaire de les calculer.
```solidity
uint _kLast = kLast; // gas savings
```
-La variable d'état `kLast` est située dans le stockage et aura donc une valeur entre différents appels au contrat. L'accès au stockage est beaucoup plus onéreux que l'accès à la mémoire volatile qui est libérée lorsque l'appel de fonction au contrat se termine. Ainsi, nous utilisons une variable interne pour faire des économies sur le gaz.
+La variable d'état `kLast` est située dans le stockage, elle aura donc une valeur entre les différents appels au contrat.
+L'accès au stockage est beaucoup plus cher que l'accès à la mémoire volatile qui est libérée lorsque l'appel de fonction au contrat se termine. Nous utilisons donc une variable interne pour économiser du gaz.
```solidity
if (feeOn) {
if (_kLast != 0) {
```
-Les fournisseurs de liquidités obtiennent leur part par simple appréciation de leurs jetons de liquidité. Mais les frais de protocole nécessitent de nouveaux jetons de liquidité à frapper et à fournir à l'adresse `feeTo`.
+Les fournisseurs de liquidités obtiennent leur part simplement par l'appréciation de leurs jetons de liquidité. Mais les frais de protocole nécessitent que de nouveaux jetons de liquidité soient frappés et fournis à l'adresse `feeTo`.
```solidity
uint rootK = Math.sqrt(uint(_reserve0).mul(_reserve1));
@@ -424,7 +428,7 @@ Les fournisseurs de liquidités obtiennent leur part par simple appréciation de
if (rootK > rootKLast) {
```
-S'il y a de nouvelles liquidités sur lesquelles percevoir des frais de protocole. Vous pourrez voir la fonction racine carrée [plus loin dans cet article](#Math)
+S'il y a de nouvelles liquidités sur lesquelles percevoir des frais de protocole. Vous pouvez voir la fonction de racine carrée [plus loin dans cet article](#Math).
```solidity
uint numerator = totalSupply.mul(rootK.sub(rootKLast));
@@ -432,7 +436,7 @@ S'il y a de nouvelles liquidités sur lesquelles percevoir des frais de protocol
uint liquidity = numerator / denominator;
```
-Ce calcul complexe des frais est expliqué dans [le livre blanc](https://uniswap.org/whitepaper.pdf) en page 5. Nous savons qu'entre le moment où le temps `kLast` a été calculé et le moment présent, aucune liquidité n'a été ajoutée ou supprimée (car nous n'exécutons ce calcul qu'à chaque fois que la liquidité est ajoutée ou supprimée, avant qu'il ne change réellement). Par conséquent, tout changement dans `reserve0 * reserve1` doit venir des frais de transaction (sans eux, nous conserverons la constante `reserve0 * reserve1`).
+Ce calcul compliqué des frais est expliqué dans [le livre blanc](https://app.uniswap.org/whitepaper.pdf) à la page 5. Nous savons qu'entre le moment où `kLast` a été calculé et le moment présent, aucune liquidité n'a été ajoutée ou supprimée (car nous exécutons ce calcul à chaque fois que la liquidité est ajoutée ou supprimée, avant qu'elle ne change réellement). Par conséquent, tout changement dans `reserve0 * reserve1` doit provenir des frais de transaction (sans eux, nous conserverions la constante `reserve0 * reserve1`).
```solidity
if (liquidity > 0) _mint(feeTo, liquidity);
@@ -440,7 +444,7 @@ Ce calcul complexe des frais est expliqué dans [le livre blanc](https://uniswap
}
```
-Utilisez la fonction `UniswapV2ERC20._mint` pour créer les jetons de liquidité supplémentaires et les affecter à `feeTo`.
+Utiliser la fonction `UniswapV2ERC20._mint` pour créer les jetons de liquidité supplémentaires et les affecter à `feeTo`.
```solidity
} else if (_kLast != 0) {
@@ -449,11 +453,12 @@ Utilisez la fonction `UniswapV2ERC20._mint` pour créer les jetons de liquidité
}
```
-S'il n'existe pas de frais, réglez `kLast` à zéro (si ce n'est pas déjà le cas). Lorsque ce contrat a été rédigé, il existait une [fonctionnalité de remboursement de gaz](https://eips.ethereum.org/EIPS/eip-3298) qui encourageait les contrats à réduire la taille globale de l'état d'Ethereum en mettant à zéro le stockage dont ils n'avaient pas besoin. Ce code récupère ce remboursement lorsque c'est possible.
+S'il n'y a pas de frais, régler `kLast` à zéro (si ce n'est pas déjà le cas). Lorsque ce contrat a été rédigé, il existait une [fonctionnalité de remboursement de gaz](https://eips.ethereum.org/EIPS/eip-3298) qui encourageait les contrats à réduire la taille globale de l'état d'Ethereum en mettant à zéro le stockage dont ils n'avaient pas besoin.
+Ce code obtient ce remboursement lorsque c'est possible.
#### Fonctions accessibles en externe {#pair-external}
-Notez que bien que toute transaction ou contrat _peut_ appeler ces fonctions. Elles sont conçues pour être appelées depuis le contrat périphérique. Si vous les appelez directement, vous ne pourrez pas tricher concernant la paire d'échange, mais vous pourriez perdre des valeurs par erreur.
+Notez que bien que toute transaction ou tout contrat _puisse_ appeler ces fonctions, elles sont conçues pour être appelées depuis le contrat périphérique. Si vous les appelez directement, vous ne pourrez pas tricher sur l'échange de paires, mais vous pourriez perdre de la valeur par erreur.
##### frapper
@@ -462,13 +467,13 @@ Notez que bien que toute transaction ou contrat _peut_ appeler ces fonctions. El
function mint(address to) external lock returns (uint liquidity) {
```
-Cette fonction est appelée lorsqu'un fournisseur de liquidités ajoute de la liquidité à la réserve. Elle frappe des jetons de liquidités supplémentaires en récompense. Elle devrait être appelée à partir d'un [contrat périphérique](#UniswapV2Router02) qui l'appelle après avoir ajouté la liquidité dans la même transaction (ainsi personne d'autre ne serait en mesure de soumettre une transaction sollicitant la nouvelle liquidité avant le propriétaire légitime).
+Cette fonction est appelée lorsqu'un fournisseur de liquidités ajoute de la liquidité au pool. Elle frappe des jetons de liquidité supplémentaires en guise de récompense. Elle devrait être appelée à partir d'[un contrat périphérique](#UniswapV2Router02) qui l'appelle après avoir ajouté la liquidité dans la même transaction (afin que personne d'autre ne puisse soumettre une transaction réclamant la nouvelle liquidité avant le propriétaire légitime).
```solidity
(uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
```
-C'est ainsi que doivent être lus les résultats d'une fonction Solidity qui restitue plusieurs valeurs. Nous rejetons les dernières valeurs retournées, l'horodatage du bloc, car nous n'en avons pas besoin.
+C'est ainsi qu'il faut lire les résultats d'une fonction Solidity qui retourne plusieurs valeurs. Nous ignorons la dernière valeur retournée, l'horodatage du bloc, car nous n'en avons pas besoin.
```solidity
uint balance0 = IERC20(token0).balanceOf(address(this));
@@ -477,13 +482,13 @@ C'est ainsi que doivent être lus les résultats d'une fonction Solidity qui res
uint amount1 = balance1.sub(_reserve1);
```
-Récupèrez les soldes courants et vérifiez le montant ajouté à chaque type de jeton.
+Obtenir les soldes actuels et voir combien a été ajouté pour chaque type de jeton.
```solidity
bool feeOn = _mintFee(_reserve0, _reserve1);
```
-Calculez les frais de protocole à percevoir, le cas échéant, et minez les jetons de liquidité en conséquence. Parce que les paramètres de `_mintFee` sont les anciennes valeurs de réserve, les frais sont calculés avec précision uniquement sur la base des modifications apportées au pool en raison des frais.
+Calculer les frais de protocole à percevoir, le cas échéant, et frapper les jetons de liquidité en conséquence. Étant donné que les paramètres de `_mintFee` sont les anciennes valeurs de réserve, les frais sont calculés avec précision en se basant uniquement sur les changements de pool dus aux frais.
```solidity
uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
@@ -492,35 +497,36 @@ Calculez les frais de protocole à percevoir, le cas échéant, et minez les jet
_mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens
```
-S'il s'agit du premier dépôt, créez des jetons `MINIMUM_LIQUIDITY` et envoyez-les à l'adresse zéro pour les verrouiller. Ils ne peuvent jamais être rachetés, ce qui signifie que la réserve ne sera jamais complètement vide (d'une certaine façon cela nous évite une division par zéro). La valeur `MINIMUM_LIQUIDITY` est d'un millier, ce qui implique que la plupart des ERC-20 sont subdivisés en unités de 10^-18'e d'un jeton, étant donné que la division de l'ETH en wei est de 10^-15 de la valeur d'un jeton unique. Ce n'est pas un coût élevé.
+S'il s'agit du premier dépôt, créer des jetons `MINIMUM_LIQUIDITY` et les envoyer à l'adresse zéro pour les verrouiller. Ils ne peuvent jamais être rachetés, ce qui signifie que le pool ne sera jamais complètement vidé (cela nous évite une division par zéro à certains endroits). La valeur de `MINIMUM_LIQUIDITY` est de mille, ce qui, si l'on considère que la plupart des ERC-20 sont subdivisés en unités de 10^-18 d'un jeton, comme l'ETH est divisé en wei, correspond à 10^-15 de la valeur d'un seul jeton. Le coût n'est pas élevé.
-Lors du premier dépôt, nous ne connaissons pas la valeur relative des deux jetons, donc nous multiplions simplement les montants et prenons une racine carrée, en supposant que le dépôt nous donne la même valeur pour les deux jetons.
+Au moment du premier dépôt, nous ne connaissons pas la valeur relative des deux jetons, nous multiplions donc simplement les montants et prenons une racine carrée, en supposant que le dépôt nous fournisse une valeur égale pour les deux jetons.
-Nous pouvons nous y fier parce qu'il est dans l'intérêt du déposant de fournir une valeur égale pour éviter de perdre de la valeur à l'arbitrage. Imaginons que la valeur des deux jetons est identique mais que notre déposant a déposé quatre fois plus de **Jetons1** que de **Jetons0**. Un trader peut s'appuyer sur le fait que l'échange de paire laisse supposer qu'il est plus utile de retirer de la valeur du **Jeton0**.
+Nous pouvons nous y fier car il est dans l'intérêt du déposant de fournir une valeur égale pour éviter de perdre de la valeur à cause de l'arbitrage.
+Imaginons que la valeur des deux jetons est identique, mais que notre déposant ait déposé quatre fois plus de **Jeton1** que de **Jeton0**. Un trader peut utiliser le fait que l'échange de paires pense que le **Jeton0** a plus de valeur pour en extraire de la valeur.
-| Evénement | réserve0 | réserve1 | réserve0 \* réserve1 | Valeur du pool (réserve0 + réserve1) |
-| ---------------------------------------------------------------------- | --------:| --------:| ----------------------:| ------------------------------------:|
-| Configuration initiale | 8 | 32 | 256 | 40 |
-| Le Trader dépose dépose 8 jetons **Jeton0** et récupère 16 **Jetons1** | 16 | 16 | 256 | 32 |
+| Événement | réserve0 | réserve1 | réserve0 \* réserve1 | Valeur du pool (reserve0 + reserve1) |
+| ------------------------------------------------------------ | -------: | -------: | -------------------: | ------------------------------------------------------: |
+| Configuration initiale | 8 | 32 | 256 | 40 |
+| Le trader dépose 8 jetons **Jeton0**, récupère 16 **Jeton1** | 16 | 16 | 256 | 32 |
-Comme vous pouvez le constater, le trader a gagné 8 jetons supplémentaires qui viennent d'une réduction de la valeur du pool, affectant le déposant qui le possède.
+Comme vous pouvez le voir, le trader a gagné 8 jetons supplémentaires, qui proviennent d'une réduction de la valeur du pool, ce qui pénalise le déposant qui le possède.
```solidity
} else {
liquidity = Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);
```
-À chaque dépôt ultérieur, nous connaissons déjà le taux de change entre les deux actifs et nous attendons des fournisseurs de liquidités qu'ils fournissent une valeur égale dans les deux. S'ils ne le font pas, nous leur donnons en guise de punition des jetons de liquidité basés sur la valeur la plus basse.
+À chaque dépôt ultérieur, nous connaissons déjà le taux de change entre les deux actifs et nous attendons des fournisseurs de liquidités qu'ils fournissent une valeur égale pour les deux. S'ils ne le font pas, nous leur donnons des jetons de liquidité basés sur la valeur inférieure qu'ils ont fournie, en guise de pénalité.
-Qu'il s'agisse du dépôt initial ou d'un dépôt ultérieur, le nombre de jetons de liquidité que nous fournissons est égal à la racine carrée du changement dans `reserve0*reserve1` et la valeur du jeton de liquidité ne change pas (sauf si nous obtenons un dépôt qui n'a pas de valeurs égales pour les deux types, auquel cas l'« amende » est distribuée). Voici un autre exemple avec deux jetons qui ont la même valeur, avec trois bons dépôts et un mauvais (dépôt d'un seul type de jeton, donc il ne produit aucun jeton de liquidité).
+Qu'il s'agisse du dépôt initial ou d'un dépôt ultérieur, le nombre de jetons de liquidité que nous fournissons est égal à la racine carrée de la variation de `reserve0*reserve1` et la valeur du jeton de liquidité ne change pas (sauf si nous recevons un dépôt qui n'a pas de valeurs égales pour les deux types, auquel cas l'« amende » est distribuée). Voici un autre exemple avec deux jetons qui ont la même valeur, avec trois bons dépôts et un mauvais (dépôt d'un seul type de jeton, il ne produit donc aucun jeton de liquidité).
-| Événement | réserve0 | réserve1 | réserve0 \* réserve1 | Valeur du pool (réserve0 + réserve1) | Jetons de liquidité frappés pour ce dépôt | Jetons de liquidité totaux | Valeur de chaque jeton de liquidité |
-| ------------------------------ | --------:| --------:| ----------------------:| ------------------------------------:| -----------------------------------------:| --------------------------:| -----------------------------------:|
-| Configuration initiale | 8,000 | 8,000 | 64 | 16,000 | 8 | 8 | 2,000 |
-| Dépôt de quatre de chaque type | 12,000 | 12,000 | 144 | 24,000 | 4 | 12 | 2,000 |
-| Dépôt de deux de chaque type | 14,000 | 14,000 | 196 | 28,000 | 2 | 14 | 2,000 |
-| Dépôt de valeurs inégales | 18,000 | 14,000 | 252 | 32,000 | 0 | 14 | ~2,286 |
-| Après arbitrage | ~15,874 | ~15,874 | 252 | ~31,748 | 0 | 14 | ~2,267 |
+| Événement | réserve0 | réserve1 | réserve0 \* réserve1 | Valeur du pool (réserve0 + réserve1) | Jetons de liquidité frappés pour ce dépôt | Total des jetons de liquidité | valeur de chaque jeton de liquidité |
+| ------------------------------ | ----------------------: | ----------------------: | -------------------: | ------------------------------------------------------: | ----------------------------------------: | ----------------------------: | ----------------------------------: |
+| Configuration initiale | 8,000 | 8,000 | 64 | 16,000 | 8 | 8 | 2,000 |
+| Dépôt de quatre de chaque type | 12,000 | 12,000 | 144 | 24,000 | 4 | 12 | 2,000 |
+| Dépôt de deux de chaque type | 14,000 | 14,000 | 196 | 28,000 | 2 | 14 | 2,000 |
+| Dépôt de valeur inégale | 18,000 | 14,000 | 252 | 32,000 | 0 | 14 | ~2,286 |
+| Après arbitrage | ~15,874 | ~15,874 | 252 | ~31,748 | 0 | 14 | ~2,267 |
```solidity
}
@@ -528,7 +534,7 @@ Qu'il s'agisse du dépôt initial ou d'un dépôt ultérieur, le nombre de jeton
_mint(to, liquidity);
```
-Utilisez la fonction `UniswapV2ERC20._mint` pour créer les jetons de liquidité supplémentaires et les attribuer au bon compte.
+Utiliser la fonction `UniswapV2ERC20._mint` pour créer les jetons de liquidité supplémentaires et les donner au bon compte.
```solidity
@@ -547,7 +553,8 @@ Mettre à jour les variables d'état (`reserve0`, `reserve1` et si nécessaire `
function burn(address to) external lock returns (uint amount0, uint amount1) {
```
-Cette fonction est appelée lorsque la liquidité est retirée et que les jetons de liquidité appropriés doivent être brûlés. Elle devrait également être appelée [depuis un compte périphérique](#UniswapV2Router02).
+Cette fonction est appelée lorsque la liquidité est retirée et que les jetons de liquidité appropriés doivent être brûlés.
+Elle devrait également être appelée [depuis un compte périphérique](#UniswapV2Router02).
```solidity
(uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
@@ -568,7 +575,7 @@ Le contrat périphérique a transféré la liquidité à brûler vers ce contrat
require(amount0 > 0 && amount1 > 0, 'UniswapV2: INSUFFICIENT_LIQUIDITY_BURNED');
```
-Le fournisseur de liquidités reçoit la même valeur des deux jetons. De cette façon, nous ne changeons pas le taux de change.
+Le fournisseur de liquidités reçoit la même valeur pour les deux jetons. De cette façon, nous ne modifions pas le taux de change.
```solidity
_burn(address(this), liquidity);
@@ -586,7 +593,7 @@ Le fournisseur de liquidités reçoit la même valeur des deux jetons. De cette
Le reste de la fonction `burn` est l'image miroir de la fonction `mint` ci-dessus.
-##### échanger
+##### échange
```solidity
// this low-level function should be called from a contract which performs important safety checks
@@ -605,7 +612,8 @@ Cette fonction est également censée être appelée depuis [un contrat périph
{ // scope for _token{0,1}, avoids stack too deep errors
```
-Les variables locales peuvent être stockées en mémoire ou, si elles ne sont pas trop nombreuses, directement sur la pile. Si nous pouvons limiter le nombre, nous utiliserons la pile pour utiliser moins de gaz. Pour plus de détails, consultez [the yellow paper, the formal Ethereum specifications](https://ethereum.github.io/yellowpaper/paper.pdf), p. 26, equation 298.
+Les variables locales peuvent être stockées soit en mémoire, soit, si elles ne sont pas trop nombreuses, directement sur la pile.
+Si nous pouvons limiter le nombre, nous utiliserons la pile pour consommer moins de gaz. Pour plus de détails, voir [le Yellow Paper, les spécifications formelles d'Ethereum](https://ethereum.github.io/yellowpaper/paper.pdf), p. 26, équation 298.
```solidity
address _token0 = token0;
@@ -615,13 +623,13 @@ Les variables locales peuvent être stockées en mémoire ou, si elles ne sont p
if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens
```
-Ce transfert est optimiste puisque nous transférons avant d'être sûrs que toutes les conditions sont remplies. Ceci est acceptable dans Ethereum parce que si les conditions ne sont pas remplies plus tard lors de l'appel, l'opération ainsi que les changements réalisés seront annulés.
+Ce transfert est optimiste, car nous transférons avant d'être sûrs que toutes les conditions sont remplies. Ceci est acceptable dans Ethereum car si les conditions ne sont pas remplies plus tard lors de l'appel, nous annulons l'opération ainsi que les changements qu'elle a créés.
```solidity
if (data.length > 0) IUniswapV2Callee(to).uniswapV2Call(msg.sender, amount0Out, amount1Out, data);
```
-Informez si celà est demandé, le bénéficiaire du swap.
+Informer le destinataire de l'échange si demandé.
```solidity
balance0 = IERC20(_token0).balanceOf(address(this));
@@ -629,7 +637,7 @@ Informez si celà est demandé, le bénéficiaire du swap.
}
```
-Récupèrez les soldes actuels. Le contrat périphérique nous envoie les jetons avant de nous appeler pour l'échange. Il est ainsi aisé de s'assurer que le contrat n'a pas été falsifié, cette vérification _devant_ intervenir dans le contrat de base (parce que nous pouvons être appelés par d'autres entités que notre contrat périphérique).
+Obtenir les soldes actuels. Le contrat périphérique nous envoie les jetons avant de nous appeler pour l'échange. Il est ainsi facile pour le contrat de vérifier qu'il n'est pas trompé, une vérification qui _doit_ avoir lieu dans le contrat de base (car nous pouvons être appelés par d'autres entités que notre contrat périphérique).
```solidity
uint amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0;
@@ -641,7 +649,7 @@ Récupèrez les soldes actuels. Le contrat périphérique nous envoie les jetons
require(balance0Adjusted.mul(balance1Adjusted) >= uint(_reserve0).mul(_reserve1).mul(1000**2), 'UniswapV2: K');
```
-Ceci est un test d'intégrité visant à s'assurer que nous ne perdons rien lors de l'échange. En aucune circonstance, un échange ne devrait réduire la `reserve0*reserve1`. C'est également dans ce cntexte que nous nous assurons qu'une redevance de 0,3 % est envoyée sur l'échange. Avant de vérifier la valeur de K, nous multiplions les deux soldes par 1 000 soustraits des montants multipliés par 3, ce qui signifie que 0,3 % (3/1000 = 0,003 = 0,3 %) est déduit du solde avant de comparer sa valeur K à la valeur actuelle des réserves K.
+Ceci est un contrôle de cohérence pour s'assurer que nous ne perdons rien lors de l'échange. En aucune circonstance un échange ne devrait réduire `reserve0*reserve1`. C'est également là que nous nous assurons qu'une redevance de 0,3 % est envoyée sur l'échange ; avant de vérifier la valeur de K, nous multiplions les deux soldes par 1 000 et soustrayons les montants multipliés par 3, ce qui signifie que 0,3 % (3/1000 = 0,003 = 0,3 %) est déduit du solde avant de comparer sa valeur K à la valeur K des réserves actuelles.
```solidity
}
@@ -651,16 +659,17 @@ Ceci est un test d'intégrité visant à s'assurer que nous ne perdons rien lors
}
```
-Mettre à jour `réserve0` et `réserve1`, et si nécessaire les accumulateurs de prix, l'horodatage et émettre un événement.
+Mettre à jour `reserve0` et `reserve1`, et si nécessaire les accumulateurs de prix et l'horodatage, et émettre un événement.
-##### Synchroniser ou ignorer
+##### Sync ou Skim
-Il est possible que les soldes réels se désynchronisent des réserves que l'échange de la paire aura généré. Il n'y a aucun moyen de retirer des jetons sans l'accord du contrat, mais pour les dépôts c'est une autre affaire. Un compte peut transférer des jetons à l'échange sans avoir appelé `mint` ou `swap`.
+Il est possible que les soldes réels se désynchronisent des réserves que l'échange de paires pense avoir.
+Il n'y a aucun moyen de retirer des jetons sans le consentement du contrat, mais pour les dépôts c'est une autre affaire. Un compte peut transférer des jetons à l'échange sans appeler ni `mint` ni `swap`.
Dans ce cas, il y a deux solutions :
-- `sync`, mettre à jour les réserves en tenant compte des soldes actuels
-- `skim`, retirer le montant supplémentaire. Notez que tout compte est autorisé à appeler `skim` parce que nous ne savons pas qui a déposé les jetons. Cette information est émise dans un événement, mais les événements ne sont pas accessibles depuis la blockchain.
+- `sync`, mettre à jour les réserves avec les soldes actuels
+- `skim`, retirer le montant supplémentaire. Notez que tout compte est autorisé à appeler `skim` car nous ne savons pas qui a déposé les jetons. Cette information est émise dans un événement, mais les événements ne sont pas accessibles depuis la blockchain.
```solidity
// force balances to match reserves
@@ -682,7 +691,7 @@ Dans ce cas, il y a deux solutions :
### UniswapV2Factory.sol {#UniswapV2Factory}
-[Ce contrat](https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2Factory.sol) crée l es échanges de paires.
+[Ce contrat](https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2Factory.sol) crée les échanges de paires.
```solidity
pragma solidity =0.5.16;
@@ -695,7 +704,8 @@ contract UniswapV2Factory is IUniswapV2Factory {
address public feeToSetter;
```
-Ces variables d'état sont nécessaires pour implémenter les frais de protocole (voir [le livre blanc](https://uniswap.org/whitepaper.pdf), p. 5). L'adresse `feeTo` accumule les jetons de liquidité pour les frais de protocole, et `feeToSetter` est l'adresse autorisée à changer `feeTo` en une adresse différente.
+Ces variables d'état sont nécessaires pour implémenter les frais de protocole (voir [le livre blanc](https://app.uniswap.org/whitepaper.pdf), p. 5).
+L'adresse `feeTo` accumule les jetons de liquidité pour les frais de protocole, et `feeToSetter` est l'adresse autorisée à changer `feeTo` en une adresse différente.
```solidity
mapping(address => mapping(address => address)) public getPair;
@@ -704,17 +714,17 @@ Ces variables d'état sont nécessaires pour implémenter les frais de protocole
Ces variables gardent une trace des paires, des échanges entre deux types de jetons.
-La première, `getPair`, est un mapping qui identifie un contrat d'échange de paires basé sur les deux jetons ERC-20 échangés. Les jetons ERC-20 sont identifiés par les adresses des contrats qui les implémentent. Ainsi, les clés et la valeur sont toutes des adresses. Pour obtenir l'adresse de l'échange de paires qui vous permet de convertir des `tokenA` en `tokenB`, vous utilisez `getPair[][]` (ou l'inverse).
+La première, `getPair`, est un mappage qui identifie un contrat d'échange de paires basé sur les deux jetons ERC-20 qu'il échange. Les jetons ERC-20 sont identifiés par les adresses des contrats qui les implémentent, de sorte que les clés et la valeur sont toutes des adresses. Pour obtenir l'adresse de l'échange de paires qui vous permet de convertir `tokenA` en `tokenB`, vous utilisez `getPair[][]` (ou l'inverse).
-La seconde variable, `allPairs`, est un tableau qui inclut toutes les adresses d'échanges de paires créées par cette usine. Sur Ethereum, vous ne pouvez pas itérer le contenu d'un mapping ou obtenir une liste de toutes les clés, ainsi cette variable est la seule façon de savoir quels échanges sont gérés par cette usine.
+La seconde variable, `allPairs`, est un tableau qui inclut toutes les adresses des échanges de paires créés par cette usine. Sur Ethereum, vous ne pouvez pas itérer sur le contenu d'un mapping, ni obtenir une liste de toutes les clés. Cette variable est donc le seul moyen de savoir quels échanges cette usine gère.
-Remarque : Si vous ne pouvez pas itérer sur toutes les clés d'un mapping c'est parce que le stockage des données de contrat est _coûteux_, ainsi moins nous en utilisons, moins nous réalisons de changements et mieux ce sera. Vous pouvez créer des mappings [qui supportent l'itération](https://github.com/ethereum/dapp-bin/blob/master/library/iterable_mapping.sol) mais qui nécessitent un stockage supplémentaire pour une liste de clés. Dans la plupart des applications, vous n'avez pas besoin de ça.
+Note : La raison pour laquelle vous ne pouvez pas itérer sur toutes les clés d'un mapping est que le stockage des données de contrat est _coûteux_, donc moins nous en utilisons, et moins nous le modifions, mieux c'est. Vous pouvez créer [des mappings qui supportent l'itération](https://github.com/ethereum/dapp-bin/blob/master/library/iterable_mapping.sol), mais ils nécessitent un stockage supplémentaire pour une liste de clés. Dans la plupart des applications, vous n'en avez pas besoin.
```solidity
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
```
-Cet événement est émis lorsqu'un nouvel échange de paires est créé. Il comprend les adresses des jetons, l'adresse de l'échange de la paire et le nombre total d'échanges gérés par l'usine.
+Cet événement est émis lorsqu'un nouvel échange de paires est créé. Il comprend les adresses des jetons, l'adresse de l'échange de paires et le nombre total d'échanges gérés par l'usine.
```solidity
constructor(address _feeToSetter) public {
@@ -722,7 +732,7 @@ Cet événement est émis lorsqu'un nouvel échange de paires est créé. Il com
}
```
-La seule chose que le constructeur fait est de spécifier le `feeToSetter`. Les usines commencent sans frais, et seul `feeSetter` peut changer cela.
+La seule chose que fait le constructeur est de spécifier le `feeToSetter`. Les usines commencent sans frais, et seul `feeSetter` peut changer cela.
```solidity
function allPairsLength() external view returns (uint) {
@@ -730,7 +740,7 @@ La seule chose que le constructeur fait est de spécifier le `feeToSetter`. Les
}
```
-Cette fonction restitue le nombre de paires d'échange.
+Cette fonction retourne le nombre de paires d'échange.
```solidity
function createPair(address tokenA, address tokenB) external returns (address pair) {
@@ -743,20 +753,22 @@ C'est la fonction principale de l'usine : créer un échange de paires entre deu
(address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
```
-Nous souhaitons que l'adresse du nouvel échange soit déterminable de sorte qu'elle puisse être calculée à l'avance hors chaîne (cela peut être utile pour [les transactions de couche 2](/developers/docs/layer-2-scaling/)). Pour cela, nous devons avoir les adresses de jetons dans un ordre cohérent indépendant de l'ordre dans lequel nous les avons reçus. Aussi les trions-nous ici.
+Nous voulons que l'adresse du nouvel échange soit déterministe, afin qu'elle puisse être calculée à l'avance hors chaîne (cela peut être utile pour les [transactions de couche 2](/developers/docs/scaling/)).
+Pour ce faire, nous devons avoir un ordre cohérent des adresses de jetons, quel que soit l'ordre dans lequel nous les avons reçues. Nous les trions donc ici.
```solidity
require(token0 != address(0), 'UniswapV2: ZERO_ADDRESS');
require(getPair[token0][token1] == address(0), 'UniswapV2: PAIR_EXISTS'); // single check is sufficient
```
-Les grands pools de liquidités sont meilleurs que les petits parce qu'ils proposent des prix plus stables. Nous ne voulons pas disposer de plus d'un pool de liquidités par paire de jetons. S'il existe déjà un échange, il n'est pas nécessaire d'en créer un autre pour la même paire.
+Les grands pools de liquidités sont préférables aux petits, car ils ont des prix plus stables. Nous ne voulons pas avoir plus d'un pool de liquidités par paire de jetons. S'il existe déjà un échange, il n'est pas nécessaire d'en créer un autre pour la même paire.
```solidity
bytes memory bytecode = type(UniswapV2Pair).creationCode;
```
-Pour créer un nouveau contrat, nous avons besoin du code qui va le créer (tant la fonction constructeur que le code qui va écrire en mémoire le bytecode EVM du contrat effectif). Normalement dans Solidity nous utilisons `addr = new ()` et le compilateur s'occupe de tout pour nous. Pour obtenir une adresse de contrat déterminable, nous devons toutefois utiliser [l'opcode CREATE2](https://eips.ethereum.org/EIPS/eip-1014). Lorsque ce code a été écrit, cet opcode n'était pas encore pris en charge par Solidity et il était donc nécessaire d'obtenir manuellement le code. Ce n'est plus un problème car [Solidity prend désormais en charge CREATE2](https://docs.soliditylang.org/en/v0.8.3/control-structures.html#salted-contract-creations-create2).
+Pour créer un nouveau contrat, nous avons besoin du code qui le crée (à la fois la fonction constructeur et le code qui écrit en mémoire le bytecode EVM du contrat réel). Normalement, dans Solidity, nous utilisons simplement `addr = new ( )` et le compilateur s'occupe de tout pour nous, mais pour avoir une adresse de contrat déterministe, nous devons utiliser [l'opcode CREATE2](https://eips.ethereum.org/EIPS/eip-1014).
+Lorsque ce code a été écrit, cet opcode n'était pas encore pris en charge par Solidity, il était donc nécessaire d'obtenir manuellement le code. Ce n'est plus un problème, car [Solidity prend maintenant en charge CREATE2](https://docs.soliditylang.org/en/v0.8.3/control-structures.html#salted-contract-creations-create2).
```solidity
bytes32 salt = keccak256(abi.encodePacked(token0, token1));
@@ -765,23 +777,22 @@ Pour créer un nouveau contrat, nous avons besoin du code qui va le créer (tant
}
```
-Lorsqu'un opcode n'est pas encore pris en charge par Solidity, nous pouvons l'appeler en utilisant l'[assemblage en ligne](https://docs.soliditylang.org/en/v0.8.3/assembly.html).
+Lorsqu'un opcode n'est pas encore pris en charge par Solidity, nous pouvons l'appeler en utilisant [l'assembly en ligne](https://docs.soliditylang.org/en/v0.8.3/assembly.html).
```solidity
IUniswapV2Pair(pair).initialize(token0, token1);
```
-Appelez la fonction `initialize` pour dire au nouvel échange quels sont les deux jetons qu'il échange.
+Appeler la fonction `initialize` pour indiquer au nouvel échange les deux jetons qu'il échange.
```solidity
getPair[token0][token1] = pair;
getPair[token1][token0] = pair; // populate mapping in the reverse direction
allPairs.push(pair);
emit PairCreated(token0, token1, pair, allPairs.length);
- }
```
-Enregistrez les informations de la nouvelle paire dans les variables d'état et émettez un événement pour informer tout le monde du nouvel échange de paires.
+Enregistrer les informations de la nouvelle paire dans les variables d'état et émettre un événement pour informer le monde du nouvel échange de paires.
```solidity
function setFeeTo(address _feeTo) external {
@@ -796,13 +807,14 @@ Enregistrez les informations de la nouvelle paire dans les variables d'état et
}
```
-Ces deux fonctions permettent à `feeSetter` de contrôler le destinataire des frais (le cas échéant) et d'orienter `feeSetter` vers une nouvelle adresse.
+Ces deux fonctions permettent à `feeSetter` de contrôler le destinataire des frais (le cas échéant) et de changer `feeSetter` en une nouvelle adresse.
### UniswapV2ERC20.sol {#UniswapV2ERC20}
-[Ce contrat](https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) implemente le jeton de liquidité ERC-20. Il est identique au [contrat OpenZeppelin ERC-20](/developers/tutorials/erc20-annotated-code). De fait, je n'expliquerai que la partie qui est différente, à savoir la fonctionnalité `Permit`.
+[Ce contrat](https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) met en œuvre le jeton de liquidité ERC-20. Il est similaire au [contrat ERC-20 d'OpenZeppelin](/developers/tutorials/erc20-annotated-code), je n'expliquerai donc que la partie qui est différente, la fonctionnalité `permit`.
-Les transactions sur Ethereum coûtent de l'Ether (ETH), ce qui équivaut à de l'argent réel. Si vous avez des jetons ERC-20 mais pas d'ETH, vous ne pouvez pas envoyer de transactions. Vous ne pouvez donc rien faire avec. Pour éviter ce problème, vous pouvez opter pour des [méta-transactions](https://docs.uniswap.org/contracts/v2/guides/smart-contract-integration/supporting-meta-transactions). Le propriétaire des jetons signe une transaction qui permet à quelqu'un d'autre de retirer des jetons hors chaîne et de les envoyer via Internet à un destinataire. Le destinataire disposant d'ETH soumet ensuite le permis pour le compte du propriétaire.
+Les transactions sur Ethereum coûtent de l'ether (ETH), ce qui équivaut à de l'argent réel. Si vous avez des jetons ERC-20 mais pas d'ETH, vous ne pouvez pas envoyer de transactions, et vous ne pouvez donc rien en faire. Une solution pour éviter ce problème est d'utiliser les [méta-transactions](https://docs.uniswap.org/contracts/v2/guides/smart-contract-integration/supporting-meta-transactions).
+Le propriétaire des jetons signe une transaction qui permet à une autre personne de retirer des jetons hors chaîne et l'envoie via Internet au destinataire. Le destinataire, qui possède des ETH, soumet alors le permis au nom du propriétaire.
```solidity
bytes32 public DOMAIN_SEPARATOR;
@@ -810,13 +822,13 @@ Les transactions sur Ethereum coûtent de l'Ether (ETH), ce qui équivaut à de
bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
```
-Ce hachage est l'[identifiant pour le type de transaction](https://eips.ethereum.org/EIPS/eip-712#rationale-for-typehash). Le seul que nous prenons en charge ici est `Permit` avec ces paramètres.
+Ce hachage est l'[identifiant du type de transaction](https://eips.ethereum.org/EIPS/eip-712#rationale-for-typehash). Le seul que nous prenons en charge ici est `Permit` avec ces paramètres.
```solidity
mapping(address => uint) public nonces;
```
-Il n'est pas possible pour un destinataire de falsifier une signature numérique. Cependant, il est trivial d'envoyer la même transaction deux fois (c'est une forme d' [attaque par répétition](https://wikipedia.org/wiki/Replay_attack)). Pour éviter cela, nous utilisons un [nonce](https://wikipedia.org/wiki/Cryptographic_nonce). Si le nonce d'un nouveau `Permit` n'est pas supérieur de un au dernier nonce utilisé, nous supposons qu'il est invalide.
+Il n'est pas possible pour un destinataire de falsifier une signature numérique. Cependant, il est trivial d'envoyer la même transaction deux fois (c'est une forme d'[attaque par rejeu](https://wikipedia.org/wiki/Replay_attack)). Pour éviter cela, nous utilisons un [nonce](https://wikipedia.org/wiki/Cryptographic_nonce). Si le nonce d'un nouveau `Permit` n'est pas supérieur de un au dernier nonce utilisé, nous le considérons comme invalide.
```solidity
constructor() public {
@@ -826,7 +838,7 @@ Il n'est pas possible pour un destinataire de falsifier une signature numérique
}
```
-Ceci est le code pour récupérer [l'identifiant de la chaîne](https://chainid.network/). Il utilise une langue d'assemblage EVM appelé [Yul](https://docs.soliditylang.org/en/v0.8.4/yul.html). Notez que dans la version actuelle de Yul, vous devez utiliser `chainid()` et non pas `chainid`.
+Ceci est le code pour récupérer l'[identifiant de la chaîne](https://chainid.network/). Il utilise un dialecte d'assembly EVM appelé [Yul](https://docs.soliditylang.org/en/v0.8.4/yul.html). Notez que dans la version actuelle de Yul, vous devez utiliser `chainid()`, et non `chainid`.
```solidity
DOMAIN_SEPARATOR = keccak256(
@@ -847,13 +859,13 @@ Calculer le [séparateur de domaine](https://eips.ethereum.org/EIPS/eip-712#rati
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
```
-C'est la fonction qui implémente les permissions. Elle reçoit comme paramètres les champs pertinents, et les trois valeurs scalaires pour [la signature](https://yos.io/2018/11/16/ethereum-signatures/) (v, r, et s).
+C'est la fonction qui implémente les permissions. Elle reçoit comme paramètres les champs pertinents, et les trois valeurs scalaires pour [la signature](https://yos.io/2018/11/16/ethereum-signatures/) (v, r et s).
```solidity
require(deadline >= block.timestamp, 'UniswapV2: EXPIRED');
```
-N'acceptez pas les transactions après la date limite.
+Ne pas accepter les transactions après la date limite.
```solidity
bytes32 digest = keccak256(
@@ -865,15 +877,15 @@ N'acceptez pas les transactions après la date limite.
);
```
-`abi.encodePacked(...)` est le message que nous attendons de recevoir. Nous savons ce que le nonce devrait être. Il n'y a donc nul besoin de l'obtenir sous forme de paramètre.
+`abi.encodePacked(...)` est le message que nous nous attendons à recevoir. Nous savons ce que le nonce devrait être, il n'est donc pas nécessaire de l'obtenir en tant que paramètre.
-L'algorithme de signature Ethereum a besoin de 256 bits pour signer. aussi, utilisons-nous la fonction de hachage `keccak256`.
+L'algorithme de signature d'Ethereum attend 256 bits à signer, nous utilisons donc la fonction de hachage `keccak256`.
```solidity
address recoveredAddress = ecrecover(digest, v, r, s);
```
-À partir du condensé et de la signature, nous pouvons obtenir l'adresse qui l'a signé en utilisant [ecrecovery](https://coders-errand.com/ecrecover-signature-verification-ethereum/).
+À partir du condensé et de la signature, nous pouvons obtenir l'adresse qui l'a signé en utilisant [ecrecover](https://coders-errand.com/ecrecover-signature-verification-ethereum/).
```solidity
require(recoveredAddress != address(0) && recoveredAddress == owner, 'UniswapV2: INVALID_SIGNATURE');
@@ -882,19 +894,20 @@ L'algorithme de signature Ethereum a besoin de 256 bits pour signer. aussi, util
```
-Quand tout est en ordre, traitez ceci comme un [ERC-20 approve](https://eips.ethereum.org/EIPS/eip-20#approve).
+Si tout est OK, traiter cela comme [une approbation ERC-20](https://eips.ethereum.org/EIPS/eip-20#approve).
## Les contrats périphériques {#periphery-contracts}
-Les contrats périphériques sont l'API (interface du programme d'application) pour Uniswap. Ils sont disponibles pour les appels externes, en provenance d'autres contrats ou d'applications décentralisées. Vous pourriez appeler directement les contrats de base, mais c'est plus compliqué et vous pourriez perdre des valeurs si vous faites une erreur. Les contrats de base ne contiennent que des tests pour éviter toute escroquerie au contrat, pas de tests d'intégrité pour qui que ce soit d'autre. Ceux-ci sont au niveau des périphériques pour pouvoir être mis à jour au besoin.
+Les contrats périphériques sont l'API (interface de programme d'application) d'Uniswap. Ils sont disponibles pour les appels externes, en provenance d'autres contrats ou d'applications décentralisées. Vous pourriez appeler directement les contrats de base, mais c'est plus compliqué et vous pourriez perdre de la valeur si vous faites une erreur. Les contrats de base ne contiennent que des tests pour s'assurer qu'ils ne sont pas trompés, pas de contrôles de cohérence pour qui que ce soit d'autre. Ceux-ci sont dans la périphérie afin de pouvoir être mis à jour au besoin.
### UniswapV2Router01.sol {#UniswapV2Router01}
-[Ce contrat](https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/UniswapV2Router01.sol) présente des dangers et [ne doit plus être utilisé](https://docs.uniswap.org/contracts/v2/reference/smart-contracts/router-01). Heureusement, les contrats périphériques sont dénués d'état et ne détiennent aucun actif. Il est ainsi facile de les déprécier et de suggérer aux gens d'utiliser à la place `UniswapV2Router02`.
+[Ce contrat](https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/UniswapV2Router01.sol) a des problèmes et [ne devrait plus être utilisé](https://docs.uniswap.org/contracts/v2/reference/smart-contracts/router-01). Heureusement, les contrats périphériques sont apatrides et ne détiennent aucun actif, il est donc facile de le déprécier et de suggérer aux gens d'utiliser le remplacement, `UniswapV2Router02`, à la place.
### UniswapV2Router02.sol {#UniswapV2Router02}
-Dans la plupart des cas, vous utiliseriez Uniswap par le biais de [ce contrat](https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/UniswapV2Router02.sol). Vous pouvez voir comment l'utiliser [ici](https://docs.uniswap.org/contracts/v2/reference/smart-contracts/router-02).
+Dans la plupart des cas, vous utiliseriez Uniswap via [ce contrat](https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/UniswapV2Router02.sol).
+Vous pouvez voir comment l'utiliser [ici](https://docs.uniswap.org/contracts/v2/reference/smart-contracts/router-02).
```solidity
pragma solidity =0.6.6;
@@ -909,7 +922,7 @@ import './interfaces/IERC20.sol';
import './interfaces/IWETH.sol';
```
-Nous avons déjà rencontrés auparavant la plupart d'entre eux ou ils sont assez évidents. La seule exception est `IWETH.sol`. Uniswap v2 permet l'échange de n'importe quelle paire de jetons ERC-20 mais l'éther (ETH), en lui-même, n'est pas un jeton ERC-20. Il est antérieur à la norme et est transféré par des mécanismes spécifiques. Pour activer l'utilisation d'ETH dans les contrats qui s'appliquent aux jetons ERC-20, les programmeurs ont l'habitude d'utiliser le contrat [wrapped ether (WETH)](https://weth.tkn.eth.limo/). Vous envoyez ce contrat ETH, et il va frapper un montant équivalent de WETH. Vous pouvez également brûler WETH, et récupérer de l'ETH en retour.
+La plupart d'entre eux ont déjà été rencontrés ou sont assez évidents. La seule exception est `IWETH.sol`. Uniswap v2 permet les échanges pour n'importe quelle paire de jetons ERC-20, mais l'ether (ETH) lui-même n'est pas un jeton ERC-20. Il est antérieur à la norme et est transféré par des mécanismes uniques. Pour permettre l'utilisation d'ETH dans les contrats qui s'appliquent aux jetons ERC-20, le contrat [wrapped ether (WETH)](https://weth.tkn.eth.limo/) a été créé. Vous envoyez des ETH à ce contrat, et il frappe un montant équivalent de WETH. Ou vous pouvez brûler du WETH, et récupérer de l'ETH.
```solidity
contract UniswapV2Router02 is IUniswapV2Router02 {
@@ -919,7 +932,7 @@ contract UniswapV2Router02 is IUniswapV2Router02 {
address public immutable override WETH;
```
-Le routeur a besoin de savoir quelle usine utiliser, et pour les transactions qui nécessitent WETH, quel contrat WETH utiliser. Ces valeurs sont [immuables](https://docs.soliditylang.org/en/v0.8.3/contracts.html#constant-and-immutable-state-variables), ce qui signifie qu'elles ne peuvent être définies que dans le constructeur. Cela donne aux utilisateurs l'assurance que personne ne pourra les modifier pour tendre vers des contrats moins sûrs.
+Le routeur a besoin de savoir quelle usine utiliser et, pour les transactions qui nécessitent des WETH, quel contrat WETH utiliser. Ces valeurs sont [immuables](https://docs.soliditylang.org/en/v0.8.3/contracts.html#constant-and-immutable-state-variables), ce qui signifie qu'elles ne peuvent être définies que dans le constructeur. Cela donne aux utilisateurs l'assurance que personne ne pourra les modifier pour pointer vers des contrats moins honnêtes.
```solidity
modifier ensure(uint deadline) {
@@ -928,7 +941,7 @@ Le routeur a besoin de savoir quelle usine utiliser, et pour les transactions qu
}
```
-Ce modificateur permet de s'assurer que les opérations limitées dans le temps (« faire X avant le moment Y si possible ») ne se produisent pas après la limite de temps impartie.
+Ce modificateur garantit que les transactions limitées dans le temps (« faire X avant l'heure Y si possible ») ne se produisent pas après leur délai imparti.
```solidity
constructor(address _factory, address _WETH) public {
@@ -945,11 +958,11 @@ Le constructeur définit simplement les variables d'état immuables.
}
```
-Cette fonction est appelée lorsque nous échangeons des jetons du contrat WETH en ETH. Seul le contrat WETH que nous utilisons est autorisé à faire cela.
+Cette fonction est appelée lorsque nous échangeons des jetons du contrat WETH contre des ETH. Seul le contrat WETH que nous utilisons est autorisé à faire cela.
-#### Ajouter des liquidités {#add-liquidity}
+#### Ajouter de la liquidité {#add-liquidity}
-Ces fonctions ajoutent des jetons à l'échange de paires, ce qui augmente la réserve de liquidités.
+Ces fonctions ajoutent des jetons à l'échange de paires, ce qui augmente le pool de liquidités.
```solidity
@@ -957,49 +970,49 @@ Ces fonctions ajoutent des jetons à l'échange de paires, ce qui augmente la r
function _addLiquidity(
```
-Cette fonction est utilisée pour calculer le nombre de jetons A et B qui doivent être déposés dans l'échange de paires.
+Cette fonction est utilisée pour calculer le montant des jetons A et B qui doivent être déposés dans l'échange de paires.
```solidity
address tokenA,
address tokenB,
```
-Voici les adresses des contrats de jetons ERC-20.
+Ce sont les adresses des contrats de jetons ERC-20.
```solidity
uint amountADesired,
uint amountBDesired,
```
-Ce sont les montants que le fournisseur de liquidités veut déposer. Ils sont également les montants maximum de A et de B à déposer.
+Ce sont les montants que le fournisseur de liquidités souhaite déposer. Ce sont également les montants maximums de A et de B à déposer.
```solidity
uint amountAMin,
uint amountBMin
```
-Ce sont les montants minimums acceptables pour le dépôt. Si la transaction ne peut avoir lieu avec ces montants ou plus, annulez-la. Si vous ne souhaitez pas de cette fonctionnalité, spécifiez simplement zéro.
+Ce sont les montants minimums acceptables pour le dépôt. Si la transaction ne peut pas avoir lieu avec ces montants ou plus, l'annuler. Si vous ne souhaitez pas cette fonctionnalité, spécifiez simplement zéro.
-Les fournisseurs de liquidités spécifient un minimum, généralement parce qu'ils souhaitent limiter la transaction à un taux de change proche de celui actuel. Si le taux de change fluctue trop, ce peut être en raison de nouvelles qui changent les valeurs sous-jacentes et les fournisseurs peuvent alors vouloir décider manuellement ce qu'il faut faire.
+Les fournisseurs de liquidités spécifient un minimum, généralement parce qu'ils souhaitent limiter la transaction à un taux de change proche de celui en vigueur. Si le taux de change fluctue trop, cela peut signifier que des nouvelles ont modifié les valeurs sous-jacentes, et ils veulent décider manuellement de la marche à suivre.
-Par exemple, imaginez un cas où le taux de change est d'un pour un et où le fournisseur de liquidités spécifie ces valeurs :
+Par exemple, imaginons un cas où le taux de change est de un pour un et où le fournisseur de liquidités spécifie ces valeurs :
| Paramètre | Valeur |
-| -------------- | ------:|
+| -------------- | -----: |
| amountADesired | 1000 |
| amountBDesired | 1000 |
| amountAMin | 900 |
| amountBMin | 800 |
-Tant que le taux de change reste compris entre 0,9 et 1,25, la transaction aura lieu. Si le taux de change sort de cette fourchette, la transaction sera annulée.
+Tant que le taux de change reste compris entre 0,9 et 1,25, la transaction a lieu. Si le taux de change sort de cette fourchette, la transaction est annulée.
-Cette précaution s'explique par le fait que les transactions ne sont pas immédiates, vous les soumettez et au bout du compte un validateur va les inclure dans un bloc (à moins que le prix du gaz soit particulièrement bas, auquel cas vous devrez soumettre, à la place, une autre transaction avec le même nonce et un prix de gaz plus élevé). Vous ne pouvez pas contrôler ce qui se passe pendant l'intervalle entre la soumission et l'inclusion.
+Cette précaution s'explique par le fait que les transactions ne sont pas immédiates, vous les soumettez et un validateur finira par les inclure dans un bloc (à moins que le prix du gaz soit très bas, auquel cas vous devrez soumettre une autre transaction avec le même nonce et un prix du gaz plus élevé pour l'écraser). Vous ne pouvez pas contrôler ce qui se passe pendant l'intervalle entre la soumission et l'inclusion.
```solidity
) internal virtual returns (uint amountA, uint amountB) {
```
-La fonction retourne les montants que le fournisseur de liquidités doit déposer pour avoir un taux égal au taux actuel entre les réserves.
+La fonction retourne les montants que le fournisseur de liquidités doit déposer pour avoir un ratio égal au ratio actuel entre les réserves.
```solidity
// create the pair if it doesn't exist yet
@@ -1008,27 +1021,27 @@ La fonction retourne les montants que le fournisseur de liquidités doit dépose
}
```
-S'il n'existe pas encore d'échange pour cette paire de jetons, créez-la.
+S'il n'existe pas encore d'échange pour cette paire de jetons, le créer.
```solidity
(uint reserveA, uint reserveB) = UniswapV2Library.getReserves(factory, tokenA, tokenB);
```
-Récupérez les réserves actuelles dans la paire.
+Obtenir les réserves actuelles de la paire.
```solidity
if (reserveA == 0 && reserveB == 0) {
(amountA, amountB) = (amountADesired, amountBDesired);
```
-Si les réserves actuelles sont vides alors il s'agit d'un nouvel échange de paires. Les montants à déposer devraient être exactement les mêmes que ceux que le fournisseur de liquidités souhaite fournir.
+Si les réserves actuelles sont vides, alors il s'agit d'un nouvel échange de paires. Les montants à déposer doivent être exactement les mêmes que ceux que le fournisseur de liquidités souhaite fournir.
```solidity
} else {
uint amountBOptimal = UniswapV2Library.quote(amountADesired, reserveA, reserveB);
```
-Si nous souhaitons connaître quels sont ces montants, sachez que le montant optimal est obtenu à l'aide de[cette fonction](https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/libraries/UniswapV2Library.sol#L35). L'objectif est d'avoir le même ratio que les réserves actuelles.
+Si nous devons voir quels seront les montants, nous obtenons le montant optimal en utilisant [cette fonction](https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/libraries/UniswapV2Library.sol#L35). Nous voulons le même ratio que les réserves actuelles.
```solidity
if (amountBOptimal <= amountBDesired) {
@@ -1036,7 +1049,7 @@ Si nous souhaitons connaître quels sont ces montants, sachez que le montant opt
(amountA, amountB) = (amountADesired, amountBOptimal);
```
-Si `amountBOptimal` est plus petit que le montant que le fournisseur de liquidités veut déposer, cela signifie que le jeton B est à ce stade plus précieux que ne le pense le déposant de liquidité. Ainsi, un montant plus bas est requis.
+Si `amountBOptimal` est inférieur au montant que le fournisseur de liquidités souhaite déposer, cela signifie que le jeton B a actuellement plus de valeur que ne le pense le déposant, un montant inférieur est donc requis.
```solidity
} else {
@@ -1046,13 +1059,13 @@ Si `amountBOptimal` est plus petit que le montant que le fournisseur de liquidit
(amountA, amountB) = (amountAOptimal, amountBDesired);
```
-Si le montant optimal de B est supérieur au montant désiré de B, cela signifie que les jetons B sont moins précieux actuellement que ne le pense le déposant de liquidités. Ainsi, un montant plus élevé est requis. Cependant, le montant souhaité est un maximum et nous ne pouvons donc pas aller jusque-là. Nous calculons donc le nombre optimal de jetons A pour le montant souhaité de jetons B.
+Si le montant optimal de B est supérieur au montant désiré de B, cela signifie que les jetons B ont actuellement moins de valeur que ne le pense le déposant de liquidités, un montant plus élevé est donc requis. Cependant, le montant souhaité est un maximum, nous ne pouvons donc pas le dépasser. Nous calculons donc le nombre optimal de jetons A pour le montant souhaité de jetons B.
-En mettant tout cela ensemble, nous obtenons ce graphique. Supposons que vous essayez de déposer un millier de jetons A (ligne bleue) et un millier de jetons B (ligne rouge). L'axe x est le taux de change, A/B. Si x=1, ils sont égaux en valeur et vous déposez mille de chaque. Si x=2, A est deux fois la valeur de B (vous obtenez deux jetons B pour chaque jeton A). Vous déposez donc un millier de jetons B, mais seulement 500 jetons A. Si x=0.5, la situation est alors inversée avec mille jetons A et cinq cents jetons B.
+En assemblant tout cela, nous obtenons ce graphique. Supposons que vous essayiez de déposer un millier de jetons A (ligne bleue) et un millier de jetons B (ligne rouge). L'axe des x représente le taux de change, A/B. Si x=1, ils ont la même valeur et vous déposez un millier de chaque. Si x=2, A vaut deux fois la valeur de B (vous obtenez deux jetons B pour chaque jeton A), vous déposez donc un millier de jetons B, mais seulement 500 jetons A. Si x=0,5, la situation est inversée : un millier de jetons A et cinq cents jetons B.
-
+
-Vous pouvez déposer des liquidités directement dans le contrat principal (en utilisant [UniswapV2Pair::mint](https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2Pair.sol#L110)), mais le contrat de base vérifie uniquement qu'il ne se trompe pas lui-même. Ainsi, vous risquez de perdre de la valeur si le taux de change évolue entre le moment où vous soumettez votre transaction et le moment où elle est exécutée. Si vous utilisez le contrat périphérique, il indique le montant que vous devez déposer et le dépose immédiatement. Ainsi, le taux de change n'évolue pas et vous ne perdez rien.
+Vous pourriez déposer des liquidités directement dans le contrat de base (en utilisant [UniswapV2Pair::mint](https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2Pair.sol#L110)), mais le contrat de base vérifie uniquement qu'il ne se trompe pas lui-même. Vous risquez donc de perdre de la valeur si le taux de change évolue entre le moment où vous soumettez votre transaction et le moment où elle est exécutée. Si vous utilisez le contrat périphérique, il calcule le montant que vous devez déposer et le dépose immédiatement, de sorte que le taux de change ne change pas et vous ne perdez rien.
```solidity
function addLiquidity(
@@ -1066,9 +1079,10 @@ Vous pouvez déposer des liquidités directement dans le contrat principal (en u
uint deadline
```
-Cette fonction peut être appelée par une transaction de dépôt de liquidités. La plupart des paramètres sont les mêmes que pour `_addLiquidity` ci-dessus, à deux exceptions près :
+Cette fonction peut être appelée par une transaction pour déposer des liquidités. La plupart des paramètres sont les mêmes que dans `_addLiquidity` ci-dessus, à deux exceptions près :
-. `to` est l'adresse qui reçoit les nouveaux jetons de liquidité minés pour montrer la part du pool que détient le fournisseur de liquidités. `deadline` est une limite de temps sur la transaction
+. `to` est l'adresse qui reçoit les nouveaux jetons de liquidité frappés pour montrer la part du pool détenue par le fournisseur de liquidités.
+`deadline` est une limite de temps pour la transaction.
```solidity
) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
@@ -1076,21 +1090,21 @@ Cette fonction peut être appelée par une transaction de dépôt de liquidités
address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
```
-Nous calculons les montants à déposer et trouvons ensuite l'adresse de la réserve de liquidités. Pour économiser du gaz, nous ne le faisons pas en interrogeant l'usine, mais en utilisant la fonction de bibliothèque `pairFor` (voir ci-dessous dans les bibliothèques)
+Nous calculons les montants à déposer réellement, puis nous trouvons l'adresse du pool de liquidités. Pour économiser du gaz, nous ne le faisons pas en interrogeant l'usine, mais en utilisant la fonction de bibliothèque `pairFor` (voir ci-dessous dans les bibliothèques).
```solidity
TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
```
-Transférez les bons montants de jetons de l'utilisateur à l'échange de paire.
+Transférer les bons montants de jetons de l'utilisateur vers l'échange de paires.
```solidity
liquidity = IUniswapV2Pair(pair).mint(to);
}
```
-En retour, donnez des jetons de liquidité à l'adresse `to` en vue de la détention partielle de la réserve. La fonction `mint` du contrat de base détermine de combien de jetons supplémentaires elle dispose (par rapport à ce dont elle disposait la dernière fois que la liquidité a changé) et frappe la liquidité en conséquence.
+En retour, donner à l'adresse `to` des jetons de liquidité pour une propriété partielle du pool. La fonction `mint` du contrat de base voit combien de jetons supplémentaires elle a (par rapport à ce qu'elle avait la dernière fois que la liquidité a changé) et frappe la liquidité en conséquence.
```solidity
function addLiquidityETH(
@@ -1098,7 +1112,7 @@ En retour, donnez des jetons de liquidité à l'adresse `to` en vue de la déten
uint amountTokenDesired,
```
-Lorsqu'un fournisseur de liquidités veut fournir des liquidités à un échange de paire Jeton/ETH, il y a quelques différences. Le contrat gère l'encapsulage d'ETH pour le fournisseur de liquidités. Il n'est pas nécessaire de spécifier combien d'ETH l'utilisateur veut déposer, parce que l'utilisateur les envoie simplement avec la transaction (le montant est disponible dans `msg.value`).
+Lorsqu'un fournisseur de liquidités souhaite fournir de la liquidité à un échange de paires Jeton/ETH, il y a quelques différences. Le contrat gère l'enveloppement de l'ETH pour le fournisseur de liquidités. Il n'est pas nécessaire de spécifier combien d'ETH l'utilisateur souhaite déposer, car il les envoie simplement avec la transaction (le montant est disponible dans `msg.value`).
```solidity
uint amountTokenMin,
@@ -1120,7 +1134,7 @@ Lorsqu'un fournisseur de liquidités veut fournir des liquidités à un échange
assert(IWETH(WETH).transfer(pair, amountETH));
```
-Pour déposer l'ETH le contrat va l'envelopper dans WETH, puis transfère le WETH dans la paire. Notez que le transfert est encapsulé dans un `assert`. Cela signifie que si le transfert échoue, cet appel de contrat échoue également et qu'ainsi l'encapsulage ne se produit pas.
+Pour déposer l'ETH, le contrat l'enveloppe d'abord dans du WETH, puis transfère le WETH dans la paire. Notez que le transfert est enveloppé dans un `assert`. Cela signifie que si le transfert échoue, cet appel de contrat échoue également, et donc l'enveloppement ne se produit pas réellement.
```solidity
liquidity = IUniswapV2Pair(pair).mint(to);
@@ -1129,9 +1143,9 @@ Pour déposer l'ETH le contrat va l'envelopper dans WETH, puis transfère le WET
}
```
-L'utilisateur nous a déjà envoyé l'ETH. Ainsi, s'il existe des reliquats (parce que l'autre jeton est moins précieux que ce que l'utilisateur pense), nous devons effectuer un remboursement.
+L'utilisateur nous a déjà envoyé les ETH. S'il reste un surplus (parce que l'autre jeton a moins de valeur que ne le pensait l'utilisateur), nous devons émettre un remboursement.
-#### Retirer la liquidité {#remove-liquidity}
+#### Retirer de la liquidité {#remove-liquidity}
Ces fonctions supprimeront la liquidité et rembourseront le fournisseur de liquidités.
@@ -1148,7 +1162,7 @@ Ces fonctions supprimeront la liquidité et rembourseront le fournisseur de liqu
) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
```
-Le cas le plus simple pour supprimer les liquidités. Il y a un montant minimum pour chaque jeton que le fournisseur de liquidités convient d'accepter et cela doit se produire avant la date limite.
+Le cas le plus simple de retrait de liquidité. Il y a un montant minimum pour chaque jeton que le fournisseur de liquidités accepte de recevoir, et cela doit avoir lieu avant la date limite.
```solidity
address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
@@ -1156,19 +1170,19 @@ Le cas le plus simple pour supprimer les liquidités. Il y a un montant minimum
(uint amount0, uint amount1) = IUniswapV2Pair(pair).burn(to);
```
-La fonction `burn` du contrat de base permet de payer les jetons en retour à l'utilisateur.
+La fonction `burn` du contrat de base gère le remboursement des jetons à l'utilisateur.
```solidity
(address token0,) = UniswapV2Library.sortTokens(tokenA, tokenB);
```
-Lorsqu'une fonction retourne plusieurs valeurs, mais que nous ne sommes intéressés que par certaines d'entre elles, nous récupérons uniquement ces valeurs. C'est un peu moins cher en termes de gaz que de lire une valeur et de ne jamais l'utiliser.
+Lorsqu'une fonction retourne plusieurs valeurs, mais que nous ne sommes intéressés que par certaines d'entre elles, voici comment nous obtenons uniquement ces valeurs. C'est un peu moins cher en termes de gaz que de lire une valeur et de ne jamais l'utiliser.
```solidity
(amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
```
-Traduit les montants de la façon dont le contrat de base les renvoie (jeton d'adresse inférieure d'abord) à la manière dont l'utilisateur les attend (correspondant au `jetonA` et `jetonB`).
+Traduire les montants de la façon dont le contrat de base les renvoie (jeton d'adresse inférieure en premier) à la manière dont l'utilisateur les attend (correspondant à `tokenA` et `tokenB`).
```solidity
require(amountA >= amountAMin, 'UniswapV2Router: INSUFFICIENT_A_AMOUNT');
@@ -1176,7 +1190,7 @@ Traduit les montants de la façon dont le contrat de base les renvoie (jeton d'a
}
```
-Il est possible de faire le transfert d'abord puis de vérifier qu'il est légitime, car si ce n'est pas le cas, nous annulerons tous les changements d'état.
+Il est acceptable d'effectuer le transfert d'abord, puis de vérifier sa légitimité, car si ce n'est pas le cas, nous annulerons tous les changements d'état.
```solidity
function removeLiquidityETH(
@@ -1202,7 +1216,7 @@ Il est possible de faire le transfert d'abord puis de vérifier qu'il est légit
}
```
-Retirer la liquidité des ETH se fait presque de la même manière sauf que nous recevons les jetons WETH et que nous les rachetons pour que des ETH soient restitués au fournisseur de liquidités.
+Le retrait de liquidité pour l'ETH est presque identique, sauf que nous recevons les jetons WETH, puis les échangeons contre de l'ETH pour les restituer au fournisseur de liquidités.
```solidity
function removeLiquidityWithPermit(
@@ -1238,10 +1252,9 @@ Retirer la liquidité des ETH se fait presque de la même manière sauf que nous
}
```
-Ces fonctions relayent les méta-transactions pour permettre aux utilisateurs sans éther de se retirer du pool en utilisant [le mécanisme du permis](#UniswapV2ERC20).
+Ces fonctions relaient les méta-transactions pour permettre aux utilisateurs sans ether de se retirer du pool, en utilisant [le mécanisme de permis](#UniswapV2ERC20).
```solidity
-
// **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
@@ -1267,7 +1280,7 @@ Ces fonctions relayent les méta-transactions pour permettre aux utilisateurs sa
```
-Cette fonction peut être utilisée pour les jetons associés à des frais de transfert ou de stockage. Lorsqu'un jeton a de tels frais, nous ne pouvons pas compter sur la fonction `removeLiquidity` pour nous dire combien de jetons nous récupérons. Nous devons donc d'abord nous retirer et ensuite obtenir le solde.
+Cette fonction peut être utilisée pour les jetons qui ont des frais de transfert ou de stockage. Lorsqu'un jeton a de tels frais, nous ne pouvons pas compter sur la fonction `removeLiquidity` pour nous dire combien de jetons nous récupérons. Nous devons donc d'abord retirer, puis obtenir le solde.
```solidity
@@ -1292,11 +1305,11 @@ Cette fonction peut être utilisée pour les jetons associés à des frais de tr
La fonction finale combine les frais de stockage avec les méta-transactions.
-#### Échanger {#trade}
+#### Commercer {#trade}
```solidity
// **** SWAP ****
- // requires the initial amount to have already been sent to the first pair
+ // nécessite que le montant initial ait déjà été envoyé à la première paire
function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
```
@@ -1306,21 +1319,21 @@ Cette fonction réalise un traitement interne requis pour les fonctions qui sont
for (uint i; i < path.length - 1; i++) {
```
-Au moment d'écrire ces lignes, il y a [388.160 jetons ERC-20](https://etherscan.io/tokens). S'il y avait un échange de paires pour chaque paire de jetons, cela représenterait plus de 150 milliards d'échanges de paires. La chaîne entière, en cet instant précis, [ne dispose que de 0,1 % de ce nombre de comptes](https://etherscan.io/chart/address). Les fonctions d'échange supportent le concept du chemin. Un trader peut échanger A contre B, B contre C et C contre D. Ainsi, il n'y a pas besoin d'un échange direct de paire A-D.
+Au moment où j'écris ces lignes, il existe [388 160 jetons ERC-20](https://eth.blockscout.com/tokens). S'il y avait un échange de paires pour chaque paire de jetons, cela représenterait plus de 150 milliards d'échanges de paires. La chaîne entière, à l'heure actuelle, [ne compte que 0,1 % de ce nombre de comptes](https://eth.blockscout.com/stats/accountsGrowth). Les fonctions d'échange supportent plutôt le concept de chemin. Un trader peut échanger A contre B, B contre C et C contre D. Ainsi, il n'y a pas besoin d'un échange direct de paire A-D.
-Les prix sur ces marchés tendent à être synchronisés, car quand ils sont désynchronisés, cela crée une opportunité d'arbitrage. Imaginez, par exemple, trois jetons : A, B et C. Il existe donc trois échanges de paires, un pour chaque paire.
+Les prix sur ces marchés tendent à être synchronisés, car quand ils sont désynchronisés, cela crée une opportunité d'arbitrage. Imaginez, par exemple, trois jetons : A, B et C. Il existe donc trois échanges de paires, un pour chaque paire.
1. La situation initiale
-2. Un négociant vend 24,695 jetons A et récupère en échange 25,305 jetons B.
+2. Un trader vend 24,695 jetons A et obtient 25,305 jetons B.
3. Le trader vend 24,695 jetons B contre 25,305 jetons C, et garde environ 0,61 jeton B comme bénéfice.
4. Puis le trader vend 24,695 jetons C en échange de 25,305 jetons A, et garde environ 0,61 jeton C comme bénéfice. Le trader a également 0,61 jeton A supplémentaire (les 25,305 dont dispose le trader en fin de transaction moins l'investissement initial de 24,695).
-| Étape | Échange A-B | Échange B-C | Échange A-C |
-| ----- | --------------------------------- | --------------------------------- | --------------------------------- |
-| 1 | A : 1 000 B : 1 050 A/B=1,05 | B : 1 000 C : 1 050 B/C=1,05 | A : 1 050 C : 1 000 C/A=1,05 |
-| 2 | A : 1 024,695 B : 1 024,695 A/B=1 | B : 1 000 C : 1 050 B/C=1,05 | A : 1 050 C : 1 000 C/A=1,05 |
-| 3 | A : 1 024,695 B : 1 024,695 A/B=1 | B : 1 024,695 C : 1 024,695 B/C=1 | A : 1 050 C : 1 000 C/A=1,05 |
-| 4 | A : 1 024,695 B : 1 024,695 A/B=1 | B :1 024,695 C : 1 024,695 B/C=1 | A : 1 024,695 C : 1 024,695 C/A=1 |
+| Étape | Échange A-B | Échange B-C | Échange A-C |
+| ----- | --------------------------------------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------------- |
+| 1 | A : 1 000 B : 1 050 A/B=1,05 | B : 1 000 C : 1 050 B/C=1,05 | A : 1 050 C : 1 000 C/A=1,05 |
+| 2 | A : 1024,695 B : 1024,695 A/B=1 | B : 1 000 C : 1 050 B/C=1,05 | A : 1 050 C : 1 000 C/A=1,05 |
+| 3 | A : 1024,695 B : 1024,695 A/B=1 | B : 1024,695 C : 1024,695 B/C=1 | A : 1 050 C : 1 000 C/A=1,05 |
+| 4 | A : 1024,695 B : 1024,695 A/B=1 | B : 1024,695 C : 1024,695 B/C=1 | A : 1024,695 C : 1024,695 C/A=1 |
```solidity
(address input, address output) = (path[i], path[i + 1]);
@@ -1328,19 +1341,19 @@ Les prix sur ces marchés tendent à être synchronisés, car quand ils sont dé
uint amountOut = amounts[i + 1];
```
-Obtenez la paire que nous traitons actuellement, triez-la (pour l'utiliser avec la paire) et obtenez le montant prévu de sortie.
+Obtenez la paire que nous traitons actuellement, triez-la (pour l'utiliser avec la paire) et obtenez le montant de sortie attendu.
```solidity
(uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
```
-Obtenez les montants prévus, triés de la façon dont l'échange de paire est souhaité.
+Obtenez les montants de sortie attendus, triés de la manière attendue par l'échange de paires.
```solidity
address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;
```
-Est-ce le dernier échange ? Si c'est le cas, envoyez les jetons reçus pour la transaction à sa destination. Si ce n'est pas le cas, envoyez-le à la prochaine paire d'échange.
+Est-ce le dernier échange ? Si c'est le cas, envoyez les jetons reçus pour la transaction à sa destination. Si ce n'est pas le cas, envoyez-le à la prochaine paire d'échange.
```solidity
@@ -1351,7 +1364,7 @@ Est-ce le dernier échange ? Si c'est le cas, envoyez les jetons reçus pour la
}
```
-Effectuez un appel pour l'échange de paire afin d'échanger les jetons. Nous n'avons pas besoin d'un rappel pour être informé de l'échange. De fait, nous n'envoyons pas d'octets dans ce champ.
+Appelez réellement l'échange de paires pour échanger les jetons. Nous n'avons pas besoin d'un rappel pour être informé de l'échange. De fait, nous n'envoyons pas d'octets dans ce champ.
```solidity
function swapExactTokensForTokens(
@@ -1367,9 +1380,9 @@ Cette fonction est utilisée directement par les traders pour échanger un jeton
Ce paramètre contient les adresses des contrats ERC-20. Comme expliqué ci-dessus, il s'agit d'un tableau parce que vous pourriez avoir besoin de passer par plusieurs échanges de paires pour passer de l'actif que vous avez à l'actif que vous voulez.
-Un paramètre de fonction sur Solidity peut être stocké soit dans `memory`, soit dans `calldata`. Si la fonction est un point d'entrée du contrat, directement appelée par un utilisateur (en utilisant une transaction) ou à partir d'un contrat différent, la valeur du paramètre peut être directement obtenue à partir des données d'appel. Si la fonction est appelée en interne, comme ci-dessus avec `_swap`, alors les paramètres doivent être stockés dans `memory`. Du point de vue du contrat appelé `calldata` est en lecture seule.
+Un paramètre de fonction dans Solidity peut être stocké soit en `memory`, soit en `calldata`. Si la fonction est un point d'entrée du contrat, directement appelée par un utilisateur (en utilisant une transaction) ou à partir d'un contrat différent, la valeur du paramètre peut être directement obtenue à partir des données d'appel. Si la fonction est appelée en interne, comme `_swap` ci-dessus, alors les paramètres doivent être stockés en `memory`. Du point de vue du contrat appelé, `calldata` est en lecture seule.
-Avec des types scalaires tels que `uint` ou `address` le compilateur gère le moyen de stockage pour nous, mais avec les tableaux, qui sont plus longs et plus coûteux, nous spécifions le type de stockage à utiliser.
+Avec des types scalaires tels que `uint` ou `address`, le compilateur gère le choix de stockage pour nous, mais avec les tableaux, qui sont plus longs et plus coûteux, nous spécifions le type de stockage à utiliser.
```solidity
address to,
@@ -1377,14 +1390,14 @@ Avec des types scalaires tels que `uint` ou `address` le compilateur gère le mo
) external virtual override ensure(deadline) returns (uint[] memory amounts) {
```
-Les valeurs retournées sont toujours retournées en mémoire.
+Les valeurs de retour sont toujours retournées en mémoire.
```solidity
amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);
require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
```
-Calculez le montant à acheter pour chaque échange. Si le résultat est inférieur au minimum que ce que le trader est prêt à accepter, annulez la transaction.
+Calculez le montant à acheter pour chaque échange. Si le résultat est inférieur au minimum que le trader est prêt à accepter, annulez la transaction.
```solidity
TransferHelper.safeTransferFrom(
@@ -1394,7 +1407,7 @@ Calculez le montant à acheter pour chaque échange. Si le résultat est inféri
}
```
-Enfin, transférez le jeton ERC-20 initial sur le compte pour l'échange de la première paire et appelez `_swap`. Tout cela se passe dans la même transaction. Ainsi, l'échange de paire sait que tous les jetons inattendus font partie de ce transfert.
+Enfin, transférez le jeton ERC-20 initial sur le compte pour l'échange de la première paire et appelez `_swap`. Tout cela se passe dans la même transaction. Ainsi, l'échange de paires sait que tous les jetons inattendus font partie de ce transfert.
```solidity
function swapTokensForExactTokens(
@@ -1415,7 +1428,7 @@ Enfin, transférez le jeton ERC-20 initial sur le compte pour l'échange de la p
La fonction précédente, `swapTokensForTokens`, permet à un trader de spécifier le nombre exact de jetons d'entrée qu'il est prêt à donner et le nombre minimum de jetons de sortie qu'il est prêt à recevoir en retour. Cette fonction fait l'échange inverse, elle permet à un trader de spécifier le nombre de jetons de sortie qu'il veut, ainsi que le nombre maximum de jetons d'entrée qu'il est prêt à payer.
-Dans les deux cas, le trader doit d'abord donner à ce contrat périphérique une indemnité lui permettant de les transférer.
+Dans les deux cas, le trader doit d'abord donner à ce contrat périphérique une autorisation pour lui permettre de les transférer.
```solidity
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
@@ -1501,7 +1514,7 @@ Ces quatre variantes impliquent toutes des échanges entre ETH et des jetons. La
function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
```
-C'est la fonction interne pour échanger les jetons associés à des frais de transfert ou de stockage pour résoudre ([ce problème](https://github.com/Uniswap/uniswap-interface/issues/835)).
+C'est la fonction interne pour échanger les jetons qui ont des frais de transfert ou de stockage pour résoudre ([ce problème](https://github.com/Uniswap/uniswap-interface/issues/835)).
```solidity
for (uint i; i < path.length - 1; i++) {
@@ -1510,16 +1523,16 @@ C'est la fonction interne pour échanger les jetons associés à des frais de tr
IUniswapV2Pair pair = IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output));
uint amountInput;
uint amountOutput;
- { // scope to avoid stack too deep errors
+ { // portée pour éviter les erreurs de pile trop profonde
(uint reserve0, uint reserve1,) = pair.getReserves();
(uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
amountInput = IERC20(input).balanceOf(address(pair)).sub(reserveInput);
amountOutput = UniswapV2Library.getAmountOut(amountInput, reserveInput, reserveOutput);
```
-En raison des frais de transfert, nous ne pouvons pas compter sur la fonction `getAmountsOut` pour nous dire combien nous tirons de chaque transfert (la façon dont nous le faisons avant d'appeler le `_swap` original). Au lieu de cela, nous devons d'abord transférer et ensuite voir combien de jetons nous avons récupérés.
+En raison des frais de transfert, nous ne pouvons pas nous fier à la fonction `getAmountsOut` pour nous dire combien nous obtenons de chaque transfert (comme nous le faisons avant d'appeler le `_swap` original). Au lieu de cela, nous devons d'abord transférer et ensuite voir combien de jetons nous avons récupérés.
-Remarque : En théorie, nous pourrions simplement utiliser cette fonction au lieu de `_swap`, mais dans certains cas (par exemple, si le transfert s'achève parce qu'il n'y a pas assez à la fin pour atteindre le minimum requis) cela finirait par coûter plus en gaz. Les jetons de frais de transfert sont assez rares, donc bien que nous devions les prendre en compte, il n'est pas nécessaire de supposer que tous les swaps passent par au moins un d'entre eux.
+Remarque : En théorie, nous pourrions simplement utiliser cette fonction au lieu de `_swap`, mais dans certains cas (par exemple, si le transfert est annulé parce qu'il n'y a pas assez à la fin pour atteindre le minimum requis), cela finirait par coûter plus de gaz. Les jetons avec frais de transfert sont assez rares. Bien que nous devions les prendre en charge, il n'est pas nécessaire que tous les échanges partent du principe qu'ils en impliquent au moins un.
```solidity
}
@@ -1598,10 +1611,10 @@ Remarque : En théorie, nous pourrions simplement utiliser cette fonction au lie
}
```
-Ce sont les mêmes variants utilisés pour les jetons normaux, mais ils appellent à la place `_swapSupportingFeeOnTransferTokens`.
+Ce sont les mêmes variantes utilisées pour les jetons normaux, mais elles appellent `_swapSupportingFeeOnTransferTokens` à la place.
```solidity
- // **** LIBRARY FUNCTIONS ****
+ // **** FONCTIONS DE LA BIBLIOTHÈQUE ****
function quote(uint amountA, uint reserveA, uint reserveB) public pure virtual override returns (uint amountB) {
return UniswapV2Library.quote(amountA, reserveA, reserveB);
}
@@ -1648,38 +1661,38 @@ Ce sont les mêmes variants utilisés pour les jetons normaux, mais ils appellen
}
```
-Ces fonctions ne sont que des proxy qui appellent les fonctions [UniswapV2Library](#uniswapV2library).
+Ces fonctions sont simplement des proxys qui appellent les [fonctions d'UniswapV2Library](#uniswapV2library).
### UniswapV2Migrator.sol {#UniswapV2Migrator}
-Ce contrat a été utilisé pour migrer les échanges de l'ancienne v1 vers la v2. Maintenant qu'ils ont été migrés, ce n'est plus pertinent.
+Ce contrat a été utilisé pour migrer les échanges de l'ancienne v1 vers la v2. Maintenant qu'ils ont été migrés, il n'est plus pertinent.
## Les bibliothèques {#libraries}
-La bibliothèque [SafeMath](https://docs.openzeppelin.com/contracts/2.x/api/math) est bien documentée et il n'y a pas lieu donc ici de le faire.
+La [bibliothèque SafeMath](https://docs.openzeppelin.com/contracts/2.x/api/math) est bien documentée, il n'est donc pas nécessaire de la documenter ici.
-### Mathématiques {#Math}
+### Math {#Math}
-Cette bibliothèque contient des fonctions mathématiques qui ne sont pas habituelement nécessaires dans le code Solidity. Elles ne font donc pas partie du langage.
+Cette bibliothèque contient des fonctions mathématiques qui ne sont pas habituellement nécessaires dans le code Solidity. Elles ne font donc pas partie du langage.
```solidity
pragma solidity =0.5.16;
-// a library for performing various math operations
+// une bibliothèque pour effectuer diverses opérations mathématiques
library Math {
function min(uint x, uint y) internal pure returns (uint z) {
z = x < y ? x : y;
}
- // babylonian method (https://wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
+ // méthode babylonienne (https://wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
function sqrt(uint y) internal pure returns (uint z) {
if (y > 3) {
z = y;
uint x = y / 2 + 1;
```
-Commencez avec x comme une estimation supérieure à la racine carrée (c'est la raison pour laquelle nous devons traiter 1-3 comme des cas spéciaux).
+Commencez avec x comme une estimation supérieure à la racine carrée (c'est la raison pour laquelle nous devons traiter 1-3 comme des cas particuliers).
```solidity
while (x < z) {
@@ -1687,7 +1700,7 @@ Commencez avec x comme une estimation supérieure à la racine carrée (c'est la
x = (y / x + x) / 2;
```
-Obtenez une estimation plus précise, la moyenne de l'estimation précédente et le nombre dont nous essayons de trouver la racine carrée divisés par l'estimation précédente. Répétez jusqu'à ce que la nouvelle estimation ne soit pas inférieure à celle existante. Pour de plus amples informations : [voir ici](https://wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method).
+Obtenez une estimation plus précise, la moyenne de l'estimation précédente et le nombre dont nous essayons de trouver la racine carrée divisée par l'estimation précédente. Répétez jusqu'à ce que la nouvelle estimation ne soit pas inférieure à celle existante. Pour plus de détails, [voir ici](https://wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method).
```solidity
}
@@ -1703,17 +1716,17 @@ Nous ne devrions jamais avoir besoin de la racine carrée de zéro. Les racines
}
```
-### Fractions de points fixes (UQ112x112) {#FixedPoint}
+### Fractions à point fixe (UQ112x112) {#FixedPoint}
-Cette bibliothèque gère les fractions qui ne font normalement pas partie de l'arithmétique Ethereum. Elle réalise cela en encodant le nombre _x_ en _x\*2^112_. Cela nous permet d'utiliser l'addition originale et les opcodes de soustraction sans aucun changement.
+Cette bibliothèque gère les fractions qui ne font normalement pas partie de l'arithmétique Ethereum. Elle le fait en encodant le nombre _x_ comme _x\*2^112_. Cela nous permet d'utiliser les codes d'opérations d'addition et de soustraction d'origine sans modification.
```solidity
pragma solidity =0.5.16;
-// a library for handling binary fixed point numbers (https://wikipedia.org/wiki/Q_(number_format))
+// une bibliothèque pour la gestion des nombres à virgule fixe binaires (https://wikipedia.org/wiki/Q_(number_format))
-// range: [0, 2**112 - 1]
-// resolution: 1 / 2**112
+// plage : [0, 2**112 - 1]
+// résolution : 1 / 2**112
library UQ112x112 {
uint224 constant Q112 = 2**112;
@@ -1722,25 +1735,25 @@ library UQ112x112 {
`Q112` est l'encodage pour un.
```solidity
- // encode a uint112 as a UQ112x112
+ // encode un uint112 en UQ112x112
function encode(uint112 y) internal pure returns (uint224 z) {
- z = uint224(y) * Q112; // never overflows
+ z = uint224(y) * Q112; // ne provoque jamais de dépassement
}
```
-Parce que 'y' est `uint112`, le maximum peut-être 2^112-1. Ce nombre peut toujours être encodé en tant que `UQ112x112`.
+Puisque y est un `uint112`, sa valeur maximale est 2^112-1. Ce nombre peut toujours être encodé en `UQ112x112`.
```solidity
- // divide a UQ112x112 by a uint112, returning a UQ112x112
+ // divise un UQ112x112 par un uint112, retournant un UQ112x112
function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {
z = x / uint224(y);
}
}
```
-Si nous divisons deux valeurs `UQ112x112`, le résultat ne sera plus multiplié par 2^112. Ainsi, nous prenons à la place un entier comme dénominateur. Nous aurions dû utiliser une astuce similaire pour faire la multiplication, mais nous n'avons pas besoin de faire la multiplication de la valeur `UQ112x112`.
+Si nous divisons deux valeurs `UQ112x112`, le résultat n'est plus multiplié par 2^112. Ainsi, nous prenons à la place un entier comme dénominateur. Nous aurions dû utiliser une astuce similaire pour faire la multiplication, mais nous n'avons pas besoin de faire la multiplication de la valeur `UQ112x112`.
-### Bibliothèque UniswapV2 {#uniswapV2library}
+### UniswapV2Library {#uniswapV2library}
Cette bibliothèque n'est utilisée que par les contrats périphériques
@@ -1754,7 +1767,7 @@ import "./SafeMath.sol";
library UniswapV2Library {
using SafeMath for uint;
- // returns sorted token addresses, used to handle return values from pairs sorted in this order
+ // renvoie les adresses des jetons triés, utilisé pour gérer les valeurs de retour des paires triées dans cet ordre
function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
require(tokenA != tokenB, 'UniswapV2Library: IDENTICAL_ADDRESSES');
(token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
@@ -1762,25 +1775,25 @@ library UniswapV2Library {
}
```
-Trie les deux jetons par leurs adresses afin que nous puissions obtenir l'adresse de leur échange en paire. Ceci est nécessaire car sinon nous aurions deux possibilités, une pour les paramètres A,B et un autre pour les paramètres B,A, impliquant deux échanges au lieu d'un.
+Triez les deux jetons par adresse, afin que nous puissions obtenir l'adresse de l'échange de paires pour eux. Ceci est nécessaire car sinon nous aurions deux possibilités, une pour les paramètres A, B et une autre pour les paramètres B, A, ce qui conduirait à deux échanges au lieu d'un seul.
```solidity
- // calculates the CREATE2 address for a pair without making any external calls
+ // calcule l'adresse CREATE2 pour une paire sans effectuer d'appels externes
function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
(address token0, address token1) = sortTokens(tokenA, tokenB);
pair = address(uint(keccak256(abi.encodePacked(
hex'ff',
factory,
keccak256(abi.encodePacked(token0, token1)),
- hex'96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f' // init code hash
+ hex'96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f' // hachage du code d'initialisation
))));
}
```
-Cette fonction calcule l'adresse de l'échange en paire pour les deux jetons. Ce contrat est créé en utilisant [l'opcode CREATE2](https://eips.ethereum.org/EIPS/eip-1014) et ainsi nous pouvons calculer l'adresse utilisant le même algorithme si nous connaissons les paramètres qu'il utilise. C'est beaucoup moins cher que de demander à l'usine.
+Cette fonction calcule l'adresse de l'échange en paire pour les deux jetons. Ce contrat est créé en utilisant [le code d'opération CREATE2](https://eips.ethereum.org/EIPS/eip-1014). Nous pouvons donc calculer l'adresse en utilisant le même algorithme si nous connaissons les paramètres qu'il utilise. C'est beaucoup moins cher que de demander à la factory, et
```solidity
- // fetches and sorts the reserves for a pair
+ // récupère et trie les réserves pour une paire
function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
(address token0,) = sortTokens(tokenA, tokenB);
(uint reserve0, uint reserve1,) = IUniswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves();
@@ -1788,10 +1801,10 @@ Cette fonction calcule l'adresse de l'échange en paire pour les deux jetons. Ce
}
```
-Cette fonction retourne les réserves des deux jetons que l'échange en paire possède. Notez qu'il peut recevoir les jetons dans l'ordre et les trier pour un usage interne.
+Cette fonction retourne les réserves des deux jetons que l'échange en paire possède. Notez qu'il peut recevoir les jetons dans n'importe quel ordre, et les trier pour un usage interne.
```solidity
- // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
+ // étant donné un certain montant d'un actif et des réserves de paires, renvoie un montant équivalent de l'autre actif
function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
require(amountA > 0, 'UniswapV2Library: INSUFFICIENT_AMOUNT');
require(reserveA > 0 && reserveB > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
@@ -1802,11 +1815,11 @@ Cette fonction retourne les réserves des deux jetons que l'échange en paire po
Cette fonction vous donne le montant du jeton B que vous obtiendrez en échange du jeton A s'il n'y a pas de frais engagés. Ce calcul prend en compte le fait que le transfert modifie le taux de change.
```solidity
- // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
+ // étant donné un montant d'entrée d'un actif et des réserves de paires, renvoie le montant de sortie maximum de l'autre actif
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
```
-La fonction `quote` ci-dessus fonctionne bien s'il n'y a pas de frais pour l'utilisation de l'échange en paire. Cependant, s'il existe des frais de change de 0,3 %, le montant que vous obtenez est inférieur. Cette fonction calcule le montant après les frais de change.
+La fonction `quote` ci-dessus fonctionne bien s'il n'y a pas de frais pour l'utilisation de l'échange en paire. Cependant, s'il existe des frais de change de 0,3 %, le montant que vous obtenez réellement est inférieur. Cette fonction calcule le montant après les frais de change.
```solidity
@@ -1819,10 +1832,10 @@ La fonction `quote` ci-dessus fonctionne bien s'il n'y a pas de frais pour l'uti
}
```
-Solidity ne gère pas nativement les fractions. Ainsi, nous ne pouvons pas simplement multiplier le montant par 0,997. Au lieu de cela, nous multiplions le numérateur par 997 et le dénominateur par 1 000, avec le même effet.
+Solidity ne gère pas nativement les fractions. Ainsi, nous ne pouvons pas simplement multiplier le montant par 0,997. Au lieu de cela, nous multiplions le numérateur par 997 et le dénominateur par 1 000, ce qui a le même effet.
```solidity
- // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
+ // étant donné un montant de sortie d'un actif et des réserves de paires, renvoie le montant d'entrée requis de l'autre actif
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
require(amountOut > 0, 'UniswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT');
require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
@@ -1836,7 +1849,7 @@ Cette fonction réalise à peu près la même chose, mais elle récupère le mon
```solidity
- // performs chained getAmountOut calculations on any number of pairs
+ // effectue des calculs de getAmountOut en chaîne sur un nombre quelconque de paires
function getAmountsOut(address factory, uint amountIn, address[] memory path) internal view returns (uint[] memory amounts) {
require(path.length >= 2, 'UniswapV2Library: INVALID_PATH');
amounts = new uint[](path.length);
@@ -1847,7 +1860,7 @@ Cette fonction réalise à peu près la même chose, mais elle récupère le mon
}
}
- // performs chained getAmountIn calculations on any number of pairs
+ // effectue des calculs de getAmountIn en chaîne sur un nombre quelconque de paires
function getAmountsIn(address factory, uint amountOut, address[] memory path) internal view returns (uint[] memory amounts) {
require(path.length >= 2, 'UniswapV2Library: INVALID_PATH');
amounts = new uint[](path.length);
@@ -1862,16 +1875,16 @@ Cette fonction réalise à peu près la même chose, mais elle récupère le mon
Ces deux fonctions permettent d'identifier les valeurs lorsqu'il est nécessaire de passer par plusieurs échanges de paires.
-### Assistant de transfert {#transfer-helper}
+### Aide au transfert {#transfer-helper}
-[Cette bibliothèque](https://github.com/Uniswap/uniswap-lib/blob/master/contracts/libraries/TransferHelper.sol) ajoute des vérifications de réussites des transferts ERC-20 et Ethereum pour traiter une annulation et une valeur retournée `false` de la même façon.
+[Cette bibliothèque](https://github.com/Uniswap/uniswap-lib/blob/master/contracts/libraries/TransferHelper.sol) ajoute des contrôles de réussite autour des transferts ERC-20 et Ethereum pour traiter de la même manière une annulation et un retour de valeur `false`.
```solidity
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity >=0.6.0;
-// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
+// méthodes d'aide pour interagir avec les jetons ERC20 et envoyer des ETH qui ne renvoient pas systématiquement true/false
library TransferHelper {
function safeApprove(
address token,
@@ -1886,7 +1899,7 @@ library TransferHelper {
Nous pouvons appeler un autre contrat de deux manières :
- Utiliser une définition d'interface pour créer un appel de fonction
-- Utiliser l'[interface binaire d'application (ABI)](https://docs.soliditylang.org/en/v0.8.3/abi-spec.html) « manuellement » pour créer l'appel. C'est ce que l'auteur du code a décidé de faire.
+- Utiliser l'[interface binaire de l'application (ABI)](https://docs.soliditylang.org/en/v0.8.3/abi-spec.html) « manuellement » pour créer l'appel. C'est ce que l'auteur du code a décidé de faire.
```solidity
require(
@@ -1896,7 +1909,7 @@ Nous pouvons appeler un autre contrat de deux manières :
}
```
-Pour des raisons de compatibilité ascendante avec un jeton qui a été créé avant la norme ERC-20, un appel ERC-20 peut échouer soit en revenant (dans ce cas `success` sera `false`) soit en réussissant et en retournant une valeur `false` (dans ce cas il y aura une donnée de sortie et si vous la décodez comme un booléen, vous obtenez `false`).
+Pour des raisons de rétrocompatibilité avec les jetons créés avant la norme ERC-20, un appel ERC-20 peut échouer soit en étant annulé (auquel cas `success` est `false`), soit en réussissant mais en retournant une valeur `false` (auquel cas il y a des données de sortie, et si vous les décodez en tant que booléen, vous obtenez `false`).
```solidity
@@ -1915,7 +1928,7 @@ Pour des raisons de compatibilité ascendante avec un jeton qui a été créé a
}
```
-Cette fonction implémente [la fonctionnalité transfert de ERC-20](https://eips.ethereum.org/EIPS/eip-20#transfer), qui permet à un compte de dépenser la provision fournie par un autre compte.
+Cette fonction implémente la [fonctionnalité de transfert d'ERC-20](https://eips.ethereum.org/EIPS/eip-20#transfer), qui permet à un compte de dépenser la provision fournie par un autre compte.
```solidity
@@ -1934,7 +1947,7 @@ Cette fonction implémente [la fonctionnalité transfert de ERC-20](https://eips
}
```
-Cette fonction implémente [la fonctionnalité transferFrom de ERC-20](https://eips.ethereum.org/EIPS/eip-20#transferfrom), qui permet à un compte de dépenser la provision fournie par un autre compte.
+Cette fonction implémente la [fonctionnalité transferFrom d'ERC-20](https://eips.ethereum.org/EIPS/eip-20#transferfrom), qui permet à un compte de dépenser la provision fournie par un autre compte.
```solidity
@@ -1945,10 +1958,12 @@ Cette fonction implémente [la fonctionnalité transferFrom de ERC-20](https://e
}
```
-Cette fonction transfère de l'éther vers un compte. Tout appel à un autre contrat peut tenter d'envoyer l'éther en question. Parce que nous n'avons pas besoin d'appeler une quelconque fonction, nous n'envoyons aucune donnée avec l'appel.
+Cette fonction transfère de l'éther vers un compte. Tout appel à un autre contrat peut tenter d'envoyer de l'éther. Parce que nous n'avons pas besoin d'appeler une quelconque fonction, nous n'envoyons aucune donnée avec l'appel.
## Conclusion {#conclusion}
-Ceci est un article d'environ 50 pages. Si vous êtes arrivé jusqu'ici, félicitations ! Espérons que maintenant vous avez compris les considérations à prendre en compte pour écrire une application réelle (par opposition aux programmes courts d'échantillons) et êtes plus à même d'écrire des contrats pour vos propres utilisations.
+Ceci est un long article d'environ 50 pages. Si vous êtes arrivé jusqu'ici, félicitations ! Espérons que maintenant vous avez compris les considérations à prendre en compte pour écrire une application réelle (par opposition aux programmes d'exemple courts) et que vous êtes mieux à même d'écrire des contrats pour vos propres cas d'utilisation.
Et maintenant, à vous d'écrire quelque chose d'utile et de nous étonner.
+
+[Voir ici pour plus de mon travail](https://cryptodocguy.pro/).
diff --git a/public/content/translations/fr/developers/tutorials/using-websockets/index.md b/public/content/translations/fr/developers/tutorials/using-websockets/index.md
index 3ccb429d597..7159b0c46b8 100644
--- a/public/content/translations/fr/developers/tutorials/using-websockets/index.md
+++ b/public/content/translations/fr/developers/tutorials/using-websockets/index.md
@@ -1,22 +1,18 @@
---
title: Utiliser WebSockets
-description: Guide d'utilisation des WebSockets et d'Alchemy pour réaliser des requêtes JSON-RPC et s'abonner à des événements.
+description: "Guide d'utilisation des WebSockets et d'Alchemy pour réaliser des requêtes JSON-RPC et s'abonner à des événements."
author: "Elan Halpern"
lang: fr
-tags:
- - "alchemy"
- - "websockets"
- - "requêtes"
- - "javascript"
+tags: [ "alchemy", "websockets", "requêtes", "javascript" ]
skill: beginner
-source: Documentation Alchemy
-sourceUrl: https://docs.alchemyapi.io/guides/using-websockets
+source: Alchemy docs
+sourceUrl: https://www.alchemy.com/docs/reference/best-practices-for-using-websockets-in-web3
published: 2020-12-01
---
Il s'agit d'un guide pour débuter avec l'utilisation de WebSockets et d'Alchemy pour effectuer des requêtes sur la blockchain Ethereum.
-## WebSockets vs. HTTP {#websockets-vs-http}
+## WebSockets vs HTTP {#websockets-vs-http}
Contrairement à HTTP, avec les WebSockets, il n'est pas nécessaire d'émettre continuellement des demandes lorsque vous souhaitez obtenir des informations spécifiques. WebSockets maintient une connexion réseau pour vous (si cela est fait correctement) et écoute les modifications.
@@ -24,11 +20,11 @@ Comme pour toute connexion réseau, vous ne devez pas supposer qu'un WebSocket r
[Alchemy Web3](https://docs.alchemy.com/reference/api-overview) ajoute automatiquement la gestion des erreurs WebSocket et les retente sans configuration nécessaire.
-## Essayez le {#try-it-out}
+## Essayez-le {#try-it-out}
-Le moyen le plus simple de tester WebSockets est d'installer un outil de lignes de commandes pour créer des requêtes WebSocket telles que [wscat](https://github.com/websockets/wscat). En utilisant wscat, vous pouvez envoyer des requêtes comme suit :
+Le moyen le plus simple de tester les WebSockets est d'installer un outil en ligne de commande pour effectuer des requêtes WebSocket, tel que [wscat](https://github.com/websockets/wscat). En utilisant wscat, vous pouvez envoyer des requêtes comme suit :
-_Note : Si vous disposez d'un compte Alchemy, vous pouvez remplacer `demo` par votre propre clé API. [ Créez votre compte Alchemy gratuitement ici !](https://auth.alchemyapi.io/signup)_
+_Note : si vous avez un compte Alchemy, vous pouvez remplacer `demo` par votre propre clé API. [Inscrivez-vous gratuitement pour obtenir un compte Alchemy ici !](https://auth.alchemy.com/signup)_
```
wscat -c wss://eth-mainnet.ws.alchemyapi.io/ws/demo
@@ -39,13 +35,13 @@ wscat -c wss://eth-mainnet.ws.alchemyapi.io/ws/demo
```
-## Comment utiliser WebSockets {#how-to-use-websockets}
+## Comment utiliser les WebSockets {#how-to-use-websockets}
-Pour commencer, ouvrez un WebSocket en utilisant le lien Websocket pour votre app. Vous pouvez trouver l'URL WebSocket de votre application en ouvrant la page de l'application dans [votre tableau de bord](https://dashboard.alchemyapi.io/) et en cliquant sur « Afficher la clé ». Notez que l'URL de votre application pour WebSockets est différente de son URL pour les demandes HTTP, mais les deux peuvent être trouvées en cliquant sur « Voir la clé ».
+Pour commencer, ouvrez un WebSocket en utilisant le lien Websocket pour votre app. Vous pouvez trouver l'URL WebSocket de votre application en ouvrant la page de l'application dans [votre tableau de bord](https://dashboard.alchemy.com/) et en cliquant sur « Afficher la clé ». Notez que l'URL de votre application pour WebSockets est différente de son URL pour les demandes HTTP, mais les deux peuvent être trouvées en cliquant sur « Voir la clé ».
-
+
-Chacune des API listées dans la [Référence de l'API Alchemy](https://docs.alchemyapi.io/documentation/alchemy-api-reference/) peut être utilisée via WebSocket. Pour ce faire, utilisez le même bloc que le corps d'une requête HTTP POST, mais envoyez ce payload à travers le WebSocket.
+Toutes les API répertoriées dans la [référence de l'API Alchemy](https://www.alchemy.com/docs/reference/api-overview) peuvent être utilisées via WebSocket. Pour ce faire, utilisez le même bloc que le corps d'une requête HTTP POST, mais envoyez ce payload à travers le WebSocket.
## Avec Web3 {#with-web3}
@@ -59,7 +55,7 @@ web3.eth.getBlockNumber().then(console.log) // -> 7946893
## API d'abonnement {#subscription-api}
-Lorsque vous êtes connecté avec WebSocket, vous avez accès à deux méthodes supplémentaires : `eth_subscribe` et `eth_unsubscribe`. Ces méthodes vous permettront d'écouter des événements spécifiques et d'être immédiatement averti lorsqu'ils se produisent.
+Lorsque vous êtes connecté via un WebSocket, vous pouvez utiliser deux méthodes supplémentaires : `eth_subscribe` et `eth_unsubscribe`. Ces méthodes vous permettront d'écouter des événements spécifiques et d'être immédiatement averti lorsqu'ils se produisent.
### `eth_subscribe` {#eth-subscribe}
@@ -72,25 +68,25 @@ Crée un nouvel abonnement pour les événements spécifiés. [En savoir plus su
Le premier argument spécifie le type d'événement à écouter. Le deuxième argument contient des options supplémentaires qui dépendent du premier argument. Les différents types de description, leurs options et leurs blocs d'événement sont décrits ci-dessous.
-#### Valeur de retour {#returns}
+#### Retours {#returns}
-L'identifiant de l'abonnement : cet identifiant sera attaché à chaque événements reçu, et peut également être utilisé pour résilier l'abonnement associé en utilisant `eth_unsubscribe`.
+L'ID de l'abonnement : cet ID sera joint à tous les événements reçus et pourra également être utilisé pour annuler l'abonnement à l'aide de `eth_unsubscribe`.
#### Événements d'abonnement {#subscription-events}
Tant que l'abonnement est actif, vous recevrez des événements sous la forme d'objets avec les propriétés suivantes :
-- `jsonrpc` : Toujours « 2.0 »
-- `method` : Toujours « eth_subscription »
-- `params` : Un objet comportant les propriétés suivantes :
- - `subscription` : L'identifiant de l'abonnement retourné par l'appel de la méthode `eth_subscription` qui a créé cet abonnement.
- - `result` : Un objet dont le contenu varie en fonction du type d'abonnement.
+- `jsonrpc` : Toujours « 2.0 »
+- `method` : Toujours « eth_subscription »
+- `params` : Un objet avec les champs suivants :
+ - `subscription` : L'ID d'abonnement renvoyé par l'appel `eth_subscribe` qui a créé cet abonnement.
+ - `result` : un objet dont le contenu varie en fonction du type d'abonnement.
-#### Types d'abonnement {#subscription-types}
+#### Types d'abonnements {#subscription-types}
1. `alchemy_newFullPendingTransactions`
-Retourne les informations de transaction pour toutes les transactions qui sont ajoutées à l'état en attente. Ce type d'abonnement concerne les transactions en attente, de manière similaire à l'appel Web3 standard `web3.eth.subscribe(« pendingTransactions »)`, mais à la différence qu'il émet _des informations complètes sur les transactions_ plutôt que simplement les empreintes numériques.
+Retourne les informations de transaction pour toutes les transactions qui sont ajoutées à l'état en attente. Ce type d'abonnement souscrit aux transactions en attente, de la même manière que l'appel Web3 standard `web3.eth.subscribe("pendingTransactions")`, mais il diffère en ce qu'il émet des _informations de transaction complètes_ plutôt que de simples hachages de transaction.
Exemple :
@@ -148,7 +144,7 @@ Exemple :
"nonce": "0x084149998194cc5f",
"number": "0x1348c9",
"parentHash": "0x7736fab79e05dc611604d22470dadad26f56fe494421b5b333de816ce1f25701",
- "receiptRoot": "0x2fab35823ad00c7bb388595cb46652fe7886e00660a01e867824d3dceb1c8d36",
+'était un tableau de ces chaînes. "receiptRoot": "0x2fab35823ad00c7bb388595cb46652fe7886e00660a01e867824d3dceb1c8d36",
"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"stateRoot": "0xb3346685172db67de536d8765c43c31009d0eb3bd9c501c9be3229203f15f378",
"timestamp": "0x56ffeff8",
@@ -164,26 +160,26 @@ Exemple :
Émet des journaux concernant les blocs récemment ajoutés qui correspondent aux critères de filtre spécifiés.
-Lorsqu'une réorganisation de la chaîne se produit, les logs qui font partie des blocs de l'ancienne chaîne seront à nouveau émis avec la propriété `removed` réglée sur `true`. De plus, les logs qui font partie des blocs de la nouvelle chaîne sont émis, ce qui signifie qu'il est possible de voir les journaux pour la même transaction plusieurs fois dans le cas d'une réorganisation.
+Lorsqu'une réorganisation de la chaîne se produit, les logs qui font partie des blocs de l'ancienne chaîne seront de nouveau émis avec la propriété `removed` définie sur `true`. De plus, les logs qui font partie des blocs de la nouvelle chaîne sont émis, ce qui signifie qu'il est possible de voir les journaux pour la même transaction plusieurs fois dans le cas d'une réorganisation.
Paramètres
1. Un objet avec les propriétés suivantes :
- - `address` (optionnelle) : soit une chaîne de caractères représentant une adresse soit un tableau de ces chaînes de caractères.
+ - `address` (facultatif) : soit une chaîne de caractères représentant une adresse, soit un tableau de ces chaînes.
- Seuls les journaux créés par une de ces adresses seront émis.
- - `topics` : un tableau de spécificateurs de sujet.
+ - `topics` : un tableau de spécificateurs de sujet.
- Chaque spécificateur de sujet est soit `null`, soit une chaîne de caractères représentant un sujet, soit un tableau de chaînes de caractères.
- - Chaque position dans le tableau qui n'est pas `null` limite les logs émis à ceux qui ont un des sujets donnés dans cette position.
+ - Chaque position dans le tableau qui n'est pas `null` restreint les logs émis à ceux qui ont l'un des sujets donnés dans cette position.
Quelques exemples de spécifications du sujet :
-- `[]` : Tous les sujets sont autorisés.
-- `[A]`: A en première position (et n'importe quoi après).
-- `[null, B]` : N'importe quoi en première position et B en deuxième position (et n'importe quoi après).
-- `[A, B]` : A en première position et B en deuxième position (et n'importe quoi après).
-- `[[A, B], [A, B]]` : (A ou B) en première position et (A ou B) en deuxième position (et n'importe quoi après).
+- `[]` : Tous les sujets sont autorisés.
+- `[A]` : A en première position (et n'importe quoi après).
+- `[null, B]` : N'importe quoi en première position et B en deuxième position (et n'importe quoi après).
+- `[A, B]` : A en première position et B en deuxième position (et n'importe quoi après).
+- `[[A, B], [A, B]]` : (A ou B) en première position et (A ou B) en deuxième position (et n'importe quoi après).
-Exemple :
+Exemple :
```json
> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["logs", {"address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", "topics": ["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"]}]}
@@ -215,7 +211,7 @@ Annule un abonnement existant afin qu'aucun événement supplémentaire ne soit
Paramètres
-1. ID de l'abonnement, comme précédemment retourné de l'appel `eth_subscribe`.
+1. ID d'abonnement, tel que retourné précédemment par un appel `eth_subscribe`.
Retours
@@ -246,4 +242,4 @@ curl https://eth-mainnet.alchemyapi.io/v2/your-api-key
---
-[Inscrivez-vous gratuitement sur Alchemy](https://auth.alchemyapi.io/signup), consultez [notre documentation](https://docs.alchemyapi.io/), et pour les dernières nouvelles, suivez-nous sur [Twitter](https://twitter.com/AlchemyPlatform).
+[Inscrivez-vous gratuitement sur Alchemy](https://auth.alchemy.com), consultez [notre documentation](https://www.alchemy.com/docs/), et pour les dernières actualités, suivez-nous sur [Twitter](https://x.com/AlchemyPlatform).
diff --git a/public/content/translations/fr/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md b/public/content/translations/fr/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md
index 994532ecc8b..0a6e4a297ea 100644
--- a/public/content/translations/fr/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md
+++ b/public/content/translations/fr/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md
@@ -1,13 +1,15 @@
---
-title: "Waffle: Bouchonnage dynamique et tests de contrats"
-description: Tutoriel Waffle avancé pour utiliser le bouchonnage dynamique et tester les appels de contrat
+title: "Waffle : Bouchonnage dynamique et tests d'appels de contrat"
+description: "Tutoriel Waffle avancé pour utiliser le bouchonnage dynamique et tester les appels de contrat"
author: "Daniel Izdebski"
tags:
- - "waffle"
- - "contrats intelligents"
- - "solidity"
- - "test"
- - "bouchonnage"
+ [
+ "waffle",
+ "contrats intelligents",
+ "solidité",
+ "test",
+ "simulation"
+ ]
skill: intermediate
lang: fr
published: 2020-11-14
@@ -20,19 +22,19 @@ Dans ce tutoriel, vous apprendrez comment :
- utiliser le bouchonnage dynamique
- tester les interactions entre contrats intelligents
-Prérequis :
+Hypothèses :
- vous savez déjà écrire un simple contrat intelligent en `Solidity`
-- vous vous débrouillez en `JavaScript` et en `TypeScript`
-- vous avez fait d'autres tutoriels `Waffle` ou vous connaissez deux ou trois choses à ce sujet
+- vous vous débrouillez en `JavaScript` et `TypeScript`
+- vous avez suivi d'autres tutoriels `Waffle` ou vous en savez déjà un peu plus à ce sujet
## Bouchonnage dynamique {#dynamic-mocking}
-Pourquoi le bouchonnage dynamique est-il utile ? Eh bien, il nous permet de rédiger des tests unitaires plutôt que des tests d'intégration. Qu'est-ce que cela signifie ? Cela signifie que nous n'avons pas à nous soucier des dépendances des contrats intelligents, donc que nous pouvons tous les tester de façon isolée. Laissez-moi vous montrer comment procéder.
+Pourquoi le bouchonnage dynamique est-il utile ? Eh bien, il nous permet de rédiger des tests unitaires plutôt que des tests d'intégration. Qu'est-ce que cela signifie ? Cela signifie que nous n'avons pas à nous soucier des dépendances des contrats intelligents, nous pouvons donc tous les tester de manière complètement isolée. Laissez-moi vous montrer comment procéder.
### **1. Projet** {#1-project}
-Avant de commencer, nous avons besoin de préparer un simple projet node.js :
+Avant de commencer, nous devons préparer un simple projet node.js :
```bash
mkdir dynamic-mocking
@@ -40,23 +42,23 @@ cd dynamic-mocking
mkdir contracts src
yarn init
-# or if you're using npm
+# ou si vous utilisez npm
npm init
```
-Commençons par ajouter typescript et les dépendances de test - mocha & chai :
+Commençons par ajouter TypeScript et les dépendances de test, soit mocha et chai :
```bash
yarn add --dev @types/chai @types/mocha chai mocha ts-node typescript
-# or if you're using npm
+# ou si vous utilisez npm
npm install @types/chai @types/mocha chai mocha ts-node typescript --save-dev
```
-Maintenant, ajoutons `Waffle` et `ethers`:
+Maintenant, ajoutons `Waffle` et `ethers` :
```bash
yarn add --dev ethereum-waffle ethers
-# or if you're using npm
+# ou si vous utilisez npm
npm install ethereum-waffle ethers --save-dev
```
@@ -71,9 +73,9 @@ La structure de votre projet devrait ressembler à ceci :
### **2. Contrat intelligent** {#2-smart-contract}
-Pour démarrer un bouchonnage dynamique, nous avons besoin d'un contrat intelligent avec des dépendances. Ne t'inquiètes pas, nous assurons tes arrières !
+Pour commencer le bouchonnage dynamique, nous avons besoin d'un contrat intelligent avec des dépendances. Ne vous inquiétez pas, j'ai ce qu'il vous faut !
-Voici un contrat intelligent simple écrit en `Solidity` dont le seul but est de vérifier si nous sommes riches. Il utilise un jeton ERC20 pour vérifier si nous avons suffisamment de jetons. Mettez-le dans `./contracts/AmIRichAlready.sol`.
+Voici un contrat intelligent simple écrit en `Solidity` dont le seul but est de vérifier si nous sommes riches. Il utilise un jeton ERC20 pour vérifier si nous avons suffisamment de jetons. Placez-le dans `./contracts/AmIRichAlready.sol`.
```solidity
pragma solidity ^0.6.2;
@@ -97,9 +99,9 @@ contract AmIRichAlready {
}
```
-Comme nous voulons utiliser le bouchonnage dynamique, nous n'avons pas besoin de tout l'ERC20, c'est pourquoi nous utilisons l'interface IERC20 avec une seule fonction.
+Comme nous voulons utiliser le bouchonnage dynamique, nous n'avons pas besoin de l'intégralité de l'ERC20. C'est pourquoi nous utilisons l'interface IERC20 avec une seule fonction.
-Il est temps de créer ce contrat ! Pour cela, nous utiliserons le `Waffle`. Tout d'abord, nous allons créer un simple fichier de configuration `waffle.json` qui spécifie les options de compilation.
+Il est temps de compiler ce contrat ! Pour cela, nous utiliserons `Waffle`. Tout d'abord, nous allons créer un simple fichier de configuration `waffle.json` qui spécifie les options de compilation.
```json
{
@@ -116,11 +118,11 @@ Nous sommes désormais prêts à construire le contrat avec Waffle :
npx waffle
```
-Facile, n'est-ce pas? Dans le dossier `build/`, deux fichiers correspondant au contrat et à l'interface apparaissent. Nous les utiliserons plus tard pour les tests.
+Facile, n'est-ce pas ? Dans le dossier `build/`, deux fichiers correspondant au contrat et à l'interface sont apparus. Nous les utiliserons plus tard pour les tests.
### **3. Tests** {#3-testing}
-Nous allons créer un fichier appelé `AmIRichAlready.test.ts` pour le test actuel. Tout d'abord, nous devons gérer les importations. Nous en aurons besoin pour plus tard:
+Créons un fichier nommé `AmIRichAlready.test.ts` pour y mettre nos tests. Tout d'abord, nous devons gérer les importations. Nous en aurons besoin pour plus tard :
```typescript
import { expect, use } from "chai"
@@ -133,34 +135,34 @@ import {
} from "ethereum-waffle"
```
-Sauf pour les dépendances JS, nous devons importer le contrat et l'interface précédemment créés :
+Outre les dépendances JS, nous devons importer notre contrat compilé et son interface :
```typescript
import IERC20 from "../build/IERC20.json"
import AmIRichAlready from "../build/AmIRichAlready.json"
```
-Waffle utilise `chai` pour le test. Cependant, avant de pouvoir l'utiliser, nous devons injecter les matchers de Waffle dans le chai lui-même :
+Waffle utilise `chai` pour les tests. Cependant, avant de pouvoir l'utiliser, nous devons injecter les matchers de Waffle dans chai lui-même :
```typescript
use(solidity)
```
-Nous devons implémenter la fonction `beforeEach()` qui réinitialisera l'état du contrat avant chaque test. Réfléchissons d'abord à ce dont nous avons besoin. Pour déployer un contrat, nous avons besoin de deux choses: un wallet et un contrat ERC20 déployé pour le passer comme argument pour le contrat `AmIRichAlready`.
+Nous devons implémenter la fonction `beforeEach()` qui réinitialisera l'état du contrat avant chaque test. Réfléchissons d'abord à ce dont nous avons besoin. Pour déployer un contrat, nous avons besoin de deux choses : un portefeuille et un contrat ERC20 déployé pour le passer en argument au contrat `AmIRichAlready`.
-Premièrement, créons nous un portefeuille:
+Premièrement, créons un portefeuille :
```typescript
const [wallet] = new MockProvider().getWallets()
```
-Ensuite, nous devons déployer un contrat ERC20. Voici la partie délicate - nous n'avons qu'une seule interface. C'est la partie où Waffle vient nous sauver. Waffle a une fonction magique `deployMockContract()` qui crée un contrat en utilisant uniquement le _abi_ de l'interface :
+Ensuite, nous devons déployer un contrat ERC20. Voici la partie délicate : nous n'avons qu'une interface. C'est là que Waffle vient à notre rescousse. Waffle dispose d'une fonction magique `deployMockContract()` qui crée un contrat en utilisant uniquement l'_abi_ de l'interface :
```typescript
const mockERC20 = await deployMockContract(wallet, IERC20.abi)
```
-Maintenant, avec le wallet et l'ERC20 déployé, nous pouvons continuer et déployer le contrat `AmIRichAlready`:
+Maintenant qu'on a le portefeuille et le contrat ERC20 déployé, nous pouvons déployer le contrat `AmIRichAlready` :
```typescript
const contract = await deployContract(wallet, AmIRichAlready, [
@@ -198,37 +200,37 @@ describe("Am I Rich Already", () => {
})
```
-Écrivons le premier test pour le contrat `AmIRichalready`. De quoi pensez-vous que notre test devrait traiter? Ouais, vous avez raison! Nous devrions vérifier si nous sommes déjà riches :)
+Écrivons le premier test pour le contrat `AmIRichAlready`. Selon vous, sur quoi notre test devrait-il porter ? Oui, vous avez raison ! Nous devrions vérifier si nous sommes déjà riches :)
-Mais attendez une seconde. Comment notre contrat fictif saura-t-il quelles valeurs retourner? Nous n'avons implémenté aucune logique pour la fonction `balanceOf()`. Là encore, Waffle peut nous aider. Notre contrat fictif a de nouveaux trucs fantaisistes maintenant :
+Mais attendez une seconde. Comment notre contrat bouchonné saura-t-il quelles valeurs retourner ? Nous n'avons implémenté aucune logique pour la fonction `balanceOf()`. Là encore, Waffle peut nous aider. Notre contrat bouchonné dispose maintenant de nouvelles fonctionnalités intéressantes :
```typescript
await mockERC20.mock..returns()
await mockERC20.mock..withArgs().returns()
```
-Avec cette connaissance, nous pouvons enfin écrire notre premier test :
+Grâce à ces connaissances, nous pouvons enfin écrire notre premier test :
```typescript
-it("returns false if the wallet has less than 1000000 tokens", async () => {
+it("retourne « faux » si le portefeuille a moins de 1 000 000 de jetons", async () => {
await mockERC20.mock.balanceOf.returns(utils.parseEther("999999"))
expect(await contract.check()).to.be.equal(false)
})
```
-Décomposons ce test en parties :
+Décomposons ce test en plusieurs parties :
-1. Nous avons fixé notre contrat fictif ERC20 pour toujours retourner le solde de 999999 jetons.
-2. Vérifiez si la méthode `contract.check()` retourne `false`.
+1. Nous configurons notre contrat ERC20 bouchonné pour qu'il retourne toujours un solde de 999 999 jetons.
+2. Vérifier si la méthode `contract.check()` retourne `false`.
-Nous sommes prêts à allumer la bête :
+Nous sommes prêts à lancer le test :

-Alors le test fonctionne, mais... il y a encore des choses à améliorer. La fonction `balanceOf()` retournera toujours 99999. Nous pouvons l'améliorer en spécifiant un portefeuille pour lequel la fonction devrait retourner quelque chose - tout comme un contrat réel :
+Le test fonctionne donc, mais... il y a encore une marge d'amélioration. La fonction `balanceOf()` retournera toujours 99999. Nous pouvons l'améliorer en spécifiant un portefeuille pour lequel la fonction doit retourner quelque chose, tout comme un vrai contrat :
```typescript
-it("returns false if the wallet has less than 1000001 tokens", async () => {
+it("retourne « faux » si le portefeuille a moins de 1 000 001 jetons", async () => {
await mockERC20.mock.balanceOf
.withArgs(wallet.address)
.returns(utils.parseEther("999999"))
@@ -236,10 +238,10 @@ it("returns false if the wallet has less than 1000001 tokens", async () => {
})
```
-Jusqu'à présent, nous avons testé seulement le cas où nous ne sommes pas assez riche. Essayons l'inverse:
+Jusqu'à présent, nous n'avons testé que le cas où nous ne sommes pas assez riches. Testons le cas contraire :
```typescript
-it("returns true if the wallet has at least 1000001 tokens", async () => {
+it("retourne « vrai » si le portefeuille a au moins 1 000 001 jetons", async () => {
await mockERC20.mock.balanceOf
.withArgs(wallet.address)
.returns(utils.parseEther("1000001"))
@@ -247,28 +249,28 @@ it("returns true if the wallet has at least 1000001 tokens", async () => {
})
```
-Vous exécutez les tests...
+Vous lancez les tests...

-Et voici où tu en es! Notre contrat semble fonctionner comme prévu :)
+... et voilà ! Notre contrat semble fonctionner comme prévu :)
## Test des appels de contrat {#testing-contract-calls}
-Résumons ce qui a été fait jusqu'à présent. Nous avons testé la fonctionnalité de notre contrat `AmIRichalready` et il semble qu'il fonctionne correctement. Cela signifie que nous avons terminé, n'est-ce pas? Pas exactement ! Waffle nous permet de tester encore plus notre contrat. Mais comment exactement ? Eh bien, dans l'arsenal de Waffle, il y a une correspondance entre `calledOnContract()` et `calledOnContractWith()`. Cela va nous permettre de vérifier si notre contrat a appelé le contrat fictif ERC20. Voici un test de base avec l'une de ces correspondance:
+Résumons ce que nous avons fait jusqu'à présent. Nous avons testé la fonctionnalité de notre contrat `AmIRichAlready` et il semble fonctionner correctement. Cela signifie que nous avons terminé, n'est-ce pas ? Pas tout à fait ! Waffle nous permet de tester notre contrat de manière encore plus approfondie. Mais comment exactement ? Eh bien, dans l'arsenal de Waffle, il y a les matchers `calledOnContract()` et `calledOnContractWith()`. Ils nous permettront de vérifier si notre contrat a bien appelé le contrat ERC20 bouchonné. Voici un test de base avec l'un de ces matchers :
```typescript
-it("checks if contract called balanceOf on the ERC20 token", async () => {
+it("vérifie si le contrat a appelé balanceOf sur le jeton ERC20", async () => {
await mockERC20.mock.balanceOf.returns(utils.parseEther("999999"))
await contract.check()
expect("balanceOf").to.be.calledOnContract(mockERC20)
})
```
-Nous pouvons aller encore plus loin et améliorer ce test avec l'autre matcher dont nous vous avons parlé:
+Nous pouvons aller encore plus loin et améliorer ce test avec l'autre matcher dont je vous ai parlé :
```typescript
-it("checks if contract called balanceOf with certain wallet on the ERC20 token", async () => {
+it("vérifie si le contrat a appelé balanceOf avec un certain portefeuille sur le jeton ERC20", async () => {
await mockERC20.mock.balanceOf
.withArgs(wallet.address)
.returns(utils.parseEther("999999"))
@@ -281,18 +283,18 @@ Vérifions si les tests sont corrects :

-Super, tous les tests sont verts.
+Super, tous les tests sont au vert.
-Tester des appels de contrats avec Waffle est super facile. Et voici la meilleure partie. Ces matchers fonctionnent à la fois avec des contrats normaux et fictifs ! C'est parce que Waffle enregistre et filtre les appels EVM plutôt que d'injecter du code, comme c'est le cas des bibliothèques de test populaires pour d'autres technologies.
+Tester les appels de contrat avec Waffle est super facile. Et voici le meilleur. Ces matchers fonctionnent aussi bien avec des contrats normaux qu'avec des contrats bouchonnés ! C'est parce que Waffle enregistre et filtre les appels EVM plutôt que d'injecter du code, comme c'est le cas des bibliothèques de test populaires pour d'autres technologies.
-## La fin {#the-finish-line}
+## La ligne d'arrivée {#the-finish-line}
-Félicitations ! Maintenant vous savez comment utiliser Waffle pour tester dynamiquement les appels de contrats et les contrats fictifs. Il y a beaucoup plus de fonctionnalités intéressantes à découvrir. Je recommande de plonger dans la documentation de Waffle.
+Félicitations ! Vous savez maintenant comment utiliser Waffle pour tester les appels de contrat et pour bouchonner dynamiquement les contrats. Il y a bien d'autres fonctionnalités intéressantes à découvrir. Je vous recommande de vous plonger dans la documentation de Waffle.
-La documentation Waffle est disponible [here](https://ethereum-waffle.readthedocs.io/).
+La documentation de Waffle est disponible [ici](https://ethereum-waffle.readthedocs.io/).
-Le code source de ce tutoriel est disponible [ici](https://github.com/EthWorks/Waffle/tree/master/examples/dynamic-mocking-and-testing-calls).
+Le code source de ce tutoriel se trouve [ici](https://github.com/EthWorks/Waffle/tree/master/examples/dynamic-mocking-and-testing-calls).
-Voici d'autres tutoriels qui pourraient vous intéresser :
+Tutoriels qui pourraient également vous intéresser :
- [Tester des contrats intelligents avec Waffle](/developers/tutorials/waffle-test-simple-smart-contract/)
diff --git a/public/content/translations/fr/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md b/public/content/translations/fr/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md
index b4715e9ca5e..dcfec2698a8 100644
--- a/public/content/translations/fr/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md
+++ b/public/content/translations/fr/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md
@@ -1,22 +1,24 @@
---
-title: 'Tutoriel pour "dire bonjour au monde" avec hardhat et ethers'
-description: Réalisez votre premier projet Waffle avec hardhat et ethers.js
+title: "Tutoriel Waffle « Hello world » avec Hardhat et Ethers"
+description: "Réalisez votre premier projet Waffle avec Hardhat et ethers.js"
author: "MiZiet"
tags:
- - "waffle"
- - "contrats intelligents"
- - "solidité"
- - "test"
- - "hardhat"
- - "ethers.js"
+ [
+ "waffle",
+ "contrats intelligents",
+ "solidité",
+ "test",
+ "hardhat",
+ "ethers.js"
+ ]
skill: beginner
lang: fr
published: 2020-10-16
---
-Dans ce tutoriel [Waffle](https://ethereum-waffle.readthedocs.io), nous apprendrons comment créer un simple contrat intelligent "Hello world", en utilisant [hardhat](https://hardhat.org/) et [ethers.js](https://docs.ethers.io/v5/). Ensuite nous apprendrons conmment ajouter une nouvelle fonctionnalité à notre contrat intelligent et comment la tester avec « Waffle ».
+Dans ce tutoriel [Waffle](https://ethereum-waffle.readthedocs.io), nous apprendrons à configurer un projet simple de contrat intelligent « Hello world », en utilisant [Hardhat](https://hardhat.org/) et [ethers.js](https://docs.ethers.io/v5/). Ensuite, nous apprendrons comment ajouter une nouvelle fonctionnalité à notre contrat intelligent et comment la tester avec Waffle.
-Commençons par créer un nouveau projet :
+Commençons par créer un nouveau projet :
```bash
yarn init
@@ -28,7 +30,7 @@ ou
npm init
```
-et l'installation des paquets nécessaires :
+et installez les paquets requis :
```bash
yarn add -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai
@@ -40,7 +42,7 @@ ou
npm install -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai
```
-L'étape suivante est la création d'un projet hardhat basique en exécutant `npx hardhat`.
+L'étape suivante consiste à créer un projet d'exemple Hardhat en exécutant `npx hardhat`.
```bash
888 888 888 888 888
@@ -52,9 +54,9 @@ L'étape suivante est la création d'un projet hardhat basique en exécutant `np
888 888 888 888 888 Y88b 888 888 888 888 888 Y88b.
888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888
-👷 Bienvenue dans Hardhat v2.0.3 👷
+👷 Welcome to Hardhat v2.0.3 👷
-? Que voulez vous faire ? …
+? What do you want to do? …
❯ Create a sample project
Create an empty hardhat.config.js
Quit
@@ -62,7 +64,7 @@ Quit
Sélectionnez `Create a sample project`
-Notre structure de projet devrait ressembler à ceci :
+La structure de notre projet devrait ressembler à ceci :
```
MyWaffleProject
@@ -73,15 +75,15 @@ MyWaffleProject
│ └── sample-script.js
├── test
│ └── sample-test.js
-├── .gitattributs
+├── .gitattributes
├── .gitignore
├── hardhat.config.js
└── package.json
```
-### Maintenant, parlons de certains de ces fichiers : {#now-lets-talk}
+### Parlons maintenant de certains de ces fichiers : {#now-lets-talk}
-- Greeter.sol - notre contrat intelligent écrit en solidity ;
+- Greeter.sol - notre contrat intelligent écrit en Solidity ;
```solidity
contract Greeter {
@@ -103,13 +105,13 @@ greeting = _greeting;
}
```
-Notre contrat intelligent peut être divisé en trois parties :
+Notre contrat intelligent peut être divisé en trois parties :
-1. constructeur - où nous déclarons une variable de type string appelée `greeting`,
-2. function greet - une fonction qui retournera la valeur `greeting` lorsqu'elle est appelée,
-3. function setGreeting - une fonction qui nous permet de changer la valeur `greeting`.
+1. constructeur - où nous déclarons une variable de type `string` appelée `greeting`,
+2. fonction `greet` - une fonction qui renverra la valeur `greeting` lorsqu'elle est appelée,
+3. fonction `setGreeting` - une fonction qui nous permet de modifier la valeur de `greeting`.
-- sample-test.js - notre fichier de tests
+- sample-test.js - notre fichier de tests
```js
describe("Greeter", function () {
@@ -126,34 +128,34 @@ describe("Greeter", function () {
})
```
-### La prochaîne étape consiste à compiler notre contrat et à exécuter nos tests : {#compiling-and-testing}
+### L'étape suivante consiste à compiler notre contrat et à exécuter les tests : {#compiling-and-testing}
-Les tests Waffle utilisent Mocha (un framework de test) avec Chai (une bibliothèque d'assertions). Tout ce que vous avez à faire est d'exécuter `npx hardhat test` et d'attendre que le message suivant apparaisse.
+Les tests Waffle utilisent Mocha (un framework de test) avec Chai (une bibliothèque d'assertions). Il vous suffit d'exécuter `npx hardhat test` et d'attendre que le message suivant s'affiche.
```bash
-✓ Doit renvoyer le nouveau message de bienvenue une fois qu'il a changé
+✓ Should return the new greeting once it's changed
```
-### Tout semble bien pour l'instant, ajoutons une certaine complexité à notre projet {#adding-complexity}
+### Tout semble parfait jusqu'à présent. Ajoutons un peu de complexité à notre projet {#adding-complexity}
-Imaginez une situation où quelqu'un ajoute une chaîne vide comme un salut. Ce ne serait pas un accueil chaleureux, n'est-ce pas ?
-Veillons à ce que cela ne se produise pas :
+Imaginez que quelqu'un ajoute une chaîne vide en guise de salut. Ce ne serait pas un salut très chaleureux, n'est-ce pas ?
+Assurons-nous que cela ne se produise pas :
-Nous voulons utiliser la version de solidity `revert` lorsque quelqu'un passe une chaîne vide. Une bonne chose est que nous pouvons facilement tester cette fonctionnalité avec la correspondance chai de Waffle `to.be.revertedWith()`.
+Nous voulons utiliser la fonction `revert` de Solidity lorsque quelqu'un transmet une chaîne de caractères vide. Heureusement, nous pouvons facilement tester cette fonctionnalité avec le matcher Chai de Waffle `to.be.revertedWith()`.
```js
it("Should revert when passing an empty string", async () => {
const Greeter = await ethers.getContractFactory("Greeter")
const greeter = await Greeter.deploy("Hello, world!")
- wait greeter.deployed()
+ await greeter.deployed()
await expect(greeter.setGreeting("")).to.be.revertedWith(
"Greeting should not be empty"
)
})
```
-Il semblerait que notre nouveau test n'ait pas réussi :
+Il semblerait que notre nouveau test n'ait pas réussi :
```bash
Deploying a Greeter with greeting: Hello, world!
@@ -168,13 +170,13 @@ Changing greeting from 'Hello, world!' to ''
1 failing
```
-Implémentons cette fonctionnalité dans notre contrat intelligent :
+Implémentons cette fonctionnalité dans notre contrat intelligent :
```solidity
require(bytes(_greeting).length > 0, "Greeting should not be empty");
```
-Maintenant, notre fonction setGreeting ressemble à ceci :
+Maintenant, notre fonction `setGreeting` ressemble à ceci :
```solidity
function setGreeting(string memory _greeting) public {
@@ -184,7 +186,7 @@ greeting = _greeting;
}
```
-Exécutons les tests à nouveau :
+Exécutons les tests à nouveau :
```bash
✓ Should return the new greeting once it's changed (1467ms)
@@ -197,6 +199,6 @@ Félicitations ! Vous y êtes arrivé :)
### Conclusion {#conclusion}
-Nous avons réalisé un projet simple avec Waffle, Hardhat et ethers.js. Nous avons appris comment mettre en place un projet, ajouter un test et implémenter de nouvelles fonctionnalités.
+Nous avons réalisé un projet simple avec Waffle, Hardhat et ethers.js. Nous avons appris à configurer un projet, à ajouter un test et à implémenter de nouvelles fonctionnalités.
-Pour plus d'excellents correspondants chai pour tester vos contrats intelligents, consultez la [documentation officielle de Waffle](https://ethereum-waffle.readthedocs.io/en/latest/matchers.html).
+Pour découvrir d'autres matchers Chai très utiles pour tester vos contrats intelligents, consultez la [documentation officielle de Waffle](https://ethereum-waffle.readthedocs.io/en/latest/matchers.html).
diff --git a/public/content/translations/fr/developers/tutorials/waffle-test-simple-smart-contract/index.md b/public/content/translations/fr/developers/tutorials/waffle-test-simple-smart-contract/index.md
index 13ee9082e20..ce2aa40f62a 100644
--- a/public/content/translations/fr/developers/tutorials/waffle-test-simple-smart-contract/index.md
+++ b/public/content/translations/fr/developers/tutorials/waffle-test-simple-smart-contract/index.md
@@ -1,12 +1,8 @@
---
-title: Test d'un contrat intelligent simple avec la bibliothèque Waffle
-description: Tutoriel pour débutants
+title: "Test d'un contrat intelligent simple avec la bibliothèque Waffle"
+description: "Tutoriel pour débutants"
author: Ewa Kowalska
-tags:
- - "contrats intelligents"
- - "solidity"
- - "Waffle"
- - "test"
+tags: [ "contrats intelligents", "solidité", "Waffle", "test" ]
skill: beginner
lang: fr
published: 2021-02-26
@@ -15,33 +11,34 @@ published: 2021-02-26
## Dans ce tutoriel, vous apprendrez à {#in-this-tutorial-youll-learn-how-to}
- Tester les modifications du solde du portefeuille
-- Tester l'émission d'événements avec les arguments spécifiés
-- Confirmer qu'une transaction a été annulée
+- Tester l'émission d'événements avec des arguments spécifiés
+- Affirmer qu'une transaction a été annulée
-## Hypothèses {#assumptions}
+## Prérequis {#assumptions}
- Vous pouvez créer un nouveau projet JavaScript ou TypeScript
-- Vous avez une expérience de base en matière de tests JavaScript
-- Vous avez utilisé des gestionnaires de paquets comme yarn ou npm
-- Vous possédez des connaissances de base en matière de contrats intelligents et de Solidity
+- Vous avez une certaine expérience de base des tests en JavaScript
+- Vous avez déjà utilisé des gestionnaires de paquets comme yarn ou npm
+- Vous possédez des connaissances très élémentaires sur les contrats intelligents et Solidity
-## Premiers pas {#getting-started}
+## Mise en route {#getting-started}
-Le tutoriel décrit l'installation et l'exécution du test en utilisant yarn, mais il n'y a pas de problème si vous préférez npm - je fournirai les références appropriées à la documentation officielle de Waffle.[](https://ethereum-waffle.readthedocs.io/en/latest/index.html)
+Le tutoriel présente la configuration et l'exécution du test à l'aide de yarn, mais il n'y a aucun problème si vous préférez utiliser npm. Je vous fournirai les références appropriées dans la [documentation](https://ethereum-waffle.readthedocs.io/en/latest/index.html) officielle de Waffle.
-### Installer les dépendances {#install-dependencies}
+## Installer les dépendances {#install-dependencies}
-[Ajoutez](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#installation) dépendances ethereum-waffle et typescript aux dépendances de développement de votre projet.
+[Ajoutez](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#installation) les dépendances ethereum-waffle et typescript aux dépendances de développement de votre projet.
```bash
yarn add --dev ethereum-waffle ts-node typescript @types/jest
```
-### Exemple de contrat intelligent {#example-smart-contract}
+## Exemple de contrat intelligent {#example-smart-contract}
-Au cours du tutoriel, nous allons travailler sur un exemple de contrat intelligent simple - EtherSplitter. Il ne fait pas grand-chose à part permettre à quelqu'un d'envoyer des wei et de les répartir équitablement entre deux destinataires prédéfinis. La fonction de séparation nécessite que le nombre de wei soit pair, sinon elle s'inverse. Pour les deux destinataires, il effectue un transfert de wei suivi de l'émission de l'événement Transfert.
+Pendant le tutoriel, nous travaillerons sur un exemple de contrat intelligent simple : EtherSplitter. Il ne fait pas grand-chose, à part permettre à n'importe qui d'envoyer des wei et de les répartir équitablement entre deux destinataires prédéfinis.
+La fonction de répartition exige que le nombre de wei soit pair, sinon la transaction sera annulée. Pour les deux destinataires, il effectue un transfert de wei suivi de l'émission de l'événement Transfert.
-Placez le fragment de code EtherSplitter dans `src/EtherSplitter.sol`.
+Placez l'extrait de code d'EtherSplitter dans `src/EtherSplitter.sol`.
```solidity
pragma solidity ^0.6.0;
@@ -58,7 +55,7 @@ contract EtherSplitter {
}
function split() public payable {
- require(msg.value % 2 == 0, 'Uneven wei amount not allowed');
+ require(msg.value % 2 == 0, 'Montant de wei impair non autorisé');
receiver1.transfer(msg.value / 2);
emit Transfer(msg.sender, receiver1, msg.value / 2);
receiver2.transfer(msg.value / 2);
@@ -67,7 +64,7 @@ contract EtherSplitter {
}
```
-### Compiler le contrat {#compile-the-contract}
+## Compiler le contrat {#compile-the-contract}
Pour [compiler](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#compiling-the-contract) le contrat, ajoutez l'entrée suivante au fichier package.json :
@@ -77,7 +74,7 @@ Pour [compiler](https://ethereum-waffle.readthedocs.io/en/latest/getting-started
}
```
-Ensuite, créez un fichier de configuration avec Waffle, dans le répertoire principal des projets, - `waffle.json` - puis collez-y la configuration suivante :
+Ensuite, créez le fichier de configuration Waffle dans le répertoire racine du projet, `waffle.json`, puis collez-y la configuration suivante :
```json
{
@@ -88,11 +85,11 @@ Ensuite, créez un fichier de configuration avec Waffle, dans le répertoire pri
}
```
-Exécutez `yarn build`. Cela fera apparaître le dossier `build` avec le contrat compilé EtherSplitter au format JSON.
+Exécutez `yarn build`. En conséquence, le répertoire `build` apparaîtra avec le contrat EtherSplitter compilé au format JSON.
-### Configuration du test {#test-setup}
+## Configuration du test {#test-setup}
-Tester avec Waffle nécessite d'utiliser des correspondances Chai et Mocha, vous devez donc [les ajouter](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#writing-tests) à votre projet. Lancez la mise à jour de votre paquet package.json, et ajoutez le `texte`d'entrée, dans la partie modèle:
+Les tests avec Waffle nécessitent l'utilisation des matchers Chai et de Mocha. Vous devez donc les [ajouter](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#writing-tests) à votre projet. Mettez à jour votre fichier package.json et ajoutez l'entrée `test` dans la partie scripts :
```json
"scripts": {
@@ -101,11 +98,12 @@ Tester avec Waffle nécessite d'utiliser des correspondances Chai et Mocha, vous
}
```
-Si vous voulez [faire](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#running-tests) vos propres tests, exécutez juste le `yarn test` .
+Si vous voulez [exécuter](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#running-tests) vos tests, il suffit de lancer `yarn test`.
-## Tests {#testing}
+## Tester {#testing}
-Maintenant, créez le dossier `test` et créez le nouveau fichier `test\EtherSplitter.test.ts`. Copiez le fragment ci-dessous et collez-le dans notre fichier de test.
+Créez maintenant le répertoire `test` et le nouveau fichier `test\EtherSplitter.test.ts`.
+Copiez l'extrait de code ci-dessous et collez-le dans notre fichier de test.
```ts
import { expect, use } from "chai"
@@ -126,17 +124,18 @@ describe("Ether Splitter", () => {
])
})
- // add the tests here
+ // ajoutez les tests ici
})
```
-Quelques mots avant de commencer. Le fournisseur de services, `MockProvider`, propose une version fictive de la blockchain. Il fournit également des portefeuilles fictifs, qui serviront de base pour tester le contrat intelligent EtherSplitter. Nous pouvons obtenir jusqu'à dix portefeuilles en appelant la méthode `getWallets()` sur le fournisseur. Dans l'exemple, nous avons trois portefeuilles - pour l'expéditeur et pour deux destinataires.
+Quelques mots avant de commencer.
+Le `MockProvider` propose une version simulée de la blockchain. Il fournit également des portefeuilles simulés qui nous serviront pour tester le contrat EtherSplitter. Nous pouvons obtenir jusqu'à dix portefeuilles en appelant la méthode `getWallets()` sur le fournisseur. Dans l'exemple, nous obtenons trois portefeuilles : un pour l'expéditeur et deux pour les destinataires.
-Ensuite, nous déclarons une variable appelée « splitter » - c'est notre contrat fictif EtherSpliter. Il est créé avant chaque exécution d'un test unique par la méthode `deployContract`. Cette méthode simule le déploiement d'un contrat à partir du portefeuille transmis en tant que premier paramètre (le portefeuille de l'expéditeur dans notre cas). Le deuxième paramètre est l'ABI et le bytecode du contrat testé - nous transmettons le fichier json du contrat EtherSplitter compilé à partir du répertoire `build`. Le troisième paramètre est un tableau contenant les arguments du constructeur du contrat qui, dans notre cas, sont les deux adresses des destinataires.
+Ensuite, nous déclarons une variable appelée « splitter ». C'est notre contrat EtherSplitter simulé. Il est créé avant chaque exécution d'un test unique par la méthode `deployContract`. Cette méthode simule le déploiement d'un contrat à partir du portefeuille passé comme premier paramètre (le portefeuille de l'expéditeur dans notre cas). Le deuxième paramètre est l'ABI et le bytecode du contrat testé. Nous y passons le fichier JSON du contrat EtherSplitter compilé à partir du répertoire `build`. Le troisième paramètre est un tableau avec les arguments du constructeur du contrat qui, dans notre cas, sont les deux adresses des destinataires.
-### changeBalances {#changebalances}
+## changeBalances {#changebalances}
-Tout d'abord, nous vérifierons si la méthode fractionnée modifie réellement les soldes des portefeuilles des destinataires. Si nous divisons 50 wei du compte des expéditeurs, nous nous attendons à ce que les soldes des deux destinataires augmentent de 25 wei. Nous utiliserons la correspondance `changeBalances` de Waffle:
+Tout d'abord, nous vérifierons si la méthode de répartition modifie réellement les soldes des portefeuilles des destinataires. Si nous divisons 50 wei du compte de l'expéditeur, nous nous attendons à ce que les soldes des deux destinataires augmentent de 25 wei. Nous utiliserons le matcher `changeBalances` de Waffle :
```ts
it("Changes accounts balances", async () => {
@@ -147,7 +146,8 @@ it("Changes accounts balances", async () => {
})
```
-Comme premier paramètre de la correspondance, nous transmettons un tableau de portefeuilles de destinataires, et comme deuxième, un tableau d'augmentations attendues sur les comptes correspondants. Si nous voulions vérifier le solde d'un portefeuille spécifique, nous pourrions également utiliser la correspondance `changeBalance` , qui ne nécessite pas de transmettre des tableaux, comme dans l'exemple ci-dessous:
+Comme premier paramètre du matcher, nous passons un tableau des portefeuilles des destinataires, et comme second, un tableau des augmentations attendues sur les comptes correspondants.
+Si nous voulions vérifier le solde d'un portefeuille spécifique, nous pourrions également utiliser le matcher `changeBalance`, qui ne nécessite pas de passer des tableaux, comme dans l'exemple ci-dessous :
```ts
it("Changes account balance", async () => {
@@ -158,42 +158,42 @@ it("Changes account balance", async () => {
})
```
-Notez que dans les deux cas de `changeBalance` et `changeBalances`, nous transmettons la fonction de séparation comme callback car le correspondant a besoin d'accéder à l'état des balances avant et après l'appel.
+Notez que dans les deux cas de `changeBalance` et `changeBalances`, nous passons la fonction de répartition en tant que rappel, car le matcher doit accéder à l'état des soldes avant et après l'appel.
-Nous allons ensuite déterminer si l'événement Transfert a été émis après chaque transfert de wei. Nous allons passer à une autre correspondance de Waffle :
+Ensuite, nous allons tester si l'événement Transfer a été émis après chaque transfert de wei. Nous allons nous tourner vers un autre matcher de Waffle :
-### Emit {#emit}
+## Émission {#emit}
```ts
-it("Emits event on the transfer to the first receiver", async () => {
+it("Émet un événement lors du transfert vers le premier destinataire", async () => {
await expect(splitter.split({ value: 50 }))
.to.emit(splitter, "Transfer")
.withArgs(sender.address, receiver1.address, 25)
})
-it("Emits event on the transfer to the second receiver", async () => {
+it("Émet un événement lors du transfert vers le second destinataire", async () => {
await expect(splitter.split({ value: 50 }))
.to.emit(splitter, "Transfer")
.withArgs(sender.address, receiver2.address, 25)
})
```
-La correspondance `emit` nous permet de vérifier si un contrat a émis un événement en appelant une méthode. En tant que paramètres pour la corrrespondance `emit`, nous fournissons le contrat fictif que nous prévoyons pour émettre l'événement, ainsi que le nom de cet événement. Dans notre cas, le contrat fictif est `splitter` et le nom de l'événement `Transfer`. Nous pouvons également vérifier les valeurs précises des arguments avec lesquels l'événement a été émis - nous transmettons autant d'arguments au `withArgs` correspondant, comme le prévoit notre déclaration d'événement. Dans le cas du contrat EtherSpliter, nous passons les adresses de l'expéditeur et du destinataire avec le montant en wei transféré.
+Le matcher `emit` nous permet de vérifier si un contrat a émis un événement en appelant une méthode. En tant que paramètres du matcher `emit`, nous fournissons le contrat simulé qui, selon nos prévisions, émettra l'événement, ainsi que le nom de cet événement. Dans notre cas, le contrat simulé est `splitter` et le nom de l'événement est `Transfer`. Nous pouvons également vérifier les valeurs précises des arguments avec lesquels l'événement a été émis. Nous passons autant d'arguments au matcher `withArgs` que notre déclaration d'événement en attend. Dans le cas du contrat EtherSplitter, nous passons les adresses de l'expéditeur et du destinataire ainsi que le montant en wei transféré.
-### revertedWith {#revertedwith}
+## revertedWith {#revertedwith}
-Comme dernier exemple, nous allons vérifier si la transaction a été annulée en cas de nombre impair de wei. Nous allons utiliser la correspondance `revertedWith` :
+Comme dernier exemple, nous vérifierons si la transaction a été annulée en cas de nombre impair de wei. Nous utiliserons le matcher `revertedWith` :
```ts
it("Reverts when Vei amount uneven", async () => {
await expect(splitter.split({ value: 51 })).to.be.revertedWith(
- "Uneven wei amount not allowed"
+ "Montant de wei impair non autorisé"
)
})
```
-Le test, s'il est accepté, nous assurera que la transaction a bien été annulée. Cependant, il doit également y avoir une correspondance exacte entre les messages que nous avons passés dans la déclaration `require` et le message attendu dans `revertedWith`. Si nous revenons au code du contrat EtherSpliter, dans la déclaration `require` pour le montant wei, nous fournissons le message: "Uneven wei amount not allowed". Cela correspond au message que nous attendons dans notre test. Si elles n'étaient pas égales, le test échouerait.
+Le test, s'il est concluant, nous assurera que la transaction a bien été annulée. Cependant, il doit également y avoir une correspondance exacte entre les messages que nous avons passés dans l'instruction `require` et le message que nous attendons dans `revertedWith`. Si nous retournons au code du contrat EtherSplitter, dans l'instruction `require` pour le montant en wei, nous fournissons le message : « Montant de wei impair non autorisé ». Cela correspond au message que nous attendons dans notre test. S'ils n'étaient pas égaux, le test échouerait.
## Félicitations ! {#congratulations}
-Vous avez fait votre premier (grand) pas vers les tests des contrats intelligents avec Waffle !
+Vous avez fait votre premier grand pas vers le test de contrats intelligents avec Waffle !
diff --git a/public/content/translations/fr/developers/tutorials/yellow-paper-evm/index.md b/public/content/translations/fr/developers/tutorials/yellow-paper-evm/index.md
index 1192e571e0c..96bc096210e 100644
--- a/public/content/translations/fr/developers/tutorials/yellow-paper-evm/index.md
+++ b/public/content/translations/fr/developers/tutorials/yellow-paper-evm/index.md
@@ -1,207 +1,220 @@
---
-title: Comprendre le livre Jaune des spécifications d'EVM
-description: Comprendre la partie du Livre Jaune, les spécifications formelles pour Ethereum, qui explique la machine virtuelle Ethereum (EVM).
+title: "Comprendre les spécifications de l'EVM du Livre jaune"
+description: "Comprendre la partie du Livre jaune, les spécifications formelles pour Ethereum, qui explique la machine virtuelle Ethereum (EVM)."
author: "qbzzt"
-tags:
- - "evm"
+tags: [ "evm" ]
skill: intermediate
lang: fr
published: 2022-05-15
---
-[Le Livre Jaune](https://ethereum.github.io/yellowpaper/paper.pdf) est la spécification formelle d'Ethereum. Sauf là où il a été modifié par [le processus d'EIP](/eips/), il contient la description exacte du fonctionnement de tout. Il est rédigé sous forme de document mathématique, qui inclut une terminologie que les programmeurs pourraient ne pas connaître. Dans ce document, vous apprendrez comment le lire, et par extension, d'autres documents mathématiques liés.
+[Le Livre jaune](https://ethereum.github.io/yellowpaper/paper.pdf) est la spécification formelle pour Ethereum. Sauf là où il a été modifié par [le processus EIP](/eips/), il contient la description exacte du fonctionnement de tout. Il est rédigé sous forme de document mathématique, qui inclut une terminologie que les programmeurs pourraient ne pas connaître. Dans ce document, vous apprendrez comment le lire et, par extension, d'autres documents mathématiques connexes.
-## Quel Livre Jaune ? {#which-yellow-paper}
+## Quel Livre jaune ? {#which-yellow-paper}
-Comme presque tout le reste dans Ethereum, le Livre Jaune évolue avec le temps. Afin de pouvoir se référer à une version spécifique, j'ai [téléchargé la version actuelle au moment de la rédaction](yellow-paper-berlin.pdf). Les numéros de section, de page et d'équation que j'utilise se référeront à cette version. Il est recommandé de l'avoir ouvert dans une autre fenêtre pendant la lecture de ce document.
+Comme presque tout le reste dans Ethereum, le Livre jaune évolue avec le temps. Afin de pouvoir se référer à une version spécifique, j'ai téléversé [la version actuelle au moment de la rédaction](yellow-paper-berlin.pdf). Les numéros de section, de page et d'équation que j'utilise se référeront à cette version. Il est recommandé de l'avoir ouvert dans une autre fenêtre pendant la lecture de ce document.
### Pourquoi l'EVM ? {#why-the-evm}
-Le livre jaune original a été rédigé dès le début du développement d'Ethereum. Il décrit le mécanisme de consensus original basé sur la preuve de travail qui était initialement utilisé pour sécuriser le réseau. Cependant, Ethereum a abandonné la preuve de travail et a commencé à utiliser un consensus basé sur la preuve d'enjeu en septembre 2022. Ce tutoriel se concentrera sur les parties du livre jaune définissant la Machine Virtuelle Ethereum. L'EVM n'a pas été modifié par la transition vers la preuve d'enjeu (à l'exception de la valeur de réponse de l'opcode DIFFICULTY).
+Le Livre jaune original a été rédigé au tout début du développement d'Ethereum. Il décrit le mécanisme de consensus original basé sur la preuve de travail qui était initialement utilisé pour sécuriser le réseau. Cependant, Ethereum a abandonné la preuve de travail et a commencé à utiliser un consensus basé sur la preuve d'enjeu en septembre 2022. Ce tutoriel se concentrera sur les parties du Livre jaune qui définissent la machine virtuelle Ethereum. L'EVM est resté inchangé suite à la transition vers la preuve d'enjeu (à l'exception de la valeur de retour de l'opcode DIFFICULTY).
## 9 Modèle d'exécution {#9-execution-model}
-Cette section (p. 12-14) comprend la majeure partie de la définition de l'EVM.
+Cette section (p. 12-14) inclut la majeure partie de la définition de l'EVM.
-Le terme _état du système_ comprend tout ce que vous devez savoir sur le système pour le faire fonctionner. Dans un ordinateur classique, cela signifie la mémoire, le contenu des registres, etc.
+Le terme _état du système_ inclut tout ce que vous devez savoir sur le système pour le faire fonctionner. Dans un ordinateur typique, cela signifie la mémoire, le contenu des registres, etc.
-Une [machine de Turing](https://en.wikipedia.org/wiki/Turing_machine) est un modèle de calcul. En substance, c'est une version simplifiée d'un ordinateur, qui s’est avéré avoir la même capacité d'exécuter des calculs qu'un ordinateur normal (tout ce qu'un ordinateur peut calculer, une machine de Turing peut le calculer et vice versa). Ce modèle facilite la preuve de divers théorèmes sur ce qui est et n'est pas calculable.
+Une [machine de Turing](https://en.wikipedia.org/wiki/Turing_machine) est un modèle de calcul. Il s'agit essentiellement d'une version simplifiée d'un ordinateur, dont il est prouvé qu'elle a la même capacité à effectuer des calculs qu'un ordinateur normal (tout ce qu'un ordinateur peut calculer, une machine de Turing peut le calculer et vice-versa). Ce modèle facilite la preuve de divers théorèmes sur ce qui est et ce qui n'est pas calculable.
-Le terme [Turing-complet](https://en.wikipedia.org/wiki/Turing_completeness) désigne un ordinateur qui peut exécuter les mêmes calculs qu'une machine de Turing. Les machines de Turing peuvent entrer dans des boucles infinies, et l'EVM ne le peut pas car elle manquerait de gaz, elle est donc seulement quasi-Turing-complète.
+Le terme [Turing-complet](https://en.wikipedia.org/wiki/Turing_completeness) désigne un ordinateur qui peut effectuer les mêmes calculs qu'une machine de Turing. Les machines de Turing peuvent entrer dans des boucles infinies, ce que l'EVM ne peut pas faire, car il serait à court de gaz. Il est donc seulement quasi-Turing-complet.
-## 9.1 Les bases {#91-basics}
+## 9.1 Notions de base {#91-basics}
-Cette section présente les bases de l'EVM et comment il se compare à d'autres modèles computationnels.
+Cette section présente les bases de l'EVM et sa comparaison avec d'autres modèles de calcul.
-Une [machine pile](https://en.wikipedia.org/wiki/Stack_machine) est un ordinateur qui stocke les données intermédiaires non pas dans des registres, mais dans une [**pile**](https://en.wikipedia.org/wiki/Stack_(abstract_data_type)). C'est l'architecture privilégiée pour les machines virtuelles car elle est facile à mettre en œuvre, ce qui signifie que les bugs et les vulnérabilités de sécurité sont beaucoup moins probables. La mémoire dans la pile est divisée en mots de 256 bits. Ce choix a été fait car il est pratique pour les opérations cryptographiques centrales d'Ethereum telles que le hachage Keccak-256 et les calculs de courbes elliptiques. La taille maximale de la pile est de 1024 octets. Lorsque les opcodes sont exécutés, ils prennent généralement leurs paramètres depuis la pile. Il existe des opcodes spécifiquement pour réorganiser les éléments dans la pile, tels que `POP` (retire l'élément du haut de la pile), `DUP_N` (duplique le N-ième élément dans la pile), etc.
+Une [machine à pile](https://en.wikipedia.org/wiki/Stack_machine) est un ordinateur qui stocke des données intermédiaires non pas dans des registres, mais dans une [**pile**](https://en.wikipedia.org/wiki/Stack_\(abstract_data_type\)). C'est l'architecture privilégiée pour les machines virtuelles, car elle est facile à mettre en œuvre, ce qui signifie que les bogues et les vulnérabilités de sécurité sont beaucoup moins probables. La mémoire de la pile est divisée en mots de 256 bits. Ce choix a été fait, car il est pratique pour les opérations cryptographiques de base d'Ethereum telles que le hachage Keccak-256 et les calculs sur les courbes elliptiques. La taille maximale de la pile est de 1024 éléments (1024 x 256 bits). Lorsque des opcodes sont exécutés, ils obtiennent généralement leurs paramètres depuis la pile. Il existe des opcodes spécifiques pour réorganiser les éléments dans la pile tels que `POP` (retire un élément du sommet de la pile), `DUP_N` (duplique le Nième élément de la pile), etc.
-L'EVM possède également un espace volatile appelé **mémoire**, qui est utilisé pour stocker des données pendant l'exécution. Cette mémoire est organisée en mots de 32 octets. Tous les emplacements mémoire sont initialisés à zéro. Si vous exécutez ce code [Yul](https://docs.soliditylang.org/en/latest/yul.html) pour ajouter un mot à la mémoire, il remplira 32 octets de mémoire en remplissant l'espace vide du mot avec des zéros, c'est-à-dire qu'il crée un mot - avec des zéros aux emplacements 0-29, 0x60 à 30, et 0xA7 à 31.
+L'EVM dispose également d'un espace volatile appelé **mémoire** qui est utilisé pour stocker des données pendant l'exécution. Cette mémoire est organisée en mots de 32 octets. Tous les emplacements mémoire sont initialisés à zéro. Si vous exécutez ce code [Yul](https://docs.soliditylang.org/en/latest/yul.html) pour ajouter un mot à la mémoire, il remplira 32 octets de mémoire en complétant l'espace vide du mot avec des zéros, c'est-à-dire qu'il crée un mot avec des zéros aux emplacements 0-29, 0x60 à l'emplacement 30 et 0xA7 à l'emplacement 31.
```yul
mstore(0, 0x60A7)
```
-`mstore` est l'un des trois opcodes que l'EVM fournit pour interagir avec la mémoire - il charge un mot en mémoire. Les deux autres sont `mstore8`, qui charge un seul octet en mémoire, et `mload`, qui déplace un mot de la mémoire à la pile.
+`mstore` est l'un des trois opcodes que l'EVM fournit pour interagir avec la mémoire. Il charge un mot en mémoire. Les deux autres sont `mstore8` qui charge un seul octet en mémoire, et `mload` qui déplace un mot de la mémoire vers la pile.
-L'EVM a également un modèle de **stockage** non volatile séparé qui est maintenu dans le système - cette mémoire est organisée en tableaux de mots (par opposition aux tableaux d'octets adressables par mots dans la pile). Ce stockage est l'endroit où les contrats conservent des données persistantes - un contrat ne peut interagir qu'avec son propre stockage. Le stockage est organisé en mappages clé-valeur.
+L'EVM dispose également d'un modèle de **stockage** non volatile distinct qui est maintenu dans le cadre de l'état du système. Cette mémoire est organisée en tableaux de mots (par opposition aux tableaux d'octets adressables par mot dans la pile). Ce stockage est l'endroit où les contrats conservent les données persistantes. Un contrat ne peut interagir qu'avec son propre stockage. Le stockage est organisé en correspondances clé-valeur.
-Bien qu'il ne soit pas mentionné dans cette section du Livre Jaune, il est également utile de savoir qu'il existe un quatrième type de mémoire. **Calldata** est une mémoire en lecture seule adressable par octets utilisée pour stocker la valeur passée avec le paramètre de `données` d'une transaction. L'EVM dispose d'opcodes spécifiques pour gérer `calldata`. `calldatasize` renvoie la taille des données. `calldataload` charge les données dans la pile. `calldatacopy` copie les données en mémoire.
+Bien que cela ne soit pas mentionné dans cette section du Livre jaune, il est également utile de savoir qu'il existe un quatrième type de mémoire. **Calldata** est une mémoire en lecture seule adressable par octets, utilisée pour stocker la valeur transmise avec le paramètre `data` d'une transaction. L'EVM a des opcodes spécifiques pour la gestion des `calldata`. `calldatasize` renvoie la taille des données. `calldataload` charge les données dans la pile. `calldatacopy` copie les données en mémoire.
-L'architecture standard [Von Neumann](https://en.wikipedia.org/wiki/Von_Neumann_architecture) stocke le code et les données dans la même mémoire. L'EVM ne suit pas cette norme pour des raisons de sécurité - le partage de mémoire volatile rend possible la modification du code programme. Au lieu de cela, le code est sauvegardé dans le stockage.
+L'[architecture Von Neumann](https://en.wikipedia.org/wiki/Von_Neumann_architecture) standard stocke le code et les données dans la même mémoire. L'EVM ne suit pas cette norme pour des raisons de sécurité. Le partage de la mémoire volatile permet de modifier le code du programme. Au lieu de cela, le code est enregistré dans le stockage.
-Il n'y a que deux cas où le code est exécuté à partir de la mémoire :
+Il n'y a que deux cas dans lesquels le code est exécuté à partir de la mémoire :
-- Lorsqu'un contrat crée un autre contrat (en utilisant [`CREATE`](https://www.evm.codes/#f0) ou [`CREATE2`](https://www.evm.codes/#f5)), le code pour le constructeur de contrat provient de la mémoire.
-- Lors de la création d'un contrat, le code du constructeur s'exécute puis renvoie avec le code du contrat réel, également à partir de la mémoire.
+- Lorsqu'un contrat crée un autre contrat (à l'aide de [`CREATE`](https://www.evm.codes/#f0) ou [`CREATE2`](https://www.evm.codes/#f5)), le code du constructeur de contrat provient de la mémoire.
+- Lors de la création de _n'importe quel_ contrat, le code du constructeur s'exécute, puis renvoie le code du contrat réel, également depuis la mémoire.
-Le terme exécution exceptionnelle signifie une exception qui provoque l'arrêt de l'exécution du contrat en cours.
+L'expression « exécution exceptionnelle » désigne une exception qui provoque l'arrêt de l'exécution du contrat en cours.
## 9.2 Aperçu des frais {#92-fees-overview}
-Cette section explique comment les frais de gaz sont calculés. Il y a trois coûts :
+Cette section explique comment les frais de gaz sont calculés. Il existe trois coûts :
-### Coût des opcodes {#opcode-cost}
+### Coût de l'opcode {#opcode-cost}
-Le coût inhérent à l'opcode spécifique. Pour obtenir cette valeur, trouvez le coût de l'opcode dans l'Annexe H (p. 28, sous l'équation (327)), et trouvez le coût dans l'équation (324). Cela vous donne une fonction de coût, qui dans la plupart des cas utilise des paramètres de l'Annexe G (p. 27).
+Le coût inhérent de l'opcode spécifique. Pour obtenir cette valeur, trouvez le groupe de coût de l'opcode dans l'annexe H (p. 28, sous l'équation (327)), puis trouvez le groupe de coût dans l'équation (324). Cela vous donne une fonction de coût qui, dans la plupart des cas, utilise les paramètres de l'annexe G (p. 27).
-Par exemple, l'opcode [`CALLDATACOPY`](https://www.evm.codes/#37) fait partie du groupe _Wcopy _. Le coût de l'opcode pour ce groupe est _Gverylow +Gcopy ×⌈μs [2]÷32⌉_. En regardant l'Annexe G, nous voyons que les deux constantes sont 3, ce qui nous donne _3+3×⌈μs [2]÷32⌉_.
+Par exemple, l'opcode [`CALLDATACOPY`](https://www.evm.codes/#37) est un membre du groupe _Wcopy _. Le coût de l'opcode pour ce groupe est _Gverylow +Gcopy ×⌈μs [2]÷32⌉_. En regardant l'annexe G, nous voyons que les deux constantes sont 3, ce qui nous donne _3+3×⌈μs [2]÷32⌉_.
-Nous devons encore décrypter l'expression _⌈μs [2]÷32⌉_. La partie la plus externe, _⌈ \ ⌉_, est la fonction plafond, une fonction qui, étant donnée une valeur, retourne le plus petit entier qui n'est pas inférieur à cette valeur. Par exemple, _⌈2.5⌉ = ⌈3⌉ = 3_. La partie interne est _μs [2]÷32_. En consultant la section 3 (Conventions) à la p. 3, _μ_ représente l'état de la machine. L'état de la machine est défini dans la section 9.4.1 à la p. 13. Selon cette section, l'un des paramètres de l'état de la machine est _s_ pour la pile. En regroupant tout cela, il semble que _μs [2]_ soit l'emplacement n°2 dans la pile. En examinant [l'opcode](https://www.evm.codes/#37), l'emplacement n°2 dans la pile est la taille des données en octets. En regardant les autres opcodes du groupe Wcopy , comme [`CODECOPY`](https://www.evm.codes/#39) et [`RETURNDATACOPY`](https://www.evm.codes/#3e), ils ont également une taille de données au même endroit. Ainsi, _⌈μs [2]÷32⌉_ représente le nombre de mots de 32 octets nécessaires pour stocker les données copiées. En résumé, le coût inhérent de [`CALLDATACOPY`](https://www.evm.codes/#37) est de 3 gas plus 3 par mot de données copiées.
+Nous devons encore déchiffrer l'expression _⌈μs [2]÷32⌉_. La partie la plus externe, _⌈ \ ⌉_, est la fonction plafond, une fonction qui, pour une valeur donnée, renvoie le plus petit entier qui n'est pas inférieur à la valeur. Par exemple, _⌈2.5⌉ = ⌈3⌉ = 3_. La partie intérieure est _μs [2]÷32_. En regardant la section 3 (Conventions) à la p. 3, _μ_ est l'état de la machine. L'état de la machine est défini dans la section 9.4.1 à la p. 13. Selon cette section, l'un des paramètres d'état de la machine est _s_ pour la pile. En rassemblant tous ces éléments, il semble que _μs [2]_ soit l'emplacement n°2 dans la pile. En regardant [l'opcode](https://www.evm.codes/#37), l'emplacement n°2 de la pile correspond à la taille des données en octets. Si l'on regarde les autres opcodes du groupe Wcopy , [`CODECOPY`](https://www.evm.codes/#39) et [`RETURNDATACOPY`](https://www.evm.codes/#3e), ils ont aussi une taille de données au même emplacement. Donc _⌈μs [2]÷32⌉_ est le nombre de mots de 32 octets nécessaires pour stocker les données en cours de copie. En résumé, le coût inhérent de [`CALLDATACOPY`](https://www.evm.codes/#37) est de 3 gaz plus 3 par mot de données copié.
### Coût d'exécution {#running-cost}
-Il s'agit du coût d'exécution du code que nous appelons.
+Le coût d'exécution du code que nous appelons.
-- Dans le cas de [`CREATE`](https://www.evm.codes/#f0) et [`CREATE2`](https://www.evm.codes/#f5), il s'agit du constructeur du nouveau contrat.
-- Dans le cas de [`CALL`](https://www.evm.codes/#f1), [`CALLCODE`](https://www.evm.codes/#f2), [`STATICCALL`](https://www.evm.codes/#fa), ou [`DELEGATECALL`](https://www.evm.codes/#f4), il s'agit du contrat que nous appelons.
+- Dans le cas de [`CREATE`](https://www.evm.codes/#f0) et [`CREATE2`](https://www.evm.codes/#f5), le constructeur pour le nouveau contrat.
+- Dans le cas de [`CALL`](https://www.evm.codes/#f1), [`CALLCODE`](https://www.evm.codes/#f2), [`STATICCALL`](https://www.evm.codes/#fa) ou [`DELEGATECALL`](https://www.evm.codes/#f4), le contrat que nous appelons.
### Coût d'expansion de la mémoire {#expanding-memory-cost}
-Il s'agit du coût de l'expansion de la mémoire (si nécessaire).
+Le coût de l'expansion de la mémoire (si nécessaire).
-Dans l'équation 324, cette valeur est notée _Cmem (μi ')-Cmem (μi )_. En consultant à nouveau la section 9.4.1, nous voyons que _μi _ représente le nombre de mots en mémoire. Ainsi, _μi _ est le nombre de mots en mémoire avant le opcode et _μi '_ est le nombre de mots en mémoire après l'opcode.
+Dans l'équation 324, cette valeur est écrite comme suit : _Cmem (μi ')-Cmem (μi )_. En examinant à nouveau la section 9.4.1, nous voyons que _μi _ est le nombre de mots en mémoire. Ainsi, _μi _ est le nombre de mots en mémoire avant l'opcode et _μi '_ est le nombre de mots en mémoire après l'opcode.
-La fonction _Cmem _ est définie dans l'équation 326 : _Cmem (a) = Gmemory × a + ⌊a2 ÷ 512⌋_. _⌊x⌋_ est la fonction plancher, une fonction qui, étant donné une valeur, retourne le plus grand entier qui n'est toujours pas supérieur à cette valeur. Par exemple, _⌊2.5⌋ = ⌊2⌋ = 2_. Lorsque _a < √512_, _a2 < 512_, et le résultat de la fonction plancher est zéro. Ainsi, pour les 22 premiers mots (704 octets), le coût augmente linéairement avec le nombre de mots mémoire requis. Au-delà de ce point, _⌊a2 ÷ 512⌋_ est positif. Lorsque la mémoire requise est suffisamment élevée, le coût en gas est proportionnel au carré de la quantité de mémoire.
+La fonction _Cmem _ est définie dans l'équation 326 : _Cmem (a) = Gmemory × a + ⌊a2 ÷ 512⌋_. _⌊x⌋_ est la fonction plancher, une fonction qui, pour une valeur donnée, renvoie le plus grand entier qui n'est pas supérieur à la valeur. Par exemple, _⌊2.5⌋ = ⌊2⌋ = 2._ Lorsque _a < √512_, _a2 < 512_, et le résultat de la fonction plancher est zéro. Ainsi, pour les 22 premiers mots (704 octets), le coût augmente de façon linéaire avec le nombre de mots de mémoire requis. Au-delà de ce point, _⌊a2 ÷ 512⌋_ est positif. Lorsque la mémoire requise est suffisamment élevée, le coût en gaz est proportionnel au carré de la quantité de mémoire.
-**Note** : ces facteurs n'influencent que le coût en gas _inhérent_ - cela ne prend pas en compte le marché des frais ou les pourboires aux validateurs qui déterminent combien un utilisateur final doit payer - il s'agit simplement du coût brut d'exécution d'une opération particulière sur l'EVM.
+**Remarque** : ces facteurs n'influencent que le coût en gaz _inhérent_. Ils ne tiennent pas compte du marché des frais ni des pourboires versés aux validateurs qui déterminent le montant qu'un utilisateur final doit payer. Il s'agit simplement du coût brut de l'exécution d'une opération particulière sur l'EVM.
-[Plus d'information sur le gaz](/developers/docs/gas/).
+[En savoir plus sur le gaz](/developers/docs/gas/).
## 9.3 Environnement d'exécution {#93-execution-env}
-L'environnement d'exécution est un tuple, _I_, qui inclut des informations qui ne font pas partie de l'état de la blockchain ou de l'EVM.
-
-| Paramètre | Opcode pour accéder aux données | Code Solidity pour accéder aux données |
-| --------------- | ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------- |
-| _Ia _ | [`ADDRESS`](https://www.evm.codes/#30) | `address(this)` |
-| _Io _ | [`ORIGIN`](https://www.evm.codes/#32) | `tx.origin` |
-| _Ip _ | [`GASPRICE`](https://www.evm.codes/#3a) | `tx.gasprice` |
-| _Id _ | [`CALLDATALOAD`](https://www.evm.codes/#35), etc. | `msg.data` |
-| _Is _ | [`CALLER`](https://www.evm.codes/#33) | `msg.sender` |
-| _Iv _ | [`CALLVALUE`](https://www.evm.codes/#34) | `msg.value` |
-| _Ib _ | [`CODECOPY`](https://www.evm.codes/#39) | `address(this).code` |
-| _IH _ | Champs de l'en-tête de bloc, tels que [`NUMBER`](https://www.evm.codes/#43) et [`DIFFICULTY`](https://www.evm.codes/#44) | `block.number`, `block.difficulty`, etc. |
-| _Ie _ | Profondeur de la pile d'appels pour les appels entre contrats (y compris la création de contrat) | |
-| _Iw _ | L'EVM est-il autorisé à modifier l'état ou s'exécute-t-il de manière statique | |
-
-Quelques autres paramètres sont nécessaires pour comprendre le reste de la section 9 :
-
-| Paramètre | Défini dans la section | Signification |
-| --------- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| _σ_ | 2 (p. 2, équation 1) | L'état de la blockchain |
-| _g_ | 9.3 (p. 13) | Gaz restant |
-| _A_ | 6.1 (p. 8) | Sous-état accumulé (modifications prévues pour la fin de la transaction) |
-| _o_ | 9.3 (p. 13) | Sortie - le résultat retourné dans le cas d'une transaction interne (quand un contrat en appelle un autre) et des appels à des fonctions d'affichage (quand on demande simplement des informations, il n'est donc pas nécessaire d'attendre une transaction) |
+L'environnement d'exécution est un uplet, _I_, qui inclut des informations ne faisant pas partie de l'état de la blockchain ou de l'EVM.
+
+| Paramètre | Opcode pour accéder aux données | Code Solidity pour accéder aux données |
+| --------------- | --------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- |
+| _Ia _ | [`ADDRESS`](https://www.evm.codes/#30) | `address(this)` |
+| _Io _ | [`ORIGIN`](https://www.evm.codes/#32) | `tx.origin` |
+| _Ip _ | [`GASPRICE`](https://www.evm.codes/#3a) | `tx.gasprice` |
+| _Id _ | [`CALLDATALOAD`](https://www.evm.codes/#35), etc. | `msg.data` |
+| _Is _ | [`CALLER`](https://www.evm.codes/#33) | `msg.sender` |
+| _Iv _ | [`CALLVALUE`](https://www.evm.codes/#34) | `msg.value` |
+| _Ib _ | [`CODECOPY`](https://www.evm.codes/#39) | `address(this).code` |
+| _IH _ | Champs d'en-tête de bloc, tels que [`NUMBER`](https://www.evm.codes/#43) et [`DIFFICULTY`](https://www.evm.codes/#44) | `block.number`, `block.difficulty`, etc. |
+| _Ie _ | Profondeur de la pile d'appels pour les appels entre contrats (y compris la création de contrat) | |
+| _Iw _ | L'EVM est-il autorisé à modifier l'état, ou s'exécute-t-il de manière statique | |
+
+Quelques autres paramètres sont nécessaires pour comprendre le reste de la section 9 :
+
+| Paramètre | Défini dans la section | Signification |
+| --------- | -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| _σ_ | 2 (p. 2, équation 1) | L'état de la blockchain |
+| _g_ | 9.3 (p. 13) | Gaz restant |
+| _A_ | 6.1 (p. 8) | Sous-état accumulé (changements prévus pour la fin de la transaction) |
+| _o_ | 9.3 (p. 13) | Sortie - le résultat retourné dans le cas d'une transaction interne (lorsqu'un contrat en appelle un autre) et des appels aux fonctions de vue (lorsque vous demandez simplement des informations, il n'est donc pas nécessaire d'attendre une transaction) |
## 9.4 Aperçu de l'exécution {#94-execution-overview}
-Maintenant que nous avons tous les préliminaires, nous pouvons enfin commencer à travailler sur le fonctionnement de l'EVM.
+Maintenant que nous avons tous les préliminaires, nous pouvons enfin commencer à étudier le fonctionnement de l'EVM.
-Les équations 137-142 nous donnent les conditions initiales pour faire fonctionner l'EVM :
+Les équations 137-142 nous donnent les conditions initiales pour l'exécution de l'EVM :
-| Symbole | Valeur initiale | Signification |
-| ---------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| _μg _ | _g_ | Gaz restant |
-| _μpc _ | _0_ | Compteur de programme, l'adresse de la prochaine instruction à exécuter |
-| _μm _ | _(0, 0, ...)_ | Mémoire, initialisée à zéro |
-| _μi _ | _0_ | Emplacement mémoire le plus élevé utilisé |
-| _μs _ | _()_ | La pile, initialement vide |
-| _μo _ | _∅_ | La sortie, un ensemble vide jusqu'à ce que nous nous arrêtions soit avec des données de retour ([`RETURN`](https://www.evm.codes/#f3) ou [`REVERT`](https://www.evm.codes/#fd)) soit sans elle ([`STOP`](https://www.evm.codes/#00) ou [`SELFDESTRUCT`](https://www.evm.codes/#ff)). |
+| Symbole | Valeur initiale | Signification |
+| ---------------- | -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| _μg _ | _g_ | Gaz restant |
+| _μpc _ | _0_ | Compteur de programme, l'adresse de la prochaine instruction à exécuter |
+| _μm _ | _(0, 0, ...)_ | Mémoire, initialisée à zéro |
+| _μi _ | _0_ | Emplacement mémoire le plus élevé utilisé |
+| _μs _ | _()_ | La pile, initialement vide |
+| _μo _ | _∅_ | La sortie, un ensemble vide jusqu'à ce que nous nous arrêtions avec des données de retour ([`RETURN`](https://www.evm.codes/#f3) ou [`REVERT`](https://www.evm.codes/#fd)) ou sans ([`STOP`](https://www.evm.codes/#00) ou [`SELFDESTRUCT`](https://www.evm.codes/#ff)). |
L'équation 143 nous indique qu'il existe quatre conditions possibles à chaque instant lors de l'exécution, et ce qu'il faut faire avec elles :
-1. `Z(σ,μ,A,I)`. Z représente une fonction qui teste si une opération crée une transition d'état invalide (voir [l'arrêt exceptionnel](#942-exceptional-halting)). Si elle est évaluée à True, le nouvel état est identique à l'ancien (à l'exception du gaz brûlé) car les changements n'ont pas été mis en œuvre.
-2. Si l'opcode exécuté est [`REVERT`](https://www.evm.codes/#fd), le nouvel état est le même que l'ancien, et une partie du gaz est perdue.
-3. Si la séquence d'opérations est terminée, comme signifié par un [`RETURN`](https://www.evm.codes/#f3), l'état est mis à jour avec le nouvel état.
-4. Si nous ne sommes pas à l'une des conditions de fin 1-3, continuer l'exécution.
+1. `Z(σ,μ,A,I)`. Z représente une fonction qui teste si une opération crée une transition d'état non valide (voir [arrêt exceptionnel](#942-exceptional-halting)). Si elle est évaluée à Vrai, le nouvel état est identique à l'ancien (à l'exception du gaz brûlé), car les modifications n'ont pas été appliquées.
+2. Si l'opcode exécuté est [`REVERT`](https://www.evm.codes/#fd), le nouvel état est le même que l'ancien, et une partie du gaz est perdue.
+3. Si la séquence d'opérations est terminée, comme l'indique un [`RETURN`](https://www.evm.codes/#f3)), l'état est mis à jour vers le nouvel état.
+4. Si nous ne sommes pas dans l'une des conditions de fin 1-3, l'exécution continue.
-## 9.4.1 Machine à états {#941-machine-state}
+## 9.4.1 État de la machine {#941-machine-state}
-Cette section explique la machine à états en détail. Elle spécifie que _w_ est l'opcode actuel. Si _μpc _ est inférieur à _||Ib ||_, la longueur du code, alors ce byte (_Ib [μpc ]_) est l'opcode. Sinon, l'opcode est défini comme [`STOP`](https://www.evm.codes/#00).
+Cette section explique plus en détail l'état de la machine. Elle spécifie que _w_ est l'opcode actuel. Si _μpc _ est inférieur à _||Ib ||_, la longueur du code, alors cet octet (_Ib [μpc ]_) est l'opcode. Sinon, l'opcode est défini comme [`STOP`](https://www.evm.codes/#00).
-Comme il s'agit [d'une machine à pile](https://en.wikipedia.org/wiki/Stack_machine), nous devons suivre le nombre d'éléments retirés (_δ_) et insérés (_α_) par chaque opcode.
+Comme il s'agit d'une [machine à pile](https://en.wikipedia.org/wiki/Stack_machine), nous devons suivre le nombre d'éléments retirés (_δ_) et insérés (_α_) par chaque opcode.
-## 9.4.2 Arrêt Exceptionnel {#942-exceptional-halt}
+## 9.4.2 Arrêt exceptionnel {#942-exceptional-halt}
-Cette section définit la fonction _Z_, qui spécifie quand nous avons une terminaison anormale. Il s'agit d'une fonction [booléenne](https://en.wikipedia.org/wiki/Boolean_data_type), donc elle utilise [_∨_ pour un « ou » logique](https://en.wikipedia.org/wiki/Logical_disjunction) et [_∧_ pour un « et » logique](https://en.wikipedia.org/wiki/Logical_conjunction).
+Cette section définit la fonction _Z_, qui spécifie quand nous avons une fin anormale. Il s'agit d'une fonction [booléenne](https://en.wikipedia.org/wiki/Boolean_data_type), elle utilise donc [_∨_ pour un OU logique](https://en.wikipedia.org/wiki/Logical_disjunction) et [_∧_ pour un ET logique](https://en.wikipedia.org/wiki/Logical_conjunction).
Nous avons un arrêt exceptionnel si l'une de ces conditions est vraie :
-- **_μg < C(σ,μ,A,I)_** Comme nous l'avons vu à la section 9.2, _C_ est la fonction qui spécifie le coût en gaz. Il ne reste pas assez de gaz pour couvrir le prochain opcode.
+- **_μg < C(σ,μ,A,I)_**
+ Comme nous l'avons vu dans la section 9.2, _C_ est la fonction qui spécifie le coût du gaz. Il ne reste pas assez de gaz pour couvrir le prochain opcode.
-- **_δw =∅_** Si le nombre d'éléments extraits pour un opcode est indéfini, alors l'opcode lui-même est indéfini.
+- **_δw =∅_**
+ Si le nombre d'éléments dépilés pour un opcode est indéfini, l'opcode lui-même est indéfini.
-- **_|| μs || < δw _** Sous-alimentation de la pile, pas assez d'éléments dans la pile pour l'opcode actuel.
+- **_|| μs || < δw _**
+ Sous-dépassement de la pile, pas assez d'éléments dans la pile pour l'opcode actuel.
-- **_w = JUMP ∧ μs [0]∉D(Ib )_** L'opcode est [`JUMP`](https://www.evm.codes/#56) et l'adresse n'est pas une [`JUMPDEST`](https://www.evm.codes/#5b). Les sauts ne sont valides _que_ lorsque la destination est une [`JUMPDEST`](https://www.evm.codes/#5b).
+- **_w = JUMP ∧ μs [0]∉D(Ib )_**
+ L'opcode est [`JUMP`](https://www.evm.codes/#56) et l'adresse n'est pas une [`JUMPDEST`](https://www.evm.codes/#5b). Les sauts ne sont valides _que_ si la destination est une [`JUMPDEST`](https://www.evm.codes/#5b).
-- **_w = JUMPI ∧ μs [1]≠0 ∧ μs [0] ∉ D(Ib )_** L'opcode est [`JUMPI`](https://www.evm.codes/#57), la condition est vraie (non nulle) donc le saut devrait se produire, et l'adresse n'est pas une [`JUMPDEST`](https://www.evm.codes/#5b). Les sauts ne sont valides _que_ lorsque la destination est une [`JUMPDEST`](https://www.evm.codes/#5b).
+- **_w = JUMPI ∧ μs [1]≠0 ∧ μs [0] ∉ D(Ib )_**
+ L'opcode est [`JUMPI`](https://www.evm.codes/#57), la condition est vraie (non nulle), donc le saut doit avoir lieu, et l'adresse n'est pas une [`JUMPDEST`](https://www.evm.codes/#5b). Les sauts ne sont valides _que_ si la destination est une [`JUMPDEST`](https://www.evm.codes/#5b).
-- **_w = RETURNDATACOPY ∧ μs [1]+μs [2]>|| μo ||_** L'opcode est [`RETURNDATACOPY`](https://www.evm.codes/#3e). Dans cet opcode, l'élément de pile _μs [1]_ est le décalage pour lire dans le tampon de données retournées, et l'élément de pile _μs [2]_ est la longueur des données. Cette condition se produit lorsque vous essayez de lire au-delà de la fin du tampon de données retournées. Notez qu'il n'y a pas de condition similaire pour les données d'appel ou pour le code lui-même. Lorsque vous essayez de lire au-delà de la fin de ces tampons, vous obtenez simplement des zéros.
+- **_w = RETURNDATACOPY ∧ μs [1]+μs [2]>|| μo ||_**
+ L'opcode est [`RETURNDATACOPY`](https://www.evm.codes/#3e). Dans cet opcode, l'élément de pile _μs [1]_ est le décalage à partir duquel lire dans le tampon des données de retour, et l'élément de pile _μs [2]_ est la longueur des données. Cette condition se produit lorsque vous essayez de lire au-delà de la fin du tampon de données retournées. Notez qu'il n'y a pas de condition similaire pour les données d'appel ou pour le code lui-même. Lorsque vous essayez de lire au-delà de la fin de ces tampons, vous obtenez simplement des zéros.
- **_|| μs || - δw + αw > 1024_**
- Débordement de la pile. Si l'exécution de l'opcode entraîne une pile de plus de 1024 éléments, abandonnez.
+ Dépassement de la pile. Si l'exécution de l'opcode entraîne une pile de plus de 1024 éléments, abandonnez.
-- **_¬Iw ∧ W(w,μ)_** Exécutons-nous de manière statique ([¬ est une négation](https://en.wikipedia.org/wiki/Negation) et _Iw _ est vrai lorsque nous sommes autorisés à modifier l'état de la blockchain) ? Si c'est le cas et que nous essayons une opération qui change l'état, cela ne peut pas se produire.
+- **_¬Iw ∧ W(w,μ)_**
+ Sommes-nous en train d'exécuter statiquement ([¬ est la négation](https://en.wikipedia.org/wiki/Negation) et _Iw _ est vrai lorsque nous sommes autorisés à changer l'état de la blockchain) ? Si c'est le cas et que nous essayons une opération qui change l'état, cela ne peut pas se produire.
- La fonction _W(w,μ)_ est définie plus tard dans l'équation 150. _W(w,μ)_ est vraie si l'une de ces conditions est vraie :
+ La fonction _W(w,μ)_ est définie plus loin dans l'équation 150. _W(w,μ)_ est vraie si l'une de ces conditions est vraie :
- - **_w ∈ \{CREATE, CREATE2, SSTORE, SELFDESTRUCT}_** Ces opcodes modifient l'état, soit en créant un nouveau contrat, soit en stockant une valeur, soit en détruisant le contrat actuel.
+ - **_w ∈ \{CREATE, CREATE2, SSTORE, SELFDESTRUCT}_**
+ Ces opcodes modifient l'état, soit en créant un nouveau contrat, en stockant une valeur, soit en détruisant le contrat actuel.
- - **_LOG0≤w ∧ w≤LOG4_** Si nous sommes appelés de manière statique, nous ne pouvons pas émettre d'entrées de journal. Les opcodes de journal sont tous dans la plage entre [`LOG0` (A0)](https://www.evm.codes/#a0) et [`LOG4` (A4)](https://www.evm.codes/#a4). Le nombre après l'opcode de journal spécifie combien de sujets l'entrée de journal contient.
- - **_w=CALL ∧ μs [2]≠0_** Vous pouvez appeler un autre contrat lorsque vous êtes statique, mais si vous le faites, vous ne pouvez pas lui transférer de l'ETH.
+ - **_LOG0≤w ∧ w≤LOG4_**
+ Si nous sommes appelés de manière statique, nous ne pouvons pas émettre d'entrées de journal.
+ Les opcodes de journal se situent tous dans la plage entre [`LOG0` (A0)](https://www.evm.codes/#a0) et [`LOG4` (A4)](https://www.evm.codes/#a4).
+ Le nombre après l'opcode de journal spécifie combien de sujets l'entrée de journal contient.
-- **_w = SSTORE ∧ μg ≤ Gcallstipend _** Vous ne pouvez pas exécuter [`SSTORE`](https://www.evm.codes/#55) à moins d'avoir plus de Gcallstipend (défini à 2300 dans l'Annexe G) de gaz.
+ - **_w=CALL ∧ μs [2]≠0_**
+ Vous pouvez appeler un autre contrat lorsque vous êtes statique, mais si vous le faites, vous ne pouvez pas lui transférer d'ETH.
-## 9.4.3 Validité de la Destination de Saut {#943-jump-dest-valid}
+- **_w = SSTORE ∧ μg ≤ Gcallstipend _**
+ Vous ne pouvez pas exécuter [`SSTORE`](https://www.evm.codes/#55) à moins d'avoir plus de Gcallstipend (défini à 2300 dans l'Annexe G) de gaz.
-Ici, nous définissons formellement ce que sont les opcodes [`JUMPDEST`](https://www.evm.codes/#5b). Nous ne pouvons pas simplement chercher la valeur de byte 0x5B, car elle pourrait se trouver à l'intérieur d'un PUSH (et donc être une donnée et non un opcode).
+## 9.4.3 Validité de la destination de saut {#943-jump-dest-valid}
-Dans l'équation (153), nous définissons une fonction, _N(i,w)_. Le premier paramètre, _i_, est la position de l'opcode. Le second, _w_, est l'opcode lui-même. Si _w∈[PUSH1, PUSH32]_, cela signifie que l'opcode est un PUSH (les crochets définissent une plage qui inclut les points d'extrémité). Dans ce cas, le prochain opcode est à _i+2+(w−PUSH1)_. Pour [`PUSH1`](https://www.evm.codes/#60), nous devons avancer de deux bytes (le PUSH lui-même et la valeur d'un byte), pour [`PUSH2`](https://www.evm.codes/#61) nous devons avancer de trois bytes car c'est une valeur de deux bytes, etc. Tous les autres opcodes EVM ont une longueur d'un byte, donc dans tous les autres cas _N(i,w)=i+1_.
+Ici, nous définissons formellement ce que sont les opcodes [`JUMPDEST`](https://www.evm.codes/#5b). Nous ne pouvons pas simplement chercher la valeur de l'octet 0x5B, car elle pourrait se trouver à l'intérieur d'un PUSH (et donc être une donnée et non un opcode).
-Cette fonction est utilisée dans l'équation (152) pour définir _DJ (c,i)_, qui est [l'ensemble](https://en.wikipedia.org/wiki/Set_(mathematics)) de toutes les destinations de saut valides dans le code _c_, à partir de la position de l'opcode _i_. Cette fonction est définie de manière récursive. Si _i≥||c||_, cela signifie que nous sommes à la fin ou après la fin du code. Nous ne trouverons plus d'autres destinations de saut, donc retournez simplement l'ensemble vide.
+Dans l'équation (153), nous définissons une fonction, _N(i,w)_. Le premier paramètre, _i_, est l'emplacement de l'opcode. Le second, _w_, est l'opcode lui-même. Si _w∈[PUSH1, PUSH32]_, cela signifie que l'opcode est un PUSH (les crochets définissent une plage qui inclut les points d'extrémité). Dans ce cas, l'opcode suivant se trouve à _i+2+(w−PUSH1)_. Pour [`PUSH1`](https://www.evm.codes/#60), nous devons avancer de deux octets (le PUSH lui-même et la valeur d'un octet), pour [`PUSH2`](https://www.evm.codes/#61), nous devons avancer de trois octets parce que c'est une valeur de deux octets, etc. Tous les autres opcodes EVM ont une longueur d'un seul octet, donc dans tous les autres cas _N(i,w)=i+1_.
+
+Cette fonction est utilisée dans l'équation (152) pour définir _DJ (c,i)_, qui est l'[ensemble](https://en.wikipedia.org/wiki/Set_\(mathematics\)) de toutes les destinations de saut valides dans le code _c_, à partir de l'emplacement de l'opcode _i_. Cette fonction est définie de manière récursive. Si _i≥||c||_, cela signifie que nous sommes à la fin ou après la fin du code. Nous ne trouverons plus d'autres destinations de saut, donc retournez simplement l'ensemble vide.
Dans tous les autres cas, nous examinons le reste du code en passant à l'opcode suivant et en obtenant l'ensemble à partir de celui-ci. _c[i]_ est l'opcode actuel, donc _N(i,c[i])_ est la position du prochain opcode. _DJ (c,N(i,c[i]))_ est donc l'ensemble des destinations de saut valides qui commence au prochain opcode. Si l'opcode actuel n'est pas un `JUMPDEST`, retournez simplement cet ensemble. Si c'est un `JUMPDEST`, incluez-le dans l'ensemble résultant et retournez-le.
## 9.4.4 Arrêt normal {#944-normal-halt}
-La fonction d'arrêt _H_ peut retourner trois types de valeurs.
+La fonction d'arrêt _H_, peut retourner trois types de valeurs.
-- Si nous ne sommes pas dans un opcode d'arrêt, retournez _∅_, l'ensemble vide. Par convention, cette valeur est interprétée comme un booléen faux.
-- Si nous avons un opcode d'arrêt qui ne produit pas de sortie (soit [`STOP`](https://www.evm.codes/#00) ou [`SELFDESTRUCT`](https://www.evm.codes/#ff)), retournez une séquence de bytes de taille zéro comme valeur de retour. Notez que ceci est très différent de l'ensemble vide. Cette valeur signifie que l'EVM s'est vraiment arrêté, il n'y a juste aucune donnée de retour à lire.
-- Si nous avons un opcode d'arrêt qui produit une sortie (soit [`RETURN`](https://www.evm.codes/#f3) ou [`REVERT`](https://www.evm.codes/#fd)), retournez la séquence de bytes spécifiée par cet opcode. Cette séquence est prise de la mémoire, la valeur en haut de la pile (_μs [0]_) est le premier byte, et la valeur après elle (_μs [1]_) est la longueur.
+- Si nous ne sommes pas dans un opcode d'arrêt, retournez ∅, l'ensemble vide. Par convention, cette valeur est interprétée comme un booléen faux.
+- Si nous avons un opcode d'arrêt qui ne produit pas de sortie (soit [`STOP`](https://www.evm.codes/#00) ou [`SELFDESTRUCT`](https://www.evm.codes/#ff)), retournez une séquence d'octets de taille zéro comme valeur de retour. Notez que ceci est très différent de l'ensemble vide. Cette valeur signifie que l'EVM s'est vraiment arrêté, il n'y a juste aucune donnée de retour à lire.
+- Si nous avons un opcode d'arrêt qui produit une sortie (soit [`RETURN`](https://www.evm.codes/#f3) ou [`REVERT`](https://www.evm.codes/#fd)), retournez la séquence d'octets spécifiée par cet opcode. Cette séquence est prise de la mémoire, la valeur en haut de la pile (_μs [0]_) est le premier octet, et la valeur après elle (_μs [1]_) est la longueur.
-## H.2 Ensemble d'instructions {#h2-instruction-set}
+## H.2 Jeu d'instructions {#h2-instruction-set}
Avant de passer à la sous-section finale de l'EVM, 9.5, examinons les instructions elles-mêmes. Elles sont définies dans l'Annexe H.2 qui commence à la page 29. Tout ce qui n'est pas spécifié comme changeant avec cet opcode spécifique est censé rester identique. Les variables qui changent sont spécifiées comme \′.
Par exemple, examinons l'opcode [`ADD`](https://www.evm.codes/#01).
-| Valeur | Mnemonic | δ | α | Description |
-| ------:| -------- | - | - | --------------------------------------------------------- |
-| 0x01 | ADD | 2 | 1 | Opération d'addition. |
-| | | | | _μ′s [0] ≡ μs [0] + μs [1]_ |
+| Valeur | Mnémonique | δ | α | Description |
+| -----: | ---------- | - | - | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| 0x01 | ADD | 2 | 1 | Opération d'addition. |
+| | | | | _μ′s [0] ≡ μs [0] + μs [1]_ |
_δ_ est le nombre de valeurs que nous retirons de la pile. Dans ce cas deux, car nous additionnons les deux premières valeurs.
@@ -211,31 +224,31 @@ Ainsi, le nouveau sommet de la pile (_μ′s [0]_) est la somme de l'a
Au lieu de passer en revue tous les opcodes avec une « liste ennuyeuse », cet article n'explique que les opcodes qui introduisent quelque chose de nouveau.
-| Valeur | Mnemonic | δ | α | Description |
-| ------:| --------- | - | - | ---------------------------------------------------------------------------------------------------------- |
-| 0x20 | KECCAK256 | 2 | 1 | Calculez le hash Keccak-256. |
-| | | | | _μ′s [0] ≡ KEC(μm [μs [0] . . . (μs [0] + μs [1] − 1)])_ |
-| | | | | _μ′i ≡ M(μi ,μs [0],μs [1])_ |
+| Valeur | Mnémonique | δ | α | Description |
+| -----: | ---------- | - | - | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| 0x20 | KECCAK256 | 2 | 1 | Calculez le hachage Keccak-256. |
+| | | | | _μ′s [0] ≡ KEC(μm [μs [0] . . . (μs [0] + μs [1] − 1)])_ |
+| | | | | _μ′i ≡ M(μi ,μs [0],μs [1])_ |
Il s'agit du premier opcode qui accède à la mémoire (dans ce cas, en lecture seule). Cependant, il pourrait dépasser les limites actuelles de la mémoire, nous devons donc mettre à jour _μi ._ Nous faisons cela en utilisant la fonction _M_ définie dans l'équation 328 à la page 29.
-| Valeur | Mnemonic | δ | α | Description |
-| ------:| -------- | - | - | --------------------------------- |
-| 0x31 | BALANCE | 1 | 1 | Obtenez le solde du compte donné. |
-| | | | | ... |
+| Valeur | Mnémonique | δ | α | Description |
+| -----: | ---------- | - | - | --------------------------------------------------- |
+| 0x31 | BALANCE | 1 | 1 | Obtenez le solde du compte donné. |
+| | | | | ... |
-L'adresse dont nous avons besoin pour trouver le solde est _μs [0] mod 2160 _. Le sommet de la pile est l'adresse, mais comme les adresses ne font que 160 bits, nous calculons la valeur [modulo](https://en.wikipedia.org/wiki/Modulo_operation) 2160 .
+L'adresse dont nous devons trouver le solde est _μs [0] mod 2160 _. Le sommet de la pile est l'adresse, mais comme les adresses ne font que 160 bits, nous calculons la valeur [modulo](https://en.wikipedia.org/wiki/Modulo_operation) 2160 .
Si _σ[μs [0] mod 2160 ] ≠ ∅_, cela signifie qu'il y a des informations sur cette adresse. Dans ce cas, _σ[μs [0] mod 2160 ]b _ est le solde de cette adresse. Si _σ[μs [0] mod 2160 ] = ∅_, cela signifie que cette adresse n'est pas initialisée et le solde est zéro. Vous pouvez voir la liste des champs d'information du compte dans la section 4.1 à la page 4.
-La deuxième équation, _A'a ≡ Aa ∪ \{μs [0] mod 2160 }_, est liée à la différence de coût entre l'accès au stockage chaud (stockage qui a récemment été accédé et est susceptible d'être mis en cache) et le stockage froid (stockage qui n'a pas été accédé et est susceptible de se trouver dans un stockage plus lent qui est plus coûteux à récupérer). _Aa _ est la liste des adresses précédemment accédées par la transaction, qui devraient donc être moins chères à accéder, comme défini dans la section 6.1 à la page 8. Vous pouvez en savoir plus sur ce sujet dans [l'EIP-2929](https://eips.ethereum.org/EIPS/eip-2929).
+La deuxième équation, _A'a ≡ Aa ∪ \{μs [0] mod 2160 }_, est liée à la différence de coût entre l'accès au stockage chaud (stockage qui a récemment été accédé et est susceptible d'être mis en cache) et le stockage froid (stockage qui n'a pas été accédé et est susceptible de se trouver dans un stockage plus lent qui est plus coûteux à récupérer). _Aa _ est la liste des adresses précédemment accédées par la transaction, qui devraient donc être moins chères à accéder, comme défini dans la section 6.1 à la page 8. Vous pouvez en lire plus sur ce sujet dans [l'EIP-2929](https://eips.ethereum.org/EIPS/eip-2929).
-| Valeur | Mnemonic | δ | α | Description |
-| ------:| -------- | -- | -- | --------------------------------------- |
-| 0x8F | DUP16 | 16 | 17 | Duplique le 16e élément de la pile. |
-| | | | | _μ′s [0] ≡ μs [15]_ |
+| Valeur | Mnémonique | δ | α | Description |
+| -----: | ---------- | -- | -- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
+| 0x8F | DUP16 | 16 | 17 | Duplique le 16e élément de la pile. |
+| | | | | _μ′s [0] ≡ μs [15]_ |
-Notez que pour utiliser un élément de la pile, nous devons le retirer, ce qui signifie que nous devons également retirer tous les éléments de la pile au-dessus de lui. Dans le cas de [`DUP`](https://www.evm.codes/#8f) et [`SWAP`](https://www.evm.codes/#9f), cela signifie devoir retirer puis remettre jusqu'à seize valeurs.
+Notez que pour utiliser un élément de la pile, nous devons le retirer, ce qui signifie que nous devons également retirer tous les éléments de la pile au-dessus de lui. Dans le cas de [`DUP`](https://www.evm.codes/#8f) et [`SWAP`](https://www.evm.codes/#9f), cela signifie avoir à dépiler puis à empiler jusqu'à seize valeurs.
## 9.5 Le cycle d'exécution {#95-exec-cycle}
@@ -250,15 +263,16 @@ L'équation (155) dit qu'étant donné l'état :
Le nouvel état est _(σ', μ', A', I')_.
-Les équations (156)-(158) définissent la pile et le changement en elle en raison d'un opcode (_μs _). L'équation (159) est le changement de gaz (_μg _). L'équation (160) est le changement dans le compteur de programme (_μpc _). Enfin, les équations (161)-(164) spécifient que les autres paramètres restent les mêmes, sauf s'ils sont explicitement modifiés par l'opcode.
+Les équations (156)-(158) définissent la pile et le changement qui s'y produit à cause d'un opcode (_μs _). L'équation (159) est le changement de gaz (_μg _). L'équation (160) est le changement dans le compteur de programme (_μpc _). Enfin, les équations (161)-(164) spécifient que les autres paramètres restent les mêmes, sauf s'ils sont explicitement modifiés par l'opcode.
Avec cela, l'EVM est entièrement défini.
## Conclusion {#conclusion}
-La notation mathématique est précise et a permis au Livre Jaune de spécifier chaque détail d'Ethereum. Cependant, elle présente quelques inconvénients :
+La notation mathématique est précise et a permis au Livre jaune de spécifier chaque détail d'Ethereum. Cependant, elle présente quelques inconvénients :
-- Elle ne peut être comprise que par les humains, ce qui signifie que [les tests](https://github.com/ethereum/tests) de conformité doivent être écrits manuellement.
-- Les programmeurs comprennent le code informatique. Ils peuvent ou non comprendre la notation mathématique.
+- Elle ne peut être comprise que par les humains, ce qui signifie que les [tests de conformité](https://github.com/ethereum/tests) doivent être écrits manuellement.
+- Les programmeurs comprennent le code informatique.
+ Ils peuvent ou non comprendre la notation mathématique.
-Peut-être pour ces raisons, les nouvelles [spécifications de la couche de consensus](https://github.com/ethereum/consensus-specs/blob/dev/tests/core/pyspec/README.md) sont écrites en Python. Il existe des [spécifications de la couche d'exécution en Python](https://ethereum.github.io/execution-specs), mais elles ne sont pas complètes. Jusqu'à ce que le Livre Jaune soit également traduit en Python ou dans un langage similaire, le Livre Jaune continuera d'être utilisé, et il est utile de pouvoir le lire.
+Peut-être pour ces raisons, les [spécifications plus récentes de la couche de consensus](https://github.com/ethereum/consensus-specs/blob/dev/tests/core/pyspec/README.md) sont écrites en Python. Il existe des [spécifications de la couche d'exécution en Python](https://ethereum.github.io/execution-specs), mais elles ne sont pas complètes. Jusqu'à ce que le Livre jaune soit également traduit en Python ou dans un langage similaire, le Livre jaune continuera d'être utilisé, et il est utile de pouvoir le lire.
diff --git a/public/content/translations/fr/eips/index.md b/public/content/translations/fr/eips/index.md
index 47af6c181ee..d8c9e67a5ba 100644
--- a/public/content/translations/fr/eips/index.md
+++ b/public/content/translations/fr/eips/index.md
@@ -1,32 +1,32 @@
---
-title: Propositions d'amélioration d'Ethereum (EIP)
+title: "Propositions d'amélioration d'Ethereum (EIP)"
description: Les informations de base dont vous avez besoin pour comprendre les EIP
lang: fr
---
-# Introduction aux propositions d'amélioration d'Ethereum (EIP) {#introduction-to-ethereum-improvement-proposals}
+# Introduction aux Propositions d'amélioration d'Ethereum (EIP) {#introduction-to-ethereum-improvement-proposals}
## En quoi consistent les EIP ? {#what-are-eips}
-[Les EIP](https://eips.ethereum.org/) sont des normes spécifiant de nouvelles fonctionnalités ou processus potentiels pour Ethereum. Les EIP contiennent les spécifications techniques des modifications proposées et servent de "source de vérité" pour la communauté. Les mises à niveau du réseau et les normes des applications Ethereum sont discutées et développées via le processus EIP.
+Les [Propositions d'amélioration d'Ethereum (EIP)](https://eips.ethereum.org/) sont des normes spécifiant de nouvelles fonctionnalités ou de nouveaux processus potentiels pour Ethereum. Les EIP contiennent les spécifications techniques des modifications proposées et servent de "source de vérité" pour la communauté. Les mises à niveau du réseau et les normes des applications Ethereum sont discutées et développées via le processus EIP.
-N'importe qui dans la communauté Ethereum peut créer une EIP. Les directives pour rédiger des EIP sont incluses dans [EIP-1](https://eips.ethereum.org/EIPS/eip-1). Une EIP devrait avant tout fournir une spécification technique concise assortie d'une petite justification. L'auteur de l'EIP est tenu d'obtenir un consensus au sein de la communauté et de répertorier les opinions alternatives. Compte tenu de la barrière technique élevée que représente la soumission d'une EIP bien formulée, la plupart des auteurs d'EIP sont des développeurs d'application ou de protocole.
+N'importe qui dans la communauté Ethereum peut créer une EIP. Les directives pour la rédaction des EIP sont incluses dans [EIP-1](https://eips.ethereum.org/EIPS/eip-1). Une EIP devrait avant tout fournir une spécification technique concise assortie d'une petite justification. L'auteur de l'EIP est tenu d'obtenir un consensus au sein de la communauté et de répertorier les opinions alternatives. Compte tenu de la barrière technique élevée que représente la soumission d'une EIP bien formulée, la plupart des auteurs d'EIP sont des développeurs d'application ou de protocole.
## Pourquoi les EIP sont-elles importantes ? {#why-do-eips-matter}
-Les EIP jouent un rôle central dans la façon dont les modifications sont effectuées et documentées sur Ethereum. Elles permettent aux utilisateurs de proposer, de discuter et d'adopter des modifications. Il existe [différents types d'EIP](https://eips.ethereum.org/EIPS/eip-1#eip-types), y compris les EIP de base destinées aux changements de protocole de faible niveau qui affectent le consensus et nécessitent une mise à jour du réseau comme [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559), et les ERC pour les normes d'application comme [EIP-20](https://eips.ethereum.org/EIPS/eip-20) et [EIP-721](https://eips.ethereum.org/EIPS/eip-721).
+Les EIP jouent un rôle central dans la façon dont les modifications sont effectuées et documentées sur Ethereum. Elles permettent aux utilisateurs de proposer, de discuter et d'adopter des modifications. Il existe [différents types d'EIP](https://eips.ethereum.org/EIPS/eip-1#eip-types), y compris les EIP de base pour les changements de protocole de bas niveau qui affectent le consensus et nécessitent une mise à niveau du réseau comme [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559), et les ERC pour les normes d'application comme [EIP-20](https://eips.ethereum.org/EIPS/eip-20) et [EIP-721](https://eips.ethereum.org/EIPS/eip-721).
-Chaque mise à niveau du réseau consiste en un ensemble d'EIP qui doivent être implémentées par chaque [client Ethereum](/learn/#clients-and-nodes) du réseau. Dès lors, pour maintenir le consensus avec les autres clients du réseau principal Ethereum, les développeurs de clients doivent s'assurer qu'ils ont tous implémenté les EIP requises.
+Chaque mise à niveau du réseau consiste en un ensemble d'EIP qui doivent être implémentées par chaque [client Ethereum](/learn/#clients-and-nodes) sur le réseau. Dès lors, pour maintenir le consensus avec les autres clients du réseau principal Ethereum, les développeurs de clients doivent s'assurer qu'ils ont tous implémenté les EIP requises.
En plus de fournir les spécifications techniques des modifications, les EIP représentent l'unité de la gouvernance sur Ethereum : n'importe qui est libre d'en proposer une, puis divers parties prenantes de la communauté en discutent pour déterminer si elle doit être adoptée comme norme ou incluse dans une mise à niveau du réseau. Les EIP non fondamentales n'ont pas besoin d'être adoptées par toutes les applications (par exemple, il est possible de créer un jeton fongible sans implémenter EIP-20), mais les EIP fondamentales doivent être largement adoptées (dans la mesure où tous les nœuds doivent se mettre à niveau pour continuer à faire partie du même réseau). Les EIP fondamentales nécessitent un consensus plus large au sein de la communauté que les EIP non fondamentales.
## Historique des EIP {#history-of-eips}
-Le dépôt [GitHub des EIP](https://github.com/ethereum/EIPs) a été créé en octobre 2015. Le processus des EIP est basé sur celui des [propositions d'amélioration de Bitcoin (BIP)](https://github.com/bitcoin/bips), lui-même basé sur celui des [propositions d'amélioration de Python (PEP)](https://www.python.org/dev/peps/).
+Le [dépôt GitHub des Propositions d'amélioration d'Ethereum (EIP)](https://github.com/ethereum/EIPs) a été créé en octobre 2015. Le processus EIP est basé sur le processus des [Propositions d'amélioration de Bitcoin (BIP)](https://github.com/bitcoin/bips), qui est lui-même basé sur le processus des [Propositions d'amélioration de Python (PEP)](https://www.python.org/dev/peps/).
Les éditeurs d'EIP ont pour tâche de passer en revue les EIP pour en vérifier la solidité technique, les problèmes de formatage et corriger l'orthographe, la grammaire et le style de code. Martin Becze, Vitalik Buterin, Gavin Wood et quelques autres ont été les éditeurs d'origine des EIP de 2015 à fin 2016.
-Les éditeurs d'EIP actuels sont
+Les éditeurs d'EIP actuels sont
- Alex Beregszaszi (@axic)
- Gavin John (@Pandapip1)
@@ -44,31 +44,30 @@ Les éditeurs Emeritus EIP sont
- Nick Savers (@nicksavers)
- Vitalik Buterin (@vbuterin)
-Si vous souhaitez devenir un éditeur EIP, veuillez consulter [EIP-5069](https://eips.ethereum.org/EIPS/eip-5069).
+Si vous souhaitez devenir un éditeur d'EIP, veuillez consulter [EIP-5069](https://eips.ethereum.org/EIPS/eip-5069).
-Les éditeurs d'EIP décident du moment où une proposition peut devenir une EIP, et aident les auteurs d'EIP à faire avancer leurs propositions. [Les Ethereum Cat Herders](https://www.ethereumcatherders.com/) aident à organiser des réunions entre les éditeurs d'EIP et la communauté (voir [EIPIP](https://github.com/ethereum-cat-herders/EIPIP)).
+Les éditeurs d'EIP décident du moment où une proposition peut devenir une EIP, et aident les auteurs d'EIP à faire avancer leurs propositions. Les [Ethereum Cat Herders](https://www.ethereumcatherders.com/) aident à organiser des réunions entre les éditeurs d'EIP et la communauté (voir [EIPIP](https://github.com/ethereum-cat-herders/EIPIP)).
-Le processus complet de normalisation ainsi que la charte sont détaillés dans le document [EIP-1](https://eips.ethereum.org/EIPS/eip-1)
+Le processus de normalisation complet ainsi que son diagramme sont décrits dans [EIP-1](https://eips.ethereum.org/EIPS/eip-1)
-## En savoir plus {#learn-more}
+## En apprendre plus {#learn-more}
-Si vous souhaitez en savoir plus sur les EIP, consultez le site [EIPs](https://eips.ethereum.org/) et [EIP-1](https://eips.ethereum.org/EIPS/eip-1). Voici quelques liens utiles :
+Si vous souhaitez en savoir plus sur les EIP, consultez le [site web des EIP](https://eips.ethereum.org/) et [EIP-1](https://eips.ethereum.org/EIPS/eip-1). Voici quelques liens utiles :
-- [Une liste de toutes les propositions d'amélioration d'Ethereum (EIP)](https://eips.ethereum.org/all)
+- [Une liste de toutes les Propositions d'amélioration d'Ethereum](https://eips.ethereum.org/all)
- [Une description de tous les types d'EIP](https://eips.ethereum.org/EIPS/eip-1#eip-types)
-- [Une description de tous les statuts EIP](https://eips.ethereum.org/EIPS/eip-1#eip-process)
+- [Une description de tous les statuts d'EIP](https://eips.ethereum.org/EIPS/eip-1#eip-process)
### Projets éducatifs communautaires {#community-projects}
-- [PEEPanEIP](https://www.youtube.com/playlist?list=PL4cwHXAawZxqu0PKKyMzG_3BJV_xZTi1F) — *PEEPanEIP est une série de vidéos éducatives qui traite des propositions d'amélioration d'Ethereum (EIP) et des fonctionnalités clés des prochaines mises à niveau.*
-- [EIPs For Nerds](https://ethereum2077.substack.com/t/eip-research) — *EIPs For Nerds propose des aperçus complets, de style ELI5, de diverses propositions d'amélioration d'Ethereum (EIP), y compris les EIP de base et les EIP de la couche application/infrastructure (ERC), pour éduquer les lecteurs et façonner le consensus autour des changements proposés au protocole Ethereum.*
-- [EIPs.wtf](https://www.eips.wtf/) — *EIPs.wtf fournit des informations supplémentaires sur les propositions d'amélioration d'Ethereum (EIP), y compris leur statut, les détails de leur mise en œuvre, les pull requests associées et les retours de la communauté.*
-- [EIP.Fun](https://eipfun.substack.com/) — *EIP.Fun fournit les dernières nouvelles sur les propositions d'amélioration d'Ethereum (EIP), des mises à jour sur les réunions EIP, et plus encore.*
-- [EIPs Insight](https://eipsinsight.com/) — *EIPs Insight représente l'état du processus des propositions d'amélioration d'Ethereum (EIP) et des statistiques, selon les informations collectées auprès de différentes sources.*
+- [PEEPanEIP](https://www.youtube.com/playlist?list=PL4cwHXAawZxqu0PKKyMzG_3BJV_xZTi1F) — _PEEPanEIP est une série de vidéos éducatives qui traite des Propositions d'amélioration d'Ethereum (EIP) et des fonctionnalités clés des prochaines mises à niveau._
+- [EIPs.wtf](https://www.eips.wtf/) — _EIPs.wtf fournit des informations supplémentaires sur les Propositions d'amélioration d'Ethereum (EIP), y compris leur statut, les détails de leur mise en œuvre, les pull requests associées et les retours de la communauté._
+- [EIP.Fun](https://eipfun.substack.com/) — _EIP.Fun fournit les dernières nouvelles sur les Propositions d'amélioration d'Ethereum (EIP), des mises à jour sur les réunions EIP, et plus encore._
+- [EIPs Insight](https://eipsinsight.com/) — _EIPs Insight est une représentation de l'état du processus des Propositions d'amélioration d'Ethereum (EIP) et des statistiques selon les informations collectées auprès de différentes sources._
## Participer {#participate}
-Tout le monde peut créer une EIP. Avant de soumettre une proposition, il est indispensable de lire [EIP-1](https://eips.ethereum.org/EIPS/eip-1) qui décrit le processus EIP et explique comment écrire une EIP et solliciter des commentaires sur [Ethereum Magician](https://ethereum-magicians.org/), où les propositions sont d'abord discutées avec la communauté avant qu'une ébauche ne soit soumise.
+Tout le monde peut créer une EIP. Avant de soumettre une proposition, il faut lire l'[EIP-1](https://eips.ethereum.org/EIPS/eip-1) qui décrit le processus EIP et la manière de rédiger une EIP, et solliciter des commentaires sur le forum [Ethereum Magicians](https://ethereum-magicians.org/), où les propositions sont d'abord discutées avec la communauté avant la soumission d'une ébauche.
## Références {#references}
diff --git a/public/content/translations/fr/energy-consumption/index.md b/public/content/translations/fr/energy-consumption/index.md
index 96fd2134338..7a4110743ab 100644
--- a/public/content/translations/fr/energy-consumption/index.md
+++ b/public/content/translations/fr/energy-consumption/index.md
@@ -1,14 +1,14 @@
---
-title: Consommation énergétique d'Ethereum
-description: L'information de base dont vous avez besoin pour comprendre la consommation énergétique d'Ethereum.
+title: "Consommation énergétique d'Ethereum"
+description: "L'information de base dont vous avez besoin pour comprendre la consommation énergétique d'Ethereum."
lang: fr
---
-# Les dépenses énergétiques d'Ethereum {#proof-of-stake-energy}
+# Dépenses énergétiques d'Ethereum {#proof-of-stake-energy}
-Ethereum est une blockchain verte. Le mécanisme de consensus par [preuve d'enjeu](/developers/docs/consensus-mechanisms/pos) d'Ethereum utilise de l'ETH au lieu [d'énergie pour sécuriser le réseau](/developers/docs/consensus-mechanisms/pow). La consommation énergétique d'Ethereum est approximativement [0.0026 TWh/an](https://carbon-ratings.com/eth-report-2022) pour l'ensemble du réseau.
+Ethereum est une blockchain verte. Le mécanisme de consensus de [preuve d'enjeu](/developers/docs/consensus-mechanisms/pos) d'Ethereum utilise des ETH au lieu de [l'énergie pour sécuriser le réseau](/developers/docs/consensus-mechanisms/pow). La consommation d'énergie d'Ethereum est d'environ [~0,0026 TWh/an](https://carbon-ratings.com/eth-report-2022) sur l'ensemble du réseau mondial.
-L'estimation de la consommation énergétique d'Ethereum se base sur une étude réalisée par le [CCRI (Crypto Carbon Ratings Institute)](https://carbon-ratings.com). Ils ont généré des estimations détaillées de la consommation d'électricité et de l'empreinte carbone du réseau Ethereum ([voir le rapport](https://carbon-ratings.com/eth-report-2022)). Ils ont mesuré la consommation d'électricité de différents nœuds avec différentes configurations matérielles et différents logiciels clients. Ils ont estimé que les **2,601 MWh** (0.0026 TWh) d'électricité consommés annuellement par le réseau correspond à **870 tonnes CO2e** annuelles en appliquant des facteur régionaux d'ntensité de carbone. Cette valeur change au fur et à mesure que des nœuds entrent et sortent du réseau. Vous pouvez suivre ces variations grâce à [l'Indice de Durabilité du Réseau Blockchain de Cambridge](https://ccaf.io/cbnsi/ethereum) qui offre une estimation moyenne sur 7 jours (notez qu'ils utilisent une méthode légèrement différente pour leurs estimations - plus de détails sont disponibles sur leur site).
+L'estimation de la consommation d'énergie pour Ethereum provient d'une étude du [CCRI (Crypto Carbon Ratings Institute)](https://carbon-ratings.com). Ils ont généré des estimations ascendantes de la consommation d'électricité et de l'empreinte carbone du réseau Ethereum ([voir le rapport](https://carbon-ratings.com/eth-report-2022)). Ils ont mesuré la consommation d'électricité de différents nœuds avec différentes configurations matérielles et différents logiciels clients. Les **2 601 MWh** (0,0026 TWh) estimés pour la consommation annuelle d'électricité du réseau correspondent à des émissions de carbone annuelles de **870 tonnes d'éq. CO2** en appliquant des facteurs d'intensité carbone spécifiques à chaque région. Cette valeur change au fur et à mesure que les nœuds rejoignent et quittent le réseau. Vous pouvez en suivre l'évolution grâce à une estimation moyenne mobile sur 7 jours fournie par le [Cambridge Blockchain network Sustainability Index](https://ccaf.io/cbnsi/ethereum) (notez qu'ils utilisent une méthode légèrement différente pour leurs estimations, dont les détails sont disponibles sur leur site).
Pour replacer la consommation énergétique d'Ethereum dans son contexte, nous pouvons comparer les estimations annualisées d'autres biens et secteurs industriels. Cela nous aide à mieux comprendre si l'estimation pour Ethereum est élevée ou faible.
@@ -16,34 +16,34 @@ Pour replacer la consommation énergétique d'Ethereum dans son contexte, nous p
Le tableau ci-dessous montre la consommation énergétique estimée en TWh/an pour Ethereum, comparée à plusieurs autres biens et secteurs. Les estimations fournies proviennent d'informations publiquement disponibles, consultées en juillet 2023, les liens vers les sources sont disponibles dans le tableau ci-dessous.
-| | Consommation d’énergie annualisée (TWh) | Comparaison avec Ethereum PoS | Source |
-|:------------------------------ |:---------------------------------------:|:-----------------------------:|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
-| Centres de données globaux | 190 | 73 000 x | [source](https://www.iea.org/commentaries/data-centres-and-energy-from-global-headlines-to-local-headaches) |
-| Bitcoin | 149 | 53 000 x | [source](https://ccaf.io/cbnsi/cbeci/comparisons) |
-| Extraction d'or | 131 | 50 000 x | [source](https://ccaf.io/cbnsi/cbeci/comparisons) |
-| Jeux vidéos aux États-Unis\* | 34 | 13 000 x | [source](https://www.researchgate.net/publication/336909520_Toward_Greener_Gaming_Estimating_National_Energy_Use_and_Energy_Efficiency_Potential) |
-| Ethereum PoW | 21 | 8 100 x | [source](https://ccaf.io/cbnsi/ethereum/1) |
-| Google | 19 | 7 300 x | [source](https://www.gstatic.com/gumdrop/sustainability/google-2022-environmental-report.pdf) |
-| Netflix | 0,457 | 176 x | [source](https://assets.ctfassets.net/4cd45et68cgf/7B2bKCqkXDfHLadrjrNWD8/e44583e5b288bdf61e8bf3d7f8562884/2021_US_EN_Netflix_EnvironmentalSocialGovernanceReport-2021_Final.pdf) |
-| PayPal | 0,26 | 100 x | [source](https://s202.q4cdn.com/805890769/files/doc_downloads/global-impact/CDP_Climate_Change_PayPal-(1).pdf) |
-| Airbnb | 0,02 | 8 x | [source](https://s26.q4cdn.com/656283129/files/doc_downloads/governance_doc_updated/Airbnb-ESG-Factsheet-(Final).pdf) |
-| **Ethereum PoS** | **0,0026** | **1 x** | [source](https://carbon-ratings.com/eth-report-2022) |
+| | Consommation d’énergie annualisée (TWh) | Comparaison avec Ethereum PoS | Source |
+| :--------------------------- | :--------------------------------------------------------: | :---------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
+| Centres de données globaux | 190 | 73 000 x | [source](https://www.iea.org/commentaries/data-centres-and-energy-from-global-headlines-to-local-headaches) |
+| Bitcoin | 149 | 53 000 x | [source](https://ccaf.io/cbnsi/cbeci/comparisons) |
+| Extraction d'or | 131 | 50 000 x | [source](https://ccaf.io/cbnsi/cbeci/comparisons) |
+| Jeux vidéos aux États-Unis\* | 34 | 13 000 x | [source](https://www.researchgate.net/publication/336909520_Toward_Greener_Gaming_Estimating_National_Energy_Use_and_Energy_Efficiency_Potential) |
+| Ethereum PoW | 21 | 8 100 x | [source](https://ccaf.io/cbnsi/ethereum/1) |
+| Google | 19 | 7 300 x | [source](https://www.gstatic.com/gumdrop/sustainability/google-2022-environmental-report.pdf) |
+| Netflix | 0,457 | 176 x | [source](https://assets.ctfassets.net/4cd45et68cgf/7B2bKCqkXDfHLadrjrNWD8/e44583e5b288bdf61e8bf3d7f8562884/2021_US_EN_Netflix_EnvironmentalSocialGovernanceReport-2021_Final.pdf) |
+| PayPal | 0,26 | 100 x | [source](https://s202.q4cdn.com/805890769/files/doc_downloads/global-impact/CDP_Climate_Change_PayPal-\(1\).pdf) |
+| Airbnb | 0,02 | 8 x | [source](https://s26.q4cdn.com/656283129/files/doc_downloads/governance_doc_updated/Airbnb-ESG-Factsheet-\(Final\).pdf) |
+| **Ethereum PoS** | **0,0026** | **1x** | [source](https://carbon-ratings.com/eth-report-2022) |
\*Comprend les appareils des utilisateurs finaux tels que les PC, les ordinateurs portables et les consoles de jeu.
-Obtenir des estimations précises de la consommation d'énergie est difficile, en particulier lorsque ce qui est mesuré a une chaîne d'approvisionnement complexe ou des caractéristiques de déploiement qui influencent son efficacité. Par exemples : les estimations de consommation d'énergie de Netflix et Google varient selon qu'elles incluent uniquement l'énergie utilisée pour entretenir leurs systèmes et fournir du contenu aux utilisateurs (_dépenses directes_) ou qu'elles incluent les dépenses nécessaires pour produire du contenu, gérer les bureaux de l'entreprise, faire de la publicité, etc (_dépenses indirectes_). Les dépenses indirectes pourraient également inclure l'énergie nécessaire à la consommation de contenu sur les appareils des utilisateurs finaux tels que les téléviseurs, les ordinateurs et les téléphones portables.
+Obtenir des estimations précises de la consommation d'énergie est difficile, en particulier lorsque ce qui est mesuré a une chaîne d'approvisionnement complexe ou des caractéristiques de déploiement qui influencent son efficacité. Par exemple, les estimations de la consommation d'énergie pour Netflix et Google varient selon qu'elles incluent uniquement l'énergie utilisée pour maintenir leurs systèmes et fournir du contenu aux utilisateurs (_dépenses directes_) ou qu'elles incluent les dépenses nécessaires pour produire du contenu, gérer les bureaux de l'entreprise, faire de la publicité, etc. (_dépenses indirectes_). Les dépenses indirectes pourraient également inclure l'énergie nécessaire à la consommation de contenu sur les appareils des utilisateurs finaux tels que les téléviseurs, les ordinateurs et les téléphones portables.
Les estimations ci-dessus ne sont pas des comparaisons parfaites. Le montant des dépenses indirectes prises en compte varie selon la source et inclut rarement l'énergie provenant des appareils des utilisateurs finaux. Chaque source sous-jacente contient plus de détails sur ce qui est mesuré.
-Le tableau et le graphique ci-dessus comprennent également des comparaisons avec Bitcoin et Ethereum proof-of-work. Il est important de noter que la consommation d'énergie des réseaux de preuve de travail n'est pas statique et elle évolue au jour le jour. Les estimations peuvent également varier considérablement d'une source à l'autre. Le sujet suscite un [débat](https://www.coindesk.com/business/2020/05/19/the-last-word-on-bitcoins-energy-consumption/) nuancé, non seulement sur la quantité d'énergie consommée, mais aussi sur les sources de cette énergie et l'éthique qui s'y rattache. La consommation d'énergie ne correspond pas nécessairement à l'empreinte environnementale, car différents projets peuvent utiliser différentes sources d'énergie, avec une proportion plus ou moins grande d'énergies renouvelables. Par exemple, le [Cambridge Bitcoin Electricity Consumption Index](https://ccaf.io/cbnsi/cbeci/comparisons) indique que la demande du réseau Bitcoin pourrait théoriquement être alimentée par le brûlage de gaz ou par de l'électricité qui serait autrement perdue lors de la transmission et de la distribution. La voie de la durabilité empruntée par Ethereum a consisté à remplacer la partie du réseau gourmande en énergie par une alternative verte.
+Le tableau et le graphique ci-dessus comprennent également des comparaisons avec Bitcoin et Ethereum proof-of-work. Il est important de noter que la consommation d'énergie des réseaux de preuve de travail n'est pas statique et elle évolue au jour le jour. Les estimations peuvent également varier considérablement d'une source à l'autre. Le sujet suscite un [débat](https://www.coindesk.com/business/2020/05/19/the-last-word-on-bitcoins-energy-consumption/) nuancé, non seulement sur la quantité d'énergie consommée, mais aussi sur les sources de cette énergie et l'éthique qui s'y rattache. La consommation d'énergie ne correspond pas nécessairement à l'empreinte environnementale, car différents projets peuvent utiliser différentes sources d'énergie, avec une proportion plus ou moins grande d'énergies renouvelables. Par exemple, le [Cambridge Bitcoin Electricity Consumption Index](https://ccaf.io/cbnsi/cbeci/comparisons) indique que la demande du réseau Bitcoin pourrait théoriquement être alimentée par le torchage de gaz ou par de l'électricité qui serait autrement perdue lors du transport et de la distribution. La voie de la durabilité empruntée par Ethereum a consisté à remplacer la partie du réseau gourmande en énergie par une alternative verte.
-Vous pouvez consulter les estimations de la consommation d'énergie et des émissions de carbone pour de nombreuses industries sur le site [Cambridge Blockchain Network Sustainability Index](https://ccaf.io/cbnsi/ethereum).
+Vous pouvez consulter les estimations de la consommation d'énergie et des émissions de carbone pour de nombreuses industries sur le site du [Cambridge Blockchain Network Sustainability Index](https://ccaf.io/cbnsi/ethereum).
## Estimations par transaction {#per-transaction-estimates}
De nombreux articles estiment les dépenses énergétiques pour les blockchains « par transaction ». Cela peut être trompeur dans la mesure où l'énergie nécessaire pour proposer et valider un bloc est indépendante du nombre de transactions qu'il contient. Une unité de dépense énergétique par transaction implique qu'un nombre moins élevé de transactions entraînerait une moindre dépense énergétique et vice-versa, ce qui n'est pas le cas. En outre, l'estimation par transaction dépend fortement de la façon dont le débit de transaction d'une blockchain est défini, sachant qu'il est possible de jouer avec cette définition pour que la valeur semble plus ou moins grande.
-Sur Ethereum par exemple, le débit de transaction n'est pas seulement celui de la couche de base - c'est aussi la somme du débit de transaction de tous ses rollups de « [couche 2](/layer-2/) ». Les couches 2 ne sont généralement pas incluses dans les calculs, mais la prise en compte de l'énergie supplémentaire consommée par les séquenceurs (faible) et du nombre de transactions qu'ils traitent (élevé) réduirait probablement considérablement les estimations par transaction. C'est l'une des raisons pour lesquelles les comparaisons de consommation d'énergie par transaction entre plateformes peuvent être trompeuses.
+Sur Ethereum, par exemple, le débit de transactions n'est pas seulement celui de la couche de base. C'est aussi la somme du débit de transactions de tous ses rollups de « [couche 2](/layer-2/) ». Les couches 2 ne sont généralement pas incluses dans les calculs, mais la prise en compte de l'énergie supplémentaire consommée par les séquenceurs (faible) et du nombre de transactions qu'ils traitent (élevé) réduirait probablement considérablement les estimations par transaction. C'est l'une des raisons pour lesquelles les comparaisons de consommation d'énergie par transaction entre plateformes peuvent être trompeuses.
## La dette carbone d'Ethereum {#carbon-debt}
@@ -51,15 +51,15 @@ Les dépenses énergétiques d'Ethereum sont très faibles, mais cela n'a pas to
Depuis le tout début, Ethereum prévoyait d'implémenter un mécanisme de consensus par preuve d'enjeu, mais il aura fallu des années de recherches et de développement ciblés pour y parvenir sans sacrifier la sécurité et la décentralisation. C'est pourquoi un mécanisme de preuve de travail a été utilisé pour faire démarrer le réseau. Un consensus de preuve de travail exige que les mineurs utilisent leur matériel informatique pour calculer une valeur, en dépensant de l'énergie pendant le processus.
-
+
-Le CCRI évalue que La Fusion a réduit la consommation d'électricité annualisée d'Ethereum de plus de **99.988%**. De même, l'empreinte carbone d'Ethereum a été réduite d'environ **99,992%** (de 11 016 000 à 870 tonnes de CO2e). Pour mettre les choses en perspective, la réduction des émissions équivaut à passer de la hauteur de la Tour Eiffel à celle d'une petite figurine en plastique, comme l'illustre la figure ci-dessus. Par conséquent, le coût environnemental de la sécurisation du réseau est considérablement réduit. Dans le même temps, la sécurité du réseau est présumée s'être améliorée.
+Le CCRI estime que la Fusion a réduit la consommation d'électricité annualisée d'Ethereum de plus de **99,988 %**. De même, l'empreinte carbone d'Ethereum a diminué d'environ **99,992 %** (passant de 11 016 000 à 870 tonnes d'éq. CO2). Pour mettre les choses en perspective, la réduction des émissions équivaut à passer de la hauteur de la Tour Eiffel à celle d'une petite figurine en plastique, comme l'illustre la figure ci-dessus. Par conséquent, le coût environnemental de la sécurisation du réseau est considérablement réduit. Dans le même temps, la sécurité du réseau est présumée s'être améliorée.
## Une couche d'application verte {#green-applications}
-Bien que la consommation d'énergie d'Ethereum soit très faible, il existe également une communauté de [**finance régénérative (ReFi)**](/refi/) substantielle, croissante et très active qui construit sur Ethereum. Les applications ReFi utilisent les composants DeFi pour construire des applications financières qui ont des externalités positives au bénéfice de l'environnement. La ReFi fait partie d'un plus large mouvement [« solarpunk »](https://en.wikipedia.org/wiki/Solarpunk) qui est étroitement aligné avec Ethereum et vise à associer progrès technologiques et gérance environnementale. La nature décentralisée, sans permission et composable d'Ethereum en fait la couche de base idéale pour les communautés ReFi et solarpunk.
+Bien que la consommation d'énergie d'Ethereum soit très faible, il existe également une communauté importante, croissante et très active de [**finance régénérative (ReFi)**](/refi/) qui se développe sur Ethereum. Les applications ReFi utilisent les composants DeFi pour construire des applications financières présentant des externalités positives bénéfiques pour l'environnement. La ReFi fait partie d'un mouvement « [solarpunk](https://en.wikipedia.org/wiki/Solarpunk) » plus large, qui est étroitement aligné sur Ethereum et vise à associer le progrès technologique et la gérance environnementale. La nature décentralisée, sans permission et composable d'Ethereum en fait la couche de base idéale pour les communautés ReFi et solarpunk.
-Les plateformes de financement de biens publics natifs Web3 telles que [Gitcoin](https://gitcoin.co) exécutent des rondes climatiques pour stimuler la construction écologique sur la couche d'application d'Ethereum. Grâce au développement de ces initiatives (et d'autres comme par exemple [DeSci](/desci/)), Ethereum est en train de devenir une technologie positive sur le plan environnemental et social.
+Des plateformes de financement de biens publics natifs du Web3 telles que [Gitcoin](https://gitcoin.co) organisent des cycles de financement pour le climat afin de stimuler la construction respectueuse de l'environnement sur la couche d'application d'Ethereum. Grâce au développement de ces initiatives (et d'autres, par exemple, [DeSci](/desci/)), Ethereum est en train de devenir une technologie à impact net positif sur les plans environnemental et social.
@@ -70,18 +70,17 @@ Les plateformes de financement de biens publics natifs Web3 telles que [Gitcoin]
-## Complément d'information {#further-reading}
+## En savoir plus {#further-reading}
-- [Index de Durabilité des Réseaux Blockchain de Cambridge](https://ccaf.io/cbnsi/ethereum)
-- [Rapport de la Maison-Blanche sur les blockchains de preuve de travail](https://web.archive.org/web/20221109005700/https://www.whitehouse.gov/wp-content/uploads/2022/09/09-2022-Crypto-Assets-and-Climate-Report.pdf)
-- [Les Émissions d'Ethereum : une estimation de bas à haut](https://kylemcdonald.github.io/ethereum-emissions/) - _Kyle McDonald_
-- [Index de Consommation d'Énergie d'Ethereum](https://digiconomist.net/ethereum-energy-consumption/) - _Digiconomist_
+- [Cambridge Blockchain Network Sustainability Index](https://ccaf.io/cbnsi/ethereum)
+- [Rapport de la Maison Blanche sur les blockchains à preuve de travail](https://web.archive.org/web/20221109005700/https://www.whitehouse.gov/wp-content/uploads/2022/09/09-2022-Crypto-Assets-and-Climate-Report.pdf)
+- [Émissions d'Ethereum : une estimation ascendante](https://kylemcdonald.github.io/ethereum-emissions/) - _Kyle McDonald_
+- [Indice de consommation d'énergie d'Ethereum](https://digiconomist.net/ethereum-energy-consumption/) - _Digiconomist_
- [ETHMerge.com](https://ethmerge.com/) - _[@InsideTheSim](https://twitter.com/InsideTheSim)_
- [La Fusion - Implications sur la consommation d'électricité et l'empreinte carbone du réseau Ethereum](https://carbon-ratings.com/eth-report-2022) - _CCRI_
-- [Consommation énergétique d'Ethereum](https://mirror.xyz/jmcook.eth/ODpCLtO4Kq7SCVFbU4He8o8kXs418ZZDTj0lpYlZkR8)
+- [Consommation d'énergie d'Ethereum](https://mirror.xyz/jmcook.eth/ODpCLtO4Kq7SCVFbU4He8o8kXs418ZZDTj0lpYlZkR8)
## Sujets connexes {#related-topics}
-- [La vision d'Ethereum](/roadmap/vision/)
-- [La chaîne phare](/roadmap/beacon-chain)
+- [La Chaîne Phare](/roadmap/beacon-chain)
- [La Fusion](/roadmap/merge/)
diff --git a/public/content/translations/fr/eth/supply/index.md b/public/content/translations/fr/eth/supply/index.md
new file mode 100644
index 00000000000..8b33b3d1ef3
--- /dev/null
+++ b/public/content/translations/fr/eth/supply/index.md
@@ -0,0 +1,80 @@
+---
+title: "Comprendre l'offre et l'émission d'ETH"
+description: "Un guide adapté aux débutants sur l'offre et l'émission d'ETH, couvrant des concepts clés tels que les EIP, PoS et EIP-1559."
+lang: fr
+---
+
+# Offre et émission d'ETH {#eth-supply-and-issuance}
+
+## Prérequis {#prerequisites}
+
+Cet article est écrit pour les débutants sans connaissances préalables. Cependant, pour bien comprendre le sujet, il est utile d'avoir une compréhension de base des concepts tels que [les Propositions d'amélioration d'Ethereum (EIPs)](/eips/#introduction-to-ethereum-improvement-proposals), [la Preuve de travail (PoW)](/developers/docs/consensus-mechanisms/pow/), [la Preuve d'enjeu (PoS)](/developers/docs/consensus-mechanisms/pos/) et [la mise à niveau London](/ethereum-forks/#london).
+
+## Combien de jetons ETH existe-t-il aujourd'hui ? {#current-eth-supply}
+
+L'offre totale d'ETH est dynamique et change constamment en raison de deux facteurs principaux :
+
+1. **Émission de la preuve d'enjeu (PoS)** : De nouveaux ETH sont créés comme récompenses pour les validateurs qui sécurisent le réseau
+2. **Brûlage EIP-1559** : Une partie des frais de transaction est définitivement retirée de la circulation
+
+Vous pouvez suivre l'offre actuelle et ces changements en temps réel sur des plateformes comme [Ultrasound Money](https://ultrasound.money).
+
+L'offre et l'émission d'Ethereum sont des paramètres essentiels pour comprendre la santé et l'avenir du réseau. Mais que signifie exactement l'émission d'ETH ? Décomposons cela.
+
+## Pourquoi l'offre et l'émission d'ETH sont importantes {#why-eth-supply-matters}
+
+Dans la finance traditionnelle, les banques centrales contrôlent l'offre de monnaie, souvent en imprimant davantage pour stimuler les économies. Ethereum, en revanche, fonctionne selon un système transparent et prévisible régi par son code. Savoir combien d'ETH existent et à quelle vitesse de nouveaux ETH sont émis aide à :
+
+- **Renforcer la confiance**: La communauté Ethereum peut vérifier les données d'offre et d'émission directement sur la blockchain.
+- **Comprendre la valeur**: La relation entre l'émission et les taux de brûlage d'ETH affecte l'inflation ou la déflation de l'ETH, influençant sa valeur au fil du temps.
+- **Suivre la santé du réseau** : Les changements dans l'émission et les taux de brûlage reflètent l'activité et la sécurité du réseau.
+
+## Qu'est-ce que l'émission d'ETH ? {#eth-issuance}
+
+L'émission d'ETH désigne le processus de création de nouveaux ETH comme récompenses pour les validateurs qui sécurisent le réseau Ethereum. Elle est distincte de l'offre totale, qui représente la quantité totale d'ETH en circulation.
+
+### En termes simples :
+
+- **L'émission** ajoute de nouveaux ETH au réseau.
+- **Le brûlage** (introduit par EIP-1559) retire des ETH du réseau en détruisant une partie des frais de transaction.
+
+Ces deux forces déterminent si l'offre d'Ethereum croît (inflationniste) ou diminue (déflationniste) au fil du temps.
+
+## Offre et émission d'ETH aujourd'hui {#eth-supply-today}
+
+Le système de preuve d'enjeu (PoS) d'Ethereum a considérablement réduit l'émission d'ETH par rapport à son ancien modèle de preuve de travail (PoW). Les validateurs, qui immobilisent des ETH pour sécuriser le réseau, reçoivent des ETH comme récompenses. Vous pouvez voir le taux d'émission actuel sur [Ultrasound Money](https://ultrasound.money).
+
+Cependant, ce nombre est dynamique. Grâce à EIP-1559, lorsque l'activité du réseau est élevée, les taux de brûlage d'ETH peuvent dépasser l'émission, créant un effet déflationniste. Par exemple, pendant les périodes de forte demande, comme les lancements de NFT ou l'activité DeFi, plus d'ETH peut être brûlé qu'émis.
+
+### Outils pour suivre l'offre et l'émission d'ETH :
+
+- [Ultrasound Money](https://ultrasound.money) - Suivi en temps réel de l'offre, de l'émission et des taux de brûlage d'ETH
+- [Etherscan](https://etherscan.io) - Explorateur de blocs avec des paramètres d'offre
+
+## Facteurs influençant l'offre et l'émission future d'ETH {#future-eth-supply}
+
+L'offre future d'Ethereum n'est pas fixe, elle dépend de plusieurs variables :
+
+1. **Participation au staking** :
+ - Plus de validateurs rejoignant le réseau signifie que plus de récompenses en ETH sont distribuées.
+ - Moins de validateurs participants peut réduire l'émission.
+ - En savoir plus sur [le staking](/staking/).
+
+2. **Activité du réseau**:
+ - Des volumes de transactions élevés entraînent le brûlage de plus d'ETH, pouvant compenser ou dépasser l'émission.
+ - En savoir plus sur [les frais de gaz](/developers/docs/gas/) et leur impact sur le brûlage.
+
+3. **Mises à jour du protocole**:
+ - Les futures modifications du code d'Ethereum pourraient ajuster les récompenses de staking ou les mécanismes de brûlage, influençant davantage la dynamique de l'offre.
+ - Restez informé avec [la feuille de route Ethereum](/roadmap/).
+
+## Récapitulatif : Offre, émission et perspectives d'ETH {#recap}
+
+Voici un résumé rapide de ce que vous devez savoir sur l'offre et l'émission d'ETH :
+
+- **Offre d'ETH**: Dynamique et en constante évolution, traçable en temps réel via des outils comme [Ultrasound Money](https://ultrasound.money)
+- **Émission sous PoS** : Considérablement réduite par rapport à PoW, avec des récompenses attribuées aux validateurs. Voir les taux actuels sur [Ultrasound Money](https://ultrasound.money)
+- **Rôle d'EIP-1559** : Le brûlage d'ETH peut rendre le réseau déflationniste pendant les périodes de forte activité
+- **Tendances futures** : La participation au staking, la demande du réseau et les mises à jour du protocole façonneront l'offre d'ETH
+
+Comprendre l'émission d'ETH aide à démystifier la valeur d'Ethereum et son potentiel en tant qu'actif déflationniste et décentralisé. Pour plus d'informations détaillées sur l'impact de la Fusion sur l'offre d'ETH, consultez notre analyse détaillée (/roadmap/merge/issuance/). Curieux de l'avenir d'ETH ? Plongez plus loin avec des outils comme [Ultrasound Money](https://ultrasound.money) ou explorez nos [guides sur le staking](/staking/).
\ No newline at end of file
diff --git a/public/content/translations/fr/ethereum-forks/index.md b/public/content/translations/fr/ethereum-forks/index.md
index 0883696374e..48bd87049c0 100644
--- a/public/content/translations/fr/ethereum-forks/index.md
+++ b/public/content/translations/fr/ethereum-forks/index.md
@@ -1,79 +1,83 @@
---
-title: Histoire et fourches d'Ethereum
-description: Historique de la blockchain Ethereum, y compris les avancées majeures, les événements clés et les fourches.
+title: "Chronologie de toutes les fourches Ethereum (de 2014 à aujourd'hui)"
+description: "Historique de la blockchain Ethereum, y compris les avancées majeures, les versions et les fourches."
lang: fr
sidebarDepth: 1
---
-# Historique d'Ethereum {#the-history-of-ethereum}
+# Chronologie de toutes les fourches Ethereum (de 2014 à aujourd'hui) {#the-history-of-ethereum}
Chronologie de tous les jalons, fourches et mises à jour majeures de la blockchain Ethereum.
-
+
-Les forks existent lorsque des mises à jour ou des changements techniques majeurs doivent être effectués sur le réseau – ils proviennent généralement des [Propositions d'amélioration d'Ethereum (EIP)](/eips/) et modifient les « règles » du protocole.
+Les forks sont nécessaires lorsque des mises à niveau ou des modifications techniques majeures doivent être apportées au réseau. Elles proviennent généralement de [propositions d'amélioration d'Ethereum (EIP)](/eips/) et modifient les « règles » du protocole.
-Lorsque des mises à niveau des logiciels traditionnels contrôlés centralement sont nécessaires, la société publie simplement une nouvelle version pour l'utilisateur final. Les blockchains fonctionnent différemment parce qu'il n'existe pas de propriété centralisée. [Les clients Ethereum](/developers/docs/nodes-and-clients/) doivent mettre à jour leur logiciel pour implémenter les nouvelles règles de la fourche. En outre, les créateurs de blocs (les "mineurs" dans l'univers des preuves de travail, les "validateurs" dans celui des preuves d'enjeu) et les nœuds doivent créer des blocs et les valider conformément aux nouvelles règles. [En savoir plus sur les mécanismes de consensus](/developers/docs/consensus-mechanisms/)
+Lorsque des mises à niveau des logiciels traditionnels contrôlés centralement sont nécessaires, la société publie simplement une nouvelle version pour l'utilisateur final. Les blockchains fonctionnent différemment parce qu'il n'existe pas de propriété centralisée. Les [clients Ethereum](/developers/docs/nodes-and-clients/) doivent mettre à jour leur logiciel pour implémenter les nouvelles règles des fourches. En outre, les créateurs de blocs (les "mineurs" dans l'univers des preuves de travail, les "validateurs" dans celui des preuves d'enjeu) et les nœuds doivent créer des blocs et les valider conformément aux nouvelles règles. [En savoir plus sur les mécanismes de consensus](/developers/docs/consensus-mechanisms/)
Ces changements de règles peuvent créer une scission temporaire dans le réseau. De nouveaux blocs peuvent être produits selon les nouvelles règles ou les anciennes. Les fourches font généralement l'objet d'un accord à l'avance afin que les clients adoptent les changements à l'unisson et que la fourche contenant les mises à niveau devienne la chaîne principale. Toutefois, dans de rares cas, les désaccords sur les forks peuvent causer une séparation permanente du réseau – plus particulièrement la création d'Ethereum Classic avec le fork DAO .
-
-
+
Le logiciel qui sous-tend Ethereum est composé de deux moitiés, connues sous le nom de [couche d'exécution](/glossary/#execution-layer) et de [couche de consensus](/glossary/#consensus-layer).
-**Nom des mises à niveau de la couche d'exécution**
-
-Depuis 2021, les mises à niveau de la **couche d'exécution** sont nommées selon les noms de villes ayant accueilli [les précédents Devcon](https://devcon.org/en/past-events/), dans l'ordre chronologique :
-
-| Nom de la mise à niveau | Année du Devcon | Numéro du Devcon | Date de mise à niveau |
-| ----------------------- | --------------- | ---------------- | --------------------- |
-| Berlin | 2014 | 0 | 15 avril 2021 |
-| Londres | 2015 | I | 5 août 2021 |
-| Shanghai | 2016 | II | 12 avril 2023 |
-| Cancun | 2017 | III | 13 mars 2024 |
-| **Prague** | 2018 | IV | À définir – Prochaine |
-| _Osaka_ | 2019 | V | À définir |
-| _Bogota_ | 2022 | VI | À définir |
-| _Bangkok_ | 2024 | VII | À définir |
-
-**Nom des mises à niveau de la couche de consensus**
-
-Depuis le lancement de la [chaîne phare](/glossary/#beacon-chain), les mises à niveau de la **couche de consensus** sont nommées d'après des étoiles célestes, en suivant l'ordre alphabétique :
-
-| Nom de la mise à niveau | Date de mise à niveau |
-| ------------------------------------------------------------ | ---------------------- |
-| Genèse de la Beacon Chain | 1er décembre 2020 |
-| [Altair](https://fr.wikipedia.org/wiki/Altair) | 27 octobre 2021 |
-| [Bellatrix](https://fr.wikipedia.org/wiki/Bellatrix) | 6 septembre 2022 |
-| [Capella](https://fr.wikipedia.org/wiki/Capella) | 12 avril 2023 |
-| [Deneb](https://fr.wikipedia.org/wiki/Deneb) | 13 mars 2024 |
-| [**Electra**]() | À définir - Prochaine|
-| [_Fulu_]() | À déterminer |
-
-**Dénomination combiné**
-
-Initialement, les mises à niveau des couches d'exécution et de consensus n'étaient pas déployées simultanément. Mais depuis [La Fusion](/roadmap/merge/) réalisée en 2022, elles sont déployées simultanément. Ainsi, des termes familiers sont apparus pour simplifier les références à ces mises à niveau en utilisant un seul terme conjoint. Cela a commencé avec la mise à niveau _Shanghai-Capella_, communément appelée "**Shapella**", et se poursuit avec la mise à niveau _Cancun-Deneb_(**Dencun**), puis la mise à niveau Prague-Electra_ (**Pectra**).
-
-| Mise à niveau de l'exécution | Mise à niveau du consensus | Nom abrégé |
-| ----------------- | ----------------- | ---------- |
-| Shanghai | Capella | "Shapella" |
-| Cancun | Deneb | "Dencun" |
-| Prague | Electra | "Pectra" |
-| Osaka | Fulu | "Fusaka" |
-
+**Dénomination de la mise à niveau de l'exécution**
+
+Depuis 2021, les mises à niveau de la **couche d’exécution** sont nommées d'après les noms des villes des [précédents lieux de la Devcon](https://devcon.org/en/past-events/) par ordre chronologique :
+
+| Nom de la mise à niveau | Année de la Devcon | Numéro de la Devcon | Date de la mise à niveau |
+| ----------------------- | ------------------ | ------------------- | ---------------------------- |
+| Berlin | 2014 | 0 | 15 avr. 2021 |
+| London | 2015 | I | 5 août 2021 |
+| Shanghai | 2016 | II | 12 avr. 2023 |
+| Cancun | 2017 | III | 13 mars 2024 |
+| **Prague** | 2018 | IV | À déterminer - Prochaine |
+| _Osaka_ | 2019 | V | À déterminer |
+| _Bogota_ | 2022 | VI | À déterminer |
+| _Bangkok_ | 2024 | VII | À déterminer |
+
+**Dénomination de la mise à niveau du consensus**
+
+Depuis le lancement de la [Chaîne phare](/glossary/#beacon-chain), les mises à niveau de la **couche de consensus** sont nommées d'après des étoiles dont les lettres suivent l'ordre alphabétique :
+
+| Nom de la mise à niveau | Date de la mise à niveau |
+| ------------------------------------------------------------- | ----------------------------- |
+| Origine de la chaîne phare | 1er déc. 2020 |
+| [Altair](https://en.wikipedia.org/wiki/Altair) | 27 oct. 2021 |
+| [Bellatrix](https://en.wikipedia.org/wiki/Bellatrix) | 6 sept. 2022 |
+| [Capella](https://en.wikipedia.org/wiki/Capella) | 12 avr. 2023 |
+| [Deneb](https://en.wikipedia.org/wiki/Deneb) | 13 mars 2024 |
+| [**Electra**](https://en.wikipedia.org/wiki/Electra_\(star\)) | À déterminer - Prochaine |
+| [_Fulu_](https://en.wikipedia.org/wiki/Fulu_\(star\)) | À déterminer |
+
+**Dénomination combinée**
+
+Les mises à niveau de l'exécution et du consensus ont d'abord été déployées à des moments différents, mais après [La Fusion](/roadmap/merge/) en 2022, elles ont été déployées simultanément. Ainsi, des termes familiers sont apparus pour simplifier les références à ces mises à niveau en utilisant un seul terme conjoint. Cela a commencé avec la mise à niveau _Shanghai-Capella_, communément appelée "**Shapella**", et se poursuit avec la mise à niveau _Cancun-Deneb_(**Dencun**), puis la mise à niveau Prague-Electra_ (**Pectra**).
+
+| Mise à niveau de l'exécution | Mise à niveau du consensus | Nom abrégé |
+| ---------------------------- | -------------------------- | ------------ |
+| Shanghai | Capella | « Shapella » |
+| Cancun | Deneb | « Dencun » |
+| Prague | Electra | "Pectra" |
+| Osaka | Fulu | « Fusaka » |
-Passer directement à l'information sur certaines des mises à jour passées particulièrement importantes : [La Chaîne phare](/roadmap/beacon-chain/); [La Fusion](/roadmap/merge/); et [EIP-1559](#london)
+Accédez directement aux informations sur certaines des mises à niveau passées particulièrement importantes : [la Chaîne phare](/roadmap/beacon-chain/) ; [La Fusion](/roadmap/merge/) ; et [EIP-1559](#london)
-Vous cherchez les prochaines mises à jour de protocole ? [Découvrez les mises à jour à venir sur la feuille de route Ethereum](/roadmap/).
+Vous cherchez les prochaines mises à jour de protocole ? [En savoir plus sur les mises à niveau à venir sur la feuille de route d'Ethereum](/roadmap/).
## 2025 {#2025}
-### Prague-Electra ("Pectra") {#pectra}
+### Fulu-Osaka (« Fusaka ») {#fusaka}
+
+
+
+[En savoir plus sur Fusaka](/roadmap/fusaka/)
+
+### Prague-Electra (« Pectra ») {#pectra}
@@ -81,9 +85,9 @@ La mise à jour Prague-Electra (« Pectra ») a introduit plusieurs amélioratio
La mise en jeu a été améliorée grâce à l’introduction de comptes de capitalisation de validateurs et à un meilleur contrôle des fonds mis en jeu via l’adresse de retrait d’exécution. L'EIP-7251 a augmenté le solde effectif maximal pour un validateur unique à 2048 ETH, améliorant ainsi l'efficacité du capital pour les validateurs. L'EIP-7002 a permis à un compte d'exécution de déclencher en toute sécurité des actions de validation, comme la sortie ou le retrait partiel des fonds, améliorant l’expérience des validateurs d'ETH tout en renforçant la responsabilité des opérateurs de nœuds.
-D'autres aspects de la mise à jour avaient pour objectif d'améliorer l'expérience des utilisateurs réguliers. L’EIP-7702 a introduit la possibilité pour un compte classique ne disposant pas de contrat intelligent ([EOA](/glossary/#eoa)) d’exécuter du code de manière similaire à un contrat intelligent. Cela a débloqué une multitude de nouvelles fonctionnalités pour les comptes Ethereum traditionnels, telles que le regroupement de transactions, le parrainage des frais de gaz, l’authentification alternative, le contrôle programmable des dépenses, des mécanismes de récupération de compte, et bien plus encore.
+D'autres aspects de la mise à jour avaient pour objectif d'améliorer l'expérience des utilisateurs réguliers. L'EIP-7702 a permis à un compte ordinaire sans contrat intelligent ([EOA](/glossary/#eoa)) d'exécuter du code de manière similaire à un contrat intelligent. Cela a débloqué une multitude de nouvelles fonctionnalités pour les comptes Ethereum traditionnels, telles que le regroupement de transactions, le parrainage des frais de gaz, l’authentification alternative, le contrôle programmable des dépenses, des mécanismes de récupération de compte, et bien plus encore.
-
+
Meilleure expérience utilisateur :
@@ -110,29 +114,28 @@ Améliorations de l'efficacité et de la sécurité du protocole :
EIP-2935 - Enregistrer les hachages des blocs historiques dans l'état
EIP-7549 : Déplacer l'index du comité en dehors de l'Attestation
-
- [Pectra.wtf](https://pectra.wtf)
-- [Comment Pectra améliorera l'expérience de mise en jeu](https://www.kiln.fi/post/next-ethereum-upgrade-how-pectra-will-enhance-the-staking-experience)
+- [Comment Pectra améliorera l'expérience de la mise en jeu](https://www.kiln.fi/post/next-ethereum-upgrade-how-pectra-will-enhance-the-staking-experience)
- [Lire les spécifications de la mise à niveau Electra](https://github.com/ethereum/consensus-specs/blob/dev/specs/electra/)
-- [FAQ Prague-Electra ("Pectra")](/roadmap/pectra/)
+- [FAQ sur Prague-Electra (« Pectra »)](/roadmap/pectra/)
## 2024 {#2024}
-### Cancun-Deneb ("Dencun") {#dencun}
+### Cancun-Deneb (« Dencun ») {#dencun}
#### Résumé de Cancun {#cancun-summary}
-La mise à niveau Cancun contient un ensemble d'améliorations pour l'_exécution_ d'Ethereum destiné à l'amélioration de l'évolutivité, en association avec les mises à niveau de consensus Deneb.
+La mise à niveau Cancun contient un ensemble d'améliorations de l'_exécution_ d'Ethereum visant à améliorer l'évolutivité, en tandem avec les mises à niveau du consensus Deneb.
-Cela inclut notamment EIP-4844, connu comme **Proto-Danksharding**, qui réduit significativement le coût du stockage de données pour les rollups de seconde couche. Cela est réalisé grâce à l'introduction de "blobs" de données qui permettent aux rollups d'envoyer des données sur le Réseau principal pendant une courte période de temps. Il en résulte une diminution significative des frais de transactions pour les utilisateurs de rollups de seconde couche.
+Elle inclut notamment l'EIP-4844, connu sous le nom de **Proto-Danksharding**, qui diminue de manière significative le coût du stockage des données pour les rollups de couche 2. Cela est réalisé grâce à l'introduction de "blobs" de données qui permettent aux rollups d'envoyer des données sur le Réseau principal pendant une courte période de temps. Il en résulte une diminution significative des frais de transactions pour les utilisateurs de rollups de seconde couche.
-
+
EIP-1153 - Codes d'opération de stockage transitoire
@@ -142,13 +145,12 @@ Cela inclut notamment EIP-4844, connu comme **Proto-Danksharding**, qui réduit
EIP-6780 - SELFDESTRUCT uniquement dans la même transaction
EIP-7516 - BLOBBASEFEE opcode
-
-- [Les rollups de couche 2](/layer-2/)
+- [Rollups de couche 2](/layer-2/)
- [Proto-Danksharding](/roadmap/scaling/#proto-danksharding)
- [Danksharding](/roadmap/danksharding/)
-- [Lire les spécifications de la mise à jour Cancun](https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/cancun.md)
+- [Lire la spécification de la mise à niveau Cancun](https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/cancun.md)
#### Résumé de Deneb {#deneb-summary}
@@ -156,9 +158,9 @@ La mise à niveau Deneb contient un ensemble d'améliorations du _consensus_ d'E
Les "messages de sortie volontaire" n'expirent plus, donnant ainsi plus de contrôle aux utilisateurs mettant en jeu leurs fonds auprès d'un opérateur de nœud tiers. Avec ce message de sortie signé, les validateurs peuvent déléguer les opérations de noeud tout en maintenant leur capacité de se retirer en toute sécurité et de retirer leurs fonds à tout moment, sans avoir à demander la permission à quiconque.
-EIP-7514 apporte une restriction de la distribution d'ETH en limitant le taux de "churn", afin que les validateurs rejoignent le réseau par groupe de huit (8) maximum pour chaque période. Dans la mesure où la distribution de l'ETH est proportionnelle à la totalité des ETH mis en jeu, limiter le nombre de validateurs bloque la _croissance_ d'ETH nouvellement distribués, tout en réduisant les besoins en matériel informatique pour les opérateurs de noeud, aidant ainsi la décentralisation.
+EIP-7514 apporte une restriction de la distribution d'ETH en limitant le taux de "churn", afin que les validateurs rejoignent le réseau par groupe de huit (8) maximum pour chaque période. Comme l'émission d'ETH est proportionnelle au total des ETH mis en jeu, la limitation du nombre de validateurs qui rejoignent le réseau plafonne le _taux de croissance_ des nouveaux ETH émis, tout en réduisant les exigences matérielles pour les opérateurs de nœuds, ce qui favorise la décentralisation.
-
+
EIP-4788 - Racine du bloc phare dans l'EVM
@@ -167,17 +169,16 @@ EIP-7514 apporte une restriction de la distribution d'ETH en limitant le taux de
EIP-7045 - Augmentation de l'attestation maximale du créneau d'inclusion
EIP-7514 - Ajout d'une limite maximale de changement par époque
-
-- [Lire les spécifications de la mise à jour Deneb](https://github.com/ethereum/consensus-specs/blob/dev/specs/deneb/)
-- [FAQ Cancun-Deneb ("Dencun")](/roadmap/dencun/)
+- [Lire les spécifications de la mise à niveau Deneb](https://github.com/ethereum/consensus-specs/blob/dev/specs/deneb/)
+- [FAQ sur Cancun-Deneb (« Dencun »)](/roadmap/dencun/)
## 2023 {#2023}
-### Shanghai-Capella ("Shapella") {#shapella}
+### Shanghai-Capella (« Shapella ») {#shapella}
@@ -185,7 +186,7 @@ EIP-7514 apporte une restriction de la distribution d'ETH en limitant le taux de
La mise à jour Shanghai a ouvert la voie à des opérations de retrait et de basculement vers la couche d'exécution Couplée à la mise à jour Capella, cette mise à jour permet aux blocs d'accepter des opérations de retrait, permettant ainsi aux validateurs de retirer leur ETH de la chaîne phare et de le basculer vers la couche d'exécution.
-
+
EIP-3651 – Démarre l'adresse COINBASE
@@ -194,10 +195,9 @@ La mise à jour Shanghai a ouvert la voie à des opérations de retrait et de ba
EIP-4895 – Retraits de la chaîne phare en tant qu'opérations
L'EIP-6049 - Désapprouve SELFDESTRUCT
-
-- [Lire les spécificités de la mise à jour Shanghai](https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/shanghai.md)
+- [Lire la spécification de la mise à niveau Shanghai](https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/shanghai.md)
#### Résumé de Capella {#capella-summary}
@@ -207,8 +207,8 @@ Cette mise à jour de la couche de consensus a permis aux validateurs, qui n'ava
La mise à jour a également permis la mise en place d'une fonctionnalité de balayage automatique de compte, qui traite continuellement les comptes de validateur pour tout paiement de récompenses ou retrait intégral disponible.
-- [En savoir plus sur les retraits de mise en jeu](/staking/withdrawals/).
-- [Lire les spécifications de la mise à jour Capella](https://github.com/ethereum/consensus-specs/blob/dev/specs/capella/)
+- [En savoir plus sur les retraits](/staking/retraits/).
+- [Lire les spécifications de la mise à niveau Capella](https://github.com/ethereum/consensus-specs/blob/dev/specs/capella/)
@@ -220,17 +220,16 @@ La mise à jour a également permis la mise en place d'une fonctionnalité de ba
#### Résumé {#paris-summary}
-La mise à jour de Paris a été déclenchée par le passage de la blockchain de preuve de travail à une [difficulté totale finale](/glossary/#terminal-total-difficulty) de 5875000000000000000. Cela s'est produit au bloc 15537393 le 15 septembre 2022, déclenchant la mise à jour du bloc suivant. Paris était la transition vers la [La Fusion](/roadmap/merge/) : sa principale fonctionnalité était de désactiver l'algorithme de minage [preuve de travail](/developers/docs/consensus-mechanisms/pow) et sa logique de consensus associée et d'activer la [preuve d'enjeu](/developers/docs/consensus-mechanisms/pos) à la place. Paris lui-même était une mise à jour vers les [clients d'exécution](/developers/docs/nodes-and-clients/#execution-clients) (équivalent de Bellatrix sur la couche de consensus) qui leur permettait de recevoir des instructions depuis leurs [clients de consensus](/developers/docs/nodes-and-clients/#consensus-clients) connectés. Cela nécessitait d'activer un nouvel ensemble de méthodes internes d'API, collectivement connues sous le nom d'[API Moteur](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md). C'est sans doute la mise à jour la plus significative de l'histoire d'Ethereum depuis [Homestead](#homestead) !
+La mise à niveau Paris a été déclenchée par la blockchain en preuve de travail qui a dépassé une [difficulté totale terminale](/glossary/#terminal-total-difficulty) de 58750000000000000000000. Cela s'est produit au bloc 15537393 le 15 septembre 2022, déclenchant la mise à jour du bloc suivant. Paris était la transition de [La Fusion](/roadmap/merge/) - sa principale caractéristique était la désactivation de l'algorithme de minage par [preuve de travail](/developers/docs/consensus-mechanisms/pow) et de la logique de consensus associée, et l'activation de la [preuve d'enjeu](/developers/docs/consensus-mechanisms/pos) à la place. Paris elle-même était une mise à niveau des [clients d'exécution](/developers/docs/nodes-and-clients/#execution-clients) (équivalente à Bellatrix sur la couche de consensus) qui leur permettait de recevoir des instructions de leurs [clients de consensus](/developers/docs/nodes-and-clients/#consensus-clients) connectés. Cela a nécessité l'activation d'un nouvel ensemble de méthodes API internes, collectivement connues sous le nom d'[Engine API](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md). C'était sans doute la mise à niveau la plus importante de l'histoire d'Ethereum depuis [Homestead](#homestead) !
-- [Lisez la spécification de la mise à jour Paris](https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/paris.md)
+- [Lire la spécification de la mise à niveau Paris](https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/paris.md)
-
+
EIP-3675 – Mise à niveau du consensus vers la preuve d'enjeu
L'EIP-4399 – Supplante le code d'opération DIFFICULTY par PREVRANDAO
-
---
@@ -241,9 +240,9 @@ La mise à jour de Paris a été déclenchée par le passage de la blockchain de
#### Résumé {#bellatrix-summary}
-La mise à jour de Bellatrix était la seconde mise à jour planifiée pour la [Chaîne Phare](/roadmap/beacon-chain), préparant la chaîne à [La Fusion](/roadmap/merge/). Elle porte les pénalités de validateur à leurs valeurs maximales en cas d'inactivité ou d'infractions sanctionnables. Bellatrix inclut également une mise à jour des règles de choix de fourche pour préparer la chaîne à La Fusion et à la transition du dernier bloc de preuve de travail vers le premier bloc de preuve d'enjeu. Cela inclut la sensibilisation des clients de consensus à la [difficulté totale du terminal](/glossary/#terminal-total-difficulty) de 5875000000000000000.
+La mise à niveau Bellatrix était la deuxième mise à niveau planifiée pour la [Chaîne phare](/roadmap/beacon-chain), préparant la chaîne pour [La Fusion](/roadmap/merge/). Elle porte les pénalités de validateur à leurs valeurs maximales en cas d'inactivité ou d'infractions sanctionnables. Bellatrix inclut également une mise à jour des règles de choix de fourche pour préparer la chaîne à La Fusion et à la transition du dernier bloc de preuve de travail vers le premier bloc de preuve d'enjeu. Cela inclut la sensibilisation des clients de consensus à la [difficulté totale terminale](/glossary/#terminal-total-difficulty) de 58750000000000000000000.
-- [Lire les spécifications de la mise à niveau Bellatrix](https://github.com/ethereum/consensus-specs/tree/dev/specs/bellatrix)
+- [Lire la spécification de la mise à niveau Bellatrix](https://github.com/ethereum/consensus-specs/tree/dev/specs/bellatrix)
---
@@ -253,16 +252,15 @@ La mise à jour de Bellatrix était la seconde mise à jour planifiée pour la [
#### Résumé {#gray-glacier-summary}
-La mise à niveau Gray Glacier a retardé le déclenchement de la [bombe de difficulté](/glossary/#difficulty-bomb) de trois mois. Il s'agit de la seule modification apportée par cette mise à niveau. En essence, elle est donc très semblable aux mises à niveau [Arrow Glacier](#arrow-glacier) et [Muir Glacier](#muir-glacier). Des changements similaires avaient également été effectués lors des mises à niveau [Byzantium](#byzantium), [Constantinople](#constantinople) et [London](#london).
+La mise à niveau du réseau Gray Glacier a repoussé la [bombe de difficulté](/glossary/#difficulty-bomb) de trois mois. C'est le seul changement introduit dans cette mise à niveau, et il est de nature similaire aux mises à niveau [Arrow Glacier](#arrow-glacier) et [Muir Glacier](#muir-glacier). Des changements similaires ont été effectués sur les mises à niveau du réseau [Byzantium](#byzantium), [Constantinople](#constantinople) et [London](#london).
-- [Blog de l'Ethereum Foundation - Annonce de la mise à niveau Gray Glacier](https://blog.ethereum.org/2022/06/16/gray-glacier-announcement/)
+- [Blog de l'EF - Annonce de la mise à niveau Gray Glacier](https://blog.ethereum.org/2022/06/16/gray-glacier-announcement/)
-
+
EIP-5133 – repousse l'explosion de la bombe de difficulté d'ici à septembre 2022
-
@@ -275,17 +273,16 @@ La mise à niveau Gray Glacier a retardé le déclenchement de la [bombe de diff
#### Résumé {#arrow-glacier-summary}
-La mise à niveau Arrow Glacier a retardé le déclenchement de la [bombe de difficulté](/glossary/#difficulty-bomb) de plusieurs mois. Il s'agit de la seule modification apportée par cette mise à niveau. En essence, elle est donc très semblable à la mise à niveau [Muir Glacier](#muir-glacier). Des changements similaires avaient également été effectués lors des mises à niveau [Byzantium](#byzantium), [Constantinople](#constantinople) et [London](#london).
+La mise à niveau du réseau Arrow Glacier a repoussé la [bombe de difficulté](/glossary/#difficulty-bomb) de plusieurs mois. C'est le seul changement introduit dans cette mise à niveau, et il est de nature similaire à la mise à niveau [Muir Glacier](#muir-glacier). Des changements similaires ont été effectués sur les mises à niveau du réseau [Byzantium](#byzantium), [Constantinople](#constantinople) et [London](#london).
-- [Blog de l'Ethereum Foundation - Annonce de la mise à niveau Arrow Glacier](https://blog.ethereum.org/2021/11/10/arrow-glacier-announcement/)
-- [Ethereum Cat Herders - Mise à niveau Ethereum Arrow Glacier](https://medium.com/ethereum-cat-herders/ethereum-arrow-glacier-upgrade-e8d20fa4c002)
+- [Blog de l'EF - Annonce de la mise à niveau Arrow Glacier](https://blog.ethereum.org/2021/11/10/arrow-glacier-announcement/)
+- [Ethereum Cat Herders - Mise à niveau Arrow Glacier d'Ethereum](https://medium.com/ethereum-cat-herders/ethereum-arrow-glacier-upgrade-e8d20fa4c002)
-
+
EIP-4345 – reporte la bombe de difficulté jusqu'en juin 2022
-
---
@@ -296,15 +293,15 @@ La mise à niveau Arrow Glacier a retardé le déclenchement de la [bombe de dif
#### Résumé {#altair-summary}
-La mise à niveau Altair était la première mise à niveau répertoriée pour la [chaîne phare](/roadmap/beacon-chain). La prise en charge des « comités de synchronisation » a été ajoutée, autorisant d'une part les clients légers et augmentant d'autre part les pénalités d'inactivité et de délestage des validateurs à mesure que le système évoluait vers la fusion.
+La mise à niveau Altair était la première mise à niveau planifiée pour la [Chaîne phare](/roadmap/beacon-chain). La prise en charge des « comités de synchronisation » a été ajoutée, autorisant d'une part les clients légers et augmentant d'autre part les pénalités d'inactivité et de délestage des validateurs à mesure que le système évoluait vers la fusion.
-- [Lire les spécifications de la mise à niveau Altair](https://github.com/ethereum/consensus-specs/tree/dev/specs/altair)
+- [Lire la spécification de la mise à niveau Altair](https://github.com/ethereum/consensus-specs/tree/dev/specs/altair)
-#### Anecdote ! {#altair-fun-fact}
+#### Anecdote ! {#altair-fun-fact}
Altair a été la première mise à jour majeure du réseau à disposer d'un délai de mise en œuvre précis. Toutes les mises à niveau antérieures étaient basées sur un numéro de bloc déclaré sur la chaîne de preuve de travail, dans laquelle les durées de blocage varient. La chaîne phare ne nécessite pas de résoudre de preuve de travail, mais fonctionne sur la base d'un système de périodes composées de 32 créneaux de 12 secondes pendant lesquels les validateurs peuvent proposer des blocs. C'est pourquoi nous savions exactement quand nous atteindrions l'époque 74 240 et la date de sortie d'Altair !
-- [Durée de blocage](/developers/docs/blocks/#block-time)
+- [Temps de bloc](/developers/docs/blocks/#block-time)
---
@@ -314,27 +311,27 @@ Altair a été la première mise à jour majeure du réseau à disposer d'un dé
#### Résumé {#london-summary}
-La mise à niveau London a introduit [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559), qui a réorganisé le marché des frais de transaction, ainsi que des changements dans le traitement des remboursements de gaz et le calendrier [Ice Age](/glossary/#ice-age).
+La mise à niveau London a introduit l'[EIP-1559](https://eips.ethereum.org/EIPS/eip-1559), qui a réformé le marché des frais de transaction, ainsi que des changements dans la manière dont les remboursements de gaz sont gérés et le calendrier de l'[Ice Age](/glossary/#ice-age).
#### Qu'est-ce que la mise à niveau de Londres / EIP-1559 ? {#eip-1559}
Avant la mise à jour de Londres, Ethereum avait des blocs de taille fixe. En période de forte demande du réseau, ces blocs fonctionnaient à pleine capacité. En conséquence, les utilisateurs devaient souvent attendre que la demande diminue pour être inclus dans un bloc, ce qui entraînait une mauvaise expérience utilisateur. La mise à niveau de Londres a permis d'introduire des blocs de taille variable dans Ethereum.
-Dans le cadre de la [mise à niveau de Londres](/ethereum-forks/#london) d'août 2021, le mode de calcul des frais de transaction sur le réseau Ethereum a été modifié. Avant la mise à niveau de Londres, les frais étaient calculés sans distinguer les frais de `base` et de `priority`, comme suit :
+La manière dont les frais de transaction sur le réseau Ethereum étaient calculés a changé avec [la mise à niveau London](/ethereum-forks/#london) d'août 2021. Avant la mise à niveau London, les frais étaient calculés sans séparer les frais de `base` et de `priorité`, comme suit :
Disons qu'Alice devait payer à Marc la somme d'1 ETH. Dans la transaction, la limite de gaz est de 21 000 unités et le prix du gaz est de 200 gwei.
-Les frais totaux auraient été les suivants : `Gas units (limit) * Gas price per unit` (unités de gaz (limite) * Prix du gaz par unité) soit `21 000 * 200 = 4 200 000 gwei` ou 0,0042 ETH
+Le total des frais aurait été de : `Unités de gaz (limite) * Prix du gaz par unité`, c'est-à-dire `21 000 * 200 = 4 200 000 gwei` ou 0,0042 ETH
-La mise en œuvre de [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) dans la mise à niveau de Londres a rendu le mécanisme de frais de transaction plus complexe, mais a rendu les frais de gaz plus prévisibles, ce qui s'est traduit par un marché des frais de transaction plus efficace. Les utilisateurs peuvent soumettre des transactions avec un`maxFeePerGas`, correspondant au montant qu'ils sont prêts à payer pour l'exécution de la transaction, et ce, en sachant qu'ils ne paieront pas plus que le prix du marché pour le gaz (`baseFeePerGas`), et qu'ils se feront rembourser tout excédent, moins leur pourboire.
+La mise en œuvre de l'[EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) dans la mise à niveau London a rendu le mécanisme des frais de transaction plus complexe, mais a rendu les frais de gaz plus prévisibles, ce qui a abouti à un marché des frais de transaction plus efficace. Les utilisateurs peuvent soumettre des transactions avec un `maxFeePerGas` correspondant au montant qu'ils sont prêts à payer pour que la transaction soit exécutée, sachant qu'ils ne paieront pas plus que le prix du marché pour le gaz (`baseFeePerGas`), et que tout supplément, moins leur pourboire, leur sera remboursé.
-Cette vidéo explique l'EIP-1559 et les avantages qu'elle apporte : [EIP-1559 expliqué](https://www.youtube.com/watch?v=MGemhK9t44Q)
+Cette vidéo explique l'EIP-1559 et les avantages qu'il apporte : [EIP-1559 expliqué](https://www.youtube.com/watch?v=MGemhK9t44Q)
-- [Êtes-vous un développeur d'applications décentralisées ? Assurez-vous de mettre à niveau vos bibliothèques et vos outils.](https://github.com/ethereum/execution-specs/blob/master/network-upgrades/london-ecosystem-readiness.md)
-- [Lire l'annonce de l'Ethereum Foundation](https://blog.ethereum.org/2021/07/15/london-mainnet-announcement/)
-- [Lire l'explication du site Ethereum Cat Herders](https://medium.com/ethereum-cat-herders/london-upgrade-overview-8eccb0041b41)
+- [Êtes-vous un développeur de dapps ? Assurez-vous de mettre à niveau vos bibliothèques et vos outils.](https://github.com/ethereum/execution-specs/blob/master/network-upgrades/london-ecosystem-readiness.md)
+- [Lire l'annonce de la Fondation Ethereum](https://blog.ethereum.org/2021/07/15/london-mainnet-announcement/)
+- [Lire l'explication d'Ethereum Cat Herders](https://medium.com/ethereum-cat-herders/london-upgrade-overview-8eccb0041b41)
-
+
EIP-1559 – améliore le marché des frais de transaction
@@ -343,7 +340,6 @@ Cette vidéo explique l'EIP-1559 et les avantages qu'elle apporte : [EIP-1559 ex
EIP-3541 - empêche le déploiement de contrats commençant par 0xEF
EIP-3554 – prévoit de repousser l'Ce Age jusqu'au mois de décembre 2021
-
---
@@ -356,10 +352,10 @@ Cette vidéo explique l'EIP-1559 et les avantages qu'elle apporte : [EIP-1559 ex
La mise à niveau Berlin a optimisé le coût en gaz de certaines actions EVM et augmenté la prise en charge de plusieurs types de transactions.
-- [Lire l'annonce de l'Ethereum Foundation](https://blog.ethereum.org/2021/03/08/ethereum-berlin-upgrade-announcement/)
-- [Lire l'explication du site Ethereum Cat Herders](https://medium.com/ethereum-cat-herders/the-berlin-upgrade-overview-2f7ad710eb80)
+- [Lire l'annonce de la Fondation Ethereum](https://blog.ethereum.org/2021/03/08/ethereum-berlin-upgrade-announcement/)
+- [Lire l'explication d'Ethereum Cat Herders](https://medium.com/ethereum-cat-herders/the-berlin-upgrade-overview-2f7ad710eb80)
-
+
EIP-2565 – revoit à la baisse les coûts en gas ModExp
@@ -367,38 +363,37 @@ La mise à niveau Berlin a optimisé le coût en gaz de certaines actions EVM et
L'EIP-2929 – revoit ses tarifs en gas à la hausse, pour les codes d'opération d'accès à l'état
EIP-2930 – ajoute des listes d'accès facultatives
-
## 2020 {#2020}
-### Origine de la chaîne phare {#beacon-chain-genesis}
+### Genèse de la Chaîne phare {#beacon-chain-genesis}
#### Résumé {#beacon-chain-genesis-summary}
-La [chaîne phare](/roadmap/beacon-chain/) avait besoin de 16 384 dépôts de 32 ETH mis en jeu pour être déployée en toute sécurité. Cela s'est produit le 27 novembre, de sorte que la chaîne phare a commencé à produire des blocs le 1er décembre 2020. Ce fut une première étape importante dans la réalisation de la [vision Ethereum](/roadmap/vision/).
+La [Chaîne phare](/roadmap/beacon-chain/) avait besoin de 16 384 dépôts de 32 ETH mis en jeu pour être lancée en toute sécurité. Cela s'est produit le 27 novembre, et la Chaîne phare a commencé à produire des blocs le 1er décembre 2020.
-[Lire l'annonce de l'Ethereum Foundation](https://blog.ethereum.org/2020/11/27/eth2-quick-update-no-21/)
+[Lire l'annonce de la Fondation Ethereum](https://blog.ethereum.org/2020/11/27/eth2-quick-update-no-21/)
- La chaîne phare
+ La Chaîne phare
---
-### Contrat de dépôt de mise en jeu déployé {#staking-deposit-contract}
+### Déploiement du contrat de dépôt de mise en jeu {#staking-deposit-contract}
#### Résumé {#deposit-contract-summary}
-Le contrat de dépôt de mise en jeu a introduit la [mise en jeu](/glossary/#staking) dans l'écosystème Ethereum. Bien qu'il s'agisse d'un contrat sur le [réseau principal](/glossary/#mainnet), il a eu des conséquences directes sur le calendrier de lancement de la [chaîne phare](/roadmap/beacon-chain/), une importante [mise à niveau d'Ethereum](/roadmap/).
+Le contrat de dépôt de mise en jeu a introduit la [mise en jeu](/glossary/#staking) dans l'écosystème Ethereum. Bien qu'il s'agisse d'un contrat du [réseau principal](/glossary/#mainnet), il a eu un impact direct sur le calendrier de lancement de la [Chaîne phare](/roadmap/beacon-chain/), une importante [mise à niveau d'Ethereum](/roadmap/).
-[Lire l'annonce de l'Ethereum Foundation](https://blog.ethereum.org/2020/11/04/eth2-quick-update-no-19/)
+[Lire l'annonce de la Fondation Ethereum](https://blog.ethereum.org/2020/11/04/eth2-quick-update-no-19/)
Mise en jeu
@@ -412,17 +407,16 @@ Le contrat de dépôt de mise en jeu a introduit la [mise en jeu](/glossary/#sta
#### Résumé {#muir-glacier-summary}
-La fourche Muir Glacier a entraîné un report de la [bombe de difficulté](/glossary/#difficulty-bomb). L'augmentation de la difficulté des blocs du mécanisme de consensus de [preuve de travail](/developers/docs/consensus-mechanisms/pow/) menaçait de dégrader l'utilisation d'Ethereum en allongeant les temps d'attente pour l'envoi de transactions et l'utilisation d'applications décentralisées.
+La fourche Muir Glacier a introduit un délai pour la [bombe de difficulté](/glossary/#difficulty-bomb). L'augmentation de la difficulté des blocs du mécanisme de consensus de la [preuve de travail](/developers/docs/consensus-mechanisms/pow/) menaçait de dégrader la facilité d'utilisation d'Ethereum en augmentant les temps d'attente pour l'envoi de transactions et l'utilisation de dapps.
-- [Lire l'annonce de l'Ethereum Foundation](https://blog.ethereum.org/2019/12/23/ethereum-muir-glacier-upgrade-announcement/)
-- [Lire l'explication du site Ethereum Cat Herders](https://medium.com/ethereum-cat-herders/ethereum-muir-glacier-upgrade-89b8cea5a210)
+- [Lire l'annonce de la Fondation Ethereum](https://blog.ethereum.org/2019/12/23/ethereum-muir-glacier-upgrade-announcement/)
+- [Lire l'explication d'Ethereum Cat Herders](https://medium.com/ethereum-cat-herders/ethereum-muir-glacier-upgrade-89b8cea5a210)
-
+
EIP-2384 – retarde la bombe de difficulté pour 4 000 000 autres blocs, ou ~611 jours.
-
@@ -437,25 +431,24 @@ La fourche Muir Glacier a entraîné un report de la [bombe de difficulté](/glo
La fourche Istanbul a :
-- optimisé le coût de [gaz](/glossary/#gas) de certaines actions dans l'[EVM](/developers/docs/ethereum-stack/#ethereum-virtual-machine) ;
+- A optimisé le coût en [gaz](/glossary/#gas) de certaines actions dans l'[EVM](/developers/docs/ethereum-stack/#ethereum-virtual-machine).
- amélioré la résilience face aux attaques par déni de service ;
-- rendu plus performantes les solutions de [mise à l'échelle de la couche 2](/developers/docs/scaling/#layer-2-scaling) basées sur les SNARK et les STARK ;
+- A rendu les solutions de [mise à l'échelle de couche 2](/developers/docs/scaling/#layer-2-scaling) basées sur les SNARK et les STARK plus performantes.
- permis à Ethereum et Zcash d'interagir ;
- permis aux contrats d'introduire des fonctions plus créatives.
-[Lire l'annonce de l'Ethereum Foundation](https://blog.ethereum.org/2019/11/20/ethereum-istanbul-upgrade-announcement/)
+[Lire l'annonce de la Fondation Ethereum](https://blog.ethereum.org/2019/11/20/ethereum-istanbul-upgrade-announcement/)
-
+
EIP-152 – permet à Ethereum de travailler avec une devise préservant la vie privée comme Zcash.
- EIP-1108 – cryptographie à bas coût pour l'optimisation [des coûts](/glossary/#gas) de gas.
- EIP-1344 – protège Ethereum contre les attaques replay en ajoutant le code d'opération CHAINID [](/developers/docs/ethereum-stack/#ethereum-virtual-machine).
+ EIP-1108 – cryptographie moins chère pour améliorer les coûts du [gaz](/glossary/#gas).
+ EIP-1344 - protège le réseau Ethereum contre les attaques de relecture en ajoutant CHAINID [opcode](/developers/docs/ethereum-stack/#ethereum-virtual-machine).
EIP-1884 – l'optimisation des prix du gaz opcode basée sur la consommation.
- EIP-2028 – réduit le coût de CallData pour permettre plus de données en blocs – bon pour [la mise à l'échelle de la couche 2](/developers/docs/scaling/#layer-2-scaling).
+ EIP-2028 - réduit le coût de CallData pour permettre plus de données dans les blocs - bon pour [l'évolutivité de la couche 2](/developers/docs/scaling/#layer-2-scaling).
EIP-2200 – autres modifications du prix du gaz opcode.
-
---
@@ -468,14 +461,14 @@ La fourche Istanbul a :
La fourche Constantinople a :
-- Réduit les récompenses pour le [minage des blocs](/developers/docs/consensus-mechanisms/pow/mining/) de 3 à 2 ETH.
-- S'assurer que la blockchain ne se fige pas avant [la mise en œuvre de la preuve d'enjeu](#beacon-chain-genesis).
-- optimisé le coût de [gaz](/glossary/#gas) de certaines actions dans l'[EVM](/developers/docs/ethereum-stack/#ethereum-virtual-machine) ;
+- A réduit les récompenses de [minage](/developers/docs/consensus-mechanisms/pow/mining/) de blocs de 3 à 2 ETH.
+- A assuré que la blockchain ne se fige pas avant que la [preuve d'enjeu ne soit mise en œuvre](#beacon-chain-genesis).
+- A optimisé le coût en [gaz](/glossary/#gas) de certaines actions dans l'[EVM](/developers/docs/ethereum-stack/#ethereum-virtual-machine).
- Ajouté la possibilité d'interagir avec des adresses qui n'ont pas encore été créées.
-[Lire l'annonce de l'Ethereum Foundation](https://blog.ethereum.org/2019/02/22/ethereum-constantinople-st-petersburg-upgrade-announcement/)
+[Lire l'annonce de la Fondation Ethereum](https://blog.ethereum.org/2019/02/22/ethereum-constantinople-st-petersburg-upgrade-announcement/)
-
+
EIP-145 – Optimise le coût de certaines actions sur la chaîne.
@@ -483,7 +476,6 @@ La fourche Constantinople a :
EIP-1052 – introduit l'instruction EXTCODEHASH pour récupérer le hachage du code d'un autre contrat.
EIP-1234 – s'assure que la blockchain ne gèle pas 'avant la preuve d'enjeu et réduit les récompenses de 3 à 2 ETH par bloc.
-
@@ -498,27 +490,26 @@ La fourche Constantinople a :
La fourche Byzantium a :
-- réduit les récompenses pour le [minage](/developers/docs/consensus-mechanisms/pow/mining/) des blocs de 5 à 3 ETH ;
-- retardé la [bombe de difficulté](/glossary/#difficulty-bomb) d'un an ;
+- A réduit les récompenses de [minage](/developers/docs/consensus-mechanisms/pow/mining/) de blocs de 5 à 3 ETH.
+- A retardé la [bombe de difficulté](/glossary/#difficulty-bomb) d'un an.
- ajouté la possibilité d'effectuer des appels sans changement d'état vers d'autres contrats ;
-- ajouté certaines méthodes de cryptographie pour permettre la [mise à l'échelle de la couche 2](/developers/docs/scaling/#layer-2-scaling).
+- A ajouté certaines méthodes de cryptographie pour permettre la [mise à l'échelle de couche 2](/developers/docs/scaling/#layer-2-scaling).
-[Lire l'annonce de l'Ethereum Foundation](https://blog.ethereum.org/2017/10/12/byzantium-hf-announcement/)
+[Lire l'annonce de la Fondation Ethereum](https://blog.ethereum.org/2017/10/12/byzantium-hf-announcement/)
-
+
EIP-140 – ajoute le code d'opération REVERT.
EIP-658 – champ de statut ajouté aux reçus de transaction pour indiquer le succès ou l'échec.
- EIP-196 – intègre la courbe elliptique ainsi que les algorithmes de multiplication scalaire, qui permettent d'utiliser [ZK-Snarks](/developers/docs/scaling/zk-rollups/).
- EIP-197 – intègre la courbe elliptique ainsi que les algorithmes de multiplication scalaire, qui permettent d'utiliser [ZK-Snarks](/developers/docs/scaling/zk-rollups/).
+ EIP-196 - ajoute une courbe elliptique et une multiplication scalaire pour permettre [ZK-Snarks](/developers/docs/scaling/zk-rollups/).
+ EIP-197 - ajoute une courbe elliptique et une multiplication scalaire pour permettre [ZK-Snarks](/developers/docs/scaling/zk-rollups/).
EIP-198 – permet la vérification de la signature RSA.
EIP-211 – intègre le support pour les valeurs retournées de longueur variable.
L'EIP-214 – intègre le code d'opération STATICCALL, ce qui permettra aux autres contrats de ne pas changer l'état des Calls.
EIP-100 – change la formule d'ajustement de difficulté.
- EIP-649 – retarde [la bombe de difficulté](/glossary/#difficulty-bomb) de 1 an et réduit la récompense de bloc de 5 à 3 ETH.
+ EIP-649 - retarde la [bombe de difficulté](/glossary/#difficulty-bomb) de 1 an et réduit la récompense de bloc de 5 à 3 ETH.
-
@@ -537,9 +528,9 @@ La fourche Spurious Dragon a été la deuxième réponse aux attaques par déni
- « Dégonflage » de l'état de la blockchain ;
- Ajout de la protection contre les attaques par rejeu.
-[Lire l'annonce de l'Ethereum Foundation](https://blog.ethereum.org/2016/11/18/hard-fork-no-4-spurious-dragon/)
+[Lire l'annonce de la Fondation Ethereum](https://blog.ethereum.org/2016/11/18/hard-fork-no-4-spurious-dragon/)
-
+
EIP-155 – empêche les transactions d'une chaîne Ethereum d'être rediffusées sur une chaîne alternative, par exemple une transaction de réseau de test en cours de relecture sur la chaîne principale Ethereum.
@@ -547,7 +538,6 @@ La fourche Spurious Dragon a été la deuxième réponse aux attaques par déni
EIP-161 – permet de supprimer les comptes vides ajoutés via les attaques DOS.
EIP-170 – modifie la taille de code maximale qu'un contrat sur la blockchain peut avoir – à 24576 octets.
-
---
@@ -562,15 +552,14 @@ La fourche Tangerine Whistle a été la première réponse aux attaques par dén
- Résolution des problèmes urgents d'intégrité du réseau concernant les codes d'opération sous-évalués.
-[Lire l'annonce de l'Ethereum Foundation](https://blog.ethereum.org/2016/10/18/faq-upcoming-ethereum-hard-fork/)
+[Lire l'annonce de la Fondation Ethereum](https://blog.ethereum.org/2016/10/18/faq-upcoming-ethereum-hard-fork/)
-
+
EIP-150 – Augmente le coût en gaz des codes d'opération qui peuvent être utilisés dans les attaques anti-spam.
EIP-158 – réduit la taille de l'état en supprimant un grand nombre de comptes vides qui ont été mis dans l'état à très bas prix en raison de défauts dans les versions précédentes du protocole Ethereum.
-
---
@@ -581,13 +570,13 @@ La fourche Tangerine Whistle a été la première réponse aux attaques par dén
#### Résumé {#dao-fork-summary}
-La fourche DAO est la réponse à l'[attaque DAO de 2016](https://www.coindesk.com/learn/understanding-the-dao-attack/) au cours de laquelle le contrat non sécurisé d'une [DAO](/glossary/#dao) a été vidé de plus de 3,6 millions d'ETH lors d'un piratage. La fourche a déplacé les fonds du contrat défectueux vers un [nouveau contrat](https://etherscan.io/address/0xbf4ed7b27f1d666546e30d74d50d173d20bca754) avec une seule fonction : withdraw (retrait). Toute personne ayant perdu des fonds pouvait retirer 1 ETH pour chaque tranche de 100 jetons DAO dans son portefeuille.
+La fourche DAO était une réponse à l'[attaque de la DAO de 2016](https://www.coindesk.com/learn/understanding-the-dao-attack/) où un contrat [DAO](/glossary/#dao) non sécurisé a été vidé de plus de 3,6 millions d'ETH lors d'un piratage. La fourche a déplacé les fonds du contrat défectueux vers un [nouveau contrat](https://eth.blockscout.com/address/0xbf4ed7b27f1d666546e30d74d50d173d20bca754) avec une seule fonction : retrait. Toute personne ayant perdu des fonds pouvait retirer 1 ETH pour chaque tranche de 100 jetons DAO dans son portefeuille.
-Ce plan d'action a été voté par la communauté Ethereum. Tout détenteur d'ETH a pu voter via une transaction sur [une plateforme de vote](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/). Plus de 85 % des votes étaient favorables à la fourche.
+Ce plan d'action a été voté par la communauté Ethereum. Tout détenteur d'ETH pouvait voter par le biais d'une transaction sur [une plateforme de vote](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/). Plus de 85 % des votes étaient favorables à la fourche.
Certains mineurs ont refusé la fourche car l'incident DAO ne résultait pas d'un défaut du protocole. Ils ont ensuite formé [Ethereum Classic](https://ethereumclassic.org/).
-[Lire l'annonce de l'Ethereum Foundation](https://blog.ethereum.org/2016/07/20/hard-fork-completed/)
+[Lire l'annonce de la Fondation Ethereum](https://blog.ethereum.org/2016/07/20/hard-fork-completed/)
---
@@ -599,32 +588,31 @@ Certains mineurs ont refusé la fourche car l'incident DAO ne résultait pas d'u
La fourche Homestead qui regardait vers l'avenir. Elle comprenait plusieurs changements de protocole et un changement de réseau ayant permis à Ethereum de faire d'autres mises à niveau du réseau.
-[Lire l'annonce de l'Ethereum Foundation](https://blog.ethereum.org/2016/02/29/homestead-release/)
+[Lire l'annonce de la Fondation Ethereum](https://blog.ethereum.org/2016/02/29/homestead-release/)
-
+
EIP-2 – modifie le processus de création de contrats.
EIP-7 – ajoute un nouveau code d'opération : DELEGATECALL
EIP-8 – présente DEVP2P, pour faire face aux exigences en matière de compatibilité
-
## 2015 {#2015}
-### Frontier Thawing {#frontier-thawing}
+### Dégel de Frontier {#frontier-thawing}
#### Résumé {#frontier-thawing-summary}
-La fourche Frontier Thawing a levé la [limite de gaz](/glossary/#gas) de 5 000 par [bloc](/glossary/#block) et défini le prix du gaz par défaut à 51 [gwei](/glossary/#gwei). Cela a permis de réaliser des transactions. Les transactions nécessitent 21 000 unités de gaz. La [bombe de difficulté](/glossary/#difficulty-bomb) a été introduite pour assurer une future fourche dure vers la [preuve d'enjeu](/glossary/#pos).
+La fourche de dégel de Frontier a levé la limite de 5 000 [gaz](/glossary/#gas) par [bloc](/glossary/#block) et a fixé le prix du gaz par défaut à 51 [gwei](/glossary/#gwei). Cela a permis de réaliser des transactions. Les transactions nécessitent 21 000 unités de gaz. La [bombe de difficulté](/glossary/#difficulty-bomb) a été introduite pour assurer une future fourche vers la [preuve d'enjeu](/glossary/#pos).
-- [Lire l'annonce de l'Ethereum Foundation](https://blog.ethereum.org/2015/08/04/the-thawing-frontier/)
-- [Lire la mise à jour du protocole Ethereum 1](https://blog.ethereum.org/2015/08/04/ethereum-protocol-update-1/)
+- [Lire l'annonce de la Fondation Ethereum](https://blog.ethereum.org/2015/08/04/the-thawing-frontier/)
+- [Lire la mise à jour 1 du protocole Ethereum](https://blog.ethereum.org/2015/08/04/ethereum-protocol-update-1/)
---
@@ -634,37 +622,37 @@ La fourche Frontier Thawing a levé la [limite de gaz](/glossary/#gas) de 5 000
#### Résumé {#frontier-summary}
-Frontier était une implémentation réelle, mais sans structure, du projet Ethereum. Elle faisait suite à la phase de tests réussie Olympic. Elle était destinée aux utilisateurs techniques, en particulier aux développeurs. Les [blocs](/glossary/#block) avaient une limite de [gaz](/glossary/#gas) de 5 000. La période « Thawing » a permis aux mineurs de démarrer leurs opérations et aux premiers adoptants d’installer leurs clients sans avoir à « se précipiter ».
+Frontier était une implémentation réelle, mais sans structure, du projet Ethereum. Elle faisait suite à la phase de tests réussie Olympic. Elle était destinée aux utilisateurs techniques, en particulier aux développeurs. Les [blocs](/glossary/#block) avaient une limite de [gaz](/glossary/#gas) de 5 000. La période « Thawing » a permis aux mineurs de démarrer leurs opérations et aux premiers adoptants d’installer leurs clients sans avoir à « se précipiter ».
-[Lire l'annonce de l'Ethereum Foundation](https://blog.ethereum.org/2015/07/22/frontier-is-coming-what-to-expect-and-how-to-prepare/)
+[Lire l'annonce de la Fondation Ethereum](https://blog.ethereum.org/2015/07/22/frontier-is-coming-what-to-expect-and-how-to-prepare/)
## 2014 {#2014}
-### Vente d'ETH {#ether-sale}
+### Vente d'Ether {#ether-sale}
L'ETH a officiellement été en vente pendant 42 jours. Il était possible d'en acheter avec des BTC.
-[Lire l'annonce de l'Ethereum Foundation](https://blog.ethereum.org/2014/07/22/launching-the-ether-sale/)
+[Lire l'annonce de la Fondation Ethereum](https://blog.ethereum.org/2014/07/22/launching-the-ether-sale/)
---
-### Publication du Livre jaune {#yellowpaper}
+### Publication du Yellow Paper {#yellowpaper}
-Le Livre jaune, rédigé par le Dr Gavin Wood, est une définition technique du protocole Ethereum.
+Le Livre jaune, rédigé par le Dr. Gavin Wood, est une définition technique du protocole Ethereum.
-[Voir le Livre jaune](https://github.com/ethereum/yellowpaper)
+[Voir le Yellow Paper](https://github.com/ethereum/yellowpaper)
## 2013 {#2013}
-### Publication du Livre blanc {#whitepaper}
+### Publication du livre blanc {#whitepaper}