本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
曲线规则是平台对”我愿意托管哪些启动”的回答。
GlobalConfig 设置协议下限——至少 10M 供应量、至少 20% 的供应量在曲线上销售等——这些下限故意设得很宽,以便每种平台都能符合。曲线规则是你的平台将其缩小到你的产品实际支持的形状的地方。规则存储在自己的 PlatformCurveRule 账户中,每个(平台、GlobalConfig)对应一个。它们只能缩小配置已允许的内容;规则永远无法扩大协议限制。心智模型
从外到内三个层级:- 一个组内的约束是 AND 的。 所有约束都必须满足。
- 一个规则内的组是 OR 的。 启动一旦满足任何单个组就被允许。
规则仅在
PlatformConfig.restrict_curve_param 为 1 时生效。在 0 时,程序根本不读取规则,这也是你用来推出规则和回滚规则的开关。
约束
约束是一个(field, op, value) 三元组。仅此而已——没有表达式,没有嵌套。
Gte 作为下限,一个 Lte 作为上限。同一个 (field, op) 对在一个组内不能出现两次,这防止你写出两个矛盾的最小值。
字段
字段 id 是永久的。新字段只会被追加,所以一旦规则账户持有某个 id,它的含义就永远不会改变。
派生字段是使规则可移植的字段。将
Supply 和 TotalFundRaisingB 固定到精确数字会固定一个启动形状;约束 FundRaisingRateB 会固定它们之间的关系,让创建者选择任何保持该关系的供应量。
九个实战方案
下面的每个方案都是一个规则。约束写作(field, op, value)。
1. 一个标准分级
最简单的规则,也是已弃用的曲线参数白名单提供的精确行为:一个形状,固定。
任何偏离这三个中任何一个的启动都会被拒绝,错误为
CurveParamNotMatchPlatformRule。
2. 区间而非数字
区间存在的原因:创建者选择你满意的筹资目标,而无需你列举每个值。
一个组,四个约束,创建者有 50–200 SOL 的走廊。在旧白名单下,这需要每个允许值一个条目,十个条目的上限使其不可能。
3. 并排的分级
组是 OR 的,所以每个分级是一个组。
顺序对计算有影响,对语义无影响:评估在第一个匹配的组处停止,所以把最常用的分级放在前面。
4. 毕业估值区间
FundRaisingRateB 是 TotalFundRaisingB / Supply 的百万分之一。约束它会限制代币毕业的丰富程度,无论创建者选择的供应量如何。
使用 1e12 供应量和 9 位小数的报价 mint,
85e9 / 1e12 × 1e6 = 85_000 位于该区间内。加倍供应量的创建者必须大致加倍目标以保持在其中——这就是重点。两个约束替代了原本需要的 (supply, target) 对表。
5. 迁移下限
MigrateRateA 是实际进入 CPMM 池的供应量份额:Supply − TotalSellA − TotalLockedAmount,除以供应量。它是毕业池的深度,也是规则出现前唯一没有平台端等价物的协议旋钮。
至少 15% 的供应量进入池。创建者不能在曲线上销售 95% 并留下浅薄的账簿。
如果参数不相加——锁定金额大于曲线销售后剩余的——派生值无法计算,约束失败关闭,所以启动被拒绝而不是默默允许。
6. 你实际执行的归属
GlobalConfig.max_lock_rate 从上方限制归属。规则可以在其下放置下限,并要求真正的悬崖。
5% 到 20% 的供应量归属,至少 30 天的悬崖。对于其宣传是”无即时解锁启动”的平台很有用。
7. 代币类型门控
BaseTokenProgram 和 TransferFeeEnabled 是独立的,这很重要:没有 TransferFeeConfig 的 Token-2022 mint 报告 TransferFeeEnabled = 0,就像 SPL Token mint 一样。
8. 条件转账费上限
没有”if”操作符,也不需要——两个组表达条件。
零速率
TransferFeeConfig 不会通过第 0 组:扩展存在,所以 TransferFeeEnabled 是 1,只有第 1 组可以接受它。
9. 时间限制的促销,提前安排
UnixTimestamp 是启动的区块时间,所以一个组可以携带自己的有效期窗口。你今天写两个组,切换在自己发生。
边界处不需要交易。成本是两个组槽而不是一个。
曲线类型限制
四个字段读取TotalSellA:TotalSellA、SellRateA、MigrateAmountA 和 MigrateRateA。在常数乘积配置上,创建者提供该数字。在固定价格或线性价格配置上,曲线派生它,程序比较的值是 0,这会拒绝每个启动。
与其让你写一个默默阻止自己配置的规则,程序在非常数乘积配置上的写入时拒绝这四个字段,错误为 CurveRuleFieldNotSupportedByCurve。目前只存在常数乘积配置,所以实际上你不会遇到此错误。
发送前检查
链上检查的两个方向都可以离线获得,所以创建者和平台都不必通过观看交易回滚来学习规则。版本横幅。
- SDK:
@raydium-io/raydium-sdk-v2@0.2.42-alpha是本网站上所有其他代码演示固定的版本。下面的两个助手随着 SDK 发布曲线规则支持而到达;在那之前,从程序的platform_curve_rule.rs移植它们或调用程序并读取错误代码。 - 集群:先在 Solana
devnet上测试——见先在 devnet 上测试。 - 程序 ID:见
reference/program-addresses
启动前:这些参数会通过吗?
checkLaunchAgainstCurveRule 精确镜像程序的启动时检查,包括其失败关闭行为。在你的启动表单中运行它,你可以用原因禁用提交按钮,而不是让创建者为回滚的交易付费。
- 缺失的规则账户和没有组的规则都通过。 没有约束的组也是。为不存在的账户传递
rule: undefined;不要将其视为拒绝。 - 不可计算的值失败关闭。 零供应量没有速率,锁定金额大于曲线销售后剩余的没有迁移金额。
actual返回undefined,约束计为不满足,完全如链上。 - 报告所有失败的约束,不仅仅是第一个。 程序短路因为它只需要一个判决;助手收集一切,所以你的表单可以一次列出每个问题。
UnixTimestamp,将通过视为临时。
写规则前:这个组有效吗?
checkCurveRuleGroupWritable 镜像 UpdatePlatformCurveRule 的写入时验证——约束 id、重复 (field, op) 规则、两个计数限制和曲线类型限制。在签名前在你的平台管理工具中运行它。
通过此检查意味着交易不会因格式错误而被拒绝。它对规则是否是你的意思一无所知——一个组可以完全有效,仍然拒绝你的 UI 可以产生的每个启动。这就是上面的启动端检查的用途:写入一个组后,通过
checkLaunchAgainstCurveRule 运行你的产品提供的每个形状,并确认每个都仍然找到一个组。先在 devnet 上测试
在主网上启用restrict_curve_param 会立即改变你的创建者可以做的事,对每个启动。在触及主网之前,在 devnet 上排练整个序列:
- 在 devnet 上创建平台配置和规则,并写入你打算发布的相同组。
- 通过
checkLaunchAgainstCurveRule运行你的 UI 可以产生的每个启动形状,并确认判决是你期望的——应该通过的形状和应该被拒绝的形状。 - 启用
restrict_curve_param,然后实际启动一个应该通过的代币和一个应该被拒绝的。第二个应该失败,错误为CurveParamNotMatchPlatformRule(6025),而不是NotEnoughRemainingAccounts(6018)——后者意味着你的构建器没有追加规则 PDA,检查没有真正被执行。 - 仅在主网上重复,顺序相同。
cluster: "devnet",并从reference/program-addresses获取 devnet 程序 ID。
第 3 步是值得坚持的。离线助手和链上程序是相同规则的两个实现,devnet 启动是证明它们对你的规则一致的——包括你的启动构建器是否完全传递账户。
操作规则
委托管理器
编辑规则是日常工作;平台管理员密钥通常是多签。PlatformConfig.curve_rule_manager 正是为此而存在:通过 UpdatePlatformConfig::CurveRuleManager 设置一次,该热钱包就可以自己创建、更新、删除和关闭规则账户。平台管理员保留相同的权力并行,所以丢失的管理器密钥是可恢复的——用另一个管理员调用轮换它。
受损管理器密钥的范围:它可以放松或删除你的参数规则,可以回收规则账户的租金。它不能接触费用钱包、归属、CPMM 配置、不能翻转 restrict_curve_param,也不能破坏 GlobalConfig 限制。将其视为配置密钥,而不是金库密钥。
租金跟随内容
规则账户创建时不持有组,每次更改时调整大小,所以你为实际写入的规则付费。删除组会将差额退款给签名者。推出顺序
- 在 devnet 上排练整个序列——见先在 devnet 上测试。
- 创建规则账户并写入其组。还没有任何改变——
restrict_curve_param仍为0时程序不读取它们。 - 用
checkLaunchAgainstCurveRule离线检查规则:对于你的 UI 可以产生的每个启动形状,确认某个组接受它。 - 将
restrict_curve_param设置为1。从那一刻起,你的创建者的启动被检查。 - 要回滚,再次将其设置为
0。规则账户保持完整。
启动时成本
检查在启用时对每个启动运行,所以其计算成本是每个启动的税。端到端测量——PDA 派生、remaining_accounts 扫描、反序列化和评估:
“便宜”是直接字段读取,如
Supply;“派生”是计算的,如 MigrateRateA,每个约束成本约 223 CU,而直接读取约 48。即使是完全加载的派生约束规则也保持在默认 200 000 CU 每指令预算的三分之一以内,现实的三组规则在 6 000 以下。组被评估直到一个匹配,所以将你的常见分级放在前面是免费节省。
接下来去哪里
products/launchlab/platform-config— 门控和委托规则的PlatformConfig字段。products/launchlab/global-config— 规则缩小的协议下限。products/launchlab/instructions— 四个规则指令及其账户。products/launchlab/accounts— 账户清单中的PlatformCurveRule。sdk-api/typescript-sdk— 两个检查助手所在的 SDK 表面。reference/changelog/2026-08-31-launchlab-platform-curve-rules— 替代曲线参数白名单的内容,以及解码器必须改变的内容。
raydium-launch/programs/launchpad/src/states/platform_curve_rule.rs—PlatformCurveRule、CurveRuleGroup、ParamConstraint、字段和操作 id 空间,以及CurveRuleContext::value_of。raydium-launch/programs/launchpad/src/utils/platform_curve_rule.rs— 启动时检查。raydium-launch/programs/launchpad/src/instructions/platform/—create、update、remove和close_platform_curve_rule。

