Solana生态AMM调研:高流动性背后的底层代码
在Web3行业的现状中,与DeFi有关的产品占据了绝对的市场。而在这其中,AMM(AutomatedMarketMaker,自动做市商)作为关键的一环,是Web3金融方面变化的有力推动者。本文将分别介绍Solana生态中的几个重要的AMM实现,希望能够对LP(LiquidityProvider,流动性提供者)如何选择自己的投资策略提供一些帮助。CPMMCPMM(ConstantProductMarketMaker)作为最基本的AMM实现,在许多产品中有实现。这里用Raydium推出的基于恒定乘积的AMM来举例。恒定乘积即池子中两种代币的供应量具有固定乘积:X*Y=k。对于流动性提供者来说,当任何人往池子中添加流动性(添加资产)时,CPMM会自动给钱包地址创建关联账户并发放LPToken(每个代币对都有属于自己的LPTokenMint),此LPToken用于证明该钱包地址持有某个池子的份额,并且将会在流动性提供者提款时销毁相应的Token。CPMM的链上程序使用Anchor开发,程序代码在https://github.com/raydium-io/raydium-cp-swap能够找到。下面我们来简单确认下它是如何实现恒定乘积的。首先,用户在使用Raydium的CPMM交换代币时,将会触发swap相关指令。举例来说(仅为了说明情况,本文不对任何Token负责):当用户想使用USDC交换TRUMP时,可以通过TRUMP-USDC这个池子进行交换。池子TRUMPUSDC7XzVsjqTebULfkUofTDH5gDdZDmxacPmPuTfHa1n9kuh6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPNEPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v例如我们查看这个交易,简单起见,让我们忽略交易中的其他指令,只查看Raydium部分。找到RaydiumCPMM:swapBaseInput:在InputAccounts中,我们能看到输入代币为USDC,输出代币为TRUMP。在Solana生态的AMM中,LPPair可以简单的通过TokenAccount来表示,而不需要创建一个新的合约程序并部署(例如以太坊中常用的工厂合约)。在交易发生时,直接与Raydium的CPMMProgram来交互,Solana程序将通过传入的池子地址、代币地址等来修改相应的TokenAccount的状态,来进行swap操作。例如上述的swapBaseInput指令,代码在这里能够找到。经过一系列前置检查后,具体能够换到多少目标代币,通过ConstantProductCurve.swap_base_input_without_fees中进行了计算:其中用到的公式为:即TokenX和TokenY在总量各自变化后,其乘积应保持不便。公式左边为变化后的乘积,右边为变化前的乘积。上述算式通过数学转换后,能得到Δy(即我们能够换到的y代币的数量)的转换公式:也就是代码中的delta_y=(delta_x*y)/(x+delta_x)部分。注意这里的计算并不包含手续费,其已经在swap_base_input的前置逻辑中扣除过了。CLMMCLMM(ConcentratedLiquidityMarketMaker)同样是Raydium推出的AMM,它类似于UniswapV3,每个代币对同样有多个费用层级,能够分别创建一个对应层级的池子。由于CLMM的实现参考了UniswapV3,所以在学习它时,很多概念和实现方式都可以参考Uniswap的实现。它也继承了Uniswap的概念例如tick、多费率层级、集中流动性等。更多内容可以在ZAN推出的DEX开发课程中找到:DEXDevelopmentPractice-UniswapCodeAnalysis-HowUniswapworks-ZAN但是需要注意,与CPMM类似的,由于Solana链的特性,RaydiumCLMM不需要对每个池子单独部署一个合约,所以也没有工厂合约的概念。这一点不同于Uniswap。CLMM允许流动性提供者在注入资金时选定一个价格范围,资金将仅在所选范围内分布:对于集中流动性池来说,代币分别分别存在于当前价格的两侧,上图所选的价格范围包含了当前价格,所以会将资金分别分配给池子中的两种代币。我们也可以只注入某一种代币,来提供所谓的单边流动性(如下图)。这有些类似于传统金融模式中的限价单,LP的资金只有在代币价格达到某种范围时才会被利用,不过这种模式要考虑的风险点也更多。一般来说,对于价格波动小的池子,LP倾向于选择小一点的范围;反之对于那些价格波动非常剧烈的池子,则倾向于选择大一点的范围。这样的目的是为了尽量不让当前价格脱离自己所选择的价格范围,造成太多无常损失。需要注意,集中流动性虽然可以让LP的资金利用率更高,但也对LP的金融意识提出了更高的要求,LP需要更积极的管理自己的流动性。如果LP应对不力,那么链上频繁的波动将很容易导致LP遭受严重的无常损失。DLMMDLMM(DynamicLiquidityMarketMaker)是Meteora推出的AMM产品,它也属于UniswapV3的一种,和上文提到的CLMM也非常相似,DLMM也允许LP将自己的资金集中在当前价格附近的一定范围内。不过DLMM在具体实现时有些不同,并且提供了一些特色功能。DLMM中提供了Bin的概念,池子将从基础价格开始,每隔一小段Binstep作为一个Bin存在。如果交易发生在同一个Bin内,那么交易者将享受到零滑点。这可以极大增加交易量和交易成功率,理论上LP能够收获更多的交易费用。与CLMM相似的,池子中的代币同样在当前价格的两侧分布,一个代币仅需要提供单边流动性。但根据Bin的概念,当前激活的Bin(表明了当前的交换价格)则拥有两种代币。即:当前激活的Bin:其中存在两种代币,在当前Bin中交换代币将按照固定价格进行,并且0滑点;其他Bin:在当前激活的Bin两侧分布,分别仅存在单个代币。在当前激活的Bin中的代币量发生变化时,如果某一方代币减少为0,则DLMM会将当前激活的Bin,根据池子中的实际情况,设定为其左侧或右侧的下一个Bin。依此来推动池子中的价格变化。在LP提供流动性时,DLMM提供了3中策略,分别是Spot、Curve和BidAsk其中Spot最普世,基本上所有的流动性池都比较合适,算是一种最简单的流动性策略。Curve则更适合那些价格变化非常小的池子,例如稳定币对。这些池子中的价格波动非常小,就像它的形状所透露的那样,把LP的资金集中分布在此区间内,能够最大限度的吃满交易费。BidAsk则更适合那些价格波动非常大的池子。人们总是倾向于在这种池子中进行更多的套利交易,价格可能很难集中在某一小段范围内。这种策略通常需要LP频繁调整自己的仓位,来避免价格脱离自己所设定的资金范围。由于涉及到对市场的判断力,这通常并不容易。总结AMM作为Web3金融领域的重要组成部分,通过其独特的机制和创新,推动去中心化金融的普及和发展。随着技术的不断进步和生态系统的完善,AMM有望在未来发挥更大的作用,进一步改变传统金融的格局。