Skip to main content
هذه الصفحة مُترجَمة آليًا بواسطة الذكاء الاصطناعي. النسخة الإنجليزية هي المرجع المعتمد.عرض النسخة الإنجليزية →
معرّف البرنامج وبذور PDA لـ CPMM مدرجة بشكل قانوني في reference/program-addresses. تركز هذه الصفحة على ما يخدمه كل حساب والثوابت التي يحافظ عليها، وليس على العناوين المشفرة.

الحسابات الستة لمجمع CPMM

يتم وصف كل مجمع CPMM بالكامل بستة عناوين مشتقة من البرنامج (PDAs) تحت برنامج CPMM، بالإضافة إلى حساب AmmConfig مشترك واحد يشير إليه. بمجرد حصولك على العملتين، يمكنك اشتقاق كل شيء بشكل حتمي دون لمس الشبكة. والإعدادات المشتركة: وحساب اختياري واحد لكل منشئ:

اشتقاق مجمع من لا شيء سوى عملتين

رتّب العملات دائمًا قبل اشتقاق PDA المجمع. تقوم البذرة بتجزئة العملتين بترتيب البايت، وليس بترتيب المستخدم. مجمعان بـ (A, B) و (B, A) سيتصادمان على السلسلة — الترتيب هو كيفية جعل البرنامج للتعيين قانونيًا.
معرّف المجمع ليس دائمًا PDA القانوني. تقبل Initialize زوج مفاتيح موقّع عشوائي كـ pool_state بالإضافة إلى PDA أعلاه. إذا لم يطابق الحساب المُمرّر PDA القانوني، يتطلب البرنامج أن يكون موقّعًا — أي أن المنشئ يمرر زوج مفاتيح جديد يوقّع عليه. هذا هو دفاع front-run: أي طرف ثالث يتسابق للاستيلاء على PDA القانوني يمكن تجنبه من قبل المنشئ الشرعي باستخدام زوج مفاتيح عشوائي بدلاً من ذلك. يتم اشتقاق PDAs اللاحقة (lpMint، vault0، vault1، observation) من poolState.key()، لذا تبقى فريدة لأي عنوان تم استخدامه. عند فهرسة المجمعات، اكتشف معرّف المجمع دائمًا من الحالة على السلسلة (مثل حسابات PoolState تحت برنامج CPMM)، وليس بواسطة اشتقاق PDA القانوني — الأخير سيفتقد مجمعات زوج المفاتيح العشوائي.

تخطيطات الحسابات

التعريفات الكاملة في Rust موجودة في مصدر raydium-cp-swap. الحقول أدناه هي التي ستقرأها من التكامل.

PoolState

ما يجب قراءته فعليًا:
  • lp_supply — إجمالي LP الداخلي للمجمع. ليس مساويًا لإمداد عملة LP: إنه أعلى بـ 100 وحدة أساسية بالضبط، لأن 100 وحدة مقفلة يتم عدها هنا لكن لم يتم صكها أبدًا. تقسم جميع رياضيات حصة LP (الإيداع والسحب) على lp_supply، لذا استخدم هذا الحقل ولا تستبدل إمداد العملة على السلسلة.
  • protocol_fees_token{0,1}، fund_fees_token{0,1} — الرسوم المتراكمة التي لم يتم كنسها بعد. هذه لا تؤثر على تسعير المبادلة؛ تجلس في الخزائن حتى يتم استدعاء CollectProtocolFee / CollectFundFee. يتلقى protocol_fees_token{0,1} أيضًا حصة البروتوكول من رسوم المنشئ عند جمع رسوم المنشئ، لذا ينمو خارج المبادلات — انظر products/cpmm/fees.
  • status — قناع بت يتحكم في ما إذا كان Swap، Deposit، Withdraw مسموحًا. يتم تحديثه بواسطة المسؤول عبر UpdatePoolStatus. يتحقق SDK من هذا قبل بناء معاملة؛ إذا كنت تقوم بـ CPI مباشرة، تحقق منه بنفسك.
  • token0_program / token1_program — برنامج الرمز المراد CPI عليه لكل خزينة. يمكن أن يكون أحدهما SPL Token الكلاسيكي والآخر Token-2022؛ هما مستقلان.
  • open_time — طابع زمني Unix. تفشل المبادلات قبل هذا الوقت. يُسمح بالودائع قبل open_time حتى يمكن بذر المجمع.
  • creator_fee_on / enable_creator_fee — معًا يتحكمان في ما إذا كانت رسوم المنشئ الاختيارية نشطة لهذا المجمع وأي جانب من المبادلة يتم جمعها منه. enable_creator_fee == false يصفر مسار رسوم المنشئ بالكامل. عند التفعيل، يختار creator_fee_on: 0 = خذ الرسوم من أي رمز هو مدخل المبادلة (BothToken)؛ 1 = خذ الرسوم من token_0 فقط (تخطي على مبادلات token_1 → token_0)؛ 2 = خذ الرسوم من token_1 فقط. تعيين عند إنشاء المجمع عبر InitializeWithPermission؛ لا يمكن تغييره لاحقًا.
  • creator_fees_token_{0,1} — رسوم المنشئ المتراكمة، يتم كنسها بواسطة CollectCreatorFee أو CollectCreatorFeePermissionless. كلا المسارين يصفران العدادات الكاملة، لكن منذ ترقية creator-fee-share في 2026-09-19 فقط جزء من الرصيد يترك المجمع: يتم إضافة حصة البروتوكول إلى protocol_fees_token_{0,1} والباقي يتم تحويله إلى المنشئ. يصلح المسار بدون إذن المستقبلات إلى ATAs القانونية لـ pool_creator. لم يتغير PoolState نفسه — لا يوجد عداد منفصل للمبلغ المشترك.

AmmConfig

ثلاثة أشياء يجب الحذر منها:
  1. trade_fee_rate و creator_fee_rate هما كسور من الحجم، كلاهما مقوّم بوحدات 1/1_000_000. 2500 يعني 0.25% من حجم التجارة. protocol_fee_rate و fund_fee_rate هما كسور من رسوم التجارة (وليس من الحجم)، بنفس مقام 1/1_000_000. رسوم المنشئ ليست كسرًا من رسوم التجارة — إنها معدل مستقل خاص بها. الحسابات الكاملة موجودة في products/cpmm/fees.
  2. index هو u16، لذا تستخدم بذرة التجزئة 2 بايت big-endian. الخطأ بمقدار واحد في ترتيب البايت هو خطأ تكامل شائع.
  3. AmmConfig غير قابل للتغيير على مستوى المجمع. يشير المجمع إلى AmmConfig واحد عند الإنشاء ولا يتحول أبدًا. تنتشر تغييرات الرسوم لأن المجمع يقرأ الإعدادات في كل مبادلة — لكن لا يمكن نقل المجمع بين فئات الرسوم.
ملاحظة حول رسوم المنشئ: المعدل نفسه (creator_fee_rate) يعيش على AmmConfig ويتم مشاركته عبر فئة الرسوم. ما إذا كان مجمع معين يفرضها فعليًا (enable_creator_fee) وأي جانب من المبادلة يهبط عليه (creator_fee_on) يعيش على PoolState. رسوم المنشئ مستقلة عن رسوم التجارة — إنها معدل خاص بها، متراكمة على عدادات خاصة بها (creator_fees_token_{0,1})، ولا تقلل أبدًا من حصص LP / البروتوكول / الصندوق من رسوم التجارة. يتم الكنس عبر CollectCreatorFee أو CollectCreatorFeePermissionless المقيد بالوجهة، وكلا المسارين يسلمان حصة من الرصيد المتراكم إلى البروتوكول في الطريق — عند creator_fee_share_rate، أو عند المعدل على PDA CreatorFeeShare عند وجود واحد لزوج (creator, amm_config) هذا. انظر products/cpmm/fees للميكانيكا الكاملة.

Permission

حساب تحكم وصول صغير يستخدمه InitializeWithPermission. يدعم برنامج CPMM مسار إنشاء مجمع مرخص بحيث يمكن للبرامج الأخرى (مثل LaunchLab عند تخرج رمز إلى CPMM) إثبات أنها مخولة بإنشاء مجمع ضد AmmConfig معين.
يتم إنشاء PDA Permission عبر CreatePermissionPda بواسطة إما مسؤول CPMM أو سلطة منشئ PDA إذن مخصصة. منذ ترقية 2026-09، تقبل ClosePermissionPda نفس الموقّعين؛ قبل ذلك كانت حصرية للمسؤول. لا يتفاعل المستخدمون النهائيون مع هذا الحساب مباشرة — إنه أنابيب لتدفقات البرامج المتقاطعة. انظر security/admin-and-multisig لحد الدور و reference/program-addresses للعناوين القانونية.

CreatorFeeShare

حساب اختياري يتجاوز حصة البروتوكول من رسوم المنشئ لزوج (pool creator, AmmConfig) واحد. تمت إضافته بواسطة ترقية creator-fee-share في 2026-09-19.
كيف يتصرف:
  • إنه اختياري، لكن الحساب لا يكون أبدًا اختياريًا في التعليمات. يعلن CollectCreatorFee و CollectCreatorFeePermissionless كلاهما creator_fee_share بقيد البذرة أعلاه ويأخذانه في كل استدعاء. يتحقق البرنامج بعد ذلك ما إذا كان الحساب فارغًا أو مملوكًا بشكل أجنبي؛ إذا كان الأمر كذلك فإنه يعود إلى AmmConfig.creator_fee_share_rate. لذا يجب على العميل دائمًا اشتقاق وتمرير العنوان، سواء كان الحساب موجودًا أم لا.
  • share_rate مقيد بـ FEE_RATE_DENOMINATOR_VALUE (1_000_000) عند الإنشاء، وأيضًا عند تشغيل الانقسام. 1_000_000 يوجه رسوم المنشئ بالكامل إلى البروتوكول؛ 0 لا يوجه أي منها.
  • تم الإنشاء والإغلاق بواسطة المسؤول أو سلطة مخصصة عبر CreateCreatorFeeShare / CloseCreatorFeeShare. إغلاقه يعيد الإيجار إلى الموقّع ويسقط الزوج إلى الافتراضي للإعدادات؛ منشئ المجمع ليس موقّعًا على أي من المسارين.
  • يتم تفتيشه على المنشئ، وليس على المجمع. حساب واحد يحكم كل مجمع أنشأه هذا المنشئ على AmmConfig هذا. منشئ لديه مجمعات على فئتي رسوم يحتاج إلى حسابين ليتم تغطيتهما على كليهما.
حسابات الانقسام التي يقودها موجودة في products/cpmm/fees.

الخزائن و Token-2022

vault0 و vault1 مملوكة بواسطة PDA سلطة CPMM، ومالك برنامج الرمز (token_program) هو إما SPL Token أو Token-2022، يتم تحديده عند إنشاء المجمع بواسطة برنامج العملة. يتعامل المجمع مع الحالتين بشفافية — تمرر معرّف برنامج الرمز الصحيح لكل جانب في حسابات تعليمات Swap / Deposit / Withdraw. يفرض CPMM قائمة سماح امتداد صارمة عند إنشاء المجمع (is_supported_mint في utils/token.rs). يمكن استخدام عملة Token-2022 في مجمع CPMM فقط إذا كان كل امتداد تحمله على هذه القائمة:
  • TransferFeeConfig. تطبقه العملة على كل تحويل. المجمع على الجانب المستقبل لودائع SwapBaseInput والجانب المرسل للسحب. يحسب البرنامج الصافي المبلغ الهابط في الخزينة ويعيّن المنحنى وفقًا لذلك. انظر algorithms/token-2022-transfer-fees.
  • MetadataPointer و TokenMetadata. البيانات الوصفية القياسية على العملة. لا تأثير على رياضيات المبادلة.
  • InterestBearingConfig. تتراكم كمية واجهة المستخدم للعملة الفائدة. تخزن الخزينة المبالغ الخام؛ يعمل المنحنى على المبالغ الخام فقط. يجب على واجهات المستخدم التي تعرض APR استدعاء مساعدات Token-2022 لتقديم كمية واجهة المستخدم.
  • ScaledUiAmount. امتداد تحجيم عرض واجهة المستخدم. نفس المعاملة مثل InterestBearingConfig — يستخدم المنحنى المبالغ الخام.
أي امتداد آخر — PermanentDelegate، TransferHook، DefaultAccountState، NonTransferable، ConfidentialTransfer، Group/GroupMember، MintCloseAuthority، إلخ. — يسبب Initialize في الرفض مع NotSupportMint. الاستثناء الوحيد هو سجل لكل عملة: إذا كان PDA SupportMintAssociated موجودًا عند البذرة [b"support_mint", mint]، يتم قبول العملة بغض النظر عن مجموعة الامتدادات الخاصة بها. يتم إنشاء وإزالة PDA هذا بواسطة المسؤول (أو سلطة دعم عملة مخصصة) عبر CreateSupportMintAssociated / CloseSupportMintAssociated، لذا لا يحتاج إدراج عملة معينة إلى ترقية برنامج.
تم التغيير في 2026-09. كان CPMM يحمل سابقًا قائمة بيضاء بأربعة عناوين مشفرة MINT_WHITELIST اختصرت فحص الامتداد. تم إزالة هذه المصفوفة؛ PDA السجل هو الآن الالتفافة الوحيدة. أي عملة كانت تعتمد على القائمة البيضاء المشفرة تحتاج إلى PDA SupportMintAssociated قبل إنشاء مجمع جديد لها — المجمعات الموجودة غير متأثرة، لأن الفحص يعمل فقط عند إنشاء المجمع.
تعيش قائمة الامتدادات المدققة في مصدر CP-Swap تحت programs/cp-swap/src/utils/token.rs ويمكن أن تتغير مع ترقيات البرنامج المستقبلية. انظر reference/token-2022-support لمصفوفة البرنامج المتقاطع.

الملاحظة

حساب الملاحظة هو حلقة مخزن مؤقت لإدخالات ObservationState، كل منها يخزن block_timestamp و سعر تراكمي. في كل مبادلة يضيف البرنامج ملاحظة جديدة إذا مرت فترة زمنية كافية منذ آخر واحدة. يتم حساب TWAPs بقراءة ملاحظتين وقسمة Δcumulative / Δtime.
يتم تحجيم حلقة المخزن المؤقت لـ 100 ملاحظة. كل ملاحظة 40 بايت (8 + 16 + 16)، لذا المصفوفة وحدها 4,000 بايت؛ ObservationState::LEN هو بالضبط 4,075 بايت (8 + 1 + 2 + 32 + 4,000 + 8 × 4). قاعدتا المستهلك:
  • لا تستخدم ملاحظة واحدة كسعر. إنها تراكمية، وليست سعر فوري. استخدم اثنتين منها لحساب TWAP.
  • اختر ملاحظات على الأقل كتلة واحدة بعيدة. قد لا تنتج المبادلات داخل نفس الكتلة ملاحظة جديدة؛ قراءة متتالية يمكن أن تعيد نفس السجل.
المزيد من الرياضيات في products/clmm/accounts.

دورة حياة الحساب

لا يتم إغلاق مجمعات CPMM و PDAs الخاصة بها أبدًا. Permission، SupportMintAssociated و CreatorFeeShare هي الاستثناءات — إنها سجلات مستقلة يديرها المسؤول، وليست حالة المجمع، وكل واحد منها له تعليمات إغلاق صريحة. حتى عند السيولة الصفرية يبقى poolState. هذا مقصود: إعادة بذر نفس المجمع لاحقًا تحافظ على مخزن الملاحظات التاريخي الخاص به واشتقاق PDA الخاص به يبقى مستقرًا.

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

المصادر: