Langsung ke konten utama

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.

Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →
Stable AMM berbagi struktur akun sisi pool dari AMM v4 (AmmInfo, vault, authority) dan tambahan memerlukan akun ModelDataInfo yang menyimpan tabel pencarian. Halaman ini mencakup keduanya.

Inventaris

Pool Stable AMM terikat pada tepat satu pasar OpenBook. Inventaris lengkap mencerminkan AMM v4 dengan erat:
KategoriAkunPemilikPeran
PoolAmmInfoProgram StableStatus pool, referensi ke vault, OpenBook, dan akun model-data.
Poolamm_authorityProgram StablePDA milik program yang menandatangani pergerakan vault. Dibagikan di semua pool Stable AMM.
Poolamm_open_ordersOpenBookAkun OpenOrders OpenBook pool.
Poolamm_target_ordersProgram StableGrid sisi pool untuk limit order.
Poolpool_coin_token_accountSPL TokenVault sisi coin pool.
Poolpool_pc_token_accountSPL TokenVault sisi pc pool.
Poollp_mintSPL TokenMint LP yang dapat dipertukarkan.
Modelmodel_data_accountProgram StableTabel pencarian: 50.000 × DataElement.
Pasarserum_marketOpenBookPasar OpenBook.
Pasarserum_bids, serum_asksOpenBookAntrian bid/ask.
Pasarserum_event_queueOpenBookAntrian peristiwa.
Pasarserum_coin_vault, serum_pc_vaultSPL TokenVault tingkat pasar OpenBook.
Pasarserum_vault_signerOpenBookPenandatangan vault tingkat pasar.

AmmInfo

Akun status root. Tata letaknya hampir identik dengan AMM v4 — parameter pool, desimal, biaya, referensi vault/mint — dengan satu penambahan: bidang model_data_key yang menunjuk ke tabel pencarian.
// raydium-stable/program/src/state.rs (ringkas)
pub struct AmmInfo {
    pub account_type: u64,              // = 0 (AmmAccount)
    pub status: u64,                    // bitmask: swap/deposit/withdraw/crank enabled
    pub nonce: u64,                     // bump untuk amm_authority
    pub order_num: u64,
    pub depth: u64,
    pub coin_decimals: u64,
    pub pc_decimals: u64,
    pub state: u64,                     // mesin status (IdleState, dll)
    pub reset_flag: u64,
    pub min_size: u64,
    pub vol_max_cut_ratio: u64,
    pub amount_wave: u64,
    pub coin_lot_size: u64,             // cermin 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,                     // lihat di bawah
    pub out_put: OutPutData,            // PnL, swap, jumlah hukuman
    
    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,         // ← TABEL PENCARIAN
    pub open_orders: Pubkey,            // OpenOrders OpenBook
    pub serum_market: Pubkey,
    pub serum_program: Pubkey,
    pub target_orders: Pubkey,
    pub amm_admin: Pubkey,              // kunci admin
    pub client_order_id: u64,
    pub lp_amount: u64,                 // pasokan LP
    pub lp_net: u64,                    // metrik nilai 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% dari biaya = 0,03% dari volume
    pub swap_fee_numerator: u64,        // 25
    pub swap_fee_denominator: u64,      // 10_000
}

pub struct OutPutData {
    pub need_take_pnl_coin: u64,        // biaya protokol terakumulasi (coin)
    pub need_take_pnl_pc: u64,          // biaya protokol terakumulasi (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,
}
Bidang yang menghadap integrator:
  • model_data_key — alamat tabel pencarian. Harus dilewatkan ke setiap instruksi.
  • fees — struktur identik dengan AMM v4. Default ke biaya perdagangan 0,25%, LP 0,22% / pembagian protokol 0,03%.
  • coin_vault, pc_vault — vault pool.
  • status — bitmask yang mengontrol swap/deposit/withdraw/crank.
  • out_put.need_take_pnl_* — disapu oleh WithdrawPnl.

ModelDataInfo

Tabel pencarian. Larik jarang besar dari titik harga/kuantitas.
// raydium-stable/program/src/state.rs
pub const ELEMENT_SIZE: usize = 50000;

pub struct DataElement {
    pub x: u64,         // X tabel (mis., jumlah coin)
    pub y: u64,         // Y tabel (mis., jumlah pc)
    pub price: u64,     // harga di (x, y)
}

pub struct ModelDataInfo {
    pub account_type: u64,              // = 2 (ModleDataAccount)
    pub status: u64,                    // Initialized atau Uninitialized
    pub multiplier: u64,                // faktor skala untuk x, y (mis., 10^6)
    pub valid_data_count: u64,          // berapa banyak elemen yang terisi
    pub elements: [DataElement; 50000], // tabel itu sendiri
}
Siklus hidup:
  1. InitModelData membuat akun dan menetapkan status = Initialized, multiplier = <admin-provided>, valid_data_count = 0.
  2. UpdateModelData (dipanggil hingga 5 kali per transaksi) mengisi elemen melalui:
    • Input: larik pasangan (index: u64, DataElement).
    • Menulis masing-masing ke elements[index].
    • Menambah valid_data_count jika index >= valid_data_count.
  3. Swap/deposit/withdraw memanggil fungsi pencarian yang melakukan pencarian biner dan interpolasi dalam elements[0..valid_data_count].

DataElement

Entri atomik dalam tabel. Harus diurutkan (x naik, y turun, harga naik) agar pencarian biner berfungsi.
pub struct DataElement {
    pub x: u64,         // Koordinat X (mis., saldo token_a, diskalakan oleh multiplier)
    pub y: u64,         // Koordinat Y (mis., saldo token_b, diskalakan oleh multiplier)
    pub price: u64,     // harga (x/y dalam bentuk terukur, diskalakan oleh multiplier)
}
Saat mengisi tabel, admin menentukan ini pra-skalakan. Program tidak memvalidasi urutan sortir di-chain (untuk kecepatan), jadi missorting menyebabkan penawaran yang tidak benar.

Authority dan vault

Sama dengan AMM v4:
  • amm_authority adalah PDA satu program yang diturunkan dengan seed ["amm authority"]. Ini memiliki semua vault pool dan menandatangani pergerakan mereka.
  • Vault adalah akun SPL Token yang pemiliknya adalah amm_authority, bukan ATA.
Token-2022 tidak didukung.

Bitmask status

Identik dengan AMM v4. Mengontrol apakah swap/deposit/withdraw/crank diaktifkan.

Pelacakan biaya dan PnL

Sama dengan AMM v4. Struct out_put melacak:
  • need_take_pnl_coin, need_take_pnl_pc — biaya protokol terakumulasi tetapi belum disapu. WithdrawPnl memindahkannya keluar.
  • swap_coin_in_amount, swap_pc_in_amount, dll. — penghitung analitik.

Ukuran akun

ModelDataInfo berukuran besar (~1,2 MB, karena 50.000 elemen × 24 byte per elemen). Ini adalah alasan mengapa membuat pool Stable memerlukan rent eksplisit dan pra-alokasi akun. SDK dan alat Raydium menangani ini secara transparan; integrator jarang perlu mengalokasikan secara manual. Seperti AMM v4, Stable AMM menggunakan kunci berbiji (bukan PDA murni). Identitas pool kanonis diturunkan melalui:
ammId = createWithSeed(
  owner: ammAuthority,
  seed: marketPubkey.toBase58().slice(0, 32),
  programId: STABLE_PROGRAM_ID,
)
Demikian pula untuk vault, LP mint, target order, dll. Dalam praktiknya, gunakan SDK atau API untuk mengambil alamat yang telah dihitung sebelumnya.

Apa yang dibaca di mana

Sumber: