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

上記の三角取引は01から始まり、$60,000 USDCで1 wBTCを購入し、次に02で1 wBTCで16 WETHを購入し、最後に03で16 WETHを$66,000 USDCで売却します。旅の終わりに、利益として$6,000 USDCを得ることができます。
ビジネスの性質がトライアングルアービトラージで、入力と同じ金額のトークンを取得し、別の暗号通貨に交換してから元のトークンに再び交換して利益を得ることを希望します。
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」を使用しています。[0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45](https://docs.uniswap.org/contracts/v3/reference/deployments/ethereum-deployments)mainnet上。
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) ;
## テスト私たちは同じ技術を使用しています[偽装を使ってメインネットをフォークする](https://medium.com/cryptocurrency-scripts/mainnet-forking-with-impersonation-in-evm-compatible-blockchain-b01bab1354ae). 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ローンです](https://medium.com/cryptocurrency-scripts/flash-loan-on-uniswap-v3-84bca2bfe255)?あなたが私が教えたフラッシュローンとマルチホップスワップを使用したフラッシュローンで資金調達された三角矢印取引戦略を構築することは、あまりにも創造性が必要ではありません。組み合わされたロジックは、以下の更新されたシーケンス図で説明できます。

Uniswap v3でフラッシュローンで資金を提供した三角矢倉のシーケンス図(一部の操作は簡略化のため無視されています)
Uniswap v3で実装されたFlashローンとマルチホップスワップの両方のソースコードをチェックしてください[https://medium.com/cryptocurrency-scripts/flash-loan-on-uniswap-v3-84bca2bfe255](https://medium.com/cryptocurrency-scripts/flash-loan-on-uniswap-v3-84bca2bfe255), シーケンス図を消化して、スマートコントラクトを組み合わせて完了させるために自分で宿題をしてください。
## 収益性の考慮最初に見たいのは、3つの取引のシーケンスで構成されるパスです。利益を得るためには、正しい3つの暗号通貨ペアを正しいレートで取引する必要があります。すべての正当性を見つけるためには、三角形裁定のパターンで取引可能なペアを並べ替え、収益性を確認するためにスワップをシミュレートするプログラムを開発する必要があります。ブロックチェーンからレートを取得することは遅くなる可能性があり、利益を検証するために待機しているパスが多すぎるとプロセスがさらに遅くなる可能性があります。DEXのGraphQL価格エンドポイントが提供されている場合は、表面価格に基づいて利益と損失を計算して三角形のパスのリストを絞り込むことがお勧めです。[ここには、ユニスワップ v3の](https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3))、GraphQL APIはブロックチェーンよりもはるかに高速で、見積データを提供します。 パスが絞り込まれたら、それらを実行して、より正確な利益&損失の計算のためにチェーンから取得した見積もりを使用してください。
[Flashローンで投資を増やす](https://medium.com/cryptocurrency-scripts/flash-loan-on-uniswap-v3-84bca2bfe255)利益をさらに拡大することができます。低金利でトークンを借りて、それらを収益性の高い戦略で投資することは常に良い考えです。理論的には、総利益がフラッシュローンとスワップ手数料をカバーするのであれば、三角アービトラージ戦略は収益性があるとみなされます。利益を守り、全体の取引リスクを軽減するための重要なトリックの1つは、取引契約に論理を持たせて、総利益のチェックに失敗した場合にフラッシュローン取引を失敗させることです。なぜなら、取引が失敗すると、すべての操作がロールバックされ、損失や取引の手数料を負担する必要がなくなります。この論理の一部は、スリッページや私たちにとって有利でない為替レートの動きを防ぐための総合的なゲートキーパーとして機能します。
それが言われても、取引の成功や失敗に関係なく、ガス手数料は避けられないものであり、三角矢印取引でお金を失う主な原因となる可能性があります。常に戦略の取引のガス手数料を評価し、それを純利益の計算に取り込んでください。私のソースコードにおけるガス手数料の見積もりテストケースをご参照ください。
### 免責事項:- この記事は[から転載されています[暗号通貨スクリプト](https://medium.com/cryptocurrency-scripts/triangular-arbitrage-on-uniswap-v3-7c035d8214a5)], All copyrights belong to the original author [**[Aaron Li](https://medium.com/lichenlc?source=post_page-----7c035d8214a5--------------------------------)**]. If there are objections to this reprint, please contact the [Gate Learn]([https://www.Gate.com/questionnaire/3967](https://www.Gate.com/questionnaire/3967)チームが迅速に対応します。- 責任の免責事項:この記事で表現されている意見や見解は、著者個人のものであり、投資アドバイスを構成するものではありません。- 他の言語への記事の翻訳はGate Learnチームによって行われます。特に言及されていない限り、翻訳された記事のコピー、配布、または盗用は禁止されています。





