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؛ يجب أن تطابق القيمة إمداد الصك على السلسلة، لكن قراءتها من PoolState تتجنب جلب حساب إضافي.
  • 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 إذن مخصصة. فقط مسؤول CPMM يمكنه إلغاؤه عبر 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. الاستثناء هو قائمة بيضاء صك صغيرة مشفرة بقوة في البرنامج (حفنة من المفاتيح العامة المحددة) التي تتجاوز فحص الامتداد؛ يتم استخدامها لتضمين صكوك محددة حالة تلو الأخرى. تعيش قائمة الامتداد المدقق والقائمة البيضاء للصك في مصدر CP-Swap تحت programs/cp-swap/src/utils/token.rs ويمكن أن تتغير مع ترقيات البرنامج المستقبلية.

الملاحظة

حساب الملاحظة هو حلقة مخزن مؤقت لإدخالات ObservationState، كل منها يخزن block_timestamp و سعر تراكمي. في كل مبادلة يضيف البرنامج ملاحظة جديدة إذا مرّ وقت كافٍ منذ آخر واحدة. يتم حساب TWAPs بقراءة ملاحظتين وتقسيم Δcumulative / Δtime.
يتم تحجيم حلقة المخزن المؤقت لـ 100 ملاحظة. كل ملاحظة 40 بايت، لذا المصفوفة وحدها 4,000 بايت؛ PDA ObservationState الكامل حوالي 4,100 بايت بعد الحقول المحيطة والمميز. قاعدتا المستهلك:
  • لا تستخدم ملاحظة واحدة كسعر. إنها تراكمية، وليست سعر فوري. استخدم اثنتين منها لحساب TWAP.
  • اختر ملاحظات على الأقل كتلة واحدة بعيدة. قد لا تنتج المبادلات داخل نفس الكتلة ملاحظة جديدة؛ قراءة متتالية يمكن أن ترجع نفس السجل.
المزيد من الرياضيات في products/clmm/accounts.

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

مجمعات CPMM و PDAs الخاصة بها لا تُغلق أبدًا. حتى عند السيولة الصفرية يبقى poolState. هذا مقصود: إعادة بذر نفس المجمع لاحقًا يحافظ على مخزن الملاحظات التاريخي الخاص به واشتقاق PDA الخاص به يبقى مستقرًا.

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

المصادر: