JAMMLibrary 库

JAMMLibrary是JAMM DEX的核心计算库,提供了AMM系统所需的各种数学计算和工具函数。它包含代币地址排序、交易对地址计算、储备量查询、价格计算等关键功能,是整个协议的数学基础。

库函数分类

JAMMLibrary主要包含以下几类函数:

  • 地址处理函数

  • 储备量查询函数

  • 价格计算函数

  • 多跳路径计算函数

地址处理函数

代币地址排序

function sortTokens(
    address tokenA,
    address tokenB
) internal pure returns (address token0, address token1) {
    require(tokenA != tokenB, "JAMMLibrary: IDENTICAL_ADDRESSES");
    (token0, token1) = tokenA < tokenB
        ? (tokenA, tokenB)
        : (tokenB, tokenA);
    require(token0 != address(0), "JAMMLibrary: ZERO_ADDRESS");
}

功能说明

  • 确保两个代币地址不相同

  • 按地址大小排序,较小地址为token0

  • 验证token0不为零地址

  • 返回排序后的地址对

用途

  • 确保交易对的唯一性

  • 统一代币在交易对中的顺序

  • 为CREATE2地址计算提供一致的输入

交易对地址计算

CREATE2地址计算

  • 0xff: CREATE2操作码前缀

  • factory: Factory合约地址

  • salt: 由token0、token1和fee组成的哈希值

  • INIT_CODE_PAIR_HASH: JAMMPair合约的初始化代码哈希(实际值在部署时确定)

特点

  • 确定性地址生成

  • 无需调用Factory合约即可计算地址

  • 支持离线地址预计算

储备量查询函数

获取储备量

功能流程

  1. 对代币地址进行排序

  2. 计算交易对地址

  3. 调用交易对合约获取储备量

  4. 根据代币顺序返回对应的储备量

返回值

  • reserveA: tokenA的储备量

  • reserveB: tokenB的储备量

价格计算函数

等比例计算

计算公式

用途

  • 添加流动性时计算最优比例

  • 价格查询和显示

  • 流动性移除时的比例计算

输出数量计算

计算公式

费用处理

  • 从输入数量中扣除交易费用

  • 费用以基点表示(10000 = 100%)

  • 扣除费用后的数量参与AMM计算

输入数量计算

计算公式

精度处理

  • 结果加1确保有足够的输入数量

  • 避免因精度损失导致的交换失败

多跳路径计算

多跳输出计算

计算流程

  1. 验证路径长度至少为2

  2. 初始化数量数组,第一个元素为输入数量

  3. 遍历路径中的每一跳

  4. 获取当前跳的储备量

  5. 计算当前跳的输出数量

  6. 输出数量作为下一跳的输入数量

多跳输入计算

计算流程

  1. 验证路径长度

  2. 初始化数量数组,最后一个元素为期望输出数量

  3. 从后向前遍历路径

  4. 获取当前跳的储备量

  5. 计算当前跳需要的输入数量

  6. 继续向前计算直到第一跳

使用示例

基本价格查询

多跳路径计算

地址计算

数学原理

AMM定价公式

JAMM DEX使用恒定乘积公式:

在考虑费用的情况下:

其中:

  • x, y: 交换前的储备量

  • Δx: 输入数量

  • Δy: 输出数量

  • fee: 交易费率

价格影响

价格影响可以通过以下公式计算:

其中:

  • 实际价格 = Δy / Δx

  • 理论价格 = y / x

滑点计算

滑点是预期价格与实际执行价格的差异:

Last updated