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

# رياضيات AMM v4

> ثابت الناتج الثابت مع اتفاقية الرسوم في AMM v4، تحويل سعر الاحتياطي إلى سعر دفتر الأوامر، بناء شبكة الأوامر المستهدفة، وخطوة تسوية الربح والخسارة.

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

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

## الثابت الرياضي

يحافظ المجمع على `coin_reserve × pc_reserve = k`، حيث (بعد إزالة OpenBook في 2026-07):

```
coin_reserve = coin_vault_balance - accrued_pnl_coin
pc_reserve   = pc_vault_balance   - accrued_pnl_pc
```

هناك نقطتان مهمتان:

1. الاحتياطيات الآن **من الخزائن فقط**. تم حذف المصطلح التاريخي لأوامر مفتوحة (الرموز التي كان المجمع قد احتفظ بها كأوامر محدودة في OpenBook) — كانت قيمتها صفرًا عمليًا قبل وقت طويل من الإزالة. يمكنك حساب `k` مباشرة من أرصدة الخزائن على السلسلة.
2. تراكم الربح والخسارة (`need_take_pnl_*`) يُطرح بحيث يتم الحفاظ على المنحنى عندما يقوم المسؤول بجمع الرسوم. نفس المبدأ المستخدم في استبعاد `protocol_fees_*` في CPMM.

يحسب البرنامج هذا عبر `calc_total_without_take_pnl_no_orderbook` (النسخة القديمة التي تدرك دفتر الأوامر قد اختفت).

كل عملية `Swap*` تفرض `k' ≥ k` بعد إضافة حصة الرسوم الخاصة بـ LP مرة أخرى إلى الاحتياطيات.

## اتفاقية الرسوم

يستخدم AMM v4 **رسوم النسبة** (أزواج البسط/المقام) بدلاً من اتفاقية `1/1_000_000` في CPMM / CLMM. هيكل `Fees` على السلسلة (انظر [`Fees::initialize`](https://github.com/raydium-io/raydium-amm/blob/master/program/src/state.rs) في مصدر البرنامج) يفترض بشكل افتراضي:

```
Fees {
  min_separate_numerator:    5,
  min_separate_denominator:  10_000,   //  5/10_000 = 0.05%

  trade_fee_numerator:      25,
  trade_fee_denominator:    10_000,    // 25/10_000 = 0.25% — used for OpenBook limit-order pricing

  pnl_numerator:            12,
  pnl_denominator:          100,       // 12/100   = 12%   — protocol's share OF the swap fee

  swap_fee_numerator:       25,
  swap_fee_denominator:     10_000,    // 25/10_000 = 0.25% — gross fee on AMM-path swaps
}
```

التفسير (الإعدادات الافتراضية المنشورة على الشبكة الرئيسية):

* **إجمالي رسم المبادلة:** `swap_fee = amount_in × 25 / 10_000 = 0.25%` من المدخل الإجمالي.
* **حصة البروتوكول:** `pnl_numerator / pnl_denominator = 12 / 100 = 12%` **من رسم المبادلة**، وهو ما يعادل `0.25% × 12% = 0.03%` من الحجم. تتراكم هذه الحصة في عدادات الربح والخسارة ويتم جمعها بواسطة `WithdrawPnl`.
* **حصة LP:** الـ `88%` المتبقية من رسم المبادلة، وهو ما يعادل `0.25% × 88% = 0.22%` من الحجم. تبقى في المجمع وتزيد من `k`.
* **لا توجد حصة صندوق.** AMM v4 لا يحتوي على تقسيم رسوم الصندوق في CPMM/CLMM.

لاحظ أن `pnl_numerator / pnl_denominator` هي كسر **من الرسم**، وليس من حجم التداول — وهي قراءة خاطئة شائعة لأسماء هذه الحقول.

تم استخدام `trade_fee_numerator / trade_fee_denominator` (أيضًا `25 / 10_000`) تاريخيًا من قبل تكامل OpenBook عند حساب الأسعار الشاملة للرسوم لشبكة الأوامر المحدودة للـ AMM. مع إزالة كود OpenBook، هذا الحقل أصبح قديمًا؛ رسم المبادلة النشط هو `swap_fee_*`.

الانحرافات عن هذه الإعدادات الافتراضية نادرة لكنها موجودة على عدد قليل من المجمعات القديمة؛ اقرأ دائمًا الرسوم من `AmmInfo.fees` قبل الاقتباس.

## رياضيات المبادلة المباشرة (مسار AMM)

الحالة الأبسط: يقوم المستخدم بالمبادلة مقابل خزائن المجمع دون التفاعل مع OpenBook. الاحتياطيات الداخلية للمجمع (بما في ذلك التخصيصات على الكتاب) هي المقام.

**SwapBaseIn (مدخل دقيق):**

```
amount_after_fee = amount_in − ceil(amount_in × swap_fee_numerator / swap_fee_denominator)
amount_out = amount_after_fee × out_reserve
           / (in_reserve + amount_after_fee)
require(amount_out >= minimum_amount_out)
```

الاحتياطيات المستخدمة هنا هي أرصدة الخزائن (ناقص الربح والخسارة المتراكمة). تاريخيًا، كانت الصيغة تضيف أيضًا الرموز التي كان لدى AMM مقفلة في أوامر OpenBook؛ **تم حذف هذا المصطلح** — الاحتياطيات الفعلية الآن تساوي أرصدة الخزائن الخام ناقص الربح والخسارة المعلقة. تم حذف مسار `MonitorStep` / التسوية الضمنية الذي اعتاد تحديث جانب OpenBook.

**SwapBaseOut (مخرج دقيق):**

```
amount_in_after_fee = ceil(in_reserve × amount_out / (out_reserve − amount_out))
amount_in_gross     = ceil(amount_in_after_fee × swap_fee_denominator
                            / (swap_fee_denominator − swap_fee_numerator))
require(amount_in_gross <= maximum_amount_in)
```

## تفاعل دفتر الأوامر (تاريخي)

<Note>
  **تم الحذف.** يعكس بناء الشبكة الموصوف في هذا القسم كيفية **انعكاس** AMM v4 في الأصل للمنحنى على سوق OpenBook. تم **حذف** تكامل OpenBook — بما في ذلك crank `MonitorStep` ومنطق شبكة `build_orders` — **من البرنامج** (ترقية 2026-07). يتم الحفاظ على الرياضيات أدناه بحتة كسياق تاريخي لما كانت حسابات `target_orders` / `amm_open_orders` على السلسلة مخصصة له ذات مرة.
</Note>

بشكل منفصل عن مبادلات المستخدم، وضع AMM v4 تاريخيًا **شبكة** من الأوامر المحدودة على سوق OpenBook. تم حساب الشبكة من معاملات `AmmInfo`:

* **`depth`** — عدد مستويات الأسعار لكل جانب.
* **`amount_wave`** — وحدة الحجم الأساسية لكل مستوى.
* **`min_size`**, **`coin_lot_size`**, **`pc_lot_size`** — قيود سوق OpenBook.
* **`state_data.swap_acc_coin_fee`**, **`swap_acc_pc_fee`** — عدادات الرسوم التراكمية منذ آخر `TakePnl`.

يشتق البرنامج أسعار كل مستوى بالسير من سعر المنحنى الحالي في خطوات نسبة ثابتة:

```
price_level(k) = curve_price × (1.0001 ^ k)       # conceptually
size_level(k)  = amount_wave × f(depth, k)        # tapered by depth
```

يتم تحديد الأسعار والأحجام الدقيقة بواسطة `target_orders` المحسوبة في `build_orders` والمقارنة مع `amm_open_orders` في كل `MonitorStep`. أي اختلاف ينتج عنه إلغاءات + منشورات جديدة. تستقر الأوامر المملوءة حديثًا على OpenBook في خزائن المجمع في العملية التالية التي تحدث جانب OpenBook.

نادرًا ما يحتاج المدمجون إلى حساب الشبكة — يحافظ عليها حارس Raydium — لكن من المفيد معرفة أن:

* المجمع الذي يحتوي على سيولة **على الكتاب** كبيرة له تلك السيولة تساهم في `k`، وليس خاملة.
* سوق OpenBook القديم (قائمة الأحداث ممتلئة، cranks محجوبة) يمنع تحديثات الشبكة؛ يمكن لـ AMM بعد ذلك أن يقتبس أسعارًا تختلف عن دفتر الأوامر المرئي حتى crank التالي.

## خطوة التسوية (الربح والخسارة)

تتراكم حصة البروتوكول بنسبة 0.03% في `state_data.need_take_pnl_coin` و `state_data.need_take_pnl_pc`. `TakePnl` ينقل هذه المبالغ خارج الخزائن إلى الوجهة المحددة من قبل المسؤول، ثم يصفر العدادات.

خاصية حاسمة: يتم حساب الاحتياطيات في الثابت **ناقص** الربح والخسارة المتراكمة، لذا `TakePnl` لا ينقل المنحنى. هذا يطابق اتفاقية CPMM.

## مثال عملي

حالة المجمع:

* `coin_reserve = 1_000_000_000_000` (1,000,000 جانب العملة؛ 6 منازل عشرية)
* `pc_reserve   = 2_000_000_000_000` (2,000,000 جانب الكمبيوتر؛ 6 منازل عشرية)
* الرسوم: افتراضي `swap = 25/10_000`, `pnl = 3/10_000`.

المستخدم: `SwapBaseIn` مدخل دقيق `1_000_000_000` عملة (1,000 عملة).

```
swap_fee        = ceil(1_000_000_000 * 25 / 10_000)    = 2_500_000
amount_after_fee =                                      997_500_000

amount_out = amount_after_fee * pc_reserve
           / (coin_reserve + amount_after_fee)
           = 997_500_000 * 2_000_000_000_000
           / (1_000_000_000_000 + 997_500_000)
           ≈ 1_995_015_009  (1,995.015 pc)

// Of the 2_500_000 swap fee:
pnl_share = 2_500_000 * 3 / 25  = 300_000    (goes to protocol via need_take_pnl_coin)
lp_share  = 2_500_000 * 22 / 25 = 2_200_000  (stays in coin_reserve)

new coin_reserve = 1_000_000_000_000 + 1_000_000_000                 = 1_001_000_000_000
                   (of which 300_000 is accrued PnL)
  curve coin_reserve = 1_001_000_000_000 − 300_000 = 1_000_999_700_000
new pc_reserve   = 2_000_000_000_000 − 1_995_015_009                 ≈ 1_998_004_984_991

k' = curve_coin_reserve * new_pc_reserve
   ≈ 2.000_002_701E24
k  = 1_000_000_000_000 * 2_000_000_000_000
   = 2.0E24
k' > k   ✓
```

حصة LP (`2_200_000`) لا تُفصل في أي مكان — إنها ببساطة الباقي الذي يرفع `k'`.

## قواعد الدقة

* عمليات ضرب الاحتياطيات تستخدم `u128`؛ القسمات النهائية تقرب نحو الصفر.
* `swap_fee` يقرب لأعلى (بحيث لا يقلل المجمع الرسوم).
* `amount_in` لـ `SwapBaseOut` يقرب لأعلى (بحيث لا يقلل المستخدم الدفع).
* المجمعات ذات نسب الاحتياطي القصوى يمكن أن تصل إلى `ZeroTradingTokens` على مدخلات صغيرة جدًا؛ نفس الاتفاقية مثل CPMM.

## القيود مقابل CPMM

* احتياطيات AMM v4 الآن من الخزائن فقط، لذا **يمكنك** الاقتباس مباشرة من أرصدة الخزائن (ناقص `need_take_pnl_*`) — المتطلب السابق لإضافة مبالغ `open_orders.free` / `open_orders.locked` لم يعد ينطبق. بقية SDK / API تبقى الخيار الأبسط.
* AMM v4 لا يعرض TWAP منظم على السلسلة. المستهلكون الخارجيون الذين يريدون سعرًا مدعومًا بـ AMM-v4 يجب أن يحسبوه بأنفسهم من سجلات التداول.
* Token-2022 غير مدعوم.

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

* [`products/amm-v4/instructions`](/ar/products/amm-v4/instructions) — حيث يتم توصيل `SwapBaseIn`, `Deposit`, وغيرها.
* [`products/amm-v4/fees`](/ar/products/amm-v4/fees) — ميكانيكا الرسوم الكاملة، تفاصيل `TakePnl`.
* [`algorithms/constant-product`](/ar/algorithms/constant-product) — الاشتقاق المشترك.

المصادر:

* [مصدر برنامج Raydium AMM — `raydium-io/raydium-amm`](https://github.com/raydium-io/raydium-amm)
* وحدة `Liquidity` في Raydium SDK v2
