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

# LaunchLab PlatformConfig

> تكوين خاص لكل منصة يخصص العلامة التجارية وتوزيعات الرسوم وحصص هجرة NFT وتخصيص التوزيع الجديد وقائمة أشكال المنحنيات المسموحة لأي إطلاق يتم توجيهه عبر تلك المنصة.

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

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

<Info>
  `PlatformConfig` هو **تراكب على مستوى المنصة** يستقر فوق [`GlobalConfig`](/ar/products/launchlab/global-config). حيث يحدد `GlobalConfig` القواعد على نطاق البروتوكول ("رسم التجارة 1%، يجب أن يكون الإمداد على الأقل 10 مليون، فقط هذا المحفظة يمكنها التخرج")، `PlatformConfig` هو ما تستخدمه كل منصة إطلاق — pump.fun، واجهة Raydium الخاصة، منصات الطرف الثالث — لإضافة رسومها، والمطالبة بحصتها من LP بعد التخرج، وتقييد أشكال المنحنيات التي يمكن لإطلاقاتها أن تختار، وعرض علامتها التجارية (الاسم، الموقع الإلكتروني، الصورة) على السلسلة.
</Info>

## ما هو عليه

حساب `PlatformConfig` يمتلك أربع مخاوف عابرة للقطاع لمنصة:

1. **العلامة التجارية** — الاسم، الموقع الإلكتروني، رابط الصورة، كل شيء مخزّن مضمنًا حتى يمكن لأي مستكشف أو معالج بيانات عرض المنصة التي أطلقت الرمز.
2. **رسم المنصة** — رسم تجارة إضافي (`fee_rate`) فوق `trade_fee_rate` البروتوكول. يتراكم في محفظة رسوم المنصة (`platform_fee_wallet`). مغطى بـ 100 نقطة أساس بواسطة `GlobalConfig.max_share_fee_rate`.
3. **تقسيم هجرة NFT** — ثلاثة أعداد صحيحة (`platform_scale`, `creator_scale`, `burn_scale`) تجمع إلى `RATE_DENOMINATOR_VALUE = 1_000_000` وتقسم LP بعد التخرج إلى قطعة مسكوكة لمحفظة NFT المنصة، وقطعة لمحفظة NFT المنشئ، وقطعة محروقة (Burn & Earn). ذات مغزى فقط عندما يستهدف التخرج CPMM (`migrate_type = 1`).
4. **قائمة معاملات المنحنى البيضاء** — `Vec<PlatformCurveParam>` تدرج بالضبط أي `(supply, total_base_sell, total_quote_fund_raising, migrate_type, migrate_cpmm_fee_on, vesting_params...)` المجموعات المسموحة على هذه المنصة. إذا كان المتجه فارغًا أو جميع الإدخالات غير صالحة، **أي** مجموعة مسموحة؛ وإلا يجب أن تطابق الإطلاقات أحد الإدخالات بالضبط.

اشتقاق PDA:

```ts theme={null}
const [platformConfigPda] = PublicKey.findProgramAddressSync(
  [
    Buffer.from("platform_config"),
    platformAdmin.toBuffer(),       // platform's owning pubkey
  ],
  LAUNCHLAB_PROGRAM_ID,
);
```

(انظر `create_platform_config` في المصدر لقائمة البذور القانونية.)

## التخطيط

```rust theme={null}
// states/platform_config.rs
pub const PLATFORM_CONFIG_SEED: &str = "platform_config";
pub const NAME_SIZE: usize = 64;
pub const WEB_SIZE:  usize = 256;
pub const IMG_SIZE:  usize = 256;
pub const MAX_CREATOR_FEE_RATE: u64 = 5000;       // 50 bps (denominator 1_000_000)
pub const MAX_TRANSFER_FEE_RATE: u16 = 500;       // 5%   (denominator 10_000)
pub const MAX_CURVE_PARAMS: usize = 10;

#[account]
pub struct PlatformConfig {
    pub epoch:                       u64,
    pub platform_fee_wallet:         Pubkey,            // signs ClaimPlatformFee
    pub platform_nft_wallet:         Pubkey,            // receives the platform NFT slice at CPMM graduation
    pub platform_scale:              u64,               // share of LP minted to platform NFT
    pub creator_scale:               u64,               // share of LP minted to creator NFT
    pub burn_scale:                  u64,               // share of LP burned via Burn & Earn
    pub fee_rate:                    u64,               // platform's trade fee (1/1_000_000)
    pub name:                        [u8; 64],          // utf-8 padded with zeros
    pub web:                         [u8; 256],
    pub img:                         [u8; 256],
    pub cpswap_config:               Pubkey,            // CPMM AmmConfig that the post-grad pool will bind to
    pub creator_fee_rate:            u64,               // creator-side fee taken pre-graduation
    pub transfer_fee_extension_auth: Pubkey,            // for Token-2022 launches: who inherits transfer-fee authorities post-graduation
    pub platform_vesting_wallet:     Pubkey,
    pub platform_vesting_scale:      u64,               // platform's slice of total_locked_amount
    pub platform_cp_creator:         Pubkey,            // optional creator-of-record on the post-graduation CPMM pool
    pub padding:                     [u8; 108],
    pub curve_params:                Vec<PlatformCurveParam>, // whitelist of permitted curve shapes
}
```

يجب أن يساوي `platform_scale + creator_scale + burn_scale` قيمة `1_000_000` (تحقق بواسطة `MigrateNftInfo::check`). التقسيمات الشائعة الموجودة في الإنتاج:

* `(0, 100_000, 900_000)` — 90% LP محروق، 10% للمنشئ. إطلاق عادل على نمط pump القياسي.
* `(50_000, 100_000, 850_000)` — حصة منصة صغيرة (5%)، 10% منشئ، 85% حرق.
* `(0, 0, 1_000_000)` — حرق كامل، لا توجد سكات NFT. إطلاقات صارمة "بدون مطلعين".

## حقول العلامة التجارية

`name` و`web` و`img` عبارة عن صفائف بايت مضمنة مبطنة بأصفار حتى ثابتها. لقراءتها كنصوص، قم بالتقطيع حتى أول `\0`:

```ts theme={null}
function readString(bytes: Uint8Array): string {
  const end = bytes.indexOf(0);
  return Buffer.from(end === -1 ? bytes : bytes.subarray(0, end)).toString("utf-8");
}
```

الثوابت متعمدة السخاء (`name: 64`، `web: 256`، `img: 256`) بحيث يمكن للمنصات تضمين بيانات وصفية كافية للمستكشفات والمعالجات دون اللجوء إلى تخزين غير متسلسل. أي شيء يتجاوز هذه الأحجام يعود عند `CreatePlatformConfig` مع `InvalidInput`.

## ميكانيكا الرسوم

يفرض swap على منحنى مرتبط بـ `PlatformConfig` ثلاث رسوم متعددة الطبقات:

```
trade_fee     = amount_in × global_config.trade_fee_rate    / 1_000_000
platform_fee  = amount_in × platform_config.fee_rate        / 1_000_000
creator_fee   = amount_in × platform_config.creator_fee_rate / 1_000_000

amount_after_fee = amount_in − trade_fee − platform_fee − creator_fee
```

* يتراكم `trade_fee` في `protocol_fee_owner` البروتوكول (تم المطالبة به عبر `CollectFee`).
* يتراكم `platform_fee` في خزينة لكل منصة (تم المطالبة به عبر `ClaimPlatformFee` أو `ClaimPlatformFeeFromVault`؛ انظر [`instructions`](/ar/products/launchlab/instructions)).
* يتراكم `creator_fee` في خزينة لكل منشئ مفتاح بواسطة المفتاح العام للمنشئ + ضرب الاقتباس (تم المطالبة به عبر `ClaimCreatorFee`).

يقتصر `creator_fee_rate` على `MAX_CREATOR_FEE_RATE = 5000` (50 نقطة أساس). يقتصر `fee_rate` (رسم المنصة) على `10000` (100 نقطة أساس) بواسطة `GlobalConfig.max_share_fee_rate`.

## تقسيم هجرة NFT (فقط CPMM)

عندما يتخرج الإطلاق إلى CPMM (`migrate_type = 1`، موقعة بواسطة `migrate_to_cpswap_wallet`)، تقسم تعليمات الهجرة رموز LP المسكوكة بواسطة `CPMM::InitializeWithPermission` بثلاث طرق:

```
lp_to_platform = lp_total × platform_scale / 1_000_000   → platform_nft_wallet
lp_to_creator  = lp_total × creator_scale  / 1_000_000   → creator NFT (Fee Key)
lp_to_burn     = lp_total × burn_scale     / 1_000_000   → Burn & Earn lock program
```

يتم تجميع شرائح المنصة والمنشئ كـ **NFTs** بواسطة برنامج LP-Lock (`LockrWmn6K5twhz3y9w1dQERbmgSaRkfnTeTKbpofwE`) — يحق لصاحب NFT المطالبة برسوم CPMM المتراكمة بلا حد دون القدرة على سحب السيولة الأساسية. انظر [`products/launchlab/creator-fees`](/ar/products/launchlab/creator-fees) لتدفق Fee Key بعد التخرج.

يتم إرسال شريحة الحرق إلى برنامج القفل باستخدام `is_burn = true` بحيث تصبح رموز LP بشكل دائم غير قابلة للوصول — فهي تؤمن أرضية سعر المجمع دون أن تدفع أبدًا الرسوم لأي شخص.

عندما `migrate_type = 0` (التخرج إلى AMM v4)، يتم تجاهل حقول تقسيم NFT وكامل LP مقفول / محروق وفقًا لتدفق جانب AMM v4 منفصل.

## قائمة معاملات المنحنى البيضاء

`curve_params: Vec<PlatformCurveParam>` هي آلية المنصة لتقييد أشكال المنحنيات التي يمكن لإطلاقاتها أن تختار. إذا كان المتجه غير فارغ وكان هناك إدخال واحد على الأقل صالحًا، يفرض البرنامج عند `Initialize` أن معاملات الإطلاق تطابق إدخالًا واحدًا على الأقل بالضبط.

```rust theme={null}
#[derive(AnchorSerialize, AnchorDeserialize, Clone)]
pub struct PlatformCurveParam {
    pub epoch:                u64,
    pub index:                u8,           // ordinal within this platform's whitelist
    pub global_config:        Pubkey,       // which GlobalConfig this entry applies to
    pub bonding_curve_param:  BondingCurveParam,
    pub padding:              [u64; 50],
}

#[derive(AnchorSerialize, AnchorDeserialize, Clone)]
pub struct BondingCurveParam {
    pub migrate_type:               u8,    // 0 = AMM v4, 1 = CPMM. u8::MAX = wildcard
    pub migrate_cpmm_fee_on:        u8,    // 0 = quote-only, 1 = both. u8::MAX = wildcard
    pub supply:                     u64,   // 0 = wildcard
    pub total_base_sell:            u64,   // 0 = wildcard
    pub total_quote_fund_raising:   u64,   // 0 = wildcard
    pub total_locked_amount:        u64,   // u64::MAX = wildcard
    pub cliff_period:               u64,   // u64::MAX = wildcard
    pub unlock_period:              u64,   // u64::MAX = wildcard
}
```

كل حقل له قيمة حارس تعني **wildcard** (أي قيمة تطابق): `u64::MAX` لحقول `u64`، `u8::MAX` لحقول `u8`، `0` لحقول الإمداد / البيع / جمع التمويل. `BondingCurveParam` مع جميع الحراس هو "السماح بأي شيء" — معادل لسلوك القائمة البيضاء الفارغة.

خوارزمية المطابقة عند `Initialize`:

1. تصفية `curve_params` لإدخالات التي `global_config` تطابق `GlobalConfig` المختار للإطلاق.
2. إذا كانت القائمة المفلترة فارغة، السماح بأي معاملات (لم تقيّد المنصة أي شيء لهذا `GlobalConfig`).
3. إذا كان كل إدخال في القائمة المفلترة له `all_is_invalid()` (كل حقل هو البديل)، السماح بأي معاملات.
4. بخلاف ذلك، كرّر الإدخالات؛ لكل إدخال، تحقق من معاملات الإطلاق ضد كل حقل غير wildcard. إذا طابقت جميع الحقول غير wildcard، قبول وعودة.
5. إذا لم يطابق أي إدخال، عودة مع `InvalidInput`.

هذا يتيح لمنصة أن تقول "نسمح فقط بشكل الإطلاق القياسي 1B-supply / 800M-sold / 30k-USDC-raise / no-vesting" بكتابة إدخال واحد مع قيم ملموسة لتلك الحقول الأربعة و wildcards في كل مكان آخر. أو منصة أكثر صرامة قد تعدد ثلاثة أو أربعة أشكال منفصلة، واحد لكل درجة إطلاق مدعومة.

`MAX_CURVE_PARAMS = 10` يحد من حجم القائمة البيضاء.

## `PlatformGlobalAccess` — ترخيص منصة

عندما يكون لدى `GlobalConfig` قيمة `requires_platform_auth = 1`، يجب أن يتضمن كل `Initialize` ضده `PlatformGlobalAccess` PDA يثبت أن المنصة قد تم ترخيصها مسبقًا:

```rust theme={null}
// states/platform_global_access.rs
pub const PLATFORM_GLOBAL_ACCESS_SEED: &str = "platform_global_access";

#[account]
pub struct PlatformGlobalAccess {
    pub bump:            u8,
    pub global_config:   Pubkey,
    pub platform_config: Pubkey,
    pub padding:         [u64; 8],
}
```

بذور PDA: `[b"platform_global_access", global_config, platform_config]`.

يقوم مسؤول البروتوكول بإنشاء واحدة من هذه لكل زوج `(GlobalConfig, PlatformConfig)` عبر `CreatePlatformGlobalAccess` ويلغيها عبر `ClosePlatformGlobalAccess`. بدون هذا الحساب، لا يمكن للإطلاق الربط بـ `GlobalConfig` من المنصة المحاطة.

## مسار القراءة

```ts theme={null}
const platformConfig = await raydium.launchpad.getPlatformConfig(platformConfigPda);

console.log("Platform:", readString(platformConfig.name));
console.log("Fee rate:", platformConfig.feeRate, "(/1M)");
console.log("NFT split:",
  platformConfig.platformScale,
  platformConfig.creatorScale,
  platformConfig.burnScale,
);
console.log("Curve whitelist size:", platformConfig.curveParams.length);
```

لواجهة مستخدم تظهر "من أين تم إطلاق هذا الرمز"، يشير `PoolState.platform_config` مباشرة إلى `PlatformConfig` الأصلي — أحضره مرة واحدة وخزّن مؤقتًا العلامة التجارية.

## مسار التحديث

| التعليمات                   | من يوقّع                 | ما الذي يتغير                                                                                                                                                        |
| --------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `CreatePlatformConfig`      | مسؤول المنصة (مرة واحدة) | تهيئة الحساب باستخدام `PlatformParams`.                                                                                                                              |
| `UpdatePlatformConfig`      | مسؤول المنصة             | توزيع عام مفتاح بـ `param: u8`؛ يتغير حقل واحد لكل استدعاء. حقول العلامة التجارية، معدلات الرسوم، محفظة التوزيع، والمحافظ المختلفة قابلة للتعيين جميعها من خلال هذا. |
| `UpdatePlatformCurveParam`  | مسؤول المنصة             | إضافة أو استبدال إدخال `PlatformCurveParam` واحد بـ `(global_config, index)`.                                                                                        |
| `RemovePlatformCurveParam`  | مسؤول المنصة             | مسح إدخال واحد (ضبطه على جميع الحراس = wildcard).                                                                                                                    |
| `ClaimPlatformFee`          | `platform_fee_wallet`    | كسح رسم المنصة لكل مجمع من `PoolState.quote_vault`.                                                                                                                  |
| `ClaimPlatformFeeFromVault` | `platform_fee_wallet`    | كسح خزينة رسم المنصة لكل منصة (PDA في `[platform_config, quote_mint]`).                                                                                              |

جميع دورات المحافظ (`platform_fee_wallet`, `platform_nft_wallet`, `platform_vesting_wallet`, `platform_cp_creator`, `transfer_fee_extension_auth`, `cpswap_config`) تمر عبر `UpdatePlatformConfig`. اقرأ جدول توزيع `update_platform_config` في المصدر لأكواد `param` الدقيقة.

## المزالق الشائعة

* **حراس القائمة البيضاء خاطئة.** `BondingCurveParam` مع `total_locked_amount = 0` **ليس** wildcard — فهو يطابق الإطلاقات التي تختار بوضوح عدم التوزيع. البديل لذلك الحقل هو `u64::MAX`. الفخ نفسه موجود لـ `cliff_period` و`unlock_period`. استخدم `clear()` (الذي يكشفه البرنامج) لتعيين الحراس بشكل صحيح.
* **تقريب تقسيم NFT.** يجب أن تجمع الموازين الثلاثة إلى بالضبط `1_000_000`. أخطاء قريبة من الواحد عند `CreatePlatformConfig` تعود؛ قريبة من الواحد في وقت التشغيل قد تسك أو تحرق وحدة LP واحدة إضافية، وهذا ما يوجد فحص المساواة الصارم لمنعه.
* **مضاعفة تخصيص التوزيع للمنصة.** إذا كان `platform_vesting_scale > 0`، يجب على المنصة استدعاء `CreatePlatformVestingAccount` مرة واحدة بعد انتهاء جمع تمويل الإطلاق؛ إذا نسيت، تلك الحصة تبقى غير مخصصة وخامدة إلى الأبد (ميزانية `total_locked_amount` الإطلاق يتم استهلاكها لكن المنصة لا تطالب أبدًا).
* **غموض `platform_cp_creator`.** عند تعيينها إلى `Pubkey::default()`، يتم تسجيل مُنشئ الإطلاق كـ `pool_creator` لمجمع CPMM بعد التخرج؛ عند تعيينها لمفتاح حقيقي، يتم تسجيل ذلك المفتاح بدلاً من ذلك. هذا يؤثر على من يمكنه استدعاء `CPMM::CollectCreatorFee` لاحقًا. قرر في وقت إنشاء تكوين المنصة أي نموذج تريده.

## مؤشرات

* [`products/launchlab/global-config`](/ar/products/launchlab/global-config) — قواعد جانب البروتوكول يجب أن يرضيها الإطلاق.
* [`products/launchlab/vesting`](/ar/products/launchlab/vesting) — ميكانيكا `platform_vesting_scale`.
* [`products/launchlab/creator-fees`](/ar/products/launchlab/creator-fees) — Fee Key NFT، Burn & Earn.
* [`products/launchlab/platforms`](/ar/products/launchlab/platforms) — دليل متكامل المنصة.

المصادر:

* `raydium-launch/programs/launchpad/src/states/platform_config.rs` — `PlatformConfig`, `PlatformParams`, `MigrateNftInfo`, `PlatformCurveParam`, `BondingCurveParam`, `is_valid_curve_param`.
* `raydium-launch/programs/launchpad/src/states/platform_global_access.rs` — `PlatformGlobalAccess`.
* `raydium-launch/programs/launchpad/src/lib.rs` — `create_platform_config`, `update_platform_config`, `update_platform_curve_param`, `remove_platform_curve_param`, `create_platform_global_access`, `close_platform_global_access`, `claim_platform_fee`, `claim_platform_fee_from_vault`.
