
Source: Gryphsis Academy
Ce rapport de recherche fournit une interprétation détaillée du principe de travail, de la composition du projet, de l’analyse du code source et d’autres parties du protocole UNISWAPV2.Le principe de travail implique principalement des fabricants de marchés automatiques (AMMS). Les principaux contrats (tels que les contrats d’usine, les contrats d’échange) et leurs fonctions;
1. Introduction à l’accord
UNISWAPV2 est un protocole de transaction décentralisé basé sur la blockchain Ethereum, permettant aux utilisateurs d’échanger des crypto-monnaies sans faire confiance aux intermédiaires.Contrairement aux échanges centralisés traditionnels, UNISWAPV2 adopte le modèle automatique des fabricants de marchés (AMM) pour gérer les transactions et les pools de liquidité par le biais de contrats intelligents, atteignant ainsi une décentralisation complète.
Le noyau d’UNISWAPV2 est sa formule de produit constante (x * y = k),dansxetyReprésente le nombre de deux actifs différents dans le pool de liquidités respectivement.kest une constante.Cette formule garantit qu’après chaque transaction, la proportion d’actifs dans le pool est rééquilibrée, fournissant ainsi des liquidités aux utilisateurs.Cette conception rend le processus de trading transparent et équitable, et les utilisateurs peuvent ajouter ou supprimer la liquidité à tout moment et réaliser des bénéfices grâce aux frais de transaction.
Le protocole UNISWAPV2 se compose de plusieurs contrats intelligents, dont les plus importants sont des contrats d’usine et des contrats d’échange.Les contrats d’usine sont responsables de la création et de la gestion des pools de liquidité, tandis que chaque contrat d’échange correspond à une paire de trading spécifique (par exemple ETH / DAI).
De plus, UniSWAPV2 a également introduit des contrats de routeurs et des fonctions de bibliothèque pour améliorer l’efficacité et la sécurité des transactions.Par rapport à son prédécesseur, UNISWAPV1, UNISWAPV2 apporte plusieurs améliorations importantes.Tout d’abord, la fonction d’échange Lightning permet aux utilisateurs d’emprunter des actifs dans une seule transaction et de les renvoyer avant la fin de la transaction.Le second est le prix Oracle, qui fournit des données de prix plus fiables en accumulant la moyenne pondérée dans le temps (TWAP).
De plus, UNISWAPV2 prend en charge les transactions directes de tout jeton ERC-20 sans avoir besoin d’utiliser Ethereum comme intermédiaire.Le succès de l’UNISWAPV2 réside non seulement dans son innovation technologique, mais aussi dans son modèle de développement ouvert et axé sur la communauté.Le protocole uniswap est libre d’utiliser et de développer quiconque, ce qui apporte des possibilités illimitées à l’écosystème financier (DEFI) décentralisé.De nombreux autres projets Defi, tels que les plateformes de prêt et les protocoles de stablecoin, sont construits sur uniswap pour former un écosystème florissant.
En général, UNISWAPV2 a complètement changé la façon dont les transactions de crypto-monnaie grâce à sa conception de protocole innovante et à son modèle d’exploitation décentralisé et sont devenus une pierre angulaire importante dans le champ Defi.Avec le développement continu de la technologie et l’innovation continue de la communauté, l’influence de l’UNISWAPV2 sera encore élargie, apportant plus de liberté financière et d’opportunités aux utilisateurs mondiaux.
2. Caractéristiques du protocole
2,1 paires ERC-20
UNISWAPV1 utilisera Ethereum (ETH) comme monnaie de transition, c’est-à-dire que si l’utilisateur souhaite échanger Tokena et TokenB, il doit utiliser Tokena pour échanger ETH en premier, puis utiliser ETH pour échanger TokenB. Liquidité, elle exerce une pression des coûts énormes sur les fournisseurs de liquidités.Chaque fournisseur de liquidités doit avoir une interface à échanger avec ETH.
Lorsque deux actifs ABC et XYZ sont associés (par exemple, ce sont tous deux des étages en dollars américains), les fournisseurs de liquidités sur uniswap subiront généralement des pertes permanentes plus faibles dans la paire ABC / XYZ par rapport à ABC / ETH ou XYZ / ETH sont correctes.De plus, l’utilisation de l’ETH comme monnaie de transition forcée augmente les coûts des commerçants.Le commerçant paiera deux fois plus que l’achat direct d’ABC / XYZ et subira également deux glissages.
Dans UNISWAPV2, les fournisseurs de liquidités sont autorisés à créer des contrats de paire pour deux jetons ERC-20.Bien que la surtension du nombre de paires de transactions entre tous les jetons ERC-20 puisse rendre plus compliqué pour trouver un chemin de transaction d’actifs spécifique, ce problème peut être résolu par un routage de niveau supérieur (via des routeurs ou agrégateurs hors chaîne ou sur chaîne ).
2.2 Prix Oracle
Le prix de l’UNISWAPV1 est calculé par le moment t, le prix marginal fourni par uniswap (hors frais de traitement) peut être obtenu en divisant le montant de la réserve de l’actif A par le montant de la réserve de l’actif b.La formule de calcul spécifique est la suivante:
Cependant, UniSWAPV1 n’est pas sûr à utiliser en tant qu’oracle à prix sur chaîne car il est très facile à manipuler.Le manipulateur vendra un grand nombre d’actifs A au début d’un bloc pour affecter le prix, puis effectuera d’autres opérations de contrat (contrats de paire non UNISWAP) au milieu du bloc, et enfin racheter à la fin de la fin de la Bloc.UNISWAP V2 introduit un mécanisme d’accumulation de prix, permettant aux tiers d’utiliser le prix moyen d’une certaine fourchette, ce qui augmente considérablement la difficulté de manipulation des prix et fait que le comportement de manipulation n’a aucun avantage substantiel.
Plus précisément, UNISWAP V2 accumule ce prix en enregistrant la somme d’accumulation du prix au début de chaque bloc, où quelqu’un interagit avec le contrat.Chaque prix est pondéré en fonction du temps écoulé car le bloc précédent est mis à jour, en fonction de l’horodatage du bloc.Cela signifie qu’à un moment donné (après la mise à jour), la valeur de l’accumulateur devrait être la somme du prix au comptant pour chaque seconde de l’historique du contrat.
Pour estimer le prix moyen pondéré dans le temps du temps T₁ à T₂, un appelant externe peut vérifier la valeur de l’accumulateur à T₁, puis vérifier à nouveau à T₂, soustraire la première valeur et diviser par les secondes écoulées.(Notez que le contrat lui-même ne stocke pas la valeur historique de cet accumulateur – l’appelant doit appeler le contrat au début du cycle pour lire et stocker cette valeur.)
L’utilisateur d’Oracle peut choisir quand démarrer et terminer le cycle.Le choix d’un cycle plus long rendra un attaquant plus coûteux pour manipuler le prix moyen pondéré dans le temps (TWAP), bien que cela entraînera un prix le plus récent.Étant donné que la valeur moyenne est utilisée, la valeur moyenne de A / B et B / A dans un certain intervalle n’est plus une relation réciproque, donc UniSwap V2 offre les deux prix.
2.3 Précision du calcul des prix
Étant donné que Solidity ne prend pas en charge les types de données numériques non entières, UNISWAPV2 adopte le format de données UQ112.112 pour améliorer la précision des calculs des prix et utilise Uint112 pour stocker le nombre d’actifs dans la paire de transactions et utilise 32 bits pour enregistrer la création temps du bloc actuel.Cette méthode d’enregistrement à l’heure provoquera des horodatages UNIX après 100 ans, le 7 février 2106.En effet, les horodatages UNIX représentent le temps en secondes depuis le 1er janvier 1970 (appelé l’ère Unix), et Uint32 peut représenter une plage de 0 à 2 ^ {32} – 1 seconde, soit environ 136 ans.
Pour s’assurer que le système fonctionnera toujours correctement le 7 février 2106 et au-delà, UNISWAPV2 est conçu pour nécessiter des Oracles pour vérifier le prix au moins une fois tous les autres cycles de débordement (environ 136 ans).En effet, dans cette conception, la méthode d’accumulation de prix est toujours un débordement même si les horodatages débordent, et le changement de prix peut être calculé correctement même si la transaction s’étend sur l’intervalle de débordement.De cette façon, le système est assuré de rester précis et fiable pendant longtemps.
2.4 Redemption de la foudre
Lightning Exchange est un échange de crypto-monnaie instantané réalisé sur une plate-forme blockchain, où les utilisateurs peuvent rapidement effectuer des transactions entre différentes crypto-monnaies sans attendre que plusieurs blocs confirment.Ces transactions sont généralement exécutées automatiquement par des contrats intelligents, garantissant que les deux parties à la transaction remplissent leurs engagements d’échange en même temps, réduisant ainsi les risques de transaction et améliorant l’efficacité.En bref, l’échange de Lightning signifie le commerce d’abord, puis le remboursement.
Expliquez le rachat de Lightning à travers un exemple pratique. quantité de A.Grâce au processus ci-dessus, nous avons terminé l’arbitrage de la différence de prix entre A0-A à 0 coût.Nous n’avons pas besoin de directeur, nous avons seulement besoin de payer des frais de gaz.Si vous constatez qu’il existe une différence de prix entre les autres Dexes sur la chaîne, vous pouvez également effectuer des opérations similaires sur eux à un arbitrage à coûts zéro.
2.5 Frais de protocole
UNISWAPV2 introduit des frais de protocole de 0,05% qui peuvent être activés et désactivés.S’il est activé, ces frais seront envoyés à l’adresse Feeto spécifiée dans le contrat d’usine.Initialement, Feeto n’était pas fixé, donc aucun frais n’a été facturé.Une adresse d’adresse pré-spécifiée peut appeler la fonction SetFeeto dans le contrat d’usine uniswapv2 et set pieds à une valeur différente.FeetOsetter peut également être appelé SetfeetOsetter pour changer l’adresse des pieds.
Si l’adresse Feeto est définie, le protocole commencera à facturer des frais de 5 points de base, qui sont les frais de 30 points de base gagnés par les fournisseurs de liquidités \ FRAC {1} {6}.Autrement dit, les traders continueront de payer 0,30% de tous les frais de transaction, dont 83,3% (soit 0,25%), seront payés aux fournisseurs de liquidités et 16,6% (soit 0,05%) seront payés à l’adresse Feeto.La facturation de ces frais de 0,05% à chaque transaction ajoute des coûts de gaz supplémentaires.Pour éviter cela, les frais accumulés ne sont chargés que lorsque la liquidité est déposée ou retirée.Le contrat calcule les frais accumulés et frappe de nouveaux jetons de liquidité aux bénéficiaires des frais immédiatement avant que le jeton ne soit frappé ou détruit.
Les frais accumulés peuvent être calculés en mesurant la croissance de √k (c’est-à-dire √ (x · y)), depuis la dernière fois que les frais ont été facturés.Cette formule donne les dépenses cumulatives du pourcentage de liquidité dans le pool d’écoulement entre T₁ et T₂ comme T₂:
Si les frais sont activés avant T₁, l’adresse des pieds doit être capturée à ⅙ entre T₁ et T₂.Par conséquent, nous voulons éprouver un nouveau jeton de liquidité à l’adresse des pieds, représentant le pool de φ · f₁, ₂, où φ = ⅙.
C’est-à-dire que nous voulons choisir Sₘ pour satisfaire la relation suivante, où S₁ est le montant total des actions en circulation au temps T₁:
Après certains calculs, y compris en utilisant 1-
Au lieu de f₁, ₂ et résoudre Sₘ, nous pouvons le réécrire comme:
Réglez φ sur ⅙ et nous obtiendrons la formule suivante
Ci-dessous, expliquons-le avec un exemple spécifique.Supposons que le dépôt initial dépose 100 DAI et 1 ETH dans une paire et obtenez 10 actions.Après un certain temps (aucun autre déposant n’a été impliqué dans le jumelage), ils ont tenté de retirer des fonds, à quel point il y avait 96 DAI et 1,5 ETH dans le jumelage.En remplaçant ces valeurs dans la formule ci-dessus, nous obtenons le résultat suivant:
2.6 Calcul des frais de transaction
Uniswapv1 Le calcul des frais de transaction est la formule
Cette formule signifie que la formule de produit constante est uniquement réduite, puis exécutée dans la version d’UNISWAPV2, en raison de l’existence du mécanisme d’échanges Flash, la formule de calcul des frais de transaction est ajustée à
2.7 sync () et skim ()
Sync () est utilisé pour mettre à jour le nombre d’actifs stockés temporairement dans le contrat à la valeur réelle actuelle du contrat, principalement pour le traitement des cas où des déséquilibres proportionnels et aucun fournisseur de liquidité ne sont disponibles.SKIM () est utilisé pour gérer la situation où le nombre d’actifs dans le contrat dépasse la valeur maximale d’Uint112, permettant à l’utilisateur de retirer la partie des actifs dépassant la valeur maximale de UInt112.
2.8 Manipulation des jetons non standard et rarement utilisés
Le contrat de jeton ERC20 standard doit renvoyer une valeur booléenne après avoir transféré le jeton pour indiquer si le transfert est réussi, mais tous les jetons ne le feront pas.Certains jetons ne renvoient pas de valeurs.Dans UNISWAPV1, les transferts de jetons sans valeurs de retour sont considérés comme un échec par défaut et la transaction entière est réinitialisée.Et dans uniswap v2, les transferts de jetons sans valeurs de retour sont considérés comme réussis.
De plus, UniSWAPV1 suppose que les transferts de jetons ne déclenchent pas la réintégration de la paire de transactions, mais certains jetons ERC20 qui prennent en charge les crochets ERC777 rompent cette hypothèse.Pour prendre en charge ces jetons, UniSWAPV2 ajoute une fonction de verrouillage anti-réentreprise à toutes les fonctions de modification des variables d’état public et empêche également la réintégration des rappels définis par l’utilisateur dans des swaps flash.
2.9 Paramètres d’initialisation de liquidité
Si l’utilisateur fournit des liquidités pour une paire de trading existante A / B, alors en fonction du rapport actuel de A et B, il peut calculer le nombre de ratios A et B à fournir.Cependant, lorsqu’une paire de transactions est initialisée, il n’y a pas de rapport de référence.Dans la version d’UNISWAPV1, lorsqu’un nouveau fournisseur de liquidité dépose des jetons dans une paire de jetons uniswap existante, le nombre de jetons de liquidité frappés sera calculé sur la base du nombre de jetons existants.La formule de calcul spécifique est la suivante:
Pour que la première personne puisse fournir des liquidités, la formule estXstarOui 0.Face à cette situation, la méthode adoptée par uniswapv1 est que la valeur de la liquidité initiale est directement égale à la quantité d’ETH initialement fournie. déterminé par la proportion de la liquidité initiale.Dans uniswapv2, l’initialisation de la liquidité peut être effectuée par la formule suivante
Cette formule signifieSoumisC’est la quantité de jetons de liquidité que vous recevrez,XDEPOSITCeci est le numéro des premiers jetons que vous déposez.XDEPOSITC’est le montant d’ETH que vous déposez.YdepositéIl s’agit du numéro du deuxième jeton que vous déposez.
Par exemple, si vous déposez Dai,YdepositéC’est le montant de DAI que vous déposez.Cette formule peut garantir que la part dans le pool de liquidités ne sera jamais inférieure à la moyenne géométrique dans la piscine, mais la valeur de cette formule changera également avec le changement du nombre de jetons dans la piscine, afin d’affaiblir le nombre Des jetons dans le pool de fonds En raison de l’impact du changement, UNISWAPV2 a détruit la liquidité initiale 1E-11-, qui est 1000 fois la liquidité minimale de 1E-½.Bien que cela soit trivial pour toute paire de transactions, cela augmente considérablement le coût des attaquants qui profitent de ce mécanisme.
2.10 Weth
Étant donné que l’interface pour le trading de la monnaie native d’Ethereum est différente de celle des tokens ERC20 trading, de nombreux protocoles ne prennent pas directement en charge ETH, mais utilisent plutôt un autre Weth (jeton ETH emballé).UNISWAPV1 est une exception car ses paires de trading incluent directement ETH, permettant aux utilisateurs de négocier directement à l’aide d’ETH.Cependant, UNISWAP V2 est conçu pour prendre en charge les paires de trading entre tous les jetons ERC20, et le support direct de l’ETH peut compliquer le système et augmenter le risque.
Par conséquent, ETH n’est pas directement pris en charge dans uniswapv2, et les utilisateurs doivent convertir ETH en weth avant d’utiliser la paire de transactions.En fait, UNISWAPV2 convertit en interne l’ETH fourni par l’utilisateur en WETH, ce qui simplifie les opérations des utilisateurs sans convertir manuellement ETH en weth.Bien que cette conversion soit triviale pour toute paire de transactions, elle améliore efficacement la sécurité et la facilité de fonctionnement du système.
2.11 Adresse de paire de trading déterministe
Qu’il s’agisse d’UniSWAPV1 ou UNISWAPV2, toutes les paires sont créées via un seul contrat d’usine.Dans UNISWAPV1, la création d’opcode est utilisée et l’adresse de la transaction à contrat sera affectée par l’ordre dans lequel il est créé.Dans uniswapv2, un nouveau OPCode Create2 est utilisé et l’adresse générée par cette méthode est déterminée.Cela signifie que l’adresse de la paire de transactions peut être calculée à l’avance hors chaîne sans interroger l’état sur la chaîne.
2.12 Nombre maximum de jetons
Pour implémenter efficacement les fonctions Oracle, UNISWAP V2 utilise Uint112 pour enregistrer le nombre de jetons, ce qui signifie que son nombre maximal de jetons pris en charge est de 2½² – 1.Pour les jetons avec une précision de 18, cette valeur est suffisante, environ 5192296858534828 (5.19e¹⁵), soit 5,19 billions.Si la valeur d’enregistrement dans le contrat dépasse cette limite, la transaction échouera et sera réinitialisée.Comme mentionné précédemment, n’importe qui peut récupérer en utilisant la fonction SKIM (), en résolvant ce problème en supprimant les actifs excédentaires du pool de liquidités.
3. Analyse du principe uniswapv2
UNISWAP est un protocole de liquidité automatisé propulsé par des formules de produits constants et implémentée dans des systèmes de contrat intelligents non modérables sur la blockchain Ethereum.Il élimine la nécessité d’intermédiaires de confiance, priorisant la décentralisation, la résistance à la censure et la sécurité.Chaque contrat intelligent uniswap ou paire de devises gère un pool de liquidités composé de deux réserves de jetons ERC-20.Tout le monde peut échanger des jetons de piscine en déposant la valeur équivalente de chaque jeton sous-jacent, devenant ainsi un fournisseur de liquidités (LP) du pool de fonds.Ces jetons suivent des parts LP proratées dans la réserve totale et peuvent racheter les actifs sous-jacents à tout moment.
Tout d’abord, nous présenterons le mécanisme de marché automatique de l’UNISWAP.
dans,xReprésente le nombre de jetons a,yReprésente le nombre de jetons b,kest une constante qui indique que le produit des deux jetons dans la piscine reste inchangé.Lorsqu’un commerçant se négocie sur uniswap, il modifie le nombre de jetons dans la piscine en ajoutant ou en retirant des jetons à la piscine.Selon la formule du produit constant, le nombre d’un autre jeton changera en conséquence pour maintenir le produitkconstante.Ce changement détermine le prix de la transaction.
Par exemple, si un trader veut échanger des jetons B avec un jeton A, il doit ajouter un certain nombre de jetons A à la piscine, ce qui entraînera la diminution du nombre de jetons B dans le pool, modifiant ainsi le prix.Les opérations du commerçant se déplaceront le long de cette courbe, modifiant le nombre et le prix des jetons.Tout point sur la courbe satisfait la relation de produit constante.
Le principe de travail d’UNISWAPV2 peut être à peu près divisé en trois parties: fournisseur de liquidités, piscine uniswap et commerçant.Le rôle des fournisseurs de liquidités est que les fournisseurs de liquidités déposent deux jetons (par exemple, le jeton A et le jeton B) dans une piscine uniswap.
Dans l’exemple indiqué sur la figure, le fournisseur de liquidité dépose 10 jetons A et 1 jeton B;
La part de liquidité dans la piscine est représentée par le jeton de liquidité, qui montre qu’il y a 12 jetons de liquidité dans la figure;Par exemple, un trader peut déposer 10 jetons A et payer des frais de manutention de 0,3% pour obtenir 1 jeton B de la piscine.
Voyons d’abord comment les fournisseurs de liquidité (LPS) fournissent des liquidités.Comme le montre la figure ci-dessous, les fournisseurs de liquidités déposent des jetons dans des piscines uniswap pour augmenter la liquidité.
Par exemple, sur la figure, le fournisseur de liquidité dépose 3 jeton A et 1 jeton B.Lorsque les fournisseurs de liquidités déposent des jetons, ils reçoivent des jetons de piscine représentant leur part de liquidité.Sur la figure, le fournisseur de liquidité a obtenu 12,4 jetons de piscine.Les réserves de jeton dans la piscine augmenteront, par exemple, les réserves de jeton dans la piscine de la figure deviendront 1210 jetons A et 399 B.Plus de liquidités aide à réduire le glissement des prix et à rendre le trading plus stable.
La formule de produit constante utilisée par uniswapx · y = kpour déterminer la courbe de prix.L’augmentation de la liquidité élargit la zone de glissement faible et améliore la stabilité des prix des transactions.Les fournisseurs de liquidités augmentent la liquidité dans la piscine en déposant les jetons et obtenez des jetons de liquidité correspondants en retour.Cela aide non seulement les traders à obtenir des prix plus stables, mais apporte également des avantages aux prestataires de liquidités des frais de transaction.
Ensuite, du point de vue des commerçants, comment les commerçants échangent des jetons et quel impact le comportement des trading aura sur le pool uniswap.
Comme le montre la figure ci-dessous, les commerçants veulent échanger des jetons sur uniswap.Par exemple, dans la figure, le trader a l’intention d’échanger 3 jetons.Les traders entrent 3 jetons A et paient des frais de manutention de 0,3%.Finalement, le trader obtiendra environ 0,997 token BS en tant que sortie.La transaction modifie le solde de réserve dans le pool, ce qui entraîne un nouveau prix.Avant la transaction, il y avait 1200 jetons A et 400 jetons B dans la piscine.
Selon la formule du produit constantx · y = kIl y aura environ 1203.009 jeton A et environ 399,003 jeton B dans le pool après transaction.Utilisation uniswapx · y = kLa formule de produit constante de la courbe de prix est définie.Au fur et à mesure que le trader échange, le nombre de jetons dans le pool change et la courbe de prix s’adapte également pour déterminer le nouveau prix.
4. Analyse du code source
4.1 Analyse du graphique de flux de fonctionnement de base
Dans cette section, nous présenterons les trois opérations les plus couramment utilisées dans UNISWAPV2, à savoir l’ajout de liquidité, l’élimination de la liquidité et l’échange de jetons.Nous analyserons les contrats qu’ils appellent et les fonctions qu’ils appellent à travers l’organigramme pour acquérir une compréhension plus profonde du code source d’UNISWAPV2.
4.1.1 Ajouter de la liquidité
Lorsque l’utilisateur ajoute de la liquidité, l’utilisateur appelle d’abord le contrat uniswapv2Router.sol pour fournir le nombre de jetons A et le jeton B. La fonction addliquidité du contrat uniswapv2Router.sol reçoit la demande de l’utilisateur et le traite.
La fonction AddLiquidité appelle en outre le contrat uniswapv2pair.sol. B fourni par l’utilisateur (::::::::::::::::::::::::::::::::::- :::::::::::::::::::: Le nombre de jetons LP) et alloue ces jetons LP à l’utilisateur. Mettez à jour la réserve.
4.1.2 Tokens d’échange
Lorsqu’un utilisateur souhaite échanger des jetons, il appelle d’abord le contrat uniswapv2Router.sol pour fournir le nombre de jetons d’entrée et le nombre minimum de jetons de sortie.
Ensuite, la fonction SwapexactTokenSfortOkens du contrat uniswapv2Router reçoit la demande de l’utilisateur et le traite. est basé sur le nombre de jetons d’entrée et de réserves.Le processus spécifique est le suivant:
4.1.3 Élimination de la liquidité
L’utilisateur appelle d’abord le contrat uniswapv2Router.Sol pour fournir le nombre de jetons LP à retirer. .Sol Contrat, Call the Burn Fonction Effectue le fonctionnement réel de retrait de liquidité.
4.2 Contrat de base
Le contrat de base UNISWAPV2 fait partie intégrante d’UNISWAP, une plate-forme de trading décentralisée, et est responsable de la mise en œuvre de ses fonctions de fabricant de marchés automatisées (AMM).Contrairement aux livres de commandes traditionnels, uniswap passe des piscines de liquidité et des formules de produit constantesx · y = kpour réaliser la transaction.Le fournisseur de liquidité dépose deux jetons dans la piscine et obtient des jetons de liquidité comme des références.Lorsqu’un utilisateur effectue une transaction, le contrat calcule le prix de transaction en fonction du nombre de jetons dans le pool et de la formule de produit constante.UNISWAPV2 a introduit plusieurs améliorations, notamment les transactions directes des paires ERC20, les améliorations des oracle, les prêts flash et les ajustements de frais de protocole.Les composants principaux du contrat de base comprennent les trois fichiers suivants:
-
Uniswapv2pair.sol: gère les pools de liquidité pour chaque paire de trading, gère les échanges de jetons, les ajouts de liquidité et les déménagements
-
Uniswapv2factory.sol: responsable de la création et de la gestion des paires de transactions
-
Uniswapv2erc20.sol: mise en œuvre standard des jetons de liquidité, représentant la part des fournisseurs de liquidités
4.2.1 UNISWAPV2 Factory.sol
Le rôle du contrat UNISWAPV2Factory est responsable de la création et de la gestion de paires de trading (Piscines de liquidité).Ce contrat permet aux utilisateurs de créer de nouvelles paires de trading et d’enregistrer toutes les paires de trading créées.De plus, il gère les adresses de réception des frais de transaction et les adresses de setter.Uniswapv2factory.sol a cinq fonctions, jetons-le à l’occasion séparément
-
Fonction du constructeur: fonction du constructeur, utilisé pour initialiser le contrat UniSWAPV2Factory.L’entrée est l’adresse du secteur des frais de transaction _feetOsetter, et la sortie n’est pas.
-
AllPairsLength Fonction: Renvoie le nombre de toutes les paires de transaction créées.L’entrée n’est pas et la sortie est l’unité du nombre de toutes les paires de transactions.
-
Fonction CreatePair: crée une nouvelle paire de transactions.L’entrée est les deux adresses de jeton de Tokena et TokenB, et la sortie est la paire d’adresses de paire de transactions créée.
-
Fonction SetFeeto: Définissez l’adresse d’acceptation des frais de transaction.L’entrée est la nouvelle adresse d’acceptation des frais de transaction _feeto, et la sortie n’en est pas.
-
SetFeetOsetter Fonction: Définit la nouvelle adresse de secteur des frais de transaction.L’entrée est la nouvelle adresse de réglage des frais de transaction _feetOsetter, et la sortie n’est pas.
L’analyse de code spécifique est la suivante:
Fonction CreatePair
La fonction de la fonction CreatePair est de créer une paire de transactions avec Tokena et TokenB. TokenB, suivi de la vérification de l’adresse de Token0 et nécessite que l’adresse de Token0 ne peut pas être 0;
Vérifiez ensuite si cette paire de jetons existe en exigeant (getPair [token0] [token1] == adresse (0), ‘uniswapv2: pair_exists’); et seulement si elle existe, il peut continuer; le contrat;
Ensuite, utilisez les valeurs de hachage de Token0 et Token1 comme valeur de sel pour vous assurer que l’adresse de chaque paire de jeton est unique, car si l’adresse de la paire de jeton n’est pas unique, alors la liquidité du commerçant peut être ajoutée au mauvais pool ; Ensuite, créez un contrat en utilisant l’instruction en ligne Create2 pour assurer le caractère unique et la prévisibilité de l’adresse du contrat;
Ensuite, initialisez le contrat de paire de jetons nouvellement créé, puis mettez à jour la table de mappage, enregistrez l’adresse du contrat de la paire de jetons, puis ajoutez l’adresse de contrat de paire de jeton nouvellement créée à la liste de toutes En dehors de nouvelles paires de jetons à créer.
4.2.2 UNISWAPV2 ERC20.SOL
La fonction principale de uniswapv2erc20.sol est d’implémenter les jetons ERC-20, qui met en œuvre la fonction de jeton standard ERC20, spécifiquement utilisé dans les pools de liquidité uniswapv2.Le contrat comprend des opérations de base telles que la casting, la brûlure, l’approbation et le transfert.De plus, il prend en charge la fonction d’autorisation, permettant à l’utilisation de signatures d’approuver les transferts de jetons.Regardons les fonctions qu’il contient une par une:
-
Fonction du constructeur: Initialisez le contrat, définissez DOMAIN_SEPARATOR pour la fonction d’autorisation.Entrée Aucun, sortie Aucun.
-
_MINT Fonction: Nouveaux jetons à menthe, l’entrée est l’adresse de réception « à », et la « valeur » de la quantité de menthe, la sortie n’est pas
-
_BURN FONCTION: DESTREST TOKENS, l’entrée est l’adresse de détruire et la valeur de quantité détruite, la sortie n’en est pas.
-
_Approve Fonction: approuver le transfert de jeton, le propriétaire de l’adresse du propriétaire, le dépensier de l’adresse approuvé et la valeur de quantité approuvée, la sortie aucune.
-
_Transfer Fonction: Token de transfert, l’entrée est l’adresse de transfert de l’adresse et de la valeur de la quantité de transfert, la sortie n’est aucune.
-
Fonction d’approvisionnement: La fonction d’approbation publique, la fonction consiste à appeler la fonction _approve, l’entrée est la fonction d’approbation publique de la fonction d’approbation, et la sortie est de renvoyer une valeur booléenne vraie pour indiquer que l’opération est réussie.
-
Fonction de transfert: La fonction consiste à appeler la fonction _Transfer, l’entrée consiste à accepter l’adresse et la valeur du numéro de transfert, et la sortie est de renvoyer la valeur booléenne True signifie que l’opération est réussie
-
Fonction de transfrom: une fonction de transfert d’autorisation exposée.L’entrée est l’adresse de transfert de, l’adresse de réception vers et la valeur de quantité de transfert, la sortie est la valeur booléenne de retour vrai indique que l’opération est réussie
-
Fonction de permis: utilisez la signature pour approuver le transfert de jetons, vérifiez la signature et appelez la fonction _approve. La sortie n’est pas.
L’analyse officielle du code source est la suivante:
4.2.3 UNISWAPV2 paire.sol
UniSWAPV2PAIR est un contrat de paire de trading, qui réalise la fonction centrale de UniSWAP V2, à savoir, gère et exploite le pool de liquidités de chaque paire de trading.Ce contrat est responsable de la gestion de l’échange de jetons, de l’addition et de l’élimination de la liquidité et du calcul d’accumulation des prix.Il garantit qu’après chaque transaction, les informations de réserve et de prix de la paire de transactions sont mises à jour et déclenche des notifications d’événements correspondants.Il y a 11 fonctions dans uniswapv2pair.sol, qui sont présentées dans le tableau suivant:
Le code et les commentaires officiels uniswapv2pair.sol sont les suivants:
Uniswapv2pair hérite iuniswapv2pair, uniswapv2erc20.
Les variables et les modificateurs globaux sont ensuite définis
Le minimum_liquidité ci-dessus est une constante qui définit le nombre minimum de jetons de liquidité qui doivent être conservés dans le pool de liquidités pour garantir que les fournisseurs de liquidités conservent au moins une certaine quantité de jetons à tout moment, évitant ainsi l’épuisement des liquidités. 10, qui est brûlé lors de la fourniture de liquidité initiale; La signature de fonction correcte est utilisée lors de l’exécution des transferts de jetons;
L’usine est utilisée pour stocker l’adresse du contrat d’usine uniswap v2 pour le contrat de paire de transactions, token0, token1 est utilisé pour stocker l’adresse de jeton, la réserve0, la réserve1 et le blocktimestamplast, les trois variables d’état enregistrent le nombre de deux actifs dans la dernière constante constante Produit et temps de temps de transaction (création);
Les variables Price0cumulaativelast et Price1cumulaativelastlast sont utilisées pour enregistrer les valeurs accumulées des deux prix dans la paire de trading, et Klast est utilisé pour suivre l’état récent du produit des deux réserves de jeton dans la paire de trading UNISWAPV2, comme paramètre clé. Pour maintenir la stabilité des prix du pool de liquidités et calculer les frais de transaction, principalement utilisés pour le calcul des frais de traitement de l’équipe.
La section suivante du décorateur fournit un mécanisme de verrouillage pour empêcher les attaques de rentrée.
Le _; dans le code ci-dessus représente le corps de fonction modifié. Réintention des attaques et des conditions de course.
La fonction ci-dessous la fonction GetReserve est de fournir un moyen de remettre en question et de retourner publiquement les informations sur les deux réserves de jeton actuelles et le dernier horodatage mis à jour du contrat de la paire de transactions UNISWAPV2.
La fonction de la fonction _SaFetRansfer est d’effectuer des opérations de transfert de jetons dans le contrat intelligent et de vérifier si le transfert est réussi. est le code détaillé de cette section.
Le constructeur suivant est simplement utilisé pour initialiser l’usine:
La fonction de la fonction initialisée consiste à définir les adresses des deux jetons impliqués dans le contrat de la paire de transactions, et ne peut être appelé que par le contrat d’usine où la paire de transactions est déployée pour garantir que le processus d’initialisation de la paire de transactions est sûr et contrôlé.
La fonction principale de la fonction _update est de s’assurer que le montant de la réserve et l’accumulateur de prix de la transaction à contrat peuvent refléter le dernier état. un.Les quatre paramètres d’entrée de la fonction _update sont: Balance0 et Balance1, représentant le solde actuel des deux jetons dans la paire de transactions;Ensuite, nous utiliserons la méthode Bullet Point pour expliquer comment la fonction _update est implémentée:
-
Vérifiez si la valeur d’équilibre peut provoquer un débordement: utilisez la déclaration de requise pour vous assurer que le Balance et Balance1 et Balance1 ne dépassent pas la valeur maximale de UInt112, car Reserve0 et Reserve1 utilisent le type UInt112 lors du stockage, et la conversion de la sécurité du type de données est requise .
-
Enregistrez le temps de bloc actuel: Obtenez l’horodatage du bloc actuel et effectuez l’opération MODULO 2 ^ 32 avec BlocktimeStamplast pour obtenir Blocktimestamp.Cette opération est dû au fait que l’obstacle en bloc d’Ethereum est de 32 bits, et nous ne nous soucions que du décalage horaire dans un bloc, pas du temps absolu.
-
Calculez le décalage horaire: calculez la différence entre le temps de bloc actuel et la dernière période de mise à jour.Si le temps de temps est 0, cela signifie qu’il s’agit d’un appel continu dans le même bloc, donc la valeur de prix accumulée ne sera pas mise à jour.
-
Prix Mise à jour cumulative: Si la différence de temps est supérieure à 0 et que la réserve n’est pas 0, utilisez la bibliothèque mathématique à virgule fixe UQ112X112 pour calculer le ratio de prix et mettre à jour Price0cumulaativelast et Price1cumulaativelast. »Ne jamais déborde » ici signifie que parce que l’intervalle de temps est de type UInt32, la multiplication avec la valeur de prix accumulée (Uint224) ne provoquera pas de débordement. »+ Le débordement est souhaité » fait référence à la valeur accumulée du prix pour permettre un débordement, car le calcul du prix utilise le delta au lieu de la valeur absolue.
-
Mettre à jour la réserve: attribuez le nouveau solde à Reserve0 et Reserve1 pour mettre à jour la réserve du pool de liquidités.
-
Timestamp de mise à jour: attribuez l’horodatage en bloc actuel à Blocktimestamplast pour préparer la prochaine mise à jour.
-
Trigger Synchronisation Event: publiez un événement de synchronisation via le mot-clé EMIT pour informer l’auditeur externe que la réserve a été mise à jour.
-
Safemath.sol
-
Uniswapv2Library.sol
-
Uniswapv2lididitymathlibrary.sol
-
Uniswapv2oracleLiBrary.sol
-
Ajouter une fonction: utilisée pour effectuer des opérations d’addition en toute sécurité de deux entiers non signés
-
Sous fonction: utilisé pour effectuer des opérations de soustraction en toute sécurité de deux entiers non signés
-
Fonction MUL: Utilisé pour effectuer des opérations de multiplication en toute sécurité de deux entiers non signés
-
Fonction Sorttokens: Renvoie deux adresses de jeton triées par adresse.L’entrée est deux adresses de jeton Tokena et TokenB.La sortie est le jeton trié Token0 et Token1.
-
Fonction PairFor: calcule l’adresse de l’adresse d’usine donnée et la paire de deux adresses de jeton sans passer d’appels externes.L’entrée est l’usine d’adresse d’usine, les deux token adresses tokena et tokenb;
-
Fonction GetReserveS: Obtenez et triez une paire de réserves.La contribution est l’usine d’adresse d’usine, les deux token adresses tokena et tokenb;
-
Fonction de devis: renvoie la quantité équivalente d’un autre actif basé sur la quantité d’actif donnée et la réserve de la paire.Entrez: Quantité des actifs A, réserve et réserveB.La sortie est le montant d’un autre actif.
-
Fonction GetAmountOut: renvoie le nombre de sortie maximal d’un autre actif basé sur le nombre d’actifs d’entrée et les réserves de la paire.L’entrée est le nombre d’actifs d’entrée Montant, ReserveIn et Reserveout;
-
Fonction GetAmountin: renvoie le nombre d’un autre actif à saisir en fonction du nombre d’actifs de sortie et des réserves de la paire.L’entrée est la quantité de quantité de quantité de sortie, la réserveine et la réserve.
-
Fonction GetAmountsout: Effectuez la chaîne GetAmountout Calcul sur n’importe quel nombre de paires, l’entrée est l’usine d’adresse d’usine, le nombre d’actifs montant, le chemin de chemin;
-
Fonction GetAmountSin: Effectuez la chaîne GetAmountin Calcul sur n’importe quel nombre de paires, l’entrée est l’usine d’adresse d’usine, le nombre de sorties de montants de montants, le chemin de chemin;
-
Fonction CurrentBlocktimestamp: renvoie l’horodatage du bloc actuel.Entrée Aucune, la sortie est l’horodatage du bloc actuel, tapez uint32.
-
CurrentCumulativePrices Fonction: calcule et renvoie le prix cumulatif.L’entrée est la paire d’adresses de la paire de transactions, et la production est le prix cumulatif Price0Cumulatif et Price1cumulatif et le bloc de blocage de blocage actuel.
-
Fonction ComposeProfitMaximizingTrade: calcule la direction et la taille de la transaction qui maximise les bénéfices.
-
GetReserSafterArbitrage Fonction: En vertu du « prix réel » observé, les réserves du pool de liquidités sont obtenues après des transactions d’arbitrage.
-
Fonction de la valeur de la valeur de la valeur: calcule la valeur de liquidité, tous les paramètres d’un pool de liquidités donné.
-
Fonction GetLiquididityValue: obtient tous les paramètres actuels et calcule la valeur de la quantité de liquidité.
-
GetliquididityValulefterarbitraGraStrice Fonction: Compte tenu de deux jetons et de leur « prix réel », ainsi que le montant de liquidité, renvoyez la valeur de la liquidité.
-
Constructeur (adresse _factory, adresse _weth): initialisez l’adresse du contrat d’usine et l’adresse du contrat WETH.
-
Modificateur Assurez-vous (date limite UInt): assurez-vous que la transaction est terminée avant la date limite.
-
recevoir () à payer externe: reçoit ETH, seuls les appels des contrats sont autorisés.
-
_Addliquidité: une fonction interne, utilisée pour ajouter de la liquidité, calculer le nombre optimal de jetons en fonction des réserves existantes.
-
Addliquidité: ajouter de la liquidité de deux jetons ERC-20.
-
Addliquidité: Ajouter la liquidité des jetons ERC-20 et ETH.
-
Removeliquidité: supprime la liquidité de deux jetons ERC-20.
-
Removeliquidité: élimine la liquidité des jetons ERC-20 et de l’ETH.
-
Removeliquidité avec permitte: supprime la liquidité de deux jetons ERC-20 avec licence.
-
RemoveliquiditéTh avec permit: supprimé les jetons ERC-20 et liquidité ETH avec licence.
-
Removeliquidité La prise en charge de l’apport de transfertokens: supprime la liquidité des jetons ERC-20 et ETH, et prend en charge les jetons de frais.
-
RemoveliquiditéTh, PermitSupportingFeeOrTransferTokens: supprime la liquidité des jetons ERC-20 et ETH avec licence, prend en charge les jetons de frais.
-
_swap: fonction interne, exécute la logique d’échange de jetons.
-
SwapexactToKenSfortOkens: utilisez le nombre exact de jetons pour échanger contre un autre jeton.
-
swaptokensforexactTokens: utilisez des jetons pour échanger un nombre exact de tokens.
-
swapexactethfortokens: utilisez le nombre exact d’ETH pour échanger des jetons.
-
swaptokensforexACTeth: utilisez des jetons pour échanger la quantité exacte d’ETH.
-
SwapexactTokensForeth: Échange d’ETH avec le nombre exact de jetons.
-
SwapethforexactTokens: Utilisez ETH pour échanger le nombre exact de jetons.
-
SwapexactTokensFortKensSupportingFeeArTransferTokens: Utilisez le nombre exact de jetons pour échanger contre un autre jeton, des jetons de frais de support.
-
swapexacteThfortOkensSupportingFeeOrTransferTokens: Utilisez le nombre exact de jetons d’échange ETH, les jetons de frais de support.
-
SwapexactTokensForethSupportingFeeOrTransferTokens: Utilisez le nombre exact de jetons pour échanger ETH, support des jetons de frais.
-
Citation: Calculez le nombre de jetons B correspondant à une quantité donnée de jeton A en fonction de la quantité de réserve.
-
GetAmountout: calcule le nombre de sorties qui peuvent être obtenues compte tenu du nombre d’entrées et de réserves.
-
GetAmountin: calcule le nombre d’entrées requis pour une quantité de sortie et une quantité de réserve donnée.
-
GetAmountsout: Calculez le numéro de sortie en fonction du chemin et du numéro d’entrée.
-
GetAmountSin: Calculez le nombre d’entrées en fonction du chemin et du nombre de sorties.
-
Ajouter la liquidité: permet aux utilisateurs d’ajouter deux jetons au pool de liquidités en échange de jetons de fournisseur de liquidité.
-
Retirez la liquidité: permettez aux fournisseurs de liquidités d’échanger leurs jetons de fournisseur de liquidité vers les deux jetons.
-
Transactions: permet aux utilisateurs de négocier entre différents jetons, prend en charge les transactions directes et les chemins à travers plusieurs paires de trading.
-
Calcul de la citation: fournit une série de fonctions pour calculer les détails de la transaction lors d’un volume d’entrée ou de sortie donné.
-
Fonction du constructeur: fonction du constructeur, utilisé pour initialiser le contrat UniSWAPV2Migrator.L’entrée est l’adresse de l’usine V1 _factoryv1 et l’adresse du routeur V2 _UROUTER;
-
Recevoir la fonction: reçoit ETH, permettant au contrat de recevoir ETH de tout commutateur et routeur V1.Entrée Aucun, sortie Aucun.
-
Fonction de migrer: l’entrée est le jeton d’adresse de jeton, le nombre de jetons minimum montant en alliage, la quantité minimale de la quantité de quantité, l’adresse de réception à la date limite;
-
Balance de la fonction: renvoie le solde d’une adresse dans le contrat d’échange.
-
Fonction de transfrom: transfère les jetons d’une adresse à une autre.
-
TokentoethSwapInput Fonction: Utilisé pour échanger des jetons dans l’éther.
-
Fonction ethtotokenswapinput: échange de l’éther dans les jetons.
Cette conception permet à UniSWAPV2 de maintenir la continuité et la précision des prix lors du traitement de grandes quantités de transactions, et peut calculer avec précision le prix de transaction moyen grâce au volume de modification même lorsque l’horodatage du bloc ou la valeur accumulée du prix peut déborder.Ceci est réalisé en utilisant intelligemment les mathématiques fixes et la différence de temps.
Dans UNISWAPV2, les utilisateurs seront facturés des frais de traitement de 0,3% par transaction.Un sixième de ces frais sera alloué à l’équipe de développement, et les cinq sixième restants seront donnés au fournisseur de liquidités en tant que récompense.Cependant, si les frais de manutention sont calculés une fois par transaction, cela augmentera inévitablement les frais de gaz de l’utilisateur.
Par conséquent, dans UNISWAPV2, les frais de manutention seront accumulés et les frais de manutention ne seront alloués que lorsque la liquidité changera.La fonction _mintfee vérifie d’abord si les frais de transaction sont activés et détermine l’adresse de réception des frais.Si les frais de transaction ne sont pas activés et qu’il y a eu des frais de frappe (_klast n’est pas 0), réinitialisez la valeur Klast.Ce mécanisme de casting des frais fait partie de l’UNISWAPV2 pour fournir des incitations supplémentaires aux fournisseurs de liquidités;
Sₘ représente le nombre de jetons liquides qui devraient être frappés, K₁ représente le produit de réserves après l’événement de liquidité précédent, K₂ représente le produit de réserve actuel K, S₁ représente l’alimentation totale de jetons liquides après la quantité d’événement de liquidité précédente.
4.3 Contrat de périphérie
La fonction principale des contrats périphériques uniswapv2 est de servir de pont entre les comptes externes et les contrats de base, y compris quatre parties: définition d’interface, bibliothèque d’outils, routeur et implémentation d’échantillons.
4.3.1 Bibliothèques
Le dossier des bibliothèques contient quatre fichiers
Ensuite, nous analyserons ces quatre fichiers Sol en détail
Safemath.sol
SafeMath.sol est utilisé pour effectuer des opérations mathématiques sécurisées de débordement, qui sont très importantes pour éviter les erreurs de débordement et de sous-flux entières, en particulier dans le développement de la blockchain et des contrats intelligents.Il contient principalement trois fonctions.
Les commentaires de code spécifiques sont les suivants
Uniswapv2Library.sol
Uniswapv2Library.sol fournit des fonctions pratiques pour interagir et fonctionner avec des paires d’échanges V2 uniswap.
Ces fonctions sont principalement utilisées pour calculer les chemins de transaction, obtenir des réserves, calculer les prix et effectuer des calculs de chaîne.Cette bibliothèque utilise une bibliothèque appelée Safemath pour assurer la sécurité des opérations mathématiques et éviter le débordement entier et le sous-flux.Uniswapv2library.sol Ce fichier contient huit fonctions:
Les commentaires détaillés sur le code source uniswapv2libray sont les suivants:
Uniswapv2oracleLiBrary.sol
Le fichier uniswapv2oraclelilibrary.sol fournit certaines méthodes auxiliaires pour les opérations liées à Oracle calculant les prix moyens.La bibliothèque comprend des méthodes pour obtenir l’horodatage de bloc actuel et calculer le prix cumulé, aider à économiser les coûts de gaz et à éviter les appels synchrones fréquents.Il contient deux fonctions, comme suit:
Le code source officiel d’UniSWAPV2ORACLELIBRARY.SOL est le suivant:
Uniswapv2lididitymathlibrary.sol
Le code source officiel de UniSWAPV2lididityMathLibrary.sol est le suivant
Uniswapv2Router02.sol
Regardons d’abord le code source de UniSWAPV2ROUTER02.
Constructeurs et modificateurs
Fonctions qui reçoivent eth
Ajouter des liquidités
Retirer la liquidité
Échange de jetons
Fonctions de la bibliothèque
Regardons les fonctions une par une ci-dessous.
Le contrat uniswapv2Router02 implémente l’interface iuniswapv2Router02, fournissant les fonctions clés suivantes:
Le modificateur Assurer est utilisé pour vérifier si le temps de bloc actuel dépasse le dernier temps de transaction, garantissant que la transaction spécifiée par l’utilisateur n’échoue pas en raison du délai d’expiration, ce qui contribue à améliorer la sécurité et la fiabilité de la transaction.
Le constructeur initialise l’adresse du contrat du projet et l’adresse du contrat WETH, qui sont toutes deux inchangées tout au long du cycle de vie du contrat.
La fonction de réception est généralement utilisée pour permettre à un contrat de recevoir directement Ether, plutôt que via un appel de fonction.Dans cet exemple particulier, la fonction de réception utilise l’instruction ASSERT pour s’assurer que seul le contrat WETH peut lui envoyer Ether.
Le but de la fonction _Addlididité est de calculer le nombre optimal de deux jetons que l’utilisateur doit déposer lors de l’ajout de liquidité.Il y a six paramètres pour que cette fonction accepte. L’utilisateur pour ajouter une quantité pour empêcher le glissement d’être trop faible.
Ce calcul prend en compte le montant des réserves de jetons déjà dans le pool de liquidités pour garantir que la liquidité ajoutée par l’utilisateur est équilibrée.Si le pool de liquidités est nouveau et qu’il n’y a pas de réserve existante, les utilisateurs peuvent ajouter directement le montant qu’ils souhaitent.S’il y a déjà une réserve dans le pool, la fonction calculera le nombre optimal d’ajouts en fonction de la proportion actuelle, garantissant que la proportion de jetons dans la piscine reste inchangée après l’ajout de liquidité.
Fonction publique d’Addliquidité pour ajouter de la liquidité au pool de liquidités des deux jetons spécifiés (Tokena et Tokenb)
La fonction AddLiquidité permet aux utilisateurs d’ajouter des jetons et de l’éther non éther au pool de liquidités uniswapv2 en échange du jeton de liquidité correspondant. Des jetons non éther que l’utilisateur souhaite ajouter, la quantité de dimensionnming est le nombre minimum de jetons non éther que l’utilisateur peut accepter, utilisés pour empêcher le glissement Utilisé pour empêcher le glissement d’être trop faible, à l’adresse de la réception des jetons de liquidité nouvellement créés, la date limite est la date limite de la transaction, utilisée pour empêcher les délais d’attente de transaction.
La fonction renvoie trois paramètres: la quantité et le montant sont la quantité de pièces non éther et éther qui sont réellement ajoutées au pool de liquidités, et la liquidité est le nombre de jetons de liquidité nouvellement créés.
La fonction de suppression permet aux utilisateurs de supprimer la liquidité qu’ils ont précédemment ajoutée du pool de liquidités et d’obtenir deux jetons proportionnellement.La fonction de brûlure est une fonction sous-jacente du contrat de pool de liquidités iuniswapv2pair, utilisé pour effectuer des opérations réelles de destruction de liquidité et d’allocation de jetons.
La fonction RemovelididityEth permet aux utilisateurs de supprimer la liquidité qu’ils ont précédemment ajoutée avec l’éther du pool de liquidités unisWAPV2 et d’obtenir respectivement la non-étage et l’éther correspondants.La fonction appelle d’abord la suppression de la suppression, puis extrait le jeton correspondant via SafetRansfer, puis remplace le Weth extrait de la liquidité de combustion par ETH, puis transfère l’ETH racheté au receveur.
La fonction Removeliquidité avec permit permet aux utilisateurs d’autoriser via la signature ECDSA, permettant aux contrats de supprimer la liquidité au nom des utilisateurs sans l’autorisation précédente de l’utilisateur via l’approbation de la fonction.
La fonction de supprimer avec permit combine la suppression et les mécanismes d’autorisation de permis, permettant aux utilisateurs de supprimer la liquidité en signant un contrat d’autorisation unique sans avoir besoin d’utiliser le mode d’approvisionnement standard.Cela offre une meilleure expérience utilisateur et une meilleure sécurité tout en réduisant les coûts de gaz des transactions.
La fonction RemoveliquididityEthSupportingFeeAtRansferTokens permet aux utilisateurs de supprimer la liquidité qu’ils ont précédemment ajoutée avec des jetons spécifiques et de l’éther du pool de liquidités uniswapv2, en tenant compte que certains jetons peuvent facturer des frais lors du transfert.
La fonction appelle d’abord la suppression pour effectuer la suppression de la liquidité, puis gère le transfert de jetons, garantissant que l’utilisateur obtient le nombre de jetons qu’ils méritent, et convertit enfin le WETH en éther et transfère à l’utilisateur.L’ensemble du processus doit être terminé avant la date limite de transaction spécifiée par l’utilisateur.
Removeliquidité La fonction de réduction de la fonction de support de dons de transfert de transfert, de réapparition de la fonction de réduction des transfertokens et de permettre les mécanismes d’autorisation, permettant aux utilisateurs de retirer en signant un contrat d’autorisation unique.
Cette approche fournit un moyen d’autoriser les contrats à faire fonctionner les actifs des utilisateurs sans utiliser le mode d’approvisionnement, réduire les coûts de gaz et améliorer l’expérience utilisateur.
La fonction _swap est une fonction interne qui effectue une série d’opérations d’échange de jetons.Il échange d’un jeton à un autre selon le chemin et la quantité spécifiés jusqu’à ce que le jeton final soit atteint.Cette fonction est la partie centrale de l’interaction de pool de liquidités, utilisée pour implémenter la conversion de jetons et les mises à jour du pool de liquidité.
La fonction SwapexactTokenSfortOkens est une caractéristique clé du routeur uniswapv2 qui permet aux utilisateurs d’échanger au moins un jeton de sortie minimum avec une quantité d’entrée exacte.Cette fonction calcule d’abord la sortie de l’ensemble du chemin d’échange, puis garantit que la sortie finale répond aux exigences minimales de l’utilisateur, puis transfère en toute sécurité les jetons de l’utilisateur vers le pool de liquidités et effectue l’opération d’échange.
La fonction SwaptokensForexactTokens permet aux utilisateurs de spécifier le nombre de jetons qu’ils souhaitent obtenir et de fournir des jetons qui ne dépassent pas la valeur maximale d’échange.Cette fonction calcule d’abord l’entrée maximale requise pour obtenir la quantité, puis garantit que cette entrée ne dépasse pas le montant de la quantité spécifiée par l’utilisateur.
La fonction SwapExAtteThfortOkens permet à l’utilisateur d’échanger au moins un certain nombre de tokens avec une quantité exacte d’ETH.Cette fonction vérifie d’abord si le chemin d’échange est valide, puis calcule le nombre requis de WETH, enregistre l’ETH dans le contrat WETH, puis effectue l’opération d’échange et envoie les jetons échangés à l’adresse spécifiée par l’utilisateur.L’ensemble du processus doit être terminé avant la date limite de transaction spécifiée par l’utilisateur.
La fonction de la fonction swapexactethfortokens est de vendre un nombre défini d’ETH en échange d’autres jetons.Tout d’abord, effectuez des vérifications de chemin efficaces pour garantir que le premier élément du tableau de chemin est l’adresse WETH, car la paire de transactions uniswap est une paire de transactions ERC20 / ERC20;
Ensuite, il y a de calculer la quantité de sortie, utilisez la fonction uniswapv2Library.getAmountout pour calculer le nombre de chaque jeton que l’utilisateur peut obtenir en fonction du nombre d’ETH envoyé par l’utilisateur msg.Value et chemin de chemin de chemin de jeton, et stocker le résultat par Le tableau des montants; Suivant consiste à effectuer la vérification de sortie minimale, et la fonction vérifie si le dernier élément du tableau des montants (c’est-à-dire le nombre de jetons cibles) répond à la quantité de sortie minimale définie par le montant de l’utilisateur.
S’il n’est pas satisfait, une erreur sera lancée; À l’adresse du contrat de la paire de transactions spécifiée, si elle échoue, la transaction reviendra, et enfin la fonction interne _swap est appelée pour exécuter le processus d’échange de jeton réel.
SwaptokensforexAcTeth est un processus de vente d’autres jetons en échange d’une certaine quantité d’ETH. , l’adresse à laquelle l’ETH est reçue et la date limite des transactions;
Premièrement, la vérification de la validité du chemin est vérifiée pour garantir que le dernier élément du chemin d’échange est l’adresse Weth, et sinon, une exception est lancée; Le fait que l’utilisateur doit fournir pour obtenir le nombre de pièces d’ETH de montants; La fonction SafeTransferfrom de TransferHelper pour transférer en toute sécurité les jetons de l’adresse MSG.Sender;
Ensuite, appelez la fonction interne_swap pour exécuter le processus d’échange de jetons réel; utilisateur. .
La fonction de la fonction SwapExActTokensForeth est utilisée pour échanger au moins le nombre d’ETH de montants avec un nombre fixe de jetons. Pour obtenir Mortoutmin, le chemin du chemin d’échange de jetons, l’adresse à laquelle l’ETH est reçu, et la date limite de la transaction est la date limite;
La fonction de SwapethforexactTokens permet aux utilisateurs d’échanger un nombre fixe de jetons à l’aide d’ETH, et la logique d’implémentation est similaire à SwapexactTokensForeth ci-dessus, SwaptokensforexACTeth.
La fonction _swapsupportingFeeOrTransferTokens prend en charge la logique de l’échange de jetons pour les frais de transaction.
SwapexactToKensFortKensSupportingFeeOrTransferTokens Le nombre fixe de jetons est précisément échangé contre au moins le nombre attendu d’un autre jeton, tout en gérant le cas des jetons de frais de transaction.
swapexacteThfortOkensSupportingFeeOrTransferTokens implémente l’utilisation d’un nombre spécifique d’ETH pour échanger d’autres jetons
La fonction SwapExActTokensForethSupportingFeeOrTransferTokens permet à l’utilisateur d’échanger avec précision au moins le montant d’ETH attendu avec un nombre fixe de jetons, tout en gérant les jetons de frais de transaction et en garantissant un transfert précis d’ETH.
La fonction de devis implémente la fonction du calcul et du renvoi du nombre d’autres jetons que l’utilisateur peut échanger en fonction du nombre de jetons spécifiés par l’utilisateur et de la réserve de deux jetons dans le pool de liquidités.
Les principes de calcul de la fonction GetAmountOut et la fonction GetAmountout sont tous deux des algorithmes de produit constants.Définissez la fonction GetAmountout pour calculer le montant de sortie que l’utilisateur peut obtenir après une quantité d’entrée donnée et un montant de réserve; définir la fonction GetAmountout pour calculer la série de montants de sortie que l’utilisateur peut obtenir après une quantité d’entrée et un chemin d’échange donné.
Le principe de calcul de GetAmountin et Getamountsin est de calculer le nombre d’actifs vendus en fonction de l’algorithme de produit constant.
4.3.2 Migrator uniswapv2.sol
Uniswapv2migrator.sol est utilisé pour migrer la liquidité de l’UNISWAP V1 à UniSWAP V2.Ce contrat comprend la possibilité de recevoir ETH et utilise des routeurs UNISWAP V1 et V2 et des contrats d’échange pour la migration.Il garantit que les utilisateurs peuvent transférer leur liquidité en toute sécurité dans UNISWAP V1 vers uniswap v2.Il existe trois fonctions, et les fonctions spécifiques de chaque fonction sont les suivantes:
Le code source officiel de UniSWAPV2Migrator est analysé en détail comme suit:
4.3.3 Dossier d’interfaces
Le dossier Interfaces contient des définitions d’interface pour interagir avec les échanges, routeurs, usines et contrats Weth et ERC20.Les caractéristiques clés comprennent la gestion et la migration de la liquidité, la manipulation du trading de jetons, l’ajout et l’élimination de la liquidité et l’emballage et le déballage de l’ETH.Ces interfaces garantissent des interactions standardisées entre les contrats.Examinons le contenu de chaque fichier en détail.
Iuniswapv1Exchange.sol
Ce fichier définit une interface iuniswapv1Exchange, qui est utilisée pour interagir avec les contrats d’échange uniswapv1.Le contrat d’échange est principalement responsable de la gestion des transactions et de la gestion des liquidités entre les jetons et l’ETH.Il contient les quatre fonctions suivantes:
Iuniswapv1factory.sol
Iuniswapv1factory.sol Il est utilisé pour interagir avec les contrats d’usine d’UNISWAPV1.L’analyse de code spécifique est la suivante:
Ierc20.sol
IERC20.SOL définit une interface appelée IERC20, qui suit la norme de jeton Ethereum (ERC-20)
Iuniswapv2migrator.sol
Iuniswapv2migrator.sol est utilisé pour interagir avec le contrat de migration de l’UNISWAP v2.
Iuniswapv2Router01.sol
L’interface iuniswapv2Router01 offre une variété de fonctions, y compris l’ajout et l’élimination de la liquidité, l’échange de jetons, etc. Ces fonctions sont au cœur de la construction d’une plate-forme de trading décentralisée et d’un pool de liquidités.Grâce à cette interface, les utilisateurs peuvent facilement interagir avec le protocole UNISWAPV2.
Iuniswapv2Router02.sol
La méthode de l’interface iuniswapv2Router02.Sol ajoute principalement la prise en charge des frais de transfert, ce qui permet aux fournisseurs de liquidités ou aux porte-jetons de recevoir une partie des frais en retour lors du transfert de jetons.La mise en œuvre de ces méthodes appelle généralement le contrat de jeton correspondant en bas pour réaliser les frais facturés pendant le transfert.
Iweth.sol
Iweth.sol définit une interface appelée IWeth, qui représente une interface standard sur Ethereum pour interagir avec les contrats Erther (Weth) enveloppés.