Skip to main content
Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
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

Удалено фактически с обновлением 2026-09 — эта инструкция всегда падает. Обработчик initialize теперь представляет собой просто логирование Not supported. Please use initialize_v2 instruction и NotApproved (6000). Она сохранена исключительно для того, чтобы ее дискриминатор оставался занятым и IDL сохранял стабильную форму. (Структура Accounts не изменилась, поэтому сгенерированная Anchor валидация все еще выполняется первой; транзакция откатывается в любом случае.)Ранее она была заблокирована на часах: она работала до трех дней после переключения get_upgrade_timestamp и падала после. Этот помощник временных меток исчез, поэтому отказ теперь безусловный. Существующие запуски, созданные через нее, не затронуты — они торгуют и выпускаются нормально через MigrateToAmm или MigrateToCpswap в зависимости от их сохраненного migrate_type.Аргументы и список аккаунтов ниже относятся к InitializeV2. Устаревшая Initialize принимает те же 18 аккаунтов в том же порядке и только первые три аргумента — у неё нет amm_fee_on — а её слот quote_token_program типизирован как SPL Token, а не как Interface<TokenInterface>.
Создайте новый запуск. 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)

Пользователь задаёт фиксированную входную сумму; кривая вычисляет выходную. Аргументы
Аккаунты Оставшиеся аккаунты — обвязка комиссий, читается ровно в этом порядке:
  1. share_fee_receiver — только когда share_fee_rate > 0.
  2. system_program — всегда; проверяется == System::id(), иначе InvalidInput.
  3. platform_fee_vault — PDA [platform_config, quote_token_mint]; создаётся при первом использовании.
  4. 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.
Эффект
  1. Разделите quote_in на quote_in_after_fee и части комиссии.
  2. Newton-решите кривую для base_out с учетом post-fee котировки.
  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) вместо итерации 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.
Минт котировки со 100% комиссией (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.
Эти кошельки обычно удерживаются операционным кранком выпуска Raydium; на практике выпуск происходит секунды после пересечения порога, независимо от того, кто запустил финальную покупку. Аргументы Ни один не принимает никаких.
Критическое изменение (только кошелек миграции, 2026-09). MigrateToAmm отбросил все три аргумента — base_lot_size, quote_lot_size, market_vault_signer_nonce — и девять аккаунтов. Его данные инструкции теперь просто дискриминатор, поэтому старый построитель отправляет 17 неожиданных байтов аргумента и предоставляет список аккаунтов, который больше не совпадает.Это следует за собственным удалением OpenBook AMM v4: Initialize2 AMM v4 больше не принимает market_program или amm_open_orders, поэтому LaunchLab не имел ничего для пересылки. Программа также перестала CPI-ить initialize_openbook_market, что конфигурировали три аргумента.Удаленные аккаунты: openbook_program, request_queue, event_queue, bids, asks, market_vault_signer, market_base_vault, market_quote_vault и amm_open_orders. Аккаунт market остается в своей позиции — AMM v4 по-прежнему записывает его как поле ссылки — но теперь он объявлен как простой #[account(mut)]: без ограничений владельца, адреса или семян. Он полностью не проверяется, он пересылается прямо в CPI AMM v4 Initialize2, и программа больше его не инициализирует. Вызывающий, который хочет, чтобы аккаунт market был реально инициализированным рынком, должен создать его сам заранее.Оставшийся список из 23 аккаунтов в порядке: payer, base_mint, quote_mint, market, amm_program, amm_pool, amm_authority, amm_lp_mint, amm_base_vault, amm_quote_vault, amm_target_orders, amm_config, amm_create_fee_destination, authority, pool_state, global_config, base_vault, quote_vault, pool_lp_token, spl_token_program, associated_token_program, system_program, rent_program.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. (Нет шага mint-authority. base_mint.mint_authority уже был установлен на None при создании запуска — см. примечание ниже.)
  7. Переверните pool_state.status = Migrated, установите vesting_schedule.start_time = block_time + cliff_period.
Передача прав расширения Token-2022 — когда базовый минт является минтом 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_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! вместо ограничения Anchor address =. Проверка эквивалентна; только поверхность ошибок отличается — вы получаете общий 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.
Администратор платформы создает или закрывает 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_param равен 1, InitializeV2 и InitializeWithToken2022 требуют PDA правила в remaining_accounts — включая когда он не существует, чтобы его опущение не могло пропустить проверку. Отсутствующий аккаунт — это NotEnoughRemainingAccounts; запуск, который не удовлетворяет никакой группе, — это CurveParamNotMatchPlatformRule. Проверка выполняется перед собственными ограничениями GlobalConfig и может только их сузить. Модель и сборники: products/launchlab/curve-rules. Обе ошибки избежны на стороне клиента — SDK отражает эту проверку как чистую функцию, см. Проверьте перед отправкой.

CollectFee

Сбор администратором накопленных комиссий протокола за торговлю на одном запуске. Аргументы — нет. Аккаунты
quote_mint здесь идёт перед recipient_token_account — в обратном порядке относительно ClaimCreatorFee, ClaimPlatformFee и ClaimPlatformFeeFromVault, где получатель стоит первым. У этих двух слотов разные типы Anchor (Mint против TokenAccount), поэтому их перестановка ломает десериализацию во время выполнения и выглядит как ошибка «не тот аккаунт». CollectMigrateFee имеет тот же порядок, что и 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).
Группируйте исходные аккаунты по органу. Один вызов несет один authority, и программа токенов требует подписания фактического владельца аккаунта. Аккаунт токена, принадлежащий другому из трех PDA, чем переданный authority, делает CPI неудачным и берет всю транзакцию с собой. Собирайте хранилища пулов, хранилища комиссий платформы и хранилища комиссий создателя в отдельных транзакциях.Принадлежащие программе PDA — исключение — они дебетуются напрямую, поэтому они могут ехать с любым органом.
Как обрабатывается каждый исходный аккаунт Базовые минты не могут быть собраны. 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 для инструкции программы токенов.

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

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

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

Куда дальше

Источники: