Langsung ke konten utama
Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →
Stable AMM adalah program tersendiri; struktur akun di sisi pool menyerupai AMM v4 (AmmInfo, vault, authority), dan secara tambahan memiliki akun ModelDataInfo yang menyimpan tabel pencarian. Halaman ini mencakup keduanya.

Inventaris

AMM murni. Stable AMM menyimpan semua likuiditas di vault miliknya sendiri dan tidak bergantung pada OpenBook. Awalnya memiliki jalur market-making OpenBook, tetapi jalur tersebut telah tidak aktif selama bertahun-tahun, dan upgrade 2026-06-22 menghapus kode sisa. Akun market serum_* dan amm_open_orders di bawah ini oleh karena itu legacy: mungkin masih muncul dalam transaksi tata letak lama untuk kompatibilitas mundur, tetapi program tidak memvalidasi atau membacanya, dan instruksi tata letak baru menghilangkannya sepenuhnya.
Inventaris aktif sekarang sepenuhnya di sisi pool:
KategoriAkunPemilikPeran
PoolAmmInfoProgram StableStatus pool, referensi ke vault dan akun model-data.
Poolamm_authorityProgram StablePDA milik program yang menandatangani pergerakan vault. Dibagikan di semua pool Stable AMM.
Poolamm_target_ordersProgram StableAkun grid di sisi pool (dipertahankan dalam tata letak; tidak lagi mendorong pesanan OpenBook).
Poolpool_coin_token_accountSPL TokenVault sisi coin pool.
Poolpool_pc_token_accountSPL TokenVault sisi pc pool.
Poollp_mintSPL TokenMint LP yang dapat ditukar.
Modelmodel_data_accountProgram StableTabel pencarian: 50.000 × DataElement.
Legacyamm_open_ordersOpenBookAkun OpenOrders OpenBook lama pool. Tidak digunakan.
Legacyserum_marketOpenBookPasar OpenBook. Tidak digunakan.
Legacyserum_bids, serum_asksOpenBookAntrian bid/ask. Tidak digunakan.
Legacyserum_event_queueOpenBookAntrian peristiwa. Tidak digunakan.
Legacyserum_coin_vault, serum_pc_vaultSPL TokenVault tingkat pasar OpenBook. Tidak digunakan.
Legacyserum_vault_signerOpenBookPenandatangan vault tingkat pasar. Tidak digunakan.

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 (diringkas)
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,             // mencerminkan 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,            // legacy: OpenBook OpenOrders (tidak digunakan pasca-decoupling)
    pub serum_market: Pubkey,           // legacy: tidak digunakan pasca-decoupling
    pub serum_program: Pubkey,          // legacy: tidak digunakan pasca-decoupling
    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 utama yang dihadapi integrator:
  • model_data_key — alamat tabel pencarian. Harus diteruskan ke setiap instruksi.
  • fees — struktur identik dengan AMM v4. Default ke biaya perdagangan 0,25%, pembagian LP 0,22% / 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,         // tabel X (misalnya, jumlah coin)
    pub y: u64,         // tabel Y (misalnya, 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 (misalnya, 10^6)
    pub valid_data_count: u64,          // berapa banyak elemen yang diisi
    pub elements: [DataElement; 50000], // tabel itu sendiri
}
Siklus hidup: Instruksi setup yang membangun tabel ini — InitModelData (membuat akun) dan UpdateModelData (mengisi elemen, menetapkan valid_data_count) — dihapus dalam upgrade 2026-06-22. Tabel di pool yang ada sekarang tetap. Pada waktu runtime, instruksi yang dapat dipanggil yang tersisa masih menggunakannya:
  • Swap / deposit / withdraw memanggil fungsi pencarian yang pencarian biner dan interpolasi dalam elements[0..valid_data_count].

DataElement

Entri atom dalam tabel. Harus diurutkan (x naik, y turun, harga naik) agar pencarian biner berfungsi.
pub struct DataElement {
    pub x: u64,         // Koordinat X (misalnya, saldo token_a, diskalakan oleh multiplier)
    pub y: u64,         // Koordinat Y (misalnya, saldo token_b, diskalakan oleh multiplier)
    pub price: u64,     // harga (x/y dalam bentuk terskalakan, diskalakan oleh multiplier)
}
Saat mengisi tabel, admin menentukan ini pra-skala. Program tidak memvalidasi urutan pengurutan on-chain (untuk kecepatan), jadi pengurutan yang salah menyebabkan kutipan yang tidak benar.

Authority dan vault

Sama seperti AMM v4:
  • amm_authority adalah PDA program-wide tunggal 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

Struct out_put melacak:
  • need_take_pnl_coin, need_take_pnl_pc — biaya protokol terakumulasi tetapi belum disapu. WithdrawPnl memindahkan ini.
  • swap_coin_in_amount, swap_pc_in_amount, dll. — penghitung analitik.
Perhitungan aset pool (pasca-decoupling). Karena tidak ada dana yang disimpan sebagai pesanan terbuka OpenBook lagi, total aset pool sekarang dihitung sepenuhnya dari vault:
Lama: total aset = saldo vault + dana pesanan terbuka (native_coin_total / native_pc_total) − PnL tertunda (need_take_pnl)
Baru: total aset = saldo vault − PnL tertunda (need_take_pnl)
Indexer dan kode kutipan yang merekonstruksi nilai pool dari saldo OpenOrders harus menghilangkan istilah itu.

Ukuran akun

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

Apa yang dibaca di mana

Sumber: