> ## 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

> AmmInfo, ModelDataInfo, DataElement, Fees и структура хранилищ. Полный реестр счетов пула Stable AMM (автономная программа чистого AMM от Raydium).

<Info>
  **Эта страница переведена с помощью ИИ. За эталон принимается английская версия.**

  [Открыть английскую версию →](/products/stable/accounts)
</Info>

<Info>
  Stable AMM — это отдельная программа; её структура счетов на стороне пула напоминает AMM v4 (AmmInfo, хранилища, authority), и дополнительно содержит счет `ModelDataInfo`, в котором хранится таблица поиска. На этой странице рассматриваются оба компонента.
</Info>

## Реестр

<Note>
  **Чистый AMM.** Stable AMM хранит всю ликвидность в собственных хранилищах и не зависит от OpenBook. На ранних этапах в нём была реализована интеграция с OpenBook для маркет-мейкинга, но эта функция была неактивна в течение многих лет, и [обновление от 2026-06-22](/ru/reference/changelog) удалило оставшийся код. Счета `serum_*` и `amm_open_orders` ниже являются **устаревшими**: они могут всё ещё появляться в старых транзакциях для обратной совместимости, но программа их не проверяет и не читает, а новые инструкции их полностью опускают.
</Note>

Активный реестр теперь полностью находится на стороне пула:

| Категория  | Счет                                 | Владелец         | Роль                                                                                               |
| ---------- | ------------------------------------ | ---------------- | -------------------------------------------------------------------------------------------------- |
| Пул        | `AmmInfo`                            | Программа Stable | Состояние пула, ссылки на хранилища и счет данных модели.                                          |
| Пул        | `amm_authority`                      | Программа Stable | Управляемый программой PDA, подписывающий операции с хранилищами. Общий для всех пулов Stable AMM. |
| Пул        | `amm_target_orders`                  | Программа Stable | Счет сетки на стороне пула (сохранён в макетах; больше не управляет заказами OpenBook).            |
| Пул        | `pool_coin_token_account`            | SPL Token        | Хранилище пула на стороне coin.                                                                    |
| Пул        | `pool_pc_token_account`              | SPL Token        | Хранилище пула на стороне pc.                                                                      |
| Пул        | `lp_mint`                            | SPL Token        | Взаимозаменяемый минт LP.                                                                          |
| Модель     | **`model_data_account`**             | Программа Stable | **Таблица поиска: 50 000 × DataElement.**                                                          |
| Устаревшее | `amm_open_orders`                    | OpenBook         | Старый счет `OpenOrders` пула в OpenBook. **Не используется.**                                     |
| Устаревшее | `serum_market`                       | OpenBook         | Рынок OpenBook. **Не используется.**                                                               |
| Устаревшее | `serum_bids`, `serum_asks`           | OpenBook         | Очереди заявок и предложений. **Не используются.**                                                 |
| Устаревшее | `serum_event_queue`                  | OpenBook         | Очередь событий. **Не используется.**                                                              |
| Устаревшее | `serum_coin_vault`, `serum_pc_vault` | SPL Token        | Хранилища рынка OpenBook. **Не используются.**                                                     |
| Устаревшее | `serum_vault_signer`                 | OpenBook         | Подписант хранилища на уровне рынка. **Не используется.**                                          |

## `AmmInfo`

Корневой счет состояния. Макет почти идентичен AMM v4 — параметры пула, десятичные разряды, комиссии, ссылки на хранилища и минты — с одним дополнением: поле `model_data_key`, указывающее на таблицу поиска.

```rust theme={null}
// raydium-stable/program/src/state.rs (abridged)
pub struct AmmInfo {
    pub account_type: u64,              // = 0 (AmmAccount)
    pub status: u64,                    // bitmask: swap/deposit/withdraw/crank enabled
    pub nonce: u64,                     // bump for amm_authority
    pub order_num: u64,
    pub depth: u64,
    pub coin_decimals: u64,
    pub pc_decimals: u64,
    pub state: u64,                     // state machine (IdleState, etc.)
    pub reset_flag: u64,
    pub min_size: u64,
    pub vol_max_cut_ratio: u64,
    pub amount_wave: u64,
    pub coin_lot_size: u64,             // mirrors 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,                     // see below
    pub out_put: OutPutData,            // PnL, swaps, punish amounts
    
    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,         // ← THE LOOKUP TABLE
    pub open_orders: Pubkey,            // legacy: OpenBook OpenOrders (unused post-decoupling)
    pub serum_market: Pubkey,           // legacy: unused post-decoupling
    pub serum_program: Pubkey,          // legacy: unused post-decoupling
    pub target_orders: Pubkey,
    pub amm_admin: Pubkey,              // admin key
    pub client_order_id: u64,
    pub lp_amount: u64,                 // LP supply
    pub lp_net: u64,                    // LP value metric
    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% of fee = 0.03% of volume
    pub swap_fee_numerator: u64,        // 25
    pub swap_fee_denominator: u64,      // 10_000
}

pub struct OutPutData {
    pub need_take_pnl_coin: u64,        // accrued protocol fee (coin)
    pub need_take_pnl_pc: u64,          // accrued protocol fee (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`

Таблица поиска. Большой разреженный массив точек цены и количества.

```rust theme={null}
// raydium-stable/program/src/state.rs
pub const ELEMENT_SIZE: usize = 50000;

pub struct DataElement {
    pub x: u64,         // table X (e.g., coin amount)
    pub y: u64,         // table Y (e.g., pc amount)
    pub price: u64,     // price at (x, y)
}

pub struct ModelDataInfo {
    pub account_type: u64,              // = 2 (ModleDataAccount)
    pub status: u64,                    // Initialized or Uninitialized
    pub multiplier: u64,                // scale factor for x, y (e.g., 10^6)
    pub valid_data_count: u64,          // how many elements are populated
    pub elements: [DataElement; 50000], // the table itself
}
```

**Жизненный цикл:**

Инструкции настройки, которые создавали эти таблицы — `InitModelData` (создавал счет) и `UpdateModelData` (заполнял элементы, устанавливая `valid_data_count`) — были **удалены в обновлении от 2026-06-22**. Таблицы в существующих пулах теперь **зафиксированы**. Во время выполнения оставшиеся вызываемые инструкции всё ещё их используют:

* **Swap / deposit / withdraw** вызывают функции поиска, которые выполняют двоичный поиск и интерполяцию в пределах `elements[0..valid_data_count]`.

## `DataElement`

Атомарная запись в таблице. Должна быть отсортирована (x по возрастанию, y по убыванию, price по возрастанию) для корректной работы двоичного поиска.

```rust theme={null}
pub struct DataElement {
    pub x: u64,         // X coordinate (e.g., token_a balance, scaled by multiplier)
    pub y: u64,         // Y coordinate (e.g., token_b balance, scaled by multiplier)
    pub price: u64,     // price (x/y in scaled form, scaled by multiplier)
}
```

При заполнении таблицы администратор указывает эти значения уже масштабированными. Программа не проверяет порядок сортировки на цепи (для скорости), поэтому неправильная сортировка приводит к неверным котировкам.

## Authority и хранилища

Аналогично AMM v4:

* **`amm_authority`** — это единый PDA на уровне программы, производный от seed `["amm authority"]`. Он владеет всеми хранилищами пула и подписывает их операции.
* **Хранилища** — это счета SPL Token, владельцем которых является `amm_authority`, а не ATA.

Token-2022 **не поддерживается**.

## Битовая маска статуса

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

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

Структура `out_put` отслеживает:

* **`need_take_pnl_coin`**, **`need_take_pnl_pc`** — комиссии протокола, накопленные, но ещё не выведенные. `WithdrawPnl` выводит их.
* **`swap_coin_in_amount`**, `swap_pc_in_amount` и т. д. — счётчики аналитики.

**Расчёт активов пула (после разделения).** Поскольку средства больше не депонируются как открытые заказы OpenBook, общие активы пула теперь вычисляются полностью из хранилищ:

```
Старое: общие активы = балансы хранилищ + средства открытых заказов (native_coin_total / native_pc_total) − ожидающий PnL (need_take_pnl)
Новое: общие активы = балансы хранилищ − ожидающий PnL (need_take_pnl)
```

Индексаторы и код котирования, которые восстанавливали стоимость пула из балансов OpenOrders, должны исключить этот компонент.

## Размер счета

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

## Вывод счетов с нуля

Как и AMM v4, Stable AMM использует **ключи с seed** (не чистые PDA). Каноническая идентификация пула производится следующим образом:

```
ammId = createWithSeed(
  owner: ammAuthority,
  seed: marketPubkey.toBase58().slice(0, 32),
  programId: STABLE_PROGRAM_ID,
)
```

Аналогично для хранилищ, LP mint, target orders и т. д. На практике используйте SDK или API для получения предварительно вычисленных адресов.

## Что читать где

* **Списки счетов инструкций**: [`products/stable/instructions`](/ru/products/stable/instructions).
* **Как интерполяция использует таблицу**: [`products/stable/math`](/ru/products/stable/math).
* **Структура комиссий и WithdrawPnl**: [`products/stable/fees`](/ru/products/stable/fees).
* **Разделение OpenBook от 2026-06-22**: [`reference/changelog`](/ru/reference/changelog).

Источники:

* [`reference/program-addresses`](/ru/reference/program-addresses)
