> ## Documentation Index
> Fetch the complete documentation index at: https://docs.raydium.io/llms.txt
> Use this file to discover all available pages before exploring further.

# تعليمات CLMM

> مرجع شامل لتعليمات CLMM: دورة حياة البول، إدارة المراكز، المبادلة، وتدفقات المكافآت.

<Info>
  **هذه الصفحة مُترجَمة آليًا بواسطة الذكاء الاصطناعي. النسخة الإنجليزية هي المرجع المعتمد.**

  [عرض النسخة الإنجليزية →](/products/clmm/instructions)
</Info>

<Info>
  ترتبط هذه الصفحة بـ [`products/clmm/accounts`](/ar/products/clmm/accounts) (تعريف الحسابات) و[`products/clmm/math`](/ar/products/clmm/math) (الرياضيات المستخدمة). وهي المرجع المعتمد للوسائط وترتيب الحسابات؛ أما التخطيطات البايتية التفصيلية فتُستقى من IDL.
</Info>

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

| المجموعة | التعليمة                                                         | ملاحظات                                                                                                                                                                                                                                   |
| -------- | ---------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| المشرف   | `CreateAmmConfig`                                                | تعريف مستوى رسوم جديد.                                                                                                                                                                                                                    |
| المشرف   | `UpdateAmmConfig`                                                | تعديل المعدلات على مستوى رسوم قائم.                                                                                                                                                                                                       |
| المشرف   | `UpdatePoolStatus`                                               | إيقاف/استئناف العمليات على بول.                                                                                                                                                                                                           |
| المشرف   | `CreateSupportMintAssociated`                                    | إضافة إضافة mint من نوع Token-2022 إلى القائمة البيضاء للاستخدام في بولات CLMM.                                                                                                                                                           |
| المشرف   | `CreateOperationAccount`                                         | تهيئة حساب العمليات على مستوى البرنامج (مرة واحدة).                                                                                                                                                                                       |
| المشرف   | `UpdateOperationAccount`                                         | تعديل القائمة البيضاء لحساب العمليات.                                                                                                                                                                                                     |
| المشرف   | `CreateDynamicFeeConfig`                                         | إنشاء مجموعة معاملات رسوم ديناميكية قابلة لإعادة الاستخدام تحت فهرس u16.                                                                                                                                                                  |
| المشرف   | `UpdateDynamicFeeConfig`                                         | تعديل `DynamicFeeConfig` قائمة. البولات التي أخذت لقطة منها عند الإنشاء لا تتأثر بالتغيير.                                                                                                                                                |
| البول    | `CreatePool`                                                     | تهيئة بول CLMM مرتبط بـ `AmmConfig`. مسار الرسوم القياسي FromInput. يتعايش مع `CreateCustomizablePool`.                                                                                                                                   |
| البول    | `CreateCustomizablePool`                                         | موصى به للبولات الجديدة. نفس شكل `CreatePool` مع إضافة `collect_fee_on` وعلامة اشتراك اختيارية `enable_dynamic_fee`.                                                                                                                      |
| المركز   | `OpenPosition` / `OpenPositionV2` / `OpenPositionWithToken22Nft` | سك NFT للمركز. `OpenPositionV2` يحل محل V1 (تخطيط حساب أحدث مع فتحة امتداد الخريطة النقطية)؛ `OpenPositionWithToken22Nft` يُصدر NFT المركز بصيغة Token-2022 بدلاً من SPL Token. يُوصى باستخدام V2 أو نظيره من Token-2022 في الكود الجديد. |
| المركز   | `IncreaseLiquidity` / `IncreaseLiquidityV2`                      | إضافة سيولة إلى مركز قائم.                                                                                                                                                                                                                |
| المركز   | `DecreaseLiquidity` / `DecreaseLiquidityV2`                      | سحب السيولة مع جمع الرسوم المستحقة.                                                                                                                                                                                                       |
| المركز   | `ClosePosition`                                                  | حرق NFT وإغلاق `PersonalPositionState`.                                                                                                                                                                                                   |
| المركز   | `CloseProtocolPosition`                                          | تعليمة حصرية للمشرف لاسترداد حسابات `ProtocolPositionState` القديمة. البرنامج الحالي لا ينشئ هذه الحسابات ولا يقرأها — التعليمة موجودة فقط لاسترداد الإيجار على الحسابات التي أنشأتها إصدارات قديمة من البرنامج.                          |
| المبادلة | `Swap` / `SwapV2`                                                | مبادلة بسيولة ثابتة. كلا الإصدارين يدعمان الرسوم الديناميكية وتوجيه الرسوم أحادية الجانب ومطابقة أوامر الحد؛ الفارق الوحيد أن `SwapV2` يقبل mints من نوع Token-2022 (بينما يتطلب V1 خزينتَي SPL Token الكلاسيكيتين).                      |
| المبادلة | `SwapRouterBaseIn`                                               | مبادلة متعددة القفزات، يستخدمها الموجّه.                                                                                                                                                                                                  |
| أمر الحد | `OpenLimitOrder`                                                 | وضع أمر بيع عند نقطة tick. تبقى الرموز غير المنفذة على الـ tick؛ يملأها محرك المطابقة عند تجاوز السعر لها.                                                                                                                                |
| أمر الحد | `IncreaseLimitOrder`                                             | إضافة مبلغ إلى أمر مفتوح قائم.                                                                                                                                                                                                            |
| أمر الحد | `DecreaseLimitOrder`                                             | تقليل أو إلغاء أمر مفتوح؛ يُرجع الجزء غير المنفذ إضافةً إلى أي مخرجات مُسوّاة.                                                                                                                                                            |
| أمر الحد | `SettleLimitOrder`                                               | دفع رموز المخرجات المنفذة إلى صاحب الأمر. قابل للاستدعاء من المالك أو من الحارس التشغيلي.                                                                                                                                                 |
| أمر الحد | `CloseLimitOrder`                                                | إغلاق حساب أمر مُستهلك كليًا. يعود الإيجار دائمًا إلى `owner` الأمر. قابل للاستدعاء من المالك أو الحارس.                                                                                                                                  |
| الرسوم   | `CollectProtocolFee`                                             | استرداد رسوم البروتوكول من قِبل المشرف.                                                                                                                                                                                                   |
| الرسوم   | `CollectFundFee`                                                 | استرداد رسوم الصندوق من قِبل المشرف.                                                                                                                                                                                                      |
| المكافآت | `InitializeReward`                                               | إرفاق تدفق مكافأة جديد ببول.                                                                                                                                                                                                              |
| المكافآت | `SetRewardParams`                                                | تغيير معدل إصدار المكافأة أو وقت انتهائها.                                                                                                                                                                                                |
| المكافآت | `UpdateRewardInfos`                                              | تسوية نمو المكافأة حتى اللحظة الحالية (يُستدعى تلقائيًا عند كل مبادلة أو تغيير في المركز).                                                                                                                                                |
| المكافآت | `TransferRewardOwner`                                            | نقل الصلاحية المخوّلة بضبط تدفق المكافأة أو تعبئته.                                                                                                                                                                                       |
| المكافآت | `CollectRemainingRewards`                                        | بعد انتهاء `end_time` لتدفق المكافأة، استرداد الرموز غير المخصصة إلى الممول.                                                                                                                                                              |
| المرافق  | `InitTickArray`                                                  | تهيئة حساب tick array (يُجمَّع في الغالب مع `OpenPosition`).                                                                                                                                                                              |

معظم التعليمات الحصرية للمشرف (`CreateAmmConfig`، `UpdateAmmConfig`، `UpdatePoolStatus`، `CreateSupportMintAssociated`، `CreateOperationAccount`، `UpdateOperationAccount`، `CloseProtocolPosition`) محمية بالمفتاح العام `admin` المُشفَّر في البرنامج. أما تعليمات مشرف تدفق المكافأة (`TransferRewardOwner`، `CollectRemainingRewards`) فمحميّة بالممول وليس بمشرف البرنامج.

اللاحقة V2 تعني "يدعم Token-2022 على الخزائن/NFT، ويتطلب فتحة امتداد الخريطة النقطية". يختار SDK الإصدار V2 افتراضيًا للبولات الجديدة.

## `CreatePool`

**الوسائط**

```
sqrt_price_x64: u128           // السعر الابتدائي
open_time:      u64            // تُرفض المبادلات قبل هذا الوقت
```

**الحسابات (مختصرة)**

| #  | الاسم                         | W | S | ملاحظات                               |
| -- | ----------------------------- | - | - | ------------------------------------- |
| 1  | `pool_creator`                | W | S |                                       |
| 2  | `amm_config`                  |   |   | مستوى الرسوم المختار.                 |
| 3  | `pool_state`                  | W |   | يُهيَّأ هنا.                          |
| 4  | `token_mint_0`                |   |   | مُرتَّب.                              |
| 5  | `token_mint_1`                |   |   |                                       |
| 6  | `token_vault_0`               | W |   | يُهيَّأ هنا، مملوك لـ PDA سلطة البول. |
| 7  | `token_vault_1`               | W |   |                                       |
| 8  | `observation_state`           | W |   | يُهيَّأ هنا.                          |
| 9  | `tick_array_bitmap_extension` | W |   | يُهيَّأ هنا (V2).                     |
| 10 | `token_program`               |   |   |                                       |
| 11 | `token_program_2022`          |   |   |                                       |
| 12 | `system_program`، `rent`      |   |   |                                       |

**الشروط المسبقة**

* `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` مع إضافة وضع جمع الرسوم لكل بول على حدة وخيار اشتراك اختياري في الرسوم الديناميكية.

**الوسائط**

```rust theme={null}
pub struct CreateCustomizableParams {
    pub sqrt_price_x64:    u128,
    pub collect_fee_on:    CollectFeeOn,   // FromInput | Token0Only | Token1Only
    pub enable_dynamic_fee: bool,
}
```

**الحسابات (مختصرة)** — نفس `CreatePool` مع إضافة ما يلي عند `enable_dynamic_fee = true`:

| # | الاسم                | W | S | ملاحظات                                                          |
| - | -------------------- | - | - | ---------------------------------------------------------------- |
| N | `dynamic_fee_config` |   |   | الإعداد المشترك المراد أخذ لقطة منه. يجب أن يكون موجودًا مسبقًا. |

**الشروط المسبقة** — نفس `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`

إنشاء مركز جديد داخل بول قائم.

**الوسائط**

```
tick_lower_index: i32
tick_upper_index: i32
tick_array_lower_start_index: i32
tick_array_upper_start_index: i32
liquidity:  u128              // قيمة L المطلوبة (أو 0 لاستخدام المبالغ أدناه)
amount_0_max: u64
amount_1_max: u64
with_metadata: bool           // كتابة بيانات NFT الوصفية (Metaplex)
base_flag: Option<bool>       // true = ملاءمة للمبلغ 0؛ false = ملاءمة للمبلغ 1
```

**الحسابات (مختصرة)**

| #  | الاسم                                     | W | S           |                                          |
| -- | ----------------------------------------- | - | ----------- | ---------------------------------------- |
| 1  | `payer`                                   | W | S           |                                          |
| 2  | `position_nft_owner`                      |   |             |                                          |
| 3  | `position_nft_mint`                       | W | S (keypair) |                                          |
| 4  | `position_nft_account`                    | W |             | ATA المالك لـ NFT.                       |
| 5  | `metadata_account`                        | W |             | Metaplex (اختياري، عند `with_metadata`). |
| 6  | `pool_state`                              | W |             |                                          |
| 7  | `protocol_position`                       |   |             |                                          |
| 8  | `tick_array_lower`                        | W |             | يُنشأ إن لم يكن مُهيَّأً.                |
| 9  | `tick_array_upper`                        | W |             | كذلك.                                    |
| 10 | `personal_position`                       | W |             | يُنشأ هنا.                               |
| 11 | `token_account_0`، `token_account_1`      | W |             | ATAs المصدر للمستخدم.                    |
| 12 | `token_vault_0`، `token_vault_1`          | W |             |                                          |
| 13 | `rent`، `system_program`، `token_program` |   |             |                                          |
| 14 | `associated_token_program`                |   |             |                                          |
| 15 | `metadata_program`                        |   |             | اختياري.                                 |
| 16 | `token_program_2022`                      |   |             | V2.                                      |
| 17 | `vault_0_mint`، `vault_1_mint`            |   |             | V2.                                      |
| 18 | `tick_array_bitmap_extension`             | W |             | V2 (عند اللمس).                          |

**الرياضيات** — راجع [`products/clmm/math`](/ar/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`

إضافة سيولة إلى مركز مفتوح.

**الوسائط**

```
liquidity: u128
amount_0_max: u64
amount_1_max: u64
base_flag: Option<bool>
```

**الحسابات** — مشابهة لـ `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`

سحب السيولة من مركز.

**الوسائط**

```
liquidity: u128
amount_0_min: u64
amount_1_min: u64
```

**الحسابات** — نفس شكل `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`.

**الوسائط**

```
amount: u64                  // الإدخال إذا كان is_base_input=true، وإلا فالإخراج
other_amount_threshold: u64  // أدنى إخراج أو أقصى إدخال
sqrt_price_limit_x64: u128   // حد صارم؛ 0 ⇒ غير محدود
is_base_input: bool
```

**الحسابات (مختصرة)**

| #   | الاسم                                   | W | S | ملاحظات                              |
| --- | --------------------------------------- | - | - | ------------------------------------ |
| 1   | `payer`                                 |   | S |                                      |
| 2   | `amm_config`                            |   |   |                                      |
| 3   | `pool_state`                            | W |   |                                      |
| 4   | `input_token_account`                   | W |   |                                      |
| 5   | `output_token_account`                  | W |   |                                      |
| 6   | `input_vault`                           | W |   |                                      |
| 7   | `output_vault`                          | W |   |                                      |
| 8   | `observation_state`                     | W |   |                                      |
| 9   | `token_program`                         |   |   |                                      |
| 10  | `token_program_2022`                    |   |   | V2.                                  |
| 11  | `memo_program`                          |   |   | V2 (مطلوب لبعض مسارات Token-2022).   |
| 12  | `input_vault_mint`، `output_vault_mint` |   |   | V2.                                  |
| 13  | `tick_array_bitmap_extension` (اختياري) | W |   | إذا دخلت المبادلة منطقة الامتداد.    |
| 14+ | `tick_array` (المتبقية)                 | W |   | مصفوفات كافية لتغطية النطاق المتوقع. |

يمرّر المُستدعي قائمة مُرتَّبة من 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`](/ar/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 خاص بكل نقطة ويُنفَّذ عند تجاوز السعر لها.

**الوسائط**

```
nonce_index:    u8       // فهرس حساب nonce المختار من المستخدم (0..255 لكل محفظة)
zero_for_one:   bool     // true: بيع token0 مقابل token1؛ false: بيع token1 مقابل token0
tick_index:     i32      // يجب أن يكون من مضاعفات pool.tick_spacing
amount:         u64      // مبلغ رمز الإدخال
```

**الحسابات (مختصرة)**

| #  | الاسم                    | W | S | ملاحظات                                                                   |
| -- | ------------------------ | - | - | ------------------------------------------------------------------------- |
| 1  | `payer`                  | W | S | مالك الأمر؛ يدفع الإيجار.                                                 |
| 2  | `pool_state`             | W |   |                                                                           |
| 3  | `tick_array`             | W |   | مصفوفة tick التي تحتوي على `tick_index`.                                  |
| 4  | `limit_order_nonce`      | W |   | PDA. `init_if_needed` — يُنشأ عند أول أمر للمستخدم تحت هذا `nonce_index`. |
| 5  | `limit_order`            | W |   | PDA. يُنشأ هنا.                                                           |
| 6  | `input_token_account`    | W |   | ATA الإدخال للمستخدم.                                                     |
| 7  | `input_vault`            | W |   | خزينة الإدخال للبول.                                                      |
| 8  | `input_vault_mint`       |   |   | معالجة رسوم Token-2022.                                                   |
| 9  | `input_token_program`    |   |   | SPL أو Token-2022.                                                        |
| 10 | `system_program`، `rent` |   |   |                                                                           |

**الشروط المسبقة**

* `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` الأمر فقط.

**الوسائط**

```
amount: u64    // مبلغ إضافي من رمز الإدخال
```

**الحسابات** — مشابهة لـ `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`

تقليل أو إلغاء أمر مفتوح كليًا. يُعيد الجزء غير المنفذ إلى المالك، إضافةً إلى أي مخرجات مُسوَّاة من تعبئات جزئية سابقة.

**الوسائط**

```
amount:     u64    // مبلغ رمز الإدخال المراد سحبه (الحد الأقصى = الجزء غير المنفذ)
amount_min: u64    // حد أدنى للانزلاق على جانب سحب الإدخال
```

**الحسابات** — كلا جانبَي الإدخال والإخراج:

| #  | الاسم                                   | W | S |
| -- | --------------------------------------- | - | - |
| 1  | `owner`                                 |   | S |
| 2  | `pool_state`                            | W |   |
| 3  | `tick_array`                            | W |   |
| 4  | `limit_order`                           | W |   |
| 5  | `input_token_account`                   | W |   |
| 6  | `output_token_account`                  | W |   |
| 7  | `input_vault`                           | W |   |
| 8  | `output_vault`                          | W |   |
| 9  | `input_vault_mint`، `output_vault_mint` |   |   |
| 10 | `token_program`، `token_program_2022`   |   |   |

**التأثير**

* إعادة حساب المبلغ المنفذ للأمر من `unfilled_ratio_x64` للفوج منذ الفتح.
* إرسال المخرجات المنفذة إلى `output_token_account`.
* إرسال `amount` من الإدخال غير المنفذ إلى `input_token_account`.
* تحديث `limit_order` وفقًا لذلك. إذا أصبح الجزء غير المنفذ المتبقي صفرًا، يُغلق البرنامج الحساب ويُعيد الإيجار إلى `owner`.

## `SettleLimitOrder`

دفع رموز المخرجات المنفذة إلى المالك دون تغيير الجزء غير المنفذ للأمر. مفيد عندما يرغب حارس `auto_withdraw` في صرف التعبئات الجزئية طويلة الأمد تباعًا.

**المُستدعي** — إما `owner` الأمر، أو `limit_order_admin` للبرنامج (محفظة ساخنة تشغيلية خارج السلسلة تُشغّل حلقة حارس آلية). لا تمتلك هذه المحفظة أي صلاحية أخرى — لا تستطيع تحريك أموال المستخدمين إلا بدفع المخرجات المنفذة إلى ATA المخرجات الخاص بـ `owner` الأمر.

**الحسابات**

| # | الاسم                  | W | S |                                 |
| - | ---------------------- | - | - | ------------------------------- |
| 1 | `signer`               |   | S | المالك *أو* `limit_order_admin` |
| 2 | `pool_state`           |   |   |                                 |
| 3 | `tick_array`           |   |   |                                 |
| 4 | `limit_order`          | W |   |                                 |
| 5 | `output_token_account` | W |   | ATA مخرجات المالك.              |
| 6 | `output_vault`         | W |   | خزينة مخرجات البول.             |
| 7 | `output_vault_mint`    |   |   |                                 |
| 8 | `output_token_program` |   |   |                                 |

**التأثير**

* حساب إجمالي المخرجات المستحقة باستخدام `(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.

**الوسائط**

```
index:                       u16
filter_period:               u16   // بالثواني؛ مثلاً 30
decay_period:                u16   // بالثواني؛ مثلاً 600. يجب أن يكون > filter_period
reduction_factor:            u16   // 1..10_000؛ مثلاً 5_000 = 50% احتفاظ لكل نافذة اضمحلال
dynamic_fee_control:         u32   // 1..100_000؛ مكسب على منحنى التذبذب-إلى-الرسوم
max_volatility_accumulator:  u32   // سقف
```

**الحسابات**

| # | الاسم                | W | S | ملاحظات                         |
| - | -------------------- | - | - | ------------------------------- |
| 1 | `owner`              | W | S | المفتاح العام للمشرف المُشفَّر. |
| 2 | `dynamic_fee_config` | W |   | PDA، يُنشأ هنا.                 |
| 3 | `system_program`     |   |   |                                 |

**الأخطاء الشائعة** — `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 تدفقات نشطة في آنٍ واحد.

**الوسائط**

```
open_time:     u64
end_time:      u64
emissions_per_second_x64: u128   // Q64.64
```

**الحسابات**

| # | الاسم                    | W | S |                                                    |
| - | ------------------------ | - | - | -------------------------------------------------- |
| 1 | `reward_funder`          | W | S |                                                    |
| 2 | `funder_token_account`   | W |   |                                                    |
| 3 | `amm_config`             |   |   |                                                    |
| 4 | `pool_state`             | W |   |                                                    |
| 5 | `operation_state`        |   |   | PDA حالة عمليات CLMM التي تتحكم في إنشاء المكافآت. |
| 6 | `reward_token_mint`      |   |   |                                                    |
| 7 | `reward_token_vault`     | W |   | يُنشأ هنا.                                         |
| 8 | `reward_token_program`   |   |   |                                                    |
| 9 | `system_program`، `rent` |   |   |                                                    |

**الشروط المسبقة**

* أقل من 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`

يطالب مالك المركز برموز المكافأة المستحقة.

**الحسابات**

| # | الاسم                     | W | S |                                  |
| - | ------------------------- | - | - | -------------------------------- |
| 1 | `nft_owner`               |   | S |                                  |
| 2 | `nft_account`             |   |   | ATA المالك الحامل لـ NFT المركز. |
| 3 | `personal_position`       | W |   |                                  |
| 4 | `pool_state`              | W |   |                                  |
| 5 | `protocol_position`       |   |   |                                  |
| 6 | `reward_token_vault`      | W |   |                                  |
| 7 | `recipient_token_account` | W |   |                                  |
| 8 | `token_program`           |   |   |                                  |
| 9 | `token_program_2022`      |   |   |                                  |

**التأثير**

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

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

| التعليمة                 | `pool.liquidity`    | `pool.fee_growth_global` | `pool.reward_growth_global` | `personal_position.liquidity` | Tick array                                     |
| ------------------------ | ------------------- | ------------------------ | --------------------------- | ----------------------------- | ---------------------------------------------- |
| `CreatePool`             | 0                   | 0                        | —                           | —                             | —                                              |
| `OpenPosition`           | + إذا كان في النطاق | —                        | —                           | جديد                          | إضافة liquidity\_gross/net                     |
| `IncreaseLiquidity`      | + إذا كان في النطاق | تسوية المستحق            | تسوية المستحق               | +                             | تعديل                                          |
| `DecreaseLiquidity`      | − إذا كان في النطاق | تسوية المستحق            | تسوية المستحق               | −                             | تعديل                                          |
| `ClosePosition`          | —                   | —                        | —                           | محذوف                         | —                                              |
| `SwapV2`                 | ± عند التقاطعات     | +                        | —                           | —                             | تقاطع وقلب الخارج؛ مطابقة أفواج أوامر الحد     |
| `OpenLimitOrder`         | —                   | —                        | —                           | —                             | `orders_amount += amount` على النقطة المستهدفة |
| `IncreaseLimitOrder`     | —                   | —                        | —                           | —                             | `orders_amount += amount`                      |
| `DecreaseLimitOrder`     | —                   | —                        | —                           | —                             | `orders_amount -=`، قد يُغلق الفوج             |
| `SettleLimitOrder`       | —                   | —                        | —                           | —                             | — (قراءة فقط على النقطة)                       |
| `CloseLimitOrder`        | —                   | —                        | —                           | —                             | —                                              |
| `CreateCustomizablePool` | 0                   | 0                        | —                           | —                             | —                                              |
| `UpdateRewardInfos`      | —                   | —                        | +                           | —                             | —                                              |
| `CollectReward`          | —                   | —                        | تسوية المستحق               | —                             | —                                              |

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

* [`products/clmm/code-demos`](/ar/products/clmm/code-demos) — نماذج TypeScript قابلة للتشغيل.
* [`products/clmm/fees`](/ar/products/clmm/fees) — تفاصيل استحقاق الرسوم والمكافآت.
* [`reference/error-codes`](/ar/reference/error-codes) — جدول أخطاء Anchor الكامل لـ CLMM.

المصادر:

* [`raydium-io/raydium-clmm` — `programs/amm/src/instructions`](https://github.com/raydium-io/raydium-clmm)
* Raydium SDK v2 — `@raydium-io/raydium-sdk-v2`
