> ## 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.

# 2026-08-31 — LaunchLab：平台曲线规则替代曲线参数白名单

> 启动参数限制从 PlatformConfig.curve_params 迁移到按配置的 PlatformCurveRule 账户，支持 (field, op, value) 约束、数值范围、OR 检查组和委托管理员钱包。PlatformConfig 保持 944 字节大小；旧字段及其两条指令被移除，新增七个错误代码。

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

  [查看英文版 →](/reference/changelog/2026-08-31-launchlab-platform-curve-rules)
</Info>

<Info>
  本条目涵盖即将推出的 LaunchLab 程序更新。在部署前已针对本地发布分支进行验证。在依赖新账户或指令之前，请确认已部署的程序。
</Info>

平台已可通过 `PlatformConfig.curve_params` 限制创建者可选择的启动形状。该机制**仅测试精确相等**：条目要么将字段固定为一个值，要么用哨兵值通配。它最多在平台支持的每个 `GlobalConfig` 中保存 10 个条目，并存储在 `PlatformConfig` 账户本身上，每个条目增加 491 字节。

这三个特性在协议添加配置时产生冲突。表达"融资目标在 50 到 200 SOL 之间"需要为每个允许的值创建一个条目，因此不可能实现。同时，`GlobalConfig` 自身的下限已被放宽——1 bps 费率、99999 供应量上限——正是为了让每个平台都符合要求，这使得平台无法进一步限制它们。

本版本用**曲线规则**替代白名单：每个 (platform, config) 对应一个 `PlatformCurveRule` 账户，最多包含 10 个检查组，每个组最多包含 25 个 `(field, op, value)` 约束，覆盖 19 个启动参数，支持 `Eq`、`Gte`、`Lte` 和 `Neq` 操作符。组内约束为 AND 关系，组间为 OR 关系。范围是同一字段上的 `Gte` 加 `Lte`。

完整模型和九个实际示例见新页面：[`products/launchlab/curve-rules`](/zh/products/launchlab/curve-rules)。

## 集成者速览

* **`PlatformConfig` 保持大小和所有现有字段偏移。** 固定 944 字节。`curve_params` 已移除；`restrict_curve_param`（`u8`）、`curve_rule_manager`（`Pubkey`）和向量长度前缀占用的 4 字节全部来自填充，填充从 107 字节缩减到 78 字节。
* **解码器必须丢弃尾部向量。** 仍期望填充后跟 `Vec<PlatformCurveParam>` 的解码器会将两个新字段读作向量字节。填充前的所有内容不受影响，因此仅读取费用钱包和费率的解码器继续正常工作。
* **启动构建器在标志启用时需要一个额外账户。** 当 `restrict_curve_param` 为 `1` 时，`InitializeV2` 和 `InitializeWithToken2022` 在 `remaining_accounts` 中需要规则 PDA——**包括账户不存在时**，以防止省略它来跳过检查。推导：`[b"platform_curve_rule", platform_config, global_config]`。
* **默认不限制任何平台。** 每个现有账户上 `restrict_curve_param` 为 `0`，`0` 表示程序根本不读取规则。
* **两条指令被移除：** `UpdatePlatformCurveParam` 和 `RemovePlatformCurveParam`。新增四条：`CreatePlatformCurveRule`、`UpdatePlatformCurveRule`、`RemovePlatformCurveRule`、`ClosePlatformCurveRule`。
* **`UpdatePlatformConfig` 新增两个变体：** 分发索引 13 处的 `RestrictCurveParam(u64)` 和索引 14 处的 `CurveRuleManager(Pubkey)`。现有索引 0–12 保持不变。
* **新增七个错误代码，** `6024`–`6030`。`6020` `CurveParamIsNotExist` 作为占位符保留，尽管其最后的调用者已消失，因此后续代码不会移位。见 [`reference/error-codes`](/zh/reference/error-codes)。
* **需要刷新 IDL。** 新账户类型、四条新指令、两条移除、两个新分发变体、七个新错误代码。
* **在发送任何内容前离线检查规则。** SDK 公开 `checkLaunchAgainstCurveRule`（镜像启动时检查，包括失败关闭行为）和 `checkCurveRuleGroupWritable`（镜像写入时验证）。两者都是纯函数。见 [发送前检查](/zh/products/launchlab/curve-rules#check-before-you-send)。
* **在主网启用前在 devnet 上排练。** 启用 `restrict_curve_param` 会立即改变创建者的可用操作。推荐序列——包括启动一个应被拒绝的代币以证明构建器确实通过规则账户检查——见 [先在 devnet 测试](/zh/products/launchlab/curve-rules#test-on-devnet-first)。

## 规则能表达而白名单不能的内容

| 意图                        | 白名单      | 曲线规则                           |
| ------------------------- | -------- | ------------------------------ |
| 一个精确启动形状                  | 一个条目     | 一个包含 `Eq` 约束的组                 |
| 范围内的融资目标                  | 无法表达     | 两个约束：`Gte` + `Lte`             |
| 三个启动层级                    | 三个条目，仅精确 | 三个组                            |
| 独立于供应量的毕业估值范围             | 无法表达     | 衍生字段 `FundRaisingRateB` 上的两个约束 |
| 到达毕业池的下限                  | 无法表达     | 衍生字段 `MigrateRateA` 上的一个约束     |
| 仅 SPL Token 或仅 Token-2022 | 无法表达     | `BaseTokenProgram` 上的一个约束      |
| "如果设置转账费，上限为 1%"          | 无法表达     | 两个组，以 `TransferFeeEnabled` 为门控 |
| 在某日期自动切换的规则               | 无法表达     | 两个组，以 `UnixTimestamp` 为门控      |

19 个字段包括四个衍生费率——`SellRateA`、`LockRate`、`MigrateRateA`、`FundRaisingRateB`——这使得规则可跨供应量移植，而不是固定到一个。

## 委托管理

`PlatformConfig.curve_rule_manager` 是一个热钱包，可创建、更新、移除和关闭该平台的规则账户。编辑规则是常规操作，平台管理员密钥通常是多签；此字段使多签保持在循环外。通过 `UpdatePlatformConfig::CurveRuleManager` 设置一次。

平台管理员保留相同的并行权力——程序通过从签名者重新推导 `PlatformConfig` PDA 来接受——因此丢失的管理员密钥可通过轮换该字段恢复。`Pubkey::default()` 表示仅管理员。

被泄露的管理员密钥可放宽或删除参数规则并收回规则账户的租金。它无法翻转 `restrict_curve_param`、触及任何费用钱包、归属字段或 CPMM 配置，或破坏 `GlobalConfig` 限制。

## 租金和大小

规则账户创建时不包含组，每次更改时调整大小，因此平台仅为实际写入的规则付费，移除组会将差额退款给签名者。

| 规则内容           | 大小       | 租金           |
| -------------- | -------- | ------------ |
| 空              | 150 字节   | \~0.0019 SOL |
| 1 个组，2 个约束     | 200 字节   | \~0.0023 SOL |
| 3 个组，各 4 个约束   | 408 字节   | \~0.0037 SOL |
| 10 个组，各 25 个约束 | 4 790 字节 | \~0.034 SOL  |

由于大小是动态的，解码器必须读取账户的实际长度而不是假设常数。

## 启动时的计算成本

启动时启用检查会在每次启动时运行。端到端测量——PDA 推导、`remaining_accounts` 扫描、反序列化、评估：

| 规则内容           | 直接字段   | 衍生字段   |
| -------------- | ------ | ------ |
| 启用，无规则账户       | 1 936  | —      |
| 1 个组，2 个约束     | 2 576  | 2 926  |
| 3 个组，各 4 个约束   | 3 624  | 5 724  |
| 10 个组，各 25 个约束 | 24 344 | 68 094 |

衍生约束成本约 223 CU，直接字段读取约 48 CU。即使是完全加载的规则也保持在默认 200 000 CU 每指令预算的三分之一以内。组按顺序评估直到一个匹配，因此最常用的层级应排在前面。

## 一次性迁移

使用白名单的平台在标志可用前通过协议在单次传递中迁移。专用权限为每个平台运行一笔交易，将每个旧条目翻译为其命名的配置的规则账户的检查组，清除 `PlatformConfig` 中的条目，并将该账户缩减回 944 字节。

翻译精确保留了旧语义：每个条目变成一个组，每个非哨兵字段变成一个 `Eq` 约束，全哨兵条目——匹配每个启动——变成无约束的组，也匹配每个启动。

迁移写入规则但未启用它们。迁移的平台保持不受限制，直到自己将 `restrict_curve_param` 设置为 `1`。迁移指令现已从程序中移除，因为传递已完成，读取它的旧字段也一样。

## 未改变的内容

* **`GlobalConfig`。** 相同布局、相同限制、相同指令。规则缩小这些限制并与它们一起检查；它们永远无法扩大一个。
* **启动指令的账户列表和参数。** `InitializeV2` 和 `InitializeWithToken2022` 采用相同的固定账户和相同的参数。仅 `remaining_accounts` 增加一个条目，且仅在标志启用时。
* **交易、毕业、费用和归属路径。** 未触及。
* **`PlatformAllowConfig`。** 未改变且无关：它决定平台的启动可使用**哪些配置**，而规则决定配置内**哪些参数**。两个标志独立。
* **错误代码 `6000`–`6023`。** 未改变，包括 `6020`。
* **`PlatformConfig` 的大小和填充前偏移。** 未改变，因此现有账户无需自己迁移。

## 更新的页面

* `products/launchlab/curve-rules` — **新页面。** 三级模型、19 字段和 4 操作符表、九个示例、曲线类型限制、两个离线检查助手、devnet 排练序列、委托管理、租金、推出顺序和计算成本。
* `products/launchlab/platform-config` — "曲线参数白名单"替换为"启动参数规则"；布局针对 `restrict_curve_param`、`curve_rule_manager` 和 78 字节填充更新；更新路径表、读取路径代码片段和陷阱重写。
* `products/launchlab/instructions` — 新增"平台启动参数规则"部分，涵盖四条指令、其账户、参数和错误；库存行替换。
* `products/launchlab/accounts` — `PlatformCurveRule` 添加到库存并获得自己的部分，包含完整布局和可变大小警告。
* `reference/error-codes` — `6024`–`6030` 已记录；`6018` 和 `6020` 已注释。
