> ## 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 — LaunchLab: Anchor 1.0، واسترجاع الـ excess-lamports، ونهاية بوابات الانتقال

> ينتقل LaunchLab إلى Anchor 1.0.2 على Agave 3.1.10 ويضيف تعليمة CollectExcessLamports للمسؤول لاسترجاع الإيجار المحرر بواسطة SIMD-0437. تم إيقاف ثلاث آليات انتقال: Initialize المهجورة تفشل دائماً الآن، MigrateToAmm تفقد ثلاث معاملات وتسعة حسابات OpenBook، وتم حذف بوابة get_upgrade_timestamp المستندة إلى الساعة. تمت إضافة الخطأ 6031.

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

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

هذا هو الإصدار الذي يتوقف فيه LaunchLab عن حمل سقالات الانتقال الخاصة به.

كانت هناك ثلاث آليات منفصلة لجعل الترقيات السابقة تهبط بسلاسة: `get_upgrade_timestamp`، وهي تاريخ قطع مشفر بالكود قارنت عدة فحوصات الساعة به؛ و`Initialize` المهجورة التي استمرت في العمل لمدة ثلاثة أيام بعد ذلك التاريخ؛ و`MigrateToAmm`'s OpenBook plumbing، التي لم يكن لديها شيء للتحدث معه بعد أن أزالت AMM v4 [تبعيتها الخاصة على OpenBook](/ar/reference/changelog/2026-07-22-amm-v4-openbook-removal) في يوليو. كل الثلاثة اختفت. على mainnet، القطع يتجاوز عدة أشهر، لذا التأثير السلوكي معدوم — لكن *أنماط الفشل* تغيرت، وقائمة حساب واحدة تغيرت بشكل كبير.

انتقل الإطار في نفس الوقت: Anchor `0.32.1` إلى `=1.0.2`، Agave 2.3.0 إلى 3.1.10. وكما هو الحال على AMM v4 و CPMM، توجد تعليمة مسؤول جديدة لاسترجاع الإيجار.

التداول والرسوم والاستحقاق وقواعد المنحنى وتكوين المنصة لم تتغير.

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

* **لم تغير أي تعليمة تداول حساباتها أو معاملتها أو رياضياتها.** `BuyExactIn`، `BuyExactOut`، `SellExactIn`، `SellExactOut` متطابقة بالبايت. لم يتغير أي تخطيط حساب.
* **`Initialize` (المهجورة) تفشل الآن دائماً مع `NotApproved` (`6000`)،** قبل قراءة أي حساب. استخدم `InitializeV2`. الإطلاقات التي تم إنشاؤها بالفعل من خلالها تتداول وتتخرج بشكل طبيعي.
* **`MigrateToAmm` كسر صعب لمحفظة الهجرة.** فقدت جميع المعاملات الثلاثة (`base_lot_size`، `quote_lot_size`، `market_vault_signer_nonce`) وتسعة حسابات. انظر أدناه.
* **الحسابات الثلاثة `remaining_accounts` للتداول مطلوبة الآن بشكل غير مشروط،** وفتحة `system_program` يتم التحقق منها. المنشئ الذي يحذفها يفشل الآن دائماً مع `NotEnoughRemainingAccounts` (`6018`) بدلاً من الفشل فقط بعد القطع.
* **تعليمة واحدة تمت إضافتها: `CollectExcessLamports`.** للمسؤول فقط. انظر [`products/launchlab/instructions`](/ar/products/launchlab/instructions#collectexcesslamports).
* **تمت إضافة رمز خطأ واحد: `6031` `LamportsCalculateError`.** الأكواد `6000`–`6030` لم تتغير.
* **ثلاثة قيود عنوان `MigrateToCpswap` انتقلت إلى جسم التعليمة،** مما غيّر خطأها من `ConstraintAddress` (`2012`) إلى `RequireKeysEqViolated` (`2502`).
* **يلزم تحديث IDL.** تعليمة جديدة واحدة، مجموعة معاملات محذوفة واحدة، تسعة حسابات محذوفة، متغير خطأ جديد واحد.

## `MigrateToAmm` فقدت نصفها من OpenBook

هذا هو التغيير الأكثر احتمالاً لكسر شيء ما. بيانات التعليمة القديمة حملت 17 بايت من المعاملات بعد المميز؛ البيانات الجديدة هي المميز العاري. قوائم الحسابات القديمة حملت تسعة حسابات لم تعد موجودة في الهيكل، لذا كل شيء بعد الإزالة الأولى غير محاذي.

**المعاملات المحذوفة:** `base_lot_size: u64`، `quote_lot_size: u64`، `market_vault_signer_nonce: u8`. كانت جميعها موجودة فقط لتكوين سوق OpenBook التي استخدمها البرنامج لتهيئة بواسطة CPI. هذا CPI — `initialize_openbook_market` — اختفى، جنباً إلى جنب مع فحص `gen_vault_signer_key` الذي تحقق من الـ nonce.

**الحسابات المحذوفة:** `openbook_program`، `request_queue`، `event_queue`، `bids`، `asks`، `market_vault_signer`، `market_base_vault`، `market_quote_vault`، و`amm_open_orders`. الأخيرة اختفت لأن `Initialize2` الخاص بـ AMM v4 لم يعد يأخذها.

**حساب `market` يبقى**، في موضعه الأصلي. AMM v4 لا يزال يسجل السوق كحقل مرجعي على `AmmInfo`، لذا LaunchLab لا يزال يعيده. شيئان عنه تغيرا: البرنامج لم يعد يهيئه، وهو الآن **غير مدقق تماماً** — إعلانه هو `#[account(mut)]` عاري بدون قيد مالك أو عنوان أو بذور، لأن `owner = openbook_program.key()` جاء بعيداً مع حساب `openbook_program` ولم يحل محله شيء. أياً كان ما تمرره محفظة الهجرة هناك يتم إعادته مباشرة إلى CPI `Initialize2` الخاص بـ AMM v4 ويتم تسجيله على المجموعة الجديدة. المتصل الذي يريد سوقاً مهيأة حقيقية خلف هذا الحقل يجب أن ينشئها مسبقاً، والبرنامج لن يخبره بخلاف ذلك.

قائمة الـ 23 حساب الناتجة موثقة بالكامل على [`products/launchlab/instructions`](/ar/products/launchlab/instructions#migratetoamm-/-migratetocpswap).

`MigrateToCpswap` لم تتأثر — لم يكن لديها معاملات قط، وقائمة حسابها لم تتغير.

## `Initialize` المهجورة تفشل دائماً

كانت `initialize` تعمل سابقاً على إيقاف ناعم: عملت حتى `get_upgrade_timestamp() + 3 days`، ثم أرجعت `NotApproved`. مع حذف مساعد الطابع الزمني، الفشل غير مشروط — المعالج الآن هو `msg!` و`err!(NotApproved)` وليس شيء آخر.

تفصيل واحد إذا كنت تقرأ السجلات: هيكل `Accounts` لم يتغير ولا يزال يحمل أربعة قيود `init`، لذا المقدمة المولدة من Anchor للتحقق من الحسابات تعمل — وتنشئ تلك الحسابات — قبل أن يعود المعالج. المعاملة تنعكس على أي حال، لذا لا يتم إنشاء شيء فعلياً، لكن الفشل يظهر بعد التحقق من الحسابات بدلاً من قبله.

يتم الاحتفاظ بالتعليمة بدلاً من إزالتها حتى يبقى المميز الخاص بها مشغولاً و IDL يحافظ على شكل مستقر. تعريفات معاملتها وحسابها لا تزال تستحق التوثيق لفك تشفير المعاملات التاريخية، والصفحة تحتفظ بها خلف تحذير.

## بوابة `get_upgrade_timestamp` اختفت

أرجعت المساعدة `0` تحت ميزات `local` و`devnet` والطابع الزمني المشفر بالكود mainnet `1755522000` (2025-08-18 13:00 UTC) بخلاف ذلك. أربع تعليمات قارنت الساعة به، عبر خمس مراجع في المصدر. كل واحدة تصبح فرع ما بعد القطع بشكل غير مشروط:

| موقع الاستدعاء                                       | قبل                                                                                                                                            | بعد                                                                                                          |
| ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| `distribute_trade_fee` (جميع مسارات التداول الأربعة) | اقرأ `system_program`، `platform_fee_vault`، `creator_fee_vault` من `remaining_accounts` فقط بعد القطع؛ تخطي تقسيم الرسوم الأساسية/المنشئ قبله | اقرأ الثلاثة دائماً، **و** تتطلب فتحة `system_program` لتساوي `System::id()` أو ترجع `InvalidInput` (`6002`) |
| `migrate_to_cpswap`                                  | اختر `InitializeCpSwap` قبل، `InitializeCpSwapWithPermission` بعد                                                                              | دائماً CPI المرخص؛ مساعد `initialize_cpswap` القديم محذوف، والحد الأدنى لـ 10 حسابات متبقية غير مشروط        |
| `initialize_with_token_2022`                         | مطلوب `amm_fee_on == BothToken` قبل القطع؛ تشغيل فحص قاعدة المنحنى للمنصة فقط بعده                                                             | لا توجد قيود `amm_fee_on`؛ فحص قاعدة المنحنى يعمل كلما تم تعيين `restrict_curve_param`                       |
| `initialize` (مهجورة)                                | فشل فقط بعد القطع زائد ثلاثة أيام                                                                                                              | يفشل دائماً                                                                                                  |

طابع الـ mainnet الزمني يتجاوز سنة واحدة، لذا المنشئ الصحيح والمحدث لا يرى أي تغيير سلوكي. ما تغير هو أن المنشئ **القديم** يفشل الآن بشكل حتمي بدلاً من الظهور بأنه يعمل ضد بناء devnet. التحقق من `system_program` الجديد حقيقي جديد: كانت تلك الفتحة تقبل أي حساب سابقاً.

## `CollectExcessLamports`

الخطوة 1 من [SIMD-0437](/ar/solana-fundamentals/rent-and-reclaimable-rent) هبطت على mainnet في 3 سبتمبر 2026، مما قلل الحد الأدنى المعفي من الإيجار بنسبة 9٪ مع أربع خطوات أخرى قادمة. كل خزينة مجموعة LaunchLab وخزينة رسوم و PDA مملوكة للبرنامج تم إنشاؤها قبل خطوة الآن ممولة بشكل زائد.

تأخذ التعليمة أربعة حسابات ثابتة — محفظة الموقّع/الوجهة، **واحد** PDA سلطة الخزينة، وكلا برنامجي الرموز — ثم أي عدد من الحسابات المصدر في `remaining_accounts`.

فتحة `authority` هي الجزء الذي يستحق القراءة بعناية. LaunchLab لديها ثلاثة PDAs سلطة الخزينة (`vault_auth_seed`، `platform_fee_vault_auth_seed`، `creator_fee_vault_auth_seed`)، والتعليمة تحل أيهما مررت بإعادة اشتقاق جميعها والمطابقة؛ مفتاح لا يطابق أي منها يفشل مع `InvalidOwner` (`6001`). لأن استدعاء واحد يحمل سلطة واحدة وبرنامج الرموز يتطلب من مالك الحساب الفعلي التوقيع، **يجب تجميع الحسابات المصدر حسب السلطة** — خزائن المجموعة وخزائن رسوم المنصة وخزائن رسوم المنشئ تكتسح في معاملات منفصلة. PDAs المملوكة للبرنامج يتم خصمها مباشرة ويمكنها الركوب مع أي سلطة.

Wrapped SOL يتبع نفس تسلسل `SyncNative` → `UnwrapLamports` بحجم دلتا → assert-unchanged الذي يستخدمه CPMM و AMM v4، مع `LamportsCalculateError` (`6031`) إذا لم تصل الرحلة ذهاباً وإياباً إلى صفر. الإطلاق المقتبس بـ SOL يحتفظ باحتياطي الاقتباس الكامل.

**لا يمكن كنس النعناع الأساسي.** `InitializeV2` و`InitializeWithToken2022` تلغي `MintTokens` في نفس التعليمة التي تسك الإمداد، لذا لا يمكن لأي مفتاح التوقيع على `WithdrawExcessLamports` لنعناع أساسي. إيجاره عالق بالتصميم.

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

## نقل قيود `MigrateToCpswap`

ثلاثة قيود حساب انتقلت من هيكل `Accounts` إلى جسم التعليمة:

```rust theme={null}
require_keys_eq!(ctx.accounts.platform_config.key(), ctx.accounts.pool_state.platform_config);
require_keys_eq!(ctx.accounts.base_vault.key(),      ctx.accounts.pool_state.base_vault);
require_keys_eq!(ctx.accounts.quote_vault.key(),     ctx.accounts.pool_state.quote_vault);
```

المتطلب متطابق — يجب أن تطابق جميعها الثلاثة القيم المخزنة على `PoolState`. فقط سطح الخطأ يختلف: `RequireKeysEqViolated` (`2502`) العام من Anchor، مُبلّغ عنه بدون اسم حساب، بدلاً من `ConstraintAddress` (`2012`) الذي يسمي الحساب المسيء. حدّث أي معالجة خطأ طابقت على `2012` لهذه الحسابات الثلاثة.

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

| العنصر                         | قبل                       | بعد                                   |
| ------------------------------ | ------------------------- | ------------------------------------- |
| `anchor-lang` / `anchor-spl`   | `0.32.1`                  | `=1.0.2`                              |
| `Anchor.toml` `solana_version` | `2.3.0`                   | `3.1.10`                              |
| 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`            |
| `@coral-xyz/anchor`            | `^0.32.1`                 | استبدل بـ `@anchor-lang/core` `1.0.2` |
| `@solana/spl-token`            | `^0.4.0`                  | `^0.4.14`                             |
| `typescript`                   | `^4.3.5`                  | `^5.6.3`                              |
| `tsconfig` target / lib        | `es6` / `es2015`          | `ES2020` / `es2020`، `skipLibCheck`   |

تطبق تغييرات موقع الاستدعاء الاثنان من Anchor 1.0 هنا أيضاً: `Context` ينهار من أربع معاملات عمر إلى واحد، و`CpiContext::new` يأخذ `Pubkey` البرنامج بدلاً من `AccountInfo`. انظر [`sdk-api/rust-cpi`](/ar/sdk-api/rust-cpi#cargo-dependencies).

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

## ما لم يتغير

* **كل تخطيط حساب.** `PoolState`، `GlobalConfig`، `PlatformConfig`، `PlatformCurveRule`، `PlatformAllowConfig`، سجلات الاستحقاق — نفس الأحجام، نفس الإزاحات.
* **أكواد الخطأ `6000`–`6030`،** بما في ذلك `6020` المحتفظ به عن قصد.
* **رياضيات المنحنى ومعدلات الرسوم وتراكم الرسوم وجداول الاستحقاق وتقسيم LP للتخرج.**
* **قواعد منحنى المنصة وقائمة السماح `GlobalConfig`.** نفس التعليمات، نفس الحسابات، نفس الدلالات؛ فقط بوابة الساعة حول فحص قاعدة المنحنى اختفت.
* **قائمة حسابات `MigrateToCpswap` وفهارس `remaining_accounts`.**
* **تسليم سلطة رسوم Transfer-Fee من Token-2022 عند التخرج.**
* **معرف البرنامج.** لم يتغير.

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

* `products/launchlab/instructions` — تمت إضافة `CollectExcessLamports` مع قائمة حسابها وجدول حل السلطة وتحذير التجميع؛ إزالات معاملات وحسابات `MigrateToAmm` موثقة مع القائمة الجديدة الكاملة؛ `Initialize` مقدمة بتحذير يفشل دائماً؛ قسم جديد "Trade remaining accounts" يغطي الحسابات الثلاثة غير المشروطة الآن وفحص `system_program`؛ صفوف المخزون ومصفوفة تغيير الحالة.
* `products/launchlab/overview` — لافتة الإصدار؛ ثوابت "CPMM-only" والنعناع الأساسي صححت.
* `products/launchlab/accounts` — توقيت إلغاء سلطة النعناع صحح لإنشاء الإطلاق (تم توثيقه عند التخرج)؛ صف `CollectExcessLamports` مضاف.
* `reference/error-codes` — `6031` موثقة.
* `reference/program-addresses` — قسم جديد "Excess-lamports collection wallets".
* `solana-fundamentals/rent-and-reclaimable-rent` — قسم جديد "What the Raydium programs sweep on their own side".
* `sdk-api/rust-cpi`، `solana-fundamentals/toolchain` — دبابيس Anchor 1.0 وملاحظات هجرة CPI.
