Skip to main content
هذه الصفحة مُترجَمة آليًا بواسطة الذكاء الاصطناعي. النسخة الإنجليزية هي المرجع المعتمد.عرض النسخة الإنجليزية →
ترتبط هذه الصفحة بـ products/clmm/accounts (تعريف الحسابات) وproducts/clmm/math (الرياضيات المستخدمة). وهي المرجع المعتمد للوسائط وترتيب الحسابات؛ أما التخطيطات البايتية التفصيلية فتُستقى من IDL.

فهرس التعليمات

معظم التعليمات الحصرية للمشرف (CreateAmmConfig، UpdateAmmConfig، UpdatePoolStatus، CreateSupportMintAssociated، CreateOperationAccount، UpdateOperationAccount، CloseProtocolPosition) محمية بالمفتاح العام admin المُشفَّر في البرنامج. أما تعليمات مشرف تدفق المكافأة (TransferRewardOwner، CollectRemainingRewards) فمحميّة بالممول وليس بمشرف البرنامج. اللاحقة V2 تعني “يدعم Token-2022 على الخزائن/NFT، ويتطلب فتحة امتداد الخريطة النقطية”. يختار SDK الإصدار V2 افتراضيًا للبولات الجديدة.

CreatePool

الوسائط
الحسابات (مختصرة) الشروط المسبقة
  • token_mint_0 < token_mint_1 وفق الترتيب البايتي.
  • amm_config.disable_create_pool == false.
  • لا تكون الـ mints مرفوضة بواسطة قائمة السماح لإضافات Token-2022.
النتائج المضمونة
  • pool_state.sqrt_price_x64 = sqrt_price_x64، وtick_current = floor(log_{1.0001}(price)).
  • pool_state.liquidity = 0 (لا مراكز بعد).
  • pool_state.fee_on = FromInput (الإعداد الافتراضي القديم).
  • pool_state.dynamic_fee_info مُصفَّر (الرسوم الديناميكية معطلة).

CreateCustomizablePool

موصى به للبولات الجديدة. له نفس تأثير CreatePool مع إضافة وضع جمع الرسوم لكل بول على حدة وخيار اشتراك اختياري في الرسوم الديناميكية. الوسائط
الحسابات (مختصرة) — نفس CreatePool مع إضافة ما يلي عند enable_dynamic_fee = true: الشروط المسبقة — نفس CreatePool. إذا كان enable_dynamic_fee = false، يُتجاهل dynamic_fee_config. النتائج المضمونة
  • يُضبَط pool_state.fee_on على متغير CollectFeeOn المختار.
  • إذا كانت الرسوم الديناميكية مفعّلة: يُهيَّأ pool_state.dynamic_fee_info من DynamicFeeConfig المُزوَّد (تُنسَخ معاملات الضبط الخمسة؛ حقول الحالة تُصفَّر).
  • وإلا: يُصفَّر pool_state.dynamic_fee_info (= الرسوم الديناميكية معطلة نهائيًا لهذا البول).
يُضبَط fee_on وبت تفعيل الرسوم الديناميكية عند إنشاء البول فقط. لا توجد ترقية في الموضع — البولات المنشأة عبر CreatePool القديمة لا يمكنها اكتساب الرسوم الديناميكية أو الرسوم أحادية الجانب لاحقًا. ينبغي أن تكون هذه التعليمة الافتراضية في النشرات الجديدة.

OpenPositionV2 / OpenPositionWithToken22Nft

إنشاء مركز جديد داخل بول قائم. الوسائط
الحسابات (مختصرة) الرياضيات — راجع products/clmm/math. بناءً على base_flag، يُحوّل البرنامج إما liquidity أو (amount_0_max, amount_1_max) إلى القيمة الفعلية لـ L والمبالغ الفعلية للرموز المُستهلَكة. الشروط المسبقة
  • tick_lower < tick_upper، وكلاهما من مضاعفات pool.tick_spacing، وضمن النطاق [MIN_TICK, MAX_TICK].
  • tick arrays المطلوبة ممرَّرة ومُهيَّأة (أو مُنشأة هنا عبر CPI لـ InitTickArray في المعاملة).
  • لدى المستخدم ما لا يقل عن amount_0_max وamount_1_max في ATAs المصدر.
النتائج المضمونة
  • يوجد personal_position، ومضبوط liquidity، وملتقطة fee_growth_inside_last.
  • تُحدَّث مدخلات tick array عند tick_lower وtick_upper (liquidity_gross += L، liquidity_net ± L، ولقطات نمو الرسوم مُصانة).
  • pool_state.liquidity += L إذا كان المركز في النطاق (tick_lower ≤ tick_current < tick_upper).
الأخطاء الشائعةInvalidTickIndex، NotApproved، ZeroAmountSpecified، TransactionTooLarge (عند وجود عدد كبير جدًا من tick arrays).

IncreaseLiquidityV2

إضافة سيولة إلى مركز مفتوح. الوسائط
الحسابات — مشابهة لـ OpenPosition دون mint النفت (المركز موجود بالفعل؛ يُمرَّر NFT كـ ATA المالك الحامل لرمز واحد). التأثير
  • تحويل amount_0_actual / amount_1_actual من المستخدم إلى الخزائن.
  • زيادة personal_position.liquidity وpool_state.liquidity (إذا كان في النطاق)، وكذلك liquidity_gross / liquidity_net لنقاط الطرف.
  • جمع الرسوم والمكافآت المستحقة منذ آخر لمسة وإضافتها إلى tokens_fees_owed_{0,1} / reward_amount_owed. تُصرف هذه فقط عند DecreaseLiquidity أو CollectReward، لا عند الزيادة.

DecreaseLiquidityV2

سحب السيولة من مركز. الوسائط
الحسابات — نفس شكل IncreaseLiquidity. التأثير
  • حساب (amount_0, amount_1) للقيمة L المسحوبة بناءً على sqrt_price_x64 الحالية.
  • تسوية الرسوم/المكافآت المتراكمة منذ آخر لمسة، بنفس آلية IncreaseLiquidity.
  • تحويل amount_0 + fees_owed_0 وamount_1 + fees_owed_1 من الخزائن إلى المستخدم.
  • تقليل عدادات السيولة؛ إذا أصبح personal_position.liquidity == 0، يصبح المركز مؤهلاً لـ ClosePosition.
الانزلاقamount_0_min وamount_1_min هما الحدان الأدنى اللذان يقبلهما المستخدم صافيًا من رسوم تحويل Token-2022 على جانب المخرجات.

ClosePosition

حرق NFT المركز وإغلاق PersonalPositionState. الشروط المسبقة
  • personal_position.liquidity == 0.
  • tokens_fees_owed_{0,1} == 0.
  • جميع عدادات المكافآت reward_amount_owed == 0.
(أي: اجمع كل شيء وقلّل إلى الصفر أولاً.) التأثير
  • حرق NFT.
  • إغلاق حساب NFT mint وحساب personal_position، مع استرداد الإيجار إلى payer.

SwapV2

التنقل عبر منحنى السيولة؛ إدخال دقيق أو إخراج دقيق بحسب is_base_input. الوسائط
الحسابات (مختصرة) يمرّر المُستدعي قائمة مُرتَّبة من tick arrays تغطي مسار المبادلة المتوقع؛ يستخدم البرنامج منها ما يحتاجه. يحسب SDK هذه القائمة عبر PoolUtils.computeAmountOutFormat أو نقطة نهاية الاقتباس في الـ API. الشروط المسبقة
  • pool_state.status يسمح بالمبادلة.
  • now >= open_time.
  • sqrt_price_limit_x64 على الجانب الصحيح من sqrt_price_x64 للاتجاه المحدد.
الأخطاء الشائعةExceededSlippage، SqrtPriceLimitOverflow، TickArrayNotFound، LiquidityInsufficient. ما يفعله SwapV2 داخليًا مما ينبغي للمُستدعين معرفته (إصدار ما بعد 2025):
  1. رسوم ديناميكية إضافية — إذا كان pool.dynamic_fee_info غير صفري، يُحدّث البرنامج مُجمِّع التذبذب باستخدام المسافة بالنقاط المقطوعة منذ آخر مبادلة (مع قواعد التصفية/الاضمحلال من products/clmm/fees) ويُضيف dynamic_fee_component فوق AmmConfig.trade_fee_rate. إجمالي الرسوم محدود بنسبة 10% (MAX_FEE_RATE_NUMERATOR / 1_000_000).
  2. مطابقة أوامر الحد — عندما يتجاوز مسار السعر نقطة tick تحتوي على أوامر حد مفتوحة، يملأ البرنامج أولاً سيولة أوامر الحد المتاحة عند تلك النقطة (FIFO حسب order_phase)، ثم يتابع على طول منحنى سيولة LP. تُحدِّث المبالغ المنفذة tick.unfilled_ratio_x64 وtick.part_filled_orders_remaining للتسوية اللاحقة؛ تبقى الأوامر نفسها معلقة حتى يستدعي مالكها SettleLimitOrder.
  3. توجيه الرسوم أحادية الجانب — عندما يكون pool.fee_on = Token0Only أو Token1Only، تحسب خطوة المبادلة نفس المعاملة بين الإدخال والإخراج؛ ثم يُوجَّه الرسم إلى الجانب المُكوَّن. في الاتجاهات التي يكون فيها جانب الرسم المُكوَّن هو الإخراج، تُخصم الرسوم من مخرج المبادلة (يحصل المستخدم على out − fee)؛ أما في الاتجاهات التي يكون فيها على جانب الإدخال، فيُطابق السلوك FromInput. راجع is_fee_on_input(zero_for_one) وis_fee_on_token0(zero_for_one) على PoolState.
تُطبّق Swap (V1) نفس الرسوم الديناميكية وتوجيه الرسوم أحادية الجانب ومطابقة أوامر الحد كـ SwapV2؛ الميزة الوحيدة الغائبة هي دعم Token-2022 — يجب أن تكون كلتا الخزينتين من SPL Token الكلاسيكي. البولات التي تحتوي على أي mint من Token-2022 يجب مبادلتها عبر SwapV2. يُفضّل المُجمِّع والـ SDK بالفعل V2 لكل قطعة CLMM، فلا يحتاج المُستدعون إلى التفريع بحسب نوع الـ mint.

OpenLimitOrder

وضع أمر بيع عند نقطة tick محددة. يجلس الأمر في طابور FIFO خاص بكل نقطة ويُنفَّذ عند تجاوز السعر لها. الوسائط
الحسابات (مختصرة) الشروط المسبقة
  • tick_index % pool.tick_spacing == 0 وضمن [MIN_TICK, MAX_TICK].
  • يقع tick_index على الجانب الصحيح من pool.tick_current للاتجاه المختار (بيع token0 → يجب أن تكون النقطة أعلى من الحالية، والعكس). يُرفض البيع عند نقطة متجاوزة بالفعل لأنه سيُطابَق فوريًا.
  • pool_state.status يسمح بعمليات أمر الحد (البت 5).
النتائج المضمونة
  • يوجد limit_order، ملتقطًا tick.order_phase وtick.unfilled_ratio_x64 عند وقت الفتح.
  • tick.orders_amount += amount (في الفوج الحالي).
  • limit_order_nonce.order_nonce += 1.
  • إصدار حدث OpenLimitOrderEvent.
الأخطاء الشائعةInvalidLimitOrderAmount (صفر أو أدنى من الحد الأدنى للبول)، InvalidTickIndex (خارج [MIN_TICK, MAX_TICK]، أو على الجانب الخاطئ من tick_current للاتجاه المختار)، TickAndSpacingNotMatch (tick_index % pool.tick_spacing != 0OrderPhaseSaturated.

IncreaseLimitOrder

إضافة مبلغ إلى أمر مفتوح قائم. قابل للاستدعاء من owner الأمر فقط. الوسائط
الحسابات — مشابهة لـ OpenLimitOrder دون حساب nonce؛ يُمرَّر limit_order PDA مباشرةً. الشروط المسبقة
  • limit_order.owner == signer.
  • لا يزال الأمر في نفس الفوج (tick.order_phase == limit_order.order_phase). إذا بدأ الفوج في التنفيذ بالفعل، يكون الأمر مُسوَّى جزئيًا — ينبغي للمُستدعي استدعاء DecreaseLimitOrder أو SettleLimitOrder أولاً للمضي قدمًا.
التأثير
  • تحويل amount من ATA المالك إلى input_vault.
  • limit_order.total_amount += amount؛ tick.orders_amount += amount.

DecreaseLimitOrder

تقليل أو إلغاء أمر مفتوح كليًا. يُعيد الجزء غير المنفذ إلى المالك، إضافةً إلى أي مخرجات مُسوَّاة من تعبئات جزئية سابقة. الوسائط
الحسابات — كلا جانبَي الإدخال والإخراج: التأثير
  • إعادة حساب المبلغ المنفذ للأمر من unfilled_ratio_x64 للفوج منذ الفتح.
  • إرسال المخرجات المنفذة إلى output_token_account.
  • إرسال amount من الإدخال غير المنفذ إلى input_token_account.
  • تحديث limit_order وفقًا لذلك. إذا أصبح الجزء غير المنفذ المتبقي صفرًا، يُغلق البرنامج الحساب ويُعيد الإيجار إلى owner.

SettleLimitOrder

دفع رموز المخرجات المنفذة إلى المالك دون تغيير الجزء غير المنفذ للأمر. مفيد عندما يرغب حارس auto_withdraw في صرف التعبئات الجزئية طويلة الأمد تباعًا. المُستدعي — إما owner الأمر، أو limit_order_admin للبرنامج (محفظة ساخنة تشغيلية خارج السلسلة تُشغّل حلقة حارس آلية). لا تمتلك هذه المحفظة أي صلاحية أخرى — لا تستطيع تحريك أموال المستخدمين إلا بدفع المخرجات المنفذة إلى ATA المخرجات الخاص بـ owner الأمر. الحسابات التأثير
  • حساب إجمالي المخرجات المستحقة باستخدام (limit_order.unfilled_ratio_x64, tick.unfilled_ratio_x64).
  • تحويل الفرق إلى output_token_account.
  • تحديث limit_order.settled_output.
  • لا يُغلق الأمر؛ لا يزال مفتوحًا على أي إدخال متبقٍ.

CloseLimitOrder

إغلاق حساب أمر مُستهلك كليًا. يعود الإيجار دائمًا إلى limit_order.owner بصرف النظر عمّن وقّع. المُستدعي — إما owner أو limit_order_admin. الشروط المسبقة
  • الأمر لا يحتوي على جزء غير منفذ (إما أن amount == total_amount مُنفَّذ ومُسوَّى، أو أن المالك قلّل الأمر إلى الصفر مسبقًا ولم يُغلقه).
التأثير
  • إغلاق limit_order؛ إرسال الإيجار إلى limit_order.owner.

CreateDynamicFeeConfig (مشرف)

إنشاء مجموعة معاملات قابلة لإعادة الاستخدام تحت فهرس u16. الوسائط
الحسابات الأخطاء الشائعةInvalidDynamicFeeConfigParams إذا كان decay_period <= filter_period أو كان أي حقل بقيمة 0 خارج النطاق المسموح.

UpdateDynamicFeeConfig (مشرف)

تعديل DynamicFeeConfig قائمة. البولات التي أخذت لقطة من الإعداد وقت الإنشاء لا تُحدَّث بأثر رجعي؛ فقط البولات المُنشأة حديثًا التي تستند إلى هذا الإعداد ستلتقط القيم الجديدة. الوسائط — نفس حقول الضبط الخمسة كـ CreateDynamicFeeConfig (filter_period، decay_period، reduction_factor، dynamic_fee_control، max_volatility_accumulatorindex ثابت عند الإنشاء ولا يُمرَّر هنا.

CollectProtocolFee / CollectFundFee

نفس الشكل الموجود في CollectProtocolFee / CollectFundFee في CPMM. يجب أن يُطابق الموقِّع AmmConfig.owner / AmmConfig.fund_owner. يكنس الرسوم المتراكمة (بروتوكول/صندوق) من خزائن البول إلى المستلم، ويُصفِّر حقول PoolState.protocol_fees_* / fund_fees_* المقابلة.

InitializeReward

إضافة تدفق مكافأة جديد إلى بول. يُسمح بما يصل إلى 3 تدفقات نشطة في آنٍ واحد. الوسائط
الحسابات الشروط المسبقة
  • أقل من 3 تدفقات نشطة حاليًا على البول.
  • يُودع الممول total_emission = emissions_per_second × (end_time − open_time) من رمز المكافأة في الخزينة كجزء من هذه التعليمة.
  • mint المكافأة مُدرج في القائمة البيضاء وفق operation_state.

SetRewardParams

تمديد تدفق مكافأة قائم أو تعبئته أو تغيير معدل إصداره. يُستدعى عادةً من منشئ البول أو multisig Raydium. القيود موجودة على السلسلة: يمكن عادةً تمديد end_time أو زيادة الإصدار، لكن لا يمكن تقليصهما بأثر رجعي. تحقق من قائمة مالكي operation_state.

UpdateRewardInfos

محاسبة بحتة — تُسوّي reward_growth_global_x64 حتى الوقت الحالي بضرب emissions_per_second × Δt / liquidity. تُستدعى داخليًا من كل تعليمة تمسّ السيولة. مكشوفة كتعليمة مستقلة لأن جهات خارجية (واجهات المستخدم، المحركات) تريد أحيانًا تشغيلها.

CollectReward

يطالب مالك المركز برموز المكافأة المستحقة. الحسابات التأثير
  • تسوية نمو المكافأة (بنفس نمط الرسوم).
  • تحويل المبلغ المستحق إلى ATA المستلم، وتصفير reward_amount_owed[i].

مصفوفة تغييرات الحالة

الخطوات التالية

المصادر: