Skip to main content
Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Баннер версии.
  • SDK: @raydium-io/raydium-sdk-v2@0.2.64-alpha
  • Кластер: Solana mainnet-beta
  • ID программы: см. reference/program-addresses
  • Последняя проверка: 2026-09-09 для SDK 0.2.64-alpha, raydium-sdk-V2-demo/src/launchpad и исходного кода программы raydium-launch
Зафиксируйте версию SDK в package.json. Интерфейс кривой связи менялся между минорными версиями.

Настройка

Примеры здесь соответствуют файлам в raydium-sdk-V2-demo/src/launchpad. Инициализация следует config.ts.template из репозитория примеров:

Создание запуска

Источник: src/launchpad/createMint.tscreateBonkMintApi.ts для варианта на основе API Bonk) Большинство экономических параметров запуска не передаются как аргументы — они берутся из GlobalConfig, который вы привязываете через configId, а SDK заполняет остальное из параметров API по умолчанию. Вы передаёте идентификатор монеты, конфигурацию для привязки и (опционально) первую покупку:
Примечания:
  • Нет аргументов curveType, graduationFractionBps, initialK, quoteMint, openTime, fees или postGraduationLpPolicy. Форма кривой и quote mint — это свойства GlobalConfig, который вы привязываете; ставки комиссий находятся на GlobalConfig и PlatformConfig; утилизация LP при выпуске — это параметр PlatformConfig. См. products/launchlab/instructions для точного списка того, что принимает InitializeV2.
  • symbol длиннее 10 символов и пустой uri отклоняются на клиенте перед любым RPC.
  • Передача transferFeeExtensionParams переключает builder на InitializeWithToken2022 и принудительно устанавливает migrateType в "cpmm".
  • Builder возвращает массив transactions; createOnly: false добавляет транзакцию первой покупки. Всегда используйте execute({ sequentially: true }) — монета должна существовать перед тем, как покупка будет выполнена.

Получение состояния запуска

Источник: src/launchpad/poolInfo.ts Нет getLaunchById. ID пула — это PDA от (programId, mintA, mintB), и getRpcPoolInfo возвращает декодированный PoolState с привязанным configInfo:
getRpcPoolsInfo({ poolIdList }) — это пакетная форма и возвращает poolInfoMap, индексированную по ID пула — используйте её для представлений портфеля вместо цикла. Если вы хотите декодировать сырые аккаунты самостоятельно, LaunchpadPool.decode и LaunchpadConfig.decode экспортируются.

Покупка — точное количество quote

Источник: src/launchpad/buy.ts Вспомогательная функция для оффчейн-котировки — это Curve.buyExactIn, статический метод на экспортированном классе Curve — не метод на raydium.launchpad. Builder транзакции — это buyToken. Обоим нужны ставки комиссий платформы, которые находятся на отдельном аккаунте PlatformConfig:
Вы можете передать minMintAAmount явно вместо slippage; пропустите оба и SDK вычислит границу из живых RPC данных. shareFeeRate не должен превышать poolInfo.configInfo.maxShareFeeRate, и он применяется только когда вы также передаёте shareFeeReceiver.

Покупка — точное количество базовой монеты

Builder — это buyTokenExactOut, и аргументы количества — это outAmount (базовая монета, которую вы хотите) и maxBuyAmount (quote, который вы потратите максимум). Curve.buyExactOut({ poolInfo, amountA, ... }) — это соответствующий оффчейн-превью.
Полезно для UI типа “купить ровно X токенов”. Builder отклоняет outAmount равный нулю на клиенте, и программа откатывает, если кривая сдвинулась настолько, что требование котировки превышает maxBuyAmount.

Продажа

Источник: src/launchpad/sell.ts Builder — это sellToken (sellTokenExactOut для варианта с точным выходом quote), с sellAmount и опциональным minAmountB. Curve.sellExactIn({ poolInfo, amountA, ... }) показывает превью.
Путь продажи на кривой симметричен пути покупки: уменьшение real_a на sellAmount возвращает quote_out, равный интегрированной площади под кривой между real_a − sellAmount и real_a, минус комиссия продажи. sellAmount должен быть больше нуля — builder отклоняет ноль перед любым RPC.

Выпуск

Выпуск — это не то, что может запустить интегратор. Нет raydium.launchpad.graduate, нет флага autoGraduate на builders покупки и нет поля willGraduate в их возвращаемом значении. На цепи выпуск — это MigrateToCpswap (или устаревший MigrateToAmm), и обе инструкции ограничивают своего подписывающего кошельком, записанным на привязанном GlobalConfigmigrate_to_cpswap_wallet и migrate_to_amm_wallet соответственно. Вызов от любого другого подписывающего завершается с ошибкой InvalidOwner. Это не разрешено всем, и никакой MEV-бот не может его перегнать.
Эти кошельки управляются cranком выпуска Raydium, поэтому на практике миграция происходит в течение нескольких секунд после пересечения порога, независимо от того, кто сделал финальную покупку. Со стороны интегратора единственное, что нужно делать — это рассматривать переход статуса как быстрое событие: опрашивайте getRpcPoolInfo (или подписывайтесь через gRPC, ниже) и переключайте ваш UI с кривой на результирующий пул CPMM, когда status меняется. См. products/launchlab/instructions для списков аккаунтов, комиссии миграции и того, как LP разделяется при выпуске.

Сбор комиссий создателя

Источник: src/launchpad/claimCreatorFee.ts (одна монета) и collectAllCreatorFees.ts (пакетная) Метод — это claimCreatorFeeclaimMultipleCreatorFee для пакетной формы). Он индексируется по quote mint, а не по запуску — один вызов собирает накопленные комиссии создателя подписывающего в этой монете по всем его запускам:
Переводит счётчик накопленной комиссии создателя на ATA создателя на quote mint. Можно вызывать до или после выпуска; используйте периодически вместо ожидания огромного баланса. Операторы платформы имеют параллельные builders claimPlatformFee / claimAllPlatformFee / claimVaultPlatformFee.

Отслеживание запуска через его жизненный цикл

Собирая всё вместе, скрипт мониторинга может выглядеть так:
Опрос getRpcPoolInfo с интервалом 10 секунд подходит для одного запуска. Для индексера используйте вместо этого подписку gRPC ниже — getRpcPoolsInfo({ poolIdList }) пакетирует, но опрос сотен пулов всё равно сжигает RPC кредиты без пользы.

Наблюдение за конфигами и пулами через gRPC

Источник: src/grpc/launchpadPoolInfo.ts Подписывается на программу LaunchLab через Yellowstone gRPC и логирует каждое обновление GlobalConfig и PoolState с программой токена каждой монеты. Два фильтра datasize на одной подписке accounts разделяют два типа аккаунтов, поэтому один поток охватывает оба. Демонстрация — это самая короткая правильная ссылка для классификации монет запуска, что выпуск Token-2022 quote-mint делает необходимым:
  • Пулы классифицируются прямо из PoolState.token_program_flag, декодируя бит0 для базовой монеты и бит1 для quote монеты без выборки монеты вообще. Проверка всего байта против 0 — что было достаточно, пока quote монеты были только legacy — неправильно интерпретирует legacy базовую монету как Token-2022 всякий раз, когда quote монета это Token-2022.
  • Конфиги не могут быть классифицированы таким образом: GlobalConfig хранит адрес своей quote монеты и никакой флаг программы, поэтому демонстрация один раз читает владельца аккаунта монеты и кэширует его по монете.
Это также перекрёстно проверяет два друг против друга, что является полезным утверждением для сохранения в вашем собственном индексере. Обратите внимание, что create против update выводится из собственных кэшей демонстрации, инициализированных при запуске из getProgramAccounts; с отключённой инициализацией читайте “create” как “впервые видно на этом потоке”. Доступ gRPC не является частью публичной поверхности RPC — см. src/grpc/README.md репозитория примеров.

Rust CPI

Вызов LaunchLab из вашей собственной программы Anchor редок (большинство интеграций запусков только на стороне TS). Если вы это делаете:
  • Крейт — это raydium-launchpad (имя lib raydium_launchpad), версия 0.2.0, и он действительно предоставляет функцию cpi. Нет raydium_launchlab.
  • Он не опубликован на crates.io — зависит от него по git-ревизии, так же как другие крейты программ Raydium.
  • Точки входа CPI названы в честь инструкций на цепи, а не методов TypeScript SDK: buy_exact_in, buy_exact_out, sell_exact_in, sell_exact_out, claim_creator_fee, create_vesting_account, claim_vested_token. migrate_to_amm / migrate_to_cpswap ограничены подписывающим кошельками миграции GlobalConfig и не вызываются из программы интегратора.
См. sdk-api/rust-cpi для правил фиксации крейта — в частности разделение версии Anchor, которое определяет, может ли один крейт вызывать CPI как в LaunchLab, так и в CLMM.

Подводные камни

  • Путаница между названиями инструкций на цепи и методами SDK. Программа имеет buy_exact_in / sell_exact_in; SDK имеет buyToken / sellToken. buyExactIn и sellExactIn существуют только как статические методы на Curve, и они вычисляют котировку — они не строят транзакцию.
  • Забывание extraSigners. createLaunchpad создаёт базовую монету из keypair, который вы генерируете, поэтому этот keypair должен подписать. Пропустите extraSigners: [pair] и транзакция не пройдёт проверку подписи.
  • Не выбор quote mint. Вы его не передаёте. Quote mint — это свойство GlobalConfig, который вы привязываете через configIdgetPdaLaunchpadConfigId(programId, quoteMint, curveType, index). Для запуска против другого quote mint привяжите другой конфиг; raydium.api.fetchLaunchConfigs() перечисляет доступные с их параметрами по умолчанию.
  • Размер метаданных. Длинные строки uri выталкивают Metaplex CPI за бюджет. Держите uri под ~200 символов — большинство размещённых на CDN JSON метаданных легко подходят. symbol жёстко ограничен 10 символами.
  • Рассмотрение выпуска как гонки, в которую вы можете вступить. Это не так — см. предупреждение выше. Ваш UI всё равно должен рассматривать переходы status как быстрые события, потому что crank Raydium приземляет миграцию в течение нескольких секунд после пересечения порога.

Что дальше

Источники:
  • Raydium SDK v2
  • Исходный код программы Raydium LaunchLab