Saltar al contenido principal

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.

Esta página fue traducida automáticamente por IA. La versión en inglés es la fuente autorizada.Ver versión en inglés →
Stable AMM comparte la estructura de cuentas del lado del pool de AMM v4 (AmmInfo, bóvedas, autoridad) y además requiere una cuenta ModelDataInfo que almacena la tabla de búsqueda. Esta página cubre ambas.

Inventario

Un pool de Stable AMM se vincula exactamente a un mercado de OpenBook. El inventario completo refleja AMM v4 de cerca:
CategoríaCuentaPropietarioFunción
PoolAmmInfoPrograma StableEstado del pool, referencias a bóvedas, OpenBook y cuenta de datos del modelo.
Poolamm_authorityPrograma StablePDA propiedad del programa que firma los movimientos de bóvedas. Compartida entre todos los pools de Stable AMM.
Poolamm_open_ordersOpenBookLa cuenta OpenOrders de OpenBook del pool.
Poolamm_target_ordersPrograma StableGrid del lado del pool para órdenes limitadas.
Poolpool_coin_token_accountToken SPLBóveda del lado coin del pool.
Poolpool_pc_token_accountToken SPLBóveda del lado pc del pool.
Poollp_mintToken SPLMint de LP fungible.
Modelomodel_data_accountPrograma StableLa tabla de búsqueda: 50.000 × DataElement.
Mercadoserum_marketOpenBookMercado de OpenBook.
Mercadoserum_bids, serum_asksOpenBookColas de ofertas/demandas.
Mercadoserum_event_queueOpenBookCola de eventos.
Mercadoserum_coin_vault, serum_pc_vaultToken SPLBóvedas de nivel de mercado de OpenBook.
Mercadoserum_vault_signerOpenBookFirmante de bóveda a nivel de mercado.

AmmInfo

Cuenta de estado raíz. La disposición es casi idéntica a AMM v4 — parámetros del pool, decimales, fees, referencias de bóvedas/mint — con una adición: un campo model_data_key que apunta a la tabla de búsqueda.
// 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,            // OpenBook OpenOrders
    pub serum_market: Pubkey,
    pub serum_program: Pubkey,
    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,
}
Campos clave para integradores:
  • model_data_key — la dirección de la tabla de búsqueda. Debe pasarse a cada instrucción.
  • fees — estructura idéntica a AMM v4. Por defecto 0.25% de fee de trading, 0.22% LP / 0.03% split de protocolo.
  • coin_vault, pc_vault — las bóvedas del pool.
  • status — bitmask que controla si swap/deposit/withdraw/crank están habilitados.
  • out_put.need_take_pnl_* — barridas por WithdrawPnl.

ModelDataInfo

La tabla de búsqueda. Un arreglo disperso grande de puntos de precio/cantidad.
// 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
}
Ciclo de vida:
  1. InitModelData crea la cuenta y establece status = Initialized, multiplier = <admin-provided>, valid_data_count = 0.
  2. UpdateModelData (invocada hasta 5 veces por transacción) puebla elementos mediante:
    • Entrada: arreglo de pares (index: u64, DataElement).
    • Escribe cada uno en elements[index].
    • Incrementa valid_data_count si index >= valid_data_count.
  3. Swap/deposit/withdraw llaman funciones de búsqueda que buscan binariamente e interpolan dentro de elements[0..valid_data_count].

DataElement

La entrada atómica en la tabla. Debe estar ordenada (x ascendente, y descendente, precio ascendente) para que la búsqueda binaria funcione.
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)
}
Al poblar la tabla, el administrador especifica estas pre-escaladas. El programa no valida el orden de clasificación en cadena (por velocidad), por lo que la clasificación incorrecta causa cotizaciones incorrectas.

Autoridad y bóvedas

Igual que AMM v4:
  • amm_authority es una PDA única a nivel de programa derivada con semilla ["amm authority"]. Posee todas las bóvedas del pool y firma sus movimientos.
  • Bóvedas son cuentas de Token SPL cuyo propietario es amm_authority, no ATAs.
Token-2022 no es compatible.

Bitmask de estado

Idéntico a AMM v4. Controla si swap/deposit/withdraw/crank están habilitados.

Seguimiento de fees y PnL

Igual que AMM v4. La estructura out_put rastrea:
  • need_take_pnl_coin, need_take_pnl_pc — fees de protocolo acumulados pero aún no barridos. WithdrawPnl los saca.
  • swap_coin_in_amount, swap_pc_in_amount, etc. — contadores analíticos.

Tamaño de la cuenta

ModelDataInfo es grande (~1.2 MB, ya que 50.000 elementos × 24 bytes por elemento). Por eso crear un pool de Stable requiere asignación explícita de renta y pre-asignación de cuenta. El SDK de Raydium y herramientas manejan esto de forma transparente; los integradores rara vez necesitan asignar manualmente.

Derivar cuentas desde cero

Como AMM v4, Stable AMM usa claves sembradas (no PDAs puras). La identidad del pool canónica se deriva mediante:
ammId = createWithSeed(
  owner: ammAuthority,
  seed: marketPubkey.toBase58().slice(0, 32),
  programId: STABLE_PROGRAM_ID,
)
Similarmente para bóvedas, LP mint, órdenes objetivo, etc. En la práctica, usa el SDK o API para obtener direcciones pre-computadas.

Qué leer dónde

Fuentes: