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

# 2026-09-09 — CPMM: Anchor 1.0، استرجاع الـ excess-lamports، وملاك الرسوم الثابتة

> ينتقل CPMM إلى Anchor 1.0.2 على Agave 3.1.10 ويضيف تعليمة CollectExcessLamports للمسؤول لاسترجاع الـ lamports المحررة بواسطة SIMD-0437. يكتب CreateAmmConfig الآن مالكي الرسوم البروتوكول والصندوق المشفرة بدلاً من الموقّع، تمت إزالة قائمة Token-2022 mint البيضاء ذات الأربع عناوين، ويقبل ClosePermissionPda سلطة المنحة المخصصة. تمت إضافة الخطأ 6015.

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

  [عرض النسخة الإنجليزية →](/reference/changelog/2026-09-09-cpmm-anchor-1-and-excess-lamports)
</Info>

<Info>
  يغطي هذا الإدراج تحديث برنامج CPMM القادم. تم التحقق منه مقابل فرع الإصدار المحلي قبل النشر. تأكد من البرنامج المنشور قبل الاعتماد على التعليمة الجديدة أو السلوك المتغير لـ `CreateAmmConfig`.
</Info>

التغيير الرئيسي لـ CPMM هو نقل الإطار: Anchor من `0.32.1` إلى `=1.0.2`، وسلسلة أدوات البناء من Agave 2.3.0 إلى 3.1.10. يرافقها أربعة تغييرات سلوكية، ثلاثة منها تهم أدوات المسؤول فقط وواحد — إزالة قائمة mint البيضاء — يغير أي Token-2022 mints يمكن استخدامها لـ **pool جديد**.

كل شيء يستدعيه المتداول أو مزود السيولة أو منشئ الـ pool يحافظ على قائمة الحسابات والحجج والرياضيات.

## ملخص سريع للمدمجين

* **لم تتغير أي تعليمة موجهة للمستخدم.** `Initialize`، `InitializeWithPermission`، `Deposit`، `Withdraw`، `SwapBaseInput`، `SwapBaseOutput`، وجميع مسارات `Collect*Fee` الأربعة متطابقة بالبايت. لم يتغير تخطيط أي حساب.
* **تمت إضافة تعليمة واحدة: `CollectExcessLamports`.** مقتصرة على المسؤول، بدون حجج، يتم تمرير المصادر كـ `remaining_accounts`. تُرجع lamports فوق الحد الأدنى المعفي من الإيجار من الأقبية المتحكم فيها بواسطة CPMM وـ LP mints و PDAs، ولا تلمس أي شيء آخر. انظر [`products/cpmm/instructions`](/ar/products/cpmm/instructions#collectexcesslamports).
* **تمت إضافة رمز خطأ واحد: `6015` `LamportsCalculateError`.** الرموز `6000`–`6014` لم تتغير.
* **لا يعود `CreateAmmConfig` ينسخ الموقّع إلى حقول مالك الرسوم.** تحصل الإعدادات الجديدة على مفاتيح `protocol_fee_owner` و `fund_fee_owner` المشفرة بشكل ثابت. **حسابات `AmmConfig` الموجودة لم تتغير** — استمر في قراءة `protocol_owner` / `fund_owner` من الحساب بدلاً من افتراض أي قيمة.
* **قائمة Token-2022 `MINT_WHITELIST` ذات الأربع عناوين المشفرة بشكل ثابت اختفت.** سجل PDA `SupportMintAssociated` هو الآن الطريقة الوحيدة لـ CPMM لتجاوز قائمة الامتدادات المسموحة. الـ pools الموجودة لم تتأثر؛ يتم تشغيل الفحص عند إنشاء الـ pool فقط.
* **يقبل `ClosePermissionPda` سلطة منشئ PDA الإذن المخصصة،** وليس فقط المسؤول المشترك.
* **يلزم تحديث IDL.** تعليمة جديدة واحدة، متغير خطأ جديد واحد.
* **تمت إعادة تسمية حزمة عميل TypeScript.** `@coral-xyz/anchor` مجمدة عند `0.32.1`؛ عميل Anchor 1.x ينشر باسم `@anchor-lang/core`.

## `CollectExcessLamports`

الخطوة 1 من [SIMD-0437](/ar/solana-fundamentals/rent-and-reclaimable-rent) وصلت إلى mainnet في 3 سبتمبر 2026، مما قلل الحد الأدنى المعفي من الإيجار بنسبة 9٪ مع أربع خطوات أخرى قادمة. كل vault لـ CPMM pool و LP mint و `PoolState` و `AmmConfig` و `ObservationState` و `Permission` و `SupportMintAssociated` تم إنشاؤها قبل خطوة ما يتم تمويلها الآن بشكل زائد، و lamports في حساب مملوك للبرنامج يمكن نقله فقط من قبل هذا البرنامج.

تأخذ التعليمة أربعة حسابات ثابتة — محفظة الموقّع/الوجهة، سلطة PDA `vault_and_lp_mint_auth_seed`، و **كلا** برنامج الرموز — ثم أي عدد من حسابات المصدر في `remaining_accounts`. يتم الإرسال على مالك كل حساب مصدر: CPI إلى `WithdrawExcessLamports` (discriminant `38`) لبرنامج الرموز لحساب رمز أو mint، خصم مباشر لـ PDA مملوك لـ CPMM، وتخطي صامت لأي شيء آخر.

Wrapped SOL هي الحالة التي تستحق الفهم. رصيد lamport لحساب الرمز الأصلي *هو* رصيد الرمز الخاص به، لذا يرفض كلا برنامج الرموز `WithdrawExcessLamports` على واحد. بدلاً من ذلك، يقوم CPMM بـ CPI `SyncNative` (طي الفائض المتبرع به في `amount` المغلف)، يقيس مقدار نمو المبلغ، `UnwrapLamports` (discriminant `45`) لهذا الفرق بالضبط، ثم يتطلب أن يساوي الرصيد المغلف قيمته السابقة للمزامنة — `LamportsCalculateError` إذا لم يكن كذلك. **يحتفظ vault الـ pool من جانب SOL بسيولته الكاملة من خلال عملية مسح**، ولا يرى أي LP تغييراً في السعر عبر واحد.

قد يكون الموقّع إما مسؤول البرنامج المشترك أو محفظة جمع lamports مخصصة؛ العناوين موجودة في [`reference/program-addresses`](/ar/reference/program-addresses#excess-lamports-collection-wallets).

## `CreateAmmConfig` يكتب مالكي رسوم ثابتة

قبل هذا الإصدار، كان `create_amm_config` يعيّن كلا حقلي مالك الرسوم من الموقّع الذي يستدعي:

```rust theme={null}
amm_config.protocol_owner = ctx.accounts.owner.key();
amm_config.fund_owner      = ctx.accounts.owner.key();
```

يكتب الآن ثوابت البرنامج الخاصة به:

```rust theme={null}
amm_config.protocol_owner = crate::protocol_fee_owner::ID;
amm_config.fund_owner      = crate::fund_fee_owner::ID;
```

نظراً لأن `CreateAmmConfig` محمي بـ `crate::admin::ID`، فإن التأثير العملي هو أن طبقة رسوم تم إنشاؤها حديثاً يتم مسحها بواسطة محافظ تشغيلية مخصصة من البداية بدلاً من multisig المسؤول، والمسؤول لا يمكنه جمع من إعداد أنشأه للتو دون أولاً تدوير الحقل من خلال `UpdateAmmConfig` param `3` أو `4`.

يتبع الثابتان نفس نمط `cfg` devnet/mainnet مثل بقية عناوين البرنامج، وعلى devnet كلاهما يحل إلى نفس المفتاح. انظر [`reference/program-addresses`](/ar/reference/program-addresses#cpmm-fee-owner-wallets).

<Warning>
  **هذا ليس ترحيلاً.** كل `AmmConfig` موجود بالفعل يحتفظ بأي `protocol_owner` و `fund_owner` تم إنشاؤه به. أداة جمع تبدأ بتشفير الثوابت الجديدة ستفشل على الإعدادات الأقدم، وواحدة تفترض "مفتاح المسؤول" ستفشل على الإعدادات الجديدة. اقرأ الحقول.
</Warning>

## تمت إزالة قائمة Token-2022 mint البيضاء

كانت `is_supported_mint` تختصر سابقاً على `MINT_WHITELIST` مشفر بشكل ثابت من أربعة عناوين قبل التكرار على امتدادات mint. تم حذف هذا المصفوفة — و `HashSet` المبني منه في كل استدعاء. ما تبقى هو:

1. Legacy SPL Token mints تمر بدون شروط.
2. mint مع `SupportMintAssociated` PDA مهيأ في `[b"support_mint", mint]` يمر بدون شروط.
3. وإلا فإن كل امتداد على mint يجب أن يكون واحداً من `TransferFeeConfig`، `MetadataPointer`، `TokenMetadata`، `InterestBearingConfig`، `ScaledUiAmount`.

سجل PDA كان في البرنامج لفترة من الوقت، مع زوج `CreateSupportMintAssociated` / `CloseSupportMintAssociated` الخاص به وسلطة مخصصة خاصة به إلى جانب المسؤول المشترك، ويتم استشارته من كل من `Initialize` و `InitializeWithPermission`. إزالة المصفوفة الثابتة تعني أن إدراج mint هو الآن إجراء على السلسلة بحتة بدلاً من ترقية البرنامج — وهذا هو الهدف.

**الـ pools الموجودة لم تتأثر**، لأن فحص mint يتم تشغيله فقط عند إنشاء الـ pool. ما يتغير هو أن إنشاء *pool جديد* لـ CPMM لأحد mints الأربعة المدرجة في القائمة البيضاء سابقاً يتطلب أن يكون لهذا mint سجل PDA — الأشخاص الذين يهمهم بالفعل لديهم واحد على mainnet. الصورة الكاملة، بما في ذلك ما يفعله السجل وما لا يفعله من تنازلات، موجودة في [`reference/token-2022-support`](/ar/reference/token-2022-support#bypass-paths).

## توسيع موقّع `ClosePermissionPda`

كان `CreatePermissionPda` يقبل بالفعل إما المسؤول المشترك أو سلطة منشئ PDA إذن مخصصة، بينما كان `ClosePermissionPda` مثبتاً على المسؤول بقيد `address =`. يأخذ مسار الإغلاق الآن نفس الزوج:

```rust theme={null}
constraint = (owner.key() == crate::admin::ID
           || owner.key() == crate::create_permission_pda_owner::ID) @ ErrorCode::InvalidOwner
```

لذا فإن السلطة التي تصدر منحة يمكنها أيضاً إلغاء تفويضها، دون التوجيه عبر multisig. الخطأ على موقّع غير مصرح به هو `InvalidOwner` (`6001`) في كلتا الحالتين — قيد `address =` القديم كان يحمل بالفعل هذا الخطأ المخصص — لذا فقط مجموعة الموقّعين المقبولين توسعت.

## تغييرات سلسلة الأدوات والتبعيات

| العنصر                                                                              | قبل                               | بعد                                    |
| ----------------------------------------------------------------------------------- | --------------------------------- | -------------------------------------- |
| `anchor-lang` / `anchor-spl`                                                        | `0.32.1`                          | `=1.0.2`                               |
| `Anchor.toml` `solana_version`                                                      | `2.3.0`                           | `3.1.10`                               |
| `solana-sdk` / `-client` / `-account-decoder` / `-transaction-status` (حزمة العميل) | `2.3.0`                           | `3.0`                                  |
| `anchor-client` / `-lang` / `-spl` (حزمة العميل)                                    | `0.32.1`                          | `=1.0.2`                               |
| README: `rustup default`                                                            | `1.81.0`                          | `1.91.0`                               |
| README: مثبت Solana                                                                 | `release.anza.xyz/v2.1.0`         | `release.anza.xyz/v3.1.10`             |
| README: `avm install`                                                               | `0.31.0`                          | `1.0.2` (بالإضافة إلى `avm use 1.0.2`) |
| README: مستودع Anchor                                                               | `coral-xyz/anchor`                | `solana-foundation/anchor`             |
| صورة Docker                                                                         | `solanafoundation/anchor:v0.32.1` | `solanafoundation/anchor:v1.0.2`       |
| `@coral-xyz/anchor`                                                                 | `0.32.1`                          | استبدل بـ `@anchor-lang/core` `1.0.2`  |
| `@solana/spl-token`                                                                 | `^0.4.8`                          | `^0.4.14`                              |
| `typescript`                                                                        | `^4.3.5`                          | `^5.6.3`                               |

يغير Anchor 1.0 شيئين في كل موقع استدعاء CPI، وهذا يهم إذا قمت بدمج CPMM من برنامجك الخاص: `CpiContext::new` يأخذ `Pubkey` للبرنامج بدلاً من `AccountInfo` الخاص به، و `Context` له معامل lifetime واحد بدلاً من أربعة. على جانب العميل `RequestBuilder::instructions()` يُرجع `Vec<Instruction>` بدلاً من `Result<...>`، `CommitmentConfig` يأتي من `anchor_client` بدلاً من `solana_sdk`، و `spl-associated-token-account` 8.0 نقل مساعدات العناوين الخاصة به تحت `::address` ومعرف البرنامج الخاص به إلى `::program::ID`. انظر [`sdk-api/rust-cpi`](/ar/sdk-api/rust-cpi#cargo-dependencies).

تفصيلان في نظام البناء، لا أحدهما له تأثير على السلسلة: يعلن حزمة البرنامج عن ميزة `localnet` تجمع المحفظة المحلية كـ `admin` من متغير بيئة `CPSWAP_LOCALNET_ADMIN` (لذا يمكن لاختبارات المسؤول المحمي فعلاً التوقيع — `yarn test:local-admin` يسلكها)، وتم حذف كتلة `[profile.release]` المكررة في `programs/cp-swap/Cargo.toml`. يتجاهل Cargo `[profile]` خارج جذر workspace، لذا كانت كتلة الجذر بالفعل الكتلة المعمول بها — بما في ذلك حقيقة أن `panic = "abort"` لكتلة مستوى البرنامج لم يتم تطبيقه أبداً.

## ما لم يتغير

* **كل تخطيط حساب.** `PoolState`، `AmmConfig`، `ObservationState`، `Permission`، `SupportMintAssociated` — نفس الأحجام، نفس الإزاحات.
* **رموز الخطأ `6000`–`6014`.**
* **قائمة الامتدادات المسموحة نفسها.** لا تزال نفس الامتدادات الخمسة.
* **معدلات الرسوم وتراكم الرسوم والمنحنى.** `CollectExcessLamports` ينقل lamports التي لم تكن أبداً جزءاً من احتياطيات أي pool.
* **`spl_memo`.** انتقل قيد برنامج memo لـ `Withdraw` من `spl_memo::id()` إلى `anchor_spl::memo::ID` — نفس العنوان تحت تصدير `anchor-spl` معاد التسمية.
* **معرف البرنامج.** لم يتغير.

## الصفحات المحدثة

* `products/cpmm/instructions` — تمت إضافة `CollectExcessLamports` مع قائمة الحسابات وجدول الإرسال لكل مالك؛ يحصل `CreateAmmConfig` على حجة `creator_fee_rate` الخاصة به وملاحظة حول مالكي الرسوم الثابتة؛ تمت إضافة صفوف ملخص التعليمات لـ `CollectExcessLamports`، `CreateSupportMintAssociated`، `CloseSupportMintAssociated`؛ تم تصحيح موقّع `ClosePermissionPda`؛ تمت إعادة كتابة شرط `Initialize` المسبق لتجاوز السجل فقط؛ تمت إضافة صف مصفوفة تغيير الحالة.
* `products/cpmm/accounts` — تمت إعادة كتابة قسم Token-2022 حول سجل PDA، مع استدعاء إزالة القائمة البيضاء؛ تم تصحيح موقّع `ClosePermissionPda`.
* `products/cpmm/overview` — تمت إعادة كتابة جملة القائمة البيضاء.
* `products/cpmm/code-demos` — تم تحديث هيكل Rust CPI لـ Anchor 1.0.
* `reference/token-2022-support` — تمت إعادة كتابة قسم مسار التجاوز حول سجل PDA، مع نقل `MINT_WHITELIST` المحذوف إلى قسم "تجاوزات محذوفة".
* `reference/error-codes` — تم توثيق `6015`.
* `reference/program-addresses` — أقسام جديدة "سلطة سجل دعم CPMM"، "محافظ مالكي رسوم CPMM" و "محافظ جمع excess-lamports"؛ تم تصحيح ملاحظة `ClosePermissionPda`.
* `sdk-api/rust-cpi`، `solana-fundamentals/toolchain`، `integration-guides/cpi-integration` — دبابيس Anchor 1.0 وملاحظات هجرة CPI.
* `solana-fundamentals/rent-and-reclaimable-rent` — قسم جديد "ما تقوم برامج Raydium بمسحه من جانبها الخاص".
