Skip to content
← 聚合交易应该怎么做

Compare versions

Rendered content, compared by block. Red marks removed content; green marks added content. Scripts and interactive embeds are disabled.

v1

Title not recorded

v2

聚合交易应该怎么做

− Removed

今天看了 OneKey 钱包的 Swap 功能,发现只是接入了 0x 的服务,十分简陋。然后顺着 0x 的 GitHub 看了一遍,然后结合昨天研究 MetaMask Swap 得出的一些初步结论,奶爸就斗胆来规划一下,打造一个聚合交易平台

+ Added

现在 Aggregator 中同链 Swap 聚合在 EVM 生态中做的比较好的是 1inch,而在 Solana 生态中做的比较好的是 Jupiter,Jupiter 的撮合算法是「经修改的 Bellman-Ford algorithm」,提供 self-hosted 版本。巧合的是截止文章发布时他们的版本都是 V6。

− Removed

接入现有聚合交易服务

+ Added

跨链 Swap+Brige 做的比较好的是 LiFi 和 Rango,因为像这种既集成了 Swap 又集成了 Bridge 的产品功能更加强大,可以 Swap & Brige,能够支持的交易对和场景更多。

− Removed
+ Added

DEX

− Removed
+ Added

目前不管是 EVM 生态还是 Solana 生态,主流的 DEX 都是基于两种模型,一种是 CFMM 恒定函数做市商,另一种是 CLMM 集中流动性做市商。CFMM 的代表是 Uniswap V2 / Raydium,CLMM 的代表是 Uniswap V3 / Orca,这两个模式都是由 Uniswap 提出,Solana 生态也是从 AMM 过度到 CLMM 的。

− Removed
+ Added

AMM 的核心是 x*y=k,只要有池中两个 Token 的余额 x 和 y 就能计算任意价格下的交易结果。

− Removed
+ Added

CLMM 的核心是 tick 和 liquidity,目前开源的 DEX,大多都是 Uniswap V3 式的实现,使用 tick 和 liquidity 来计算交易,可以从这里了解详细计算过程。想要计算任意价格下的交易结果,需要拥有全部 tick 和 tick 上的 liquidity 的数据。

− Removed
+ Added

Aggregator

− Removed

整合现有 DEX

+ Added

DEX Aggregator

− Removed

择优

+ Added

DEX 聚合器有两种做法,一种是通过合约读取链上数据,另外一种是将链上数据保存到链下进行分析。

− Removed
let 最佳汇率;
range DEX:
  range 交易对:
    if 汇率 > 最佳汇率:
      最佳汇率 = 汇率;
return 最佳汇率
+ Added

一种是直接通过 Quote 合约询价,这样做简单一些,不需要解析链上数据实现合约中的计算方法,对于 Uniswap V2 这种 CFMM 来说可以通过比例算出其他价格下的交易结果,但是在 Uniswap V3 这种 CLMM 采取合约询价的方式就无法对其他价格区间的交易结果进行计算了。

− Removed

路径拆分

+ Added

核心:x*y = k,买入卖出之后 k 值不变

− Removed
A -> B 可能直接交易因为池深度不够,滑点会很大
A 20% -> B
  30% -> C -> B
  50% -> D -> B
这么拆分一下最终的滑点会比直接交易小
+ Added

另外一种是将 Pair 信息、Tick 信息存到链下中,实现合约中 Tick 移动时的行为,这样复杂一些但是可以进行更为细致精确的计算。

− Removed

专业做市商

+ Added

核心: 根据 tick 和 tick 上的流动性计算价格影响

− Removed

与像 Watermute 这种专业做市商合作给他们撮合订单

+ Added

Bridge Aggregator

− Removed

以上其实就是做一个聚合交易平台核心的部分,至于前端其实怎么做都可以

+ Added

Bridge 一般来说比较简单,按照协议提供的合约接口去调用即可,bridge 的链上池数据结构一般比较简单或者有提供 restful API。

+ Added

时序图

+ Added
@startuml skinparam backgroundColor #ffffff00 skinparam DefaultFontColor #DodgerBlue skinparam handwritten true skinparam sequence { ArrowColor LightSkyBlue ActorBorderColor LightSkyBlue LifeLineBorderColor LightSkyBlue LifeLineBackgroundColor #A9DCDF ParticipantBorderColor LightSkyBlue ParticipantBackgroundColor DodgerBlue ParticipantFontName Impact ParticipantFontSize 17 ParticipantFontColor #A9DCDF ActorBackgroundColor aqua ActorFontColor LightSkyBlue ActorFontSize 17 ActorFontName Impact } actor User participant "Wallet" as A participant "Aggregator API" as B participant "Off-chain or on-chain Pair Data" as C participant "Aggregator Router" as D participant "Swap Router" as E participant "Bridge" as F User -> A: 进入 Swap & Bridge 界面,\n选择链和Token差 activate A A -> B: /quote 接口寻找报价 activate B B -> C: 查询相关 Pair 流动性数据 activate C C -> B: 分析各个Swap\nPair 流动性、进行大单拆单、多\nPair 撮合 deactivate C B -> A: 返回报价列表 deactivate B A -> B: 选择报价,请求生成交易数据 activate B B -> A: 构造 calldata 返回 deactivate B A -> D: 提交 Aggregator Router 执行 activate D D -> E: 根据 calldata 进行 swap 操作 activate E E -> D: 划转 output token deactivate E D -> F: swap 完成,approve 给 bridge 合约,开始跨链 activate F F -> D: 收到跨链资产,交由协议执行 deactivate F D -> A: 链上执行成功 deactivate D note over B: aggregator 后端会记录跨链相关交易\n,持续追踪状态 A -> B: 查询跨链状态 activate B B -> A: 跨链成功,展示gas费协议费 deactivate B A -> User: 流程结束 deactivate A @enduml