Skip to main content
Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Что это делает. Создаёт новый CLMM-пул с выбранным уровнем комиссии и открывает на нём начальную концентрированную позицию. Две транзакции, один скрипт. Код адаптирован из официальных примеров в raydium-sdk-V2-demo/src/clmm в один файл, готовый к запуску в Node.

Подготовка

Убедитесь, что вы прочитали требования Quick start и установили переменные окружения RPC_URL, KEYPAIR и зависимости. Создание CLMM-пула требует единовременной комиссии и платежей за аренду tick-массивов под начальную позицию. Также нужно иметь оба seed-токена в кошельке — открытие позиции, когда цена находится в выбранном диапазоне, требует ликвидности с обеих сторон.

Шаг 1 — config.ts

Сохраните как config.ts. Структура совпадает с src/config.ts.template из демо-репо — disableFeatureCheck принудительно установлена в true (рекомендуется для любой нетривиальной интеграции, чтобы SDK не блокировался на проверке функций при старте):

Шаг 2 — createPool.ts

Сохраните рядом с config.ts. Источник: src/clmm/createPool.ts.

Шаг 3 — createPosition.ts

Источник: src/clmm/createPosition.ts.

Шаг 4 — utils.ts

Источник: src/clmm/utils.ts.

Запуск

Что произошло

Транзакция 1 — raydium.clmm.createPool инициализировала:
  • состояние пула по каноническому PDA для (mint1, mint2, ammConfig),
  • token_0_vault и token_1_vault (отсортированы по порядку байтов mint),
  • кольцевой буфер наблюдений,
  • встроенное битовое отображение tick-массивов,
и установила начальную sqrt_price_x64 из указанной initialPrice. Транзакция 2 — raydium.clmm.openPositionFromBase открыла концентрированную позицию:
  • отчеканила NFT позиции в ваш кошелёк (NFT — это сама позиция; её передача переводит позицию),
  • выделила tick-массивы на нижней и верхней границах (плата за аренду один раз, если это первая позиция в этих диапазонах; программа не предоставляет способ закрывать tick-массивы, поэтому эта аренда постоянна),
  • внесла inputAmount в mint1 и соответствующий размер mint2 (рассчитано PoolUtils.getLiquidityAmountOutFromAmountIn),
  • закредитовала позицию ликвидностью, пропорциональной ширине диапазона.
Чем уже диапазон, тем выше эффективность капитала на доллар TVL — и тем болезненнее непостоянный убыток при смещении цены за границы диапазона. Диапазон выше ([0.000001, 100000]) практически полный; сузьте его, чтобы сконцентрировать комиссии рядом с текущей спотовой ценой.

Выбор уровня комиссии

clmmConfigs[0] — уровень с минимальной комиссией. Полный набор опубликован на GET https://api-v3.raydium.io/main/clmm-config: Полную матрицу решений см. в user-flows/choosing-a-pool-type.

Частые ошибки

  • Pool already exists for this config — CLMM-пул уже существует для этой тройки (mint1, mint2, ammConfig). Найдите существующий ID пула и пропустите Шаг 2.
  • Insufficient funds for amount B — Ваш кошелёк имеет запрашиваемое количество mintA, но не хватает mintB. Открытие позиции, когда цена находится в диапазоне, требует ликвидности с обеих сторон.
  • Tick out of range — Ваша lowerPrice или upperPrice выходит за пределы представимого диапазона цен. Используйте более разумный диапазон относительно текущей цены.
  • Устаревшая цена — Котировка из API может быть устаревшей на 5–60 секунд. Если executePosition не пройдёт по slippage, раскомментируйте блок getRpcClmmPoolInfo в createPosition.ts, чтобы переполучить свежую цену прямо перед подписанием.

Замечания

  • Position NFT — ваш единственный способ доступа. Потеряйте NFT или передайте его — потеряете доступ к позиции. Относитесь к нему как к ключу.
  • Позиции вне диапазона не приносят комиссии. Если цена выходит за пределы [lowerPrice, upperPrice], ваша позиция полностью припаркована в один актив и не приносит ничего, пока вы не перебалансируете.
  • Аренда tick-массива — односторонняя. Первая позиция, которая касается никогда не инициализированного tick-массива, платит его аренду; программа не предоставляет пути закрытия tick-массивов, поэтому эта аренда постоянна. Последующие позиции в том же массиве — бесплатны.

Дальше

Источники: