Ringkasan
Keuangan terdesentralisasi (bahasa Inggris: Decentralized finance, umumnya dikenal sebagai DeFi) adalah jenis keuangan yang dibuat di blockchain. Ia tidak bergantung pada lembaga keuangan seperti pialang, bursa, atau bank untuk menyediakan instrumen keuangan, tetapi menggunakan kecerdasan pada Kontrak blockchain. melakukan aktivitas keuangan. Ada banyak peluang arbitrase di DeFi, termasuk namun tidak terbatas pada likuidasi dan arbitrase penyebaran. Artikel ini akan menganalisis kemungkinan peluang arbitrase dalam kode kontrak beberapa bursa terdesentralisasi (DEX) dan agregator.
menganalisa
Tidak bertukar tempat
Uniswap adalah platform perdagangan mata uang kripto terdesentralisasi yang mengadopsi model pembuat pasar otomatis (AMM). Saat ini ada dua versi populer, yaitu Uniswap V2 dan Uniswap V3.
Router Uniswap V2
Di Uniswap V2, pengguna umumnya berinteraksi dengan kontrak Pasangan dan kontrak Pabrik melalui kontrak Router. Secara umum, Router hanya mentransfer token dalam transaksi dan tidak menyimpan token. Namun karena berbagai alasan, seperti airdrop dan kesalahan transfer, beberapa token disimpan dalam kontrak Router. Lalu bagaimana cara menarik token tersebut?
Dengan menganalisis kode kontrak Uniswap V2 Router 02, ditemukan bahwa fungsi deleteLiquidityETHSupportingFeeOnTransferTokens ada:

Fungsi ini digunakan untuk menghapus likuiditas salah satu token, WETH. Ketika fungsi hapusLiquidity dipanggil secara internal, alamat yang akan diteruskan adalah alamat (ini), yang berarti kedua token tersebut akan ditransfer ke kontrak Router terlebih dahulu. , lalu Kontrak Router kemudian mentransfer kedua token tersebut ke alamat yang ditentukan. Meskipun jumlah WETH yang ditransfer di sini dikembalikan oleh deleteLiquidity dan tidak dapat diubah, jumlah Token lain yang ditransfer adalah balanceOf(address(this)), yang merupakan saldo token dalam kontrak Router.
Oleh karena itu, berdasarkan analisa di atas, kita dapat memperoleh proses arbitrase:
Dipantau bahwa kontrak Router 02 berisi token ERC 20;
Dipantau bahwa kontrak Router 02 berisi token ERC 20;
Panggil addLiquidityETH untuk menambahkan likuiditas ke token ERC 20 dan WETH;
Hubungi deleteLiquidityETHSupportingFeeOnTransferTokens untuk menghapus likuiditas.
keterbatasan:
Jika token tidak memiliki likuiditas dengan grup WETH sebelumnya, sejumlah kecil likuiditas (MINIMUM_LIQUIDITY) akan hilang saat likuiditas ditambahkan untuk pertama kalinya;
Saat ini tidak ada metode untuk mengekstrak WETH dan ETH dalam kontrak Router 02.
Pasangan Uniswap V2
Kontrak Pasangan Uniswap V2, yang disebut kumpulan likuiditas, menyimpan 2 token yang menyediakan likuiditas. Karena kontrak Pasangan menggunakan cadangan untuk mencatat saldo alih-alih balanceOf(address(this)), beberapa orang secara tidak sengaja mentransfer likuiditas token ditambahkan ke kontrak, akan ada perbedaan antara saldo dan cadangan, dan ada fungsi saldo skim dalam kontrak Pasangan. Kita dapat memanggil fungsi ini untuk mengekstrak token dengan perbedaan ini:

Anda dapat melihat bahwa fungsi ini akan mentransfer selisih antara saldo dan cadangan dua token likuiditas di kumpulan likuiditas ke alamat tujuan.
Selain kedua token tersebut di pool likuiditas, juga akan ada token ERC 20 lainnya karena salah transfer, airdrop, dll. Bagaimana cara menarik token ini?
Setelah menganalisis kode kontrak Pasangan, ditemukan bahwa bagian token ini tidak dapat ditarik, kecuali dalam satu kasus: ketika ada token LP dari kumpulan di kumpulan likuiditas.
Ketika ini terjadi, kita dapat memanggil fungsi pembakaran kontrak Pasangan untuk menghapus likuiditas dan menarik dua token likuiditas yang sesuai:

Uniswap V3 SwapRouter
Kontrak SwapRouter Uniswap V3 akan memiliki situasi yang sama dengan Router Uniswap V2, dengan token ERC 20 dan ETH, namun untungnya kontrak SwapRouter menyediakan beberapa fungsi untuk menarik token dengan mudah.
Untuk menarik token ERC 20 kita dapat menggunakan fungsi sapuToken:

Untuk menarik ETH kita dapat menggunakan fungsi refundETH:

Anda juga dapat langsung memanggil fungsi unwrapWETH 9 untuk memulihkan WETH ke ETH dan mengekstraknya:

Di atas adalah analisis arbitrase kontrak Uniswap V3 SwapRouter.
Setelah menganalisis kode kontrak Uniswap V3 Pool, kami menemukan bahwa tidak ada cara untuk menarik token lain dalam kontrak, dan tidak ada perbedaan antara saldo dan cadangan seperti pada kontrak Uniswap V2 Pair.
Tukar Sushi
SushiSwap dimulai sebagai cabang dari Uniswap dan sejak itu berkembang menjadi ekosistem independen yang menawarkan berbagai layanan dan produk keuangan.
Karena SushiSwap sama dengan Uniswap V2, metode arbitrase Uniswap V2 di atas juga berlaku untuk SushiSwap.
Tukar SushiX
SushiXSwap adalah protokol perdagangan rantai penuh berdasarkan LayerZero yang diluncurkan oleh SushiSwap. Jaringan yang didukung termasuk Optimism, Arbitrum, Fantom, BNB Chain, Polygon, dan Avalanche. Pengguna dapat melakukan transaksi lintas rantai antara jaringan dan aset yang didukung.
Bagaimana cara menarik token dalam kontrak SushiXSwap?
Fungsi utama di SushiXSwap diimplementasikan melalui fungsi masak, yang menyediakan serangkaian operasi yang didukung adalah sebagai berikut:

Ada operasi ACTION_DST_WITHDRAW_TOKEN, dan kodenya diimplementasikan sebagai berikut:

Pertama, data yang diteruskan ke fungsi masak didekodekan, dan kemudian ditentukan apakah jumlahnya sama dengan 0. Jika sama dengan 0, nilai jumlah diatur ke saldo token ERC 20 atau saldo ETH kontrak. Terakhir, panggil _transferTokens untuk mentransfer token ke alamat yang ditentukan:

Oleh karena itu, kita hanya perlu membuat tindakan dan data yang diteruskan ke fungsi masak, yaitu mengatur tindakan ke ACTION_DST_WITHDRAW_TOKEN, membuat token, alamat penerima, dan jumlah yang ingin kita transfer dalam data, lalu mentransfer token tersebut ke dalam kontrak SushiXSwap.
Kotak Bento Sushi
Sushi BentoBox adalah komponen dalam ekosistem SushiSwap. BentoBox adalah produk pengoptimalan suku bunga keuangan terdesentralisasi (DeFi) yang sangat fleksibel. Sederhananya, ini adalah platform kontrak pintar yang memungkinkan pengguna menyimpan, meminjam, dan mendapatkan bunga. Tujuan utama BentoBox adalah untuk mengoptimalkan keuntungan pengguna di bidang DeFi.
Sejumlah besar token disimpan dalam kontrak BentoBox di Ethereum, jadi apakah ada ruang untuk arbitrase dalam kontrak ini?
Dalam kontrak BentoBox, pengguna dapat melakukan operasi penyetoran melalui fungsi penyetoran.

Anda dapat melihat bahwa pengguna memasukkan alamat token, alamat debit, alamat penerima, jumlah, dan jumlah pembagian yang ditentukan. Fungsi tersebut pertama-tama melakukan serangkaian pemeriksaan, dan kemudian mengonversi jumlah atau pembagian. 198, disini Lakukan verifikasi: jumlah <= _tokenBalanceOf(token).sub(total.elastic).
Dalam kontrak BentoBox, saldo token tertentu dicatat menggunakan total.elastic, mirip dengan cadangan dalam kontrak Uniswap Pair. Dalam beberapa kasus, akan ada perbedaan dengan _tokenBalanceOf(token). fungsi deposit di sini. , dan benar-benar mengubah selisihnya menjadi saldo Anda sendiri dalam kontrak BentoBox.
Oleh karena itu, ketika kita meneruskan parameter, kita menyetel token ke alamat token dengan selisihnya, menyetel nilai jumlah ke selisihnya, lalu menyetel dari ke alamat kontrak BentoBox, dan menyetel ke ke alamat kita sendiri 207, karena Alamatnya adalah alamat kontrak BentoBox, jadi tidak akan ada transfer. Ini hanya menyeimbangkan nilai total.elastic dan _tokenBalanceOf(token) dan mengubahnya menjadi saldo alamat to dalam kontrak.
DODO
DODO adalah platform perdagangan terdesentralisasi yang menggunakan algoritma Active Market Maker (PMM) asli untuk menyediakan likuiditas on-chain yang efisien untuk aset Web3. DODO tidak hanya menyediakan likuiditas sendiri, tetapi juga mengumpulkan likuiditas dari bursa lain.
DODO memiliki serangkaian kontrak, di mana pengguna akan bertukar token melalui kontrak DODO V2 Proxy 02. Mirip dengan kontrak Uniswap Router, kontrak ini juga akan memiliki beberapa token karena berbagai alasan. Bagaimana cara kami menarik token ini?
Proksi DODO V2 02
Ada fungsi externalSwap dalam kontrak DODO V2 Proxy 02, yang digunakan untuk memanggil platform eksternal yang dikumpulkan oleh DODO untuk pertukaran, seperti 0x dan 1 inci. Kode diimplementasikan sebagai berikut:

Baris 1719-1721 memverifikasi parameter yang masuk, dan kemudian baris 1724 memverifikasi apakah fromToken adalah ETH. Jika tidak, token pemanggil akan ditransfer ke kontrak, dan kemudian diotorisasi. Setelah menganalisis kode kontrak DODOAPPROVE Nanti saya menemukan bahwa saya saja perlu menyetel fromTokenAmount ke 0 untuk melewati:

Kemudian kontrak eksternal yang dipanggil akan diverifikasi, dan hanya dapat dipanggil jika ada dalam daftar putih. swapTarget dan calldataConcat di sini dapat dikontrol oleh pengguna, sehingga swapTarget dapat disetel ke alamat kontrak 0x atau 1 inci, lalu calldataConcat diatur ke Fungsi tampilan kontraknya dikodekan sehingga nilai yang dikembalikan adalah benar dan juga dapat melewati verifikasi yang diperlukan berikutnya:

Selanjutnya, semua toToken dalam kontrak akan ditransfer ke pemanggil. ToToken di sini dapat berupa token ERC 20 atau ETH. Setelah pengiriman, jumlah minimum yang diharapkan akan diverifikasi. Kami menetapkan nilai minReturnAmount ke nilai yang sangat kecil . Dua pemanggilan fungsi terakhir tidak relevan.

Melalui langkah di atas, kita dapat menarik token ERC 20 dan ETH dalam kontrak DODO V2 Proxy 02.
1 inci
1inch adalah agregator pertukaran terdesentralisasi (DEX) yang mengumpulkan likuiditas dari beberapa DEX untuk memberikan harga pertukaran token terbaik kepada pengguna. Dengan mengintegrasikan likuiditas dari berbagai sumber, 1inch membantu pengguna mengoptimalkan transaksi dan menemukan harga terbaik di seluruh platform. Kontrak pintar 1inch secara otomatis diperdagangkan di berbagai bursa terdesentralisasi, memungkinkan pengguna dengan mudah mendapatkan harga terbaik dan slippage terendah di antara berbagai bursa. Selain itu, 1inch juga menyediakan fitur lain seperti penambangan likuiditas dan token tata kelola.
Kontrak utama 1 inci adalah AggregationRouter, dan versi V 4 dan V 5 lebih umum digunakan sekarang. Kedua kontrak ini juga akan memiliki beberapa token karena berbagai alasan. Kita dapat mengekstrak parameter dalam kontrak melalui parameter yang diteruskan dalam konstruksi fungsi. dari token.
AgregasiRouterV 5
Kontrak AggregationRouterV 5 memiliki fungsi swap, dan implementasinya adalah sebagai berikut:

Setelah memverifikasi minReturnAmount di desc, dapatkan srcToken dan dstToken dari desc. Baris berikutnya 986-997 dapat dilewati dengan membuat flag dan srcToken di struktur desc:

Kemudian jalankan fungsi _execute, di mana panggilan akan dilakukan dan status eksekusi akan diverifikasi Karena eksekutor diteruskan oleh pengguna, kita dapat menggunakan alamat 0 untuk melewatinya:

Kemudian dapatkan saldo dstToken dalam kontrak. Kita dapat melewati baris 1007-1018 dengan membuat flag dan minReturnAmount di desc:

Terakhir, saldo dstToken dalam kontrak akan ditransfer ke alamat dstReceiver, yang juga dikontrol oleh pengguna:

Melalui langkah-langkah di atas, kita dapat membuat parameter yang diteruskan ke fungsi swap untuk menarik token dalam kontrak AggregationRouterV 5.
AgregasiRouterV 4
Tidak banyak perbedaan antara AggregationRouterV 4 dan AggregationRouterV 5. Ada juga fungsi swap di AggregationRouterV 4 yang diimplementasikan sebagai berikut:

Dapat ditemukan bahwa implementasi fungsi swap sama dengan AggregationRouterV 5, hanya saja AggregationRouterV 5 mengoptimalkan panggilan, sehingga token yang disimpan dalam kontrak AggregationRouterV 4 dapat diekstraksi menggunakan metode yang sama seperti AggregationRouterV 5.
Meringkaskan
Artikel ini secara singkat memperkenalkan beberapa bursa dan agregator terdesentralisasi, dan membahas kemungkinan arbitrase di antara mereka. Artikel ini menganalisis prinsip arbitrase dari tingkat kode kontrak. Namun, keberhasilannya dalam praktik masih terkait dengan banyak faktor, seperti GAS, dan lain-lain. node, dll. kecepatan dll.
