SharkTeam:UniswapX 源碼分析

設計原理

UniswapX 旨在通過將路由複雜性外包給第三方填充者的開放網絡來解決,然後第三方填充者競爭使用AMM 礦池或自己的私人庫存等鏈上流動性來填充掉期。

借助UniswapX,交換者將能夠使用Uniswap 界面,而不必擔心自己是否獲得最佳價格,並且交易將始終在鏈上透明地記錄和結算。所有訂單均由Uniswap 智能訂單路由器支持,這迫使填充者與Uniswap v1、v2、v3 以及一旦啟動後的v4 競爭。

優勢

  • 通過聚合流動性來源獲得更好的價格

  • 無gas 交換

  • 防止MEV(最大可提取值)

  • 交易失敗無需支付任何費用

  • 在接下來的幾個月中,UniswapX 將擴展到無Gas 跨鏈交換。

工作原理

首先,假設Alice(交換者)想要將1 ETH 交換為USDC。 Alice 向(潛在的填充者)Bob、Charlie 和Danielle 請求報價:

  • Bob 提出以1,000 USDC 購買Alice 的ETH

  • Charlie 現有999 USDC

  • Danielle 現有998 USDC

  • Alice 還可以直接通過Uniswap v3 將她的1 ETH 兌換成997 USDC

Alice 接受Bob 的1,000 USDC 報價,並簽署訂單。

該訂單包括最大值(由Bob 的報價1,000 USDC 設置)和最小值997 USDC(由Uniswap 智能訂單路由器API 設置)。

Bob 可以使用他自己的USDC 或將Alice 的1 個ETH 路由到各種鏈上流動性場所(Uniswap 協議、Sushiswap 等)來填寫Alice 的訂單。

Bob 決定使用自己的USDC 來滿足Alice 的訂單,並向Alice 發送1,000 USDC 以換取她的1 ETH。

如果Bob 決定放棄他的提議,Alice 不需要提交新的訂單和簽名。

相反,她現有的訂單會自動更新,向任何能給她999 USDC 作為回報的人提供1 ETH。

一個區塊已經過去,現在Charlie 和Danielle(以及參與UniswapX 系統的任何其他填充者)都不願意以999 USDC 的價格填寫Alice 的訂單。另一個以太坊區塊(12 秒)到期後,Alice 的1 ETH 可兌換998 USDC。

突然,Danielle 意識到,通過將Alice 的交易發送到Uniswap v3 和Sushiswap 的組合,她可以以998 USDC 的價格填寫Alice 的1 ETH 賣單,同時仍然為自己賺取1 USDC 的利潤。

Danielle 代表Alice 將Alice 的1 ETH 發送到Uniswap v3 和Sushiswap,將998 USDC 返還給Alice,並為自己保留剩餘的1 USDC 輸出。

交易流程

UniswapX 是一個去中心化交易協議,利用Permit2 代幣授權合約引入了基於簽名的授權和轉賬功能,適用於任何ERC20 代幣。此外,UniswapX 還使用Reactor 合約進行鏈上結算。 Reactor 合約負責驗證交易是否符合用戶指定的參數,並可以撤銷不符合條件的交易。要參與UniswapX 的交易,兌換者首先必須授權Permit2 合約。

兌換者無需手動創建和提交交易,而是對交易訂單簽名,指定以下參數:

  1. 輸入代幣(支付代幣)

  2. 輸出代幣(獲取代幣)

  3. 輸入(輸出)數量

  4. 初始輸出(輸入)金額

  5. 最低輸出(輸入)數量

  6. 衰減函數

  7. 兌換期限

  8. 授權UniswapX Reactor 合約代表其使用代幣

這些訂單由MEV 搜索者、做市商和/ 或其他鏈上代理(統稱為填單者)接收,並將其發送到Reactor 合約。通過在鏈上提交兌換者的訂單,填單者代表兌換者支付Gas 費用。這些費用會反映在執行價格中,以補償Gas 成本。

Reactor 合約調用填單者的Executor 合約,其中包含特定的訂單執行邏輯。一旦確定資產來源,Executor 合約將資產發送到兌換者的地址,並從兌換者地址提取資金。最後,Reactor 合約驗證訂單是否滿足條件。

UniswapX 沒有規定填單者如何填充兌換者的訂單。流動性可以來自Uniswap 或其他去中心化交易所的鏈上流動性池、鏈下流動性源或其他UniswapX 訂單。多個訂單可以捆綁到同一筆交易中,並且其他操作可以在鏈上原子執行。

關鍵源碼解析

由於填充者需要代替交換者提交gas,所以可以通過批量執行訂單的方式來減少一次交易帶來的手續費損耗。

image.png

_fill 函數中處理具體訂單的執行邏輯,這裡存在兩種情況,如果填充者使用自己個人持倉來完成用戶的兌換,則不需要使用回調合約,直接進行資金對換;否則需要在回調合約中來處理具體邏輯,例如到其他交易池中進行兌換等。

image.png

合約使用validate 函數來驗證填充者是否是訂單的指定填充者。

image.png

image.png

合約使用了permit2 庫來完成簽名的校驗和代幣的轉賬,以此保證交換者的錢不會被隨意轉走。

image.png

若填充者選擇使用個人持倉完成訂單,則會直接將代幣從填充者地址轉移到交換者地址。

image.png

在回調合約的回調函數執行完成後,調用check 函數校驗用戶是否收到了足夠的代幣,若不滿足足夠的代幣,則交易整個回退。

總結,合約中涉及到的只有關於鏈上的邏輯,由於用戶並不需要支付gas 費來完成這一筆交易,所以前期的多數操作選擇在鏈下進行,包括用戶的交換請求發送和對交易進行簽名等。 uniswapX 選擇在鏈下將用戶的交換請求發送給填充者,而一旦填充者接受了填充請求,則由填充者將交易發送到鏈上,並從中賺取差值作為利潤。

image.png

Total
0
Shares
Related Posts