Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Запись в журнале изменений документации. Индекс всех обновлений см. в
reference/changelog. Историческую хронологию самого протокола см. в introduction/history-and-milestones.TL;DR для интеграторов
- Лимитные ордера теперь являются первоклассными примитивами CLMM. LP могут открыть ордер на одном тике в пуле, который их поддерживает; ордер заполняется FIFO, когда своп пересекает тик, и оффчейн-хранитель (
limit_order_admin) может рассчитать заполненный выход без участия владельца. Семь новых методов SDK (openLimitOrder,increaseLimitOrder,decreaseLimitOrder,settleLimitOrder,closeLimitOrder,closeAllLimitOrder,settleAllLimitOrder) и три новых эндпоинта Temp API под/limit-order/(активные ордера, история по пользователю, журнал событий по PDA) охватывают весь процесс. - Односторонняя комиссия (
CollectFeeOn) позволяет пулу собирать комиссию своп с входной стороны (наследие, режим0), или всегда сtoken_0(режим1), или всегда сtoken_1(режим2). Полезно, когда одна сторона пары является каноническим токеном учёта. - Динамическая комиссия позволяет пулу включить отслеживающую волатильность надбавку, которая растёт при быстром движении тика и затухает со временем, откалибрована по
DynamicFeeConfigдля каждого уровня иDynamicFeeInfoдля каждого пула. Новый эндпоинт/main/clmm-dynamic-configвыводит список уровней. - Новая инструкция
CreateCustomizablePoolпредоставляет все три параметра при создании пула. КлассическаяCreatePoolпродолжает работать для пулов с комиссией по умолчанию и без лимитных ордеров. - Критическое изменение индексатора: счётчики объёма по направлениям (
swap_in_amount_token_{0,1},swap_out_amount_token_{0,1}) и счётчики комиссии за всё время (total_fees_token_{0,1},total_fees_claimed_token_{0,1}) наPoolStateбыли удалены в заполнение, чтобы освободить место дляfee_onиdynamic_fee_info. Индексаторы, которые читают эти поля напрямую, должны перейти на кольцоObservationв цепи или API.
Почему это важно (для трейдеров, LP и интеграторов)
- Трейдеры получают более узкие котировки на длинных хвостах и событийных парах: динамическая комиссия позволяет пулу поглощать надбавки волатильности от тейкера без необходимости LP активно расширять диапазоны, а лестницы лимитных ордеров углубляют ликвидность в цепи по конкретным ценам без привлечения капитала по всему диапазону.
- LP получают третью стратегию наряду с концентрированными диапазонами и полнодиапазонными позициями: припаркуйте ордера по точной цене, получите заполнение, когда цена посетит, рассчитайте в токен котировки. Активная перебалансировка не требуется для заполненной части.
- Интеграторы могут детерминированно моделировать пулы с динамической комиссией — алгоритм и параметры полностью находятся в цепи, уровни калибровки запрашиваются, и путь своп не изменяется по форме (только комиссия за шаг варьируется).
Что изменилось в программе
Новые аккаунты
DynamicFeeConfig— запись калибровки для каждого уровня (период фильтра, период затухания, коэффициент снижения, управление динамической комиссией, максимальный накопитель волатильности). СоздаётсяCreateDynamicFeeConfig(администратор), на которую ссылаетсяCreateCustomizablePoolпри включении динамической комиссии.LimitOrderState— аккаунт для каждого ордера (PDA seeds:[owner, limit_order_nonce, order_nonce]) содержащий пул, тик, сторону, входную сумму, незаполненное соотношение, фазу когорты FIFO и снимки учёта. Жизненный цикл неявный (filled_amountvstotal_amount, плюс существование аккаунта):Open → Filled → Settled → Closed.LimitOrderNonce— монотонно возрастающий счётчик для каждого (владелец, индекс_nonce), который получает seeds PDA лимитного ордера.nonce_index: u8позволяет одному владельцу разделить ордера на до 256 независимых потоков nonce.
Переструктурирование PoolState
| Группа полей | Старая раскладка | Новая раскладка |
|---|---|---|
| Счётчики объёма по направлениям | swap_in_amount_token_0, swap_out_amount_token_0, swap_in_amount_token_1, swap_out_amount_token_1 | Свёрнуты в padding5: [u128; 4] |
| Счётчики комиссии за всё время | total_fees_token_0, total_fees_claimed_token_0, total_fees_token_1, total_fees_claimed_token_1 | Свёрнуты в padding6: [u64; 4] |
| Односторонняя комиссия | — | fee_on: u8 (0 = FromInput, 1 = Token0Only, 2 = Token1Only) |
| Динамическая комиссия | — | dynamic_fee_info: DynamicFeeInfo (встроенная) |
PoolState на кольцо Observation или API. Удалённые счётчики не обнуляются на существующих пулах (они содержат то, что они последний раз несли), поэтому повторное чтение после обновления вернёт устаревшие данные.
Дополнения TickState (без критических изменений)
Четыре новых поля добавлены в конец TickState, заменяя часть его хвостового заполнения:
order_phase: u64— счётчик, который различает когорты лимитных ордеров на этом тике.orders_amount: u64— общая входная сумма, привлечённая всеми открытыми ордерами на этом тике (не все из них полностью незаполнены).part_filled_orders_remaining: u64— входная сумма, всё ещё незаполненная в когорте, которая в настоящее время потребляется свопами.unfilled_ratio_x64: u128— соотношение Q64.64, используемое для вычисления доли заполнения каждого ордера.
Новые инструкции
CreateDynamicFeeConfig(администратор) — создать откалиброванный уровеньDynamicFeeConfig. Полномочия: тот же казначейский мультиподпис, что иCreateAmmConfig.UpdateDynamicFeeConfig(администратор) — обновить параметры существующего уровня.CreateCustomizablePool— точка входа создания пула, которая предоставляетcollect_fee_on,enable_dynamic_feeиdynamic_fee_config. Сосуществует сCreatePool; мы рекомендуемCreateCustomizablePoolдля любого нового пула, которому нужны новые параметры.OpenLimitOrder— открыть лимитный ордер на одном тике. УвеличиваетLimitOrderNonce, выделяетLimitOrderState, помещает ордер в когорту FIFO на тике.IncreaseLimitOrder/DecreaseLimitOrder— отрегулировать незаполненную часть ордера. Откатывается на полностью заполненном ордере сInvalidOrderPhase.SettleLimitOrder— перевести заполненный выход в ATA владельца. Вызывающий может быть владельцем или хранителемlimit_order_adminпула.CloseLimitOrder— закрыть полностью рассчитанный ордер, чтобы вернуть аренду.
Изменения поведения SwapV2
Путь своп сам по себе не изменяется по форме, но три вещи теперь происходят на пути:
- Динамическая комиссия (при включении):
DynamicFeeInfoпула обновляется на каждом шаге (затухание → накопление → ограничение), и полученная надбавка добавляется поверх базовой комиссии для этого шага. - Сопоставление лимитных ордеров (когда шаг пересекает инициализированный тик, который имеет открытые ордера): часть входной суммы своп потребляется FIFO для заполнения когорты на этом тике, с
unfilled_ratio_x64, обновляемым атомарно. - Маршрутизация односторонней комиссии (когда
fee_on != 0): комиссия берётся сtoken_0илиtoken_1независимо от направления своп, вместо того чтобы всегда браться с входной стороны.
Новые коды ошибок
ПеречислениеErrorCode было перенумеровано в этом релизе: пять наследуемых вариантов (LOK, ZeroMintAmount, InvalidLiquidity, TransactionTooOld, InvalidRewardDesiredAmount) были удалены, и одиннадцать новых вариантов были добавлены. Поскольку Anchor нумерует ошибки по порядку перечисления с 6000, каждый код ошибки на или после удалённых позиций сместился — клиенты, которые жёстко кодировали числовые коды, должны переотобразить.
Новые коды:
6040OrderAlreadyFilled6041InvalidOrderPhase6042InvalidLimitOrderAmount6043OrderPhaseSaturated6044InvalidDynamicFeeConfigParams6045InvalidFeeOn6046ZeroSqrtPrice6047ZeroLiquidity6048MissingBaseFlag6049MissingMintAccount6050MissingTokenProgram2022
Что изменилось в SDK (@raydium-io/raydium-sdk-v2)
- Новые методы на
raydium.clmm:createCustomizablePool,openLimitOrder,increaseLimitOrder,decreaseLimitOrder,settleLimitOrder,settleAllLimitOrder,closeLimitOrder,closeAllLimitOrder. - Новые помощники REST на
raydium.api:getClmmDynamicConfigs,getClmmLimitOrderConfigs. - Новые типы: перечисление
CollectFeeOn,DynamicFeeConfig,DynamicFeeInfo,LimitOrderState,LimitOrderConfig. - Внутренняя реорганизация:
utils/перемещён вlibraries/. Бочка пакета не изменилась; только глубокие импорты под@raydium-io/raydium-sdk-v2/utils/...нужно обновить на…/libraries/....
products/clmm/code-demos.
Что изменилось в API
api-v3— два новых эндпоинта под/main/:GET /main/clmm-dynamic-config— список уровнейDynamicFeeConfig.GET /main/clmm-limit-order-config— конфигурация лимитных ордеров для каждого пула.
temp-api-v1— три новых эндпоинта под/limit-order/:GET /limit-order/order/list?wallet=…— припаркованные ордера кошелька (открытые и частично заполненные, обслуживаемые из Redis-кэша индексатора; один и тот же payload охватывает обе фазы черезtotalAmount/filledAmount/pendingSettle).GET /limit-order/history/order/list-by-user?wallet=…— исторические лимитные ордера кошелька. Опциональные фильтры:poolId,mint1,mint2,hideCancel. Курсорная пагинация черезnextPageId/size(макс 100).GET /limit-order/history/event/list-by-pda?pda=…— журнал событий для каждого PDA (open/increase/decrease/settle/close) для одного или нескольких разделённых запятыми PDA лимитных ордеров. Курсорная пагинация черезnextPageId/size(макс 100).
Поверхность полномочий
limit_order_admin — это оффчейн-хранитель операций, не мультиподпис. Он может только вызывать SettleLimitOrder и CloseLimitOrder на существующих ордерах, и выход рассчёта всегда попадает в ATA владельца. Он не может изменять поля пула, открывать или изменять ордера, или подписывать что-либо ещё. См. Admin keys and multisig → CLMM.
Обновлённые страницы
products/clmm/overview— новый раздел “What’s new” и обновлённые указатели следующих шагов.products/clmm/accounts— три новых аккаунта, переструктурированиеPoolStateс предупреждением о миграции, дополненияTickState, новые помощники PDA.products/clmm/instructions— семь новых инструкций, дополнение поведенияSwapV2, обновлённая матрица изменения состояния.products/clmm/fees— раздел односторонней комиссии, раздел динамической комиссии с таблицей параметров.products/clmm/math— псевдокод сопоставления лимитных ордеров, вывод динамической комиссии.products/clmm/code-demos— демонстрацияcreateCustomizablePool, полное пошаговое руководство лимитных ордеров, новые подводные камни.algorithms/clmm-math— перекрёстная ссылка на сопоставление лимитных ордеров и динамическую комиссию в цикле многотикового своп.sdk-api/typescript-sdk— раздел дополнений модуля CLMM, примечание о миграцииutils/→libraries/.api-reference/openapi/api-v3.yaml— два новых эндпоинта со схемами ответов.api-reference/openapi/temp-api-v1.yaml— три новых эндпоинта лимитных ордеров (/limit-order/order/list,/limit-order/history/order/list-by-user,/limit-order/history/event/list-by-pda) с их схемами запроса и ответа.api-reference/api-v3/overview— примечание о новых эндпоинтах конфигурации CLMM.api-reference/temp-api-v1/overview— примечание о новых эндпоинтах активных ордеров, истории по пользователю и событий по PDA.reference/error-codes— одиннадцать новых кодов ошибок CLMM (6040–6050) плюс пять удалённых наследуемых кодов; числовые коды после точек удаления сместились.security/admin-and-multisig— новая строка администратораDynamicFeeConfigи строка хранителяlimit_order_admin, с объяснением ограниченных полномочий.
- исходного кода
raydium-clmm. - исходного кода
@raydium-io/raydium-sdk-v2. - исходного кода
api-v3иtemp-api-v1.

