Skip to main content
هذه الصفحة مُترجَمة آليًا بواسطة الذكاء الاصطناعي. النسخة الإنجليزية هي المرجع المعتمد.عرض النسخة الإنجليزية →

رسمان مستقلان، أربع وجهات

يفرض CPMM رسمين بمعدلات منفصلة على كل مبادلة:
  1. رسم التجارة — يُفرض بمعدل AmmConfig.trade_fee_rate ويُقسّم بين ثلاث وجهات:
    • حصة مزودي السيولة — تبقى في الخزينة وتزيد k. يتم المطالبة بها ضمنيًا بحرق رموز LP.
    • حصة البروتوكول — تُجمّع في PoolState.protocol_fees_token*؛ يتم تجميعها بواسطة protocol_owner عبر CollectProtocolFee.
    • حصة الصندوق — تُجمّع في PoolState.fund_fees_token*؛ يتم تجميعها بواسطة fund_owner عبر CollectFundFee.
  2. رسم المنشئ (اختياري، لكل مجموعة) — يُفرض بمعدل AmmConfig.creator_fee_rate بشكل مستقل عن رسم التجارة ويُجمّع في PoolState.creator_fees_token*. يمكن للمنشئ تجميعه عبر CollectCreatorFee، أو يمكن لأي دافع تفعيل مسار CollectCreatorFeePermissionless المقيد بالوجهة. نشط فقط عندما تم إنشاء المجموعة باستخدام enable_creator_fee = true. منذ ترقية 2026-09-19 يتم تقسيم رسم المنشئ المجمّع مرة أخرى عند وقت التحصيل: يتم نقل حصة قابلة للتكوين إلى دلو البروتوكول للمجموعة وفقط الباقي يصل إلى المنشئ — انظر حصة البروتوكول من رسم المنشئ.
رسم المنشئ ليس جزءًا من رسم التجارة. يتم إضافة المعدلين معًا عند فرض الرسم على مدخل المبادلة، لكن كل منهما يبقى دلوه الخاص — الحصص المأخوذة من البروتوكول والصندوق على المبادلة مشتقة دائمًا من trade_fee فقط، وليس من creator_fee. مجموعة بـ creator_fee_rate = 1000 (0.10%) و trade_fee_rate = 2500 (0.25%) تفرض 0.35% مجتمعة من المدخل على مبادلة برسم منشئ على المدخل، منها يحصل دلو المنشئ على 0.10% ودلو رسم التجارة يحصل على 0.25%. حصة البروتوكول من رسم المنشئ تسير بالطريقة المعاكسة وسهل الخلط بينها وبين ما سبق: يتم نحتها من دلو المنشئ، وليس من رسم التجارة، وليس على المبادلة — يتم تطبيقها عندما يستقر CollectCreatorFee أو CollectCreatorFeePermissionless الرصيد المجمّع. رياضيات المبادلة لم تتغير بسببها. معدلات رسم التجارة (trade_fee_rate، protocol_fee_rate، fund_fee_rate)، و creator_fee_rate والقيمة الافتراضية creator_fee_share_rate تعيش جميعها على AmmConfig. علم enable_creator_fee لكل مجموعة وطريقة creator_fee_on (أي جانب من المبادلة يتم أخذ رسم المنشئ منه) تعيش على PoolState. تجاوز لكل منشئ لمعدل الحصة يعيش على PDA CreatorFeeShare الخاص به. انظر products/cpmm/accounts.

المعدلات والوحدات

جميع المعدلات هي u64 مقسومة بوحدات 1 / FEE_RATE_DENOMINATOR حيث FEE_RATE_DENOMINATOR = 1_000_000.
  • trade_fee_rate هو جزء من حجم المبادلة. 2500 ⇒ 0.25% من الجانب ذي الصلة (مدخل أو مخرج، حسب creator_fee_on — انظر “أي جانب من المبادلة يتم أخذ الرسوم منه” أدناه).
  • creator_fee_rate هو جزء من حجم المبادلة، يُؤخذ بشكل منفصل عن رسم التجارة. 1000 ⇒ 0.10% من الجانب ذي الصلة.
  • protocol_fee_rate و fund_fee_rate هما جزء من رسم التجارة، وليس من الحجم. 120_000 ⇒ 12% من رسم التجارة.
  • creator_fee_share_rate هو جزء من رسم المنشئ المجمّع، وليس من الحجم وليس من رسم التجارة. 200_000 ⇒ 20% من أي شيء يجلس في creator_fees_token* في اللحظة التي يتم تحصيله. 0 (الافتراضي) يترك رسم المنشئ كاملاً مع المنشئ.
المعاملات الافتراضية لـ AmmConfig[index=0] (مجموعة “المعيار” 0.25%) على mainnet، للمرجعية: إذن على مبادلة بقيمة $1,000 مقابل AmmConfig[0] مع enable_creator_fee = false: $2.50 إجمالي رسم تجارة، منها $2.10 تبقى مع مزودي السيولة، $0.30 تذهب إلى البروتوكول، $0.10 إلى الصندوق. دلو المنشئ هو 0 لأن رسم المنشئ معطل. إذا كانت نفس المجموعة تحتوي على enable_creator_fee = true و creator_fee_rate = 1000 (0.10%)، يدفع المستخدم $1.00 إضافية إلى دلو المنشئ — مأخوذة من نفس جانب المبادلة المكون بواسطة creator_fee_on — لـ $3.50 من إجمالي الرسوم. دلو رسم التجارة وتقسيماته بين البروتوكول والصندوق لم تتغير. تأكد من قيم mainnet الحالية مقابل GET https://api-v3.raydium.io/main/cpmm-config — المعدلات قابلة للتغيير من قبل المسؤول ويجب قراءتها بشكل جديد بدلاً من ترميزها بشكل ثابت.

التقسيم، في الكود

ملاحظات:
  • إجمالي الرسم على المدخل يتم تقريبه لأعلى بحيث لا تقلل المجموعة الرسم.
  • التقسيمات الفرعية لـ trade_fee (البروتوكول، الصندوق) يتم تقريبها لأسفل بحيث لا يتجاوز مجموعها trade_fee؛ الباقي هو حصة LP.
  • lp_share = trade_fee − protocol_fee − fund_fee (creator_fee لا يتم طرحها هنا لأنها دلوها الخاص).
  • يتم أخذ رسم المنشئ من المدخل أو المخرج حسب PoolState.creator_fee_on (انظر القسم التالي). المعدل لا يتغير بأي طريقة.

أي جانب من المبادلة يتم أخذ الرسوم منه

لدى CPMM إعداد creator_fee_on لكل مجموعة (BothToken / OnlyToken0 / OnlyToken1) يحدد ما إذا كان رسم المنشئ يُؤخذ من جانب المدخل أو جانب المخرج لمبادلة معينة. مساعد وقت التشغيل is_creator_fee_on_input(direction) يختزل ذلك إلى قيمة منطقية لكل مبادلة: عندما يكون رسم المنشئ على جانب المدخل، يتم خصم كل من رسم التجارة ورسم المنشئ من amount_in قبل تشغيل المنحنى. رياضيات الاقتباس: خذ trade_rate + creator_rate المجتمعة من المدخل. عندما يكون رسم المنشئ على جانب المخرج، يتم خصم رسم التجارة فقط من amount_in؛ ينتج المنحنى مخرجًا بدون رسوم، ثم يتم خصم رسم المنشئ من هذا المخرج. رياضيات الاقتباس: خذ trade_rate من المدخل؛ خذ creator_rate من المخرج. رسم التجارة نفسه يُؤخذ دائمًا من جانب المدخل (نمط Uniswap-V2 القياسي). فقط رسم المنشئ يمكن أن ينتهي به الحال على المخرج.

كيفية تفاعل الرسوم “المجمّعة” مع المنحنى

دقة مهمة: رسوم البروتوكول والصندوق والمنشئ تبقى فعليًا في الخزينة حتى يتم استدعاء تعليمة Collect* الخاصة بها. لكن يتم استبعادها من رؤية المنحنى لرصيد الخزينة. صورة ملموسة بعد مبادلة واحدة:
يستخدم البرنامج curve_x (و curve_y المماثل) عند فرض k' ≥ k. هذه هي الطريقة التي تصل بها رسوم غير LP إلى وجهاتها بدون تضخيم حصة LP من المجموعة. النتائج التي يجب أن تصمم حولها:
  • الاقتباس من الأرصدة الخام خاطئ. إذا قمت ببناء مقتبس من getTokenAccountBalance، ستبالغ باستمرار في السعر الذي ستحترمه المجموعة. اطرح دائمًا الرسوم المجمّعة، أو محاكاة عبر SwapBaseInput / الواجهة البرمجية.
  • CollectProtocolFee لا يحرك السعر. ينقل الرموز خارج الخزينة و يصفر عدادات protocol_fees_token*، لذا curve_x و curve_y لم تتغير.
  • رسوم LP لا تتراكم في عداد. هي ضمنية في رصيد الخزينة. استحقاق LP للرسوم المتراكمة يتم ممارسته بحرق رموز LP (أي عبر Withdraw) — لا يوجد CollectLpFee.

التفاعل مع رسوم تحويل Token-2022

يتم تطبيق رسوم تحويل Token-2022 بواسطة الإصدار، وليس بواسطة CPMM. تعمل على كل تحويل رموز — مبادلة، إيداع، سحب، وعمليات Collect*. يتم حساب رياضيات رسم التجارة في CPMM مقابل المبلغ الذي هبط فعلاً في الخزينة، أي بعد خصم رسم التحويل لإصدار المدخل (إن وجد). إذن في أسوأ الحالات يدفع المستخدم ثلاث ضرائب مختلفة على مبادلة مدخل دقيق:
  1. رسم التحويل لإصدار المدخل على amount_in (لسلطة رسم الإصدار).
  2. رسم trade_fee للمجموعة على الباقي (مقسم كما هو موضح أعلاه).
  3. رسم التحويل لإصدار المخرج على amount_out (لسلطة رسم الإصدار).
يأخذ مقتبس SDK جميع الثلاثة في الاعتبار بحيث يتم تسمية minimum_amount_out بما يحصل عليه المستخدم فعلاً. إذا كنت تكتب مقتبسك الخاص، عكس هذا السلوك، أو ستكون فحوصات الانزلاق الخاصة بك متحررة بشكل منهجي. انظر algorithms/token-2022-transfer-fees للاشتقاق التفصيلي.

رسم المنشئ

رسم المنشئ اختياري ولكل مجموعة. المعدل يعيش على AmmConfig.creator_fee_rate؛ علم التفعيل و الجانب (creator_fee_on) يعيشان على PoolState:
  • مفعل عند إنشاء المجموعة. يعيّن Initialize enable_creator_fee = false بشكل افتراضي؛ المجموعات المنشأة عبر InitializeWithPermission (المستخدمة من قبل تخرجات LaunchLab والمسارات المحمية الأخرى) يمكنها تمرير enable_creator_fee = true واختيار creator_fee_on.
  • المعدل مشترك مع مستوى الرسم. المعدل نفسه هو AmmConfig.creator_fee_rate، نفس القيمة عبر كل مجموعة مرتبطة بهذا التكوين. ثم تقرر كل مجموعة ما إذا كانت ستفرضه (enable_creator_fee) وأي جانب من المبادلة ستفرضه عليه (creator_fee_on). عندما enable_creator_fee = false، معدل رسم المنشئ الفعلي للمجموعة هو صفر بغض النظر عن قيمة التكوين (انظر PoolState::adjust_creator_fee_rate في المصدر).
  • مستقل عن رسم التجارة. رسم المنشئ لا يقلل أبدًا من حصص LP / البروتوكول / الصندوق — إنه معدله الخاص، يُطبق بشكل منفصل، يُجمّع في عدادات خاصة به.
  • يتم تجميعه عبر CollectCreatorFee أو CollectCreatorFeePermissionless. المسار الأصلي يتطلب PoolState.pool_creator للتوقيع. المسار بدون إذن يسمح لأي دافع بتفعيل التحصيل لكن يثبت كلا الوجهتين على ATAs المنشئ الكنسية. كلا المسارين يستقران حصة البروتوكول أولاً — انظر القسم التالي.
  • لا يمكن إعادة تفعيله أو إعادة توجيهه بعد الإنشاء. مجموعة تم تهيئتها مع enable_creator_fee = false لن تفرض أبدًا رسم منشئ؛ واحدة تم تهيئتها مع creator_fee_on معين لا يمكنها تبديل الجوانب.
رسوم المنشئ هي الآلية وراء نمط Raydium “Burn & Earn”: يتم قفل رموز LP تحت برنامج LP Lock بحيث لا يمكن للمنشئ سحب السيولة، لكن الرسوم المتراكمة للمنشئ يمكن تجميعها بلا حدود.

حصة البروتوكول من رسم المنشئ

منذ ترقية 2026-09-19 يمكن للبروتوكول الاحتفاظ بحصة قابلة للتكوين من رسم المنشئ. لا شيء عن المبادلة يتغير: رسم المنشئ لا يزال يُفرض بـ creator_fee_rate ولا يزال يتراكم بالكامل في creator_fees_token{0,1}. التقسيم يحدث مرة واحدة، عند وقت التحصيل، داخل CollectCreatorFee و CollectCreatorFeePermissionless.

من أين يأتي المعدل

مصدران، بترتيب الأولوية:
  1. PDA CreatorFeeShare — بذور ["creator_fee_share", creator, amm_config]. عندما يكون هذا الحساب موجودًا ومملوكًا بواسطة CPMM، يفوز share_rate الخاص به. يسمح للبروتوكول بالتفاوض على معدل لكل منشئ على مستوى رسم معين دون لمس المستوى نفسه.
  2. AmmConfig.creator_fee_share_rate — الافتراضي لكل منشئ على مستوى الرسم هذا. يُستخدم كلما لم يكن PDA موجودًا.
كلاهما u64 على نفس FEE_RATE_DENOMINATOR = 1_000_000، وكلاهما مقيد بالمقسوم عليه. تعليمات التحصيل تأخذ دائمًا حساب creator_fee_share، حتى عندما لم يتم إنشاؤه أبدًا — يتحقق البرنامج ما إذا كان فارغًا ويعود إلى التكوين. تمرير العنوان الخاطئ يفشل قيد PDA، وليس الرجوع.

ما الذي يفعله التقسيم

يُطبق بشكل مستقل على creator_fees_token_0 و creator_fees_token_1، ثم:
  • يتم نقل creator_amount_{0,1} خارج الخزائن إلى حسابات الرموز للمنشئ.
  • يتم إضافة shared_amount_{0,1} إلى protocol_fees_token_{0,1} وتبقى في الخزينة حتى يقوم مالك البروتوكول بتجميعها باستخدام CollectProtocolFee. لا توجد تعليمة منفصلة ولا عداد منفصل لها.
  • يتم تصفير creator_fees_token_{0,1}، تمامًا كما هو الحال من قبل.
ثلاث خصائص تستحق الاعتماد عليها:
  • التقريب يفضل المنشئ. حصة البروتوكول تقرب لأسفل، لذا الغبار يبقى مع المنشئ — نفس الاتجاه مثل protocol_fee و fund_fee، اللذان يقطعان أيضًا حصة من رسم مجمّع بالفعل.
  • القيمة محفوظة. creator_amount + shared_amount == creator_fee لكل معدل وكل رسم، بما في ذلك u64::MAX.
  • share_rate = 0 هو عدم تشغيل. كل من قيمة التكوين الافتراضية وغياب PDA CreatorFeeShare يترك رسم المنشئ كاملاً مع المنشئ، وهو السلوك السابق للترقية.

ما يعنيه للمدمجين

  • مزودي السيولة والاقتباس لم يتأثروا. المبلغ المشترك ينتقل بين عدادين كلاهما مستبعد بالفعل من رؤية المنحنى للخزينة (vault_amount_without_fee)، لذا curve_x و curve_y لا يتحركان عبر تحصيل. k لم يتغير.
  • مقدّر رسم المنشئ الذي يقرأ creator_fees_token* يبالغ الآن في الدفع. اضرب بـ (1 − share_rate / 1_000_000) باستخدام المعدل الذي ينطبق فعلاً على زوج (creator, amm_config) هذا، وليس افتراضي التكوين.
  • protocol_fees_token* ينمو خارج المبادلات. سيرى مراقب يوفق الاستحقاق البروتوكول مقابل حجم المبادلة قفزات عند كل تحصيل رسم منشئ. استحقاق البروتوكول لم يعد trade_fee × protocol_fee_rate وحده.
  • المعدل يمكن أن يتغير بين الاستحقاق والتحصيل. يتم قراءته عند وقت التحصيل، لذا الرسوم التي تراكمت تحت معدل واحد تستقر بأي معدل يكون ساريًا عندما يستدعي شخص ما Collect*.
يتم إنشاء وإغلاق حساب CreatorFeeShare بواسطة المسؤول أو سلطة مخصصة لحصة رسم المنشئ عبر CreateCreatorFeeShare / CloseCreatorFeeShare؛ إغلاقه يعيد الزوج إلى AmmConfig.creator_fee_share_rate. تخطيط الحساب في products/cpmm/accounts، العناوين في reference/program-addresses.

تدفق العمليات للتحصيل

مالكو البروتوكول والصندوق هم multisig Raydium على mainnet؛ انظر security/admin-and-multisig. على المسار الأصلي الخاص بالمنشئ فقط، الموقّع للمنشئ هو الحساب المسجل في PoolState. على المسار بدون إذن، يدفع المتصل لإنشاء ATA منشئ مفقود. يقيد البرنامج creator إلى pool_state.pool_creator ويشتق كل وجهة من هذا المنشئ بالإضافة إلى إصدار الخزينة المقابل وبرنامج الرموز، لذا لا يمكن للمتصل إعادة توجيه الأموال.

تغيير مستوى الرسم

يمكن تغيير معدلات الرسم بواسطة المسؤول عبر UpdateAmmConfig (انظر products/cpmm/instructions). التغييرات تدخل حيز التنفيذ على المبادلة التالية لكل مجموعة مرتبطة بـ AmmConfig هذا — لا توجد هجرة، لأن المجموعات تحمل التكوين في كل مبادلة. ما لا يمكن للمسؤول فعله:
  • نقل مجموعة من AmmConfig واحد إلى آخر.
  • إعادة تسعير الرسوم المتراكمة بأثر رجعي.
  • تجميع الرسوم بدون موقّع protocol_owner / fund_owner.

قراءة الرسوم من مجموعة قيد التشغيل

حل معدل الحصة على السلسلة، وليس من تكوين مخزن مؤقتًا. creator_fee_share_rate هو حقل AmmConfig مضاف حديثًا، لذا اقرأه من الحساب بدلاً من افتراض أن حمولة REST للتكوين تحمله، وتحقق ما إذا كان PDA CreatorFeeShare موجودًا في ["creator_fee_share", creator, ammConfig] قبل اقتباس المنشئ لدفعه. PDA المفقود هو الحالة الشائعة ويعني أن افتراضي التكوين ينطبق.

المقارنة مع CLMM و AMM v4

انظر reference/fee-comparison لمصفوفة جنبًا إلى جنب. الملخص:
  • AMM v4 يستخدم رسم تجارة ثابت 0.25% مع تقسيم LP/بروتوكول مختلف وبدون رسم صندوق.
  • CLMM الرسوم لكل مستوى تباعد القراد، مجمّعة لكل موضع (وليس لكل مجموعة)، ومطالب بها عبر DecreaseLiquidity أو CollectFees.

إلى أين تذهب بعد ذلك

  • products/cpmm/math — حيث يتصل خصم رسم التجارة بالمنحنى.
  • products/cpmm/instructions — قوائم حسابات تعليمة Collect*، بما في ذلك حساب creator_fee_share الذي يتطلبه كلا مسارات المنشئ الآن.
  • algorithms/token-2022-transfer-fees — كيفية دمج رسم تجارة مجموعة مع رسم تحويل إصدار بشكل صحيح.
المصادر: