Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
LaunchLab предоставляет компактный набор инструкций: шесть пользовательских вызовов плюс несколько примитивов администратора. SDK оборачивает все из них; эта страница документирует сырую поверхность для агрегаторов, инструментов мониторинга и программ, которым нужен CPI.Обновление программы 2026-09 перестроило LaunchLab на Anchor 1.0.2 / Solana 3.1.10 и очистило три переходных механизма: устаревший
Initialize теперь всегда падает, MigrateToAmm потерял свои три аргумента и каждый аккаунт OpenBook, а шлюз get_upgrade_timestamp, который делал несколько проверок условными на основе часов, исчез. Он также добавляет одну инструкцию администратора, CollectExcessLamports. См. запись журнала изменений от 2026-09-09.Инвентарь инструкций
Разделение “ExactIn/ExactOut” отражает
SwapBaseInput / SwapBaseOutput CPMM — на цепи это отдельные дискриминаторы инструкций с немного другим округлением.
Выбор пути выпуска. Каждый новый вызов InitializeV2 и InitializeWithToken2022 должен установить migrate_type = 1 (CPSWAP). Любая попытка инициализировать новый пул, привязанный к AMM v4, возвращает MigrateTypeNotMatch. amm_creator_fee_on только выбирает, применяется ли результирующая комиссия создателя CPMM к токену котировки или обоим токенам; он не выбирает целевую программу. Устаревший Initialize вообще не может создать запуск (см. ниже).
MigrateToAmm остается вызываемым для существующего PoolState, который был инициализирован с migrate_type = 0 до этого ограничения. Выпуск не переписывает существующее состояние пула и не удаляет устаревшую инструкцию.
Программа токена на стороне котировки. Минт котировки может принадлежать либо программе SPL Token, либо Token-2022. Каждая инструкция, которая его касается — CreateConfig, InitializeV2, InitializeWithToken2022, все четыре инструкции торговли, CollectFee, CollectMigrateFee, ClaimCreatorFee, ClaimPlatformFee и ClaimPlatformFeeFromVault — принимает владеющую программу в слот своего аккаунта quote-program. Позиции аккаунтов не изменились; изменилось только принимаемое значение. Передайте программу, которая фактически владеет GlobalConfig.quote_mint, которую вы можете прочитать из бита1 PoolState.token_program_flag для существующего запуска (см. accounts) или из владельца аккаунта минта в противном случае.
Устаревший Initialize здесь неуместен: его аккаунт quote-program по-прежнему типизирован как SPL Token, и с обновлением 2026-09 инструкция падает перед чтением любого аккаунта. Запустите через InitializeV2 или InitializeWithToken2022.
MigrateToCpswap — другое исключение, в противоположном направлении — он принимает обе программы безусловно, а не одну на минт. См. аккаунты миграции ниже.
Initialize
Создайте новый запуск. InitializeV2 добавляет к устаревшей Initialize только аргумент amm_fee_on; количество и порядок аккаунтов идентичны, а единственное различие на уровне аккаунтов в том, что quote_token_program типизирован как Interface<TokenInterface>, поэтому принимается котировочный минт Token-2022.
Аргументы
Четыре позиционных аргумента, а не одна структура. (InitializeWithToken2022 добавляет пятый, transfer_fee_extension_param: Option<TransferFeeExtensionParams>; у устаревшей Initialize нет amm_fee_on.)
global_config.curve_type, иначе инструкция откатывается с InputNotMatchCurveConfig (6003). Нет ни open_time, ни аргумента quote_mint (он берётся из global_config), ни структуры fees, ни post_graduation_lp_policy — распоряжение LP задаётся на PlatformConfig, а не для каждого запуска.
Аккаунты — всего 18 (16 объявленных плюс два добавления от #[event_cpi])
Предусловия
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 = curve_param.supply, все вbase_vault.- Полномочие минта отзывается в этой же инструкции (
set_authority(MintTokens, None)) сразу после отчеканки предложения — а не при выпуске. Поэтому базовый минт навсегда имеет фиксированное предложение, и никакая последующая инструкция не может отчеканить больше. PoolStateинициализирован сstatus = Fund(0),real_a = 0,real_b = 0.total_fund_raising_bберётся напрямую изcurve_param.total_quote_fund_raising.- Для
InitializeWithToken2022с прикрепленнымTransferFeeConfig:transfer_fee_config_authority = launch_authority, иwithdraw_withheld_authority = PlatformConfig.transfer_fee_extension_authкогда это поле установлено, иначеlaunch_authority. Сторона вывода записывается при создании минта именно для того, чтобы платформа могла собрать удержанные комиссии перед выпуском. См.platform-config.
NotApproved (6000, безусловно, для устаревшей Initialize), InvalidInput (6002, нарушен минимум предложения, ставки или сбора средств из GlobalConfig), InputNotMatchCurveConfig (6003, вариант curve_param не совпадает с global_config.curve_type), MigrateTypeNotMatch (6007, migrate_type != 1), MathOverflow (6008), VestingRatioTooHigh (6010), NoSupportExtension (6017), NotEnoughRemainingAccounts (6018), InvalidPlatformAllowConfig (6022), CurveParamNotMatchPlatformRule (6025). Неудачная проверка Anchor address = / constraint = проявляется как код 2xxx, а не как один из этих — ни InvalidQuoteMint, ни FeeRateTooHigh, ни InvalidCurveParams в перечислении ошибок программы не существует.
Buy (канонический вариант: BuyExactIn)
Пользователь задаёт фиксированную входную сумму; кривая вычисляет выходную.
Аргументы
Оставшиеся аккаунты — обвязка комиссий, читается ровно в этом порядке:
share_fee_receiver— только когдаshare_fee_rate > 0.system_program— всегда; проверяется== System::id(), иначеInvalidInput.platform_fee_vault— PDA[platform_config, quote_token_mint]; создаётся при первом использовании.creator_fee_vault— PDA[creator, quote_token_mint]; создаётся при первом использовании.
NotEnoughRemainingAccounts (6018). Слота associated_token_program
нет, а system_program — это оставшийся аккаунт, а не объявленный.
Предусловия
launch_state.status == Active.now ≥ open_time.user_quote_ata.balance ≥ quote_in.quote_in > 0.
- Разделите
quote_inнаquote_in_after_feeи части комиссии. - Newton-решите кривую для
base_outс учетом post-fee котировки. 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 обычно цепляет инструкциюGraduateв той же транзакции. Программа не автоматически выпускает внутриBuy— требуется последующийGraduate.
BuyExactOut
Пользователь указывает точный base_out; программа вычисляет quote_in.
Аргументы
BuyExactIn. Использует замкнутую форму квадратичного интеграла (или обратный CPMM для curve_type 1) вместо итерации Newton.
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продвигается только на то, что достигло хранилища.BuyExactInизamount_inна 5% минте котировки перемещаетreal_quoteнаamount_in × 0.95.
10000 базовых пунктов) не может быть инвертирован и откатывает с CalculateOverflow на путях exact-out.
Оба минта на стороне торговли также ограничены программой, переданной в их соответствующий слот, поэтому несоответствие base_token_program теперь падает вместо игнорирования. См. algorithms/token-2022-transfer-fees для базовой математики комиссий.
Оставшиеся аккаунты торговли
Все четыре инструкции торговли принимают свою сантехнику комиссий черезremaining_accounts в этом порядке:
Изменено в 2026-09: последние три теперь безусловны, и
system_program проверяется. До этого выпуска программа читала их только когда unix_timestamp >= get_upgrade_timestamp() и полностью пропускала разделение комиссий платформы/создателя до этого момента. Временная метка давно прошла, поэтому поведение на mainnet практически не изменилось — но ветвь удалена из кода, и построитель, который все еще опускает три аккаунта, теперь всегда падает с NotEnoughRemainingAccounts (6018) вместо только после переключения. Слот system_program дополнительно проверяется против System::id() и возвращает InvalidInput (6002) если он содержит что-то еще, где ранее любой аккаунт был принят в этой позиции.MigrateToAmm / MigrateToCpswap
Выпустите запуск в торгуемый пул после того, как кривая достигла total_quote_fund_raising. Новые запуски только CPMM. MigrateToAmm сохранен для существующих пулов, чей сохраненный migrate_type равен 0.
Кто подписывает
MigrateToAmm—migrate_to_amm_wallet, записанный на привязкеGlobalConfig.MigrateToCpswap—migrate_to_cpswap_wallet, записанный на привязкеGlobalConfig.
- Проверьте
pool_state.status == Migrate(т.е.quote_reserve_targetбыл достигнут). Иначе откатите сPoolMigrated(статус уже былMigrated) илиPoolFunding(все еще в финансировании). - Проверьте
pool_state.migrate_typeсоответствует инструкции (0для AMM,1для CPMM). Иначе откатите с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) с этими резервами для создания пула после выпуска. - Для миграций CPMM, выполненных после обновления 2026-08-17, объедините
platform_scale + creator_scaleв одну заблокированную долю LP, принадлежащую платформе, и отчеканьте максимум один Fee Key NFT вplatform_nft_wallet. Сожгите остатокburn_scale. До обновленияcreator_scaleбыл заблокирован отдельно и его Fee Key перешел создателю токена. Завершенные исторические миграции не изменяются. Для устаревшего выпуска AMM v4 расположение LP следует существующему потоку этой инструкции. - (Нет шага mint-authority.
base_mint.mint_authorityуже был установлен наNoneпри создании запуска — см. примечание ниже.) - Переверните
pool_state.status = Migrated, установитеvesting_schedule.start_time = block_time + cliff_period.
TransferFeeConfig и PlatformConfig.transfer_fee_extension_auth не по умолчанию, миграция также переназначает права этого расширения ключу платформы:
transfer_fee_config_authorityвсегда переназначается. PDA запускаauthorityдержит его на всю фазу до выпуска, поэтому всегда есть что переместить.WithheldWithdrawпереназначается только когда PDAauthorityвсе еще его держит. Запуски, созданные с 2026-08-27 и позже, уже несутtransfer_fee_extension_authна этом органе от создания минта, поэтому шаг пропускается. Охрана — это то, что предотвращает откат миграции на этих минтах — PDA не может отказаться от права, которое оно больше не держит.
transfer_fee_extension_auth равен Pubkey::default() во время миграции, ни один орган не движется и оба остаются с PDA authority навсегда. См. platform-config.
Предложение базового минта фиксируется с момента создания, а не с момента выпуска.
InitializeV2 и InitializeWithToken2022 чеканят всю предложение в базовое хранилище и затем немедленно отзывают MintTokens в той же инструкции, поэтому base_mint.mint_authority равен None на всю жизнь запуска. Миграция его не касается. (Более ранние версии этой страницы размещали отзыв при выпуске; это было неправильно.) Единственные права, которые миграция может переместить, — это описанные ниже права Token-2022 transfer-fee.BuyExactIn, BuyExactOut, SellExactIn, SellExactOut будут отклонять с этого момента с PoolMigrated. Результирующий пул AMM канонический и торгует как любой другой пул AMM v4 / CPMM.
Распространенные ошибки — PoolFunding, PoolMigrated, MigrateTypeNotMatch, InvalidCpSwapConfig, MathOverflow.
Оставшиеся аккаунты миграции CPMM
Клиенты, строящиеMigrateToCpswap, должны использовать эти фиксированные индексы remaining_accounts:
Инструкция требует минимум десять оставшихся аккаунтов. Аккаунты поддержки-минта — это входы CPI только для чтения. Получите оба адреса даже когда минт не имеет инициализированной записи поддержки. Старые построители, которые все еще добавляют аккаунты блокировки создателя или опускают индексы 8–9, должны быть обновлены.
Изменено в 2026-09. Две очистки, ни одна из которых не изменяет правильного построителя:
- Путь разрешенного CPMM теперь единственный путь.
MigrateToCpswapраньше выбирал междуInitializeCpSwapиInitializeCpSwapWithPermissionна основеunix_timestamp >= get_upgrade_timestamp(). Помощник временных меток и устаревший CPI оба исчезли, поэтому путь разрешения — и, следовательно, минимум десять аккаунтов — применяется безусловно. - Три ограничения адреса переместились из структуры аккаунта в тело инструкции.
platform_config,base_vaultиquote_vaultпо-прежнему требуются для соответствия значениям, сохраненным наPoolState, но несоответствие теперь поднимаетсяrequire_keys_eq!вместо ограничения Anchoraddress =. Проверка эквивалентна; только поверхность ошибок отличается — вы получаете общийRequireKeysEqViolated(2502) Anchor вместоConstraintAddress(2012), и он сообщается без имени аккаунта. Обновите любую обработку ошибок, которая совпадала с2012для этих трех аккаунтов.
Программы токенов миграции CPMM
MigrateToCpswap принимает обе программы токенов безусловно и сам определяет, какая программа владеет каждым минтом. Его два аккаунта программы токенов были переименованы соответственно:
Они заменяют бывший
base_token_program (какая бы программа ни владела базовым минтом) и quote_token_program (всегда устаревший). Позиции не изменились, поэтому это изменение значения, а не изменение макета — но два значения близки к инвертированным, и построитель, который продолжает передавать свою старую пару, будет поставлять Token-2022 где требуется программа устаревшего, как только любой минт будет минтом Token-2022.
Программа устаревшего требуется даже когда ни один минт ее не использует, потому что минт LP CPMM и заблокированный Fee Key NFT ликвидности всегда живут на нем.
Список разрешений GlobalConfig платформы
PlatformConfig.restrict_global_config контролирует проверку:
0: платформа принимает любой иначе действительныйGlobalConfig; аккаунт разрешения не требуется.1:Initialize,InitializeV2иInitializeWithToken2022должны включать соответствующийPlatformAllowConfigгде-нибудь вremaining_accounts.
CreatePlatformAllowConfig и ClosePlatformAllowConfig. Его семена — [b"platform_allow_config", platform_config, global_config]. Бывшие управляемые администратором инструкции PlatformGlobalAccess и PDA вышли на пенсию.
Правила параметров запуска платформы
Четыре инструкции управляют одним аккаунтомPlatformCurveRule. Все четыре подписаны PlatformConfig.curve_rule_manager или администратором платформы — программа принимает администратора путем повторного получения PDA PlatformConfig от подписывающего, поэтому отдельный аккаунт это не доказывает. Подписывающий, который ни то ни другое, возвращает InvalidCurveRuleAuthority.
platform_curve_rule — это PDA в [b"platform_curve_rule", platform_config, global_config].
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 требуют PDA правила в remaining_accounts — включая когда он не существует, чтобы его опущение не могло пропустить проверку. Отсутствующий аккаунт — это NotEnoughRemainingAccounts; запуск, который не удовлетворяет никакой группе, — это CurveParamNotMatchPlatformRule. Проверка выполняется перед собственными ограничениями GlobalConfig и может только их сузить. Модель и сборники: products/launchlab/curve-rules. Обе ошибки избежны на стороне клиента — SDK отражает эту проверку как чистую функцию, см. Проверьте перед отправкой.
CollectFee
Сбор администратором накопленных комиссий протокола за торговлю на одном запуске.
Аргументы — нет.
Аккаунты
Эффект — передайте
pool_state.quote_protocol_fee из quote_vault в recipient_token_account, затем обнулите счетчик. Может быть вызвана в любое время после первой покупки.
CollectMigrateFee
Сбор администратором комиссии миграции, накопленной при выпуске. Та же форма аккаунта, что и CollectFee с migrate_fee_owner как подписывающий (вместо protocol_fee_owner) и pool_state.migrate_fee как осушаемый счетчик.
ClaimCreatorFee
Сбор по создателю накопленных комиссий создателя во всех запусках, которыми владеет создатель, использующих один и тот же минт котировки. Осушает хранилище комиссий по создателю, а не по пулу.
Аргументы — нет.
Аккаунты
Эффект — передайте весь баланс
creator_fee_vault в recipient_token_account. Откатывает с проверкой require-greater-than-zero, если хранилище пусто.
ClaimPlatformFee
Сбор по платформе, который осушает хранилище котировок запуска напрямую. Используйте это, когда платформа хочет получить свою долю для одного конкретного запуска без прохождения через агрегированное хранилище платформы.
Аргументы — нет.
Аккаунты
Эффект — передайте
pool_state.platform_fee из quote_vault в recipient_token_account, обнулите счетчик.
ClaimPlatformFeeFromVault
Сбор по платформе агрегированный. Осушает хранилище комиссий платформы по минту котировки, которое накапливает комиссии из каждого запуска, маршрутизированного через платформу.
Аргументы — нет.
Аккаунты
Эффект — передайте весь баланс
platform_fee_vault в recipient_token_account. Откатывает если хранилище пусто.
CollectExcessLamports
Сбор администратором lamports, сидящих выше минимума, освобожденного от аренды, на аккаунтах, которые контролирует LaunchLab. Добавлено в обновлении 2026-09, чтобы протокол мог вернуть избыточное финансирование, которое SIMD-0437 снижение аренды оставляет на аккаунтах, созданных до каждого шага.
Движется только избыток. Балансы токенов, данные аккаунта, владельцы, состояние кривой и вестинг не затронуты, и инструкция — это no-op для аккаунта, уже находящегося на минимуме — поэтому безопасно переустанавливать после каждого шага развертывания.
Аргументы — нет.
Аккаунты
Выбор
authority
Аккаунт передается непроверенным и разрешается программой, которая повторно получает все три PDA органов LaunchLab и совпадает:
Ключ, не совпадающий ни с одним из трех, падает всю инструкцию с
InvalidOwner (6001).
Как обрабатывается каждый исходный аккаунт
Базовые минты не могут быть собраны.
InitializeV2 и InitializeWithToken2022 отзывают MintTokens на базовом минте в той же инструкции, которая чеканит предложение, поэтому никакой ключ не может подписать WithdrawExcessLamports для него — рента минта остается там навсегда.
Распространенные ошибки — InvalidOwner (6001, неправильный подписывающий или authority, который не является ни одним из трех PDA), LamportsCalculateError (6031, круговой путь wSOL не привел к нулю) и InsufficientFunds из пути, принадлежащего программе, когда аккаунт содержит меньше, чем его собственный минимум аренды.
Нет построителя SDK. @raydium-io/raydium-sdk-v2 не поставляет построитель для этой инструкции, и ни репо raydium-sdk-V2-demo — это путь администратора. Кодируйте вручную, как это делает сбор на стороне кошелька в solana-fundamentals/rent-and-reclaimable-rent для инструкции программы токенов.
Инструкции вестинга и конфигурации платформы
Они документированы на выделенных страницах, потому что каждая имеет свою модель состояния: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

