# Primitive RMM SDK

By [cade Yu](https://paragraph.com/@cade-yu) · 2022-03-09

---

我们很高兴能将[RMM SDK](https://github.com/primitivefinance/rmm-sdk)开源，这是一个开发者工具，使其更容易在RMM协议的基础上构建。

与任何web3协议互动都会遇到障碍：解析链上数据、对智能合约状态进行建模，以及以清晰的方式显示信息。这个开发者工具包暴露了几个 "实体"，它们是智能合约的模型，以及帮助构建交易的 "管理者"（但不是执行它们！）。使用SDK可以轻松地挖掘RMM协议，为用户推导出有用的信息，并为他们安全地构建交易。

Primitive团队正在使用SDK在RMM的基础上建立一个创新的流动性产品，现在任何人都可以这样做，因为它是开放源代码。RMM协议的设计是通过其无甲骨文、依赖性最小化的架构来实现最大程度的可组合。这些是RMMs应用层的一些直接的使用案例:

*   结构化产品
    
*   金库策略
    
*   交易
    

像这样的工具将被用来增加这些独特的流动性代币对每个使用Primitive的人的采用，从流动性赌注到波动性收获金库。这个SDK仍然狭窄地集中在主要的智能合约上，同时强大到可以从中建立几个产品。

开发者
---

关于sdk的全面文档在[这里](https://github.com/primitivefinance/rmm-sdk/blob/main/docs/sdk/rmm-sdk.md)

**实体**

这些产品都需要利用原始池底层数学的某个属性，无论是计算掉期的金额，还是计算依赖于曲线参数的确定性池ID。有三个typescript类，它们被用作模型，使之易于使用

*   引擎实体
    
*   校验实体
    
*   池子实体
    

**引擎实体**

引擎实体被利用来确定地计算成对的地址，智能合约被称为 "原始引擎"。它需要原始工厂的地址和两个代币的地址来进行实例化，就是这样

**校验实体**

校准扩展了引擎，使一个池子的ID能够根据参数确定地计算出来。

*   行权价（单位：Wei）
    
*   隐含波动率（西格玛）
    
*   到期日(到期日)
    
*   伽马(100%-掉期费%)
    

这两个实体被设计成无状态的，也就是说，它们没有用链上数据实例化，只有参数、代币地址和原始工厂地址。

**池子实体**

池在扩展校准方面更进一步，但它也可以从链上数据中实例化。这个池子对池子的整个状态进行建模：它的储备、不变量和校准参数。同时，该模型暴露了有用的功能，为用户推导出信息，例如，当提供一定数量的代币时，他们获得多少流动性。

**模拟池子**

一个模拟的资金池模型可以使用fromReferencePrice来实例化。用户必须传入资产的参考价格（ReferencePrice）来推断储备金的情况。这对于确定创建资金池的参数或根据其参数而不是链上状态向新资金池分配流动性是很有用的。

**创造池子**

如果一个用户要创建一个新的资金池，他们应该被要求提供一个参考价格，然后可以用来实例化资金池的理论储备。由此，可以计算出要增加的最佳流动性数量，然后就可以构建交易。

**创建池子实体**

构建Pool实体的一个简单方法是通过外围合约来实现的。Primitive Manager智能合约有一个函数uri，它接受一个poolId作为参数。调用这个函数将返回一些编码的json数据，这些数据可以被解码，然后直接传递给Pool实体的from方法，返回一个与uri调用 "同步 "到同一区块的Pool实体。

这是实例化池子的最佳方式，因为一捆的uri调用可以在一个multicall中分批进行。

管理者
---

伴随着实体的是 "管理者"。它们提供了简单的函数来编码函数选择器和参数，以建立一个事务的calldata。

**周边管理人**

这个类是为了匹配Primitive Manager智能合约的公共函数。Primitive Manager继承了Multicall合约，使得在一个交易中捆绑几个交易给Primitive Manager成为可能。

**多重调用实例**

例如，"Zap "是一种向只有一个代币的两个或更多代币池提供流动性的方式。它是如何工作的：一些代币首先被交换到池子另一方的代币，然后所有的代币被作为流动性提供。有了multicall，就可以在没有链上功能的情况下做到这一点。

这有两个步骤:

*   给定一个以代币计价的价值量，计算可以铸造的流动性代币的数量（即提供的美元/每个流动性代币的美元价值）
    
*   给定一个LP代币的数量，计算出池子的每一面需要多少钱
    
*   计算出需要交换的金额，以获得水池的另一边
    
*   将互换交易添加到calldata数组中
    
*   将分配的流动性calldata推到同一个数组中
    
*   将calldata包裹在一个multicall中
    

**编码功能数据**

PeripheryManager上的每一个静态方法都提供了一种简单的方法，可以向链上的PrimitiveManager合约建立随时可以发送的交易有效载荷。混合和匹配这些方法来建立各种有用的功能

这里有一些想法:

*   滚动头寸（将流动性头寸从一个到期日更新到另一个到期日）
    
*   单一资产流动性准备(zaps)
    
*   在不同隐含波动率的曲线上分配流动性
    
*   [无代币的AMM](https://mirror.xyz/alexangel.eth/XUtGuUBPkh0UIHNVd1XglC79gtjJeUPwBGha64aePww)
    

**工厂管理者**

工厂合约只有一个单一的函数部署。这个管理器有一个静态方法，用两个代币地址对这个函数选择器进行编码，这将部署一个新的PrimitiveEngine合约。

**依赖**

这个SDK依赖于一个ethers.js包装器：[web3-units](https://github.com/Alexangelj/web3-units)

除此之外，它还使用了[Uniswap Token Entity from their sdk-core package](https://github.com/Uniswap/sdk-core)

Primitive池子有一个交易函数，Pool实体使用[rmm-math](https://github.com/primitivefinance/rmm-math)中的typecript实现来计算这个函数。

---

*Originally published on [cade Yu](https://paragraph.com/@cade-yu/primitive-rmm-sdk)*
