> ## Documentation Index
> Fetch the complete documentation index at: https://docs.raydium.io/llms.txt
> Use this file to discover all available pages before exploring further.

# 结合曲线

> 代币发行曲线的数学原理 — 二次曲线、线性曲线和虚拟储备 CPMM 变体 — 成本/收益/即期价格的推导，以及 LaunchLab 使用的毕业阈值数学。

<Info>
  **本页内容由 AI 自动翻译，所有内容以英文版本为准。**

  [查看英文版 →](/algorithms/bonding-curves)
</Info>

本页推导通用结合曲线数学。LaunchLab 的具体实现详见 [`products/launchlab/bonding-curve`](/zh/products/launchlab/bonding-curve)。推导采用连续形式；链上代码用定点算术实现离散类似物。

## 什么是结合曲线

**结合曲线**是一个确定性价格函数 `p(s)`，将代币价格与当前流通量（`s` 代表"已售供应量"）关联起来。买方通过向合约发送抵押品来购买；合约以曲线指定的边际价格发行新代币单位。卖方返还代币单位并获得累积退款。

与 CPMM 池相比的两个关键属性：

* **无需对手方**。发行合约本身是做市商；流动性由规则直接产生。
* **单调价格**。每次净买入时价格上升，每次净卖出时价格下降。

当发行方不想用抵押品预先为 AMM 池注入流动性时，结合曲线是标准的启动机制。

## 通用定价公式

对于任何连续价格函数 `p(s)`：

**即期价格**（供应量为 `s`）：

```
p(s) = the curve formula
```

**从 `s_0` 买到 `s_1` 的成本**（`s_1 > s_0`）：

```
cost(s_0, s_1) = ∫_{s_0}^{s_1} p(s) ds = P(s_1) − P(s_0)
```

其中 `P(s) = ∫ p(s) ds` 是曲线的原函数。几何上，`cost` 是 `p` 在 `s_0` 和 `s_1` 之间的曲线下面积。

**从 `s_1` 卖回到 `s_0` 的收益**：

```
proceeds(s_1, s_0) = cost(s_0, s_1)
```

（对称性：在相同区间上的买卖交换相同的抵押品 — 扣除费用。）

**该买入的平均价格**：

```
avg = cost(s_0, s_1) / (s_1 − s_0)
```

## 常见曲线族

### 线性

```
p(s) = a + b · s
```

```
P(s)            = a·s + (b/2)·s²
cost(s_0, s_1)  = a·(s_1 − s_0) + (b/2)·(s_1² − s_0²)
```

价格与供应量成比例上升。用于"稳定"启动，其中发行方希望在整个生命周期内有可预测的适度加成。

### 二次

```
p(s) = k · s²                      // 或  k · (s / S_max)² 用于规范化形式
```

```
P(s)            = (k / 3) · s³
cost(s_0, s_1)  = (k / 3) · (s_1³ − s_0³)
```

价格二次上升。早期买家获得接近零的价格（平坦启动区域）；后期买家支付更高的溢价。这是 LaunchLab 默认的曲线类型（`curve_type = 0`）。

### 虚拟储备 CPMM（Pump 风格）

该曲线是标准 CPMM，带有假想的初始报价储备 `V_q`：

```
effective_y = V_q + collateral_received
effective_x = S_max − s
(effective_x) · (effective_y) = V_q · S_max      // 不变量
```

即期价格：

```
p(s) = effective_y / effective_x
     = V_q · S_max / (S_max − s)² · ... (可通过隐函数求导推导)
```

从 `s_0` 移动到 `s_1` 的成本：

```
cost(s_0, s_1) = V_q · S_max / (S_max − s_1) − V_q · S_max / (S_max − s_0)
              = V_q · (s_1 − s_0) · S_max / ((S_max − s_0) · (S_max − s_1))
```

该变体有一个优雅的性质：在毕业时（`s = S_graduate`），边际价格等于用储备 `(S_max − S_graduate, V_q + cost(0, S_graduate))` 注入的下游 CPMM 池的开盘价格。交接无缝。LaunchLab 将其公开为 `curve_type = 1`。

## 离散实现

链上，`s` 和 `cost` 都是整数（最小面额单位）。每当存在闭式形式时（线性、二次），连续积分 `cost(s_0, s_1)` 直接从闭式计算。对于没有闭式逆函数的曲线（二次，给定 `cost` 求 `s_1`），使用牛顿迭代：

```
# 求解二次: (k/3)·s_1³ = (k/3)·s_0³ + cost
# 初始化 s_guess ≈ cbrt(3·cost/k + s_0³)
for i in 0..MAX_ITER:
    f    = (k/3)·s_guess³ − (k/3)·s_0³ − cost
    f'   = k·s_guess²
    step = f / f'
    s_guess -= step
    if |step| < precision_floor: break
```

LaunchLab 将迭代次数限制在约 10 次，如果残差仍高于容差则以 `NotConverged` 回滚。实际上这仅在域极端触发；生产交换通常在 2-3 次迭代内收敛。

## 费用集成

费用应用于曲线成本之上，而不是其中。买入时：

```
cost_curve  = cost(base_sold, base_sold + base_out)
fee         = ceil(cost_curve · buy_numerator / buy_denominator)
quote_in    = cost_curve + fee
```

卖出时：

```
proceeds_curve = cost(base_sold − base_in, base_sold)
fee            = ceil(proceeds_curve · sell_numerator / sell_denominator)
quote_out      = proceeds_curve − fee
```

费用的 LP 部分保留在 `quote_vault` 中，对后续买家来说有效地使曲线变陡 — 储备增长而不发行更多供应。协议和创建者部分在单独的计数器中跟踪，以供后续清扫。

## 毕业阈值

当曲线收到足够的抵押品以在匹配当前曲线价格的价格为外部 AMM 池提供资金时，曲线"毕业"。对于参数为 `(k, S_max, S_graduate)` 的二次曲线：

```
quote_to_graduate = cost(0, S_graduate) · (1 + buy_fee_rate)
                  = (k / 3) · S_graduate³ · (1 + f_buy)
```

一旦 `quote_vault ≥ quote_to_graduate`，`Graduate` 指令创建一个 CPMM 池，包含：

```
cpmm_base_reserve  = S_max − S_graduate        // 未售曲线供应
cpmm_quote_reserve = quote_vault − accrued_fee_counters
cpmm_initial_price = cpmm_quote_reserve / cpmm_base_reserve
```

对于虚拟储备曲线，根据构造：

```
cpmm_initial_price == p(S_graduate)           // 精确相等
```

对于二次曲线，相等是近似的；"偏差"被吸收到 `S_graduate` 的舍入中（通常为 `0.8 · S_max`）和达到阈值买入的剩余抵押品中。

## 与 CPMM 池的无常损失对比

纯结合曲线启动在 Uniswap 意义上**没有无常损失**：市场上没有"另一方"来重新平衡。曲线按需发行供应，唯一的"LP"是合约本身。

毕业后，产生的 CPMM 池表现得像任何其他 CPMM 池 — 如果 LP 未被销毁，它们会承受常见的无常损失动力学。这就是为什么**销毁** post-graduation 政策在公开启动中占主导：它保持池永久化并消除任何 LP 取款驱动的价格冲击。

## 详细示例

曲线：二次，`k = 40`，`S_max = 1e9`，`S_graduate = 0.8 · S_max = 8e8`。买入费 1%。

### `s = 5e8` 时的价格

```
p(5e8) = 40 · (5e8 / 1e9)² = 40 · 0.25 = 10
```

每基础单位 10 个报价单位。

### 首次买入 1e6 基础的成本

```
cost(0, 1e6) = (40/3) · (1e6)³
             = (40/3) · 1e18
             ≈ 1.333e19     (最小报价单位)
```

带 1% 费用：

```
quote_in = 1.333e19 · 1.01 ≈ 1.347e19
```

### 毕业阈值

```
cost(0, 8e8) = (40/3) · (8e8)³
             = (40/3) · 5.12e26
             ≈ 6.827e27
quote_to_graduate ≈ 6.827e27 · 1.01 ≈ 6.895e27
```

### 毕业时的价格

```
p(8e8) = 40 · 0.64 = 25.6
```

### 毕业后的 CPMM 储备

```
cpmm_base  = 1e9 − 8e8 = 2e8
cpmm_quote ≈ 6.827e27  (扣除费用计数器扣除)
cpmm_price ≈ 3.41e19 per base — 考虑单位后与 p(8e8) 匹配
```

（单位：小数需要仔细跟踪；该示例仅为说明用。）

## 相关链接

* [`products/launchlab/bonding-curve`](/zh/products/launchlab/bonding-curve) — 这些公式的链上 LaunchLab 实现。
* [`products/launchlab/instructions`](/zh/products/launchlab/instructions) — `Buy`、`Sell`、`Graduate` 账户级规范。
* [`algorithms/constant-product`](/zh/algorithms/constant-product) — 毕业后 CPMM 如何使用这些储备。

来源：

* Raydium LaunchLab 程序源代码（二次和虚拟储备曲线实现）。
* Bancor 白皮书（线性结合曲线，历史文献）。
* Pump.fun 公开事后分析（虚拟储备变体）。
