Solana 生态 AMM 调研

ZAN
个人专栏
热度: 3559

本文将分别介绍 Solana 生态中的几个重要的 AMM 实现!

在 Web3 行业的现状中,与 DeFi 有关的产品占据了绝对的市场。而在这其中,AMM(Automated Market Maker,自动做市商)作为关键的一环,是 Web3 金融方面变化的有力推动者。本文将分别介绍 Solana 生态中的几个重要的 AMM 实现,希望能够对 LP(Liquidity Provider,流动性提供者)如何选择自己的投资策略提供一些帮助。

CPMM

CPMM (Constant Product Market Maker) 作为最基本的 AMM 实现,在许多产品中有实现。这里用 Raydium 推出的基于恒定乘积的 AMM 来举例。恒定乘积即池子中两种代币的供应量具有固定乘积:X * Y = k。

对于流动性提供者来说,当任何人往池子中添加流动性(添加资产)时,CPMM 会自动给钱包地址创建关联账户并发放 LP Token(每个代币对都有属于自己的 LP Token Mint),此 LP Token 用于证明该钱包地址持有某个池子的份额,并且将会在流动性提供者提款时销毁相应的 Token。

CPMM 的链上程序使用 Anchor 开发,程序代码在 https://github.com/raydium-io/raydium-cp-swap 能够找到。下面我们来简单确认下它是如何实现恒定乘积的。

首先,用户在使用 Raydium 的 CPMM 交换代币时,将会触发 swap 相关指令。

举例来说(仅为了说明情况,本文不对任何 Token 负责):当用户想使用 USDC 交换 TRUMP 时,可以通过 TRUMP-USDC 这个池子进行交换。

池子TRUMPUSDC
7XzVsjqTebULfkUofTDH5gDdZDmxacPmPuTfHa1n9kuh6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPNEPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v

例如我们查看这个交易,简单起见,让我们忽略交易中的其他指令,只查看 Raydium 部分。找到 Raydium CPMM: swapBaseInput

Solana 生态 AMM 调研

在 Input Accounts 中,我们能看到输入代币为 USDC,输出代币为 TRUMP。在 Solana 生态的 AMM 中,LP Pair 可以简单的通过 Token Account 来表示,而不需要创建一个新的合约程序并部署(例如以太坊中常用的工厂合约)。在交易发生时,直接与 Raydium 的 CPMM Program 来交互,Solana 程序将通过传入的池子地址、代币地址等来修改相应的 Token Account 的状态,来进行 swap 操作。

例如上述的 swapBaseInput 指令,代码在这里能够找到。经过一系列前置检查后,具体能够换到多少目标代币,通过 ConstantProductCurve.swap_base_input_without_fees中进行了计算:

Solana 生态 AMM 调研

其中用到的公式为:

Solana 生态 AMM 调研

即 TokenX 和 TokenY 在总量各自变化后,其乘积应保持不便。公式左边为变化后的乘积,右边为变化前的乘积。

Solana 生态 AMM 调研

上述算式通过数学转换后,能得到 Δy(即我们能够换到的 y 代币的数量)的转换公式:

Solana 生态 AMM 调研

也就是代码中的 delta_y = (delta_x * y) / (x + delta_x)部分。注意这里的计算并不包含手续费,其已经在 swap_base_input的前置逻辑中扣除过了。

CLMM

CLMM (Concentrated Liquidity Market Maker) 同样是 Raydium 推出的 AMM,它类似于 Uniswap V3,每个代币对同样有多个费用层级,能够分别创建一个对应层级的池子。

由于 CLMM 的实现参考了 Uniswap V3,所以在学习它时,很多概念和实现方式都可以参考 Uniswap 的实现。它也继承了 Uniswap 的概念例如 tick、多费率层级、集中流动性等。更多内容可以在 ZAN 推出的 DEX 开发课程中找到:DEX Development Practice - Uniswap Code Analysis - How Uniswap works - ZAN

但是需要注意,与 CPMM 类似的,由于 Solana 链的特性,Raydium CLMM 不需要对每个池子单独部署一个合约,所以也没有工厂合约的概念。这一点不同于 Uniswap。

CLMM 允许流动性提供者在注入资金时选定一个价格范围,资金将仅在所选范围内分布:

Solana 生态 AMM 调研

对于集中流动性池来说,代币分别分别存在于当前价格的两侧,上图所选的价格范围包含了当前价格,所以会将资金分别分配给池子中的两种代币。

我们也可以只注入某一种代币,来提供所谓的单边流动性(如下图)。这有些类似于传统金融模式中的限价单,LP 的资金只有在代币价格达到某种范围时才会被利用,不过这种模式要考虑的风险点也更多。

Solana 生态 AMM 调研

一般来说,对于价格波动小的池子,LP 倾向于选择小一点的范围;反之对于那些价格波动非常剧烈的池子,则倾向于选择大一点的范围。这样的目的是为了尽量不让当前价格脱离自己所选择的价格范围,造成太多无常损失。

需要注意,集中流动性虽然可以让 LP 的资金利用率更高,但也对 LP 的金融意识提出了更高的要求,LP 需要更积极的管理自己的流动性。如果 LP 应对不力,那么链上频繁的波动将很容易导致 LP 遭受严重的无常损失。

DLMM

DLMM (Dynamic Liquidity Market Maker) 是 Meteora 推出的 AMM 产品,它也属于 Uniswap V3 的一种,和上文提到的 CLMM 也非常相似,DLMM 也允许 LP 将自己的资金集中在当前价格附近的一定范围内。不过 DLMM 在具体实现时有些不同,并且提供了一些特色功能。

DLMM 中提供了 Bin 的概念,池子将从基础价格开始,每隔一小段 Bin step 作为一个 Bin 存在。如果交易发生在同一个 Bin 内,那么交易者将享受到零滑点。这可以极大增加交易量和交易成功率,理论上 LP 能够收获更多的交易费用。

Solana 生态 AMM 调研

与 CLMM 相似的,池子中的代币同样在当前价格的两侧分布,一个代币仅需要提供单边流动性。但根据 Bin 的概念,当前激活的 Bin(表明了当前的交换价格)则拥有两种代币。即:

  • 当前激活的 Bin:其中存在两种代币,在当前 Bin 中交换代币将按照固定价格进行,并且 0 滑点;
  • 其他 Bin:在当前激活的 Bin 两侧分布,分别仅存在单个代币。

在当前激活的 Bin 中的代币量发生变化时,如果某一方代币减少为 0,则 DLMM 会将当前激活的 Bin,根据池子中的实际情况,设定为其左侧或右侧的下一个 Bin。依此来推动池子中的价格变化。

在 LP 提供流动性时,DLMM 提供了3 中策略,分别是 Spot、Curve 和 Bid Ask

Solana 生态 AMM 调研

  • 其中 Spot 最普世,基本上所有的流动性池都比较合适,算是一种最简单的流动性策略。
  • Curve 则更适合那些价格变化非常小的池子,例如稳定币对。这些池子中的价格波动非常小,就像它的形状所透露的那样,把 LP 的资金集中分布在此区间内,能够最大限度的吃满交易费。
  • Bid Ask 则更适合那些价格波动非常大的池子。人们总是倾向于在这种池子中进行更多的套利交易,价格可能很难集中在某一小段范围内。这种策略通常需要 LP 频繁调整自己的仓位,来避免价格脱离自己所设定的资金范围。由于涉及到对市场的判断力,这通常并不容易。

总结

AMM 作为 Web3 金融领域的重要组成部分,通过其独特的机制和创新,推动去中心化金融的普及和发展。随着技术的不断进步和生态系统的完善,AMM 有望在未来发挥更大的作用,进一步改变传统金融的格局。

声明:本文为入驻“火星财经 专栏”作者作品,不代表火星财经官方立场。
转载请联系网页底部:内容合作栏目,邮件进行授权。授权后转载时请注明出处、作者和本文链接。未经许可擅自转载本站文章,将追究相关法律责任,侵权必究。
提示:投资有风险,入市须谨慎,本资讯不作为投资理财建议。
本内容旨在传递行业动态,不构成投资建议或承诺。