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

# رسوم CPMM

> كيفية فرض CPMM لرسم تجارة ورسم منشئ منفصل، وتقسيم رسم التجارة بين مزودي السيولة والخزانة البروتوكول ومحفظة الصندوق، وتقسيم حصة قابلة للتكوين من رسم المنشئ إلى البروتوكول عند وقت التحصيل، ومن يجمع ماذا ومتى.

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

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

## رسمان مستقلان، أربع وجهات

يفرض CPMM **رسمين بمعدلات منفصلة** على كل مبادلة:

1. **رسم التجارة** — يُفرض بمعدل `AmmConfig.trade_fee_rate` ويُقسّم بين ثلاث وجهات:
   * **حصة مزودي السيولة** — تبقى في الخزينة وتزيد `k`. يتم المطالبة بها ضمنيًا بحرق رموز LP.
   * **حصة البروتوكول** — تُجمّع في `PoolState.protocol_fees_token*`؛ يتم تجميعها بواسطة `protocol_owner` عبر `CollectProtocolFee`.
   * **حصة الصندوق** — تُجمّع في `PoolState.fund_fees_token*`؛ يتم تجميعها بواسطة `fund_owner` عبر `CollectFundFee`.
2. **رسم المنشئ** (اختياري، لكل مجموعة) — يُفرض بمعدل `AmmConfig.creator_fee_rate` **بشكل مستقل** عن رسم التجارة ويُجمّع في `PoolState.creator_fees_token*`. يمكن للمنشئ تجميعه عبر `CollectCreatorFee`، أو يمكن لأي دافع تفعيل مسار `CollectCreatorFeePermissionless` المقيد بالوجهة. نشط فقط عندما تم إنشاء المجموعة باستخدام `enable_creator_fee = true`. **منذ ترقية 2026-09-19 يتم تقسيم رسم المنشئ المجمّع مرة أخرى عند وقت التحصيل**: يتم نقل حصة قابلة للتكوين إلى دلو البروتوكول للمجموعة وفقط الباقي يصل إلى المنشئ — انظر [حصة البروتوكول من رسم المنشئ](#protocol-share-of-the-creator-fee).

رسم المنشئ **ليس** جزءًا من رسم التجارة. يتم إضافة المعدلين معًا عند فرض الرسم على مدخل المبادلة، لكن كل منهما يبقى دلوه الخاص — الحصص المأخوذة من البروتوكول والصندوق على المبادلة مشتقة دائمًا من `trade_fee` فقط، وليس من `creator_fee`. مجموعة بـ `creator_fee_rate = 1000` (0.10%) و `trade_fee_rate = 2500` (0.25%) تفرض 0.35% مجتمعة من المدخل على مبادلة برسم منشئ على المدخل، منها يحصل دلو المنشئ على 0.10% ودلو رسم التجارة يحصل على 0.25%.

حصة البروتوكول من رسم المنشئ تسير بالطريقة المعاكسة وسهل الخلط بينها وبين ما سبق: يتم نحتها من **دلو المنشئ**، وليس من رسم التجارة، وليس على المبادلة — يتم تطبيقها عندما يستقر `CollectCreatorFee` أو `CollectCreatorFeePermissionless` الرصيد المجمّع. رياضيات المبادلة لم تتغير بسببها.

معدلات رسم التجارة (`trade_fee_rate`، `protocol_fee_rate`، `fund_fee_rate`)، و `creator_fee_rate` والقيمة الافتراضية `creator_fee_share_rate` تعيش جميعها على `AmmConfig`. علم `enable_creator_fee` لكل مجموعة وطريقة `creator_fee_on` (أي جانب من المبادلة يتم أخذ رسم المنشئ منه) تعيش على `PoolState`. تجاوز لكل منشئ لمعدل الحصة يعيش على PDA `CreatorFeeShare` الخاص به. انظر [`products/cpmm/accounts`](/ar/products/cpmm/accounts).

## المعدلات والوحدات

جميع المعدلات هي `u64` مقسومة بوحدات `1 / FEE_RATE_DENOMINATOR` حيث `FEE_RATE_DENOMINATOR = 1_000_000`.

* **`trade_fee_rate`** هو جزء من **حجم المبادلة**. `2500` ⇒ 0.25% من الجانب ذي الصلة (مدخل أو مخرج، حسب `creator_fee_on` — انظر "أي جانب من المبادلة يتم أخذ الرسوم منه" أدناه).
* **`creator_fee_rate`** هو جزء من **حجم المبادلة**، يُؤخذ **بشكل منفصل** عن رسم التجارة. `1000` ⇒ 0.10% من الجانب ذي الصلة.
* **`protocol_fee_rate`** و **`fund_fee_rate`** هما جزء من **رسم التجارة**، وليس من الحجم. `120_000` ⇒ 12% من رسم التجارة.
* **`creator_fee_share_rate`** هو جزء من **رسم المنشئ المجمّع**، وليس من الحجم وليس من رسم التجارة. `200_000` ⇒ 20% من أي شيء يجلس في `creator_fees_token*` في اللحظة التي يتم تحصيله. `0` (الافتراضي) يترك رسم المنشئ كاملاً مع المنشئ.

المعاملات الافتراضية لـ `AmmConfig[index=0]` (مجموعة "المعيار" 0.25%) على mainnet، للمرجعية:

| الحقل | القيمة | النسبة المئوية الفعلية |
| - | - | - |
| `trade_fee_rate` | `2500` | 0.25% من الحجم (دلو رسم التجارة) |
| `protocol_fee_rate` | `120000` | 12% من رسم التجارة ≈ **0.030% من الحجم** |
| `fund_fee_rate` | `40000` | 4% من رسم التجارة ≈ **0.010% من الحجم** |
| `creator_fee_rate` | `0` (افتراضي) | 0% (دلو منفصل) |
| `creator_fee_share_rate` | `0` (افتراضي) | 0% من دلو المنشئ (المنشئ يحتفظ بالكل) |
| → حصة LP الفعلية | | **0.210% من الحجم** |

إذن على مبادلة بقيمة \$1,000 مقابل `AmmConfig[0]` مع `enable_creator_fee = false`: \$2.50 إجمالي رسم تجارة، منها \$2.10 تبقى مع مزودي السيولة، \$0.30 تذهب إلى البروتوكول، \$0.10 إلى الصندوق. دلو المنشئ هو 0 لأن رسم المنشئ معطل.

إذا كانت نفس المجموعة تحتوي على `enable_creator_fee = true` و `creator_fee_rate = 1000` (0.10%)، يدفع المستخدم \$1.00 إضافية إلى دلو المنشئ — مأخوذة من نفس جانب المبادلة المكون بواسطة `creator_fee_on` — لـ \$3.50 من إجمالي الرسوم. دلو رسم التجارة وتقسيماته بين البروتوكول والصندوق لم تتغير.

تأكد من قيم mainnet الحالية مقابل `GET https://api-v3.raydium.io/main/cpmm-config` — المعدلات قابلة للتغيير من قبل المسؤول ويجب قراءتها بشكل جديد بدلاً من ترميزها بشكل ثابت.

## التقسيم، في الكود

```rust theme={null}
// Paraphrased from raydium-cp-swap/programs/cp-swap/src/curve/{calculator,fees}.rs.
// The actual code branches on `is_creator_fee_on_input`; both branches preserve the
// invariant that creator_fee is its own rate, never a slice of trade_fee.

const FEE_RATE_DENOMINATOR_VALUE: u64 = 1_000_000;

pub struct FeeBreakdown {
    pub amount_in_after_fees: u64,    // input minus all fees taken on the input side
    pub amount_out_after_fees: u64,   // output minus any creator fee taken on the output side
    pub trade_fee:    u64,            // → split into LP / protocol / fund buckets below
    pub protocol_fee: u64,            // share of trade_fee
    pub fund_fee:     u64,            // share of trade_fee
    pub creator_fee:  u64,            // independent bucket (input or output side)
}

fn take_fees_on_input(
    amount_in: u64,
    trade_rate: u64,
    creator_rate: u64,
    protocol_rate: u64,
    fund_rate: u64,
) -> (u64 /* trade_fee */, u64 /* creator_fee */, u64 /* amount_in_after_fees */) {
    // The two rates are added so we round once on the combined fee, then split
    // proportionally — this is purely a rounding/efficiency trick. The split
    // honours the rates exactly: creator_fee/trade_fee == creator_rate/trade_rate.
    let total_fee = ((amount_in as u128) * ((trade_rate + creator_rate) as u128))
        .div_ceil(FEE_RATE_DENOMINATOR_VALUE as u128) as u64;

    let creator_fee = ((total_fee as u128) * (creator_rate as u128)
                       / ((trade_rate + creator_rate) as u128)) as u64;
    let trade_fee   = total_fee - creator_fee;

    (trade_fee, creator_fee, amount_in - total_fee)
}

fn take_creator_fee_on_output(amount_out_swapped: u64, creator_rate: u64) -> (u64, u64) {
    // When creator_fee_on routes the creator fee to the output side,
    // trade_fee is taken on input as a single rate, and creator_fee
    // is computed against the curve output.
    let creator_fee = ((amount_out_swapped as u128) * (creator_rate as u128))
        .div_ceil(FEE_RATE_DENOMINATOR_VALUE as u128) as u64;
    (amount_out_swapped - creator_fee, creator_fee)
}

fn split_trade_fee(
    trade_fee: u64,
    protocol_rate: u64,
    fund_rate: u64,
) -> (u64 /* protocol_fee */, u64 /* fund_fee */) {
    let protocol_fee = (trade_fee as u128 * protocol_rate as u128
                        / FEE_RATE_DENOMINATOR_VALUE as u128) as u64;
    let fund_fee     = (trade_fee as u128 * fund_rate as u128
                        / FEE_RATE_DENOMINATOR_VALUE as u128) as u64;
    (protocol_fee, fund_fee)
}
```

ملاحظات:

* إجمالي الرسم على المدخل يتم تقريبه **لأعلى** بحيث لا تقلل المجموعة الرسم.
* التقسيمات الفرعية لـ `trade_fee` (البروتوكول، الصندوق) يتم تقريبها **لأسفل** بحيث لا يتجاوز مجموعها `trade_fee`؛ الباقي هو حصة LP.
* `lp_share = trade_fee − protocol_fee − fund_fee` (creator\_fee **لا** يتم طرحها هنا لأنها دلوها الخاص).
* يتم أخذ رسم المنشئ من المدخل أو المخرج حسب `PoolState.creator_fee_on` (انظر القسم التالي). المعدل لا يتغير بأي طريقة.

## أي جانب من المبادلة يتم أخذ الرسوم منه

لدى CPMM إعداد `creator_fee_on` لكل مجموعة (`BothToken` / `OnlyToken0` / `OnlyToken1`) يحدد ما إذا كان رسم المنشئ يُؤخذ من جانب **المدخل** أو جانب **المخرج** لمبادلة معينة. مساعد وقت التشغيل `is_creator_fee_on_input(direction)` يختزل ذلك إلى قيمة منطقية لكل مبادلة:

| `creator_fee_on` | مبادلة `0 → 1` | مبادلة `1 → 0` |
| - | - | - |
| `BothToken` (`0`) | جانب المدخل | جانب المدخل |
| `OnlyToken0` (`1`) | جانب المدخل | جانب المخرج |
| `OnlyToken1` (`2`) | جانب المخرج | جانب المدخل |

عندما يكون رسم المنشئ على جانب **المدخل**، يتم خصم كل من رسم التجارة ورسم المنشئ من `amount_in` قبل تشغيل المنحنى. رياضيات الاقتباس: خذ `trade_rate + creator_rate` المجتمعة من المدخل.

عندما يكون رسم المنشئ على جانب **المخرج**، يتم خصم رسم التجارة فقط من `amount_in`؛ ينتج المنحنى مخرجًا بدون رسوم، ثم يتم خصم رسم المنشئ من هذا المخرج. رياضيات الاقتباس: خذ `trade_rate` من المدخل؛ خذ `creator_rate` من المخرج.

رسم التجارة نفسه يُؤخذ دائمًا من جانب المدخل (نمط Uniswap-V2 القياسي). فقط رسم المنشئ يمكن أن ينتهي به الحال على المخرج.

## كيفية تفاعل الرسوم "المجمّعة" مع المنحنى

دقة مهمة: **رسوم البروتوكول والصندوق والمنشئ تبقى فعليًا في الخزينة** حتى يتم استدعاء تعليمة `Collect*` الخاصة بها. لكن يتم استبعادها من رؤية المنحنى لرصيد الخزينة.

صورة ملموسة بعد مبادلة واحدة:

```
raw_vault_0_balance = getTokenAccountBalance(vault_0).amount
                    = lp_entitled + protocol_fees_token0
                      + fund_fees_token0 + creator_fees_token0

curve_x = raw_vault_0_balance − (protocol_fees_token0
                                  + fund_fees_token0
                                  + creator_fees_token0)
```

يستخدم البرنامج `curve_x` (و `curve_y` المماثل) عند فرض `k' ≥ k`. هذه هي الطريقة التي تصل بها رسوم غير LP إلى وجهاتها **بدون** تضخيم حصة LP من المجموعة.

النتائج التي يجب أن تصمم حولها:

* **الاقتباس من الأرصدة الخام خاطئ.** إذا قمت ببناء مقتبس من `getTokenAccountBalance`، ستبالغ باستمرار في السعر الذي ستحترمه المجموعة. اطرح دائمًا الرسوم المجمّعة، أو محاكاة عبر `SwapBaseInput` / الواجهة البرمجية.
* **`CollectProtocolFee` لا يحرك السعر.** ينقل الرموز خارج الخزينة **و** يصفر عدادات `protocol_fees_token*`، لذا `curve_x` و `curve_y` لم تتغير.
* **رسوم LP لا تتراكم في عداد.** هي ضمنية في رصيد الخزينة. استحقاق LP للرسوم المتراكمة يتم ممارسته بحرق رموز LP (أي عبر `Withdraw`) — لا يوجد `CollectLpFee`.

## التفاعل مع رسوم تحويل Token-2022

يتم تطبيق رسوم تحويل Token-2022 بواسطة **الإصدار**، وليس بواسطة CPMM. تعمل على كل تحويل رموز — مبادلة، إيداع، سحب، وعمليات `Collect*`. يتم حساب رياضيات رسم التجارة في CPMM مقابل المبلغ الذي **هبط فعلاً في الخزينة**، أي بعد خصم رسم التحويل لإصدار المدخل (إن وجد).

إذن في أسوأ الحالات يدفع المستخدم ثلاث ضرائب مختلفة على مبادلة مدخل دقيق:

1. رسم التحويل لإصدار المدخل على `amount_in` (لسلطة رسم الإصدار).
2. رسم `trade_fee` للمجموعة على الباقي (مقسم كما هو موضح أعلاه).
3. رسم التحويل لإصدار المخرج على `amount_out` (لسلطة رسم الإصدار).

يأخذ مقتبس SDK جميع الثلاثة في الاعتبار بحيث يتم تسمية `minimum_amount_out` بما يحصل عليه المستخدم فعلاً. إذا كنت تكتب مقتبسك الخاص، عكس هذا السلوك، أو ستكون فحوصات الانزلاق الخاصة بك متحررة بشكل منهجي.

انظر [`algorithms/token-2022-transfer-fees`](/ar/algorithms/token-2022-transfer-fees) للاشتقاق التفصيلي.

## رسم المنشئ

رسم المنشئ اختياري ولكل مجموعة. **المعدل** يعيش على `AmmConfig.creator_fee_rate`؛ **علم التفعيل** و **الجانب** (`creator_fee_on`) يعيشان على `PoolState`:

* **مفعل عند إنشاء المجموعة.** يعيّن `Initialize` `enable_creator_fee = false` بشكل افتراضي؛ المجموعات المنشأة عبر `InitializeWithPermission` (المستخدمة من قبل تخرجات LaunchLab والمسارات المحمية الأخرى) يمكنها تمرير `enable_creator_fee = true` واختيار `creator_fee_on`.
* **المعدل مشترك مع مستوى الرسم.** المعدل نفسه هو `AmmConfig.creator_fee_rate`، نفس القيمة عبر كل مجموعة مرتبطة بهذا التكوين. ثم تقرر كل مجموعة ما إذا كانت ستفرضه (`enable_creator_fee`) وأي جانب من المبادلة ستفرضه عليه (`creator_fee_on`). عندما `enable_creator_fee = false`، معدل رسم المنشئ الفعلي للمجموعة هو صفر بغض النظر عن قيمة التكوين (انظر `PoolState::adjust_creator_fee_rate` في المصدر).
* **مستقل عن رسم التجارة.** رسم المنشئ لا يقلل أبدًا من حصص LP / البروتوكول / الصندوق — إنه معدله الخاص، يُطبق بشكل منفصل، يُجمّع في عدادات خاصة به.
* **يتم تجميعه عبر `CollectCreatorFee` أو `CollectCreatorFeePermissionless`.** المسار الأصلي يتطلب `PoolState.pool_creator` للتوقيع. المسار بدون إذن يسمح لأي دافع بتفعيل التحصيل لكن يثبت كلا الوجهتين على ATAs المنشئ الكنسية. كلا المسارين يستقران حصة البروتوكول أولاً — انظر القسم التالي.
* **لا يمكن إعادة تفعيله أو إعادة توجيهه بعد الإنشاء.** مجموعة تم تهيئتها مع `enable_creator_fee = false` لن تفرض أبدًا رسم منشئ؛ واحدة تم تهيئتها مع `creator_fee_on` معين لا يمكنها تبديل الجوانب.

رسوم المنشئ هي الآلية وراء نمط Raydium "Burn & Earn": يتم قفل رموز LP تحت برنامج [LP Lock](/ar/reference/program-addresses) بحيث لا يمكن للمنشئ سحب السيولة، لكن الرسوم المتراكمة للمنشئ يمكن تجميعها بلا حدود.

## حصة البروتوكول من رسم المنشئ

منذ ترقية 2026-09-19 يمكن للبروتوكول الاحتفاظ بحصة قابلة للتكوين من رسم المنشئ. لا شيء عن المبادلة يتغير: رسم المنشئ لا يزال يُفرض بـ `creator_fee_rate` ولا يزال يتراكم بالكامل في `creator_fees_token{0,1}`. التقسيم يحدث **مرة واحدة، عند وقت التحصيل**، داخل `CollectCreatorFee` و `CollectCreatorFeePermissionless`.

### من أين يأتي المعدل

مصدران، بترتيب الأولوية:

1. **PDA `CreatorFeeShare`** — بذور `["creator_fee_share", creator, amm_config]`. عندما يكون هذا الحساب موجودًا ومملوكًا بواسطة CPMM، يفوز `share_rate` الخاص به. يسمح للبروتوكول بالتفاوض على معدل لكل منشئ على مستوى رسم معين دون لمس المستوى نفسه.
2. **`AmmConfig.creator_fee_share_rate`** — الافتراضي لكل منشئ على مستوى الرسم هذا. يُستخدم كلما لم يكن PDA موجودًا.

كلاهما `u64` على نفس `FEE_RATE_DENOMINATOR = 1_000_000`، وكلاهما مقيد بالمقسوم عليه. تعليمات التحصيل **تأخذ دائمًا حساب `creator_fee_share`**، حتى عندما لم يتم إنشاؤه أبدًا — يتحقق البرنامج ما إذا كان فارغًا ويعود إلى التكوين. تمرير العنوان الخاطئ يفشل قيد PDA، وليس الرجوع.

### ما الذي يفعله التقسيم

```rust theme={null}
// programs/cp-swap/src/states/creator_fee_share.rs
shared_amount  = floor(creator_fee * share_rate / 1_000_000);   // to the protocol
creator_amount = creator_fee - shared_amount;                   // to the creator
```

يُطبق بشكل مستقل على `creator_fees_token_0` و `creator_fees_token_1`، ثم:

* يتم نقل `creator_amount_{0,1}` خارج الخزائن إلى حسابات الرموز للمنشئ.
* يتم **إضافة `shared_amount_{0,1}` إلى `protocol_fees_token_{0,1}`** وتبقى في الخزينة حتى يقوم مالك البروتوكول بتجميعها باستخدام `CollectProtocolFee`. لا توجد تعليمة منفصلة ولا عداد منفصل لها.
* يتم تصفير `creator_fees_token_{0,1}`، تمامًا كما هو الحال من قبل.

ثلاث خصائص تستحق الاعتماد عليها:

* **التقريب يفضل المنشئ.** حصة البروتوكول تقرب لأسفل، لذا الغبار يبقى مع المنشئ — نفس الاتجاه مثل `protocol_fee` و `fund_fee`، اللذان يقطعان أيضًا حصة من رسم مجمّع بالفعل.
* **القيمة محفوظة.** `creator_amount + shared_amount == creator_fee` لكل معدل وكل رسم، بما في ذلك `u64::MAX`.
* **`share_rate = 0` هو عدم تشغيل.** كل من قيمة التكوين الافتراضية وغياب PDA `CreatorFeeShare` يترك رسم المنشئ كاملاً مع المنشئ، وهو السلوك السابق للترقية.

### ما يعنيه للمدمجين

* **مزودي السيولة والاقتباس لم يتأثروا.** المبلغ المشترك ينتقل بين عدادين **كلاهما** مستبعد بالفعل من رؤية المنحنى للخزينة (`vault_amount_without_fee`)، لذا `curve_x` و `curve_y` لا يتحركان عبر تحصيل. `k` لم يتغير.
* **مقدّر رسم المنشئ الذي يقرأ `creator_fees_token*` يبالغ الآن في الدفع.** اضرب بـ `(1 − share_rate / 1_000_000)` باستخدام المعدل الذي ينطبق فعلاً على زوج `(creator, amm_config)` هذا، وليس افتراضي التكوين.
* **`protocol_fees_token*` ينمو خارج المبادلات.** سيرى مراقب يوفق الاستحقاق البروتوكول مقابل حجم المبادلة قفزات عند كل تحصيل رسم منشئ. استحقاق البروتوكول لم يعد `trade_fee × protocol_fee_rate` وحده.
* **المعدل يمكن أن يتغير بين الاستحقاق والتحصيل.** يتم قراءته عند وقت التحصيل، لذا الرسوم التي تراكمت تحت معدل واحد تستقر بأي معدل يكون ساريًا عندما يستدعي شخص ما `Collect*`.

يتم إنشاء وإغلاق حساب `CreatorFeeShare` بواسطة المسؤول أو سلطة مخصصة لحصة رسم المنشئ عبر [`CreateCreatorFeeShare` / `CloseCreatorFeeShare`](/ar/products/cpmm/instructions#createcreatorfeeshare)؛ إغلاقه يعيد الزوج إلى `AmmConfig.creator_fee_share_rate`. تخطيط الحساب في [`products/cpmm/accounts`](/ar/products/cpmm/accounts#creatorfeeshare)، العناوين في [`reference/program-addresses`](/ar/reference/program-addresses#cpmm-creator-fee-share-authority).

## تدفق العمليات للتحصيل

| الموقّع | التعليمة | عدادات المصدر المصفرة | الإيقاع النموذجي |
| - | - | - | - |
| `amm_config.protocol_owner` | `CollectProtocolFee` | `protocol_fees_token{0,1}` | أسبوعي أو برمجي |
| `amm_config.fund_owner` | `CollectFundFee` | `fund_fees_token{0,1}` | أسبوعي أو برمجي |
| `pool_state.pool_creator` | `CollectCreatorFee` | `creator_fees_token{0,1}` — ناقص حصة البروتوكول، التي يتم نقلها إلى `protocol_fees_token{0,1}` | في أي وقت |
| أي دافع؛ المنشئ لا يوقّع | `CollectCreatorFeePermissionless` | `creator_fees_token{0,1}` — نفس التقسيم كما هو أعلاه | في أي وقت؛ ATAs المنشئ هي وجهات ثابتة |
| `admin` أو سلطة حصة رسم المنشئ | `CreateCreatorFeeShare` / `CloseCreatorFeeShare` | — (يعيّن أو يمسح معدل الحصة لزوج `(creator, amm_config)` واحد) | عند الطلب |

مالكو البروتوكول والصندوق هم multisig Raydium على mainnet؛ انظر [`security/admin-and-multisig`](/ar/security/admin-and-multisig). على المسار الأصلي الخاص بالمنشئ فقط، الموقّع للمنشئ هو الحساب المسجل في `PoolState`. على المسار بدون إذن، يدفع المتصل لإنشاء ATA منشئ مفقود. يقيد البرنامج `creator` إلى `pool_state.pool_creator` ويشتق كل وجهة من هذا المنشئ بالإضافة إلى إصدار الخزينة المقابل وبرنامج الرموز، لذا لا يمكن للمتصل إعادة توجيه الأموال.

## تغيير مستوى الرسم

يمكن تغيير معدلات الرسم بواسطة المسؤول عبر `UpdateAmmConfig` (انظر [`products/cpmm/instructions`](/ar/products/cpmm/instructions)). التغييرات تدخل حيز التنفيذ على **المبادلة التالية** لكل مجموعة مرتبطة بـ `AmmConfig` هذا — لا توجد هجرة، لأن المجموعات تحمل التكوين في كل مبادلة.

ما لا يمكن للمسؤول فعله:

* نقل مجموعة من `AmmConfig` واحد إلى آخر.
* إعادة تسعير الرسوم المتراكمة بأثر رجعي.
* تجميع الرسوم بدون موقّع `protocol_owner` / `fund_owner`.

## قراءة الرسوم من مجموعة قيد التشغيل

```ts theme={null}
// Off-chain: current accrued fees in each bucket.
// The SDK exports the layout, not a `PoolState` class, and the fee fields are
// named ...MintA / ...MintB — there are no ...Token0 / ...Token1 fields.
import { CpmmPoolInfoLayout } from "@raydium-io/raydium-sdk-v2";

const pool = await connection.getAccountInfo(poolStatePda);
const decoded = CpmmPoolInfoLayout.decode(pool!.data);   // no .slice(8) — the
                                                          // layout includes the discriminator
console.log(
  "Protocol accrued:",
  decoded.protocolFeesMintA.toString(),
  decoded.protocolFeesMintB.toString(),
);
console.log(
  "Fund accrued:",
  decoded.fundFeesMintA.toString(),
  decoded.fundFeesMintB.toString(),
);
console.log(
  "Creator accrued:",
  decoded.creatorFeesMintA.toString(),
  decoded.creatorFeesMintB.toString(),
);
// What the creator actually receives is this minus the protocol share, resolved at
// collection time from the (creator, ammConfig) CreatorFeeShare PDA if it exists and
// from AmmConfig.creator_fee_share_rate otherwise. See "Protocol share of the creator
// fee" above.

// Off-chain: effective rates today.
// trade_fee_rate, creator_fee_rate are fractions of volume (denominator 1e6).
// protocol_fee_rate, fund_fee_rate are fractions of the *trade fee* (same denominator).
const config = await fetch("https://api-v3.raydium.io/main/cpmm-config")
  .then((r) => r.json());
// `configId` on the decoded pool is the config account's PublicKey, not an index.
const tier = config.data.find((t) => t.id === decoded.configId.toBase58());

const tradeFeeOfVolume   = tier.tradeFeeRate / 1_000_000;
const protocolOfTradeFee = tier.protocolFeeRate / 1_000_000;
const fundOfTradeFee     = tier.fundFeeRate / 1_000_000;
const lpOfTradeFee       = 1 - protocolOfTradeFee - fundOfTradeFee;

console.log("LP fee effective:",       (tradeFeeOfVolume * lpOfTradeFee * 100).toFixed(4), "%");
console.log("Protocol fee effective:", (tradeFeeOfVolume * protocolOfTradeFee * 100).toFixed(4), "%");
console.log("Fund fee effective:",     (tradeFeeOfVolume * fundOfTradeFee * 100).toFixed(4), "%");
console.log(
  "Creator fee effective:",
  decoded.enableCreatorFee
    ? ((tier.creatorFeeRate / 1_000_000) * 100).toFixed(4) + " %"
    : "0 % (disabled on this pool)",
);
```

<Note>
  **حل معدل الحصة على السلسلة، وليس من تكوين مخزن مؤقتًا.** `creator_fee_share_rate` هو حقل `AmmConfig` مضاف حديثًا، لذا اقرأه من الحساب بدلاً من افتراض أن حمولة REST للتكوين تحمله، وتحقق ما إذا كان PDA `CreatorFeeShare` موجودًا في `["creator_fee_share", creator, ammConfig]` قبل اقتباس المنشئ لدفعه. PDA المفقود هو الحالة الشائعة ويعني أن افتراضي التكوين ينطبق.
</Note>

## المقارنة مع CLMM و AMM v4

انظر [`reference/fee-comparison`](/ar/reference/fee-comparison) لمصفوفة جنبًا إلى جنب. الملخص:

* **AMM v4** يستخدم رسم تجارة ثابت 0.25% مع تقسيم LP/بروتوكول مختلف وبدون رسم صندوق.
* **CLMM** الرسوم لكل مستوى تباعد القراد، مجمّعة لكل موضع (وليس لكل مجموعة)، ومطالب بها عبر `DecreaseLiquidity` أو `CollectFees`.

## إلى أين تذهب بعد ذلك

* [`products/cpmm/math`](/ar/products/cpmm/math) — حيث يتصل خصم رسم التجارة بالمنحنى.
* [`products/cpmm/instructions`](/ar/products/cpmm/instructions) — قوائم حسابات تعليمة `Collect*`، بما في ذلك حساب `creator_fee_share` الذي يتطلبه كلا مسارات المنشئ الآن.
* [`algorithms/token-2022-transfer-fees`](/ar/algorithms/token-2022-transfer-fees) — كيفية دمج رسم تجارة مجموعة مع رسم تحويل إصدار بشكل صحيح.

المصادر:

* [`raydium-io/raydium-cp-swap` — `states/config.rs`, `states/pool.rs`, `states/curve.rs`](https://github.com/raydium-io/raydium-cp-swap)
* [Raydium API — `GET /main/cpmm-config`](https://api-v3.raydium.io/main/cpmm-config)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.