Skip to main content
Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
LaunchLab предоставляет компактный набор инструкций: шесть пользовательских вызовов плюс несколько примитивов администратора. SDK оборачивает все из них; эта страница документирует сырую поверхность для агрегаторов, инструментов мониторинга и программ, которым нужен CPI.

Инвентарь инструкций

Разделение “ExactIn/ExactOut” отражает SwapBaseInput / SwapBaseOutput CPMM — в цепи это отдельные дискриминаторы инструкций с немного отличающимся округлением. Выбор пути выпуска. Каждый новый вызов Initialize, InitializeV2 и InitializeWithToken2022 должен установить migrate_type = 1 (CPSWAP). Любая попытка инициализировать новый пул, привязанный к AMM v4, возвращает MigrateTypeNotMatch. amm_creator_fee_on только выбирает, применяется ли результирующая комиссия создателя CPMM к токену котировки или обоим токенам; это не выбирает целевую программу. 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, поэтому конфигурация, чей минт котировки — 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 (приблизительно).
  • Для InitializeWithToken2022 с прикрепленным TransferFeeConfig: 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.
Эффект
  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_out, quote_reserve_real += quote_in_after_fee × (lp_share / total_share).
  6. Обновить счетчики комиссий (protocol_fees_quote, creator_fees_quote).
  7. state_data.num_buys += 1.
  8. Если quote_reserve_real ≥ quote_reserve_target после обновления, SDK обычно цепляет инструкцию Graduate в той же транзакции. Программа не выполняет автоматический выпуск внутри Buy — требуется последующий Graduate.

BuyExactOut

Пользователь указывает точный base_out; программа вычисляет quote_in. Аргументы
Те же аккаунты, что и BuyExactIn. Использует замкнутую форму квадратичного интеграла (или обратный CPMM для curve_type 1) вместо итерации Ньютона.

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.
Минт котировки со 100%-комиссией (10000 базовых пункта) не может быть инвертирован и возвращает CalculateOverflow на путях exact-out. Оба минта на стороне торговли также ограничены программой, переданной в их соответствующий слот, поэтому несоответствие base_token_program теперь не срабатывает, а не игнорируется. См. algorithms/token-2022-transfer-fees для базовой математики комиссий.

MigrateToAmm / MigrateToCpswap

Выпуск запуска в торгуемый пул после того, как кривая достигла total_quote_fund_raising. Новые запуски только CPMM. MigrateToAmm сохраняется для существующих пулов, чье сохраненное migrate_type0. Кто подписывает
  • MigrateToAmmmigrate_to_amm_wallet записанный на привязке GlobalConfig.
  • MigrateToCpswapmigrate_to_cpswap_wallet записанный на привязке GlobalConfig.
Эти кошельки обычно удерживаются операционным механизмом выпуска Raydium; на практике выпуск происходит секунды после пересечения порога, независимо от того, кто инициировал финальную покупку. Аргументы MigrateToAmm принимает три (в основном параметры рынка OpenBook, которые программа передает AMM v4):
MigrateToCpswap не принимает никаких. Эффект (общий для обоих)
  1. Проверить pool_state.status == Migrate (т.е. quote_reserve_target был достигнут). Иначе вернуть PoolMigrated (статус уже был Migrated) или PoolFunding (все еще в финансировании).
  2. Проверить pool_state.migrate_type соответствует инструкции (0 для AMM, 1 для CPMM). Иначе вернуть 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 Initialize2 или CPMM InitializeWithPermission) с этими резервами для создания пост-выпускного пула.
  5. Для миграций CPMM, выполненных после обновления 2026-08-17, объединить platform_scale + creator_scale в одну заблокированную долю LP, принадлежащую платформе, и выпустить максимум один Fee Key NFT в platform_nft_wallet. Сжечь остаток burn_scale. До обновления creator_scale был заблокирован отдельно и его Fee Key перешел создателю токена. Завершенные исторические миграции не изменяются. Для устаревшего выпуска AMM v4 расположение LP следует существующему потоку этой инструкции.
  6. Отозвать base_mint.mint_authority (установить на None).
  7. Переключить pool_state.status = Migrated, установить vesting_schedule.start_time = block_time + cliff_period.
Передача полномочий расширения Token-2022 transfer-fee — когда базовый минт — это минт Token-2022, несущий TransferFeeConfig и PlatformConfig.transfer_fee_extension_auth не по умолчанию, миграция также переназначает полномочия этого расширения ключу платформы:
  • transfer_fee_config_authority всегда переназначается. PDA запуска authority держит его на протяжении всей пред-выпускной фазы, поэтому всегда есть что переместить.
  • WithheldWithdraw переназначается только когда PDA authority все еще его держит. Запуски, созданные с 2026-08-27 и позже, уже несут transfer_fee_extension_auth на этом полномочии от создания минта, поэтому шаг пропускается. Охрана — это то, что предотвращает возврат миграции на этих минтах — PDA не может отказаться от полномочия, которое оно больше не держит.
Если transfer_fee_extension_authPubkey::default() во время миграции, ни одно полномочие не перемещается и оба остаются с PDA authority навсегда. См. 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. Устаревшая программа требуется даже когда ни один минт её не использует, потому что минт LP CPMM и заблокированный Fee Key NFT ликвидности всегда живут на нём.

Список разрешений GlobalConfig платформы

PlatformConfig.restrict_global_config контролирует проверку:
  • 0: платформа принимает любой иначе-действительный GlobalConfig; аккаунт разрешения не требуется.
  • 1: Initialize, InitializeV2 и InitializeWithToken2022 должны включать соответствующий PlatformAllowConfig где-нибудь в remaining_accounts.
Администратор платформы создает или закрывает PDA с помощью 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_param1, 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. Возвращает с проверкой требования больше нуля, если хранилище пусто.

ClaimPlatformFee

Сбор по платформе, который осушает хранилище котировок запуска напрямую. Используйте это, когда платформа хочет получить свою долю для одного конкретного запуска без прохождения через агрегированное хранилище платформы. Аргументы — нет. Аккаунты Эффект — передать pool_state.platform_fee из quote_vault в recipient_token_account, обнулить счетчик.

ClaimPlatformFeeFromVault

Агрегированный сбор по платформе. Осушает хранилище комиссий платформы по минту котировки, которое накапливает комиссии из каждого запуска, маршрутизированного через платформу. Аргументы — нет. Аккаунты Эффект — передать полный баланс platform_fee_vault в recipient_token_account. Возвращает, если хранилище пусто.

Инструкции вестинга и конфигурации платформы

Они документированы на отдельных страницах, потому что каждая имеет свою собственную модель состояния:

Матрица изменения состояния

Куда дальше

Источники: