الانتقال إلى المحتوى الرئيسي

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 والخزانات والسلطة) ويتطلب إضافيًا حساب ModelDataInfo يخزن جدول البحث. تغطي هذه الصفحة كليهما.

الجرد

ترتبط مجموعة Stable AMM بسوق OpenBook واحد بالضبط. يعكس الجرد الكامل AMM v4 بشكل وثيق:
الفئةالحسابالمالكالدور
PoolAmmInfoبرنامج Stableحالة المجموعة والمراجع إلى الخزانات و OpenBook وحساب model-data.
Poolamm_authorityبرنامج StablePDA مملوك من البرنامج يوقّع حركات الخزانات. مشترك في جميع مجموعات Stable AMM.
Poolamm_open_ordersOpenBookحساب OpenBook OpenOrders الخاص بالمجموعة.
Poolamm_target_ordersبرنامج Stableشبكة جانب المجموعة لأوامر الحدود.
Poolpool_coin_token_accountSPL Tokenخزان جانب العملة بالمجموعة.
Poolpool_pc_token_accountSPL Tokenخزان جانب pc بالمجموعة.
Poollp_mintSPL Tokenعملة LP قابلة للاستبدال.
Modelmodel_data_accountبرنامج Stableجدول البحث: 50,000 × DataElement.
Marketserum_marketOpenBookسوق OpenBook.
Marketserum_bids، serum_asksOpenBookطوابير العروض والطلبات.
Marketserum_event_queueOpenBookقائمة الأحداث.
Marketserum_coin_vault، serum_pc_vaultSPL Tokenخزانات مستوى السوق OpenBook.
Marketserum_vault_signerOpenBookموقّع الخزان على مستوى السوق.

AmmInfo

حساب الحالة الجذري. التخطيط متطابق تقريبًا مع AMM v4 — معاملات المجموعة والعشرات والرسوم ومراجع الخزانات والعملات — مع إضافة واحدة: حقل model_data_key يشير إلى جدول البحث.
// 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,
}
الحقول الرئيسية الموجهة للمدمجين:
  • model_data_key — عنوان جدول البحث. يجب تمريره إلى كل تعليمة.
  • fees — بنية متطابقة مع AMM v4. الافتراضيات هي رسم تداول 0.25٪، تقسيم LP / protocol بـ 0.22٪ / 0.03٪.
  • coin_vault، pc_vault — خزانات المجموعات.
  • status — bitmask يتحكم في 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,         // 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
}
دورة الحياة:
  1. InitModelData ينشئ الحساب ويعيّن status = Initialized و multiplier = <admin-provided> و 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 تنازلي، price تصاعدي) لكي يعمل البحث الثنائي.
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)
}
عند ملء الجدول، يحدد المسؤول هذه قبل المقياس. البرنامج لا يتحقق من ترتيب الفرز على السلسلة (للسرعة)، لذا الترتيب الخاطئ يسبب عروضًا أسعار غير صحيحة.

السلطة والخزانات

نفس AMM v4:
  • amm_authority هو PDA واحد على مستوى البرنامج مشتق برمز ["amm authority"]. يملك جميع خزانات المجموعة ويوقّع حركاتها.
  • الخزانات هي حسابات SPL Token يملكها amm_authority، وليست ATAs.
Token-2022 غير مدعوم.

bitmask الحالة

متطابق مع AMM v4. يتحكم في ما إذا كانت swap/deposit/withdraw/crank مفعّلة.

تتبع الرسوم و PnL

نفس AMM v4. يتتبع struct 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 يتطلب تخصيص إيجار حساب واضح. يتعامل SDK و أدوات Raydium مع هذا بشفافية؛ نادرًا ما يحتاج المدمجون إلى تخصيص يدوي.

اشتقاق الحسابات من الصفر

مثل AMM v4، يستخدم Stable AMM مفاتيح مزروعة (وليس PDAs نقية). يتم اشتقاق هوية المجموعة الكنسية عبر:
ammId = createWithSeed(
  owner: ammAuthority,
  seed: marketPubkey.toBase58().slice(0, 32),
  programId: STABLE_PROGRAM_ID,
)
وبالمثل للخزانات وعملة LP والأوامر المستهدفة، إلخ. في الممارسة العملية، استخدم SDK أو API لجلب العناوين المحسوبة مسبقًا.

ما يجب قراءته أين

المصادر: