SharkTeam:UniswapX 源碼分析

發表於 2023-08-04 15:18 作者: SharkTeam

設計原理

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,所以可以通過批量執行訂單的方式來減少一次交易帶來的手續費損耗。

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

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

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

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

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

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

標題:SharkTeam:UniswapX 源碼分析

地址:https://www.coinsdeep.com/article/29848.html

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。

你可能還喜歡
熱門資訊