هذه الصفحة مُترجَمة آليًا بواسطة الذكاء الاصطناعي. النسخة الإنجليزية هي المرجع المعتمد.عرض النسخة الإنجليزية →
تصف هذه الصفحة التخطيط والدور لكل حساب. البذور (Seeds) موثقة بشكل قانوني في
reference/program-addresses. مجمع CLMM يتطلب حسابات أكثر من مجمع CPMM لأن السيولة مخزنة بشكل متفرق عبر نطاق التيك؛ فهم هذا التفرق هو الجزء الأساسي من هذه الصفحة.جرد الحسابات
يتم وصف مجمع CLMM النشط بعائلات الحسابات التالية. جميعها مملوكة لبرنامج CLMM باستثناء النقودين (Mints) وخزائنهما.PoolState
حالة المجمع النشطة، تُقرأ في كل مبادلة وكل تغيير موضع.
sqrt_price_x64وtick_currentهما حالة سعر المجمع. يتم تحديثهما معًا في كل مبادلة.tick_currentهو الحد الأدنى لـlog_{1.0001}(price).liquidityهي السيولة النشطة — مجموع قيمLلجميع المواضع التي يحتوي نطاقها علىtick_current. تتغير في كل مرة تعبر مبادلة تيك وفي كل مرة يتم فتح/إغلاق/تغيير حجم موضع.fee_growth_global_{0,1}_x64هي الرسوم المتراكمة المكتسبة لكل وحدة سيولة عبر تاريخ المجمع بالكامل. تقرأ المواضع هذا لحساب ما يُستحق لها.tick_spacingمقفل علىAmmConfigعند التهيئة ولا يتغير أبدًا. يحدد أي فهارس تيك يُسمح بها فقط كنقاط نهاية للموضع.tick_array_bitmapهي خريطة بت مضمنة تغطي نطاق التيك المستخدم بشكل شائع حول سعر السوق. بالنسبة للمجمعات التي تصل مواضعها بعيدًا، يعيش تتبع الفائض فيTickArrayBitmapExtensionالمنفصل.fee_onثابت عند إنشاء المجمع.0(FromInput) يعيد إنتاج سلوك Uniswap-V3 الكلاسيكي.1و2يوجهان رسوم المبادلة إلى جانب واحد من الكتاب — انظرproducts/clmm/feesللمقارنات.seed_indexهو[0, 0]لكل مجمع تم إنشاؤه عبرCreatePool/CreateCustomizablePool(مجمع قانوني واحد لكل زوج). قيمة غير صفرية تعني أن المجمع تم إنشاؤه عبرCreatePermissionedPoolوالفهرس جزء من بذور PDA للمجمع، مما يسمح بعدة مجمعات بالتعايش لنفس(config, mint0, mint1). لإعادة اشتقاق عنوان مثل هذا المجمع يجب أن تعرفseed_index.dynamic_fee_infoيحمل حالة التقلب لرسوم الرسوم الديناميكية. عند التفعيل، تعيد كل مبادلة حسابdynamic_fee_componentفوقAmmConfig.trade_fee_rate. التخطيط موثق تحتDynamicFeeInfoأدناه؛ المجمعات بدون رسوم ديناميكية تترك البنية بأكملها صفرية.
AmmConfig
CreateAmmConfig معرّف protocol_fee_owner::ID المشفر في البرنامج إلى owner و fund_fee_owner::ID إلى fund_owner. قبل ذلك، كان ينسخ مفتاح موقّع المسؤول إلى كليهما. تحتفظ التكوينات الموجودة بما تم إنشاؤها أو تدويرها إليه، لذا اقرأ كلا الحقلين من الحساب. معاملات UpdateAmmConfig 3 / 4 لا تزال تدورهما. العناوين موجودة في reference/program-addresses.
مجموعة نموذجية منشورة من فئات رسوم CLMM (تأكد مقابل GET https://api-v3.raydium.io/main/clmm-config):
protocol_fee_rate و fund_fee_rate هي كسور من رسوم التداول؛ نفس الاتفاقية مثل CPMM. انظر products/clmm/fees.
TickArrayState
لا يخزن CLMM سجلاً واحدًا لكل تيك. سيكون ذلك مليارات الحسابات. بدلاً من ذلك، يجمع TICK_ARRAY_SIZE تيكات متجاورة مهيأة أم لا (عادة 60 أو 88 حسب إصدار البرنامج) في TickArrayState يتم إنشاؤه بكسل عند الاستخدام الأول.
order_phaseهو معرّف المجموعة. يزداد في كل مرة تنتقل مجموعة من “غير مملوءة بالكامل” إلى “مملوءة جزئيًا”.orders_amountهو إجمالي الرمز المدخل للمجموعة الحالية (الأحدث).part_filled_orders_remainingيتتبع المجموعة السابقة التي يتم ملؤها حاليًا بواسطة المبادلات الجارية.unfilled_ratio_x64هو مضروب Q64.64 محمول على المجموعة: عندما تملأ مبادلة X% من المجموعة، يتم ضرب النسبة بـ(1 − X). يخزن كل أمر مفتوح صورته الخاصة(order_phase, unfilled_ratio_x64)عند وقت الفتح، لذا تقليل رياضيات المقارنة بين الصور.
- نقطة نهاية التيك للموضع t يجب أن تحقق
t % tick_spacing == 0. يرفض البرنامج المواضع خارج التباعد. - مصفوفة التيك موجودة في
floor(t / (TICK_ARRAY_SIZE * tick_spacing)) * (TICK_ARRAY_SIZE * tick_spacing). - يتم تهيئة مصفوفة التيك بكسل: الموضع الأول أو المبادلة التي تلمس مصفوفة غير مهيأة تنشئها، وتدفع الإيجار.
- مصفوفة التيك لا تُغلق أبدًا من قبل البرنامج. بمجرد تخصيصها تستمر طوال حياة المجمع، حتى بعد أن يعود كل تيك بداخلها إلى
liquidity_gross == 0. تعيد المواضع والمبادلات اللاحقة استخدام الحساب الموجود بدون إيجار إضافي. لا توجد مسار تنظيف مدفوع بـClosePositionلمصفوفات التيك.
TickArrayBitmapExtension
PoolState.tick_array_bitmap (مضمن) يغطي نطاق “قريب من السوق” — ±512 مصفوفة تيك (TICK_ARRAY_BITMAP_SIZE = 512؛ الحقل [u64; 16] هو 1,024 بت مقسم بالتساوي بين فهارس البداية السالبة والموجبة، لذا فهارس المصفوفة −512 … +511). خارج هذا النطاق (لقيم التيك القصوى)، يحتفظ البرنامج بحساب امتداد:
(MIN_TICK, MAX_TICK)) تتطلبها؛ SDK يحلها لك.
المواضع
موضع CLMM هو حزمة من ثلاثة حسابات بالإضافة إلى mint:NFT mint للموضع
SPL Token أو Token-2022 mint بإمداد 1. موضع NFT في محفظة المالك هو ATA يحتفظ بهذا الرمز الواحد. يربط البرنامج التفويض إلى المالك الحالي لرصيد ATA الخاص بـ NFT، وليس إلى Pubkey مخزن في الحالة. تعيين NFT mints الجديدpool_state كسلطة تجميد قبل صك الرمز الواحد وإزالة سلطة الصك. تعيين سلطة تجميد لا يجمد حساب NFT بحد ذاته. يبقى الحساب غير مجمد وقابل للنقل ما لم تكن كلا الشرطين صحيحين: يستخدم المتصل OpenPositionV2 أو OpenPositionWithToken22Nft، وتظهر سلطة التجميد لـ mint الخزان الأساسي على الأقل على قائمة المُصدر المقيد لـ CLMM. فقط بعد ذلك يجمد CLMM حساب NFT بعد الصك. هذا لا يغير أي بايتات PersonalPositionState أو PoolState.
PersonalPositionState
واحد لكل موضع مفتوح. مفتاح من mint NFT.
ProtocolPositionState (مهجور)
خزنت إصدارات CLMM الأقدم حسابات مجمعة لكل
(pool, tick_lower, tick_upper) في ProtocolPositionState PDA. الإصدارات الأحدث لم تعد تنشئ أو تقرأ هذا الحساب. الفتحة لا تزال تظهر على قوائم حسابات OpenPosition / IncreaseLiquidity / DecreaseLiquidity كـ UncheckedAccount لتوافق ABI، لكن البرنامج لا يكتب إليها. الحسابات الموجودة على السلسلة هي بقايا؛ يمكن للمسؤول استدعاء CloseProtocolPosition لاسترجاع الإيجار لها.يتم اشتقاق حسابات النطاق المجمعة الآن مباشرة من تيكات النقطة النهائية (liquidity_gross و liquidity_net و fee_growth_outside_* / reward_growths_outside_x64 لكل تيك) في TickArrayState. صيغة نمو الرسوم داخل fee_growth_inside = global − outside_lower − outside_upper تستمر في العمل بدون حساب موضع مجمع.الملاحظة
(tick_cumulative[t1] − tick_cumulative[t0]) / (t1 − t0) ثم price = 1.0001 ** tick. انظر algorithms/clmm-math.
DynamicFeeConfig و DynamicFeeInfo
معاملات الرسوم الديناميكية تعيش في مكانين. القالب القابل لإعادة الاستخدام — DynamicFeeConfig — مُدار من قبل المسؤول ومشترك بين المجمعات التي تشترك. حالة وقت التشغيل لكل مجمع — DynamicFeeInfo — مضمنة في PoolState ويتم تحديثها بواسطة كل مبادلة.
DynamicFeeConfig
["dynamic_fee_config", index.to_be_bytes()]. تم الإنشاء عبر create_dynamic_fee_config (مبوابة المسؤول) وتم التعديل عبر update_dynamic_fee_config. مجمع تم إنشاؤه بـ enable_dynamic_fee = true يلتقط معاملات المعايرة الخمسة للتكوين (filter_period و decay_period و reduction_factor و dynamic_fee_control و max_volatility_accumulator) في DynamicFeeInfo الخاص به عند وقت الإنشاء؛ التعديلات اللاحقة على DynamicFeeConfig لا تؤثر بأثر رجعي على المجمعات الموجودة.
DynamicFeeInfo (مضمن في PoolState)
DynamicFeeConfig. رياضيات الرسوم وقواعد الاضمحلال موثقة تحت products/clmm/math و products/clmm/fees.
الثوابت المستخدمة بواسطة الصيغة:
LimitOrderState
حساب واحد لكل أمر حد مفتوح.
- الفتح — يستدعي المستخدم
open_limit_order، يودعtotal_amountمن الرمز المدخل، يتم ربط الأمر بمجموعةTickState. - (اختياري) الزيادة / الإنقاص —
increase_limit_orderيضيف إلىtotal_amount؛decrease_limit_orderيعيد الرموز غير المملوءة (وأي إخراج مستقر حتى تلك النقطة). - الاستقرار — عندما تكون المجموعة مملوءة بالكامل أو جزئيًا، يستدعي المالك أو حارس التشغيل
settle_limit_orderلدفع رموز الإخراج إلى ATA المالك. - الإغلاق — بمجرد
unfilled_amount == 0، يكون الحساب قابلاً للإغلاق. الإيجار يعود دائمًا إلىowner.
[owner.as_ref(), limit_order_nonce.key().as_ref(), limit_order_nonce.order_nonce.to_be_bytes().as_ref()]. عنوان PDA للأمر فريد لكل (owner, nonce_index, order_nonce).
LimitOrderNonce
عداد لكل (wallet, nonce_index) يسمح لمستخدم واحد بتشغيل خطوط أنابيب متوازية متعددة من أوامر الحد بدون تصادم على PDAs.
[user_wallet.as_ref(), &[nonce_index]]. معظم العملاء يستخدمون nonce_index = 0 ويدعون order_nonce يحمل الأساسية.
Permission
حساب قدرة وجوده هو المنحة: إذا تم اشتقاق Permission PDA لسلطة معينة، قد تستدعي تلك السلطة CreatePermissionedPool. لا يخزن شيئًا بعيدًا عن السلطة التي تم إنشاؤها لها.
["permission", authority.as_ref()]. تم الإنشاء من قبل مسؤول عبر CreatePermissionPda وتم الهدم عبر ClosePermissionPda (الإيجار يعود إلى المتصل). كلا التعليمات الإدارية تقبل إما برنامج admin أو مفتاح permission_pda_admin مخصص. إغلاق PDA يلغي المنحة — لا يمكن للسلطة إنشاء مجمعات إضافية، لكن المجمعات التي أنشأتها بالفعل لم تتأثر.
اشتقاق الحسابات الرئيسية
reference/program-addresses.
مرجع دورة الحياة السريع
حسابات
TickArrayState لا تُغلق أبدًا من قبل البرنامج — تستمر طوال حياة المجمع. بمجرد تهيئة مصفوفة التيك تبقى على السلسلة حتى عندما يعود كل تيك بداخلها إلى liquidity_gross == 0. إعادة استخدام مصفوفة تيك موجودة مجاني؛ فقط الموضع الأول الذي يلمس مصفوفة لم تُهيأ أبدًا يدفع إيجارها.
ما يجب قراءته أين
- رياضيات التيك وميكانيكا النطاق:
products/clmm/ticks-and-positions. - مسار المبادلة ورياضيات نمو الرسوم:
products/clmm/math. - قوائم حسابات التعليمات:
products/clmm/instructions. - الرسوم وتراكم المكافآت:
products/clmm/fees. - معرفات البرنامج القانونية والبذور:
reference/program-addresses.

