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

الثابت

يحافظ CPMM على ثابت الناتج الثابت الكلاسيكي على خزانتيه: x⋅y=kx \cdot y = k حيث x هو رصيد vault0 بعد أي رسوم نقل Token-2022 عند الاستقبال، وبالمثل لـ y. يجب أن يترك كل مبادلة k' ≥ k بعد احتساب رسوم التداول المرصودة للـ LP (لا تُحسب دلاء البروتوكول والصندوق والمنشئ نحو k — فهي موجودة في الخزان لكن مستثناة من عرض المنحنى، انظر الرسوم على المنحنى أدناه). لذلك ينمو k بشكل رتيب بمرور الوقت مع تراكم الرسوم لدى LPs. يتم تسعير حصص LP من خلال احتياطيات المجموعة، وليس من خلال k: سعر LP بـ token0=xlpSupply,سعر LP بـ token1=ylpSupply\text{سعر LP بـ token0} = \frac{x}{\text{lpSupply}}, \qquad \text{سعر LP بـ token1} = \frac{y}{\text{lpSupply}} حرق ΔLP من رموز LP يعيد بالضبط ΔLP × x / lpSupply من token0 و ΔLP × y / lpSupply من token1. لا المنحنى ولا k يتحركان عند الإيداع أو السحب — فقط المبادلات تغير السعر.

نموذج الرسوم على مسار المبادلة

يطبق CPMM رسومين مستقلين على كل مبادلة:
  • رسم التداول يُؤخذ من جانب الإدخال، بسعر AmmConfig.trade_fee_rate. يتم بعد ذلك تقسيمه إلى حصص LP والبروتوكول والصندوق (تبقى حصة LP في الخزان وتنمو k؛ حصص البروتوكول والصندوق يتم استخراجها من محاسبة الخزان).
  • رسم المنشئ (نشط فقط عندما enable_creator_fee == true) يُفرض بسعر AmmConfig.creator_fee_rate. يُؤخذ من جانب الإدخال أو جانب الإخراج حسب PoolState.creator_fee_on واتجاه المبادلة (انظر products/cpmm/fees). إنه دلو خاص به — لا يكون أبدًا جزءًا من رسم التداول.
حصة البروتوكول من رسم المنشئ لا تظهر في أي مكان على هذه الصفحة، وهذا مقصود. يتم تطبيقها عندما يقوم CollectCreatorFee بنقل الرسوم المتراكمة بين عدادين يستثنيهما المنحنى بالفعل — وليس أثناء المبادلة. رياضيات المبادلة والاقتباسات و k متطابقة مع وبدون ذلك. انظر products/cpmm/fees.
دع:
  • FEE_RATE_DENOMINATOR = 1_000_000
  • trade_fee_rate — من AmmConfig، على سبيل المثال، 2500 = 0.25% من جانب الحجم ذي الصلة
  • creator_fee_rate — من AmmConfig، على سبيل المثال، 1000 = 0.10% من جانب الحجم ذي الصلة
  • protocol_fee_rate, fund_fee_rate — معبّر عنها بوحدات 1/FEE_RATE_DENOMINATOR من رسم التداول، وليس من الحجم
عندما تكون رسوم المنشئ على جانب الإدخال:
عندما تكون رسوم المنشئ على جانب الإخراج:
في كلا الحالتين يتم تقسيم رسم التداول بنفس الطريقة:
يتم الاحتفاظ بمبلغ protocol_fee + fund_fee + creator_fee في الخزانات لكن يتم تتبعه بشكل منفصل على حالة المجموعة (protocol_fees_token*, fund_fees_token*, creator_fees_token*). عند فحص ثابت الناتج الثابت k' ≥ k، يستخدم أرصدة الخزان ناقص جميع الرسوم الثلاثة المتراكمة غير المجمعة — لذا يلتقط LPs فقط lp_fee. انظر products/cpmm/fees للحصول على تعليمات الجمع والأمثلة الرقمية المعملة.

SwapBaseInput (إدخال دقيق)

“يعطينا المستخدم بالضبط amount_in من رمز الإدخال ويتلقى على الأقل minimum_amount_out من رمز الإخراج.” تجاهل Token-2022 للحظة:
بالجبر: amount_out=y⋅Δxnetx+Δxnet\text{amount\_out} = \frac{y \cdot \Delta x_{\text{net}}}{x + \Delta x_{\text{net}}} حيث Δx_net = amount_in_after_trade_fee. يقوم البرنامج بعد ذلك بتحديث محاسبة الخزان بحيث يجلس جزء trade_fee المستحق للبروتوكول/الصندوق/المنشئ في دلاء “مراكمة” (غير مضمنة في x التالي للمنحنى)، بينما تنضم حصة LP إلى x للمبادلة التالية.

Token-2022 على جانب الإدخال

إذا كان رمز الإدخال يحتوي على امتداد رسم النقل، فإن الرمز يخصم رسومه على النقل من المستخدم → الخزان. لذا يتلقى الخزان فعليًا amount_in − transfer_fee_in(amount_in). يحسب برنامج CPMM لذلك:
ويشغل المنحنى مقابل amount_in_after_trade_fee. هذا مهم لأن سعر المنحنى يُحسب من المبلغ الصافي الذي وصل إلى الخزان، وليس من المبلغ الإجمالي للمستخدم.

Token-2022 على جانب الإخراج

إذا كان رمز الإخراج يحتوي على رسم نقل، فإن المجموعة ترسل amount_out من خزانها إلى المستخدم. سيقوم الرمز بعد ذلك بحذف رسومه في الطريق، لذا يتلقى المستخدم amount_out − transfer_fee_out(amount_out). يحسب البرنامج amount_out من المنحنى كالمعتاد، لكن من مسؤولية المدمج تحويل رقم “إرسال الخزان” للمجموعة إلى رقم “استقبال المستخدم” عند عرض الاقتباسات.

فحص الانزلاق

بعد حساب amount_out:
إذا كان رمز الإخراج يفرض رسم نقل، فإن SDK يطبق رسم النقل قبل تعيين minimum_amount_out بحيث يتم تسعير ثابت الانزلاق بما سيتلقاه المستخدم فعليًا، وليس بما يرسله الخزان.

SwapBaseOutput (إخراج دقيق)

“سيتلقى المستخدم بالضبط amount_out من رمز الإخراج وهو على استعداد لدفع ما يصل إلى maximum_amount_in من رمز الإدخال.” عكس المنحنى لـ Δx_net: Δxnet=⌈x⋅amount_outy−amount_out⌉\Delta x_{\text{net}} = \left\lceil \frac{x \cdot \text{amount\_out}}{y - \text{amount\_out}} \right\rceil السقف مهم — فهو يضمن k' ≥ k بعد الاختزال الصحيح. ثم:
على إدخال Token-2022، لف مع:
بحيث يدفع المستخدم ما يكفي بحيث بعد خصم رسم النقل للرمز يتلقى المجموعة gross_needed.

فحص الانزلاق

مثال معمول

حالة المجموعة، تجاهل Token-2022:
  • x = 1_000_000_000_000 (1,000,000.000000 من token0، 6 منازل عشرية)
  • y = 2_000_000_000_000 (2,000,000.000000 من token1، 6 منازل عشرية)
  • AmmConfig: trade_fee_rate = 2500, protocol_fee_rate = 120_000, fund_fee_rate = 40_000, creator_fee_rate = 0
المستخدم: SwapBaseInput مع amount_in = 1_000_000_000 (1,000.000000 من token0). رسم المنشئ معطّل (enable_creator_fee = false).
إذا كانت نفس المجموعة تحتوي على enable_creator_fee = true مع creator_fee_rate = 1000 (0.10%) على جانب الإدخال، فسيفرض البرنامج total_input_fee = ceil(1_000_000_000 * 3500 / 1_000_000) = 3_500_000، ثم يقسمها كـ creator_fee = 1_000_000 و trade_fee = 2_500_000. حساب البروتوكول/الصندوق/LP على trade_fee لم يتغير عن المثال أعلاه — رسم المنشئ هو دلو خاص به، مراكم إلى creator_fees_token0 ومستثنى من curve_x جنبًا إلى جنب مع دلاء البروتوكول والصندوق. إذا كان رمز الإدخال يحتوي على رسم نقل Token-2022 بنسبة 1%، فإن الخزان يتلقى 990_000_000 رمز بدلاً من 1_000_000_000، وكل حساب لاحق يستخدم هذا المبلغ الصافي.

قاعدة تحديث الملاحظة

في كل مبادلة، يقيّم البرنامج ما إذا كان يجب دفع ملاحظة جديدة إلى مخزن مؤقت حلقي:
خاصيتان:
  • السعر التراكمي، وليس السعر الفوري. ملاحظة واحدة ليست سعرًا. للحصول على TWAP من الوقت t0 إلى t1، اقرأ الملاحظات الأقرب إلى كل طرف واحسب (cumulative(t1) − cumulative(t0)) / (t1 − t0).
  • العينات محدودة بالمعدل. قد تشارك المبادلات المتتالية في نفس الفتحة ملاحظة واحدة. قراءة ملاحظة مباشرة بعد مبادلة قد تبدو قديمة بفتحة واحدة — هذا طبيعي.
المزيد في products/clmm/accounts.

الرسوم على المنحنى

هذا هو الجزء الدقيق ويستحق الإشارة إليه. تعمل حسابات المنحنى مقابل أرصدة الخزان الصافية — أي رصيد SPL الخام ناقص رسوم البروتوكول والصندوق والمنشئ المراكمة (جميعها ثلاثة دلاء مستقلة — انظر products/cpmm/fees). صورة ملموسة:
العواقب للمدمجين:
  • لا تقتبس من الأرصدة الخام. اطرح حقول الرسوم المراكمة أولاً، أو استدعِ SwapBaseInput كمحاكاة وخذ عودتها.
  • CollectProtocolFee ينقل الرموز خارج الخزان. بعد الجمع، ينخفض raw_vault_balance لكن curve_balance لم يتغير؛ سعر المجموعة لا يتحرك. هذا مقصود.

الدقة والفيض

  • تستخدم جميع حسابات المنحنى وسيطات u128 لمنع الفيض على x * y.
  • القسمة تقرب نحو الصفر باستثناء Δx_net في SwapBaseOutput، الذي يقرب لأعلى، وحساب الرسوم، الذي يقرب لأعلى على trade_fee ولأسفل على الأقسام الفرعية. يتم اختيار اتجاهات التقريب هذه بحيث لا ينخفض الثابت أبدًا بسبب الاختزال الصحيح.
  • قد تصل المجموعات ذات نسب الخزان القصوى (مليارات: 1) إلى أرضيات الدقة على الصفقات الصغيرة؛ يعيد البرنامج ZeroTradingTokens في هذه الحالة. انظر reference/error-codes.

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

المصادر: