Arbitrase segitiga berfungsi sebagai strategi dalam perdagangan pertukaran kripto, memanfaatkan variasi dalam nilai tukar dalam satu pasar atau di beberapa pasar. Metode ini terdiri dari tiga perdagangan berurutan: menukar cryptocurrency awal dengan yang kedua, yang kedua dengan yang ketiga, dan pada akhirnya, cryptocurrency ketiga kembali ke yang awal, semua dengan tujuan menghasilkan keuntungan. Oleh karena itu, istilah "segitiga" mencakup proses tiga langkahnya.
Gambar dihasilkan oleh AI
Di DEX, peluang arbitrase segitiga biasanya disebabkan oleh perbedaan likuiditas di beberapa kolam. Mereka biasanya berlangsung singkat, hanya beberapa detik atau bahkan kurang, karena bursa dengan cepat menyesuaikan perbedaan harga. Akibatnya, algoritma perdagangan otomatis yang dilengkapi untuk melakukan perdagangan dengan cepat digunakan untuk memanfaatkan perbedaan yang singkat ini. Untuk membantu memahami konsepnya, berikut contohnya:
Transaksi segitiga di atas dimulai dari 01 — membeli 1 wBTC dengan $60,000 USDC, diikuti oleh 02 — membeli 16 WETH dengan 1 wBTC dan diakhiri dengan 03 — menjual 16 WETH seharga $66,000 USDC. Pada akhir perjalanan, kita akan mendapatkan $6,000 USDC sebagai keuntungan.
Ada dua gaya pertukaran multi-hop yang tersedia di Uniswap v3: Input Tepat dan Output Tepat. Seperti namanya, yang pertama mengharapkan token dengan jumlah yang tepat sebagai input pertukaran, dan pada akhirnya, token dengan jumlah akan keluar pada kurs pertukaran; Yang terakhir mengharapkan jumlah yang tepat yang ditentukan sebagai output, hanya jumlah token yang cukup sebagai input yang dapat memenuhi pertukaran pada kurs pertukaran.
Dengan sifat bisnis arbitrase segitiga, kami ingin mengambil token dengan jumlah yang tepat sebagai input, menukarkannya ke mata uang kripto lain, dan kemudian menukarkannya kembali ke token asli untuk mendapatkan keuntungan, sebagaimana yang kami harapkan.
alamat tetap SWAP_ROUTER_02 = 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45;
alamat konstan WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
konstan alamat USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
konstan alamat DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
kontrak MultiHopSwap { menggunakan SafeERC20 untuk IERC20;ISwapRouter02 privat konstan ROUTER = ISwapRouter02(SWAP_ROUTER_02);uint256 privat konstan MAX_INT = 115792089237316195423570985008687907853269984665640564039457584007913129639935;fungsi swapExactInputMultiHop(uint256 amountIn) eksternal {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);}}
Router memainkan peran penting dalam memfasilitasi penyediaan likuiditas. Karena mereka tidak memiliki status dan tidak menyimpan saldo token, router dapat digantikan dengan aman. Karena itu, router memiliki nomor rilis, dimulai dari 01. Dalam implementasi kami, kami menggunakan Router02 di 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45pada mainnet.
SafeERC20 adalah lapisan perlindungan yang dibangun di sekitar transaksi ERC20, memastikan interaksi yang aman dengan token ERC20 dalam kontrak kami. Berbeda dengan fungsi ERC20 reguler, SafeERC20 meningkatkan keamanan dengan memverifikasi nilai kembalian boolean dari operasi ERC20. Jika ada operasi yang gagal, transaksi akan dibatalkan, meminimalkan risiko. Selain itu, SafeERC20 menampung token ERC20 non-standar yang tidak memiliki nilai kembalian boolean, memberikan fleksibilitas dan kekokohan dalam manajemen token. Dengan menyetujui jumlah maksimum, kami memungkinkan Router02 untuk mentransfer token atas nama kami. Tanpa melakukan hal tersebut, Anda akan mengharapkan pesan kesalahan STF di mana STF berarti eksekusi dibatalkan oleh asersi require dalam fungsi TransferHelper.safeTransferFrom.
Selanjutnya, kami akan melihat bagaimana sebuah jalur segitiga didefinisikan:
jalur memori byte = abi.encodePacked(USDC, uint24(3000),
WETH, uint24(3000), DAI, uint24(3000), USDC) ;
Melalui abi.encodePacked, Solidity mengemas rapat beberapa nilai tanpa menambahkan padding apa pun. Ini menggabungkan data biner mentah dari setiap parameter. Tidak sulit untuk memahami bahwa parameter-parameter merangkai pertukaran dengan biaya antara pasangan kripto. Jalur dimulai dari USDC dan berhenti di USDC yang mengharapkan keuntungan. Kemudian dibungkus dengan ExactInputParams dengan parameter wajib lainnya dan dimasukkan ke dalam router untuk pertukaran multi-hop.
Kami menggunakan teknik yang sama denganforking mainnet dengan kepalsuan. Setelah 10 USDC diverifikasi dikreditkan ke kontrak, pertukaran multi-hop dapat dipicu seperti di bawah ini:
it("melakukan pertukaran multi-hop", async () => {balance = await swap.tokenBalance(USDC);console.log(`Saldo USDC saat ini = ${balance}`);console.log(`Menukar ${initialFundingHuman} USDC`);const tx = await swap.swapExactInputMultiHop(ethers.parseUnits(initialFundingHuman, DECIMALS));receipt = await tx.wait();balance = await swap.tokenBalance(USDC);console.log(`Saldo USDC saat ini = ${balance}`);expect(balance).not.equal(0);});
Hasil tes harus terlihat seperti di bawah ini:
Saldo USDC paus: 170961218210457n
Pemalsuan Dimulai.
Pemalsuan selesai.
Saldo saat ini USDC = 100000000
Menukar 100 USDC
Saldo saat ini dari USDC = 91677417
Setelah melompati rintangan, kami kehilangan uang — Jelas jalur dengan nilai spot tidak menguntungkan bagi kami, tetapi Anda mendapatkan gambaran tentang bagaimana arbitrase segitiga seharusnya dilakukan menggunakan pertukaran multi-hop di Uniswap v3.
Belumkah saya bilang sumber pendanaan paling kuat dalam ekosistem DeFi adalah pinjaman Flash? Tidak akan memerlukan banyak kreativitas bagi Anda untuk membuat strategi perdagangan arbitrase triangular yang didanai oleh pinjaman Flash menggunakan kedua pinjaman Flash dan pertukaran multihop yang saya ajarkan. Logika gabungan dapat dijelaskan oleh diagram urutan yang diperbarui seperti di bawah ini:
Diagram urutan untuk arbitrase triangular yang didanai oleh pinjaman kilat di Uniswap v3 (Diabaikan beberapa operasi untuk kesederhanaan)
Periksa kode sumber saya untuk kedua pinjaman Flash dan pertukaran Multihop yang diimplementasikan di Uniswap v3 —https://medium.com/cryptocurrency-scripts/flash-loan-on-uniswap-v3-84bca2bfe255, mencerna diagram urutan dan lakukan pekerjaan rumah Anda sendiri untuk menyelesaikan kontrak cerdas yang digabungkan.
Hal pertama yang ingin kita lihat adalah jalur yang terdiri dari urutan dari 3 perdagangan: Untuk mendapatkan keuntungan, mereka harus menjadi 3 pasang crypto yang tepat pada tingkat yang tepat. Untuk menemukan semua kecocokan ini, Anda perlu mengembangkan program yang mempermutasikan pasangan yang dapat diperdagangkan dalam pola arbitrase segitiga dan mensimulasikan pertukaran untuk memeriksa profitabilitasnya. Mengambil tingkat dari blockchain bisa lambat dan akan lebih memperlambat proses jika terlalu banyak jalur yang menunggu diverifikasi untuk profitabilitas. Anda mungkin ingin mempersempit daftar jalur segitiga dengan menghitung Profit & Loss berdasarkan harga permukaan yang disediakan oleh titik akhir harga GraphQL DEX jika adaini adalah Uniswap v3’s) , karena API GraphQL jauh lebih cepat daripada blockchain untuk menyediakan data kutipan. Setelah jalur dipilih, jalankan dengan kutipan yang diambil dari rantai untuk perhitungan Profit & Loss yang lebih akurat.
Meningkatkan investasi Anda dengan pinjaman kilatDapat memperpanjang keuntungan - meminjam token dengan bunga rendah dan menginvestasikannya dengan strategi yang menguntungkan akan selalu menjadi ide bagus. Secara teori, selama keuntungan kotor cukup untuk menutupi biaya pinjaman kilat dan biaya swap, strategi arbitrase segitiga akan dianggap menguntungkan. Satu trik kritis untuk menjaga keuntungan dan mengurangi risiko perdagangan secara keseluruhan adalah memiliki logika dalam kontrak perdagangan Anda untuk gagal dalam transaksi pinjaman kilat jika pemeriksaan keuntungan kotor gagal, karena saat transaksi gagal, semua operasi akan dikembalikan dan Anda tidak perlu menanggung kerugian bahkan biaya untuk transaksi. Bagian logika ini akan berfungsi sebagai penjaga gerbang untuk mencegah slippage atau pergerakan nilai tukar yang tidak mendukung kita.
Meskipun begitu, terlepas dari keberhasilan atau kegagalan transaksi, biaya gas adalah sesuatu yang tidak bisa Anda hindari dan bisa menjadi penyebab utama kehilangan uang dari arbitrase segitiga. Selalu menilai biaya gas untuk transaksi strategi Anda dan pertimbangkan dalam perhitungan keuntungan bersih. Mohon lihat uji estimasi biaya gas dalam kode sumber saya.
Arbitrase segitiga berfungsi sebagai strategi dalam perdagangan pertukaran kripto, memanfaatkan variasi dalam nilai tukar dalam satu pasar atau di beberapa pasar. Metode ini terdiri dari tiga perdagangan berurutan: menukar cryptocurrency awal dengan yang kedua, yang kedua dengan yang ketiga, dan pada akhirnya, cryptocurrency ketiga kembali ke yang awal, semua dengan tujuan menghasilkan keuntungan. Oleh karena itu, istilah "segitiga" mencakup proses tiga langkahnya.
Gambar dihasilkan oleh AI
Di DEX, peluang arbitrase segitiga biasanya disebabkan oleh perbedaan likuiditas di beberapa kolam. Mereka biasanya berlangsung singkat, hanya beberapa detik atau bahkan kurang, karena bursa dengan cepat menyesuaikan perbedaan harga. Akibatnya, algoritma perdagangan otomatis yang dilengkapi untuk melakukan perdagangan dengan cepat digunakan untuk memanfaatkan perbedaan yang singkat ini. Untuk membantu memahami konsepnya, berikut contohnya:
Transaksi segitiga di atas dimulai dari 01 — membeli 1 wBTC dengan $60,000 USDC, diikuti oleh 02 — membeli 16 WETH dengan 1 wBTC dan diakhiri dengan 03 — menjual 16 WETH seharga $66,000 USDC. Pada akhir perjalanan, kita akan mendapatkan $6,000 USDC sebagai keuntungan.
Ada dua gaya pertukaran multi-hop yang tersedia di Uniswap v3: Input Tepat dan Output Tepat. Seperti namanya, yang pertama mengharapkan token dengan jumlah yang tepat sebagai input pertukaran, dan pada akhirnya, token dengan jumlah akan keluar pada kurs pertukaran; Yang terakhir mengharapkan jumlah yang tepat yang ditentukan sebagai output, hanya jumlah token yang cukup sebagai input yang dapat memenuhi pertukaran pada kurs pertukaran.
Dengan sifat bisnis arbitrase segitiga, kami ingin mengambil token dengan jumlah yang tepat sebagai input, menukarkannya ke mata uang kripto lain, dan kemudian menukarkannya kembali ke token asli untuk mendapatkan keuntungan, sebagaimana yang kami harapkan.
alamat tetap SWAP_ROUTER_02 = 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45;
alamat konstan WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
konstan alamat USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
konstan alamat DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
kontrak MultiHopSwap { menggunakan SafeERC20 untuk IERC20;ISwapRouter02 privat konstan ROUTER = ISwapRouter02(SWAP_ROUTER_02);uint256 privat konstan MAX_INT = 115792089237316195423570985008687907853269984665640564039457584007913129639935;fungsi swapExactInputMultiHop(uint256 amountIn) eksternal {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);}}
Router memainkan peran penting dalam memfasilitasi penyediaan likuiditas. Karena mereka tidak memiliki status dan tidak menyimpan saldo token, router dapat digantikan dengan aman. Karena itu, router memiliki nomor rilis, dimulai dari 01. Dalam implementasi kami, kami menggunakan Router02 di 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45pada mainnet.
SafeERC20 adalah lapisan perlindungan yang dibangun di sekitar transaksi ERC20, memastikan interaksi yang aman dengan token ERC20 dalam kontrak kami. Berbeda dengan fungsi ERC20 reguler, SafeERC20 meningkatkan keamanan dengan memverifikasi nilai kembalian boolean dari operasi ERC20. Jika ada operasi yang gagal, transaksi akan dibatalkan, meminimalkan risiko. Selain itu, SafeERC20 menampung token ERC20 non-standar yang tidak memiliki nilai kembalian boolean, memberikan fleksibilitas dan kekokohan dalam manajemen token. Dengan menyetujui jumlah maksimum, kami memungkinkan Router02 untuk mentransfer token atas nama kami. Tanpa melakukan hal tersebut, Anda akan mengharapkan pesan kesalahan STF di mana STF berarti eksekusi dibatalkan oleh asersi require dalam fungsi TransferHelper.safeTransferFrom.
Selanjutnya, kami akan melihat bagaimana sebuah jalur segitiga didefinisikan:
jalur memori byte = abi.encodePacked(USDC, uint24(3000),
WETH, uint24(3000), DAI, uint24(3000), USDC) ;
Melalui abi.encodePacked, Solidity mengemas rapat beberapa nilai tanpa menambahkan padding apa pun. Ini menggabungkan data biner mentah dari setiap parameter. Tidak sulit untuk memahami bahwa parameter-parameter merangkai pertukaran dengan biaya antara pasangan kripto. Jalur dimulai dari USDC dan berhenti di USDC yang mengharapkan keuntungan. Kemudian dibungkus dengan ExactInputParams dengan parameter wajib lainnya dan dimasukkan ke dalam router untuk pertukaran multi-hop.
Kami menggunakan teknik yang sama denganforking mainnet dengan kepalsuan. Setelah 10 USDC diverifikasi dikreditkan ke kontrak, pertukaran multi-hop dapat dipicu seperti di bawah ini:
it("melakukan pertukaran multi-hop", async () => {balance = await swap.tokenBalance(USDC);console.log(`Saldo USDC saat ini = ${balance}`);console.log(`Menukar ${initialFundingHuman} USDC`);const tx = await swap.swapExactInputMultiHop(ethers.parseUnits(initialFundingHuman, DECIMALS));receipt = await tx.wait();balance = await swap.tokenBalance(USDC);console.log(`Saldo USDC saat ini = ${balance}`);expect(balance).not.equal(0);});
Hasil tes harus terlihat seperti di bawah ini:
Saldo USDC paus: 170961218210457n
Pemalsuan Dimulai.
Pemalsuan selesai.
Saldo saat ini USDC = 100000000
Menukar 100 USDC
Saldo saat ini dari USDC = 91677417
Setelah melompati rintangan, kami kehilangan uang — Jelas jalur dengan nilai spot tidak menguntungkan bagi kami, tetapi Anda mendapatkan gambaran tentang bagaimana arbitrase segitiga seharusnya dilakukan menggunakan pertukaran multi-hop di Uniswap v3.
Belumkah saya bilang sumber pendanaan paling kuat dalam ekosistem DeFi adalah pinjaman Flash? Tidak akan memerlukan banyak kreativitas bagi Anda untuk membuat strategi perdagangan arbitrase triangular yang didanai oleh pinjaman Flash menggunakan kedua pinjaman Flash dan pertukaran multihop yang saya ajarkan. Logika gabungan dapat dijelaskan oleh diagram urutan yang diperbarui seperti di bawah ini:
Diagram urutan untuk arbitrase triangular yang didanai oleh pinjaman kilat di Uniswap v3 (Diabaikan beberapa operasi untuk kesederhanaan)
Periksa kode sumber saya untuk kedua pinjaman Flash dan pertukaran Multihop yang diimplementasikan di Uniswap v3 —https://medium.com/cryptocurrency-scripts/flash-loan-on-uniswap-v3-84bca2bfe255, mencerna diagram urutan dan lakukan pekerjaan rumah Anda sendiri untuk menyelesaikan kontrak cerdas yang digabungkan.
Hal pertama yang ingin kita lihat adalah jalur yang terdiri dari urutan dari 3 perdagangan: Untuk mendapatkan keuntungan, mereka harus menjadi 3 pasang crypto yang tepat pada tingkat yang tepat. Untuk menemukan semua kecocokan ini, Anda perlu mengembangkan program yang mempermutasikan pasangan yang dapat diperdagangkan dalam pola arbitrase segitiga dan mensimulasikan pertukaran untuk memeriksa profitabilitasnya. Mengambil tingkat dari blockchain bisa lambat dan akan lebih memperlambat proses jika terlalu banyak jalur yang menunggu diverifikasi untuk profitabilitas. Anda mungkin ingin mempersempit daftar jalur segitiga dengan menghitung Profit & Loss berdasarkan harga permukaan yang disediakan oleh titik akhir harga GraphQL DEX jika adaini adalah Uniswap v3’s) , karena API GraphQL jauh lebih cepat daripada blockchain untuk menyediakan data kutipan. Setelah jalur dipilih, jalankan dengan kutipan yang diambil dari rantai untuk perhitungan Profit & Loss yang lebih akurat.
Meningkatkan investasi Anda dengan pinjaman kilatDapat memperpanjang keuntungan - meminjam token dengan bunga rendah dan menginvestasikannya dengan strategi yang menguntungkan akan selalu menjadi ide bagus. Secara teori, selama keuntungan kotor cukup untuk menutupi biaya pinjaman kilat dan biaya swap, strategi arbitrase segitiga akan dianggap menguntungkan. Satu trik kritis untuk menjaga keuntungan dan mengurangi risiko perdagangan secara keseluruhan adalah memiliki logika dalam kontrak perdagangan Anda untuk gagal dalam transaksi pinjaman kilat jika pemeriksaan keuntungan kotor gagal, karena saat transaksi gagal, semua operasi akan dikembalikan dan Anda tidak perlu menanggung kerugian bahkan biaya untuk transaksi. Bagian logika ini akan berfungsi sebagai penjaga gerbang untuk mencegah slippage atau pergerakan nilai tukar yang tidak mendukung kita.
Meskipun begitu, terlepas dari keberhasilan atau kegagalan transaksi, biaya gas adalah sesuatu yang tidak bisa Anda hindari dan bisa menjadi penyebab utama kehilangan uang dari arbitrase segitiga. Selalu menilai biaya gas untuk transaksi strategi Anda dan pertimbangkan dalam perhitungan keuntungan bersih. Mohon lihat uji estimasi biaya gas dalam kode sumber saya.