Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Инвариант
Пул поддерживаетcoin_reserve × pc_reserve = k, где (после удаления OpenBook в июле 2026 г.):
- Резервы теперь только из хранилищ. Исторический термин открытого ордера (токены, которые пул держал в залоге как лимит-ордера OpenBook) был удалён — на практике он был нулевым задолго до удаления. Вы можете вычислить
kпрямо из балансов хранилищ в блокчейне. - Начисление PnL (
need_take_pnl_*) вычитается, чтобы кривая сохранялась, когда администратор снимает комиссии. Тот же принцип, что и исключениеprotocol_fees_*в CPMM.
calc_total_without_take_pnl_no_orderbook (старый вариант с поддержкой ордербука удалён).
Каждая операция Swap* обеспечивает k' ≥ k после добавления доли комиссии LP обратно в резервы.
Соглашение о комиссиях
AMM v4 использует комиссии в виде отношений (пара числитель/знаменатель) вместо соглашения1/1_000_000 в CPMM / CLMM. Структура Fees в блокчейне (см. Fees::initialize в исходном коде программы) по умолчанию имеет:
- Общая комиссия swap:
swap_fee = amount_in × 25 / 10_000 = 0.25%от валового входа. - Доля протокола:
pnl_numerator / pnl_denominator = 12 / 100 = 12%от комиссии swap, что составляет0.25% × 12% = 0.03%от объёма. Эта доля начисляется на счётчики PnL и снимается черезWithdrawPnl. - Доля LP: оставшиеся
88%комиссии swap, что составляет0.25% × 88% = 0.22%от объёма. Остаётся в пуле и увеличиваетk. - Нет доли фонда. AMM v4 не имеет разделения комиссии фонда, как в CPMM/CLMM.
pnl_numerator / pnl_denominator — это доля от комиссии, а не от объёма торговли — частая ошибка при чтении этих имён полей.
trade_fee_numerator / trade_fee_denominator (также 25 / 10_000) исторически использовалась интеграцией OpenBook при вычислении цен с учётом комиссии для сетки лимит-ордеров AMM. После удаления кода OpenBook это поле остаточное; активная комиссия swap — это swap_fee_*.
Отклонения от этих значений по умолчанию редки, но существуют на нескольких устаревших пулах; всегда читайте комиссии из AmmInfo.fees перед котировкой.
Прямая математика swap (путь AMM)
Простейший случай: пользователь делает swap против хранилищ пула без взаимодействия с OpenBook. Внутренние резервы пула (включая размещения в книге) — это знаменатель. SwapBaseIn (точный вход):MonitorStep / неявного расчёта, который раньше обновлял сторону OpenBook, был удалён.
SwapBaseOut (точный выход):
Взаимодействие с ордербуком (историческое)
Удалено. Построение сетки, описанное в этом разделе, отражает, как AMM v4 первоначально отражала кривую на рынке OpenBook. Интеграция OpenBook — включая кран
MonitorStep и логику сетки build_orders — была удалена из программы (обновление июля 2026 г.). Математика ниже сохранена исключительно как исторический контекст для того, на что когда-то были рассчитаны счета target_orders / amm_open_orders в блокчейне.AmmInfo:
depth— количество уровней цены с каждой стороны.amount_wave— базовая единица размера на уровень.min_size,coin_lot_size,pc_lot_size— ограничения рынка OpenBook.state_data.swap_acc_coin_fee,swap_acc_pc_fee— кумулятивные счётчики комиссий с момента последнегоTakePnl.
target_orders, вычисленными в build_orders и сравниваемыми с amm_open_orders на каждом MonitorStep. Любое расхождение приводит к отмене + новым размещениям. Недавно заполненные ордера на OpenBook расчитываются в хранилища пула при следующей операции, которая обновляет сторону OpenBook.
Интеграторам редко нужно вычислять сетку — хранитель Raydium её поддерживает — но полезно знать, что:
- Пул со значительной ликвидностью в книге имеет эту ликвидность, способствующую
k, а не простаивающей. - Устаревший рынок OpenBook (очередь событий полна, краны заблокированы) предотвращает обновления сетки; AMM может затем котировать цены, которые отличаются от видимого ордербука, пока не произойдёт следующий кран.
Этап расчёта (PnL)
Доля протокола 0.03% начисляется вstate_data.need_take_pnl_coin и state_data.need_take_pnl_pc. TakePnl перемещает эти суммы из хранилищ в указанное администратором место назначения, затем обнуляет счётчики.
Критическое свойство: резервы в инварианте всегда вычисляются минус начисленный PnL, поэтому TakePnl не перемещает кривую. Это соответствует соглашению CPMM.
Проработанный пример
Состояние пула:coin_reserve = 1_000_000_000_000(1 000 000 на стороне coin; 6 десятичных)pc_reserve = 2_000_000_000_000(2 000 000 на стороне pc; 6 десятичных)- Комиссии: по умолчанию
swap = 25/10_000,pnl = 3/10_000.
SwapBaseIn точный вход 1_000_000_000 coin (1 000 coin).
2_200_000) не выделяется отдельно — это просто остаток, который увеличивает k'.
Правила точности
- Умножения резервов используют
u128; финальные деления округляют к нулю. swap_feeокругляется вверх (чтобы пул не недозарядил).amount_inдляSwapBaseOutокругляется вверх (чтобы пользователь не недоплатил).- Пулы с экстремальными соотношениями резервов могут получить
ZeroTradingTokensна очень малых входах; то же соглашение, что и в CPMM.
Ограничения по сравнению с CPMM
- Резервы AMM v4 теперь только из хранилищ, поэтому вы можете котировать прямо из балансов хранилищ (минус
need_take_pnl_*) — предыдущее требование добавлять суммыopen_orders.free/open_orders.lockedбольше не применяется. Котировка SDK / API остаётся самым простым вариантом. - AMM v4 не предоставляет структурированный TWAP в блокчейне. Внешние потребители, которые хотят цену, поддерживаемую AMM v4, должны вычислить её сами из логов торговли.
- Token-2022 не поддерживается.
Что дальше
products/amm-v4/instructions— где подключаютсяSwapBaseIn,Depositи т. д.products/amm-v4/fees— полная механика комиссий, деталиTakePnl.algorithms/constant-product— общий вывод.
- Исходный код программы Raydium AMM —
raydium-io/raydium-amm - Модуль
LiquidityRaydium SDK v2

