Uniswap v3での三角形アービトラージ

中級5/7/2024, 10:38:35 AM
トライアングルアービトラージは、単一の市場内または複数の市場間での為替レートの変動を活用した暗号通貨取引の戦略として機能します。

マルチホップスワップで実装されました

三角矢印取引は、1つの市場内または複数の市場間の為替レートの変動を活用して、暗号通貨取引での戦略として機能します。この方法は、3つの連続した取引で構成されており、最初の暗号通貨を2番目の暗号通貨に、2番目の暗号通貨を3番目の暗号通貨に交換し、最終的には3番目の暗号通貨を最初の暗号通貨に戻すことで、利益を生み出すことを目的としています。したがって、「三角形」という用語は、その3段階のプロセスを包括しています。

AIによって生成された画像

How it works?

DEXでは、三角矢倉取引の機会は通常、複数のプール間での流動性の違いによって引き起こされます。これらは通常、取引所が迅速に価格の不一致を調整するため、わずか数秒またはそれ以下で終了します。その結果、取引を迅速に実行するために装備された自動取引アルゴリズムが、これらの一過性の違いを生かすために使用されます。このコンセプトを理解するのに役立つために、以下に例を示します。

上記の三角取引は01から始まり、$60,000 USDCで1 wBTCを購入し、次に02で1 wBTCで16 WETHを購入し、最後に03で16 WETHを$66,000 USDCで売却します。旅の終わりに、利益として$6,000 USDCを得ることができます。

Uniswap v3でのMutihop Swapsを使用して実装する

Uniswap v3には、マルチホップスワッピングの2つのスタイルがあります: Exact InputとExact Output。その名前が示すように、最初のスタイルはスワッピングの入力として正確な金額のトークンを期待し、最後には所定の金額のトークンが交換レートで出力されます。後者は出力として指定された正確な金額を期待しており、入力として十分な量のトークンが交換レートでスワッピングを満たすことができます。

ビジネスの性質がトライアングルアービトラージで、入力と同じ金額のトークンを取得し、別の暗号通貨に交換してから元のトークンに再び交換して利益を得ることを希望します。

address constant SWAP_ROUTER_02 = 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45;

address constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

address constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;

address constant DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F;

contract MultiHopSwap { using SafeERC20 for IERC20;ISwapRouter02 private constant ROUTER = ISwapRouter02(SWAP_ROUTER_02);uint256 private constant MAX_INT =   115792089237316195423570985008687907853269984665640564039457584007913129639935;function swapExactInputMultiHop(uint256 amountIn) external {   IERC20(USDC).safeApprove(address(ROUTER), MAX_INT);   IERC20(WETH).safeApprove(address(ROUTER), MAX_INT);   IERC20(DAI).safeApprove(address(ROUTER), MAX_INT);   bytes memory path =       abi.encodePacked(USDC, uint24(3000), WETH, uint24(3000), DAI, uint24(3000), USDC) ;   ISwapRouter02.ExactInputParams memory params = ISwapRouter02       .ExactInputParams({       path: path,       recipient: address(this),       amountIn: amountIn,       amountOutMinimum: 1   });   ROUTER.exactInput(params); }}

ルーターは流動性提供を促進する上で重要な役割を果たします。状態を保持せず、トークン残高を保持しないため、ルーターは安全に置換できます。そのため、ルーターには01から始まるリリース番号が付与されています。当社の実装では、「Router02」を使用しています。0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45mainnet上。

SafeERC20は、ERC20トランザクションを囲む保護層であり、契約内でのERC20トークンとの安全な相互作用を保証します。通常のERC20関数とは異なり、SafeERC20はERC20操作のブール値の戻り値を検証することで安全性を向上させます。どの操作に失敗してもトランザクションがリバートされ、リスクが最小限に抑えられます。さらに、SafeERC20はブール値を持たない非標準のERC20トークンに対応し、トークン管理を柔軟かつ堅牢にします。最大額を承認することで、Router02が代わりにトークンを転送できるようにします。そうしないと、TransferHelper.safeTransferFrom関数のrequireアサーションによって実行がリバートされるというSTFエラーメッセージが表示されることが予想されます。

次に、三角形の経路がどのように定義されるかを見ていきます:

bytes memory path = abi.encodePacked(USDC, uint24(3000),

WETH、uint24(3000)、DAI、uint24(3000)、USDC) ;

abi.encodePackedを介して、Solidityはパディングを追加せずに複数の値をきちんと詰め込みます。それぞれのパラメータの生のバイナリデータを連結します。暗号通貨ペア間の手数料付きスワップをパラメータが順次化するのは理解しやすいことです。パスはUSDCから始まり、利益を期待してUSDCで停止します。その後、他の必須パラメータとともにExactInputParamsでラップされ、ルーターにフィードされ、マルチホップスワップが行われます。

テスト

私たちは同じ技術を使用しています偽装を使ってメインネットをフォークする. 10 USDCが契約に入金されたことが確認されると、以下のようにマルチホップスワップがトリガーされることがあります。

it("multi hop swapを実行する", async () => {balance = await swap.tokenBalance(USDC);console.log(`USDCの現在の残高 = ${balance}`);console.log(`${initialFundingHuman} USDCを交換しています`);const tx = await swap.swapExactInputMultiHop(ethers.parseUnits(initialFundingHuman, DECIMALS));receipt = await tx.wait();balance = await swap.tokenBalance(USDC);console.log(`USDCの現在の残高 = ${balance}`);expect(balance).not.equal(0);});

テスト結果は以下のように見えるはずです:

ウェールのUSDC残高: 170961218210457n

偽装が始まりました。

偽装が完了しました。

USDCの現在の残高 = 100000000

100 USDCのスワップ

USDCの現在の残高= 91677417

フープを飛び越えた後、私たちはお金を失いました-明らかにスポットレートのパスは私たちには有利ではありませんでしたが、Uniswap v3でマルチホップスワップを使用して三角アービトラージを行う方法についてはお分かりいただけるでしょう。

フラッシュローンで資金を調達した三角矢値取引

私は言ったでしょうDeFiエコシステムで最もパワフルな資金調達源はFlashローンです?あなたが私が教えたフラッシュローンとマルチホップスワップを使用したフラッシュローンで資金調達された三角矢印取引戦略を構築することは、あまりにも創造性が必要ではありません。組み合わされたロジックは、以下の更新されたシーケンス図で説明できます。

Uniswap v3でフラッシュローンで資金を提供した三角矢倉のシーケンス図(一部の操作は簡略化のため無視されています)

Uniswap v3で実装されたFlashローンとマルチホップスワップの両方のソースコードをチェックしてくださいhttps://medium.com/cryptocurrency-scripts/flash-loan-on-uniswap-v3-84bca2bfe255, シーケンス図を消化して、スマートコントラクトを組み合わせて完了させるために自分で宿題をしてください。

収益性の考慮

最初に見たいのは、3つの取引のシーケンスで構成されるパスです。利益を得るためには、正しい3つの暗号通貨ペアを正しいレートで取引する必要があります。すべての正当性を見つけるためには、三角形裁定のパターンで取引可能なペアを並べ替え、収益性を確認するためにスワップをシミュレートするプログラムを開発する必要があります。ブロックチェーンからレートを取得することは遅くなる可能性があり、利益を検証するために待機しているパスが多すぎるとプロセスがさらに遅くなる可能性があります。DEXのGraphQL価格エンドポイントが提供されている場合は、表面価格に基づいて利益と損失を計算して三角形のパスのリストを絞り込むことがお勧めです。ここには、ユニスワップ v3の)、GraphQL APIはブロックチェーンよりもはるかに高速で、見積データを提供します。 パスが絞り込まれたら、それらを実行して、より正確な利益&損失の計算のためにチェーンから取得した見積もりを使用してください。

Flashローンで投資を増やす利益をさらに拡大することができます。低金利でトークンを借りて、それらを収益性の高い戦略で投資することは常に良い考えです。理論的には、総利益がフラッシュローンとスワップ手数料をカバーするのであれば、三角アービトラージ戦略は収益性があるとみなされます。利益を守り、全体の取引リスクを軽減するための重要なトリックの1つは、取引契約に論理を持たせて、総利益のチェックに失敗した場合にフラッシュローン取引を失敗させることです。なぜなら、取引が失敗すると、すべての操作がロールバックされ、損失や取引の手数料を負担する必要がなくなります。この論理の一部は、スリッページや私たちにとって有利でない為替レートの動きを防ぐための総合的なゲートキーパーとして機能します。

それが言われても、取引の成功や失敗に関係なく、ガス手数料は避けられないものであり、三角矢印取引でお金を失う主な原因となる可能性があります。常に戦略の取引のガス手数料を評価し、それを純利益の計算に取り込んでください。私のソースコードにおけるガス手数料の見積もりテストケースをご参照ください。

免責事項:

  1. この記事は[から転載されています暗号通貨スクリプト], All copyrights belong to the original author [Aaron Li]. If there are objections to this reprint, please contact the Gate Learnチームが迅速に対応します。
  2. 責任の免責事項:この記事で表現されている意見や見解は、著者個人のものであり、投資アドバイスを構成するものではありません。
  3. 他の言語への記事の翻訳はGate Learnチームによって行われます。特に言及されていない限り、翻訳された記事のコピー、配布、または盗用は禁止されています。

Uniswap v3での三角形アービトラージ

中級5/7/2024, 10:38:35 AM
トライアングルアービトラージは、単一の市場内または複数の市場間での為替レートの変動を活用した暗号通貨取引の戦略として機能します。

マルチホップスワップで実装されました

三角矢印取引は、1つの市場内または複数の市場間の為替レートの変動を活用して、暗号通貨取引での戦略として機能します。この方法は、3つの連続した取引で構成されており、最初の暗号通貨を2番目の暗号通貨に、2番目の暗号通貨を3番目の暗号通貨に交換し、最終的には3番目の暗号通貨を最初の暗号通貨に戻すことで、利益を生み出すことを目的としています。したがって、「三角形」という用語は、その3段階のプロセスを包括しています。

AIによって生成された画像

How it works?

DEXでは、三角矢倉取引の機会は通常、複数のプール間での流動性の違いによって引き起こされます。これらは通常、取引所が迅速に価格の不一致を調整するため、わずか数秒またはそれ以下で終了します。その結果、取引を迅速に実行するために装備された自動取引アルゴリズムが、これらの一過性の違いを生かすために使用されます。このコンセプトを理解するのに役立つために、以下に例を示します。

上記の三角取引は01から始まり、$60,000 USDCで1 wBTCを購入し、次に02で1 wBTCで16 WETHを購入し、最後に03で16 WETHを$66,000 USDCで売却します。旅の終わりに、利益として$6,000 USDCを得ることができます。

Uniswap v3でのMutihop Swapsを使用して実装する

Uniswap v3には、マルチホップスワッピングの2つのスタイルがあります: Exact InputとExact Output。その名前が示すように、最初のスタイルはスワッピングの入力として正確な金額のトークンを期待し、最後には所定の金額のトークンが交換レートで出力されます。後者は出力として指定された正確な金額を期待しており、入力として十分な量のトークンが交換レートでスワッピングを満たすことができます。

ビジネスの性質がトライアングルアービトラージで、入力と同じ金額のトークンを取得し、別の暗号通貨に交換してから元のトークンに再び交換して利益を得ることを希望します。

address constant SWAP_ROUTER_02 = 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45;

address constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

address constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;

address constant DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F;

contract MultiHopSwap { using SafeERC20 for IERC20;ISwapRouter02 private constant ROUTER = ISwapRouter02(SWAP_ROUTER_02);uint256 private constant MAX_INT =   115792089237316195423570985008687907853269984665640564039457584007913129639935;function swapExactInputMultiHop(uint256 amountIn) external {   IERC20(USDC).safeApprove(address(ROUTER), MAX_INT);   IERC20(WETH).safeApprove(address(ROUTER), MAX_INT);   IERC20(DAI).safeApprove(address(ROUTER), MAX_INT);   bytes memory path =       abi.encodePacked(USDC, uint24(3000), WETH, uint24(3000), DAI, uint24(3000), USDC) ;   ISwapRouter02.ExactInputParams memory params = ISwapRouter02       .ExactInputParams({       path: path,       recipient: address(this),       amountIn: amountIn,       amountOutMinimum: 1   });   ROUTER.exactInput(params); }}

ルーターは流動性提供を促進する上で重要な役割を果たします。状態を保持せず、トークン残高を保持しないため、ルーターは安全に置換できます。そのため、ルーターには01から始まるリリース番号が付与されています。当社の実装では、「Router02」を使用しています。0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45mainnet上。

SafeERC20は、ERC20トランザクションを囲む保護層であり、契約内でのERC20トークンとの安全な相互作用を保証します。通常のERC20関数とは異なり、SafeERC20はERC20操作のブール値の戻り値を検証することで安全性を向上させます。どの操作に失敗してもトランザクションがリバートされ、リスクが最小限に抑えられます。さらに、SafeERC20はブール値を持たない非標準のERC20トークンに対応し、トークン管理を柔軟かつ堅牢にします。最大額を承認することで、Router02が代わりにトークンを転送できるようにします。そうしないと、TransferHelper.safeTransferFrom関数のrequireアサーションによって実行がリバートされるというSTFエラーメッセージが表示されることが予想されます。

次に、三角形の経路がどのように定義されるかを見ていきます:

bytes memory path = abi.encodePacked(USDC, uint24(3000),

WETH、uint24(3000)、DAI、uint24(3000)、USDC) ;

abi.encodePackedを介して、Solidityはパディングを追加せずに複数の値をきちんと詰め込みます。それぞれのパラメータの生のバイナリデータを連結します。暗号通貨ペア間の手数料付きスワップをパラメータが順次化するのは理解しやすいことです。パスはUSDCから始まり、利益を期待してUSDCで停止します。その後、他の必須パラメータとともにExactInputParamsでラップされ、ルーターにフィードされ、マルチホップスワップが行われます。

テスト

私たちは同じ技術を使用しています偽装を使ってメインネットをフォークする. 10 USDCが契約に入金されたことが確認されると、以下のようにマルチホップスワップがトリガーされることがあります。

it("multi hop swapを実行する", async () => {balance = await swap.tokenBalance(USDC);console.log(`USDCの現在の残高 = ${balance}`);console.log(`${initialFundingHuman} USDCを交換しています`);const tx = await swap.swapExactInputMultiHop(ethers.parseUnits(initialFundingHuman, DECIMALS));receipt = await tx.wait();balance = await swap.tokenBalance(USDC);console.log(`USDCの現在の残高 = ${balance}`);expect(balance).not.equal(0);});

テスト結果は以下のように見えるはずです:

ウェールのUSDC残高: 170961218210457n

偽装が始まりました。

偽装が完了しました。

USDCの現在の残高 = 100000000

100 USDCのスワップ

USDCの現在の残高= 91677417

フープを飛び越えた後、私たちはお金を失いました-明らかにスポットレートのパスは私たちには有利ではありませんでしたが、Uniswap v3でマルチホップスワップを使用して三角アービトラージを行う方法についてはお分かりいただけるでしょう。

フラッシュローンで資金を調達した三角矢値取引

私は言ったでしょうDeFiエコシステムで最もパワフルな資金調達源はFlashローンです?あなたが私が教えたフラッシュローンとマルチホップスワップを使用したフラッシュローンで資金調達された三角矢印取引戦略を構築することは、あまりにも創造性が必要ではありません。組み合わされたロジックは、以下の更新されたシーケンス図で説明できます。

Uniswap v3でフラッシュローンで資金を提供した三角矢倉のシーケンス図(一部の操作は簡略化のため無視されています)

Uniswap v3で実装されたFlashローンとマルチホップスワップの両方のソースコードをチェックしてくださいhttps://medium.com/cryptocurrency-scripts/flash-loan-on-uniswap-v3-84bca2bfe255, シーケンス図を消化して、スマートコントラクトを組み合わせて完了させるために自分で宿題をしてください。

収益性の考慮

最初に見たいのは、3つの取引のシーケンスで構成されるパスです。利益を得るためには、正しい3つの暗号通貨ペアを正しいレートで取引する必要があります。すべての正当性を見つけるためには、三角形裁定のパターンで取引可能なペアを並べ替え、収益性を確認するためにスワップをシミュレートするプログラムを開発する必要があります。ブロックチェーンからレートを取得することは遅くなる可能性があり、利益を検証するために待機しているパスが多すぎるとプロセスがさらに遅くなる可能性があります。DEXのGraphQL価格エンドポイントが提供されている場合は、表面価格に基づいて利益と損失を計算して三角形のパスのリストを絞り込むことがお勧めです。ここには、ユニスワップ v3の)、GraphQL APIはブロックチェーンよりもはるかに高速で、見積データを提供します。 パスが絞り込まれたら、それらを実行して、より正確な利益&損失の計算のためにチェーンから取得した見積もりを使用してください。

Flashローンで投資を増やす利益をさらに拡大することができます。低金利でトークンを借りて、それらを収益性の高い戦略で投資することは常に良い考えです。理論的には、総利益がフラッシュローンとスワップ手数料をカバーするのであれば、三角アービトラージ戦略は収益性があるとみなされます。利益を守り、全体の取引リスクを軽減するための重要なトリックの1つは、取引契約に論理を持たせて、総利益のチェックに失敗した場合にフラッシュローン取引を失敗させることです。なぜなら、取引が失敗すると、すべての操作がロールバックされ、損失や取引の手数料を負担する必要がなくなります。この論理の一部は、スリッページや私たちにとって有利でない為替レートの動きを防ぐための総合的なゲートキーパーとして機能します。

それが言われても、取引の成功や失敗に関係なく、ガス手数料は避けられないものであり、三角矢印取引でお金を失う主な原因となる可能性があります。常に戦略の取引のガス手数料を評価し、それを純利益の計算に取り込んでください。私のソースコードにおけるガス手数料の見積もりテストケースをご参照ください。

免責事項:

  1. この記事は[から転載されています暗号通貨スクリプト], All copyrights belong to the original author [Aaron Li]. If there are objections to this reprint, please contact the Gate Learnチームが迅速に対応します。
  2. 責任の免責事項:この記事で表現されている意見や見解は、著者個人のものであり、投資アドバイスを構成するものではありません。
  3. 他の言語への記事の翻訳はGate Learnチームによって行われます。特に言及されていない限り、翻訳された記事のコピー、配布、または盗用は禁止されています。
Розпочати зараз
Зареєструйтеся та отримайте ваучер на
$100
!
It seems that you are attempting to access our services from a Restricted Location where Gate.io is unable to provide services. We apologize for any inconvenience this may cause. Currently, the Restricted Locations include but not limited to: the United States of America, Canada, Cambodia, Cuba, Iran, North Korea and so on. For more information regarding the Restricted Locations, please refer to the User Agreement. Should you have any other questions, please contact our Customer Support Team.