Перейти к основному содержанию

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 использует ту же структуру учетных записей пула, что и AMM v4 (AmmInfo, хранилища, authority), но дополнительно требует учетную запись ModelDataInfo, в которой хранится таблица поиска. На этой странице рассматриваются обе.

Перечень

Пул Stable AMM привязан ровно к одному рынку OpenBook. Полный перечень учетных записей почти идентичен AMM v4:
КатегорияУчетная записьВладелецРоль
ПулAmmInfoПрограмма StableСостояние пула, ссылки на хранилища, OpenBook и учетную запись данных модели.
Пулamm_authorityПрограмма StableУправляемый программой PDA, подписывающий передачи хранилища. Общая для всех пулов Stable AMM.
Пулamm_open_ordersOpenBookУчетная запись OpenBook OpenOrders пула.
Пулamm_target_ordersПрограмма StableТаблица лимит-ордеров со стороны пула.
Пулpool_coin_token_accountSPL TokenХранилище пула со стороны coin.
Пулpool_pc_token_accountSPL TokenХранилище пула со стороны pc.
Пулlp_mintSPL TokenМинт LP-токена.
Модельmodel_data_accountПрограмма StableТаблица поиска: 50 000 × DataElement.
Рынокserum_marketOpenBookРынок OpenBook.
Рынокserum_bids, serum_asksOpenBookОчереди лучших предложений и спроса.
Рынокserum_event_queueOpenBookОчередь событий.
Рынокserum_coin_vault, serum_pc_vaultSPL TokenХранилища рынка уровня OpenBook.
Рынокserum_vault_signerOpenBookПодписант хранилища уровня рынка.

AmmInfo

Корневая учетная запись состояния. Структура практически идентична AMM v4 — параметры пула, десятичные разряды, комиссии, ссылки на хранилища и минт — с одним добавлением: поле model_data_key, указывающее на таблицу поиска.
// raydium-stable/program/src/state.rs (сокращенно)
pub struct AmmInfo {
    pub account_type: u64,              // = 0 (AmmAccount)
    pub status: u64,                    // маска: включены swap/deposit/withdraw/crank
    pub nonce: u64,                     // bump для amm_authority
    pub order_num: u64,
    pub depth: u64,
    pub coin_decimals: u64,
    pub pc_decimals: u64,
    pub state: u64,                     // машина состояний (IdleState и т.д.)
    pub reset_flag: u64,
    pub min_size: u64,
    pub vol_max_cut_ratio: u64,
    pub amount_wave: u64,
    pub coin_lot_size: u64,             // зеркалирует OpenBook
    pub pc_lot_size: u64,
    pub min_price_multiplier: u64,
    pub max_price_multiplier: u64,
    pub sys_decimal_value: u64,
    pub abort_trade_factor: u64,
    pub price_tick_multiplier: u64,
    pub price_tick: u64,
    
    pub fees: Fees,                     // см. ниже
    pub out_put: OutPutData,            // PnL, своп, суммы штрафа
    
    pub coin_vault: Pubkey,
    pub pc_vault: Pubkey,
    pub coin_mint: Pubkey,
    pub pc_mint: Pubkey,
    pub lp_mint: Pubkey,
    pub model_data_key: Pubkey,         // ← ТАБЛИЦА ПОИСКА
    pub open_orders: Pubkey,            // OpenBook OpenOrders
    pub serum_market: Pubkey,
    pub serum_program: Pubkey,
    pub target_orders: Pubkey,
    pub amm_admin: Pubkey,              // ключ администратора
    pub client_order_id: u64,
    pub lp_amount: u64,                 // предложение LP
    pub lp_net: u64,                    // метрика стоимости LP
    pub padding: [u64; 61],
}

pub struct Fees {
    pub min_separate_numerator: u64,
    pub min_separate_denominator: u64,
    pub trade_fee_numerator: u64,       // 25
    pub trade_fee_denominator: u64,     // 10_000 → 0.25%
    pub pnl_numerator: u64,             // 12
    pub pnl_denominator: u64,           // 100 → 12% комиссии = 0.03% объема
    pub swap_fee_numerator: u64,        // 25
    pub swap_fee_denominator: u64,      // 10_000
}

pub struct OutPutData {
    pub need_take_pnl_coin: u64,        // начисленная комиссия протокола (coin)
    pub need_take_pnl_pc: u64,          // начисленная комиссия протокола (pc)
    pub total_pnl_pc: u64,
    pub total_pnl_coin: u64,
    pub pool_open_time: u64,
    pub punish_pc_amount: u64,
    pub punish_coin_amount: u64,
    pub orderbook_to_init_time: u64,
    pub swap_coin_in_amount: u128,
    pub swap_pc_out_amount: u128,
    pub swap_pc_in_amount: u128,
    pub swap_coin_out_amount: u128,
    pub swap_pc_fee: u64,
    pub swap_coin_fee: u64,
}
Ключевые поля для интеграторов:
  • model_data_key — адрес таблицы поиска. Должен передаваться каждой инструкции.
  • fees — идентична структуре AMM v4. По умолчанию 0.25% комиссия за сделку, разделение 0.22% LP / 0.03% протокол.
  • coin_vault, pc_vault — хранилища пула.
  • status — маска, ограничивающая swap/deposit/withdraw/crank.
  • out_put.need_take_pnl_* — выбирается WithdrawPnl.

ModelDataInfo

Таблица поиска. Большой разреженный массив точек цены/количества.
// raydium-stable/program/src/state.rs
pub const ELEMENT_SIZE: usize = 50000;

pub struct DataElement {
    pub x: u64,         // таблица X (напр., количество coin)
    pub y: u64,         // таблица Y (напр., количество pc)
    pub price: u64,     // цена в точке (x, y)
}

pub struct ModelDataInfo {
    pub account_type: u64,              // = 2 (ModleDataAccount)
    pub status: u64,                    // Initialized или Uninitialized
    pub multiplier: u64,                // масштабный коэффициент для x, y (напр., 10^6)
    pub valid_data_count: u64,          // сколько элементов заполнено
    pub elements: [DataElement; 50000], // сама таблица
}
Жизненный цикл:
  1. InitModelData создает учетную запись и устанавливает status = Initialized, multiplier = <предоставлено-администратором>, valid_data_count = 0.
  2. UpdateModelData (вызывается до 5 раз за транзакцию) заполняет элементы через:
    • Ввод: массив пар (index: u64, DataElement).
    • Записывает каждую в elements[index].
    • Увеличивает valid_data_count, если index >= valid_data_count.
  3. Swap/deposit/withdraw вызывают функции поиска, которые выполняют двоичный поиск и интерполяцию в пределах elements[0..valid_data_count].

DataElement

Атомарная запись в таблице. Должна быть отсортирована (x возрастает, y убывает, цена возрастает) для корректной работы двоичного поиска.
pub struct DataElement {
    pub x: u64,         // координата X (напр., баланс token_a, масштабирован множителем)
    pub y: u64,         // координата Y (напр., баланс token_b, масштабирован множителем)
    pub price: u64,     // цена (x/y в масштабированной форме, масштабирована множителем)
}
При заполнении таблицы администратор указывает эти значения уже масштабированными. Программа не проверяет порядок сортировки на цепи (для скорости), поэтому неправильная сортировка приводит к неверным котировкам.

Authority и хранилища

Аналогично AMM v4:
  • amm_authority — единственный программный PDA, полученный с сидом ["amm authority"]. Владеет всеми хранилищами пула и подписывает их перемещения.
  • Хранилища — это счета SPL Token, владелец которых amm_authority, а не ATA.
Token-2022 не поддерживается.

Маска статуса

Идентична AMM v4. Управляет тем, включены ли swap/deposit/withdraw/crank.

Отслеживание комиссий и PnL

Аналогично AMM v4. Структура out_put отслеживает:
  • need_take_pnl_coin, need_take_pnl_pc — комиссии протокола, начисленные, но еще не выбранные. WithdrawPnl выбирает их.
  • swap_coin_in_amount, swap_pc_in_amount и т.д. — счетчики аналитики.

Размер учетной записи

ModelDataInfo большой (~1.2 МБ, так как 50 000 элементов × 24 байта на элемент). Поэтому создание пула Stable требует явного выделения rent и предварительного выделения учетной записи. SDK Raydium и инструменты обрабатывают это прозрачно; интеграторам редко нужно самостоятельно выделять.

Получение учетных записей с нуля

Как и AMM v4, Stable AMM использует seeded keys (не чистые PDA). Идентификатор канонического пула получается через:
ammId = createWithSeed(
  owner: ammAuthority,
  seed: marketPubkey.toBase58().slice(0, 32),
  programId: STABLE_PROGRAM_ID,
)
Аналогично для хранилищ, LP mint, целевых ордеров и т.д. На практике используйте SDK или API для получения предварительно вычисленных адресов.

Где читать что

  • Списки учетных записей инструкций: products/stable/instructions.
  • Как интерполяция использует таблицу: products/stable/math.
  • Структура комиссий и WithdrawPnL: products/stable/fees.
  • Получение адреса учетной записи OpenBook: документация программы OpenBook.
Источники: