Skip to main content
Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
На этой странице описан граф аккаунтов для каждого запуска: PoolState (корневой аккаунт состояния одного запуска), его два хранилища, PDA полномочий и ссылки после выпуска, которые он получает при завершении запуска. Для конфигурации на уровне протокола, которая ограничивает каждый запуск, см. products/launchlab/global-config. Для наложения на уровне платформы см. products/launchlab/platform-config. Для аккаунтов вестинга (VestingSchedule на PoolState, VestingRecord для каждого бенефициара), см. products/launchlab/vesting.

Инвентарь аккаунтов

SDK читает это через raydium.launchpad.getRpcPoolInfo({ poolId }), который возвращает декодированный PoolState с привязанным GlobalConfig, прикреплённым как configInfo (getRpcPoolsInfo({ poolIdList }) — пакетная форма). Метода getLaunchById не существует. Сам id пула — это PDA от (programId, mintA, mintB)getPdaLaunchpadPoolId.

PoolState

Корневое состояние для каждого запуска. Названия полей ниже соответствуют структуре Rust на цепи (states/pool.rs); некоторые значения упрощены для читаемости — обратитесь к исходному коду для точного расположения в памяти.
Значения PoolStatus (имена вариантов в IDL — Fund / Migrate / Trade):
Поля, видимые интеграторам:
  • status — три значения, монотонные (FundMigrateTrade). Чтение всегда безопасно; запись ограничена. ClaimVestedToken требует Trade.
  • real_base, real_quote — текущее состояние кривой. В сочетании с virtual_base / virtual_quote они достаточны для вычисления спотовой цены без обращения к хранилищам. См. bonding-curve.
  • total_base_sell vs real_base — соотношение «прогресс к выпуску» для пользовательских интерфейсов.
  • migrate_type — новая инициализация требует 1 (CPSWAP). Сохраненный 0 остается значимым только для существующего запуска, созданного до принудительного использования CPMM.
  • amm_creator_fee_on — выбирает creator_fee_on = OnlyQuoteToken (0) или BothToken (1) на пуле CPMM после выпуска. Это не выбирает цель миграции. См. creator-fees.
  • token_program_flag — битовое поле, а не логическое значение. Bit0 — это базовый минт, а bit1 — котировочный минт, каждый 0 для SPL Token и 1 для Token-2022, поэтому байт принимает четыре значения: 0 (оба устаревших), 1 (Token-2022 base), 2 (Token-2022 quote), 3 (оба Token-2022). Прочитайте один минт с помощью (token_program_flag >> bit) & 1. Сравнение всего байта с 0 для классификации базового минта разрешает 2 в неправильную программу. Bit1 был постоянно 0 до поддержки котировочных минтов Token-2022.
  • quote_protocol_fee / platform_fee / migrate_fee — три независимых счетчика комиссий. Каждый имеет свою инструкцию требования; см. instructions.
  • vesting_schedule — присутствует на каждом PoolState, но неактивен, когда total_locked_amount == 0. См. vesting для полного жизненного цикла.

PDA полномочий

LaunchLab использует единственный PDA полномочий для всех запусков, полученный без seed для каждого запуска:
Этот единственный PDA:
  • Полномочия на каждом base_vault и quote_vault запуска.
  • Ничего на base_mint — полномочия минта отозваны до возврата InitializeV2 (см. ниже).
  • Подписант на CPI выпуска CPMM и на устаревшем выпуске AMM v4 для существующего состояния.
  • Подписант на передачах ClaimVestedToken из базового хранилища.
  • transfer_fee_config_authority на TransferFeeConfig базового минта Token-2022 для всей фазы до выпуска — и его withdraw_withheld_authority тоже, но только когда платформа не установила PlatformConfig.transfer_fee_extension_auth.
mint_authority отозван в инструкции инициализации, а не при выпуске: InitializeV2 и InitializeWithToken2022 минтят полный объем в base_vault и затем устанавливают MintTokens на None в той же инструкции. Объем поэтому фиксирован с момента существования запуска, и миграция не имеет шага полномочий минта. Побочный эффект: никто не может подписать за базовый минт, поэтому его рента не может быть возвращена CollectExcessLamports. Два дополнительных PDA ограничивают хранилища комиссий:
Они подписывают передачу из соответствующего хранилища комиссий во время ClaimCreatorFee и ClaimPlatformFeeFromVault.

Базовый минт

Создан встроенно Initialize с:
  • mint_authority = authority (отозван при выпуске).
  • freeze_authority = None.
  • supply = supply, полностью минтирован в base_vault.
  • decimals, выбранный создателем при Initialize (обычно 6).
Поскольку полный объем предварительно минтирован, base_mint.supply постоянен на протяжении жизни запуска. Покупки по кривой перемещают токены из base_vault покупателю, но не вызывают mint_to. Initialize / InitializeV2 создают базовые минты SPL Token. Выделенная инструкция InitializeWithToken2022 позволяет базовому минту быть минтом Token-2022 (с опциональным TransferFeeConfig). Все три пути инициализации требуют выпуска CPMM. Когда InitializeWithToken2022 присоединяет TransferFeeConfig, минт создается с transfer_fee_config_authority = authority и withdraw_withheld_authority = PlatformConfig.transfer_fee_extension_auth, возвращаясь к authority, когда платформа не установила это поле. Обе полномочия переназначаются ключу платформы при выпуске, сторона вывода только если PDA все еще его держит. См. platform-config. Котировочный минт независим от базового минта и сам может быть минтом Token-2022 — InitializeV2 и InitializeWithToken2022 принимают любую программу в своем слоте котировочной программы. Устаревший Initialize не принимает: его аккаунт котировочной программы по-прежнему типизирован для SPL Token, поэтому конфиг, чей котировочный минт является Token-2022, может быть запущен только через два других. Котировочный минт никогда не создается LaunchLab; это то, что называет GlobalConfig.quote_mint. См. global-config и reference/token-2022-support.

Хранилища

Оба base_vault и quote_vault — это аккаунты токенов, принадлежащие PDA LaunchLab authority, каждый созданный на программе, которая владеет его собственным минтом — поэтому запуск может иметь устаревшее базовое хранилище и хранилище котировок Token-2022, или любую другую комбинацию. token_program_flag записывает, какое это. Адреса хранятся на PoolState и также могут быть получены:
(Проверьте точные префиксы seed из структуры аккаунтов Initialize исходного кода перед использованием получения в production.)

Хранилища комиссий

Два PDA агрегируют комиссии по запускам:
  • Хранилище комиссии создателя — PDA с seeds [creator, quote_mint]. Каждый запуск, который зарабатывает одинаковые комиссии создателя на одном котировочном минте, выливается в одно хранилище. Создатель очищает его через ClaimCreatorFee.
  • Хранилище комиссии платформы — PDA с seeds [platform_config, quote_mint]. Каждый запуск, направленный через одну платформу, которая использует один котировочный минт, выливается в одно хранилище. platform_fee_wallet платформы очищает его через ClaimPlatformFeeFromVault. Есть также вариант очистки для каждого запуска (ClaimPlatformFee), который вытягивает из quote_vault запуска напрямую без прохождения через агрегированное хранилище.
Оба создаются лениво при первом своппе, который начисляет комиссию, на программе, которая владеет котировочным минтом. Создатель или платформа, которые запускают запуски против как устаревшего, так и котировочного минта Token-2022, заканчиваются одним хранилищем на минт, как это уже было для двух разных устаревших минтов. Паттерн агрегированного хранилища позволяет создателю или платформе с высоким объемом амортизировать стоимость ренты накопления комиссий по многим запускам.

Quote vault ↔ real_quote

quote_vault.balance и PoolState.real_quote должны оставаться синхронизированными. Они могут отличаться максимум на сумму трех ожидающих счетчиков комиссий (quote_protocol_fee, platform_fee, migrate_fee), которые находятся в хранилище, но принадлежат счетчикам комиссий, а не резерву кривой. Математика кривой всегда использует real_quote, никогда не использует сырой баланс хранилища. Инвариант до выпуска:

PlatformCurveRule

Один аккаунт на пару (PlatformConfig, GlobalConfig), содержащий формы запусков, которые эта платформа разрешает на этом конфиге. PDA seeds — это [b"platform_curve_rule", platform_config, global_config].
Аккаунт создается без группы и изменяется в размере при каждом изменении группы, поэтому его длина составляет 150 + Σ(14 + 18 × constraints) и декодеры не должны предполагать фиксированный размер. Группы объединяются через ИЛИ: запуск разрешен, как только все ограничения одной группы выполняются. Нулевые группы означают отсутствие ограничений. Читайте его только когда владеющий PlatformConfig.restrict_curve_param равен 1 — при 0 программа игнорирует аккаунт, и там может находиться устаревшее правило. ID полей, операторы и руководства находятся в products/launchlab/curve-rules.

Переходы аккаунтов жизненного цикла

Куда дальше

Источники:
  • raydium-launch/programs/launchpad/src/states/pool.rsPoolState, PoolStatus, VestingSchedule, AmmCreatorFeeOn.
  • raydium-launch/programs/launchpad/src/lib.rs — константы PDA seed (AUTH_SEED, CREATOR_FEE_VAULT_AUTH_SEED, PLATFORM_FEE_VAULT_AUTH_SEED).
  • Модуль Raydium SDK v2 launchpad.