Überblick

Dezentrale Finanzierung (englisch: Decentralized Finance, allgemein bekannt als DeFi) ist eine Art von Finanzierung, die auf der Blockchain erstellt wird. Sie verlässt sich bei der Bereitstellung von Finanzinstrumenten nicht auf Finanzinstitute wie Broker, Börsen oder Banken, sondern nutzt die Informationen der Blockchain-Verträge Finanzaktivitäten durchführen. Es gibt eine große Anzahl von Arbitrage-Möglichkeiten in DeFi, einschließlich, aber nicht beschränkt auf Liquidation und Spread-Arbitrage. In diesem Artikel werden die möglichen Arbitragemöglichkeiten in Vertragscodes einiger dezentraler Börsen (DEX) und Aggregatoren analysiert.

analysieren

Uniswap

Uniswap ist eine dezentrale Kryptowährungs-Handelsplattform, die das Automatic Market Maker (AMM)-Modell übernimmt. Derzeit gibt es zwei beliebte Versionen, nämlich Uniswap V2 und Uniswap V3. Wir werden die möglichen Arbitragemöglichkeiten analysieren.

Uniswap V2 Router

In Uniswap V2 interagieren Benutzer im Allgemeinen über den Router-Vertrag mit dem Pair-Vertrag und dem Factory-Vertrag. Im Allgemeinen überträgt der Router Token nur in Transaktionen und speichert sie nicht. Aus verschiedenen Gründen, wie z. B. Airdrops und Übertragungsfehlern, werden einige Token jedoch im Router-Vertrag gespeichert. Wie kann man diese Token abheben?

Durch die Analyse des Codes des Uniswap V2 Router 02-Vertrags wurde festgestellt, dass die Funktion „removeLiquidityETHSupportingFeeOnTransferTokens“ vorhanden ist:

Diese Funktion wird verwendet, um die Liquidität eines der Token, WETH, zu entfernen. Wenn die Funktion „removeLiquidity“ intern aufgerufen wird, lautet die übergebene Adresse „address (this“), was bedeutet, dass die beiden Token zuerst an den Router-Vertrag übertragen werden , und dann überträgt der Router-Vertrag die beiden Token an die angegebene Adresse. Obwohl der hier übertragene WETH-Betrag von removeLiquidity zurückgegeben wird und nicht geändert werden kann, ist der Betrag eines anderen übertragenen Tokens balanceOf(address(this)), was dem Restbetrag des Tokens im Router-Vertrag entspricht.

Basierend auf der obigen Analyse können wir daher einen Arbitrageprozess erhalten:

Es wird überwacht, dass der Router 02-Vertrag ERC 20-Token enthält;

  • Es wird überwacht, dass der Router 02-Vertrag ERC 20-Token enthält;

  • Rufen Sie addLiquidityETH auf, um die Liquidität des ERC 20-Tokens und WETH hinzuzufügen;

  • Rufen Sie „removeLiquidityETHSupportingFeeOnTransferTokens“ auf, um Liquidität zu entfernen.

Einschränkung:

  • Wenn der Token zuvor keine Liquidität bei der WETH-Gruppe hat, geht ein kleiner Betrag an Liquidität (MINIMUM_LIQUIDITY) verloren, wenn zum ersten Mal Liquidität hinzugefügt wird;

  • Derzeit gibt es im Router 02-Vertrag keine Methode zum Extrahieren von WETH und ETH.

Uniswap V2 Paar

Der Uniswap-V2-Pair-Vertrag, der sogenannte Liquiditätspool, speichert 2 Token, die Liquidität bereitstellen, da der Pair-Vertrag anstelle von balanceOf(address(this)) die Liquidität direkt überträgt Wenn Token in den Vertrag aufgenommen werden, gibt es einen Unterschied zwischen Guthaben und Reserve, und im Pair-Vertrag gibt es eine Balance-Funktion. Wir können diese Funktion aufrufen, um die Token mit diesem Unterschied zu extrahieren:

Sie können sehen, dass diese Funktion die Differenz zwischen Saldo und Reserve der beiden Liquiditätstoken im Liquiditätspool an die Zieladresse überträgt.

Zusätzlich zu diesen beiden Token im Liquiditätspool wird es aufgrund von Fehltransfers, Airdrops usw. auch andere ERC 20-Token geben. Wie kann ich diese Token abheben?

Nach der Analyse des Codes des Pair-Vertrags wurde festgestellt, dass dieser Teil der Token nicht abgehoben werden kann, außer in einem Fall: wenn sich LP-Token des Pools im Liquiditätspool befinden.

In diesem Fall können wir die Burn-Funktion des Pair-Vertrags aufrufen, um Liquidität zu entfernen und die entsprechenden zwei Liquiditäts-Token abzuheben:

Uniswap V3 SwapRouter

Der SwapRouter-Vertrag von Uniswap V3 wird die gleiche Situation haben wie der Uniswap V2 Router, mit ERC 20-Tokens und ETH, aber glücklicherweise bietet der SwapRouter-Vertrag mehrere Funktionen, um die Token einfach abzuheben.

Um ERC 20-Token abzuheben, können wir die Funktion „sweepToken“ verwenden:

Um ETH abzuheben, können wir die Funktion „refundETH“ verwenden:

Sie können die Funktion unwrapWETH 9 auch direkt aufrufen, um WETH in ETH wiederherzustellen und zu extrahieren:

Das Obige ist eine Arbitrage-Analyse des Uniswap V3 SwapRouter-Vertrags.

Nach der Analyse des Codes des Uniswap V3 Pool-Vertrags wurde festgestellt, dass es keine Möglichkeit gibt, andere Token im Vertrag abzuheben, und dass es keinen Unterschied zwischen Guthaben und Reserve wie im Uniswap V2 Pair-Vertrag gibt.

SushiSwap

SushiSwap begann als Fork von Uniswap und hat sich seitdem zu einem unabhängigen Ökosystem entwickelt, das viele verschiedene Finanzdienstleistungen und -produkte anbietet.

Da SushiSwap mit Uniswap V2 identisch ist, gelten die oben genannten Arbitragemethoden für Uniswap V2 auch für SushiSwap.

SushiXSwap

SushiXSwap ist ein von SushiSwap eingeführtes Full-Chain-Handelsprotokoll, das auf LayerZero basiert. Zu den unterstützten Netzwerken gehören Optimism, Arbitrum, Fantom, BNB Chain, Polygon und Avalanche. Benutzer können kettenübergreifende Transaktionen zwischen unterstützten Netzwerken und Assets durchführen.

Wie kann ich die Token im SushiXSwap-Vertrag abheben?

Die Hauptfunktionen in SushiXSwap werden durch die Cook-Funktion implementiert, die eine Reihe von Operationen bereitstellt. Die Liste der unterstützten Operationen lautet wie folgt:

Es gibt eine Operation ACTION_DST_WITHDRAW_TOKEN und ihr Code ist wie folgt implementiert:

Zuerst werden die an die Cook-Funktion übergebenen Daten dekodiert und dann bestimmt, ob der Betrag gleich 0 ist. Wenn er gleich 0 ist, wird der Wert des Betrags auf den Saldo des ERC 20-Tokens oder den Saldo der ETH gesetzt vom Vertrag. Rufen Sie abschließend _transferTokens auf, um die Token an die angegebene Adresse zu übertragen:

Daher müssen wir nur die an die Cook-Funktion übergebenen Aktionen und Daten erstellen, das heißt, die Aktionen auf ACTION_DST_WITHDRAW_TOKEN setzen, die Token, die Empfangsadresse und die Menge erstellen, die wir in den Daten übertragen möchten, und dann die Token übertragen der SushiXSwap-Vertrag.

Sushi BentoBox

Sushi BentoBox ist eine Komponente im SushiSwap-Ökosystem. BentoBox ist ein hochflexibles Produkt zur Zinsoptimierung im dezentralen Finanzwesen (DeFi). Einfach ausgedrückt handelt es sich um eine intelligente Vertragsplattform, die es Benutzern ermöglicht, Geld zu speichern, zu leihen und Zinsen zu verdienen. Der Hauptzweck von BentoBox besteht darin, die Gewinne der Benutzer im DeFi-Bereich zu optimieren.

Im BentoBox-Vertrag auf Ethereum ist eine große Anzahl von Token gespeichert. Gibt es in diesem Vertrag also Raum für Arbitrage?

Im BentoBox-Vertrag können Benutzer Einzahlungsvorgänge über die Einzahlungsfunktion durchführen. Die Implementierung der Funktion ist wie folgt:

Sie können sehen, dass der Benutzer die angegebene Token-Adresse, Lastschriftadresse, Empfangsadresse, Menge und Anzahl der Anteile eingegeben hat. Die Funktion führt zunächst eine Reihe von Prüfungen durch und konvertiert dann den Betrag oder Anteil. Der entscheidende Punkt ist die Zeile 195 - 198, hier eine Überprüfung durchgeführt: Betrag <= _tokenBalanceOf(token).sub(total.elastic).

Im BentoBox-Vertrag wird der Saldo eines bestimmten Tokens mit total.elastic erfasst, ähnlich wie die Reserve im Uniswap-Pair-Vertrag. In einigen Fällen gibt es einen Unterschied mit _tokenBalanceOf(token). Hier können Sie die Einzahlungsfunktion nutzen und die Differenz tatsächlich in Ihr eigenes Guthaben im BentoBox-Vertrag umwandeln.

Wenn wir die Parameter übergeben, setzen wir token auf die Token-Adresse mit der Differenz, setzen den Wert von amount auf die Differenz, setzen dann from auf die Adresse des BentoBox-Vertrags und setzen to auf unsere eigene Adresse 207, da es sich bei der Adresse um die BentoBox-Vertragsadresse handelt, erfolgt keine Übertragung. Es werden lediglich die Werte von total.elastic und _tokenBalanceOf(token) ausgeglichen und in den Saldo der to-Adresse im Vertrag umgewandelt.

DODO

DODO ist eine dezentrale Handelsplattform, die einen ursprünglichen Active Market Maker (PMM)-Algorithmus verwendet, um effiziente On-Chain-Liquidität für Web3-Assets bereitzustellen. DODO stellt nicht nur selbst Liquidität bereit, sondern aggregiert auch Liquidität von anderen Börsen.

DODO verfügt über eine Reihe von Verträgen, in denen Benutzer Token über den DODO V2 Proxy 02-Vertrag austauschen. Ähnlich wie beim Uniswap-Router-Vertrag wird dieser Vertrag aus verschiedenen Gründen auch einige Token enthalten. Wie sollten wir diese Token abheben?

DODO V2 Proxy 02

Im DODO V2 Proxy 02-Vertrag gibt es eine externalSwap-Funktion, mit der die von DODO für den Austausch aggregierte externe Plattform aufgerufen wird, z. B. 0x und 1 Zoll. Der Code ist wie folgt implementiert:

Zeilen 1719–1721 überprüfen die eingehenden Parameter und dann überprüft Zeile 1724, ob fromToken ETH ist. Wenn nicht, wird das Token des Anrufers in den Vertrag übertragen und dann autorisiert Sie müssen fromTokenAmount auf 0 setzen, um Folgendes zu umgehen:

Anschließend wird der aufgerufene externe Vertrag überprüft und kann nur dann aufgerufen werden, wenn er in der Whitelist enthalten ist. swapTarget und calldataConcat können hier vom Benutzer gesteuert werden, sodass swapTarget auf die Vertragsadresse 0x oder 1 Zoll eingestellt werden kann Das calldataConcat wird auf die Ansichtsfunktion seines Vertrags gesetzt und ist so codiert, dass der zurückgegebene Wert wahr ist und auch die nachfolgende Anforderungsüberprüfung bestehen kann:

Als nächstes werden alle toTokens im Vertrag an den Anrufer übertragen. Der toToken kann hier ERC 20-Token oder ETH sein. Nach dem Senden wird der Wert von minReturnAmount auf sehr kleine Werte festgelegt . Die letzten beiden Funktionsaufrufe sind irrelevant.

Durch die oben genannten Schritte können wir die ERC 20-Token und ETH im DODO V2 Proxy 02-Vertrag abheben.

1 Zoll

1inch ist ein dezentraler Börsenaggregator (DEX), der die Liquidität mehrerer DEXs aggregiert, um Benutzern die besten Token-Börsenpreise zu bieten. Durch die Integration von Liquidität aus verschiedenen Quellen hilft 1inch Benutzern, Transaktionen zu optimieren und plattformübergreifend die besten Preise zu finden. Die Smart Contracts von 1inch werden automatisch über verschiedene dezentrale Börsen hinweg gehandelt, sodass Benutzer problemlos den besten Preis und den geringsten Slippage zwischen verschiedenen Börsen erzielen können. Darüber hinaus bietet 1inch auch weitere Funktionen wie Liquidity Mining und Governance-Tokens.

Der Hauptvertrag von 1 Zoll ist AggregationRouter, und die Versionen V 4 und V 5 werden jetzt aus verschiedenen Gründen häufiger verwendet. Wir können die Parameter im Vertrag über die Parameter im konstruierten Eingang extrahieren Funktion von Token.

AggregationRouterV 5

Der AggregationRouterV 5-Vertrag verfügt über eine Swap-Funktion und seine Implementierung ist wie folgt:

Nachdem Sie minReturnAmount in desc überprüft haben, erhalten Sie srcToken und dstToken aus desc. Die nächsten Zeilen 986–997 können umgangen werden, indem Flags und srcToken in der desc-Struktur erstellt werden:

Führen Sie dann die Funktion _execute aus, bei der ein Aufruf erfolgt und der Ausführungsstatus überprüft wird. Da der Executor vom Benutzer übergeben wird, können wir ihn mit der 0-Adresse umgehen:

Holen Sie sich dann den Restbetrag von dstToken im Vertrag. Wir können die Zeilen 1007–1018 umgehen, indem wir in desc flags und minReturnAmount konstruieren:

Schließlich wird der dstToken-Saldo im Vertrag an die dstReceiver-Adresse übertragen, die ebenfalls vom Benutzer gesteuert wird:

Durch die obigen Schritte können wir die Parameter konstruieren, die an die Swap-Funktion übergeben werden, um die Token im AggregationRouterV 5-Vertrag abzuheben.

AggregationRouterV 4

Es gibt keinen großen Unterschied zwischen AggregationRouterV 4 und AggregationRouterV 5. Es gibt auch eine Swap-Funktion in AggregationRouterV 4, die wie folgt implementiert ist:

Es kann festgestellt werden, dass die Implementierung der Swap-Funktion mit der von AggregationRouterV 5 identisch ist, mit der Ausnahme, dass AggregationRouterV 5 den Aufruf optimiert, sodass die im AggregationRouterV 4-Vertrag gespeicherten Token mit derselben Methode wie AggregationRouterV 5 extrahiert werden können.

Zusammenfassen

In diesem Artikel werden einige dezentrale Börsen und Aggregatoren kurz vorgestellt und die mögliche Arbitrage zwischen ihnen erörtert. Er analysiert das Prinzip der Arbitrage auf Vertragscodeebene. Ob es in der Praxis jedoch erfolgreich sein kann, hängt immer noch von vielen Faktoren ab, wie z. B. GAS. Knotengeschwindigkeit usw.