Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Кривая таблицы поиска
Stable AMM заменяет формулу x·y=k на разреженную таблицу поиска кортежей (x, y, price). При определении цены свопа программа:- Вычисляет текущее соотношение пула из резервов.
- Выполняет бинарный поиск в таблице, чтобы найти две записи, которые охватывают это соотношение.
- Линейно интерполирует между ними, чтобы получить промежуточную цену.
- Применяет комиссии и возвращает котировку.
Макет таблицы и бинарный поиск
ModelDataInfo содержит до 50 000 записей DataElement, индексируемых администратором. Активны только первые valid_data_count. Каждая запись:
- Вычислите соотношение:
target_ratio = (x_real * multiplier) / y_real. - Выполните бинарный поиск записей, где
(element.x * multiplier) / element.yохватываетtarget_ratio. - Когда найден диапазон
[min_idx, max_idx], выполните интерполяцию.
state.rs::ModelDataInfo::get_mininum_range_by_xy_real. Ключевой инвариант: записи должны быть отсортированы (x по возрастанию, y по убыванию, price по возрастанию) для работы поиска.
Линейная интерполяция
Когда две точки таблицы охватывают соотношение, интерполяция вычисляет промежуточную цену и пару резервов:Масштабирование: множитель
Резервы пула и цены хранятся в разных масштабах. Полеmultiplier на ModelDataInfo это учитывает. Типичный паттерн:
- Монета имеет 6 десятичных знаков, ПК имеет 18 десятичных знаков.
- Множитель = 10^6 (или аналогично).
- Записи таблицы хранятся в уменьшенном масштабе, чтобы соответствовать границам u64.
Определение цены свопа: SwapBaseIn и SwapBaseOut
SwapBaseIn (точный ввод)
Дан входной объёмamount_in:
- Получите текущее соотношение из
(coin_vault, pc_vault). - Найдите охватывающие записи таблицы и интерполируйте, чтобы получить соотношение в пространстве таблицы.
- Преобразуйте ввод в пространство таблицы:
dx_table = amount_in * multiplier / ratio. - Запросите таблицу по новой X-координате, чтобы найти новую Y.
dy_table = y_old - y_new.- Преобразуйте обратно:
dy_real = dy_table * ratio / multiplier. - Примените торговую комиссию:
dy_output = dy_real - (dy_real * trade_fee_numerator / trade_fee_denominator). - Верните
dy_output.
SwapBaseOut (точный вывод)
Симметрично: дан желаемыйamount_out, решите для требуемого amount_in.
Оба пути читают эффективные резервы непосредственно из хранилищ пула. Пул не держал открытые ордера OpenBook годами, поэтому нечего расчищать в первую очередь — балансы хранилища — это вся история. (Обновление 2026-06-22 удалило оставшийся код маркета.)
Применение комиссий
Идентично AMM v4: см.products/amm-v4/math для полного вывода.
pnl_portion идёт в need_take_pnl_* и выводится администратором через WithdrawPnl. lp_portion остаётся в хранилище, увеличивая k и принося пользу держателям токенов LP.
Учёт активов пула
Формула исторически добавляла средства, которые пул держал как открытые ордера в своём счёте OpenOrders OpenBook. Этот термин был нулевым на практике с тех пор, как пул перестал размещать ордера, и обновление 2026-06-22 полностью удалило его из формулы, оставив только расчёт на основе хранилища:need_take_pnl физически находится в хранилище, но исключена из определения цены). Код котировок и индексаторы, которые ранее читали балансы OpenOrders, должны отбросить этот термин.
MonitorStep (удалено)
MonitorStep была инструкцией крана, которая расчищала ожидающие заполнения OpenBook, пересчитывала AmmInfo.target_orders и переразмещала сетку лимитных ордеров, полученную из таблицы поиска. Пул перестал размещать ордера в OpenBook годами назад, поэтому кран больше не имел ничего делать; он был удалён в обновлении 2026-06-22. Интеграторам не нужно запускать кран для пулов Stable.
Резюме: почему это работает
Дизайн таблицы поиска + интерполяция эффективен и гибок:- Эффективность: Бинарный поиск — это O(log 50,000) ≈ 16 итераций, каждая ~ 300–500 CU. Интерполяция — это несколько умножений/делений. Общая стоимость котировки ~ 5k–15k CU, намного дешевле, чем пересчёт формулы при каждом свопе.
- Гибкость: Администратор может закодировать любую кусочно-линейную кривую. Пары стейблкойнов получают высокую плотность около 1:1; обеспеченные пары получают пользовательские кривые.
- Самодостаточная ликвидность: Все средства находятся в хранилищах пула, и определение цены читает их напрямую — без крана, без внешней книги ордеров, меньше счётов за транзакцию.
raydium-stable/program/src/state.rs, методы get_data_by_x, get_data_by_y, get_dy_by_dx_base_in и т. д.
Что дальше
- Accounts — справочник полей
ModelDataInfoиDataElement. - Instructions — вызываемый набор (swap, deposit, withdraw,
WithdrawPnl) и удалённые инструкции. - Fees — применение комиссий и
WithdrawPnl. products/amm-v4/math— для логики определения цены ордеров OpenBook с учётом комиссий.
raydium-stable/program/src/state.rs(реализации интерполяции и бинарного поиска)raydium-stable/program/src/math.rs(утилиты калькулятора)

