> ## 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.

# تعليمات المزرعة / Staking

> CreateFarm و Deposit و Withdraw و Harvest و AddReward و SetRewards و RestartRewards و WithdrawReward — السطح الكامل للتعليمات عبر farm v3 و v5 و v6.

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

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

<Info>
  تعليمات المزرعة خاصة بالإصدار. تعليمة `Deposit` على v6 غير قابلة للاستدعاء على مزرعة v5 والعكس صحيح. يقوم SDK بالتوزيع من خلال قراءة مالك برنامج المزرعة؛ بالنسبة إلى CPI على السلسلة، يجب عليك اختيار معرّف البرنامج الصحيح مقدمًا.
</Info>

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

| الغرض                                          | v3                            | v5                            | v6                |
| ---------------------------------------------- | ----------------------------- | ----------------------------- | ----------------- |
| إنشاء مزرعة                                    | `CreateFarm`                  | `CreateFarm`                  | `CreateFarm`      |
| إضافة دفتر أستاذ المستخدم (قد يكون ضمنيًا)     | `CreateUserLedger`            | `CreateAssociatedLedger`      | ضمني في `Deposit` |
| Staking                                        | `Deposit`                     | `Deposit`                     | `Deposit`         |
| Unstaking                                      | `Withdraw`                    | `Withdraw`                    | `Withdraw`        |
| المطالبة بالمكافآت فقط                         | غير متاح (استخدم `Deposit 0`) | غير متاح (استخدم `Deposit 0`) | `Harvest`         |
| إضافة تدفق مكافأة بعد الإنشاء                  | غير متاح                      | `AddReward`                   | `AddReward`       |
| تعديل تدفق مكافأة موجود                        | غير متاح                      | `SetRewards`                  | `SetRewards`      |
| إعادة تشغيل مكافأة بعد end\_time               | غير متاح                      | `RestartRewards`              | `RestartRewards`  |
| سحب ميزانية المكافآت غير المطالب بها (المسؤول) | غير متاح                      | `WithdrawReward`              | `WithdrawReward`  |

على v3 و v5، الطريقة الموصى بها للمطالبة بالمكافآت دون تغيير الحصة هي استدعاء `Deposit` مع `amount = 0`. يتعامل البرنامج مع هذا كتسوية بحتة. أدخل v6 `Harvest` صريح لتوضيح الأمور.

يجرّد SDK كل هذا خلف `raydium.farm.deposit({ ... })` وما إلى ذلك. تتناول الأقسام أدناه قوائم الحسابات الأساسية للمدمجين الذين يحتاجون إلى بناء التعليمات يدويًا (المجمعات وأدوات المراقبة وملحقات SDK).

## `CreateFarm` (v6)

إنشاء مزرعة v6 جديدة.

**الوسائط**

```
reward_info_count: u8               // عدد تدفقات المكافآت عند الإنشاء (1..=5)
reward_infos: [
  {
    open_time:            u64,
    end_time:             u64,
    emission_per_second_x64: u128,   // Q64.64
    mint:                 Pubkey,    // نعناع المكافأة
    token_program:        Pubkey,    // SPL أو Token-2022
  }
]
```

**الحسابات** (موجزة، ل `reward_info_count = 1`)

| #  | الاسم                      | W | S | ملاحظات                                                           |
| -- | -------------------------- | - | - | ----------------------------------------------------------------- |
| 1  | `creator`                  | W | S | يدفع الإيجار، يمتلك المزرعة.                                      |
| 2  | `farm_state`               | W |   | حساب `FarmState` جديد.                                            |
| 3  | `farm_authority`           |   |   | PDA `[farm_id]`.                                                  |
| 4  | `staking_mint`             |   |   |                                                                   |
| 5  | `staking_vault`            | W |   | تم إنشاؤه كـ ATA للسلطة أو منجم PDA.                              |
| 6  | `staking_token_program`    |   |   |                                                                   |
| 7  | `reward_mint`              |   |   |                                                                   |
| 8  | `reward_vault`             | W |   | سيستقبل الميزانية الأولية.                                        |
| 9  | `reward_token_program`     |   |   |                                                                   |
| 10 | `reward_sender_ata`        | W |   | ATA المُنشئ على نعناع المكافأة؛ يتم استنزافه بواسطة هذه التعليمة. |
| 11 | `system_program`           |   |   |                                                                   |
| 12 | `token_program`            |   |   |                                                                   |
| 13 | `associated_token_program` |   |   |                                                                   |
| 14 | `rent`                     |   |   |                                                                   |

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

* `open_time > now`، `end_time > open_time`.
* ATAs المنشئ تحتفظ بما لا يقل عن `emission_per_second_x64 × (end_time − open_time) / 2^64` من نعناع المكافأة.
* لا يحتوي `staking_mint` على سلطة تجميد، أو يتم تعطيل سلطة التجميد.

**الشروط اللاحقة**

* تم تهيئة `FarmState`، `total_staked = 0`.
* تم تمويل منجم (منجم) المكافآت بميزانية التدفق الكاملة.
* تم استنزاف ATA المكافأة للمُنشئ بهذا المبلغ.

## `Deposit` (v6)

Stake `amount` من نعناع الحصة.

**الوسائط**

```
amount: u64
```

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

| #        | الاسم                      | W | S |
| -------- | -------------------------- | - | - |
| 1        | `user`                     | W | S |
| 2        | `user_ledger`              | W |   |
| 3        | `farm_state`               | W |   |
| 4        | `farm_authority`           |   |   |
| 5        | `staking_vault`            | W |   |
| 6        | `user_staking_ata`         | W |   |
| 7..(7+n) | `reward_vault_{i}`         | W |   |
| ...      | `user_reward_ata_{i}`      | W |   |
| last−2   | `system_program`           |   |   |
| last−1   | `token_program`            |   |   |
| last     | `associated_token_program` |   |   |

إذا كان `user_ledger` غير موجود، يضيف SDK بادئة `CreateAccount`-style ix؛ يمكن لبرنامج v6 أيضًا إنشاؤه بكسل مرة واحدة بالنظر إلى حساب البرنامج النظامي. نمط الحسابات المتبقية: لكل مكافأة نشطة، أضف `(reward_vault, user_reward_ata)` حتى تتمكن التسوية من الدفع.

**التأثير**

1. تحديث `reward_per_share_x64[i]` لكل تدفق مكافأة نشط باستخدام صيغة التحديث الكسول.
2. حساب `pending_i = user_ledger.deposited × reward_per_share_x64[i] / 2^64 − user_ledger.reward_debts[i]`.
3. نقل `pending_i` من `reward_vault_{i}` إلى `user_reward_ata_{i}`.
4. نقل `amount` نعناع الحصة من `user_staking_ata` إلى `staking_vault`.
5. تحديث `user_ledger.deposited += amount` وإعادة التقاط `reward_debts[i]`.
6. تحديث `farm_state.total_staked += amount`.

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

* `amount > 0` للحصة الحقيقية (v6 يمنع `amount = 0` — استخدم `Harvest` للمطالبة فقط).
* يحتفظ `user_staking_ata` بـ `amount` على الأقل.
* يحتفظ كل منجم مكافأة نشط بـ pending المستحق لهذا المستخدم على الأقل.

## `Withdraw` (v6)

Unstake `amount`.

**الوسائط**

```
amount: u64
```

**الحسابات** — مطابقة لـ `Deposit`.

**التأثير** — نفس التسوية مثل `Deposit`، ثم نقل نعناع الحصة مرة أخرى للمستخدم: `staking_vault → user_staking_ata`. ينخفض كل من `total_staked` و `user_ledger.deposited`.

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

* `amount ≤ user_ledger.deposited`.
* المزرعة لم تتوقف عن العمل.

## `Harvest` (v6)

المطالبة بالمكافآت المعلقة دون تغيير الحصة.

**الوسائط** — لا توجد.

**الحسابات** — نفس `Deposit`، بدون حركة على جانب الحصة.

**التأثير** — تحديث `reward_per_share_x64[i]`، دفع `pending_i`، إعادة التقاط `reward_debts[i]`. بدون تغيير في `total_staked` أو `deposited`.

## `AddReward` (v5/v6)

إضافة تدفق مكافأة جديد إلى مزرعة موجودة بها فتحة غير مستخدمة.

**الوسائط**

```
reward_info: {
  open_time:            u64,
  end_time:             u64,
  emission_per_second_x64: u128,
  mint:                 Pubkey,
  token_program:        Pubkey,
}
```

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

* توجد فتحة حرة (`reward_info_count < 5` على v6، `< 2` على v5).
* `open_time ≥ now` (قد يكون في المستقبل) أو يُسمح بـ `open_time < now` فقط إذا سمح برنامج الإصدار — v6 يفعل، v5 لا.

**الشروط اللاحقة**

* تم تهيئة التدفق الجديد في الفهرس `reward_info_count`، `reward_info_count++`.
* يتم جمع منجم المكافأة بميزانية التدفق الكاملة من ATA المستدعي.

**خطأ شائع** — `RewardAlreadyExists` إذا تضارب النعناع مع فتحة موجودة.

## `SetRewards` (v5/v6)

توسيع أو زيادة تدفق مكافأة موجود. لا يمكن تغيير النعناع؛ لا يمكن تقصير `end_time`؛ لا يمكن خفض `emission_per_second_x64` بمجرد تشغيله.

**الوسائط**

```
reward_index:         u8
new_open_time:        u64,
new_end_time:         u64,
new_emission_per_second_x64: u128,
```

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

* التدفق لا يزال قيد التشغيل (`reward_state == 1`).
* `new_end_time ≥ current end_time`.
* الميزانية الإضافية المطلوبة `(new_emission × new_duration − already_emissioned)` موجودة في ATA المُرسل ويتم نقلها إلى منجم المكافأة بواسطة التعليمة.

على v5، المكالمة المكافئة هي `SetRewards` مع مجموعة وسائط أصغر (بدون تغييرات في الثانية على التدفقات النشطة).

## `RestartRewards` (v5/v6)

إعادة تشغيل تدفق بعد مرور `end_time`. من الناحية المفاهيمية، نفس `AddReward` لنعناع يحتوي بالفعل على فتحة.

**الوسائط** — شكل متطابق لـ `AddReward` في هذا الفهرس.

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

* `reward_state == 2` (انتهى).
* المستدعي هو `reward_sender` للفتحة (v6) أو مالك المزرعة (v5).

## `WithdrawReward` (v5/v6)

تنظيف إداري لرصيد منجم المكافآت غير المطالب به بعد انتهاء التدفق وحصول جميع المراهنين على فرصة للحصاد.

**الوسائط**

```
reward_index: u8
```

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

* التدفق انتهى (`reward_state == 2`).
* `reward_total_emissioned == reward_claimed + vault_balance` (لا شيء مستحق حاليًا).

**التأثير** — نقل الباقي إلى `reward_sender_ata`. لا يمنع البرنامج السحب بينما لا يزال لدى المراهنين مطالبات معلقة؛ يُتوقع من المسؤول حصاد نيابة عن المراهنين المتأخرين أولاً (أو السماح لهم بالحصاد). إذا قمت بالمسح مبكرًا، يفقد المستخدمون الوصول إلى مكافآتهم غير المطالب بها. **لا تستدعِ هذا مبكرًا.**

## تباينات v5

* `Deposit` و `Withdraw` لهما نفس الشكل مثل v6 لكنهما يستخدمان ما يصل إلى 2 فتحة مكافآت و `reward_per_share` هو `u128` (نقطة ثابتة بأساس مختلف).
* `CreateAssociatedLedger` مكالمة منفصلة مطلوبة قبل أول `Deposit`؛ دمج v6 هذا.
* `AddReward` متاح، `Harvest` ليس كذلك (استخدم `Deposit 0`).

## تباينات v3

* تدفق مكافأة واحد. لا `AddReward`، لا فتحة ثانية.
* `Deposit 0` هو الطريقة الوحيدة للمطالبة.
* يجب استدعاء `CreateUserLedger` قبل أول `Deposit`.

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

| التعليمة         | `total_staked` | `user.deposited` | `reward_per_share` | مناجم المكافآت     |
| ---------------- | -------------- | ---------------- | ------------------ | ------------------ |
| `CreateFarm`     | 0              | —                | 0                  | ممول من قبل المنشئ |
| `Deposit(n)`     | +n             | +n               | تحديث              | −pending (مدفوع)   |
| `Withdraw(n)`    | −n             | −n               | تحديث              | −pending           |
| `Harvest`        | —              | —                | تحديث              | −pending           |
| `AddReward`      | —              | —                | —                  | +ميزانية جديدة     |
| `SetRewards`     | —              | —                | —                  | +ميزانية دلتا      |
| `RestartRewards` | —              | —                | —                  | +ميزانية           |
| `WithdrawReward` | —              | —                | —                  | −باقي              |

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

* [`products/farm-staking/code-demos`](/ar/products/farm-staking/code-demos) — أمثلة TypeScript.
* [`products/farm-staking/accounts`](/ar/products/farm-staking/accounts) — تخطيطات `FarmState` و `UserLedger` و `UserStake`.
* [`reference/error-codes`](/ar/reference/error-codes) — تعداد خطأ المزرعة.

المصادر:

* [وحدة Raydium SDK v2 `Farm`](https://github.com/raydium-io/raydium-sdk-V2)
* مصدر برنامج مزرعة Raydium (v3 / v5 / v6)
