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

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.

هذه الصفحة مُترجَمة آليًا بواسطة الذكاء الاصطناعي. النسخة الإنجليزية هي المرجع المعتمد.عرض النسخة الإنجليزية →
AMM v4 يتطلب عددًا كبيرًا من الحسابات مقارنة بـ CPMM أو CLMM لأن كل عملية تؤثر على حالة OpenBook. تجمع هذه الصفحة الحسابات في قسمي “مملوكة للمجمع” و “مملوكة لـ OpenBook” حتى يتمكن المدمج من الرؤية السريعة للفرق بينهما.

الجرد

يرتبط مجمع AMM v4 بسوق OpenBook واحد بالضبط عند الإنشاء. الصورة الحية الكاملة هي:
الفئةالحسابالمالكالدور
المجمعAmmInfoبرنامج AMM v4حالة المجمع: الرسوم المستحقة والحالة والمراجع للمخازن وسوق OpenBook.
المجمعamm_authorityبرنامج AMM v4PDA مملوك للبرنامج يوقع حركات المخزن. مشترك في جميع مجمعات AMM v4.
المجمعamm_open_ordersOpenBookحساب OpenOrders لمجمع AMM على OpenBook لهذا السوق.
المجمعamm_target_ordersبرنامج AMM v4شبكة جانب المجمع لأوامر الحد المستهدفة للنشر على OpenBook.
المجمعpool_coin_token_accountSPL Tokenمخزن جانب العملة للمجمع (ATA من amm_authority).
المجمعpool_pc_token_accountSPL Tokenمخزن جانب pc للمجمع.
المجمعlp_mintSPL Tokenدعك LP القابل للتبادل.
المجمعpool_withdraw_queueبرنامج AMM v4قائمة انتظار موروثة للسحب المؤجل؛ تُبقى على طول صفري.
المجمعpool_temp_lpبرنامج AMM v4حساب LP مساعد يُستخدم أثناء Initialize.
السوق (OpenBook)serum_marketOpenBookالسوق نفسه (دعك البداية/الاقتباس والموقع الموثوق وما إلى ذلك).
السوقserum_bids, serum_asksOpenBookقائمات الطلب والعرض.
السوقserum_event_queueOpenBookالأحداث المعلقة (الملءات والإلغاءات).
السوقserum_coin_vault, serum_pc_vaultSPL Tokenمخازن مستوى السوق في OpenBook.
السوقserum_vault_signerOpenBookPDA على مستوى السوق يوقع حركات serum_*_vault.
ملاحظة: يتم الاحتفاظ بـ “serum” كبادئة في IDL واسم الحقول في AMM v4 للتوافق العكسي. يشير إلى سوق OpenBook اليوم.

AmmInfo

حساب الحالة الجذري للمجمع. كبير (≈ 752 بايت) لأنه يحمل مراجع المجمع و OpenBook مباشرة.
// programs/amm/src/state.rs (مختصر؛ ترتيب الحقول والأسماء تتبع IDL)
pub struct AmmInfo {
    pub status: u64,           // bitmask: swap/deposit/withdraw/crank enabled
    pub nonce:  u64,           // bump used to derive amm_authority
    pub order_num: u64,
    pub depth: u64,
    pub coin_decimals: u64,
    pub pc_decimals:   u64,
    pub state:         u64,    // internal state machine
    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 market
    pub pc_lot_size:   u64,
    pub min_price_multiplier: u64,
    pub max_price_multiplier: u64,
    pub sys_decimal_value: u64,

    pub fees: Fees,            // trade/protocol/fund fee rates
    pub state_data: StateData,

    // Pool-owned accounts:
    pub coin_vault: Pubkey,
    pub pc_vault:   Pubkey,
    pub coin_vault_mint: Pubkey,
    pub pc_vault_mint:   Pubkey,
    pub lp_mint:  Pubkey,
    pub open_orders: Pubkey,   // pool's OpenOrders on OpenBook
    pub market: Pubkey,        // OpenBook market
    pub market_program: Pubkey, // OpenBook program ID
    pub target_orders: Pubkey,
    pub withdraw_queue: Pubkey,
    pub lp_vault:       Pubkey, // = pool_temp_lp
    pub owner: Pubkey,          // admin (multisig)
    pub lp_reserve: u64,
    pub padding: [u64; 3],
}

pub struct Fees {
    pub min_separate_numerator:   u64,     // 5
    pub min_separate_denominator: u64,     // 10_000
    pub trade_fee_numerator:      u64,     // 25  → used by OpenBook integration
    pub trade_fee_denominator:    u64,     // 10_000
    pub pnl_numerator:            u64,     // 12  → protocol's share OF the swap fee
    pub pnl_denominator:          u64,     // 100 → so 12/100 = 12% of fee, = 0.03% of volume
    pub swap_fee_numerator:       u64,     // 25  → 0.25% gross swap fee
    pub swap_fee_denominator:     u64,     // 10_000
}

pub struct StateData {
    pub need_take_pnl_coin: u64,
    pub need_take_pnl_pc:   u64,
    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_acc_pc_fee:    u64,
    pub swap_pc_in_amount:  u128,
    pub swap_coin_out_amount: u128,
    pub swap_acc_coin_fee:  u64,
}
حقول موجهة للمدمج:
  • coin_vault، pc_vault — مخازن SPL Token للمجمع. coin هو token_0 بحسب اتفاقية Serum/OpenBook (البداية)، pc هو token_1 (الاقتباس).
  • coin_decimals، pc_decimals — مطابقة الدعك.
  • open_orders، target_orders، market — يجب تمريرها لكل تعليمات swap/deposit/withdraw.
  • fees.swap_fee_numerator / swap_fee_denominator — الرسم التجاري المجمع. الافتراضي 25 / 10_000 = 0.25%.
  • status — bitmask يتحكم في العمليات. قابل للتعيين من قبل المسؤول عبر AdminSetStatus.
  • state_data.need_take_pnl_* — الفرق بين الرسوم المتراكمة الإجمالية وما تم نسفه. TakePnl يصفرها.

توصيل OpenBook

لم تعد نشطة. لا تشارك مجمعات AMM v4 السيولة مع OpenBook — تم إلغاء شبكة أوامر الحد. تبقى حسابات OpenBook الموضحة في هذا القسم على AmmInfo لكل مجمع وتظل مثبتة بواسطة نقاط نهاية V1 swap (وبواسطة Initialize و Deposit و Withdraw) من أجل التوافق العكسي، لكن حالة على الكتاب التي تشير إليها فارغة في الممارسة. استخدم نقاط نهاية V2 swap (SwapBaseInV2 / SwapBaseOutV2) التي تتخطى هذه الحسابات تماماً وتمثل مسار التنفيذ الكنسي اليوم.
عند استدعاء أي تعليمات V1 قراءة أو كتابة على مجمع AMM v4، يجب عليك تمرير حسابات OpenBook. يعيد البرنامج اشتقاقها والتحقق منها، لذا فإن تمرير مجموعة غير متطابقة ينعكس. (متغيرات V2 swap لا تتطلب هذه الحسابات على الإطلاق.)
const market = ...;  // OpenBook market PublicKey

// Fields OpenBook exposes on its market account:
const marketDecoded = OpenBookMarket.decode(marketAccountData);
const {
  bids:           serumBids,
  asks:           serumAsks,
  eventQueue:     serumEventQueue,
  requestQueue:   serumRequestQueue,
  baseVault:      serumCoinVault,
  quoteVault:     serumPcVault,
  vaultSignerNonce,
} = marketDecoded;

const serumVaultSigner = PublicKey.createProgramAddressSync(
  [market.toBuffer(), u64ToBytes(vaultSignerNonce)],
  OPENBOOK_PROGRAM_ID,
);
amm_open_orders للمجمع هو حساب مملوك لـ OpenBook يحتوي على حالة أوامر الحد للمجمع على هذا السوق: الأوامر النشطة والأرصدة المتسوية والمحيلون وما إلى ذلك. amm_target_orders من جانب AMM: يحتوي على الشبكة المقصودة للمجمع (السعر/الحجم لكل فتحة أمر) حتى يتمكن البرنامج من المقارنة الرخيصة مع ما يتم نشره حالياً ووضع / إلغاء الفرق.

PDAs للسلطة

هناك amm_authority PDA واحد بالضبط للبرنامج AMM v4 بأكمله. البذرة الخاصة به بسيطة (["amm authority"]) ويتم تخزين الرفع الخاص به على كل AmmInfo. توقع هذه السلطة جميع حركات الرموز لجميع مجمعات AMM v4.
const AMM_V4_PROGRAM_ID = new PublicKey(
  "675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8",
);
const [ammAuthority] = PublicKey.findProgramAddressSync(
  [Buffer.from("amm authority")],
  AMM_V4_PROGRAM_ID,
);
هناك سلطة منفصلة محدود النطاق بالمجمع مشتقة لكل مجمع لتوقيع عمليات OpenBook (amm_authority أعلاه تغطي في الواقع كليهما في تصميم هذا البرنامج؛ استخدمت الإصدارات المختلفة الاشتقاق المختلف، لذا تحقق من AmmInfo.nonce للمجمع المحدد في الكود).

المخازن

مخازن SPL Token للمجمع هي حسابات رموز قياسية الملكية amm_authority. ليست ATAs — عناوينهم PDAs محددة مشتقة في Initialize مع بذور ["amm_associated_seed", coin_mint_or_pc_mint, market, amm_id]. يتم تخزين العناوين على AmmInfo؛ الاشتقاق فضول لمرة واحدة فقط. Token-2022 غير مدعوم. يحمّل البرنامج معرف برنامج SPL Token لجميع حركات المخزن. محاولة ربط مجمع AMM v4 بـ Token-2022 mint تفشل في Initialize.

دعك LP

دعك SPL Token كلاسيكي سلطته amm_authority. إجمالي العرض يتتبع ملكية LP للمجمع؛ حرق LP يرجع الرموز من كلا المخزنين بشكل احترافي. لأن AMM v4 سبق CPMM، لا توجد مرآة lp_supply في حالة المجمع — اقرأ العرض المشغول للدعك مباشرة على السلسلة.

قناع الحالة

AmmInfo.status يتحكم في العمليات. البتات (قد يختلف الموضع عبر إصدارات البرنامج — تأكد عبر المصدر):
البتالرايةالتأثير
0SWAP_DISABLEDيرفض Swap*.
1DEPOSIT_DISABLEDيرفض Deposit.
2WITHDRAW_DISABLEDيرفض Withdraw.
3CLMM_LIKE_MIGRATEعلم بوابة الهجرة الذي تستخدمه العمليات.
تعيّن Raydium multisig هذه عبر AdminCancelOrders و AdminSetParams وغيرها.

الملاحظة / الأوراكل

AMM v4 لا يملك حساب ملاحظة مخصص. البروتوكولات الأخرى التي تحتاج إلى TWAP على السلسلة عادة تستهلك عبورات كتاب OpenBook بشكل غير مباشر أو اقرأ من السلسلة. إذا كنت بحاجة إلى Raydium TWAP مع دعم البرنامج، استخدم CPMM أو CLMM.

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

لأن AMM v4 لم تُصمم لـ PDAs محددة حتمية لكل زوج (سبق أن أتى قبل هذا الاتفاق Solana)، يكون amm_id الكنسي مفتاح seeded مشتق مع:
ammId = createWithSeed(
  owner: ammAuthority,
  seed:  marketPubkey.toBase58().slice(0, 32),
  programId: AMM_V4_PROGRAM_ID,
)
ينطبق نفس نمط seeded-key على amm_open_orders و amm_target_orders و amm_withdraw_queue و pool_temp_lp و pool_coin_token_account و pool_pc_token_account و lp_mint. SDK والـ API تقوم بحساب مسبق لك؛ انظر raydium-sdk-v2 في Liquidity.getAssociatedPoolKeys. في الممارسة العملية، يقرأ المدمجون مجموعة الحساب الكاملة للمجمع من GET https://api-v3.raydium.io/pools/info/ids?ids=<POOL_ID> أو من SDK. الاشتقاق اليدوي نادراً ما يكون مطلوباً.

مرجع دورة الحياة السريع

الحدثالحسابات المنشأةالحسابات المحذوفة
Initialize2amm_info و amm_open_orders و amm_target_orders والمخازن و lp_mint و pool_withdraw_queue و pool_temp_lp
Deposit— (قد تنشئ user LP ATA)
Withdraw
SwapBaseIn / SwapBaseOut— (قد تنشئ user ATA)
TakePnl
MonitorStep (crank)
المجمعات وحساباتها تستمر إلى الأبد. حتى لو تم السحب الكامل للسيولة، تبقى AmmInfo.

ما تقرأه أين

المصادر: