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 القانوني، يتطلب البرنامج أن يكون موقّعًا — أي أن المنشئ يمرر زوج مفاتيح جديد يوقّع به. هذا هو دفاع الركض الأمامي: أي طرف ثالث يتسابق للاستيلاء على 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.
  • 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 = خذ الرسوم من أي رمز هو مدخل المبادلة (BothToken1 = خذ الرسوم من token_0 فقط (تخطي على مبادلات token_1 → token_02 = خذ الرسوم من token_1 فقط. تعيين عند إنشاء المجمع عبر InitializeWithPermission؛ لا يمكن تغييره لاحقًا.
  • creator_fees_token_{0,1} — رسوم المنشئ المتراكمة، يتم كسحها بواسطة CollectCreatorFee أو CollectCreatorFeePermissionless. كلا المسارين يصفران العدادات الكاملة؛ يصلح المسار بدون إذن المستقبلات إلى ATAs القانونية لـ pool_creator.

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 المقيد بالوجهة. انظر products/cpmm/fees للآليات الكاملة.

Permission

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

الخزائن و 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 الخاصة بها لا تُغلق أبدًا. حتى عند السيولة الصفرية يبقى poolState. هذا مقصود: إعادة بذر نفس المجمع لاحقًا تحافظ على مخزن الملاحظات التاريخي الخاص به وبقاء اشتقاق PDA الخاص به مستقرًا.

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

المصادر: