SharkTeam 分析了 UniswapX 的源码。

SharkTeam 分析了 UniswapX 源码。

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。但如果在某个时间点,无人愿意按照 999 USDC 的价格填写 Alice 的订单,Alice 的 1 ETH 可兑换为更少的 USDC。

交易流程如下: 1. UniswapX 利用 Permit2 代币授权合约引入了基于签名的授权和转账功能,适用于任何 ERC20 代币。 2. 兑换者无需手动创建和提交交易,而是对交易订单签名,指定输入代币、输出代币、输入数量、初始输出金额、最低输出数量、衰减函数、兑换期限以及授权 UniswapX Reactor 合约代表其使用代币等参数。 3. 这些订单由填单者接收,并通过 Reactor 合约发送到链上执行。填单者代表兑换者支付 Gas 费用,这些费用会反映在执行价格中以补偿 Gas 成本。 4. Reactor 合约调用填单者的 Executor 合约进行订单执行。一旦确定资产来源,Executor 合约将资产发送到兑换者的地址,并从兑换者地址提取资金。最后,Reactor 合约验证订单是否满足条件。

UniswapX 的流动性填充并没有具体规定填单者如何填充兑换者的订单。流动性可以来自 Uniswap 或其他去中心化交易所的链上流动性池、链下流动性源或其他 UniswapX 订单。多个订单可以捆绑到同一笔交易中,并且其他操作可以在链上原子执行。

关键源码解析

UniswapX 的关键源码解析如下:

代码截图1
代码截图2

_fill 函数中处理具体订单的执行逻辑,存在两种情况:如果填充者使用自己个人持仓来完成用户的兑换,则不需要使用回调合约,直接进行资金对换;否则,需要在回调合约中处理具体逻辑,例如到其他交易池中进行兑换等。

代码截图3

合约使用 validate 函数来验证填充者是否是订单的指定填充者。

代码截图4
代码截图5

合约使用了 permit2 库来完成签名的校验和代币的转账,以此保证交换者的资金安全。

代码截图6

若填充者选择使用个人持仓完成订单,则会直接将代币从填充者地址转移到交换者地址。

代码截图7

在回调合约的回调函数执行完成后,调用 check 函数校验用户是否收到了足够的代币,若不满足足够的代币,则回滚整个交易。

总结来说,UniswapX 的合约中涉及到的只有关于链上的逻辑。用户无需支付 Gas 费用来完成交易,因此前期的多数操作选择在链下进行,如用户的交换请求发送和对交易进行签名等。UniswapX 选择将用户的交换请求发送给填充者,在填充者接受填充请求后,将交易发送到链上,并从中赚取差值作为利润。

代码截图8