Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Информация о версии. Все примеры на TypeScript ориентированы на
@raydium-io/raydium-sdk-v2@0.2.64-alpha; они были последний раз выполнены для 0.2.42-alpha (2026-04), а их сигнатуры вызовов перепроверены для исходного кода 0.2.64-alpha 09.09.2026 на Solana mainnet-beta. Скелет Rust CPI в конце ориентирован на raydium-clmm в ветке master, которая закрепляет Anchor =0.32.1 — не 1.0.2, используемый на странице CPMM; они не могут находиться в одном крейте. Идентификаторы программ берутся из reference/program-addresses через SDK.Установка
raydium-sdk-V2-demo/src/clmm; ссылка на GitHub находится рядом с каждым разделом. Инициализация следует файлу config.ts.template репозитория демонстрации (источник) — disableFeatureCheck: true — рекомендуемая настройка для любой нетривиальной интеграции:
Создание пула CLMM
Источник:src/clmm/createPool.ts
- Сортирует
mint1/mint2по порядку байтов перед выведением. - Вычисляет
sqrt_price_x64 = floor(sqrt(initialPrice × 10^(dB−dA)) × 2^64). - Создаёт аккаунты
observationиtick_array_bitmap_extension. - Платит комиссию за создание пула, определённую
ammConfig.
Открытие позиции в выбранном диапазоне
Источник:src/clmm/createPosition.ts
OpenPosition* сам выделяет недостающий массив тиков за счёт платящей стороны.
Увеличение ликвидности на существующей позиции
Источник:src/clmm/increaseLiquidity.ts
Уменьшение ликвидности (и сбор комиссий одновременно)
Источник:src/clmm/decreaseLiquidity.ts и src/clmm/closePosition.ts
decreaseLiquidity с liquidity = new BN(0). Побочный эффект инструкции — урегулирование token_fees_owed_{0,1} и reward_amount_owed и их передача — это единственный способ собрать любое из них.
Чтобы полностью закрыть позицию после обнуления ликвидности и комиссий, передайте ownerInfo: { closePosition: true } в финальный вызов decreaseLiquidity. SDK добавляет ClosePosition и сжигает NFT.
Для прямого клиента Anchor оставьте объявленные аккаунты без изменений и добавьте пул:
poolId при каждом закрытии. CLMM читает его только когда positionNftAccount заморожен, что сохраняет один путь клиента совместимым со старыми и новыми позициями.
Сбор вознаграждения(й)
Источник:src/clmm/harvestAllRewards.ts
harvestAllRewards проходит по каждой позиции на каждом переданном пуле, группирует вызовы DecreaseLiquidity с нулевой ликвидностью, которые урегулируют комиссии и вознаграждения (плюс любые UpdateRewardInfos), и распределяет их по транзакциям при необходимости.
Своп
Источник:src/clmm/swap.ts
amountCalculated) плюс точный список аккаунтов, которые коснётся своп (accounts).
Всегда передавайте remainingAccounts, которые возвращает моделирование: слишком мало — своп откатится в середине прохода с NotEnoughTickArrayAccount; устаревшие просто тратят вычисления.
PoolUtils.computeAmountOutFormat всё ещё существует, но ему нужна ComputeClmmPoolInfo (
computePoolInfo из getPoolInfoFromRpc, а не объект пула API) плюс два дополнительных обязательных
аргумента — tickarrayBitmapExtension и blockTimestamp — и нет
метода raydium.clmm.fetchTickArrays (fetchTickArrays — свободная функция; помощники уровня модуля —
PoolUtils.fetchMultiplePoolTickArrays и tickData / tickArrays, возвращаемые
getPoolInfoFromRpc).Создание настраиваемого пула CLMM
createCustomizablePool — точка входа, которая раскрывает переключатели динамической комиссии и односторонней комиссии во время создания пула. Она принимает форму createPool плюс два дополнения:
createPool продолжает работать для пути с комиссией по умолчанию и без динамической комиссии. Используйте createCustomizablePool всякий раз, когда вам нужен любой из переключателей. См. products/clmm/instructions для списка аккаунтов на цепи.
Лимитные ордера
Лимитный ордер припаркует пользовательский ввод на одном тике и будет заполнен FIFO, когда своп пересечёт этот тик. Выходы передаются в ATA владельца во время урегулирования; владельцу не нужно быть в сети, чтобы быть заполненным.Открытие лимитного ордера
LimitOrderState из (owner, nonce PDA, order nonce), увеличивает LimitOrderNonce для каждого кошелька и вставляет ордер в когорту FIFO на этом тике.
Увеличение / уменьшение открытого ордера
decreaseLimitOrder может удалять только из незаполненной части ордера; заполненная часть заблокирована до урегулирования. Обе инструкции откатываются с InvalidOrderPhase, если ордер уже полностью заполнен.
Урегулирование заполненного ордера
settleLimitOrder читает unfilled_ratio_x64 ордера против трекера когорты, вычисляет заполненный выход и передаёт его в ATA владельца. Владелец может вызвать это сам; limit_order_admin (автономный оперативный хранитель) также может вызвать это от имени владельца — выход всё равно идёт владельцу.
Для закрытия полностью урегулированных ордеров для восстановления ренты используйте closeLimitOrder (одиночный) или closeAllLimitOrder (пакетный). Для урегулирования многих одновременно settleAllLimitOrder упаковывает столько вызовов SettleLimitOrder, сколько поместится в v0 tx.
Список припаркованных ордеров кошелька (в автономном режиме)
totalAmount / filledAmount / pendingSettle различают фазы). Для истории закрытых ордеров используйте /limit-order/history/order/list-by-user?wallet=… (для каждого кошелька, разбито по страницам с помощью nextPageId); для полного журнала событий конкретного ордера используйте /limit-order/history/event/list-by-pda?pda=….
Скелет Rust CPI
SwapV2:
Распространённые ошибки
- Конечные точки тика вне интервала →
TickAndSpacingNotMatch. Всегда привязывайте черезTickUtil.getPriceAndTick(единственное числоTickUtil). - Недостаточно массивов тиков в
SwapV2→NotEnoughTickArrayAccount. Возьмите список изswapInternal(...).accounts. - Позиция полного диапазона без расширения битовой карты → расширение PDA должно быть записываемым; SDK обрабатывает это автоматически.
- Путаница
sqrt_price_x64сprice→ ошибка в коэффициенте 2 здесь особенно болезненна. Если сомневаетесь, позвольте SDK вычислить это из читаемой человеком цены. - Слишком ранний сбор вознаграждений → каждый сбор — это
DecreaseLiquidityс нулевой ликвидностью и стоит одну транзакцию. Группируйте черезharvestAllRewardsпо многим позициям и помните, что егоexecuteнуждается в{ sequentially: true }. - Самостоятельное закрытие аккаунтов NFT →
ClosePositionсжигает NFT и закрывает его ATA. Он также закрывает минт NFT Token-2022; классический минт SPL Token остаётся с нулевым предложением, потому что эта программа не может закрывать минты. Не закрывайте поддерживаемые аккаунты отдельно или инструкция откатится. - Открытие лимитного ордера на тике без интервала →
TickAndSpacingNotMatch. Всегда квантуйте через экспортированный помощникgetOrderTick. - Вызов
decreaseLimitOrderна полностью заполненном ордере →InvalidOrderPhase. Вместо этого используйтеsettleLimitOrderзатемcloseLimitOrder. - Ожидание флага
enableDynamicFee→ его нет. ОпущениеdynamicFeeConfigпросто создаёт пул со статической комиссией, молча и без ошибки. Если вы хотели динамические комиссии, передайтеPublicKeyаккаунта конфигурации, выбранный из/main/clmm-dynamic-config.
Что дальше
sdk-api/typescript-sdk— полная поверхность SDK.sdk-api/rest-api— конечные точки котировок и метаданных пула.user-flows/create-clmm-pool— пошаговое руководство без кода.integration-guides/aggregator— маршрутизация CLMM как часть пути.

