本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
LaunchLab 提供了一套精简的指令集:六个面向用户的调用加上少数管理员原语。SDK 包装了所有这些;本页为聚合器、监控工具和需要 CPI 的程序记录了原始接口。
指令清单
“ExactIn/ExactOut” 的分割镜像了 CPMM 的
SwapBaseInput / SwapBaseOutput — 在链上它们是具有略微不同舍入的单独指令判别器。
毕业路径选择。 每个新的 Initialize、InitializeV2 和 InitializeWithToken2022 调用必须设置 migrate_type = 1(CPSWAP)。任何尝试初始化新的 AMM v4 绑定池都会返回 MigrateTypeNotMatch。amm_creator_fee_on 仅选择生成的 CPMM 创建者费用是应用于报价代币还是两个代币;它不选择目标程序。
MigrateToAmm 对于在此限制之前使用 migrate_type = 0 初始化的现有 PoolState 仍然可调用。该版本不会重写现有池状态或删除旧版指令。
报价端代币程序。 报价代币可以由 SPL Token 程序或 Token-2022 拥有。每个接触它的指令 — CreateConfig、InitializeV2、InitializeWithToken2022、所有四个交易指令、CollectFee、CollectMigrateFee、ClaimCreatorFee、ClaimPlatformFee 和 ClaimPlatformFeeFromVault — 在其报价程序账户槽中获取拥有程序。账户位置没有改变;只有接受的值改变了。传递实际拥有 GlobalConfig.quote_mint 的程序,你可以从现有启动的 PoolState.token_program_flag bit1 读取它(见accounts)或从代币账户的所有者读取。
已弃用的 Initialize 是例外:其报价程序账户仍然被类型化为 SPL Token,因此报价代币为 Token-2022 的配置必须通过 InitializeV2 或 InitializeWithToken2022 启动。
MigrateToCpswap 是另一个例外,方向相反 — 它无条件地获取两个程序而不是每个代币一个。见下面的迁移账户。
Initialize
创建新启动。
参数
前置条件
quote_mint ∈ launch_config.allowed_quote_mints。base_supply_graduation ≤ base_supply_max。- 费用参数通过
launch_config.max_*_fee_rate检查。 open_time ≥ now − slop(SDK 强制≥ now;程序容忍轻微回溯)。curve_type被识别。
base_mint有supply = base_supply_max,全部在base_vault中。base_mint.mint_authority = launch_authority,freeze_authority = None。LaunchState初始化为status = Active,base_sold = 0,quote_reserve_real = 0。quote_reserve_target从曲线参数 +base_supply_graduation+buy_numerator计算(大约)。- 对于带有
TransferFeeConfig的InitializeWithToken2022:transfer_fee_config_authority = launch_authority,当该字段被设置时withdraw_withheld_authority = PlatformConfig.transfer_fee_extension_auth,否则launch_authority。提取端在代币创建时写入,正是为了让平台可以在毕业前扫除扣留的费用。见platform-config。
InvalidQuoteMint、FeeRateTooHigh、InvalidCurveParams、MathOverflow。
Buy(规范变体:BuyExactIn)
用户提供固定的 quote_in;曲线计算 base_out。
参数
前置条件
launch_state.status == Active。now ≥ open_time。user_quote_ata.balance ≥ quote_in。quote_in > 0。
- 将
quote_in分割为quote_in_after_fee和费用部分。 - 牛顿求解曲线以获得给定后费用报价的
base_out。 require(base_out ≥ minimum_base_out)否则回滚ExceededSlippage。- 移动
quote_in用户 → 金库。移动base_out金库 → 用户。 - 更新
base_sold += base_out,quote_reserve_real += quote_in_after_fee × (lp_share / total_share)。 - 更新费用计数器(
protocol_fees_quote、creator_fees_quote)。 state_data.num_buys += 1。- 如果更新后
quote_reserve_real ≥ quote_reserve_target,SDK 通常在同一交易中链接Graduateix。程序不会在Buy内自动毕业 — 需要后续的Graduate。
BuyExactOut
用户指定精确的 base_out;程序计算 quote_in。
参数
BuyExactIn 相同的账户。使用闭式二次积分(或 curve_type 1 的 CPMM 逆)而不是牛顿迭代。
Sell / SellExactIn / SellExactOut
Buy 的镜像。用户将 base_in 返回到曲线并接收 quote_out。费用从 quote_out 中扣除,所以用户收到的少于原始集成收益。
前置条件 —
user_base_ata.balance ≥ base_in。- 卖出不能将
base_sold推低于 0(考虑到会计一致性是冗余的)。 - 启动是
Active。
Buy。base_sold 减少,quote_reserve_real 减少。费用仍然累积。
报价端转账费用
当报价代币携带TransferFeeConfig 时,金库移动的金额和支付者被扣除或记入的金额不同,滑点界限针对支付者端进行检查。在没有扩展的报价代币上,下面的每种情况都与普通旧版代币相同。
报价的两个后果:
- 计算为代币无费用的界限被拒绝。将无费用成本作为
maximum_amount_in传递,或将无费用收益作为minimum_amount_out传递,会以ExceededSlippage回滚。 real_quote仅按到达金库的金额推进。5% 报价代币上的BuyExactInamount_in将real_quote移动amount_in × 0.95。
10000 基点)无法反演,在精确输出路径上以 CalculateOverflow 回滚。
两个交易端代币也被限制为在其匹配槽中传递的程序,所以不匹配的 base_token_program 现在失败而不是被忽略。见algorithms/token-2022-transfer-fees了解底层费用数学。
MigrateToAmm / MigrateToCpswap
一旦曲线达到 total_quote_fund_raising,将启动毕业到可交易的池。新启动仅限 CPMM。MigrateToAmm 为存储的 migrate_type 为 0 的现有池保留。
谁签署
MigrateToAmm— 绑定GlobalConfig上记录的migrate_to_amm_wallet。MigrateToCpswap— 绑定GlobalConfig上记录的migrate_to_cpswap_wallet。
MigrateToAmm 获取三个(主要是程序转发给 AMM v4 的 OpenBook 市场参数):
MigrateToCpswap 不获取任何。
效果(两者共同)
- 验证
pool_state.status == Migrate(即quote_reserve_target已被达到)。否则以PoolMigrated(状态已是Migrated)或PoolFunding(仍在融资)回滚。 - 验证
pool_state.migrate_type匹配指令(AMM 为0,CPMM 为1)。否则以MigrateTypeNotMatch回滚。 - 计算毕业后的储备:
base_amount_out = base_vault.amount − vesting_schedule.total_locked_amountquote_amount_out = quote_vault.amount − quote_protocol_fee − migrate_fee − platform_fee
- CPI 进入目标程序(
AMM v4 Initialize2或CPMM InitializeWithPermission)使用这些储备来创建毕业后的池。 - 对于在 2026-08-17 升级后执行的 CPMM 迁移,将
platform_scale + creator_scale合并为一个平台拥有的锁定 LP 份额,并最多向platform_nft_wallet铸造一个费用密钥 NFT。烧毁burn_scale余数。在升级之前,creator_scale被单独锁定,其费用密钥去往代币创建者。已完成的历史迁移不被修改。对于旧版 AMM v4 毕业,LP 处置遵循该指令的现有流程。 - 撤销
base_mint.mint_authority(设置为None)。 - 翻转
pool_state.status = Migrated,设置vesting_schedule.start_time = block_time + cliff_period。
TransferFeeConfig 的 Token-2022 代币且 PlatformConfig.transfer_fee_extension_auth 非默认时,迁移也将该扩展的权限重新分配给平台密钥:
transfer_fee_config_authority总是被重新分配。启动authorityPDA 在整个毕业前阶段持有它,所以总有东西要移动。WithheldWithdraw仅当authorityPDA 仍然持有它时才被重新分配。从 2026-08-27 起创建的启动已经在代币创建时在该权限上携带transfer_fee_extension_auth,所以该步骤被跳过。守卫是什么防止迁移在这些代币上回滚 — PDA 无法签署它不再持有的权限。
transfer_fee_extension_auth 在迁移时是 Pubkey::default(),两个权限都不移动,两个都永久留在 authority PDA。见platform-config。
后置条件 — BuyExactIn、BuyExactOut、SellExactIn、SellExactOut 从此点起将以 PoolMigrated 拒绝。生成的 AMM 池是规范的,交易就像任何其他 AMM v4 / CPMM 池一样。
常见错误 — PoolFunding、PoolMigrated、MigrateTypeNotMatch、InvalidCpSwapConfig、MathOverflow。
CPMM 迁移剩余账户
构建MigrateToCpswap 的客户端必须使用这些固定的 remaining_accounts 索引:
该指令在升级路径上需要至少十个剩余账户。支持代币账户是只读 CPI 输入。即使代币没有初始化的支持记录,也要派生两个地址。仍然附加创建者锁账户或省略索引 8–9 的旧版构建器必须更新。
CPMM 迁移代币程序
MigrateToCpswap 无条件地获取两个代币程序,并自己计算出哪个程序拥有每个代币。其两个代币程序账户被相应地重命名:
它们替换了前面的
base_token_program(拥有基础代币的任何程序)和 quote_token_program(总是旧版)。位置没有改变,所以这是值改变而不是布局改变 — 但两个值几乎相反,一个保持传递其旧对的构建器一旦任一代币是 Token-2022 代币就会在需要旧版程序的地方提供 Token-2022。
即使两个代币都不使用它,旧版程序也是必需的,因为 CPMM LP 代币和锁定流动性费用密钥 NFT 总是存在于它上面。
平台 GlobalConfig 允许列表
PlatformConfig.restrict_global_config 控制检查:
0:平台接受任何其他有效的GlobalConfig;不需要允许账户。1:Initialize、InitializeV2和InitializeWithToken2022必须在remaining_accounts中的任何地方包含匹配的PlatformAllowConfig。
CreatePlatformAllowConfig 和 ClosePlatformAllowConfig 创建或关闭 PDA。其种子是 [b"platform_allow_config", platform_config, global_config]。前面的管理员管理的 PlatformGlobalAccess 指令和 PDA 已停用。
平台启动参数规则
四个指令管理一个PlatformCurveRule 账户。所有四个都由 PlatformConfig.curve_rule_manager 或平台管理员签署 — 程序通过从签署者重新派生 PlatformConfig PDA 来接受管理员,所以没有单独的账户证明它。既不是的签署者返回 InvalidCurveRuleAuthority。
platform_curve_rule 是 [b"platform_curve_rule", platform_config, global_config] 处的 PDA。
Create分配不持有任何组的账户。该状态不限制任何东西。Update使用该group_id更新插入组,如果存在则完全替换它。它调整账户大小以适应,所以签署者补充它增长的租金并收回它缩小的租金。超过第十个的新组返回CurveRuleGroupsExceeded;超过 25 个约束、未知字段或运算符,或同一组中相同的(field, op)对两次返回InvalidCurveRuleConstraint;非常数乘积配置上的四个TotalSellA派生字段返回CurveRuleFieldNotSupportedByCurve。Remove按 id 删除一个组,缩小账户并退款差额。未知 id 返回CurveRuleGroupNotExist。Close将整个租金返回给签署者。即使restrict_curve_param保持1,配置也不再受限制。
UpdatePlatformConfig::RestrictCurveParam(0 | 1),只有平台管理员可以调用。
在启动路径上。 当 restrict_curve_param 是 1 时,InitializeV2 和 InitializeWithToken2022 需要 remaining_accounts 中的规则 PDA — 包括当它不存在时,所以省略它无法跳过检查。缺少账户是 NotEnoughRemainingAccounts;不满足任何组的启动是 CurveParamNotMatchPlatformRule。检查在 GlobalConfig 自己的限制之前运行,只能缩小它们。模型和剧本:products/launchlab/curve-rules。两个错误都可以在客户端避免 — SDK 将此检查镜像为纯函数,见发送前检查。
CollectFee
单个启动上协议累积交易费用的管理员扫除。
参数 — 无。
账户
效果 — 从
quote_vault 转账 pool_state.quote_protocol_fee 到 recipient_token_account,然后将计数器清零。可在第一次买入后的任何时间调用。
CollectMigrateFee
毕业时累积的迁移费用的管理员扫除。与 CollectFee 相同的账户形状,以 migrate_fee_owner 作为签署者(而不是 protocol_fee_owner)和 pool_state.migrate_fee 作为排空的计数器。
ClaimCreatorFee
跨创建者拥有的每个启动使用相同报价代币的累积创建者费用的按创建者扫除。排空按创建者费用金库,而不是按池的。
参数 — 无。
账户
效果 — 转账
creator_fee_vault 的整个余额到 recipient_token_account。如果金库为空,以大于零检查回滚。
ClaimPlatformFee
直接排空启动报价金库的按平台扫除。当平台想要为一个特定启动声称其份额而不通过聚合平台金库时使用。
参数 — 无。
账户
效果 — 从
quote_vault 转账 pool_state.platform_fee 到 recipient_token_account,将计数器清零。
ClaimPlatformFeeFromVault
按平台聚合扫除。排空平台的按报价代币费用金库,该金库从通过平台路由的每个启动累积费用。
参数 — 无。
账户
效果 — 转账
platform_fee_vault 的全部余额到 recipient_token_account。如果金库为空则回滚。
归属和平台配置指令
这些在专门页面上记录,因为每个都有自己的状态模型:CreateVestingAccount、CreatePlatformVestingAccount、ClaimVestedTokenCreatePlatformConfig、UpdatePlatformConfig、CreatePlatformAllowConfig、ClosePlatformAllowConfigCreatePlatformCurveRule、UpdatePlatformCurveRule、RemovePlatformCurveRule、ClosePlatformCurveRuleCreateConfig、UpdateConfig
状态变化矩阵
接下来去哪里
products/launchlab/code-demos— 每个指令的 TypeScript 示例。products/launchlab/accounts— 完整状态形状。reference/error-codes— LaunchLab 错误枚举。
- Raydium SDK v2
LaunchLab模块 - Raydium LaunchLab 程序源

