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

> كيف تقيّد المنصة معاملات الإطلاق التي قد يختارها منشئوها: مجموعات الفحص، نموذج القيد (الحقل، العملية، القيمة)، وتسع استراتيجيات — الفئات الدقيقة، نطاقات القيمة، حدود التقييم عند التخرج، حدود الهجرة، بوابات نوع الرمز، والعروض الترويجية المحدودة بالوقت.

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

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

<Info>
  **قاعدة المنحنى** هي إجابة المنصة على السؤال: "أي عمليات إطلاق أنا مستعد لاستضافتها؟". يحدد [`GlobalConfig`](/ar/products/launchlab/global-config) الحد الأدنى للبروتوكول — توفير 10 ملايين على الأقل، بيع 20% على الأقل من الإمداد على المنحنى، وما إلى ذلك — وهذه الحدود الدنيا متعمدة أن تكون واسعة بحيث تناسب كل منصة. قاعدة المنحنى هي حيث تضيق منصتك هذه الحدود لتناسب الشكل الذي يدعمه منتجك فعلاً.

  تعيش القواعد في حسابها الخاص `PlatformCurveRule`، واحدة لكل زوج (منصة، [`GlobalConfig`](/ar/products/launchlab/global-config)). يمكنها فقط تضييق ما يسمح به الإعداد بالفعل؛ لا يمكن لقاعدة أن توسع حد البروتوكول أبداً.
</Info>

## النموذج الذهني

ثلاث مستويات، من الخارج إلى الداخل:

```
GlobalConfig       حد البروتوكول      "supply >= 10M, sell rate >= 20%, ..."
  └─ PlatformCurveRule   قاعدتك     "وعلى منصتي: واحدة من هذه الأشكال"
       └─ مجموعة فحص    شكل واحد     "supply = 1B AND fund raising in [80, 90] SOL"
            └─ قيد واحد    فحص واحد    "(Supply, Eq, 1_000_000_000)"
```

المستويان من التداخل هما ما يجعل هذا معبّراً:

* **القيود داخل مجموعة واحدة مرتبطة بـ AND.** يجب أن تكون جميعها صحيحة.
* **المجموعات داخل قاعدة واحدة مرتبطة بـ OR.** يُسمح بالإطلاق بمجرد استيفائه لأي مجموعة واحدة.

إذاً المجموعة هي *شكل* واحد مسموح به، والقاعدة هي قائمة الأشكال التي تقدمها. تحتفظ القاعدة بما يصل إلى 10 مجموعات، والمجموعة بما يصل إلى 25 قيداً.

هناك حالتا حدود تستحق الحفظ:

| الحالة                                    | المعنى                                                 |
| ----------------------------------------- | ------------------------------------------------------ |
| لا يوجد حساب قاعدة، أو قاعدة بدون مجموعات | المنصة لا تقيد معاملات الإطلاق لهذا الإعداد.           |
| مجموعة بدون قيود                          | تطابق هذه المجموعة كل إطلاق، لذا تسمح القاعدة بكل شيء. |

تسري القاعدة فقط بينما `PlatformConfig.restrict_curve_param` هو `1`. عند `0` البرنامج لا يقرأ القواعس على الإطلاق، وهذا أيضاً هو المفتاح الذي تستخدمه لتفعيل قاعدة والتراجع عنها.

## القيود

القيد هو ثلاثية `(field, op, value)`. لا شيء آخر — لا تعبيرات، لا تداخل.

```rust theme={null}
pub struct ParamConstraint {
    pub field: u8,    // معامل الإطلاق، انظر الجدول أدناه
    pub op:    u8,    // 0 Eq, 1 Gte (min), 2 Lte (max), 3 Neq
    pub value: u128,
}
```

**النطاق هو قيدان** على نفس الحقل داخل مجموعة واحدة: `Gte` للحد الأدنى و `Lte` للحد الأقصى. لا يمكن أن يظهر نفس الزوج `(field, op)` مرتين في مجموعة واحدة، وهذا ما يمنعك من كتابة حدين أدنى متناقضين.

### الحقول

<Info>
  معرفات الحقول دائمة. الحقول الجديدة تُضاف فقط، لذا لا يتغير معنى المعرف أبداً بمجرد أن يحتفظ به حساب القاعدة.
</Info>

| المعرف | الحقل                    | الوحدة         | ملاحظات                                                                                         |
| ------ | ------------------------ | -------------- | ----------------------------------------------------------------------------------------------- |
| 0      | `CurveType`              | enum           | 0 منتج ثابت، 1 سعر ثابت، 2 سعر خطي                                                              |
| 1      | `MigrateType`            | enum           | يجب أن تكون الإطلاقات الجديدة `1` (CPMM) على أي حال                                             |
| 2      | `MigrateCpmmFeeOn`       | enum           | 0 الاقتباس فقط، 1 كلا الرمزين                                                                   |
| 3      | `Supply`                 | وحدات أساسية   | إجمالي إمداد الرمز                                                                              |
| 4      | `TotalSellA`             | وحدات أساسية   | مباع على المنحنى. فقط إعدادات المنتج الثابت — انظر [قيود نوع المنحنى](#curve-type-restrictions) |
| 5      | `TotalFundRaisingB`      | وحدات الاقتباس | هدف التخرج                                                                                      |
| 6      | `TotalLockedAmount`      | وحدات أساسية   | ميزانية الاستحقاق                                                                               |
| 7      | `CliffPeriod`            | ثوان           | الانتظار قبل بدء فتح القفل                                                                      |
| 8      | `UnlockPeriod`           | ثوان           | مدة فتح القفل                                                                                   |
| 9      | `BaseTokenProgram`       | enum           | 0 SPL Token، 1 Token-2022                                                                       |
| 10     | `TransferFeeEnabled`     | bool           | 1 عندما يحمل الرمز الأساسي `TransferFeeConfig`                                                  |
| 11     | `TransferFeeBasisPoints` | 1/10 000       | 0 بدون الامتداد                                                                                 |
| 12     | `TransferFeeMaximumFee`  | وحدات أساسية   | 0 بدون الامتداد                                                                                 |
| 13     | `SellRateA`              | 1/1 000 000    | مشتق: `TotalSellA / Supply`. فقط المنتج الثابت                                                  |
| 14     | `LockRate`               | 1/1 000 000    | مشتق: `TotalLockedAmount / Supply`                                                              |
| 15     | `MigrateAmountA`         | وحدات أساسية   | مشتق: `Supply − TotalSellA − TotalLockedAmount`. فقط المنتج الثابت                              |
| 16     | `MigrateRateA`           | 1/1 000 000    | مشتق: `MigrateAmountA / Supply`. فقط المنتج الثابت                                              |
| 17     | `FundRaisingRateB`       | 1/1 000 000    | مشتق: `TotalFundRaisingB / Supply`                                                              |
| 18     | `UnixTimestamp`          | ثوان           | وقت الكتلة للإطلاق                                                                              |

الحقول المشتقة هي التي تجعل القواعد محمولة. تثبيت `Supply` و `TotalFundRaisingB` على أرقام دقيقة يثبت شكل إطلاق واحد؛ تقييد `FundRaisingRateB` يثبت *العلاقة* بينهما ويسمح للمنشئ باختيار أي إمداد يحافظ عليها.

<Warning>
  حقول المعدل قابلة للمقارنة فقط داخل `GlobalConfig` واحد، لأن مقاماتها تعتمد على رمز الاقتباس في هذا الإعداد وعدد الكسور العشرية. هذا ليس قيداً عملياً: القاعدة مقيدة بإعداد واحد بالبناء.
</Warning>

## الاستراتيجيات التسع

كل استراتيجية أدناه هي قاعدة واحدة. تُكتب القيود كـ `(field, op, value)`.

### 1. فئة معيارية واحدة

أبسط قاعدة، والسلوك الدقيق الذي قدمته قائمة معاملات المنحنى البيضاء المتقاعدة: شكل واحد، مثبت.

| المجموعة | القيود                                                                                              |
| -------- | --------------------------------------------------------------------------------------------------- |
| 0        | `(Supply, Eq, 1_000_000_000e6)`، `(TotalSellA, Eq, 800_000_000e6)`، `(TotalFundRaisingB, Eq, 85e9)` |

أي إطلاق ينحرف في أي من الثلاثة يُرفض مع `CurveParamNotMatchPlatformRule`.

### 2. نطاق بدلاً من رقم

السبب في وجود النطاقات: يختار المنشئ هدف جمع الأموال الذي تشعر معه بالراحة، دون أن تعدد كل قيمة.

| المجموعة | القيود                                                                                               |
| -------- | ---------------------------------------------------------------------------------------------------- |
| 0        | `(Supply, Eq, 1_000_000_000e6)`، `(TotalFundRaisingB, Gte, 50e9)`، `(TotalFundRaisingB, Lte, 200e9)` |

مجموعة واحدة، أربعة قيود، والمنشئ لديه ممر 50–200 SOL. تحت القائمة البيضاء القديمة كان هذا يحتاج إلى إدخال واحد لكل قيمة مسموحة، وحد الدخول العشرة جعله مستحيلاً.

### 3. فئات جنباً إلى جنب

المجموعات مرتبطة بـ OR، لذا كل فئة هي مجموعة.

| المجموعة | القيود                                                              | الفئة  |
| -------- | ------------------------------------------------------------------- | ------ |
| 0        | `(Supply, Eq, 1_000_000_000e6)`، `(TotalFundRaisingB, Eq, 85e9)`    | معياري |
| 1        | `(Supply, Eq, 100_000_000e6)`، `(TotalFundRaisingB, Eq, 30e9)`      | صغير   |
| 2        | `(Supply, Eq, 10_000_000_000e6)`، `(TotalFundRaisingB, Gte, 500e9)` | حوت    |

الترتيب مهم للحساب، وليس للدلالات: التقييم يتوقف عند أول مجموعة تطابق، لذا ضع فئتك الأكثر استخداماً أولاً.

### 4. نطاق تقييم التخرج

`FundRaisingRateB` هو `TotalFundRaisingB / Supply` بالملايين. تقييده يحد من مدى ثراء الرمز عند التخرج بغض النظر عن الإمداد الذي اختاره المنشئ.

| المجموعة | القيود                                                                |
| -------- | --------------------------------------------------------------------- |
| 0        | `(FundRaisingRateB, Gte, 60_000)`، `(FundRaisingRateB, Lte, 120_000)` |

مع إمداد 1e12 ورمز اقتباس بـ 9 كسور عشرية، `85e9 / 1e12 × 1e6 = 85_000` يقع داخل هذا النطاق. يجب على المنشئ الذي يضاعف الإمداد أن يضاعف الهدف تقريباً للبقاء فيه — وهذه هي النقطة. قيدان يحلان محل ما كان سيكون جدول `(supply, target)` أزواج.

### 5. حد الهجرة

`MigrateRateA` هو حصة الإمداد التي تصل فعلاً إلى مجموعة CPMM عند التخرج: `Supply − TotalSellA − TotalLockedAmount`، على الإمداد. إنه عمق المجموعة المتخرجة، وهو المقبض الوحيد للبروتوكول الذي لا يوجد له معادل من جانب المنصة قبل القواعد.

| المجموعة | القيود                         |
| -------- | ------------------------------ |
| 0        | `(MigrateRateA, Gte, 150_000)` |

على الأقل 15% من الإمداد يصل إلى المجموعة. لا يمكن للمنشئ بيع 95% على المنحنى وترك كتاب ضحل خلفه.

<Note>
  إذا لم تضف المعاملات — مبلغ مقفول أكبر من ما تبقى بعد بيع المنحنى — لا يمكن حساب القيمة المشتقة والقيد يفشل مغلقاً، لذا يُرفض الإطلاق بدلاً من السماح به بصمت.
</Note>

### 6. الاستحقاق الذي تفرضه فعلاً

`GlobalConfig.max_lock_rate` يحد الاستحقاق من الأعلى. يمكن للقاعدة أن تضع حداً أدنى تحته، وتتطلب منحدراً حقيقياً.

| المجموعة | القيود                                                                                 |
| -------- | -------------------------------------------------------------------------------------- |
| 0        | `(LockRate, Gte, 50_000)`، `(LockRate, Lte, 200_000)`، `(CliffPeriod, Gte, 2_592_000)` |

بين 5% و 20% من الإمداد مستحق، مع حد أدنى من 30 يوماً. مفيد لمنصة يقول عرضها "لا إطلاقات فتح فوري".

### 7. بوابة نوع الرمز

`BaseTokenProgram` و `TransferFeeEnabled` مستقلان، وهذا مهم: رمز Token-2022 بدون `TransferFeeConfig` يبلغ `TransferFeeEnabled = 0` تماماً مثل رمز SPL Token.

| النية                    | المجموعة | القيود                                                     |
| ------------------------ | -------- | ---------------------------------------------------------- |
| SPL Token فقط            | 0        | `(BaseTokenProgram, Eq, 0)`                                |
| Token-2022 فقط           | 0        | `(BaseTokenProgram, Eq, 1)`                                |
| Token-2022، بدون رسم نقل | 0        | `(BaseTokenProgram, Eq, 1)`، `(TransferFeeEnabled, Eq, 0)` |
| بدون رسم نقل، أي برنامج  | 0        | `(TransferFeeEnabled, Eq, 0)`                              |

### 8. حد رسم نقل مشروط

لا يوجد عامل "if"، ولا يلزم — مجموعتان تعبران عن الشرط.

| المجموعة | القيود                                                                                                     | يُقرأ كـ                                   |
| -------- | ---------------------------------------------------------------------------------------------------------- | ------------------------------------------ |
| 0        | `(TransferFeeEnabled, Eq, 0)`                                                                              | بدون رسم نقل: حسناً                        |
| 1        | `(TransferFeeEnabled, Eq, 1)`، `(TransferFeeBasisPoints, Lte, 100)`، `(TransferFeeMaximumFee, Gte, 1_000)` | مع رسم: بحد أقصى 1%، ورسم أقصى مضبوط فعلاً |

`TransferFeeConfig` بمعدل صفر لا ينزلق عبر المجموعة 0: الامتداد موجود، لذا `TransferFeeEnabled` هو `1` وفقط المجموعة 1 يمكنها قبوله.

### 9. عرض ترويجي محدود بالوقت، مجدول مقدماً

`UnixTimestamp` هو وقت الكتلة للإطلاق، لذا يمكن لمجموعة أن تحمل نافذة صلاحيتها الخاصة. تكتب كلا المجموعتين اليوم والتبديل يحدث من تلقاء نفسه.

| المجموعة | القيود                                                                  | النافذة                              |
| -------- | ----------------------------------------------------------------------- | ------------------------------------ |
| 0        | `(UnixTimestamp, Lte, 1_767_225_600)`، `(TotalFundRaisingB, Gte, 30e9)` | فترة العرض الترويجي: 30 SOL بحد أدنى |
| 1        | `(UnixTimestamp, Gte, 1_767_225_601)`، `(TotalFundRaisingB, Gte, 80e9)` | بعد ذلك: 80 SOL بحد أدنى             |

لا توجد معاملة مطلوبة عند الحد. التكلفة هي فتحتا مجموعة بدلاً من واحدة.

## قيود نوع المنحنى

أربعة حقول تقرأ `TotalSellA`: `TotalSellA`، `SellRateA`، `MigrateAmountA`، و `MigrateRateA`. على إعداد منتج ثابت يوفر المنشئ هذا الرقم. على إعداد سعر ثابت أو سعر خطي يشتقه المنحنى بدلاً من ذلك، والقيمة التي يقارنها البرنامج هي `0`، وهذا سيرفض كل إطلاق.

بدلاً من السماح لك بكتابة قاعدة تحجب إعدادك الخاص بصمت، يرفض البرنامج هذه الحقول الأربعة في وقت الكتابة على إعداد غير منتج ثابت، مع `CurveRuleFieldNotSupportedByCurve`. توجد فقط إعدادات منتج ثابت اليوم، لذا عملياً لن تواجه هذا الخطأ.

## تحقق قبل أن ترسل

كلا اتجاهي الفحص على السلسلة متاحان خارج السلسلة، لذا لا يتعين على المنشئ ولا على المنصة تعلم قاعدة بمراقبة المعاملات المرتدة.

<Info>
  **لافتة الإصدار.**

  * SDK: `@raydium-io/raydium-sdk-v2@0.2.42-alpha` هو الإصدار الذي يتم تثبيت كل عرض كود آخر على هذا الموقع عليه. المساعدان أدناه يأتيان مع إصدار SDK الذي يشحن دعم قاعدة المنحنى؛ حتى ذلك الحين، انقل منهما من `platform_curve_rule.rs` للبرنامج أو اتصل بالبرنامج واقرأ رمز الخطأ.
  * الكتلة: اختبر على Solana `devnet` أولاً — انظر [اختبر على devnet أولاً](#test-on-devnet-first).
  * معرف البرنامج: انظر [`reference/program-addresses`](/ar/reference/program-addresses)

  كلا المساعدين دوال نقية. لا تلمس أي RPC، لذا من الآمن تشغيلهما على كل ضغطة مفتاح في نموذج.
</Info>

### قبل الإطلاق: هل ستمر هذه المعاملات؟

`checkLaunchAgainstCurveRule` يعكس فحص وقت الإطلاق للبرنامج بالضبط، بما في ذلك سلوكه الفاشل المغلق. شغّله في نموذج الإطلاق الخاص بك ويمكنك تعطيل زر الإرسال بسبب بدلاً من السماح للمنشئ بدفع معاملة مرتدة.

```ts theme={null}
import {
  checkLaunchAgainstCurveRule,
  getPdaPlatformCurveRule,
  LaunchpadCurveRuleBaseTokenProgram,
  LaunchpadCurveRuleField,
  PlatformCurveRule,
} from "@raydium-io/raydium-sdk-v2";
import BN from "bn.js";

const platformConfig = await raydium.launchpad.getPlatformConfig(platformConfigId);

// عند 0 البرنامج لا يقرأ القواعد على الإطلاق، لذا لا يوجد شيء للتحقق منه
if (platformConfig.restrictCurveParam !== 0) {
  const ruleId = getPdaPlatformCurveRule(programId, platformConfigId, configId).publicKey;
  const ruleAccount = await connection.getAccountInfo(ruleId);

  const result = checkLaunchAgainstCurveRule({
    // undefined عندما لا يكون الحساب موجوداً — المنصة لم تكتب قاعدة لهذا الإعداد
    rule: ruleAccount === null ? undefined : PlatformCurveRule.decode(ruleAccount.data),
    context: {
      curveType: globalConfig.curveType,
      migrateType: 1,
      migrateCpmmFeeOn: 0,
      supply: new BN("1000000000000000"),
      totalSellA: new BN("793100000000000"),
      totalFundRaisingB: new BN("85000000000"),
      totalLockedAmount: new BN(0),
      cliffPeriod: new BN(0),
      unlockPeriod: new BN(0),
      baseTokenProgram: LaunchpadCurveRuleBaseTokenProgram.SplToken,
      // حذف transferFee بالكامل عندما لا يحمل الرمز الأساسي امتداد رسم النقل
      unixTimestamp: new BN(Math.floor(Date.now() / 1000)),
    },
  });

  if (!result.ok) {
    // كل مجموعة رفضت الإطلاق؛ كل إدخال يسرد جميع القيود الفاشلة في تلك المجموعة
    for (const group of result.groupFailures) {
      for (const c of group.unsatisfied) {
        console.log(
          `group ${group.groupId}: ${LaunchpadCurveRuleField[c.field]} is ${c.actual ?? "not computable"},`,
          `rule wants op ${c.op} ${c.value.toString()}`,
        );
      }
    }
  }
}
```

ثلاثة أشياء يعيد إنتاجها المساعد بدلاً من تقريبها:

* **حساب قاعدة مفقود، وقاعدة بدون مجموعة، كلاهما يمر.** كذلك مجموعة بدون قيود. مرر `rule: undefined` لحساب غير موجود؛ لا تعامله كرفض.
* **القيم غير القابلة للحساب تفشل مغلقة.** إمداد صفر ليس له معدلات، ومبلغ مقفول أكبر من ما يتركه بيع المنحنى ليس له مبلغ هجرة. `actual` يعود `undefined` والقيد يُحسب كغير مرضٍ، تماماً كما هو الحال على السلسلة.
* **جميع القيود الفاشلة يتم الإبلاغ عنها، وليس فقط الأول.** البرنامج يختصر لأنه يحتاج فقط إلى حكم؛ المساعد يجمع كل شيء حتى يتمكن نموذجك من سرد كل مشكلة مرة واحدة.

الشيء الوحيد الذي لا يمكنه معرفته هو وقت الكتلة الذي ستصل معاملتك إليه فعلاً. إذا كانت قاعدة تستخدم `UnixTimestamp` بالقرب من حد، تعامل مع النجاح كمؤقت.

### قبل كتابة قاعدة: هل هذه المجموعة صالحة؟

`checkCurveRuleGroupWritable` يعكس التحقق من وقت الكتابة من `UpdatePlatformCurveRule` — معرفات القيود، قاعدة `(field, op)` المكررة، كلا حدود العد، وقيد نوع المنحنى. شغّله في أداة إدارة منصتك قبل التوقيع.

```ts theme={null}
import {
  checkCurveRuleGroupWritable,
  LaunchpadCurveRuleField,
  LaunchpadCurveRuleOp,
} from "@raydium-io/raydium-sdk-v2";

const constraints = [
  { field: LaunchpadCurveRuleField.Supply, op: LaunchpadCurveRuleOp.Eq, value: new BN("1000000000000000") },
  { field: LaunchpadCurveRuleField.TotalFundRaisingB, op: LaunchpadCurveRuleOp.Gte, value: new BN("50000000000") },
  { field: LaunchpadCurveRuleField.TotalFundRaisingB, op: LaunchpadCurveRuleOp.Lte, value: new BN("200000000000") },
];

const writable = checkCurveRuleGroupWritable({
  groupId: 0,
  constraints,
  curveType: globalConfig.curveType,
  // المعرفات التي تحتفظ بها القاعدة بالفعل، لذا استبدال مجموعة لا يُخطأ في إضافة واحدة
  existingGroupIds: existingRule?.groups.map((g) => g.groupId) ?? [],
});

// كل خطأ يحمل رمز خطأ البرنامج الذي كانت المعاملة ستفشل معه
if (!writable.ok) console.log(writable.errors);
```

<Note>
  النجاح في هذا الفحص يعني أن المعاملة لن يتم رفضها لكونها سيئة التكوين. لا يقول شيئاً عما إذا كانت القاعدة هي ما قصدته — يمكن لمجموعة أن تكون صالحة تماماً وتظل ترفض كل إطلاق يمكن لواجهة المستخدم الخاصة بك إنتاجه. هذا ما الفحص من جانب الإطلاق أعلاه: بعد كتابة مجموعة، شغّل كل شكل يمكن لمنتجك إنتاجه عبر `checkLaunchAgainstCurveRule` وأكد أن كل واحد لا يزال يجد مجموعة.
</Note>

### اختبر على devnet أولاً

تفعيل `restrict_curve_param` على mainnet يغير ما يمكن لمنشئيك فعله، فوراً، لكل إطلاق. تدرب على التسلسل كله على devnet قبل أن تلمس mainnet:

1. أنشئ إعداد منصة وقاعدة على devnet، واكتب نفس المجموعات التي تنوي شحنها.
2. شغّل كل شكل إطلاق يمكن لواجهة المستخدم الخاصة بك إنتاجه عبر `checkLaunchAgainstCurveRule`، وأكد أن الأحكام هي التي تتوقعها — كل من الأشكال التي يجب أن تمر والأشكال التي يجب رفضها.
3. فعّل `restrict_curve_param`، ثم أطلق فعلاً رمزاً يجب أن يمر وواحداً يجب أن يُرفض. الثاني يجب أن يفشل مع `CurveParamNotMatchPlatformRule` (`6025`)، وليس مع `NotEnoughRemainingAccounts` (`6018`) — الأخير يعني أن منشئك لا يضيف PDA القاعدة والفحص لا يتم تمريره فعلاً.
4. فقط بعد ذلك كرر على mainnet، بنفس الترتيب.

النقطة 3 هي التي تستحق الإصرار عليها. المساعد خارج السلسلة والبرنامج على السلسلة هما تطبيقان لنفس القواعد، وإطلاق devnet هو ما يثبت أنهما يتفقان على قاعدتك — بما في ذلك أن منشئ الإطلاق الخاص بك يمرر الحساب على الإطلاق.

## تشغيل قاعدة

### مدير مفوض

تحرير القواعد عمل روتيني؛ مفتاح إدارة المنصة عادة ما يكون multisig. `PlatformConfig.curve_rule_manager` موجود بالضبط لهذا: اضبطه مرة واحدة عبر `UpdatePlatformConfig::CurveRuleManager`، وتلك المحفظة الساخنة يمكنها بعد ذلك إنشاء وتحديث وإزالة وإغلاق حسابات القاعدة بمفردها. يحتفظ مسؤول المنصة بنفس السلطة بالتوازي، لذا مفتاح مدير مفقود قابل للاسترجاع — أدره بنداء إدارة آخر.

نطاق مفتاح مدير مخترق: يمكنه تخفيف أو حذف قواعد المعاملات الخاصة بك، ويمكنه استرجاع إيجار حساب القاعدة. لا يمكنه لمس محافظ الرسوم، الاستحقاق، إعداد CPMM، لا يمكنه قلب `restrict_curve_param`، ولا يمكنه كسر حد `GlobalConfig`. تعامل معه كمفتاح إعداد، وليس مفتاح خزينة.

### الإيجار يتبع المحتوى

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

| محتوى القاعدة               | حجم الحساب | الإيجار      |
| --------------------------- | ---------- | ------------ |
| فارغ (للتو تم إنشاؤه)       | 150 بايت   | \~0.0019 SOL |
| 1 مجموعة، 2 قيد             | 200 بايت   | \~0.0023 SOL |
| 3 مجموعات، 4 قيود لكل منها  | 408 بايت   | \~0.0037 SOL |
| 10 مجموعات، 25 قيد لكل منها | 4 790 بايت | \~0.034 SOL  |

### ترتيب التفعيل

1. تدرب على التسلسل كله على devnet — انظر [اختبر على devnet أولاً](#test-on-devnet-first).
2. أنشئ حساب القاعدة واكتب مجموعاتها. لا شيء يتغير حتى الآن — مع `restrict_curve_param` لا يزال `0` البرنامج لا يقرأها.
3. تحقق من القاعدة خارج السلسلة مع [`checkLaunchAgainstCurveRule`](#before-a-launch-will-these-parameters-pass): لكل شكل إطلاق يمكن لواجهة المستخدم الخاصة بك إنتاجه، أكد أن بعض المجموعة تقبله.
4. اضبط `restrict_curve_param` على `1`. من تلك اللحظة فصاعداً إطلاقات منشئيك يتم فحصها.
5. للتراجع، اضبطه على `0` مرة أخرى. حساب القاعدة يُترك سليماً.

<Warning>
  منشئ الإطلاق الخاص بك يجب أن يضيف PDA القاعدة إلى `remaining_accounts` بينما `restrict_curve_param` هو `1`. البرنامج يتطلب الحساب ليكون موجوداً حتى عندما لا يكون موجوداً بعد، حتى لا يتمكن المنشئ من تخطي الفحص بحذفه — حساب مفقود هو `NotEnoughRemainingAccounts`، وليس نجاح. الاشتقاق هو `[b"platform_curve_rule", platform_config, global_config]`.
</Warning>

## التكلفة في وقت الإطلاق

الفحص يعمل على كل إطلاق بينما يكون مفعلاً، لذا تكلفته الحسابية هي ضريبة لكل إطلاق. مقاس من البداية إلى النهاية — اشتقاق PDA، مسح `remaining_accounts`، فك التسلسل، والتقييم:

| محتوى القاعدة               | حقول رخيصة | حقول مشتقة |
| --------------------------- | ---------- | ---------- |
| مفعل، لا حساب قاعدة         | 1 936      | —          |
| 1 مجموعة، 2 قيد             | 2 576      | 2 926      |
| 3 مجموعات، 4 قيود لكل منها  | 3 624      | 5 724      |
| 10 مجموعات، 25 قيد لكل منها | 24 344     | 68 094     |

"رخيص" هو قراءة حقل مباشرة مثل `Supply`؛ "مشتق" هو واحد محسوب مثل `MigrateRateA`، الذي يكلف حوالي 223 CU لكل قيد مقابل حوالي 48. حتى قاعدة محملة بالكامل من القيود المشتقة تبقى داخل ثلث ميزانية 200 000 CU الافتراضية لكل تعليمة، وقاعدة واقعية بثلاث مجموعات أقل من 6 000. يتم تقييم المجموعات حتى تطابق واحدة، لذا ترتيب فئتك الشائعة أولاً هو توفير مجاني.

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

* [`products/launchlab/platform-config`](/ar/products/launchlab/platform-config) — حقول `PlatformConfig` التي تبوابة وتفوض القواعد.
* [`products/launchlab/global-config`](/ar/products/launchlab/global-config) — حدود البروتوكول التي تضيقها القاعدة.
* [`products/launchlab/instructions`](/ar/products/launchlab/instructions) — التعليمات الأربع للقاعدة وحساباتها.
* [`products/launchlab/accounts`](/ar/products/launchlab/accounts) — `PlatformCurveRule` في جرد الحسابات.
* [`sdk-api/typescript-sdk`](/ar/sdk-api/typescript-sdk) — سطح SDK الذي يعيش فيه المساعدان.
* [`reference/changelog/2026-08-31-launchlab-platform-curve-rules`](/ar/reference/changelog/2026-08-31-launchlab-platform-curve-rules) — ما استبدل قائمة معاملات المنحنى البيضاء، وما يجب أن يتغير في فك التشفير.

المصادر:

* `raydium-launch/programs/launchpad/src/states/platform_curve_rule.rs` — `PlatformCurveRule`، `CurveRuleGroup`، `ParamConstraint`، مساحات معرف الحقل والعملية، و `CurveRuleContext::value_of`.
* `raydium-launch/programs/launchpad/src/utils/platform_curve_rule.rs` — فحص وقت الإطلاق.
* `raydium-launch/programs/launchpad/src/instructions/platform/` — `create`، `update`، `remove`، و `close_platform_curve_rule`.
