
出典:Gryphsis Academy
この調査レポートは、UNISWAPV2プロトコルの作業原則、プロジェクト構成、ソースコード分析、その他の部分の詳細な解釈を提供します。作業原則には、自動マーケットメーカー(AMM)が含まれます主要な契約(工場契約、交換契約など)およびその機能セクションでは、UNISWAPV2のスマートコントラクトソースコードを分析し、主要な機能とデータ構造の設計概念を説明します。
1。契約の紹介
UNISWAPV2は、Ethereumブロックチェーンに基づいた分散型トランザクションプロトコルであり、ユーザーは仲介者を信頼せずに暗号通貨を取引できるようにします。従来の集中交換とは異なり、UNISWAPV2は自動マーケットメーカー(AMM)モデルを採用して、スマートコントラクトを通じてトランザクションと流動性プールを管理し、それによって完全な分散化を達成します。
uniswapv2のコアは、その一定の製品式です(x * y = k)、でxそしてy流動性プールの2つの異なる資産の数をそれぞれ表します。k定数です。この式により、各トランザクションの後、プール内の資産の割合が再調整され、ユーザーに流動性を提供することが保証されます。この設計により、取引プロセスが透明かつ公正になり、ユーザーはいつでも流動性を追加または削除し、取引料を通じて利益を得ることができます。
UNISWAPV2プロトコルは複数のスマート契約で構成されており、その中で最も重要なのは工場契約と交換契約です。工場契約は流動性プールの作成と管理を担当しますが、各交換契約は特定の取引ペア(ETH/DAIなど)に対応しています。
さらに、UNISWAPV2は、トランザクションの効率とセキュリティを改善するために、ルーター契約とライブラリ機能も導入しました。UNISWAPV2は、その前身であるUNISWAPV1と比較して、いくつかの重要な改善をもたらします。まず、Lightning Exchange機能により、ユーザーは1つのトランザクションで資産を借りて、トランザクションが終了する前に返品することができます。2つ目は価格Oracleです。これは、価格の時刻加重平均(TWAP)を蓄積することにより、より信頼性の高い価格データを提供します。
さらに、UNISWAPV2は、Ethereumを仲介者として使用する必要なく、ERC-20トークンの直接トランザクションをサポートしています。Uniswapv2の成功は、その技術革新だけでなく、オープンでコミュニティ主導の開発モデルにもあります。UNISWAPプロトコルは、誰でも自由に使用および拡張できます。これにより、分散型ファイナンス(DEFI)エコシステムに無制限の可能性がもたらされます。貸付プラットフォームやStablecoinプロトコルなど、他の多くのDefiプロジェクトは、UNISWAPに基づいて構築され、繁栄する生態系を形成しています。
一般に、UNISWAPV2は、革新的なプロトコル設計と分散型オペレーティングモデルを介した暗号通貨トランザクションの方法を完全に変え、Defi分野の重要な基礎となっています。テクノロジーの継続的な開発とコミュニティの継続的な革新により、UNISWAPV2の影響はさらに拡大し、グローバルユーザーにより多くの経済的自由と機会をもたらします。
2。プロトコル機能
2.1 ERC-20ペア
Uniswapv1は、Ethereum(ETH)を移行通貨として使用します。つまり、ユーザーがTokenaとTokenbを交換したい場合、Tokenaを使用してETHを交換し、次にETHを使用してTokenBを交換する必要があります流動性、流動性プロバイダーに大きなコスト圧力をかけます。すべての流動性プロバイダーは、ETHと交換するためのインターフェースを持っている必要があります。
2つの資産ABCとXYZが関連付けられている場合(たとえば、どちらも米ドルのスタブコインです)、UNISWAPの流動性プロバイダーは通常、ABC/ETHまたはXYZ/ETHと比較してABC/XYZペアの永続的な損失が少なくなります。さらに、ETHを強制移行通貨として使用すると、トレーダーのコストが増加します。トレーダーは、ABC/XYZの直接購入の2倍の支払いを行い、2つのスリッページも苦しみます。
UNISWAPV2では、流動性プロバイダーは、任意の2つのERC-20トークンのペア契約を作成することができます。ERC-20トークン間のトランザクションペア数の急増により、特定のアセットトランザクションパスを見つけるのがより複雑になる場合がありますが、この問題は高レベルのルーティングによって解決できます(オフチェーンまたはオンチェーンルーターまたはアグリゲーターを介して解決できます。 )。
2.2価格Oracle
UNISWAPV1の価格は時間tによって計算されます。UNISWAP(処理料を除く)によって提供される限界価格は、資産Aの予備額を資産bで割ることによって得ることができます。特定の計算式は次のとおりです。
ただし、UnisWapv1は、操作が非常に簡単であるため、オンチェーン価格のオラクルとして使用することは安全ではありません。マニピュレーターは、ブロックの開始時に多数の資産Aを販売して価格に影響を与え、その後、ブロックの中央で他の契約操作(非UNISWAPペア契約)を実行し、最終的に購入します。同じ量の資産Aは、価格を通常のレベルに戻します。UNISWAP V2は価格蓄積メカニズムを導入し、第三者が特定の範囲の平均価格を使用できるようになり、価格操作の難しさを大幅に高め、操作行動には大きな利点がありません。
具体的には、UNISWAP V2は、誰かが契約と対話する各ブロックの開始時に価格の蓄積合計を記録することにより、この価格を蓄積します。各価格は、ブロックタイムスタンプに基づいて、前のブロックが更新されるため、経過時間に基づいて加重されます。これは、いつでも(更新後)、アキュムレータの値は、契約履歴の毎秒のスポット価格の合計であることを意味します。
時間の時刻の平均価格を時間t₁からt₂まで推定するために、外部発信者はt₁でアキュムレータ値をチェックし、t₂でもう一度確認し、最初の値を差し引き、経過数秒単位で除算できます。(契約自体は、このアキュムレータの歴史的価値を保存しないことに注意してください – 呼び出し元は、この値を読んで保存するために、サイクルの開始時に契約を呼び出す必要があります。)
Oracleユーザーは、いつサイクルを開始および終了するかを選択できます。より長いサイクルを選択すると、攻撃者が時間加重された平均価格(TWAP)を操作するのがより高価になりますが、これにより最新の価格が低くなります。平均値が使用されるため、特定の間隔でのA/BおよびB/Aの平均値は相互関係ではなくなるため、UNISWAP V2は両方の価格を提供します。
2.3価格計算の精度
Solidityは非統一数値データ型をサポートしていないため、UNISWAPV2はUQ112.112データ形式を採用して価格計算の精度を向上させ、UINT112を使用してトランザクションペアに資産の数を保存し、32ビットを使用して作成を記録します現在のブロックの時間。今回の記録方法により、2106年2月7日、100年後にUNIXタイムスタンプがオーバーフローします。これは、UNIXタイムスタンプが1970年1月1日以来の数秒で時間を表し(UNIX ERAと呼ばれる)、UINT32は0から2^{32} -1秒の範囲を表すことができるためです。
2106年2月7日以降にシステムが適切に機能するようにするために、UNISWAPV2は、少なくとも1回のオーバーフローサイクル(約136年)に価格を確認するためにオラクルを必要とするように設計されています。これは、この設計では、タイムスタンプがオーバーフローする場合でも価格を蓄積する方法が依然としてオーバーフローセーフであり、トランザクションがオーバーフロー間隔に及ぶ場合でも、価格の変化を正しく計算できるためです。このようにして、システムは長い間正確で信頼性を維持することが保証されています。
2.4稲妻償還
Lightning Exchangeは、ブロックチェーンプラットフォームで実施される瞬時の暗号通貨交換であり、複数のブロックが確認されるのを待つことなく、異なる暗号通貨間のトランザクションを迅速に完了できます。このようなトランザクションは通常、スマートコントラクトによって自動的に実行され、取引の両当事者が同時に交換のコミットメントを満たすことを保証し、それにより取引リスクを削減し、効率を改善します。要するに、稲妻は最初に取引してから、稲妻の交換を通じて、ゼロコストの裁定を達成することができます。
Uniswapv2にA/Bトレーディングペアがあると仮定して、稲妻の償還を説明しましょうAの量A上記のプロセスを通じて、A0-A間の価格差裁定法を0コストで完了しました。校長は必要ありません。ガソリン料金を支払うだけです。チェーン上の他のデックスの間に価格の差があることがわかった場合、ゼロコストアービトラージで同様の操作を実行することもできます。
2.5プロトコル料金
UNISWAPV2は、オン /オフにできる0.05%のプロトコル料金を導入します。有効になった場合、この料金は工場契約で指定されたFEETOアドレスに送信されます。当初、feetoは設定されていなかったため、料金は請求されませんでした。事前に指定されたアドレスFeetSetterは、UNISWAPV2工場契約のSetFeeto関数を呼び出して、FEETOを別の値に設定できます。feetsetterは、setfeetosetterと呼ばれて、feetsetterアドレス自体を変更することもできます。
feetoアドレスが設定されている場合、プロトコルは5ベーシブポイント料金の請求を開始します。これは、流動性プロバイダー\ frac {1} {6}によって得られる30ベーシスポイント料金です。つまり、トレーダーは引き続きすべての取引手数料の0.30%を支払い、そのうち83.3%(つまり0.25%)が流動性プロバイダーに支払われ、16.6%(つまり0.05%)がFeetoアドレスに支払われます。各トランザクションでこの0.05%の料金を請求すると、追加のガスコストが追加されます。これを回避するために、蓄積された料金は、流動性が堆積または撤回された場合にのみ請求されます。この契約は、蓄積された料金を計算し、トークンが造られたり破壊される直前に、新しい流動性トークンをフィーの受益者に埋めます。
蓄積された料金は、√k(すなわち√(x・y))の成長を測定することで計算できます。この式は、t₁としての流動プールの流動性の割合の累積費用を与えます。
t₁の前に料金がアクティブになった場合、feetoアドレスはt₁とt₂の間で⅙にキャプチャする必要があります。したがって、新しい流動性トークンをFeetoアドレスに造り、φ・f₁、₂のプールを表します。ここで、φ=⅙です。
つまり、次の関係を満たすためにsₘを選択したいと考えています。
いくつかの計算の後、1-の使用を含む
f₁、₂、seを解決する代わりに、次のように書き換えることができます。
φを⅙に設定すると、次の式が得られます
以下に、特定の例で説明しましょう。最初の預金者が100 DAIと1つのETHをペアに堆積させ、10株を取得するとします。しばらくして(他の預金者はペアリングに関与していませんでした)、彼らは資金を引き出しようとしましたが、その時点でペアリングには96のDAIと1.5 ETHがありました。これらの値を上記の式に置き換えると、次の結果が得られます。
2.6取引料の計算
uniswapv1トランザクション料金の計算は式です
この式は、一定の製品式が最初に削減され、次にUniswapv2のバージョンでのみ実行されることを意味します。
2.7 sync()およびskim()
Sync()は、主に比例不均衡と流動性プロバイダーが利用できない場合に、契約に一時的に保存されている資産の数を契約の現在の実際の価値に更新するために使用されます。Skim()は、契約の資産の数がUINT112の最大値を超える状況を処理するために使用され、ユーザーはUINT112の最大値を超える資産の一部を引き出すことができます。
2.8非標準とまれに使用されていないトークンの取り扱い
標準のERC20トークン契約は、トークンを転送した後にブール値を返す必要があり、転送が成功したかどうかを示しますが、すべてのトークンがそうするわけではありません。一部のトークンは値を返しません。UnisWAPV1では、返品値のないトークン転送はデフォルトで障害と見なされ、トランザクション全体がリセットされます。UNISWAP V2では、戻り値のないトークン転送は成功していると見なされます。
さらに、UNISWAPV1は、トークン転送がトランザクションペアの再突入をトリガーしないと想定していますが、ERC777フックをサポートする一部のERC20トークンはこの仮定を破ります。これらのトークンをサポートするために、uniswapv2はすべての公共の状態変数変更関数にアンチリエントリーロック機能を追加し、フラッシュスワップでユーザー定義のコールバックの再突入を防ぎます。
2.9流動性初期化設定
ユーザーが既存の取引ペアA/Bに流動性を提供する場合、AとBの現在の比率に基づいて、提供する比率AとBの数を計算できます。ただし、トランザクションペアが初期化されている場合、この時点でどのように対処する必要がありません。UnisWAPV1のバージョンでは、新しい流動性プロバイダーがトークンを既存のUNISWAPトークンペアに堆積させると、既存のトークンの数に基づいてミントされた流動性トークンの数が計算されます。特定の計算式は次のとおりです。
最初の人が流動性を提供するために、式はXSTARTINGはい0。この状況に直面して、UNISWAPV1によって採用される方法は、初期の流動性の値が最初に提供されるETHの量に直接等しいことです。しかし、問題は、この比率が実際の価値に沿っていることを保証するメカニズムがないことです。uniswapv2では、流動性の初期化は次の式で実行できます
この式は意味しますスミントされたこれはあなたが受け取る流動性トークンの量です、XDEPOSITEDこれは、たとえば預けている場合、最初のトークンの数ですXDEPOSITEDそれはあなたが預金するETHの量です。ydepositedこれは、預金した2番目のトークンの数です。
たとえば、daiを預ける場合、ydepositedそれはあなたが預金するダイの量です。このフォーミュラは、流動性プールのシェアがプールの幾何平均よりも低くなることはないことを保証できますが、この式の価値は、数を弱めるためにプール内のトークンの数の変化とともに変化します。変化の影響により、ファンドプールのトークンのuniswapv2は、初期の1E-¹⁵流動性を破壊しました。これはあらゆるトランザクションペアにとって些細なことですが、このメカニズムから利益を得る攻撃者のコストを大幅に増加させます。
2.10ウェス
Ethereum Native Currency ETHを取引するためのインターフェイスはERC20トークンを取引するものとは異なるため、多くのプロトコルはETHを直接サポートするのではなく、代替のWETH(パッケージETHトークン)を使用します。UNISWAPV1は、その取引ペアがETHを直接含み、ユーザーがETHを使用して直接取引できるため、例外です。ただし、UNISWAP V2は、ERC20トークン間の取引ペアをサポートするように設計されており、ETHの直接的なサポートはシステムを複雑にしてリスクを高めることができます。
したがって、ETHはUNISWAPV2で直接サポートされておらず、ユーザーはトランザクションペアを使用する前にETHをWETHに変換する必要があります。実際、UNISWAPV2は、ユーザーがサプリしたETHをWETHに内部的に変換します。これにより、ETHを手動でWETHに変換することなく、ユーザーの操作が簡素化されます。この変換は、あらゆるトランザクションペアにとって簡単ですが、システムのセキュリティと操作の容易さを効果的に改善します。
2.11決定論的取引ペアアドレス
UNISWAPV1またはUNISWAPV2であろうと、すべてのペアは単一の工場契約によって作成されます。uniswapv1では、create opcodeが使用され、トランザクションからコントラクトへのアドレスのアドレスは、作成された順序の影響を受けます。uniswapv2では、新しいopcode create2が使用され、この方法で生成されたアドレスが決定されます。これは、チェーンのステータスをクエリすることなく、トランザクションペアのアドレスをオフチェーンで事前に計算できることを意味します。
2.12トークンの最大数
Oracle関数を効率的に実装するために、UNISWAP V2はUINT112を使用してトークンの数を節約します。つまり、サポートされているトークンの最大数は2¹² -1です。18の正確さのトークンの場合、この値は十分であり、約5192296858534828(5.19e¹⁵)、つまり5.19兆もです。契約の記録値がこの制限を超えた場合、トランザクションは失敗し、リセットされます。前述のように、誰でもSkim()関数を使用して回復し、流動性プールから過剰な資産を削除することでこの問題を解決できます。
3。uniswapv2原理の分析
UNISWAPは、一定の製品フォーミュラを搭載し、イーサリアムブロックチェーン上の非アップグレード可能なスマートコントラクトシステムに実装された自動回帰プロトコルです。それは、信頼できる仲介者の必要性を排除し、地方分権化、検閲の抵抗とセキュリティの優先順位付けを行います。各UNISWAPスマートコントラクトまたは通貨ペアは、2つのERC-20トークンリザーブで構成される流動性プールを管理しています。誰でも、基礎となる各トークンの同等の値を預けてプールトークンを交換し、ファンドプールの流動性プロバイダー(LP)になります。これらのトークンは、総予約で比例配分されたLP株式を追跡し、基礎となる資産をいつでも引き換えることができます。
まず、UNISWAPの自動マーケットメーカーメカニズムを紹介します。
で、xトークンAの数を表します。yトークンBの数を表します、kプール内の2つのトークンの積が変わらないことを示す定数です。トレーダーがUNISWAPで取引すると、プールにトークンを追加または削除することにより、プール内のトークンの数を変更します。一定の製品式によると、製品を維持するために別のトークンの数がそれに応じて変化しますk絶え間ない。この変更により、トランザクションの価格が決まります。
たとえば、トレーダーがトークンBとトークンAと交換したい場合は、一定数のトークンAをプールに追加する必要があります。これにより、プール内のトークンBの数が減少し、価格が変更されます。トレーダーの操作はこの曲線に沿って移動し、トークンの数と価格を変更します。曲線上の任意のポイントは、一定の製品関係を満たします。
UNISWAPV2の実用的な原則は、流動性プロバイダー、UNISWAPプール、トレーダーの3つの部分にほぼ分割できます。流動性プロバイダーの役割は、流動性プロバイダーが2つのトークン(トークンAやトークンBなど)をUnisWapプールに預けることです。
図に示されている例では、流動性プロバイダーは10トークンAと1つのトークンBを堆積させます。
プールの流動性シェアは、流動性トークンで表されます。これは、トレーダーがトークンをプールに送信し、必要な別のトークンを交換できることを示しています。たとえば、トレーダーは10トークンAを預け入れ、0.3%のハンドリング料金を支払ってプールから1つのトークンBを取得できます。
まず、流動性プロバイダー(LPS)が流動性をどのように提供するかを見てみましょう。以下の図に示すように、流動性プロバイダーは、流動性を高めるためにトークンをUnisWapプールに預けます。
たとえば、図では、流動性プロバイダーが3トークンAと1トークンBを預けています。流動性プロバイダーがトークンを預けると、流動性シェアを表すプールトークンを受け取ります。図では、流動性プロバイダーは12.4プールトークンを獲得しました。プール内のトークン保護区は増加します。たとえば、図のプール内のトークン保護区は1210トークンAおよび399トークンBになります。より多くの流動性は、価格の滑りを削減し、取引をより安定させるのに役立ちます。
UNISWAPが使用する一定の製品式x・y = k価格曲線を決定します。流動性の向上により、低い滑り面積が拡大し、トランザクションの価格安定性が向上します。流動性プロバイダーは、トークンを堆積させることでプールの流動性を高め、見返りに対応する流動性トークンを取得します。これは、トレーダーがより安定した価格を獲得するのに役立つだけでなく、取引手数料の流動性プロバイダーに利益をもたらすのにも役立ちます。
次に、トレーダーの観点から、トレーダーがトークンをどのように交換するか、そして取引行動がUniswapプールにどのような影響を与えるか。
下の図に示すように、トレーダーはUniswapでトークンを交換したいと考えています。たとえば、図では、トレーダーは3つのトークンを交換する予定です。トレーダーは3つのトークンAに入り、0.3%の取り扱い手数料を支払います。最終的に、トレーダーは出力として約0.997トークンBSを取得します。トランザクションは、プールの予備の残高を変更し、新しい価格になります。トランザクションの前に、プールには1200トークンAと400トークンBがありました。
一定の製品式によるとx・y = k約1203.009トークンAと約399.003トークンBが取引後プールにあります。UNISWAP使用x・y = k価格曲線の一定の製品式が定義されています。トレーダーが交換すると、プール内のトークンの数が変化し、価格曲線も新しい価格を決定するために調整されます。
4。ソースコード分析
4.1コア操作フローチャート分析
このセクションでは、UNISWAPV2で最も一般的に使用される3つの操作、つまり流動性の追加、流動性の除去、トークンの交換を紹介します。彼らが呼び出す契約とフローチャートを介して呼び出す関数を分析して、UNISWAPV2のソースコードをより深く理解します。
4.1.1流動性を追加します
ユーザーが流動性を追加すると、ユーザーは最初にuniswapv2router.sol契約を呼び出してトークンAとトークンBの数を提供します。uniswapv2router.sol契約の追加機能はユーザーの要求を受け取り、処理します。
追加機能は、UnisWapv2pair.sol契約で、uniswapv2pair.sol契約をさらに呼び出します。 bユーザーが提供する(::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::: LPトークンの数)とこれらのLPトークンをユーザーに割り当てます。保護区を更新します。
4.1.2交換トークン
ユーザーがトークンを交換したい場合、最初にuniswapv2router.sol契約を呼び出して、入力トークンの数と出力トークンの最小数を提供します。
次に、uniswapv2router契約のswapexacttokensfortokens関数は、ユーザーの要求を受信し、swapexacttokensfortokens関数をさらに処理します入力トークンとリザーブの数に基づいて、交換が完了した後、トークンの数を計算します。特定のプロセスは次のとおりです。
4.1.3流動性の除去
ユーザーは最初にuniswapv2router.sol契約を呼び出して、uniswapv2router.sol契約の除去機能を提供します。 .SOL契約、CALL The Burn Functionは、実際の流動性撤回操作を実行します。
4.2コア契約
UNISWAPV2コア契約は、分散型取引プラットフォームであるUNISWAPのコア部分であり、自動化されたマーケットメーカー(AMM)関数の実装を担当しています。従来の注文書とは異なり、UNISWAPは流動性プールと一定の製品式を通過しますx・y = kトランザクションを実現するため。流動性プロバイダーは、2トークンをプールに預け入れ、資格として流動性トークンを取得します。ユーザーがトランザクションを実施すると、契約は、プール内のトークンの数と一定の製品式に基づいてトランザクション価格を計算します。UNISWAPV2は、ERC20ペアの直接取引、価格のオラクルの改善、フラッシュローン、プロトコル料金の調整など、いくつかの改善を導入しました。コア契約のコアコンポーネントには、次の3つのファイルが含まれます。
-
uniswapv2pair.sol:各取引ペアの流動性プールを管理し、トークン交換、流動性の追加、撤回
-
uniswapv2factory.sol:トランザクションペアの作成と管理を担当します
-
uniswapv2erc20.sol:流動性トークンの標準的な実装、流動性プロバイダーのシェアを表す
4.2.1 uniswapv2 Factory.sol
UNISWAPV2Factory契約の役割は、取引ペア(流動性プール)の作成と管理に責任があります。この契約により、ユーザーは新しい取引ペアを作成し、作成したすべての取引ペアを記録できます。さらに、アドレスとセッターのアドレスを受け取る取引料金を管理します。uniswapv2factory.solには5つの機能があります。個別に見てみましょう
-
コンストラクター機能:UnisWAPV2Factory契約の初期化に使用されるコンストラクター機能。入力は、トランザクション料金セッターアドレス_feetoSetterであり、出力はありません。
-
AllPairsLength関数:作成されたすべてのトランザクションペアの数を返します。入力はありません。出力は、すべてのトランザクションペアの数の単位です。
-
CreatePair関数:新しいトランザクションペアを作成します。入力は、TokenaとTokenbの2つのトークンアドレスであり、出力は作成されたトランザクションペアアドレスペアです。
-
SetFeeto関数:取引手数料の受け入れアドレスを設定します。入力は、新しいトランザクション料金受け入れアドレス_feetoであり、出力はありません。
-
SetFeetoSetter関数:新しいトランザクション料金セッターアドレスを設定します。入力は、新しいトランザクション料金セッターアドレス_feetoSetterであり、出力はありません。
特定のコード分析は次のとおりです。
CreatePair関数
createpair関数は、トケナとトークンブを使用してトランザクションペアを作成することです。 tokenb、続いてtoken0のアドレスを確認し、token0のアドレスを0にすることができないことが要求されます。
次に、このトークンペアが存在するかどうかを確認します契約;
次に、token0とtoken1のハッシュ値を塩値として使用して、各トークンペアのアドレスが一意であることを確認します。トークンペアのアドレスが一意でない場合、トレーダーの流動性は間違ったプールに追加される可能性があるため;その後、契約アドレスの独自性と予測可能性を確保するために、インラインアセンブリCreate2命令を使用して契約を作成します。
次に、新しく作成されたトークンペア契約を初期化し、マッピングテーブルを更新し、トークンペアの契約のアドレスを記録し、新しく作成したトークンペア契約アドレスをすべてのトークンペアのリストに追加し、最後にペア作成したイベントをトリガーして通知します作成する新しいトークンペアの外で。
4.2.2 uniswapv2 erc20.sol
uniswapv2ERC20.SOLの主な機能は、UNISWAPV2流動性プールで特別に使用されるERC20標準トークン関数を実装するERC-20トークンを実装することです。契約には、キャスティング、燃焼、承認、譲渡などの基本的な操作が含まれます。さらに、許可機能をサポートし、署名を使用してトークン転送を承認します。1つずつ含まれる関数を見てみましょう。
-
コンストラクター関数:契約の初期化、許可関数のdomain_separatorを設定します。入力なし、出力なし。
-
_MINT関数:新しいトークン、入力は受信アドレス「to」、ミント数量「値」、出力はnoです
-
_burn関数:トークンを破壊し、入力はからの破壊アドレスであり、破壊された数量値、出力はありません。
-
_Approve関数:承認トークン転送、所有者アドレス所有者、承認された住所スペンダーおよび承認された数量値、出力なし。
-
_TRANSFER関数:転送トークン、入力は転送アドレスからの転送、および転送数量値への転送、出力はありません。
-
承認関数:パブリック承認関数、関数は_Approve関数を呼び出し、入力は承認関数の公開承認関数であり、出力は操作が成功していることを示すために真のブール値を返すことです。
-
転送関数:関数は_ transfer関数を呼び出し、入力はアドレスを受け入れて数値値を転送することであり、出力はブール値を返すことです。
-
関数から転送:公開された認証転送機能。入力は、転送アドレス、受信アドレス、および転送数量値です。出力はリターンブール値であり、操作が成功したことを示します
-
許可関数:署名を使用してトークン転送を承認し、署名を確認し、_Approve関数を呼び出します。出力はありません。
公式のソースコード分析は次のとおりです。
4.2.3 uniswapv2 pair.sol
uniswapv2pairは取引ペアの契約であり、Uniswap v2のコア機能を実現します。つまり、各取引ペアの流動性プールを管理および運用します。この契約は、トークンの交換、流動性の追加と除去、および価格の蓄積計算を処理する責任があります。各トランザクションの後、トランザクションペアの予備情報と価格情報が更新され、対応するイベント通知がトリガーされることが保証されます。uniswapv2pair.solには11の関数があり、次の表に示されています。
公式のuniswapv2pair.solコードとコメントは次のとおりです。
uniswapv2pairはiuniswapv2pair、uniswapv2erc20を継承します。
次に、グローバル変数と修飾子が定義されます
上記の最小値は、流動性プロバイダーが少なくとも一定のトークンをいつでも保持するために、流動性プールに保持する必要がある流動性トークンの最小数を設定する定数です10は、初期の流動性を提供するときに燃え尽きます。トークン転送を実行するときに正しい関数署名が使用されます。
工場は、トランザクションペア契約のUNISWAP V2ファクトリー契約のアドレスを保存するために使用されます。Token0、Token1は、トークンアドレス、Resirse0、Resirse1およびBlockTimestamplastの保存に使用されます。製品とトランザクション時間ブロック(作成)時間。
Price0CumulativeLastとPrice1CumulativeLast変数を使用して、取引ペアの2つの価格の蓄積された値を記録し、KLASTを使用して、UNISWAPV2取引ペアの2つのトークン保護区の最近の状態を重要なパラメーターとして追跡するために使用されます。主にチーム処理料の計算に使用される流動性プールの価格安定性を維持し、取引料を計算するため。
デコレーターの次のセクションは、再突入攻撃を防ぐためのロックメカニズムを提供します。
_上記のコードは、このコードの一般的なロジックを表します攻撃と人種の条件に再び入ります。
以下の関数は、現在の2つのトークンリザーブとUNISWAPV2トランザクションペア契約の最後の更新されたタイムスタンプに関する情報を公開および返す方法を提供することです。
_Safetransfer機能の機能は、スマート契約内でトークン転送操作を実行し、転送が失敗した場合、契約のセキュリティとトークン転送の信頼性を確認することですこのセクションの詳細なコードです。
次のコンストラクターは、単に工場の初期化に使用されます。
初期化関数の関数は、トランザクションペア契約に含まれる2つのトークンのアドレスを設定することであり、トランザクションペアが展開されている工場契約でのみ呼び出すことができ、トランザクションペアの初期化プロセスが安全であり、制御。
_Update関数の主な機能は、トランザクションへの契約の蓄積者が最新の状態を反映できることを確認することです。 1つ。_update関数の4つの入力パラメーターは、balance0とbalance1であり、トランザクションペアの2つのトークンの現在のバランスを表します。次に、Bullet Point Methodを使用して、_Update関数の実装方法を説明します。
-
バランス値がオーバーフローを引き起こす可能性があるかどうかを確認します。必要なステートメントを使用して、格納0とリザーブが保存時にUINT112タイプを使用し、データ型変換のセキュリティが必要なため、受信バランス0とbalance1がUINT112の最大値を超えないようにします。 。
-
現在のブロック時間を記録します:現在のブロックのタイムスタンプを取得し、blockTimestamplastを使用してModulo 2^32操作を実行してBlockTimestampを取得します。この操作は、イーサリアムのブロックタイムスタンプが32ビットであり、絶対時間ではなくブロック内の時差のみを気にするためです。
-
時差を計算します:現在のブロック時間と最後の更新時間の差を計算します。TimeLapsedが0の場合、これは同じブロック内の継続的な呼び出しであることを意味するため、蓄積された価格値は更新されません。
-
価格の累積更新:時差が0より大きく、予備が0でない場合は、固定点数学ライブラリUQ112x112を使用して価格比を計算し、価格0CumulativeLastとPrice1CumulativeLastを更新します。ここでの「決してオーバーフロー」は、時間間隔がタイプUINT32であるため、蓄積された価格値(UINT224)に乗算されるため、オーバーフローを引き起こさないことを意味します。「+オーバーフローは望ましい」とは、価格の計算が絶対値ではなくデルタを使用するため、オーバーフローの蓄積された値を指します。
-
更新リザーブ:Resirse0およびResirse1にNew Balanceを割り当てて、流動性プールのリザーブを更新します。
-
更新タイムスタンプ:現在のブロックタイムスタンプをBlockTimestamplastに割り当てて、次のアップデートに向けて準備します。
-
トリガー同期イベント:EMITキーワードを介して同期イベントを発行して、外部リスナーに予備が更新されたことを通知します。
この設計により、UNISWAPV2は大量のトランザクションを処理する際に価格の継続性と精度を維持でき、ブロックタイムスタンプまたは価格の蓄積された値がオーバーフローする場合でも、変化量を通じて平均トランザクション価格を正確に計算できます。これは、固定点の数学と時差を巧みに利用することによって達成されます。
UNISWAPV2では、ユーザーは取引ごとに0.3%の取り扱い手数料を請求されます。この料金の6分の1は開発チームに割り当てられ、残りの5つは報酬として流動性プロバイダーに与えられます。ただし、取引手数料がトランザクションごとに1回計算されると、ユーザーのガス料金が必然的に増加します。
したがって、UNISWAPV2では、処理手数料が蓄積され、処理手数料は流動性が変更された場合にのみ割り当てられます。_mintfee関数は、最初に取引料が有効になっているかどうかを確認し、手数料を受け取る住所を決定します。取引手数料が有効にならず、ミント料金があった場合(_Klastは0ではありません)、Klast値をリセットします。この料金鋳造メカニズムは、流動性プロバイダーに追加のインセンティブを提供するUNISWAPV2の一部です。
sₘは、造られるべき液体トークンの数を表します。K₁は、以前の流動性イベント後の保護区の積を表します。K₂は現在の予備製品kを表します。
4.3周辺契約
UNISWAPV2周辺契約の主な機能は、インターフェイス定義、ツールライブラリ、ルーター、サンプル実装の4つの部分を含む、外部アカウントとコア契約の間のブリッジとして機能することです。
4.3.1ライブラリ
ライブラリフォルダーには4つのファイルが含まれています
-
Safemath.Sol
-
uniswapv2library.sol
-
uniswapv2liquiditymathlibrary.sol
-
uniswapv2oraclelibrary.sol
次に、これらの4つのSOLファイルを詳細に分析します
Safemath.Sol
Safemath.SOLは、特にブロックチェーンやスマートコントラクトの開発において、整数のオーバーフローとアンダーフローエラーを避けるために非常に重要なオーバーフローセーフ数学操作を実行するために使用されます。主に3つの関数が含まれています。
-
追加機能を追加:2つの署名のない整数の追加操作を安全に実行するために使用されます
-
サブ関数:2つの署名されていない整数の減算操作を安全に実行するために使用されます
-
MUL機能:2つの署名されていない整数の乗算操作を安全に実行するために使用されます
特定のコードコメントは次のとおりです
uniswapv2library.sol
uniswapv2library.solは、uniswap v2交換ペアとの相互作用および操作のためのいくつかの実用的な機能を提供します。
これらの関数は、主にトランザクションパスの計算、予約の取得、価格の計算、チェーン計算の実行に使用されます。このライブラリは、SafeMathというライブラリを使用して、数学的操作のセキュリティを確保し、整数のオーバーフローとアンダーフローを回避します。uniswapv2library.solこのファイルには8つの関数が含まれています。
-
sorttokens関数:アドレスでソートされた2つのトークンアドレスを返します。入力は、TokenaとTokenbの2つのトークンアドレスです。出力は、ソートされたトークンアドレスtoken0およびtoken1です。
-
Pailfor機能:指定された工場アドレスのアドレスと、外部呼び出しを行わずに2つのトークンアドレスのペアを計算します。入力は工場のアドレス工場であり、2つのトークンはTokenaとTokenbをアドレスしています
-
getReserves関数:保護区を取得して並べ替えます。入力は工場の住所工場であり、2つのトークンはTokenaとTokenbのアドレスです。
-
引用機能:特定の資産数量とペアの予備に基づいて、別の資産の同等の量を返します。入力:資産数量A、Reservea、Reserveb。出力は、別の資産の量です。
-
GetAmountout関数:入力資産の数とペアの埋蔵量に基づいて、別の資産の最大出力数を返します。入力は、出力の数、リザーブアウトの数です。
-
GetAmountin Function:出力資産の数とペアの埋蔵量に基づいて、入力される別の資産の数を返します。入力は、出力資産数量の金額、リザーブおよびリザーブアウトです。
-
GetAmountSout関数:任意の数のペアでチェーンGetAmountout計算を実行します。
-
getAmountsin関数:チェーンgetAmountinの実行任意の数のペアで、入力はファクトリーアドレス工場であり、出力数はアセットの金額、出力は資産数の各パスノード番号のアレイです。
uniswapv2librayソースコードに関する詳細なコメントは次のとおりです。
uniswapv2oraclelibrary.sol
UnisWAPV2ORACLELIBRARY.SOLファイルは、Oracleの平均価格の計算に関連する操作のためのいくつかの補助方法を提供します。ライブラリには、現在のブロックタイムスタンプを取得して累積価格を計算する方法が含まれており、ガソリンコストを節約し、頻繁に同期するコールを避けるのに役立ちます。次のように、2つの機能が含まれています。
-
CurrentBlockTimestamp関数:現在のブロックタイムスタンプを返します。入力なし、出力は現在のブロックタイムスタンプ、タイプUINT32です。
-
現在の累積プリス関数:累積価格を計算して返します。入力はトランザクションペアアドレスペアであり、出力は累積価格価格0累積および価格1累積的であり、現在のブロックタイムスタンプブロックティメスタンプです。
uniswapv2oraclelibrary.solの公式ソースコードは次のとおりです。
uniswapv2liquiditymathlibrary.sol
uniswapv2liquiditymathlibrary.solの公式ソースコードは次のとおりです
-
ComputeProfitMaximizingTrade関数:利益を最大化するトランザクションの方向とサイズを計算します。
-
getReserveSafterArbitrage関数:観測された「実質価格」の下で、動物性プールの保護区は、裁定取引後に取得されます。
-
ComputeLiquity Value機能:特定の流動性プールのすべてのパラメーター、流動性値を計算します。
-
GetLiquityValue関数:現在のすべてのパラメーターを取得し、流動性額の値を計算します。
-
GetLiquityValueAffterArbitragetoprice関数:2つのトークンとその「実際の価格」と流動性量が与えられ、流動性の価値を返します。
uniswapv2router02.sol
まず、このパートのコードのソースコードを見てみましょう。
コンストラクターと修飾子
-
コンストラクター(住所_Factory、住所_Weth):工場契約の住所とWETH契約アドレスを初期化します。
-
モディファイアは(UINT締め切り):締め切り前にトランザクションが完了していることを確認してください。
ETHを受け取る関数
-
受信()外部支払い:ETHを受信し、WETH契約からの呼び出しのみが許可されます。
流動性を追加します
-
_ADDLIQUITITY:流動性を追加するために使用される内部関数は、既存の保護区に基づいて最適なトークンを計算します。
-
AddLiquity:2つのERC-20トークンの流動性を追加します。
-
AddLiquisityEth:ERC-20トークンとETHの流動性を追加します。
流動性を削除します
-
removeliquidity:2つのERC-20トークンの流動性を削除します。
-
removeliquisityeth:ERC-20トークンとETHの流動性を削除します。
-
removeliquiditywithpermit:ライセンスを使用して2つのERC-20トークンの流動性を削除します。
-
removeliquisityethwithpermit:免許証によるERC-20トークンとエス流動性を削除しました。
-
removeliquisityEthportingfeeOntransfertokens:ERC-20トークンとETHの流動性を削除し、料金トークンをサポートします。
-
removeliquisityethiTSUPTINGFEEONTRANSFERTOKENS:ERC-20トークンとETHの流動性をライセンスで削除すると、料金トークンはサポートします。
トークン交換
-
_SWAP:内部関数、トークン交換ロジックを実行します。
-
swapexacttokensfortokens:トークンの正確な数を使用して、別のトークンと交換します。
-
swaptokensforexacttokens:トークンを使用して、正確な数の別のトークンを交換します。
-
swapexactethortokens:ETKの正確な数を使用してトークンを交換します。
-
swaptokensforexacteth:トークンを使用して、ETHの正確な量を交換します。
-
swapexacttokensforeth:トークンの正確な数とETHを交換します。
-
swapethforexacttokens:ETHを使用して、トークンの正確な数を交換します。
-
swapexacttokenfortokenssupportingfeeontransfertokens:正確な数のトークンを使用して、別のトークンと交換する料金トークンをサポートします。
-
swapexacteTheTheTheTheTheStoKensSupportingFeeOnTransfertokens:ETH Exchangeトークンの正確な数を使用して、料金トークンをサポートします。
-
swapexacttokensforethsportingfeeontransfertokens:正確な数のトークンを使用してETHを交換し、料金トークンをサポートします。
ライブラリ関数
-
引用:予備額に基づいて、特定の量のトークンAに対応するトークンBの数を計算します。
-
GetAmountout:入力と予約の数を考慮して取得できる出力の数を計算します。
-
GetAmountin:特定の出力量と予約量に必要な入力数を計算します。
-
getAmountSout:パスと入力番号に基づいて出力番号を計算します。
-
GetAmountsin:パスに基づいて出力の数に基づいて入力数を計算します。
以下の機能を1つずつ見てみましょう。
uniswapv2router02契約は、iuniswapv2router02インターフェイスを実装し、次の重要な関数を提供します。
-
流動性の追加:ユーザーは、流動性プロバイダートークンと引き換えに、2つのトークンを流動性プールに追加できます。
-
流動性を削除:流動性プロバイダーが流動性プロバイダートークンを両方のトークンに交換できるようにします。
-
トランザクション:ユーザーが異なるトークン間で取引できるようにし、複数の取引ペアを通る直接トランザクションとパスをサポートします。
-
見積計の計算:特定の入力または出力ボリュームの場合、トランザクションの詳細を計算する一連の関数を提供します。
Modifierを使用して、現在のブロック時間が最新のトランザクション時間を超えているかどうかを確認し、ユーザーが指定したトランザクションがタイムアウトのために失敗しないようにします。これにより、トランザクションのセキュリティと信頼性が向上します。
コンストラクターは、プロジェクト契約の住所とWETH契約アドレスを初期化します。どちらも契約のライフサイクルを通して変更されていません。
受信関数は通常、契約が関数呼び出しを介してではなく、直接エーテルを受信できるようにするために使用されます。この特定の例では、受信関数はAssert Statementを使用して、WETH契約のみがエーテルを送信できるようにします。
_ADDLIQUITITY関数の目的は、流動性を追加する際にユーザーが入金する必要がある2つのトークンの最適数を計算することです。この関数は、2つのトークンのアドレスを受け入れるための6つのパラメーターがありますスリップが低すぎるのを防ぐために数量を追加するユーザー。
この計算では、ユーザーが追加する流動性がバランスが取れていることを確認するために、すでに流動性プールにあるトークン保護区の量を考慮しています。流動性プールが新しく、既存の保護区がない場合、ユーザーは必要な金額を直接追加できます。プールにすでに予備がある場合、関数は現在の割合に基づいて最適な追加数を計算し、プール内のトークンの割合が流動性が追加された後も変わらないことを保証します。
追加の2つのトークンの流動性プール(Tokena and Tokenb)に流動性を追加するための滑走液のパブリック機能を追加
AddLiquisityEth機能により、ユーザーは、対応する流動性トークンと引き換えに、UNISWAPV2の流動性プールに追加されますユーザーが追加したい非エーテルトークンの場合、量の格子ミンは、ユーザーが受け入れることができる非エーテルトークンの最小数であり、滑りが低すぎるのを防ぐために使用されるために使用されます。滑りが低すぎるのを防ぐために使用されるために、新しく造られた流動性トークンを受信するアドレスは、トランザクションのタイムアウトを防ぐために使用されるトランザクションの締め切りです。
関数は3つのパラメーターを返します。量と量は、実際に流動性プールに追加される非エーテルコインとエーテルコインの量であり、流動性は新しく造られた流動性トークンの数です。
removeliquidity機能により、ユーザーは以前に流動性プールから追加した流動性を削除し、比例して2つのトークンを取得できます。火傷機能は、実際の流動性破壊およびトークン割り当て操作を実行するために使用されるIUNISWAPV2PAIR流動性プール契約の根本的な機能です。
removeliquisityEth関数により、ユーザーは以前にuniswapv2流動性プールからエーテルで加えた流動性を削除し、それぞれ対応する非エーテルとエーテルを取得できます。この関数は最初に除去を呼び出し、次にSafetransferを介して対応するトークンを抽出し、燃焼流動性からETHに抽出したWETHを交換し、償還されたETHをレシピエントに転送します。
removeliquisitywithpermit関数により、ユーザーはECDSA署名を介して承認でき、承認機能を介してユーザーの以前の許可なしにユーザーに代わって流動性を削除できるようにします。
removeliquisityEthwithpermit関数は、removeliquisityethを組み合わせて許可メカニズムを許可し、ユーザーは標準承認モードを使用せずに1回限りの承認契約に署名して流動性を削除できるようにします。これにより、ユーザーエクスペリエンスとセキュリティが向上し、トランザクションのガスコストも削減されます。
removeliquisityEthSportingfeeOntransfertokens関数により、ユーザーは、一部のトークンが譲渡時に料金を請求する可能性があることを考慮して、以前に特定のトークンとエーテルで追加した流動性を除去できます。
この関数は、最初に除去を呼び出して流動性除去を実行し、トークン転送を処理し、ユーザーが彼らにふさわしいトークンの数を取得し、最終的にウェスをエーテルに戻し、ユーザーに転送します。ユーザーが指定するトランザクションの締め切り前に、プロセス全体を完了する必要があります。
削除は、機能を除去することで、除去された承認メカニズムを許可し、1回限りの承認契約に署名することで除去できるようになります。
このアプローチは、承認モードを使用せずにユーザー資産を運用する契約を承認する方法を提供し、ガスコストを削減し、ユーザーエクスペリエンスの改善を提供します。
_SWAP関数は、一連のトークン交換操作を実行する内部関数です。最終トークンに到達するまで、指定されたパスと数量に従って、あるトークンから別のトークンに交換します。この機能は、トークン変換と流動性プールの更新を実装するために使用される流動性プールの相互作用の中心部分です。
swapexacttokensfortokens関数は、ユーザーが少なくとも1つの最小出力トークンを正確な入力量と交換できるUniswapv2ルーターの重要な機能です。この関数は、最初に交換パス全体の出力を計算し、次に最終出力がユーザーの最小要件を満たしてから、ユーザーから流動性プールにトークンを安全に転送し、交換操作を実行することを保証します。
swaptokensforexacttokens関数により、ユーザーは取得したいトークンの数を指定し、交換の最大値を超えないトークンを提供できます。この関数は、最初に金額を取得するために必要な最大入力を計算し、次にこの入力がユーザーが指定した金額を超えないことを保証します。
swapexacteThortokens関数により、ユーザーは正確な量のETHで少なくとも一定数の別のトークンを交換できます。この関数は、最初に交換パスが有効かどうかを検証し、次にWETHの必要な数を計算し、ETHをWETH契約に保存し、交換操作を実行し、ユーザーが指定したアドレスに交換トークンを送信します。ユーザーが指定するトランザクションの締め切り前に、プロセス全体を完了する必要があります。
swapexacteThortokens関数の関数は、他のトークンと引き換えに設定された数のETHを販売することです。まず、UNISWAPトランザクションペアがERC20/ERC20トランザクションペアであるため、パスアレイの最初の要素がWETHアドレスであることを確認するために、効果的なパスチェックを実行します。
次に、出力量を計算し、UnisWapv2Library.getAmountSout関数を使用して、ユーザーがユーザーMSG.Valueおよびトークンパスパスによって送信されたETHの数に基づいて取得できる各トークンの数を計算し、結果をに保存します。量は、次に最小出力検証を行うことであり、関数は、ターゲットトークンの数(つまり、ターゲットトークンの数)がユーザーの額の最小出力数量を満たしているかどうかをチェックします。
満たされていない場合、エラーがスローされます。指定されたトランザクションペア契約アドレスWETHに、失敗した場合、トランザクションがロールバックされ、最後に内部関数_SWAPが呼び出され、実際のトークン交換プロセスが実行されます。
swaptokensforexactethは、一定量のETHと引き換えに他のトークンを販売するプロセスです。 、ETHを受け取った住所、および取引の締め切り。
最初に、交換パスの最後の要素がWETHアドレスであることを確認するためにパス妥当性チェックがチェックされ、そうでない場合は、入力量計算であり、UnisWAPV2Library.getAmountsin関数を使用して生成を計算します。ユーザーは、提供される計算数のトークンがユーザーが設定した最大数を超えないことを確認するために、ユーザーが提供する必要がありますTransferHelperの機能をsafeTransfrom from msg.senderアドレスから安全に転送します。
次に、内部function_swapを呼び出して、実際のトークン交換プロセスを実行します。ユーザー。
swapexacttokensforeth関数の関数は、少なくとも量のETHの数を固定されたトークンと交換するために使用されます。額を取得するために、トークン交換パス、ETHの受信アドレス、およびこの機能の実装ロジックはSwaptokensForeXactethのロジックに非常に似ています。
SwapethForeXactTokensの機能により、ユーザーはETHを使用して固定数のトークンを交換できます。実装ロジックは、上記のswapexacttokensforeth、swaptokensforexactethに似ています。
_swapsupportingfeeOntransfertokens関数は、トークンパスのトークン交換のロジックをサポートします。
swapexacttokenfortokenssupportingfeeontransfertokens固定数のトークンは、トランザクション料金トークンのケースを処理しながら、少なくとも予想される別のトークンの数と正確に交換されます。
swapexactethorfortokenssupportingfeeontransfertokensは、他のトークンと交換するために特定の数のETHを使用することを実装しています
swapexacttokensforeThportingfeeontransfertokens関数を使用すると、ユーザーは、トランザクション料金のトークンを処理し、ETHの正確な転送を確保しながら、少なくとも予想されるETHのETHを固定トークンと正確に交換できます。
引用関数は、ユーザーが指定したトークンの数と流動性プールの2つのトークンの予備に基づいて、ユーザーが交換できる別のトークンの数を計算して返す機能を実装します。
getAmountout関数の計算原理とgetAmountSout関数はどちらも一定の製品アルゴリズムです。関数GetAmountoutを定義して、特定の入力量と予約額を定義して、ユーザーが特定の入力量と交換パスの後に取得できる一連の出力量を計算します。
GetAmountinとGetAmountsinの計算原則は、一定の製品アルゴリズムに基づいて販売されている資産の数を計算することです。
4.3.2 uniswapv2 migrator.sol
uniswapv2migrator.solは、Uniswap v1からUniswap v2に流動性を移行するために使用されます。この契約には、ETHを受け取る機能が含まれ、UNISWAP V1およびV2ルーターと移行のための交換契約を使用します。ユーザーは、UNISWAP V1の流動性をUNISWAP V2に安全に転送できるようにします。3つの関数があり、各関数の特定の関数は次のとおりです。
-
コンストラクター関数:UnisWAPV2 Migrator契約の初期化に使用されるコンストラクター機能。入力は、V1ファクトリーアドレス_FactoryV1およびV2ルーターアドレス_Routerです
-
受信機能:ETHを受信し、V1スイッチとルーターから契約がETHを受信できるようにします。入力なし、出力なし。
-
移行機能:入力はトークンアドレストークン、最小トークン数の量、最小量の量子、受信アドレス、締め切りです
UNISWAPV2 Migratorの公式ソースコードは、次のように詳細に分析されています。
4.3.3インターフェイスフォルダー
インターフェイスフォルダーには、UNISWAPV1およびV2交換、ルーター、工場、およびWETHおよびERC20契約と相互作用するためのインターフェイス定義が含まれています。主な機能には、流動性の管理と移行、トークン取引の取り扱い、流動性の追加と削除、ETHのパッケージングと開梱が含まれます。これらのインターフェイスにより、契約間の標準化された相互作用が保証されます。各ファイルの内容を詳細に見てみましょう。
iuniswapv1exchange.sol
このファイルは、uniswapv1交換契約との対話に使用されるインターフェイスiuniswapv1exchangeを定義します。交換契約は、主にトークンとETH間のトランザクションと流動性管理を処理する責任があります。次の4つの関数が含まれています。
-
バランス機能:交換契約の住所のバランスを返します。
-
関数から転送:あるアドレスから別のアドレスにトークンを転送します。
-
Tokentoethswapinput関数:トークンをエーテルに交換するために使用されます。
-
Ethtotokenswapinput関数:エーテルをトークンに交換します。
iuniswapv1factory.sol
iuniswapv1factory.sol uniswapv1の工場契約と相互作用するために使用されます。特定のコード分析は次のとおりです。
IERC20.SOL
IERC20.SOLは、Ethereum Token Standard(ERC-20)に続くIERC20と呼ばれるインターフェイスを定義します
iuniswapv2migrator.sol
iuniswapv2migrator.solは、uniswap v2の移行契約と対話するために使用されます。
iuniswapv2router01.sol
IUNISWAPV2ROUTER01インターフェイスは、流動性の追加と除去、トークン交換などを含むさまざまな機能を提供します。これらの機能は、分散型取引プラットフォームと流動性プールを構築するコアです。このインターフェイスを介して、ユーザーはUniSWAPV2プロトコルと簡単に対話できます。
iuniswapv2router02.sol
iuniswapv2router02.solインターフェイスのメソッドは、主に転送料金のサポートを追加します。これにより、流動性プロバイダーまたはトークン保有者は、トークンを転送する際に、返信料の一部を受け取ることができます。これらのメソッドの実装は、通常、対応するトークン契約を下部のトークン契約を呼び出して、転送中に請求された料金を実現します。
iweth.sol
iweth.solは、iwethというインターフェイスを定義します。これは、ラップエーテル(WETH)契約との対話のためのイーサリアムに関する標準インターフェイスを表します。