Skip to main content
本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
LaunchLab 提供了一套精简的指令集:六个面向用户的调用加上少数管理员原语。SDK 包装了所有这些;本页为聚合器、监控工具和需要 CPI 的程序记录了原始接口。

指令清单

“ExactIn/ExactOut” 的分割镜像了 CPMM 的 SwapBaseInput / SwapBaseOutput — 在链上它们是具有略微不同舍入的单独指令判别器。 毕业路径选择。 每个新的 InitializeInitializeV2InitializeWithToken2022 调用必须设置 migrate_type = 1CPSWAP)。任何尝试初始化新的 AMM v4 绑定池都会返回 MigrateTypeNotMatchamm_creator_fee_on 仅选择生成的 CPMM 创建者费用是应用于报价代币还是两个代币;它不选择目标程序。 MigrateToAmm 对于在此限制之前使用 migrate_type = 0 初始化的现有 PoolState 仍然可调用。该版本不会重写现有池状态或删除旧版指令。 报价端代币程序。 报价代币可以由 SPL Token 程序或 Token-2022 拥有。每个接触它的指令 — CreateConfigInitializeV2InitializeWithToken2022、所有四个交易指令、CollectFeeCollectMigrateFeeClaimCreatorFeeClaimPlatformFeeClaimPlatformFeeFromVault — 在其报价程序账户槽中获取拥有程序。账户位置没有改变;只有接受的值改变了。传递实际拥有 GlobalConfig.quote_mint 的程序,你可以从现有启动的 PoolState.token_program_flag bit1 读取它(见accounts)或从代币账户的所有者读取。 已弃用的 Initialize 是例外:其报价程序账户仍然被类型化为 SPL Token,因此报价代币为 Token-2022 的配置必须通过 InitializeV2InitializeWithToken2022 启动。 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_mintsupply = base_supply_max,全部在 base_vault 中。
  • base_mint.mint_authority = launch_authorityfreeze_authority = None
  • LaunchState 初始化为 status = Activebase_sold = 0quote_reserve_real = 0
  • quote_reserve_target 从曲线参数 + base_supply_graduation + buy_numerator 计算(大约)。
  • 对于带有 TransferFeeConfigInitializeWithToken2022transfer_fee_config_authority = launch_authority,当该字段被设置时 withdraw_withheld_authority = PlatformConfig.transfer_fee_extension_auth,否则 launch_authority。提取端在代币创建时写入,正是为了让平台可以在毕业前扫除扣留的费用。见platform-config
常见错误InvalidQuoteMintFeeRateTooHighInvalidCurveParamsMathOverflow

Buy(规范变体:BuyExactIn

用户提供固定的 quote_in;曲线计算 base_out 参数
账户 前置条件
  • launch_state.status == Active
  • now ≥ open_time
  • user_quote_ata.balance ≥ quote_in
  • quote_in > 0
效果
  1. quote_in 分割为 quote_in_after_fee 和费用部分。
  2. 牛顿求解曲线以获得给定后费用报价的 base_out
  3. require(base_out ≥ minimum_base_out) 否则回滚 ExceededSlippage
  4. 移动 quote_in 用户 → 金库。移动 base_out 金库 → 用户。
  5. 更新 base_sold += base_outquote_reserve_real += quote_in_after_fee × (lp_share / total_share)
  6. 更新费用计数器(protocol_fees_quotecreator_fees_quote)。
  7. state_data.num_buys += 1
  8. 如果更新后 quote_reserve_real ≥ quote_reserve_target,SDK 通常在同一交易中链接 Graduate ix。程序不会在 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
效果 — 对称于 Buybase_sold 减少,quote_reserve_real 减少。费用仍然累积。

报价端转账费用

当报价代币携带 TransferFeeConfig 时,金库移动的金额和支付者被扣除或记入的金额不同,滑点界限针对支付者端进行检查。在没有扩展的报价代币上,下面的每种情况都与普通旧版代币相同。 报价的两个后果:
  • 计算为代币无费用的界限被拒绝。将无费用成本作为 maximum_amount_in 传递,或将无费用收益作为 minimum_amount_out 传递,会以 ExceededSlippage 回滚。
  • real_quote 仅按到达金库的金额推进。5% 报价代币上的 BuyExactIn amount_inreal_quote 移动 amount_in × 0.95
100% 费用报价代币(10000 基点)无法反演,在精确输出路径上以 CalculateOverflow 回滚。 两个交易端代币也被限制为在其匹配槽中传递的程序,所以不匹配的 base_token_program 现在失败而不是被忽略。见algorithms/token-2022-transfer-fees了解底层费用数学。

MigrateToAmm / MigrateToCpswap

一旦曲线达到 total_quote_fund_raising,将启动毕业到可交易的池。新启动仅限 CPMM。MigrateToAmm 为存储的 migrate_type0 的现有池保留。 谁签署
  • MigrateToAmm — 绑定 GlobalConfig 上记录的 migrate_to_amm_wallet
  • MigrateToCpswap — 绑定 GlobalConfig 上记录的 migrate_to_cpswap_wallet
这些钱包通常由 Raydium 运营的毕业 crank 持有;实际上毕业在阈值被跨越后的几秒内进行,无论谁触发了最后的买入。 参数 MigrateToAmm 获取三个(主要是程序转发给 AMM v4 的 OpenBook 市场参数):
MigrateToCpswap 不获取任何。 效果(两者共同)
  1. 验证 pool_state.status == Migrate(即 quote_reserve_target 已被达到)。否则以 PoolMigrated(状态已是 Migrated)或 PoolFunding(仍在融资)回滚。
  2. 验证 pool_state.migrate_type 匹配指令(AMM 为 0,CPMM 为 1)。否则以 MigrateTypeNotMatch 回滚。
  3. 计算毕业后的储备:
    • base_amount_out = base_vault.amount − vesting_schedule.total_locked_amount
    • quote_amount_out = quote_vault.amount − quote_protocol_fee − migrate_fee − platform_fee
  4. CPI 进入目标程序(AMM v4 Initialize2CPMM InitializeWithPermission)使用这些储备来创建毕业后的池。
  5. 对于在 2026-08-17 升级后执行的 CPMM 迁移,将 platform_scale + creator_scale 合并为一个平台拥有的锁定 LP 份额,并最多向 platform_nft_wallet 铸造一个费用密钥 NFT。烧毁 burn_scale 余数。在升级之前,creator_scale 被单独锁定,其费用密钥去往代币创建者。已完成的历史迁移不被修改。对于旧版 AMM v4 毕业,LP 处置遵循该指令的现有流程。
  6. 撤销 base_mint.mint_authority(设置为 None)。
  7. 翻转 pool_state.status = Migrated,设置 vesting_schedule.start_time = block_time + cliff_period
Token-2022 转账费用权限交接 — 当基础代币是携带 TransferFeeConfig 的 Token-2022 代币 PlatformConfig.transfer_fee_extension_auth 非默认时,迁移也将该扩展的权限重新分配给平台密钥:
  • transfer_fee_config_authority 总是被重新分配。启动 authority PDA 在整个毕业前阶段持有它,所以总有东西要移动。
  • WithheldWithdraw 仅当 authority PDA 仍然持有它时才被重新分配。从 2026-08-27 起创建的启动已经在代币创建时在该权限上携带 transfer_fee_extension_auth,所以该步骤被跳过。守卫是什么防止迁移在这些代币上回滚 — PDA 无法签署它不再持有的权限。
如果 transfer_fee_extension_auth 在迁移时是 Pubkey::default(),两个权限都不移动,两个都永久留在 authority PDA。见platform-config 后置条件BuyExactInBuyExactOutSellExactInSellExactOut 从此点起将以 PoolMigrated 拒绝。生成的 AMM 池是规范的,交易就像任何其他 AMM v4 / CPMM 池一样。 常见错误PoolFundingPoolMigratedMigrateTypeNotMatchInvalidCpSwapConfigMathOverflow

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;不需要允许账户。
  • 1InitializeInitializeV2InitializeWithToken2022 必须在 remaining_accounts 中的任何地方包含匹配的 PlatformAllowConfig
平台管理员使用 CreatePlatformAllowConfigClosePlatformAllowConfig 创建或关闭 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_param1 时,InitializeV2InitializeWithToken2022 需要 remaining_accounts 中的规则 PDA — 包括当它不存在时,所以省略它无法跳过检查。缺少账户是 NotEnoughRemainingAccounts;不满足任何组的启动是 CurveParamNotMatchPlatformRule。检查在 GlobalConfig 自己的限制之前运行,只能缩小它们。模型和剧本:products/launchlab/curve-rules。两个错误都可以在客户端避免 — SDK 将此检查镜像为纯函数,见发送前检查

CollectFee

单个启动上协议累积交易费用的管理员扫除。 参数 — 无。 账户 效果 — 从 quote_vault 转账 pool_state.quote_protocol_feerecipient_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_feerecipient_token_account,将计数器清零。

ClaimPlatformFeeFromVault

按平台聚合扫除。排空平台的按报价代币费用金库,该金库从通过平台路由的每个启动累积费用。 参数 — 无。 账户 效果 — 转账 platform_fee_vault 的全部余额到 recipient_token_account。如果金库为空则回滚。

归属和平台配置指令

这些在专门页面上记录,因为每个都有自己的状态模型:

状态变化矩阵

接下来去哪里

来源: