هذه الصفحة مُترجَمة آليًا بواسطة الذكاء الاصطناعي. النسخة الإنجليزية هي المرجع المعتمد.عرض النسخة الإنجليزية →
معرّف البرنامج وبذور PDA لـ CPMM مدرجة بشكل قانوني في
reference/program-addresses. تركز هذه الصفحة على ما يخدمه كل حساب والثوابت التي يحافظ عليها، وليس على العناوين المشفرة.الحسابات الستة لمجمع CPMM
يتم وصف كل مجمع CPMM بالكامل بستة عناوين مشتقة من البرنامج (PDAs) تحت برنامج CPMM، بالإضافة إلى حسابAmmConfig مشترك واحد يشير إليه. بمجرد حصولك على العملتين، يمكنك اشتقاق كل شيء بشكل حتمي دون لمس الشبكة.
والإعدادات المشتركة:
وحساب اختياري واحد لكل منشئ:
اشتقاق مجمع من لا شيء سوى عملتين
معرّف المجمع ليس دائمًا 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
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.indexهوu16، لذا تستخدم بذرة التجزئة 2 بايت big-endian. الخطأ بمقدار واحد في ترتيب البايت هو خطأ تكامل شائع.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 معين.
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 قبل إنشاء مجمع جديد لها — المجمعات الموجودة غير متأثرة، لأن الفحص يعمل فقط عند إنشاء المجمع.programs/cp-swap/src/utils/token.rs ويمكن أن تتغير مع ترقيات البرنامج المستقبلية. انظر reference/token-2022-support لمصفوفة البرنامج المتقاطع.
الملاحظة
حساب الملاحظة هو حلقة مخزن مؤقت لإدخالاتObservationState، كل منها يخزن block_timestamp و سعر تراكمي. في كل مبادلة يضيف البرنامج ملاحظة جديدة إذا مرت فترة زمنية كافية منذ آخر واحدة. يتم حساب TWAPs بقراءة ملاحظتين وقسمة Δcumulative / Δtime.
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 الخاص به يبقى مستقرًا.
ما يجب قراءته أين
- قوائم حسابات التعليمات (أي من الأعلى قابل للكتابة/موقّع لكل تعليمات):
products/cpmm/instructions. - دلالات تراكم الرسوم:
products/cpmm/fees. - رياضيات المبادلة / قاعدة تحديث الملاحظة:
products/cpmm/math. - البذور القانونية / معرّفات البرامج:
reference/program-addresses.

