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

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

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

استخراج مجموعة من لا شيء سوى اثنين من mints

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

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

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

PoolState

ما يجب قراءته فعلياً:
  • lp_supply — مرآة داخلية للمجموعة لإجمالي إمداد LP mint. استخدمه لرياضيات LP-share؛ يجب أن تطابق القيمة الإمداد على السلسلة من mint، لكن قراءتها من PoolState تتجنب جلب حساب إضافي.
  • protocol_fees_token{0,1}، fund_fees_token{0,1} — الرسوم المتراكمة التي لم يتم حصدها بعد. هذه لا تؤثر على تسعير swap؛ تجلس في الخزائن حتى استدعاء CollectProtocolFee / CollectFundFee.
  • status — قناع بت يتحكم في السماح بـ Swap و Deposit و Withdraw. تم تحديثه بواسطة الإدارة عبر UpdatePoolStatus. يتحقق الـ SDK من هذا قبل بناء معاملة؛ إذا كنت تقوم بـ CPI مباشرة، تحقق منها بنفسك.
  • token0_program / token1_program — برنامج الرمز للـ CPI في لكل خزينة. يمكن لأحدهما أن يكون SPL Token الكلاسيكي والآخر Token-2022؛ يكونان مستقلين.
  • open_time — طابع زمني Unix. يفشل swaps قبل هذا الوقت. يُسمح بالإيداعات قبل open_time حتى يمكن زرع المجموعة.
  • creator_fee_on / enable_creator_fee — معاً يتحكمان في ما إذا كانت رسوم المُنشئ الاختيارية نشطة لهذه المجموعة وأي جانب من swap يتم جمعها. enable_creator_fee == false يصفر مسار رسوم المُنشئ بالكامل. عند التفعيل، يختار creator_fee_on: 0 = خذ الرسم من أي رمز هو مدخل swap (BothToken1 = خذ الرسم من token_0 فقط (تخطي في swaps token_1 → token_02 = خذ الرسم من token_1 فقط. تم التعيين عند إنشاء المجموعة عبر InitializeWithPermission؛ لا يمكن تغييره لاحقاً.
  • creator_fees_token_{0,1} — الرسوم المتراكمة للمُنشئ، يتم حصدها بواسطة CollectCreatorFee.

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، لذا تستخدم بذرة الـ hash 2 بايت بترتيب big-endian. عدم التطابق على ترتيب البايت هو خطأ تكامل شائع.
  3. AmmConfig ثابت على مستوى المجموعة. تشير المجموعة إلى AmmConfig واحد عند الإنشاء ولا تتحول أبداً. تنتشر تغييرات الرسوم لأن المجموعة تقرأ الإعدادات في كل swap — لكن المجموعة لا يمكن نقلها بين طبقات الرسوم.
ملاحظة على رسوم المُنشئ: المعدل نفسه (creator_fee_rate) يعيش على AmmConfig ومشترك عبر طبقة الرسوم. ما إذا كانت مجموعة معينة تفرضها فعلاً (enable_creator_fee) وأي جانب من swap تقع عليه (creator_fee_on) يعيش على PoolState. رسوم المُنشئ مستقلة عن رسوم التداول — فهي معدل خاص بها، متراكمة على عدادات خاصة بها (creator_fees_token_{0,1})، وأبداً لا تقلل من أسهم LP / البروتوكول / الصندوق من رسوم التداول. الحصد عبر CollectCreatorFee. انظر products/cpmm/fees للميكانيكا الكاملة.

Permission

حساب تحكم الوصول الصغير المستخدم بواسطة InitializeWithPermission. يدعم برنامج CPMM مسار إنشاء مجموعة محدود بحيث يمكن للبرامج الأخرى (على سبيل المثال LaunchLab عند تخريج رمز إلى CPMM) إثبات أنهم مخوّلون بإنشاء مجموعة ضد AmmConfig معين.
يتم إنشاء PDA Permission بواسطة إدارة CPMM عبر CreatePermissionPda وإلغاء صلاحيته عبر ClosePermissionPda. لا يتفاعل المستخدمون النهائيون مع هذا الحساب مباشرة — إنه أنابيب لتدفقات برنامج متقاطع.

الخزائن و Token-2022

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

المراقبة

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

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

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

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

المصادر: