概要
分散型金融(英語: Decentralized Finance、通称DeFi)とは、ブロックチェーン上に構築された金融の一種で、金融ツールの提供を証券会社や取引所、銀行などの金融機関に依存せず、ブロックチェーン上のインテリジェンスを利用して、金融活動を行うための契約。 DeFiには、清算やスプレッドアービトラージなど、数多くのアービトラージの機会がありますが、これらに限定されません。この記事では、一部の分散型取引所 (DEX) およびアグリゲーター (アグリゲーター) がコントラクト コードで持つ可能性のある裁定取引の機会を分析します。
分析する
Uniswap
分析する
Uniswap V2 Router
Uniswap は、Automated Market Maker (AMM) モデルを採用した分散型暗号通貨取引プラットフォームです。現在、Uniswap V2 と Uniswap V3 の 2 つの人気のあるバージョンがあります。それぞれで考えられるアービトラージの機会を分析します。
Uniswap V2 では、ユーザーは通常、ルーター コントラクトを通じてペア コントラクトおよびファクトリー コントラクトと対話します。一般的に、Router はトランザクションでトークンを転送するだけで、トークンを保存しませんが、エアドロップや転送エラーなどのさまざまな理由により、特定のトークンが Router コントラクトに保存されます。では、これらのトークンを引き出すにはどうすればよいでしょうか?
Uniswap V2 Router 02 コントラクトのコードを分析すると、removeLiquidityETHSupportingFeeOnTransferTokens 関数があることがわかります。
この関数は、トークンの 1 つが WETH である流動性を削除するために使用されます。removeLiquidity 関数が内部的に呼び出されるときに渡される to のアドレスは address(this) です。つまり、2 つのトークンが最初に Router コントラクトに転送されます。その後、ルーター コントラクトは 2 つのトークンを指定されたアドレスに転送します。ここで転送される WETH の量は、removeLiquidity によって返され、変更できませんが、転送される別のトークンの量は、balanceOf(address(this)) であり、これは Router コントラクト内のトークンの残高です。
したがって、上記の分析によれば、裁定取引プロセスを取得できます。
Router 02 コントラクトに ERC 20 トークンがあることが監視されます。
Router 02 コントラクトに ERC 20 トークンがあることが監視されます。
addLiquidityETH を呼び出して、ERC 20 トークンと WETH の流動性を追加します。
流動性を削除するには、removeLiquidityETHSupportingFeeOnTransferTokens を呼び出します。
制限:
トークンにこれまで WETH による流動性がなかった場合、初めて流動性を追加するときに少量の流動性 (MINIMUM_LIQUIDITY) が失われます。
Uniswap V2 Pair
Router 02 コントラクト内の WETH と ETH を抽出する方法は見つかりませんでした。
Uniswap V2 ペア コントラクト、いわゆる流動性プールには、流動性を提供する 2 種類のトークンが保存されていますが、ペア コントラクトでは、残高の記録に、balanceOf(address(this)) ではなく、reserve が使用されているため、誰かが誤って流動性を直接転送してしまいます。永久トークンがコントラクトに組み込まれると、残高とリザーブの間に差が生じます。ペア コントラクトには残高関数スキムがあり、この関数を呼び出して差分のトークンを抽出できます。
この関数は、流動性プール内の 2 つの流動性トークンの残高と準備金の差額のトークンを to アドレスに転送することがわかります。
流動性プール内のこれら 2 つのトークンに加えて、誤送金やエアドロップなどにより他の ERC 20 トークンも存在します。これらのトークンを引き出すにはどうすればよいですか?
ペアコントラクトのコードを分析した結果、プールの LP トークンが流動性プールに存在する場合という 1 つのケースを除いて、トークンのこの部分を引き出すことができないことがわかりました。
Uniswap V3 SwapRouter
これが発生した場合、ペア コントラクトの書き込み関数を呼び出して流動性を削除し、対応する 2 つの流動性トークンを取り出すことができます。
Uniswap V3 の SwapRouter コントラクトも Uniswap V2 Router と同じ状況になります。ERC 20 トークンと ETH がありますが、幸いなことに、SwapRouter コントラクトはトークンの抽出を容易にするいくつかの機能を提供します。
ERC 20 トークンを引き出すには、スイープトークン関数を使用できます。
ETH を引き出すには、refundETH 関数を使用できます。
unwrapWETH 9 関数を直接呼び出して、WETH を ETH に復元して抽出することもできます。
上記は、Uniswap V3 SwapRouter コントラクトの裁定取引分析です。
SushiSwap
Uniswap V3 プール コントラクトのコードを分析した結果、コントラクト内の他のトークンを抽出する方法がなく、Uniswap V2 ペア コントラクトの残高と予備の間に違いがないことが判明しました。
SushiSwap は Uniswap のフォークとして始まり、後に多くの異なる金融サービスや商品を提供する独立したエコシステムに発展しました。
SushiXSwap
SushiSwap は Uniswap V2 と同じであるため、Uniswap V2 の上記のアービトラージ手法は SushiSwap にも適用できます。
SushiXSwap は、SushiSwap によって開始された LayerZero ベースのフルチェーン トランザクション プロトコルで、サポートされているネットワークには、Optimism、Arbitrum、Fantom、BNB Chain、Polygon、Avalanche が含まれます。ユーザーは、サポートされているネットワークと資産の間でクロスチェーントランザクションを実行できます。
SushiXSwap コントラクトのトークンを引き出すにはどうすればよいですか?
SushiXSwap の主な機能は、一連の操作を提供する Cook 関数を通じて実装されます。サポートされている操作のリストは次のとおりです。
その中には操作 ACTION_DST_WITHDRAW_TOKEN があり、そのコードは次のように実装されます。
まず、cook関数に渡されたデータをデコードし、金額が0かどうかを判定します。0であれば、金額の値を契約のERC20トークンの残高またはETHの残高に設定します。最後に _transferTokens を呼び出して、指定されたアドレスにトークンを転送します。
Sushi BentoBox
したがって、クック関数に渡すアクションとデータを構築するだけで済みます。つまり、アクションを ACTION_DST_WITHDRAW_TOKEN に設定し、転送するトークン、受信アドレス、データ内の数量を構築して、トークンを転送するだけです。 SushiXSwap 契約。
Sushi BentoBox は、SushiSwap エコシステムのコンポーネントです。 BentoBox は、柔軟性の高い分散型金融 (DeFi) レート最適化製品です。簡単に言うと、ユーザーが保管、借り入れ、利息の獲得を可能にするスマート コントラクト プラットフォームです。 BentoBox の主な目的は、DeFi 分野におけるユーザーの収入を最適化することです。
イーサリアム上の BentoBox コントラクトには大量のトークンが保存されていますが、このコントラクトには裁定の余地はあるのでしょうか?
BentoBox コントラクトでは、ユーザーはデポジット機能を通じてデポジット操作を実行できます。機能の実装は次のとおりです。<= _tokenBalanceOf(token).sub(total.elastic)。
ユーザーが指定されたトークン アドレス、借方アドレス、受け取りアドレス、数量、および株数を渡していることがわかります。この関数は最初に一連のチェックを実行し、次に金額または株を変換します。キー ポイントは行内にあります。 195-198、ここで小切手を作成しました: 金額
BentoBox コントラクト内の特定のトークンの残高は、Uniswap ペア コントラクトのリザーブと同様に total.elastic を使用して記録されます。場合によっては、_tokenBalanceOf(token) との違いが発生します。デポジット関数の特性を使用できます。ここで、差額を BentoBox 契約の独自の残高に変換します。
DODO
したがって、パラメーターを渡すときは、token を差分のあるトークン アドレスとして設定し、amount の値を差分として設定し、from を BentoBox コントラクトのアドレスとして設定し、to を独自のアドレスとして設定します。アドレスは BentoBox コントラクトのアドレスであるため、転送は行われませんが、total.elastic と _tokenBalanceOf(token) の値はバランスされ、コントラクト内の to アドレスの残高に変換されます。
DODO は、独自の Proactive Market Maker (PMM) アルゴリズムを使用して、Web3 資産に効率的なオンチェーン流動性を提供する分散型取引プラットフォームです。 DODO は流動性自体を提供するだけでなく、他の取引所からの流動性も集約します。
DODO V2 Proxy 02
DODO には一連の契約があり、ユーザーは DODO V2 Proxy 02 契約を通じてトークンを交換します。 Uniswap Router 契約と同様に、この契約にもさまざまな理由でいくつかのトークンが含まれています。
DODO V2 Proxy 02 コントラクトには externalSwap 関数があり、交換のために DODO によって集約された外部プラットフォーム (0x、1inch など) を呼び出すために使用され、コードは次のように実装されます。
行 1719 ~ 1721 は受信パラメータをチェックし、行 1724 は fromToken が ETH かどうかをチェックしています。そうでない場合、呼び出し元のトークンはコントラクトに転送され、承認されます。DODOAPPROVE コントラクトのコードを分析した後、後で、バイパスするには fromTokenAmount のみを 0 に設定する必要があることがわかりました。
次に、呼び出される外部コントラクトが検証され、ホワイトリストにあるものだけを呼び出すことができます。ここでの swapTarget と calldataConcat は両方ともユーザーによって制御可能であるため、swapTarget に 0x または 1inch のコントラクト アドレスを設定してから、 calldataConcat をコントラクトの view 関数にエンコードすることで、戻り値が true になるように、後続の require 検証にも合格できます。
上記の手順により、DODO V2 Proxy 02 コントラクト内の ERC 20 トークンと ETH を抽出できます。
1inch
副題
1inch は、ユーザーに最高のトークン交換価格を提供するために、複数の DEX からの流動性をプールする分散型取引所 (DEX) アグリゲーターです。 1inch は、さまざまなソースからの流動性を統合することで、ユーザーが取引を最適化し、プラットフォーム全体で最良の価格を見つけるのに役立ちます。 1inch のスマートコントラクトは、さまざまな分散型取引所間で自動的に取引を行うため、ユーザーは異なる取引所間で最良の価格と最低のスリッページを簡単に得ることができます。さらに、1inch は流動性マイニングやガバナンス トークンなどの他の機能も提供します。
AggregationRouterV 5
1 インチの主なコントラクトは AggregationRouter であり、現在は V 4 および V 5 バージョンがよく使用されています。これら 2 つのコントラクトには、さまざまな理由からいくつかのトークンもあります。受信関数のトークンでパラメーターを構築することで、コントラクト内のパラメーターを抽出できます。
AggregationRouterV 5 コントラクトにはスワップ関数があり、その実装は次のとおりです。
desc の minReturnAmount を確認した後、desc から srcToken と dstToken を取得します。次の行 986 ~ 997 は、desc 構造体に flags と srcToken を構築することでバイパスできます。
次に、関数 _execute を実行します。ここで呼び出しが行われ、実行ステータスが検証されます。エグゼキューターはユーザーによって渡されるため、ここでは 0 アドレスを使用してバイパスできます。
次に、コントラクト内の dstToken の残高を取得します。 1007 行目から 1018 行目では、desc に flags と minReturnAmount を作成してバイパスできます。
最後に、コントラクト内の dstToken 残高が dstReceiver アドレスに転送されます。これもユーザーによって制御されます。
AggregationRouterV 4
上記の手順を通じて、AggregationRouterV 5 コントラクト内のトークンを引き出すためにスワップ関数に渡されるパラメーターを構築できます。
副題
要約する
要約する
この記事では、いくつかの分散型取引所とアグリゲーターを簡単に紹介し、それらの間で可能なアービトラージについて議論し、コントラクトコードレベルからアービトラージの原理を分析しますが、実際の成功は、GAS、ノード速度などの多くの要因にも関連しています。
私たちについて
At Eocene Research, we provide the insights of intentions and security behind everything you know or don't know of blockchain, and empower every individual and organization to answer complex questions we hadn't even dreamed of back then.
