هذه الصفحة مُترجَمة آليًا بواسطة الذكاء الاصطناعي. النسخة الإنجليزية هي المرجع المعتمد.عرض النسخة الإنجليزية →
ترتبط هذه الصفحة بـ
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):
- رسوم ديناميكية إضافية — إذا كان
pool.dynamic_fee_infoغير صفري، يُحدّث البرنامج مُجمِّع التذبذب باستخدام المسافة بالنقاط المقطوعة منذ آخر مبادلة (مع قواعد التصفية/الاضمحلال منproducts/clmm/fees) ويُضيفdynamic_fee_componentفوقAmmConfig.trade_fee_rate. إجمالي الرسوم محدود بنسبة 10% (MAX_FEE_RATE_NUMERATOR / 1_000_000). - مطابقة أوامر الحد — عندما يتجاوز مسار السعر نقطة tick تحتوي على أوامر حد مفتوحة، يملأ البرنامج أولاً سيولة أوامر الحد المتاحة عند تلك النقطة (FIFO حسب
order_phase)، ثم يتابع على طول منحنى سيولة LP. تُحدِّث المبالغ المنفذةtick.unfilled_ratio_x64وtick.part_filled_orders_remainingللتسوية اللاحقة؛ تبقى الأوامر نفسها معلقة حتى يستدعي مالكهاSettleLimitOrder. - توجيه الرسوم أحادية الجانب — عندما يكون
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 != 0)، OrderPhaseSaturated.
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_accumulator)؛ index ثابت عند الإنشاء ولا يُمرَّر هنا.
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].
مصفوفة تغييرات الحالة
الخطوات التالية
products/clmm/code-demos— نماذج TypeScript قابلة للتشغيل.products/clmm/fees— تفاصيل استحقاق الرسوم والمكافآت.reference/error-codes— جدول أخطاء Anchor الكامل لـ CLMM.
raydium-io/raydium-clmm—programs/amm/src/instructions- Raydium SDK v2 —
@raydium-io/raydium-sdk-v2

