Documentation Index
Fetch the complete documentation index at: https://docs.raydium.io/llms.txt
Use this file to discover all available pages before exploring further.
Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Кривая таблицы поиска
Stable AMM заменяет формулу x·y=k на разреженную таблицу поиска кортежей (x, y, price). При определении цены swap программа:- Вычисляет текущее соотношение пула из резервов.
- Выполняет двоичный поиск в таблице, чтобы найти две записи, которые охватывают это соотношение.
- Линейно интерполирует между ними, чтобы получить промежуточную цену.
- Применяет комиссии и возвращает котировку.
Макет таблицы и двоичный поиск
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.
Определение цены swap: 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. - Примените комиссию за trade:
dy_output = dy_real - (dy_real * trade_fee_numerator / trade_fee_denominator). - Вернитесь к
dy_output.
SwapBaseOut (точный выход)
Симметрично: при требуемомamount_out решите, сколько требуется amount_in.
Оба пути сначала расчищают заполненные ордера OpenBook (через логику, подобную MonitorStep), поэтому эффективные резервы отражают любые заполнения из предыдущего блока.
Применение комиссий
Идентично AMM v4: см.products/amm-v4/math для полного вывода.
pnl_portion идет на need_take_pnl_* и очищается администратором через WithdrawPnl. lp_portion остается в хранилище, увеличивая k и принося пользу держателям LP токенов.
MonitorStep и OpenBook
Как и в AMM v4,MonitorStep является инструкцией crankа, которая:
- Расчищает ожидающие заполнения ордеров OpenBook (перемещает токены из хранилищ в пул).
- Обновляет
AmmInfo.target_ordersс новой сеткой слотов лимитных ордеров. - Публикует новую сетку на OpenBook.
MonitorStep: ~150k–180k CU (аналогично AMM v4).
Резюме: почему это работает
Дизайн таблицы поиска + интерполяция является эффективным и гибким:- Эффективность: двоичный поиск O(log 50,000) ≈ 16 итераций, каждая ~ 300–500 CU. Интерполяция — несколько умножений/делений. Общая стоимость котировки ~5k–15k CU, намного дешевле, чем перевычисление формулы при каждом swap.
- Гибкость: администратор может кодировать любую кусочно-линейную кривую. Пары стейблкойнов получают высокую плотность около 1:1; обеспеченные пары получают пользовательские кривые.
- Совместимость с OpenBook: та же логика
MonitorStep/TargetOrdersиз AMM v4 применима. Обнаружение цены через таблицу питает поколение сетки ордеров.
raydium-stable/program/src/state.rs, методы get_data_by_x, get_data_by_y, get_dy_by_dx_base_in и т.д.
Что дальше
- Accounts — справочник полей
ModelDataInfoиDataElement. - Instructions —
InitModelData,UpdateModelDataдля заполнения таблицы. - Fees — применение комиссий и
WithdrawPnl. products/amm-v4/math— для логики определения цены ордеров OpenBook с учетом комиссий.
raydium-stable/program/src/state.rs(реализации интерполяции и двоичного поиска)raydium-stable/program/src/math.rs(утилиты калькулятора)


