JAMMPair 合约

JAMMPair是JAMM DEX的核心交易对合约,实现了具体的AMM流动性池功能。每个交易对都是一个独立的JAMMPair合约实例,负责管理两种代币的储备、执行交换逻辑、处理流动性操作,并维护价格预言机数据。

合约继承结构

contract JAMMPair is JAMMERC20 {
    using UQ112x112 for uint224;
    // ...
}

JAMMPair继承自JAMMERC20,这意味着每个交易对本身就是一个ERC-20代币(LP代币)。

核心常量

uint public constant MINIMUM_LIQUIDITY = 10 ** 3;  // 1000
bytes4 private constant SELECTOR = bytes4(keccak256(bytes("transfer(address,uint256)")));
  • MINIMUM_LIQUIDITY: 永久锁定的最小流动性数量

  • SELECTOR: ERC-20 transfer函数的选择器,用于安全转账

状态变量

基本信息

address public factory;    // Factory合约地址
address public token0;     // 第一个代币地址(较小地址)
address public token1;     // 第二个代币地址(较大地址)
uint24 public fee;         // 交易费率

储备量管理

存储优化:三个变量打包在一个存储槽中:

  • uint112 + uint112 + uint32 = 256 bits

价格预言机

重入保护

初始化

构造函数

构造函数只设置factory地址,实际初始化通过initialize函数完成。

初始化函数

安全性:只有Factory合约可以调用初始化函数。

核心功能

储备量查询

这是最常用的查询函数,返回当前的储备量和最后更新时间。

储备量更新

更新逻辑

  1. 检查余额不会溢出uint112

  2. 计算时间间隔

  3. 更新累积价格(如果有时间间隔且储备量非零)

  4. 更新储备量和时间戳

  5. 发射Sync事件

流动性管理

添加流动性(Mint)

铸造流程

  1. 获取当前储备量和余额

  2. 计算新增的代币数量

  3. 处理协议费用

  4. 计算应铸造的LP代币数量

  5. 铸造LP代币给指定地址

  6. 更新储备量

  7. 更新k值(如果启用协议费用)

  8. 发射Mint事件

移除流动性(Burn)

销毁流程

  1. 获取当前状态

  2. 处理协议费用

  3. 按比例计算应返还的代币数量

  4. 销毁LP代币

  5. 转账代币给指定地址

  6. 更新储备量

  7. 发射Burn事件

代币交换

主交换函数

交换流程

  1. 验证输出数量和流动性充足性

  2. 乐观转账(先转出代币)

  3. 支持闪电贷回调

  4. 计算实际输入数量

  5. 收取交易费用

  6. 验证恒定乘积公式

  7. 更新储备量

  8. 发射Swap事件

费用收取

费用分配逻辑

  • 无推荐人: 协议收取 fee/50000 的费用

  • 有推荐人: 协议和推荐人各收取 fee/100000 的费用

协议费用铸造

协议费用计算

  • 基于k值的增长计算协议费用

  • 公式:liquidity = totalSupply * (√k - √kLast) * 8 / (√k * 17 + √kLast * 8)

安全转账

安全转账函数

费用转账函数

特点

  • 处理不规范的ERC-20代币

  • 零值转账直接返回

  • 费用转账会发射Fee事件

实用函数

Skim函数

用途:移除超出储备量的多余代币余额。

Sync函数

用途:强制同步储备量与实际余额。

事件系统

核心事件

使用示例

查询交易对信息

监听交换事件

监听费用事件

Last updated