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

لماذا توجد التكات

السيولة في CLMM مركزة في نطاقات أسعار. لجعل هذه النطاقات قابلة للتطبيق على السلسلة، يتم تكميم الأسعار إلى تكات صحيحة، حيث يكون كل تك مضاعفًا ثابتًا للسابق: price(i)=1.0001i\text{price}(i) = 1.0001^{\,i} يقابل التك حركة سعر بنسبة 0.01%، أو حوالي 1 نقطة أساس. التعيين هو: يتم اختيار MIN_TICK و MAX_TICK بحيث يناسب sqrt_price_x64 في u128 في كلا الطرفين. تفرض كل مجموعة سيولة أن tick_lower >= MIN_TICK و tick_upper <= MAX_TICK. في الممارسة العملية، واجهة الويب تحد النطاق إلى شيء أضيق بكثير لمنع المستخدمين من قفل السيولة في تكات غير قابلة للوصول.

تباعد التك

يحدد AmmConfig الخاص بالمجموعة تباعد التك — التكات الوحيدة المسموح للمركز باستخدامها كنقاط نهاية. إذا كان tick_spacing = 60، فقط التكات …, −120, −60, 0, 60, 120, … صحيحة. محاولة فتح مركز بنقطة نهاية 31 ستعود مع InvalidTickIndex. التباعدات المنشورة الشائعة: كلما كان التباعد أغلظ، قل عدد مصفوفات التك التي يجب تهيئتها، وأرخص فتح مركز واسع، وأكثر غموضًا حد السعر. عادة ما تعيش الأزواج المتقلبة في فئات تباعد 120؛ والعملات المستقرة تعيش في فئات تباعد 1.

مصفوفات التك

لا تخزن المجموعة حالة لكل تك في حسابات منفصلة. بدلاً من ذلك، يتم ضغط TICK_ARRAY_SIZE تكات متجاورة (60 في Raydium CLMM الحالي) في TickArrayState واحد. أول تك في المصفوفة هو start_tick_index، وتغطي بالضبط TICK_ARRAY_SIZE * tick_spacing وحدات تك صحيحة. لـ tick_spacing = 60 و TICK_ARRAY_SIZE = 60:
  • تغطي كل مصفوفة تك 60 × 60 = 3600 تك صحيح.
  • start_tick_index هو مضاعف 3600: …, -7200, -3600, 0, 3600, 7200, ….
نقطة نهاية مركز t = 2040 عند tick_spacing = 60 تعيش في مصفوفة التك مع start_tick_index = 0. نقطة نهاية مركز t = 4200 تعيش في المصفوفة مع start_tick_index = 3600.

عند إنشاء مصفوفة

مصفوفة التك كسولة: أول مركز يشير إلى أي تك بداخلها يهيئ المصفوفة، دافعًا الإيجار. المبادلات لا تهيئ مصفوفات التك — فهي تتخطى المصفوفات غير المهيأة باستخدام الخريطة النقطية. يفحص تدفق فتح المركز في SDK النطاق المختار، ويحسب قائمة مصفوفات التك التي يلمسها، ويضيف تعليمات init_tick_array في نفس المعاملة مثل OpenPosition إذا كان أي منها مفقودًا.

لا يتم إغلاق مصفوفات التك

بمجرد تهيئة مصفوفة التك، تستمر طوال حياة المجموعة. البرنامج لا يعرض مسارًا لإغلاق مصفوفة تك، حتى بعد عودة initialized_tick_count إلى الصفر. لا توجد استرجاع إيجار لمصفوفات التك؛ الإيجار المدفوع من قبل أول مركز يلمس مصفوفة مقفول في هذا الحساب بشكل دائم. هذا مقايضة مقصودة: إعادة استخدام مصفوفة تك موجودة مجاني لكل مركز لاحق، لذا فإن مجموعة يتم تداولها بكثافة تدفع فقط تكلفة الإيجار مرة واحدة لكل فتحة (pool, start_tick_index) بغض النظر عن الحركة.

الخريطة النقطية

العثور على “التك المهيأ التالي إلى اليسار/اليمين من التك الحالي” يجب أن يكون سريعًا — قد تعبر المبادلة العديد من التكات. تخزن المجموعة خريطة نقطية بت واحد لكل مصفوفة تك مضمنة في PoolState للنطاق ±1,024 مصفوفة حول التك 0. خارج هذا النطاق (مراكز النطاق الكامل، الإعدادات الغريبة)، توفر TickArrayBitmapExtension الفائض. تمشي المبادلة الخريطة النقطية: lowest_set_bit_above(tick_current_array_index) يعطي المصفوفة التالية مع تك مهيأ على الجانب الذي تعبره المبادلة نحوه. داخل تلك المصفوفة، يحدد فحص بت مشابه التك المهيأ التالي.

liquidity_gross و liquidity_net

كل تك مهيأ يخزن قيمتي سيولة:
  • liquidity_gross — مجموع L على جميع المراكز التي تشير إلى هذا التك كنقطة نهاية. عندما يصل liquidity_gross إلى الصفر، يصبح التك غير مهيأ ويمكن إزالته من الخريطة النقطية.
  • liquidity_net — التغيير الموقّع لسيولة مستوى المجموعة عند عبور السعر هذا التك متحركًا صعودًا (من اليسار إلى اليمين في فضاء التك). إذا كان هذا التك هو الحد الأدنى لمركز بحجم L، فإنه يساهم بـ +L؛ إذا كان الحد الأعلى لهذا المركز، فإنه يساهم بـ −L.
مثال عملي: مركزان على نفس المجموعة.
  • المركز A: tick_lower = -120, tick_upper = 0, سيولة L_A = 100.
  • المركز B: tick_lower = -60, tick_upper = 60, سيولة L_B = 50.
حالة التك تلو التك: سيولة مستوى المجموعة لقيم tick_current مختلفة:
  • tick_current = -180: liquidity = 0 (قبل أي مركز)
  • tick_current = -90: liquidity = 100 (داخل A فقط)
  • tick_current = -30: liquidity = 150 (داخل A و B)
  • tick_current = 30: liquidity = 50 (داخل B فقط)
  • tick_current = 90: liquidity = 0 (بعد كليهما)
في كل عبور تك أثناء المبادلة، يضيف البرنامج liquidity_net (ربما سالب) إلى PoolState.liquidity. هذه هي آلية Uniswap-v3 بالضبط.

المراكز كـ NFTs

مركز Raydium CLMM هو NFT. يؤدي فتح مركز إلى صك نعناع جديد تمامًا بإمداد 1 في محفظة المتصل، وسلطة النعناع هي برنامج CLMM. يربط البرنامج ملكية المركز بـ من يحمل رصيدًا في ATA من هذا النعناع في وقت CPI. النتائج:
  • المراكز عادة ما تكون قابلة للتحويل. يمكن للمحفظة بيع أو إسقاط مركز بنقل NFT. يمكن للمالك الجديد بعد ذلك استدعاء CollectRewards، IncreaseLiquidity، إلخ. الاستثناء هو مركز مجمد بموجب مسار المُصدر المقيد أدناه.
  • المراكز قابلة للعنونة خارج CLMM. تعرض الأسواق والمحافظ المراكز مثل NFTs الأخرى. يعيّن SDK name/symbol معقول على بيانات وصف النعناع.
  • PDA الخاص بالمركز مشتق من نعناع NFT. يمكنك العثور على PersonalPositionState دون معرفة من يحمله حاليًا.

مراكز المُصدر المقيد

كل نعناع NFT للمركز الذي تم إنشاؤه بعد ترقية 2026-08 يسجل pool_state CLMM الخاص به كسلطة تجميد. هذا لا يعني أن كل مركز جديد مجمد. للمجموعات العادية وكل مركز غير متطابق، يبقى حساب رمز NFT غير مجمد وقابل للتحويل. لا يمكن لـ PDA المجموعة التوقيع خارج برنامج CLMM، ولا يعرض CLMM أي تعليمات تجميد للأغراض العامة. يتطلب التجميد كلا الشرطين:
  1. يتم فتح المركز من خلال OpenPositionV2 أو OpenPositionWithToken22Nft.
  2. يحمل نعناع واحد على الأقل من أنعناع خزان المجموعة سلطة تجميد من قائمة المُصدر المقيد المشفرة بالبرنامج.
فقط عندما يكون كلا الشرطين صحيحًا يقوم CLMM بتجميد حساب NFT للمركز المنشأ حديثًا مباشرة بعد الصك. OpenPosition V1 لا ينطبق هذا المرشح. انظر reference/program-addresses للقائمة الحالية. مركز مجمد:
  • لا يمكنه نقل NFT الخاص به إلى حساب رمز آخر.
  • لا يمكنه تغيير مالك حساب رمز NFT.
  • يمكنه زيادة أو تقليل السيولة وجمع الرسوم أو المكافآت عندما يوقع المالك المسجل.
  • يمكنه الإغلاق. يستخدم ClosePosition PDA المجموعة لإذابة حساب NFT، ثم يحرق NFT ويغلق حسابات المركز في نفس التعليمات.
لا يتم ترحيل المراكز الموجودة أو تجميدها بأثر رجعي. تحتفظ نعناعات NFT للمركز التي تم إنشاؤها قبل الترقية بإعدادات سلطة التجميد السابقة.
يجب على العميل الذي يغلق مركزًا مجمدًا إضافة pool_state الخاص بالمركز كأول حساب متبقي إلى ClosePosition. قائمة حسابات IDL المعلنة لم تتغير، لذا يمكن للعملاء الأقدم فتح مركز مجمد بنجاح لكن قد يفشلون لاحقًا في إغلاقه مع AccountLack. حدّث منشئ الإغلاق قبل دعم هذه المجموعات.

مراكز Token-2022

يمكن لـ CLMM صك نعناع NFT للمركز تحت Token الكلاسيكي SPL من خلال OpenPositionV2، أو تحت Token-2022 من خلال OpenPositionWithToken22Nft. كلا مسارات V2 تفحص نعناعات خزان المجموعة وتطبق نفس قاعدة تجميد المُصدر المقيد. OpenPosition V1 هو المسار الكلاسيكي الموروث ولا يمكنه خدمة مجموعة بنعناعات خزان Token-2022. التوافق مع المحفظة والسوق يختلف؛ تتبع واجهة Raydium كلا برنامج NFT.

قواعد النطاق المسموح

في وقت OpenPosition يفرض البرنامج:
  1. tick_lower < tick_upper.
  2. tick_lower % tick_spacing == 0 و tick_upper % tick_spacing == 0.
  3. MIN_TICK <= tick_lower و tick_upper <= MAX_TICK.
  4. قدم المتصل مصفوفات التك التي تحتوي على tick_lower و tick_upper — إما مهيأة بالفعل أو عبر init_tick_array في نفس المعاملة.
  5. حساب امتداد الخريطة النقطية، إذا امتد هذا المركز إلى نطاق الامتداد.
إذا فشل أي فحص، ستعود التعليمات مع InvalidTickIndex، NotApproved، أو InsufficientLiquidity حسب القيد. انظر reference/error-codes.

”في النطاق” مقابل “خارج النطاق”

يكون المركز في النطاق عندما tick_lower <= tick_current < tick_upper. فقط المراكز في النطاق تساهم في PoolState.liquidity وبالتالي فقط هي تكسب رسوم المبادلة. مركز خارج النطاق:
  • يحمل 100% من رمز واحد (الرمز الذي تجاوزه نطاقه). على وجه التحديد، إذا كان tick_current < tick_lower، يحمل المركز فقط token1 (تم بالفعل “بيعه” من خلال السعر الذي يتحرك بعيدًا)؛ إذا كان tick_current >= tick_upper، يحمل فقط token0.
  • لا يكسب رسوم المبادلة.
  • يستمر في تراكم المكافآت إذا كانت تدفقات مكافآت المجموعة تصدر إلى سيولة خارج النطاق — لكن السلوك الافتراضي لـ Raydium هو “الإصدار فقط إلى في النطاق”، مطابقًا لاتفاقية Uniswap v3. انظر products/clmm/fees.
يقضي مزودو السيولة الذين يديرون مراكز CLMM معظم انتباههم في الحفاظ على المراكز في النطاق مع تحرك السعر.

مزالق التكامل الشائعة

  • نقاط نهاية خارج التباعد. الكود الذي يحسب تك من سعر مستهدف يجب أن ينقر إلى مضاعف tick_spacing قبل تمريره إلى OpenPosition. مساعدات SDK (TickUtils.getTickWithPriceAndTickspacing) تفعل هذا؛ الرياضيات محلية الصنع غالبًا لا تفعل.
  • مصفوفات تك مفقودة. قد يتطلب فتح مركز واسع تهيئة عدة مصفوفات تك؛ نسيان تمريرها كحسابات قابلة للكتابة يعود. يعيد SDK openPositionFromBase القائمة لك.
  • تك قديم بعد مبادلة. يمكن لـ tick_current عبور العديد من التكات في مبادلة واحدة. إذا كانت UX الخاصة بك تعرض “تك حالي” من استدعاء RPC واحد ثم تفتح مركزًا في استدعاء لاحق، يمكن أن يكون الموضع النسبي مقابل السعر الحي بعيدًا بعشرات التكات. أعد الجلب قبل التوقيع مباشرة.
  • NFTs للمركز مع بيانات وصف إضافية. إذا قمت ببناء محفظة تتعرف على مراكز Raydium، استخدم PDA للمركز / بيانات البرنامج وليس حقل بيانات وصف مشفر. تستخدم نعناعات المركز الجديدة PDA المجموعة كسلطة نعناع وتجميد عند الإنشاء؛ تتم إزالة سلطة النعناع بعد صك NFT الواحد.
  • افتراض أن كل مركز قابل للتحويل. اقرأ حالة isFrozen لحساب رمز NFT قبل عرض الإجراءات المتعلقة بالنقل أو السوق أو الضمان أو الحرق والكسب.

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

المصادر: